forked from GodotVR/godot_openxr_vendors
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.gd
65 lines (50 loc) · 2.39 KB
/
main.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
extends Node3D
var xr_interface: XRInterface = null
var hand_tracking_source: Array[OpenXRInterface.HandTrackedSource]
@onready var left_hand: XRController3D = $XROrigin3D/LeftHand
@onready var right_hand: XRController3D = $XROrigin3D/RightHand
@onready var left_hand_mesh: MeshInstance3D = $XROrigin3D/LeftHand/LeftHandMesh
@onready var right_hand_mesh: MeshInstance3D = $XROrigin3D/RightHand/RightHandMesh
@onready var left_controller_model: OpenXRFbRenderModel = $XROrigin3D/LeftHand/LeftControllerFbRenderModel
@onready var right_controller_model: OpenXRFbRenderModel = $XROrigin3D/RightHand/RightControllerFbRenderModel
# Called when the node enters the scene tree for the first time.
func _ready():
xr_interface = XRServer.find_interface("OpenXR")
if xr_interface and xr_interface.initialize():
xr_interface.session_stopping.connect(self._on_session_stopping)
var vp: Viewport = get_viewport()
vp.use_xr = true
hand_tracking_source.resize(OpenXRInterface.HAND_MAX)
for hand in OpenXRInterface.HAND_MAX:
hand_tracking_source[hand] = xr_interface.get_hand_tracking_source(hand)
func _on_session_stopping() -> void:
if "--xrsim-automated-tests" in OS.get_cmdline_user_args():
# When we're running tests via the XR Simulator, it will end the OpenXR
# session automatically, and in that case, we want to quit.
get_tree().quit()
func _physics_process(_delta: float) -> void:
for hand in OpenXRInterface.HAND_MAX:
var source = xr_interface.get_hand_tracking_source(hand)
if hand_tracking_source[hand] == source:
continue
var controller = left_controller_model if (hand == OpenXRInterface.HAND_LEFT) else right_controller_model
controller.visible = (source == OpenXRInterface.HAND_TRACKED_SOURCE_CONTROLLER)
if source == OpenXRInterface.HAND_TRACKED_SOURCE_UNOBSTRUCTED:
match hand:
OpenXRInterface.HAND_LEFT:
left_hand.tracker = "/user/fbhandaim/left"
OpenXRInterface.HAND_RIGHT:
right_hand.tracker = "/user/fbhandaim/right"
else:
match hand:
OpenXRInterface.HAND_LEFT:
left_hand.tracker = "left_hand"
left_hand.pose = "grip"
OpenXRInterface.HAND_RIGHT:
right_hand.tracker = "right_hand"
right_hand.pose = "grip"
hand_tracking_source[hand] = source
func _on_left_controller_fb_render_model_render_model_loaded() -> void:
left_hand_mesh.hide()
func _on_right_controller_fb_render_model_render_model_loaded() -> void:
right_hand_mesh.hide()