diff --git a/xr/OpenXRHandTrackingDemo/FlatDisplay.tscn b/xr/OpenXRHandTrackingDemo/FlatDisplay.tscn new file mode 100644 index 00000000000..125bac731a3 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/FlatDisplay.tscn @@ -0,0 +1,108 @@ +[gd_scene format=3 uid="uid://dd35twe7yvkqf"] + +[node name="FlatDisplay" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 1148.0 +offset_bottom = 643.0 + +[node name="ColorRect" type="ColorRect" parent="."] +visible = false +custom_minimum_size = Vector2(100, 100) +layout_mode = 0 +offset_left = 484.0 +offset_top = 20.0 +offset_right = 584.0 +offset_bottom = 120.0 +color = Color(0.305882, 1, 1, 1) + +[node name="VBoxTrackers0" type="VBoxContainer" parent="."] +layout_mode = 2 +offset_left = 30.0 +offset_right = 99.0 +offset_bottom = 40.0 + +[node name="Button" type="Button" parent="VBoxTrackers0"] +layout_mode = 2 +theme_override_colors/font_pressed_color = Color(0.878431, 0.917647, 0.0627451, 1) +theme_override_colors/font_outline_color = Color(0, 0.631373, 1, 1) +toggle_mode = true +text = "sdfkkkk" + +[node name="VBoxTrackers1" type="VBoxContainer" parent="."] +layout_mode = 2 +anchor_right = 0.099 +offset_left = 650.0 +offset_right = 605.348 +offset_bottom = 40.0 + +[node name="Button" type="Button" parent="VBoxTrackers1"] +layout_mode = 2 +theme_override_colors/font_pressed_color = Color(0.878431, 0.917647, 0.0627451, 1) +theme_override_colors/font_outline_color = Color(0, 0.631373, 1, 1) +toggle_mode = true +text = "sdfkkkk" + +[node name="VSlider0trigger" type="VSlider" parent="."] +layout_mode = 2 +offset_left = 218.0 +offset_top = 20.0 +offset_right = 252.0 +offset_bottom = 235.0 +value = 20.0 + +[node name="VSlider0grip" type="VSlider" parent="."] +layout_mode = 2 +offset_left = 255.0 +offset_top = 20.0 +offset_right = 289.0 +offset_bottom = 235.0 +value = 20.0 + +[node name="VSlider1trigger" type="VSlider" parent="."] +layout_mode = 2 +offset_left = 567.0 +offset_top = 20.0 +offset_right = 601.0 +offset_bottom = 235.0 +value = 20.0 + +[node name="VSlider1grip" type="VSlider" parent="."] +layout_mode = 2 +offset_left = 603.0 +offset_top = 20.0 +offset_right = 637.0 +offset_bottom = 235.0 +value = 20.0 + +[node name="Thumbstick0" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 319.0 +offset_top = 160.0 +offset_right = 399.0 +offset_bottom = 240.0 +color = Color(0, 0.482353, 0.482353, 1) + +[node name="Pos" type="ColorRect" parent="Thumbstick0"] +layout_mode = 0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = 20.0 +offset_bottom = 20.0 +color = Color(1, 0.588235, 0.988235, 1) + +[node name="Thumbstick1" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 460.0 +offset_top = 160.0 +offset_right = 540.0 +offset_bottom = 240.0 +color = Color(0, 0.482353, 0.482353, 1) + +[node name="Pos" type="ColorRect" parent="Thumbstick1"] +layout_mode = 0 +offset_left = 60.0 +offset_top = 10.0 +offset_right = 70.0 +offset_bottom = 20.0 +color = Color(1, 0.588235, 0.988235, 1) diff --git a/xr/OpenXRHandTrackingDemo/HandJoints.gd b/xr/OpenXRHandTrackingDemo/HandJoints.gd new file mode 100644 index 00000000000..21d2ff47644 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/HandJoints.gd @@ -0,0 +1,278 @@ +extends Node3D + +var hjtips = [ OpenXRInterface.HAND_JOINT_THUMB_TIP, OpenXRInterface.HAND_JOINT_INDEX_TIP, OpenXRInterface.HAND_JOINT_MIDDLE_TIP, + OpenXRInterface.HAND_JOINT_RING_TIP, OpenXRInterface.HAND_JOINT_LITTLE_TIP ] + +var hjsticks = [ [ OpenXRInterface.HAND_JOINT_WRIST, OpenXRInterface.HAND_JOINT_THUMB_METACARPAL, OpenXRInterface.HAND_JOINT_THUMB_PROXIMAL, OpenXRInterface.HAND_JOINT_THUMB_DISTAL, OpenXRInterface.HAND_JOINT_THUMB_TIP ], + [ OpenXRInterface.HAND_JOINT_WRIST, OpenXRInterface.HAND_JOINT_INDEX_METACARPAL, OpenXRInterface.HAND_JOINT_INDEX_PROXIMAL, OpenXRInterface.HAND_JOINT_INDEX_INTERMEDIATE, OpenXRInterface.HAND_JOINT_INDEX_DISTAL, OpenXRInterface.HAND_JOINT_INDEX_TIP ], + [ OpenXRInterface.HAND_JOINT_WRIST, OpenXRInterface.HAND_JOINT_MIDDLE_METACARPAL, OpenXRInterface.HAND_JOINT_MIDDLE_PROXIMAL, OpenXRInterface.HAND_JOINT_MIDDLE_INTERMEDIATE, OpenXRInterface.HAND_JOINT_MIDDLE_DISTAL, OpenXRInterface.HAND_JOINT_MIDDLE_TIP ], + [ OpenXRInterface.HAND_JOINT_WRIST, OpenXRInterface.HAND_JOINT_RING_METACARPAL, OpenXRInterface.HAND_JOINT_RING_PROXIMAL, OpenXRInterface.HAND_JOINT_RING_INTERMEDIATE, OpenXRInterface.HAND_JOINT_RING_DISTAL, OpenXRInterface.HAND_JOINT_RING_TIP ], + [ OpenXRInterface.HAND_JOINT_WRIST, OpenXRInterface.HAND_JOINT_LITTLE_METACARPAL, OpenXRInterface.HAND_JOINT_LITTLE_PROXIMAL, OpenXRInterface.HAND_JOINT_LITTLE_INTERMEDIATE, OpenXRInterface.HAND_JOINT_LITTLE_DISTAL, OpenXRInterface.HAND_JOINT_LITTLE_TIP ] + ] + +var xr_interface : OpenXRInterface +var xr_tracker_head : XRPositionalTracker +var xr_tracker_hands = [ ] +var xr_play_area : PackedVector3Array + +@onready var flat_display = $FrontOfPlayer/FlatDisplayMesh/SubViewport/FlatDisplay +@onready var joints3D = $Joints3D +@onready var joints2D = $FrontOfPlayer/Joints2D + +var buttonsignalnames = [ + "select_button", "menu_button", + "trigger_touch", "trigger_click", + "grip_touch", "grip_click", + "primary_touch", "primary_click", + "ax_touch", "ax_button", + "by_touch", "by_button", +] + +# Set up the displayed axes for each hand and each joint of the hand +func _ready(): + var axes3dscene = load("res://axes3d.tscn") + var stickscene = load("res://stick.tscn") + + for hand in range(2): + var LRd = "L%d" if hand == 0 else "R%d" + + # Make the axes for each hand joint + for j in range(OpenXRInterface.HAND_JOINT_MAX): + var rj = axes3dscene.instantiate() + rj.name = LRd % j + rj.scale = Vector3(0.01, 0.01, 0.01) + rj.get_node("SkinPad").visible = true + rj.get_node("TipPad").visible = hjtips.has(j) + joints3D.add_child(rj) + + # static copy of each joint arranged on 2D panel + var rjf = axes3dscene.instantiate() + rjf.name = LRd % j + rjf.scale = Vector3(0.01, 0.01, 0.01) + var p = flatlefthandjointsfromwrist[j] + rjf.transform.origin = Vector3(p.x - 0.12, -p.z, p.y) if hand == 0 else Vector3(-p.x + 0.12, -p.z, p.y) + joints2D.add_child(rjf) + + # Make the white sticks between connecting joints to see the skeleton + var LRstick = "L%dt%d" if hand == 0 else "R%dt%d" + for hjstick in hjsticks: + for i in range(0, len(hjstick)-1): + var rstick = stickscene.instantiate() + var j1 = hjstick[i] + var j2 = hjstick[i+1] + rstick.name = LRstick % [j1, j2] + rstick.scale = Vector3(0.01, 0.01, 0.01) + joints3D.add_child(rstick) + + var rstickf = stickscene.instantiate() + rstickf.name = LRstick % [hjstick[i], hjstick[i+1]] + joints2D.add_child(rstickf) + rstickf.transform = sticktransform(joints2D.get_node(LRd % j1).transform.origin, joints2D.get_node(LRd % j2).transform.origin) + + joints3D.get_node(LRd % hjstick[i+1]).get_node("Sphere").visible = (i > 0) + + + # Make the main pose axes for grip,aim (valid for hand and controller) + var LRpose = "L%s" if hand == 0 else "R%s" + for posename in [ "grip", "aim"]: + var rpose = axes3dscene.instantiate() + rpose.name = LRpose % posename + rpose.scale = Vector3(0.05, 0.05, 0.05) + joints3D.add_child(rpose) + + # Make the toggle buttons that show the activated button signals + var vboxsignals = flat_display.get_node("VBoxTrackers%d" % hand) + var buttonsig = vboxsignals.get_child(0) + vboxsignals.remove_child(buttonsig) + for bn in buttonsignalnames: + var bs = buttonsig.duplicate() + bs.text = bn + bs.name = bn + vboxsignals.add_child(bs) + + # Make the labels for the finger lengths + var flatdisplaymesh = flat_display.get_parent().get_parent() + var subviewport = flat_display.get_parent() + for j in hjtips: + var p = joints2D.get_node(LRd % j).transform.origin + var p1 = flatdisplaymesh.transform.inverse() * p + var p2 = Vector2((p1.x*1.1 + flatdisplaymesh.mesh.size.x*0.5)/flatdisplaymesh.mesh.size.x, (p1.y + flatdisplaymesh.mesh.size.y*0.5)/flatdisplaymesh.mesh.size.y) + var p3 = Vector2(p2.x * subviewport.size.x, (1-p2.y) * subviewport.size.y) + var fingerlenglab = Label.new() + fingerlenglab.text = LRd%j + fingerlenglab.name = "FL_"+(LRd%j) + fingerlenglab.position = p3 + flat_display.add_child(fingerlenglab) + + get_node("Joints3D/L0").transform.origin = Vector3(0,1.7,-0.2) + + +func _button_signal(name, hand, pressed): + var buttonsig = flat_display.get_node_or_null("VBoxTrackers%d/%s" % [ hand, name ]) + if buttonsig: + buttonsig.button_pressed = pressed + else: + print("buttonsignal ", hand, " ", name, " ", pressed) + +func _input_float_changed(name, value, hand): + var ifsig = flat_display.get_node_or_null("VSlider%d%s" % [ hand, name ]) + if ifsig: + ifsig.value = value*100 + else: + print("inputfloatchanged ", hand, " ", name, " ", value) + +func _input_vector2_changed(name, vector, hand): + var ifstick = flat_display.get_node_or_null("Thumbstick%d" % hand) + if ifstick: + ifstick.get_node("Pos").position = (vector + Vector2(1,1))*(70/2) + else: + print("inputvector2changed ", hand, " ", name, " ", vector) + #print("inputvector2changed ", name) # it's always primary + +# Get the trackers once the interface has been initialized +func set_xr_interface(lxr_interface : OpenXRInterface): + xr_interface = lxr_interface + var trackers1 = XRServer.get_trackers(1) + xr_tracker_head = trackers1["head"] + var trackers2 = XRServer.get_trackers(2) + xr_tracker_hands = [ trackers2["left_hand"], trackers2["right_hand"] ] + + # Play area code to be implemented in v4.3 + xr_play_area = xr_interface.get_play_area() + print("PlayAreaMode: ", xr_interface.xr_play_area_mode) + # XR_PLAY_AREA_UNKNOWN = 0, XR_PLAY_AREA_3DOF = 1, XR_PLAY_AREA_SITTING = 2, XR_PLAY_AREA_ROOMSCALE = 3, XR_PLAY_AREA_STAGE = 4 + if xr_play_area: + print("Play area feature supported (NOT YET DRAWN)", xr_play_area) + else: + print("xr_interface.get_play_area() returns [ ]") + + print("action_sets: ", xr_interface.get_action_sets()) + + # wire up the signals from the hand trackers + for hand in range(2): + xr_tracker_hands[hand].button_pressed.connect(_button_signal.bind(hand, true)) + xr_tracker_hands[hand].button_released.connect(_button_signal.bind(hand)) + xr_tracker_hands[hand].input_float_changed.connect(_input_float_changed.bind(hand)) + xr_tracker_hands[hand].input_vector2_changed.connect(_input_vector2_changed.bind(hand)) + + # reset the position of the 2D information panel 3 times in the first 15 seconds + for t in range(3): + await get_tree().create_timer(5).timeout + var headtransform = get_node("../XRCamera3D").transform + $FrontOfPlayer.transform = Transform3D(headtransform.basis, headtransform.origin - headtransform.basis.z*0.5 + Vector3(0,-0.2,0)) + + +# Other signals to be implemented +# pose_changed(pose: XRPose)Emitted when the state of a pose tracked by this tracker changes. +# pose_lost_tracking(pose: XRPose)Emitted when a pose tracked by this tracker stops getting updated tracking data. +# profile_changed(role: String)Emitted when the profile of our tracker changes. + +# Called when finger touches the yellow sphere (to check if values have been updated long after startup) +func fingertiptouchbutton(): + print("PlayArea ", xr_interface.get_play_area()) + print("PlayAreaMode: ", xr_interface.xr_play_area_mode) + +func rotationtoalign(a, b): + var axis = a.cross(b).normalized(); + if (axis.length_squared() != 0): + var dot = a.dot(b)/(a.length()*b.length()) + dot = clamp(dot, -1.0, 1.0) + var angle_rads = acos(dot) + return Basis(axis, angle_rads) + return Basis() + +func sticktransform(j1, j2): + var b = rotationtoalign(Vector3(0,1,0), j2 - j1) + var d = (j2 - j1).length() + return Transform3D(b, (j1 + j2)*0.5).scaled_local(Vector3(0.01, d, 0.01)) + +func basisfrom(a, b): + var vx = (b - a).normalized() + var vy = vx.cross(-a.normalized()) + var vz = vx.cross(vy) + return Basis(vx, vy, vz) + +func arrowYbasis(v): + var axisy = v + var axisxL = Vector3(v.y, -v.x, 0.0) if abs(v.x) < abs(v.z) else Vector3(0.0, -v.x, v.z) + var vlen = v.length() + var axisx = axisxL * (vlen/axisxL.length()) + var axisz = axisx.cross(axisy)/(vlen if vlen != 0 else vlen) + return Basis(axisx, axisy, axisz) + + +func _process(delta): + if xr_interface != null: + for hand in range(2): + + # Update all the joint positions, rotations and validity flags + var wristtransform = Transform3D(Basis(xr_interface.get_hand_joint_rotation(hand, OpenXRInterface.HAND_JOINT_WRIST)), + xr_interface.get_hand_joint_position(hand, OpenXRInterface.HAND_JOINT_WRIST)) + var LRd = "L%d" if hand == 0 else "R%d" + for j in range(OpenXRInterface.HAND_JOINT_MAX): + var jointradius = xr_interface.get_hand_joint_radius(hand, j) + var handjointflags = xr_interface.get_hand_joint_flags(hand, j); + + var joint3d = $Joints3D.get_node(LRd % j) + joint3d.get_node("InvalidMesh").visible = not (handjointflags & OpenXRInterface.HAND_JOINT_POSITION_VALID) + joint3d.get_node("UntrackedMesh").visible = not (handjointflags & OpenXRInterface.HAND_JOINT_POSITION_TRACKED) + var handjointtransform = Transform3D(Basis(xr_interface.get_hand_joint_rotation(hand, j)), xr_interface.get_hand_joint_position(hand, j)) + joint3d.transform = handjointtransform.scaled_local(Vector3(jointradius, jointradius, jointradius)) + + var joint2d = joints2D.get_node(LRd % j) + joint2d.get_node("InvalidMesh").visible = not (handjointflags & OpenXRInterface.HAND_JOINT_POSITION_VALID) + joint2d.get_node("UntrackedMesh").visible = not (handjointflags & OpenXRInterface.HAND_JOINT_POSITION_TRACKED) + joint2d.transform.basis = Basis(xr_interface.get_hand_joint_rotation(hand, j))*0.013 + + # reposition the joining sticks + var LRstick = "L%dt%d" if hand == 0 else "R%dt%d" + for hjstick in hjsticks: + for i in range(0, len(hjstick)-1): + var j1 = hjstick[i] + var j2 = hjstick[i+1] + var rstick = $Joints3D.get_node(LRstick % [j1, j2]) + rstick.transform = sticktransform($Joints3D.get_node(LRd % j1).transform.origin, $Joints3D.get_node(LRd % j2).transform.origin) + + # Update the grip,aim poses + var LRpose = "L%s" if hand == 0 else "R%s" + for posename in [ "grip", "aim"]: + var rpose = $Joints3D.get_node(LRpose % posename) + var xrpose = xr_tracker_hands[hand].get_pose(posename) + if xrpose != null: + rpose.get_node("InvalidMesh").visible = not xrpose.has_tracking_data + rpose.get_node("UntrackedMesh").visible = (xrpose.tracking_confidence == 0) + rpose.transform = xrpose.transform.scaled_local(Vector3(0.05, 0.05, 0.05)) + + # Measure the lengths of the fingers + var FLLRd = "FL_L%d" if hand == 0 else "FL_R%d" + for j in hjtips: + var fingerlenglab = flat_display.get_node(FLLRd % j) + var fp = xr_interface.get_hand_joint_position(hand, j) + var fingleng = 0.0 + for k in range(1, 4): + var fpn = xr_interface.get_hand_joint_position(hand, j-k) + fingleng += (fpn - fp).length() + fp = fpn + fingerlenglab.text = "%.0f" % (fingleng*1000) + + var fingertipnode = $Joints3D.get_node("R%d" % OpenXRInterface.HAND_JOINT_INDEX_TIP) + var fingerbuttonnode = $FrontOfPlayer/FingerButton + var d = (fingertipnode.global_transform.origin - fingerbuttonnode.global_transform.origin).length() + var touching = (d < 0.03) + if !($FrontOfPlayer/FingerButton/Touched.visible) and touching: + fingertiptouchbutton() + $FrontOfPlayer/FingerButton/Touched.visible = touching + + + +var flatlefthandjointsfromwrist = [ + Vector3(0.000861533, -0.0012695, -0.0477441), Vector3(0, 0, 0), Vector3(0.0315846, -0.0131271, -0.0329833), Vector3(0.0545926, -0.0174885, -0.0554602), + Vector3(0.0757424, -0.0190563, -0.0816979), Vector3(0.0965827, -0.0188126, -0.0947297), Vector3(0.0204946, -0.00802441, -0.0356591), + Vector3(0.0235117, -0.00730439, -0.0958373), Vector3(0.0364556, -0.00840877, -0.131404), Vector3(0.0444214, -0.00928009, -0.154306), + Vector3(0.0501041, -0.00590578, -0.175658), Vector3(0.00431204, -0.00690232, -0.0335003), Vector3(0.00172306, -0.00253896, -0.0954883), + Vector3(0.00447122, 0.00162174, -0.138053), Vector3(0.00599042, 0.00439228, -0.165375), Vector3(0.00627589, 0.0124663, -0.188982), + Vector3(-0.0149675, -0.00600582, -0.034718), Vector3(-0.0174363, -0.00651854, -0.0885469), Vector3(-0.0249593, 0.000487596, -0.126097), + Vector3(-0.0302005, 0.00494818, -0.151718), Vector3(-0.0342363, 0.0119404, -0.17468), Vector3(-0.0229605, -0.00940424, -0.0340171), + Vector3(-0.034996, -0.0136686, -0.0777668), Vector3(-0.0520341, -0.00539365, -0.101889), Vector3(-0.0647082, 0.000211, -0.116692), + Vector3(-0.0764616, 0.00869788, -0.133135) +] diff --git a/xr/OpenXRHandTrackingDemo/axes3d.tscn b/xr/OpenXRHandTrackingDemo/axes3d.tscn new file mode 100644 index 00000000000..4e1a488e84a --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/axes3d.tscn @@ -0,0 +1,144 @@ +[gd_scene load_steps=19 format=3 uid="uid://n30tbvntebk7"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0ndwk"] +albedo_color = Color(0, 0.529412, 1, 1) + +[sub_resource type="CylinderMesh" id="CylinderMesh_wbgny"] +material = SubResource("StandardMaterial3D_0ndwk") +top_radius = 0.0 +bottom_radius = 0.2 +height = 0.5 +radial_segments = 16 +rings = 1 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cnf5y"] +albedo_color = Color(0.719085, 0.0337406, 0.0187665, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_sssg3"] +albedo_color = Color(0, 0.529412, 1, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_lsd0h"] +material = SubResource("StandardMaterial3D_sssg3") +size = Vector3(0.1, 0.1, 0.6) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8uw7x"] +albedo_color = Color(0.719085, 0.0337406, 0.0187665, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_buo0m"] +albedo_color = Color(0.0431373, 0.878431, 0.0352941, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4qeke"] +albedo_color = Color(0.0431373, 0.878431, 0.0352941, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fl0h4"] +albedo_color = Color(1, 0.486275, 0.0823529, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_muya6"] +material = SubResource("StandardMaterial3D_fl0h4") +size = Vector3(1.4, 1.2, 1.4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5qk3a"] +albedo_color = Color(0.329412, 0.776471, 0.137255, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_cuywy"] +material = SubResource("StandardMaterial3D_5qk3a") +size = Vector3(1.2, 1.4, 1.2) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5t1mb"] +albedo_color = Color(0.792157, 0.878431, 0.0352941, 1) + +[sub_resource type="CylinderMesh" id="CylinderMesh_7ahcp"] +material = SubResource("StandardMaterial3D_5t1mb") +top_radius = 0.2 +bottom_radius = 0.2 +height = 0.01 +radial_segments = 16 +rings = 1 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r26rr"] +albedo_color = Color(0.313726, 0.878431, 0.937255, 1) + +[sub_resource type="CylinderMesh" id="CylinderMesh_k17as"] +material = SubResource("StandardMaterial3D_r26rr") +top_radius = 0.2 +bottom_radius = 0.2 +height = 0.01 +radial_segments = 16 +rings = 1 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dqde6"] +transparency = 1 +albedo_color = Color(0.529412, 0.639216, 0.890196, 0.372549) + +[sub_resource type="SphereMesh" id="SphereMesh_8wps8"] +material = SubResource("StandardMaterial3D_dqde6") +radius = 1.0 +height = 2.0 + +[node name="Axes3D" type="Node3D"] + +[node name="ArrowX" type="Node3D" parent="."] +transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0) + +[node name="ConeX" type="MeshInstance3D" parent="ArrowX"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0) +mesh = SubResource("CylinderMesh_wbgny") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_cnf5y") + +[node name="StemX" type="MeshInstance3D" parent="ArrowX/ConeX"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -0.45, 0) +mesh = SubResource("BoxMesh_lsd0h") +skeleton = NodePath("../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_8uw7x") + +[node name="ArrowY" type="Node3D" parent="."] + +[node name="ConeY" type="MeshInstance3D" parent="ArrowY"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0) +mesh = SubResource("CylinderMesh_wbgny") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_buo0m") + +[node name="StemY" type="MeshInstance3D" parent="ArrowY/ConeY"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -0.45, 0) +mesh = SubResource("BoxMesh_lsd0h") +skeleton = NodePath("../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_4qeke") + +[node name="ArrowZ" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0) + +[node name="ConeZ" type="MeshInstance3D" parent="ArrowZ"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0) +mesh = SubResource("CylinderMesh_wbgny") +skeleton = NodePath("../..") + +[node name="StemZ" type="MeshInstance3D" parent="ArrowZ/ConeZ"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -0.45, 0) +mesh = SubResource("BoxMesh_lsd0h") +skeleton = NodePath("../../..") + +[node name="InvalidMesh" type="MeshInstance3D" parent="."] +visible = false +mesh = SubResource("BoxMesh_muya6") + +[node name="UntrackedMesh" type="MeshInstance3D" parent="."] +visible = false +mesh = SubResource("BoxMesh_cuywy") + +[node name="SkinPad" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) +visible = false +mesh = SubResource("CylinderMesh_7ahcp") +skeleton = NodePath("../ArrowY") + +[node name="TipPad" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, -1) +visible = false +mesh = SubResource("CylinderMesh_k17as") +skeleton = NodePath("../ArrowY") + +[node name="Sphere" type="MeshInstance3D" parent="."] +visible = false +mesh = SubResource("SphereMesh_8wps8") diff --git a/xr/OpenXRHandTrackingDemo/icon.svg b/xr/OpenXRHandTrackingDemo/icon.svg new file mode 100644 index 00000000000..b370ceb7274 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/icon.svg @@ -0,0 +1 @@ + diff --git a/xr/OpenXRHandTrackingDemo/main.gd b/xr/OpenXRHandTrackingDemo/main.gd new file mode 100644 index 00000000000..a7e2e6e1482 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/main.gd @@ -0,0 +1,24 @@ +extends Node3D + +var xr_interface : OpenXRInterface + +# 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.is_initialized(): + var vp = get_viewport() + + # Enable XR on the main viewport + vp.use_xr = true + + # Make sure v-sync is disabled, we're using the headsets v-sync + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + + $XROrigin3D/HandJoints.set_xr_interface(xr_interface) + + + +func _on_xr_controller_3d_left_button_pressed(name): + print("_on_xr_controller_3d_left_button_pressed ", name) + + diff --git a/xr/OpenXRHandTrackingDemo/main.tscn b/xr/OpenXRHandTrackingDemo/main.tscn new file mode 100644 index 00000000000..d547eeb763f --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/main.tscn @@ -0,0 +1,137 @@ +[gd_scene load_steps=22 format=3 uid="uid://br3bss6kac8pa"] + +[ext_resource type="Script" path="res://main.gd" id="1_cagca"] +[ext_resource type="PackedScene" uid="uid://dd35twe7yvkqf" path="res://FlatDisplay.tscn" id="3_o8mx1"] +[ext_resource type="Script" path="res://HandJoints.gd" id="4_eaqi8"] + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_eyx45"] +sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) +ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) + +[sub_resource type="Sky" id="Sky_tsis2"] +sky_material = SubResource("ProceduralSkyMaterial_eyx45") + +[sub_resource type="Environment" id="Environment_0xu52"] +background_mode = 2 +sky = SubResource("Sky_tsis2") +tonemap_mode = 2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wnci2"] +albedo_color = Color(1, 0.121569, 0.121569, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_d0w3a"] +material = SubResource("StandardMaterial3D_wnci2") +size = Vector3(0.02, 0.02, 0.05) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p0287"] +albedo_color = Color(0.00392157, 1, 0.0117647, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_fmqho"] +material = SubResource("StandardMaterial3D_p0287") +size = Vector3(0.02, 0.02, 0.05) + +[sub_resource type="QuadMesh" id="QuadMesh_eslsg"] +size = Vector2(0.8, 0.5) +center_offset = Vector3(0, 0.05, 0) + +[sub_resource type="ViewportTexture" id="ViewportTexture_46vof"] +viewport_path = NodePath("XROrigin3D/HandJoints/FrontOfPlayer/FlatDisplayMesh/SubViewport") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6gabm"] +resource_local_to_scene = true +shading_mode = 0 +albedo_color = Color(0, 0.615686, 0.619608, 1) +albedo_texture = SubResource("ViewportTexture_46vof") + +[sub_resource type="SphereMesh" id="SphereMesh_65vmt"] +radius = 0.02 +height = 0.04 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_brx0b"] +albedo_color = Color(1, 1, 0, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_yct16"] +size = Vector3(0.01, 0.07, 0.01) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_g60ck"] +albedo_color = Color(0.992157, 0.0117647, 0.0666667, 1) + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_rm4v2"] + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_bkxwk"] +seamless = true +noise = SubResource("FastNoiseLite_rm4v2") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3vxx6"] +albedo_color = Color(0.466667, 0.247059, 0.196078, 1) +albedo_texture = SubResource("NoiseTexture2D_bkxwk") +uv1_scale = Vector3(4, 4, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_5clia"] +material = SubResource("StandardMaterial3D_3vxx6") +size = Vector3(10, 0.01, 10) + +[node name="Main" type="Node3D"] +script = ExtResource("1_cagca") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.972307, 0.231448, -0.0324247, -0.168036, 0.788752, 0.591299, 0.16243, -0.569476, 0.8058, 0, 4.78147, -0.461351) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_0xu52") + +[node name="XROrigin3D" type="XROrigin3D" parent="."] + +[node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7, 0) + +[node name="XRController3DLeft" type="XRController3D" parent="XROrigin3D"] +tracker = &"left_hand" +pose = &"aim" + +[node name="MeshInstance3D" type="MeshInstance3D" parent="XROrigin3D/XRController3DLeft"] +mesh = SubResource("BoxMesh_d0w3a") + +[node name="XRController3DRight" type="XRController3D" parent="XROrigin3D"] +tracker = &"right_hand" +pose = &"grip" + +[node name="MeshInstance3D" type="MeshInstance3D" parent="XROrigin3D/XRController3DRight"] +mesh = SubResource("BoxMesh_fmqho") + +[node name="HandJoints" type="Node3D" parent="XROrigin3D"] +script = ExtResource("4_eaqi8") + +[node name="Joints3D" type="Node3D" parent="XROrigin3D/HandJoints"] + +[node name="FrontOfPlayer" type="Node3D" parent="XROrigin3D/HandJoints"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.65802, -0.491668) + +[node name="FlatDisplayMesh" type="MeshInstance3D" parent="XROrigin3D/HandJoints/FrontOfPlayer"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.169554, -0.0442287) +mesh = SubResource("QuadMesh_eslsg") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_6gabm") + +[node name="SubViewport" type="SubViewport" parent="XROrigin3D/HandJoints/FrontOfPlayer/FlatDisplayMesh"] +size = Vector2i(800, 500) + +[node name="FlatDisplay" parent="XROrigin3D/HandJoints/FrontOfPlayer/FlatDisplayMesh/SubViewport" instance=ExtResource("3_o8mx1")] + +[node name="Joints2D" type="Node3D" parent="XROrigin3D/HandJoints/FrontOfPlayer"] + +[node name="FingerButton" type="MeshInstance3D" parent="XROrigin3D/HandJoints/FrontOfPlayer"] +mesh = SubResource("SphereMesh_65vmt") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_brx0b") + +[node name="Touched" type="MeshInstance3D" parent="XROrigin3D/HandJoints/FrontOfPlayer/FingerButton"] +visible = false +mesh = SubResource("BoxMesh_yct16") +surface_material_override/0 = SubResource("StandardMaterial3D_g60ck") + +[node name="MeshInstance3DFloor" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_5clia") +skeleton = NodePath("../XROrigin3D") + +[connection signal="button_pressed" from="XROrigin3D/XRController3DLeft" to="." method="_on_xr_controller_3d_left_button_pressed"] diff --git a/xr/OpenXRHandTrackingDemo/openxr_action_map.tres b/xr/OpenXRHandTrackingDemo/openxr_action_map.tres new file mode 100644 index 00000000000..6dd25ef92f8 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/openxr_action_map.tres @@ -0,0 +1,891 @@ +[gd_resource type="OpenXRActionMap" load_steps=211 format=3 uid="uid://dydgx5ktpcmdl"] + +[sub_resource type="OpenXRAction" id="OpenXRAction_u0as2"] +resource_name = "trigger" +localized_name = "Trigger" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_b62l1"] +resource_name = "trigger_click" +localized_name = "Trigger click" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_rnywd"] +resource_name = "trigger_touch" +localized_name = "Trigger touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_yo1c6"] +resource_name = "grip" +localized_name = "Grip" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_suuae"] +resource_name = "grip_click" +localized_name = "Grip click" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_e6cgj"] +resource_name = "grip_touch" +localized_name = "Grip touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_jckik"] +resource_name = "grip_force" +localized_name = "Grip force" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_cf5wl"] +resource_name = "primary" +localized_name = "Primary joystick/thumbstick/trackpad" +action_type = 2 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_op7n5"] +resource_name = "primary_click" +localized_name = "Primary joystick/thumbstick/trackpad click" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_f1lo3"] +resource_name = "primary_touch" +localized_name = "Primary joystick/thumbstick/trackpad touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_k1blu"] +resource_name = "secondary" +localized_name = "Secondary joystick/thumbstick/trackpad" +action_type = 2 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_csxi2"] +resource_name = "secondary_click" +localized_name = "Secondary joystick/thumbstick/trackpad click" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_5el4a"] +resource_name = "secondary_touch" +localized_name = "Secondary joystick/thumbstick/trackpad touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_mhoq5"] +resource_name = "menu_button" +localized_name = "Menu button" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_07i16"] +resource_name = "select_button" +localized_name = "Select button" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_0d487"] +resource_name = "ax_button" +localized_name = "A/X button" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_e8ubu"] +resource_name = "ax_touch" +localized_name = "A/X touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_1oitr"] +resource_name = "by_button" +localized_name = "B/Y button" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_u6bc3"] +resource_name = "by_touch" +localized_name = "B/Y touching" +action_type = 0 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_2ym5w"] +resource_name = "default_pose" +localized_name = "Default pose" +action_type = 3 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/keyboard", "/user/eyes_ext") + +[sub_resource type="OpenXRAction" id="OpenXRAction_dscwk"] +resource_name = "aim_pose" +localized_name = "Aim pose" +action_type = 3 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_hkblf"] +resource_name = "grip_pose" +localized_name = "Grip pose" +action_type = 3 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_y6xq5"] +resource_name = "palm_pose" +localized_name = "Palm pose" +action_type = 3 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_8rav6"] +resource_name = "haptic" +localized_name = "Haptic" +action_type = 4 +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/keyboard") + +[sub_resource type="OpenXRActionSet" id="OpenXRActionSet_y2k5r"] +resource_name = "godot" +localized_name = "Godot action set" +actions = [SubResource("OpenXRAction_u0as2"), SubResource("OpenXRAction_b62l1"), SubResource("OpenXRAction_rnywd"), SubResource("OpenXRAction_yo1c6"), SubResource("OpenXRAction_suuae"), SubResource("OpenXRAction_e6cgj"), SubResource("OpenXRAction_jckik"), SubResource("OpenXRAction_cf5wl"), SubResource("OpenXRAction_op7n5"), SubResource("OpenXRAction_f1lo3"), SubResource("OpenXRAction_k1blu"), SubResource("OpenXRAction_csxi2"), SubResource("OpenXRAction_5el4a"), SubResource("OpenXRAction_mhoq5"), SubResource("OpenXRAction_07i16"), SubResource("OpenXRAction_0d487"), SubResource("OpenXRAction_e8ubu"), SubResource("OpenXRAction_1oitr"), SubResource("OpenXRAction_u6bc3"), SubResource("OpenXRAction_2ym5w"), SubResource("OpenXRAction_dscwk"), SubResource("OpenXRAction_hkblf"), SubResource("OpenXRAction_y6xq5"), SubResource("OpenXRAction_8rav6")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hx2ed"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8axy5"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rl4dj"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_b5tpr"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_r551b"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_20o21"] +action = SubResource("OpenXRAction_07i16") +paths = PackedStringArray("/user/hand/left/input/select/click", "/user/hand/right/input/select/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_428l7"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_xi4o1"] +interaction_profile_path = "/interaction_profiles/khr/simple_controller" +bindings = [SubResource("OpenXRIPBinding_hx2ed"), SubResource("OpenXRIPBinding_8axy5"), SubResource("OpenXRIPBinding_rl4dj"), SubResource("OpenXRIPBinding_b5tpr"), SubResource("OpenXRIPBinding_r551b"), SubResource("OpenXRIPBinding_20o21"), SubResource("OpenXRIPBinding_428l7")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hpvet"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_j2qrb"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ylaxd"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lj5et"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0ix6j"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_aj1s0"] +action = SubResource("OpenXRAction_07i16") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_850h4"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dfx8u"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ogf1l"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wttwr"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dkbhb"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_aipmg"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hewsf"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3wpr7"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_bpdg5"] +interaction_profile_path = "/interaction_profiles/htc/vive_controller" +bindings = [SubResource("OpenXRIPBinding_hpvet"), SubResource("OpenXRIPBinding_j2qrb"), SubResource("OpenXRIPBinding_ylaxd"), SubResource("OpenXRIPBinding_lj5et"), SubResource("OpenXRIPBinding_0ix6j"), SubResource("OpenXRIPBinding_aj1s0"), SubResource("OpenXRIPBinding_850h4"), SubResource("OpenXRIPBinding_dfx8u"), SubResource("OpenXRIPBinding_ogf1l"), SubResource("OpenXRIPBinding_wttwr"), SubResource("OpenXRIPBinding_dkbhb"), SubResource("OpenXRIPBinding_aipmg"), SubResource("OpenXRIPBinding_hewsf"), SubResource("OpenXRIPBinding_3wpr7")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wj6tr"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cgxqg"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_umpf0"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ltnky"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qk860"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cvh5j"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_eu02l"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_uar32"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_j6xyi"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q8y76"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bvum4"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_afh2s"] +action = SubResource("OpenXRAction_k1blu") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vt0h5"] +action = SubResource("OpenXRAction_csxi2") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tvgdw"] +action = SubResource("OpenXRAction_5el4a") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_12e34"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_wqoi4"] +interaction_profile_path = "/interaction_profiles/microsoft/motion_controller" +bindings = [SubResource("OpenXRIPBinding_wj6tr"), SubResource("OpenXRIPBinding_cgxqg"), SubResource("OpenXRIPBinding_umpf0"), SubResource("OpenXRIPBinding_ltnky"), SubResource("OpenXRIPBinding_qk860"), SubResource("OpenXRIPBinding_cvh5j"), SubResource("OpenXRIPBinding_eu02l"), SubResource("OpenXRIPBinding_uar32"), SubResource("OpenXRIPBinding_j6xyi"), SubResource("OpenXRIPBinding_q8y76"), SubResource("OpenXRIPBinding_bvum4"), SubResource("OpenXRIPBinding_afh2s"), SubResource("OpenXRIPBinding_vt0h5"), SubResource("OpenXRIPBinding_tvgdw"), SubResource("OpenXRIPBinding_12e34")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5qsvs"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fbtbw"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nchbv"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mjsa8"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tln2a"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6ocju"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mopa1"] +action = SubResource("OpenXRAction_e8ubu") +paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jlo8t"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lafba"] +action = SubResource("OpenXRAction_u6bc3") +paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_w2bsf"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_df8q8"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_n0wk8"] +action = SubResource("OpenXRAction_rnywd") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_uvbvb"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_h01yl"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_852wj"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2klul"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jgxi6"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jd8yu"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_syx8b"] +interaction_profile_path = "/interaction_profiles/oculus/touch_controller" +bindings = [SubResource("OpenXRIPBinding_5qsvs"), SubResource("OpenXRIPBinding_fbtbw"), SubResource("OpenXRIPBinding_nchbv"), SubResource("OpenXRIPBinding_mjsa8"), SubResource("OpenXRIPBinding_tln2a"), SubResource("OpenXRIPBinding_6ocju"), SubResource("OpenXRIPBinding_mopa1"), SubResource("OpenXRIPBinding_jlo8t"), SubResource("OpenXRIPBinding_lafba"), SubResource("OpenXRIPBinding_w2bsf"), SubResource("OpenXRIPBinding_df8q8"), SubResource("OpenXRIPBinding_n0wk8"), SubResource("OpenXRIPBinding_uvbvb"), SubResource("OpenXRIPBinding_h01yl"), SubResource("OpenXRIPBinding_852wj"), SubResource("OpenXRIPBinding_2klul"), SubResource("OpenXRIPBinding_jgxi6"), SubResource("OpenXRIPBinding_jd8yu")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bs8jm"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dvv4u"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f100u"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_idae1"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_58nk6"] +action = SubResource("OpenXRAction_07i16") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kn3pm"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sltpc"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_eu51f"] +action = SubResource("OpenXRAction_e8ubu") +paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4uihm"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ulark"] +action = SubResource("OpenXRAction_u6bc3") +paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nobo0"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x5uy7"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bu4uh"] +action = SubResource("OpenXRAction_rnywd") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7qbkx"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xdfw1"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c1ley"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x0gp4"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1j74s"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_oj1cr"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_nh5li"] +interaction_profile_path = "/interaction_profiles/bytedance/pico4_controller" +bindings = [SubResource("OpenXRIPBinding_bs8jm"), SubResource("OpenXRIPBinding_dvv4u"), SubResource("OpenXRIPBinding_f100u"), SubResource("OpenXRIPBinding_idae1"), SubResource("OpenXRIPBinding_58nk6"), SubResource("OpenXRIPBinding_kn3pm"), SubResource("OpenXRIPBinding_sltpc"), SubResource("OpenXRIPBinding_eu51f"), SubResource("OpenXRIPBinding_4uihm"), SubResource("OpenXRIPBinding_ulark"), SubResource("OpenXRIPBinding_nobo0"), SubResource("OpenXRIPBinding_x5uy7"), SubResource("OpenXRIPBinding_bu4uh"), SubResource("OpenXRIPBinding_7qbkx"), SubResource("OpenXRIPBinding_xdfw1"), SubResource("OpenXRIPBinding_c1ley"), SubResource("OpenXRIPBinding_x0gp4"), SubResource("OpenXRIPBinding_1j74s"), SubResource("OpenXRIPBinding_oj1cr")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fyar7"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2lc6h"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tek3q"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qqmuy"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3f5n5"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_eps1a"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/a/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qsjog"] +action = SubResource("OpenXRAction_e8ubu") +paths = PackedStringArray("/user/hand/left/input/a/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2ldt1"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/b/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4emqx"] +action = SubResource("OpenXRAction_u6bc3") +paths = PackedStringArray("/user/hand/left/input/b/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ajhoh"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8joom"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hg4dk"] +action = SubResource("OpenXRAction_rnywd") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ac6yb"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rpcn1"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_05c4s"] +action = SubResource("OpenXRAction_jckik") +paths = PackedStringArray("/user/hand/left/input/squeeze/force", "/user/hand/right/input/squeeze/force") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8lj3w"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_feq8s"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7fu1r"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_klvdi"] +action = SubResource("OpenXRAction_k1blu") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_a45c5"] +action = SubResource("OpenXRAction_csxi2") +paths = PackedStringArray("/user/hand/left/input/trackpad/force", "/user/hand/right/input/trackpad/force") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wprvb"] +action = SubResource("OpenXRAction_5el4a") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_d0pna"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_c1rdy"] +interaction_profile_path = "/interaction_profiles/valve/index_controller" +bindings = [SubResource("OpenXRIPBinding_fyar7"), SubResource("OpenXRIPBinding_2lc6h"), SubResource("OpenXRIPBinding_tek3q"), SubResource("OpenXRIPBinding_qqmuy"), SubResource("OpenXRIPBinding_3f5n5"), SubResource("OpenXRIPBinding_eps1a"), SubResource("OpenXRIPBinding_qsjog"), SubResource("OpenXRIPBinding_2ldt1"), SubResource("OpenXRIPBinding_4emqx"), SubResource("OpenXRIPBinding_ajhoh"), SubResource("OpenXRIPBinding_8joom"), SubResource("OpenXRIPBinding_hg4dk"), SubResource("OpenXRIPBinding_ac6yb"), SubResource("OpenXRIPBinding_rpcn1"), SubResource("OpenXRIPBinding_05c4s"), SubResource("OpenXRIPBinding_8lj3w"), SubResource("OpenXRIPBinding_feq8s"), SubResource("OpenXRIPBinding_7fu1r"), SubResource("OpenXRIPBinding_klvdi"), SubResource("OpenXRIPBinding_a45c5"), SubResource("OpenXRIPBinding_wprvb"), SubResource("OpenXRIPBinding_d0pna")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4lxsj"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gjm8d"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hkurg"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mc1go"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_al52d"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lylcs"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1nqgq"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tscku"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_33sb3"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fwcby"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ww57q"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8gm5m"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_o6paf"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_iscp0"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_pw8hx"] +interaction_profile_path = "/interaction_profiles/hp/mixed_reality_controller" +bindings = [SubResource("OpenXRIPBinding_4lxsj"), SubResource("OpenXRIPBinding_gjm8d"), SubResource("OpenXRIPBinding_hkurg"), SubResource("OpenXRIPBinding_mc1go"), SubResource("OpenXRIPBinding_al52d"), SubResource("OpenXRIPBinding_lylcs"), SubResource("OpenXRIPBinding_1nqgq"), SubResource("OpenXRIPBinding_tscku"), SubResource("OpenXRIPBinding_33sb3"), SubResource("OpenXRIPBinding_fwcby"), SubResource("OpenXRIPBinding_ww57q"), SubResource("OpenXRIPBinding_8gm5m"), SubResource("OpenXRIPBinding_o6paf"), SubResource("OpenXRIPBinding_iscp0")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hqvoj"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fxbc1"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1v3sn"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5qv02"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_241vq"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2jauf"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ayqlp"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mwpxw"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8mhy6"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i1ykl"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_e6mhj"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lqsmv"] +action = SubResource("OpenXRAction_k1blu") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_aslq7"] +action = SubResource("OpenXRAction_csxi2") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rikdl"] +action = SubResource("OpenXRAction_5el4a") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6hld4"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_tvq35"] +interaction_profile_path = "/interaction_profiles/samsung/odyssey_controller" +bindings = [SubResource("OpenXRIPBinding_hqvoj"), SubResource("OpenXRIPBinding_fxbc1"), SubResource("OpenXRIPBinding_1v3sn"), SubResource("OpenXRIPBinding_5qv02"), SubResource("OpenXRIPBinding_241vq"), SubResource("OpenXRIPBinding_2jauf"), SubResource("OpenXRIPBinding_ayqlp"), SubResource("OpenXRIPBinding_mwpxw"), SubResource("OpenXRIPBinding_8mhy6"), SubResource("OpenXRIPBinding_i1ykl"), SubResource("OpenXRIPBinding_e6mhj"), SubResource("OpenXRIPBinding_lqsmv"), SubResource("OpenXRIPBinding_aslq7"), SubResource("OpenXRIPBinding_rikdl"), SubResource("OpenXRIPBinding_6hld4")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pp5ja"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hcfa3"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q510r"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_p602m"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_l7ur5"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lejms"] +action = SubResource("OpenXRAction_07i16") +paths = PackedStringArray("/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hqokf"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bese8"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_frhp4"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ughfs"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3s7pu"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4dl8w"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mr5b7"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_aartg"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y60yy"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tjwti"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_pl43b"] +interaction_profile_path = "/interaction_profiles/htc/vive_cosmos_controller" +bindings = [SubResource("OpenXRIPBinding_pp5ja"), SubResource("OpenXRIPBinding_hcfa3"), SubResource("OpenXRIPBinding_q510r"), SubResource("OpenXRIPBinding_p602m"), SubResource("OpenXRIPBinding_l7ur5"), SubResource("OpenXRIPBinding_lejms"), SubResource("OpenXRIPBinding_hqokf"), SubResource("OpenXRIPBinding_bese8"), SubResource("OpenXRIPBinding_frhp4"), SubResource("OpenXRIPBinding_ughfs"), SubResource("OpenXRIPBinding_3s7pu"), SubResource("OpenXRIPBinding_4dl8w"), SubResource("OpenXRIPBinding_mr5b7"), SubResource("OpenXRIPBinding_aartg"), SubResource("OpenXRIPBinding_y60yy"), SubResource("OpenXRIPBinding_tjwti")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_72yd2"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kx7uo"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5jvwf"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nilye"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1fket"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g3gcv"] +action = SubResource("OpenXRAction_07i16") +paths = PackedStringArray("/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jfppr"] +action = SubResource("OpenXRAction_0d487") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_va35o"] +action = SubResource("OpenXRAction_1oitr") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k6kog"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6lvhs"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q8b3a"] +action = SubResource("OpenXRAction_rnywd") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_braj6"] +action = SubResource("OpenXRAction_yo1c6") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8pdce"] +action = SubResource("OpenXRAction_suuae") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nrwf8"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_slpro"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ye1sp"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_10kq4"] +action = SubResource("OpenXRAction_5el4a") +paths = PackedStringArray("/user/hand/left/input/thumbrest/touch", "/user/hand/right/input/thumbrest/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cjprj"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_kx27f"] +interaction_profile_path = "/interaction_profiles/htc/vive_focus3_controller" +bindings = [SubResource("OpenXRIPBinding_72yd2"), SubResource("OpenXRIPBinding_kx7uo"), SubResource("OpenXRIPBinding_5jvwf"), SubResource("OpenXRIPBinding_nilye"), SubResource("OpenXRIPBinding_1fket"), SubResource("OpenXRIPBinding_g3gcv"), SubResource("OpenXRIPBinding_jfppr"), SubResource("OpenXRIPBinding_va35o"), SubResource("OpenXRIPBinding_k6kog"), SubResource("OpenXRIPBinding_6lvhs"), SubResource("OpenXRIPBinding_q8b3a"), SubResource("OpenXRIPBinding_braj6"), SubResource("OpenXRIPBinding_8pdce"), SubResource("OpenXRIPBinding_nrwf8"), SubResource("OpenXRIPBinding_slpro"), SubResource("OpenXRIPBinding_ye1sp"), SubResource("OpenXRIPBinding_10kq4"), SubResource("OpenXRIPBinding_cjprj")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_71msk"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i3bcj"] +action = SubResource("OpenXRAction_dscwk") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mv1ak"] +action = SubResource("OpenXRAction_hkblf") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1ta6s"] +action = SubResource("OpenXRAction_y6xq5") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rwdh5"] +action = SubResource("OpenXRAction_mhoq5") +paths = PackedStringArray("/user/hand/left/input/home/click", "/user/hand/right/input/home/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y4q2d"] +action = SubResource("OpenXRAction_u0as2") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_p61of"] +action = SubResource("OpenXRAction_b62l1") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1qdqw"] +action = SubResource("OpenXRAction_cf5wl") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7tdwi"] +action = SubResource("OpenXRAction_op7n5") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rpdww"] +action = SubResource("OpenXRAction_f1lo3") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_p2ard"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_cp21m"] +interaction_profile_path = "/interaction_profiles/huawei/controller" +bindings = [SubResource("OpenXRIPBinding_71msk"), SubResource("OpenXRIPBinding_i3bcj"), SubResource("OpenXRIPBinding_mv1ak"), SubResource("OpenXRIPBinding_1ta6s"), SubResource("OpenXRIPBinding_rwdh5"), SubResource("OpenXRIPBinding_y4q2d"), SubResource("OpenXRIPBinding_p61of"), SubResource("OpenXRIPBinding_1qdqw"), SubResource("OpenXRIPBinding_7tdwi"), SubResource("OpenXRIPBinding_rpdww"), SubResource("OpenXRIPBinding_p2ard")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_m44lj"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/vive_tracker_htcx/role/left_foot/input/grip/pose", "/user/vive_tracker_htcx/role/right_foot/input/grip/pose", "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose", "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose", "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose", "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose", "/user/vive_tracker_htcx/role/left_knee/input/grip/pose", "/user/vive_tracker_htcx/role/right_knee/input/grip/pose", "/user/vive_tracker_htcx/role/waist/input/grip/pose", "/user/vive_tracker_htcx/role/chest/input/grip/pose", "/user/vive_tracker_htcx/role/camera/input/grip/pose", "/user/vive_tracker_htcx/role/keyboard/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ihwv3"] +action = SubResource("OpenXRAction_8rav6") +paths = PackedStringArray("/user/vive_tracker_htcx/role/left_foot/output/haptic", "/user/vive_tracker_htcx/role/right_foot/output/haptic", "/user/vive_tracker_htcx/role/left_shoulder/output/haptic", "/user/vive_tracker_htcx/role/right_shoulder/output/haptic", "/user/vive_tracker_htcx/role/left_elbow/output/haptic", "/user/vive_tracker_htcx/role/right_elbow/output/haptic", "/user/vive_tracker_htcx/role/left_knee/output/haptic", "/user/vive_tracker_htcx/role/right_knee/output/haptic", "/user/vive_tracker_htcx/role/waist/output/haptic", "/user/vive_tracker_htcx/role/chest/output/haptic", "/user/vive_tracker_htcx/role/camera/output/haptic", "/user/vive_tracker_htcx/role/keyboard/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_smpqo"] +interaction_profile_path = "/interaction_profiles/htc/vive_tracker_htcx" +bindings = [SubResource("OpenXRIPBinding_m44lj"), SubResource("OpenXRIPBinding_ihwv3")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ths1k"] +action = SubResource("OpenXRAction_2ym5w") +paths = PackedStringArray("/user/eyes_ext/input/gaze_ext/pose") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_t61je"] +interaction_profile_path = "/interaction_profiles/ext/eye_gaze_interaction" +bindings = [SubResource("OpenXRIPBinding_ths1k")] + +[resource] +action_sets = [SubResource("OpenXRActionSet_y2k5r")] +interaction_profiles = [SubResource("OpenXRInteractionProfile_xi4o1"), SubResource("OpenXRInteractionProfile_bpdg5"), SubResource("OpenXRInteractionProfile_wqoi4"), SubResource("OpenXRInteractionProfile_syx8b"), SubResource("OpenXRInteractionProfile_nh5li"), SubResource("OpenXRInteractionProfile_c1rdy"), SubResource("OpenXRInteractionProfile_pw8hx"), SubResource("OpenXRInteractionProfile_tvq35"), SubResource("OpenXRInteractionProfile_pl43b"), SubResource("OpenXRInteractionProfile_kx27f"), SubResource("OpenXRInteractionProfile_cp21m"), SubResource("OpenXRInteractionProfile_smpqo"), SubResource("OpenXRInteractionProfile_t61je")] diff --git a/xr/OpenXRHandTrackingDemo/project.godot b/xr/OpenXRHandTrackingDemo/project.godot new file mode 100644 index 00000000000..16ab569a5e7 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/project.godot @@ -0,0 +1,33 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="OpenXRHandTrackingDemo" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.2", "GL Compatibility") +config/icon="res://icon.svg" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/godotopenxr/plugin.cfg") + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_etc2_astc=true + +[xr] + +openxr/enabled=true +openxr/foveation_level=2 +openxr/foveation_dynamic=true +shaders/enabled=true diff --git a/xr/OpenXRHandTrackingDemo/stick.tscn b/xr/OpenXRHandTrackingDemo/stick.tscn new file mode 100644 index 00000000000..8e7750efff6 --- /dev/null +++ b/xr/OpenXRHandTrackingDemo/stick.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://dtknso1rioevw"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_sssg3"] +albedo_color = Color(0.6842, 0.671572, 0.696409, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_lsd0h"] +material = SubResource("StandardMaterial3D_sssg3") +size = Vector3(0.1, 0.8, 0.1) + +[node name="Stick" type="Node3D"] + +[node name="StemY" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_lsd0h")