commit a4b64f8275a19d82aa2170e67b2a3b889873f8f6 Author: RubberDuckShobe <64215152+CLfamilaris@users.noreply.github.com> Date: Thu Aug 3 21:15:54 2023 +0200 Oh, I think a heart always learns to come through diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b17fa7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Godot 4+ specific ignores +.godot/ +*.dblite + +*.dll +*.lib +*.exp +*.obj \ No newline at end of file diff --git a/Main.tscn b/Main.tscn new file mode 100644 index 0000000..4579228 --- /dev/null +++ b/Main.tscn @@ -0,0 +1,144 @@ +[gd_scene load_steps=20 format=3 uid="uid://bq81xxba71cxw"] + +[ext_resource type="Script" path="res://scripts/RootInit.cs" id="1_i51wy"] +[ext_resource type="BoxMesh" uid="uid://c86k0m3ggdn76" path="res://controller.tres" id="2_d3qf6"] +[ext_resource type="Shader" path="res://shaders/ColorSwap.gdshader" id="2_xru62"] +[ext_resource type="Script" path="res://scripts/FootSensor.cs" id="3_6061f"] +[ext_resource type="Script" path="res://scripts/SensorTrigger.cs" id="4_thw0t"] +[ext_resource type="Shader" path="res://shaders/FootSensor.gdshader" id="4_xuw0l"] +[ext_resource type="Script" path="res://scripts/GameConnection.cs" id="5_44hhi"] +[ext_resource type="Shape3D" uid="uid://rd2eoar5f4gj" path="res://controller_collisionshape.tres" id="5_py4o4"] +[ext_resource type="Script" path="res://scripts/DisplayCapture.cs" id="7_ffs0h"] + +[sub_resource type="PlaneMesh" id="PlaneMesh_j2hdc"] +size = Vector2(1.77, 1) + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_phccb"] +size = Vector2(1920, 1080) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_y0wys"] +render_priority = 0 +shader = ExtResource("2_xru62") +shader_parameter/texture_albedo = SubResource("PlaceholderTexture2D_phccb") + +[sub_resource type="PlaneMesh" id="PlaneMesh_1s0mo"] +size = Vector2(1.28, 1.65) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_41fau"] +render_priority = 0 +shader = ExtResource("4_xuw0l") +shader_parameter/led_data = null + +[sub_resource type="BoxShape3D" id="BoxShape3D_r3gxn"] +size = Vector3(1.3, 0.08, 1.7) + +[sub_resource type="BoxMesh" id="BoxMesh_a5ph8"] +size = Vector3(0.04, 0.045, 0.05) + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cxmum"] +sky_top_color = Color(0.141176, 0.454902, 0.764706, 1) +sky_horizon_color = Color(0.901961, 0.65098, 0.678431, 1) +ground_bottom_color = Color(0.909804, 0.909804, 0.909804, 1) + +[sub_resource type="Sky" id="Sky_ifkyq"] +sky_material = SubResource("ProceduralSkyMaterial_cxmum") + +[sub_resource type="Environment" id="Environment_jj1ls"] +background_mode = 2 +sky = SubResource("Sky_ifkyq") +ambient_light_source = 3 +ssil_intensity = 3.38 +sdfgi_read_sky_light = false +glow_enabled = true + +[node name="Node3D" type="Node3D"] +script = ExtResource("1_i51wy") + +[node name="XROrigin3D" type="XROrigin3D" parent="."] + +[node name="Screen" type="CSGMesh3D" parent="XROrigin3D"] +transform = Transform3D(0.95, 0, 0, 0, -4.37114e-08, -0.95, 0, 1, -4.15258e-08, 0, 1.22575, -1.19404) +mesh = SubResource("PlaneMesh_j2hdc") +material = SubResource("ShaderMaterial_y0wys") +script = ExtResource("7_ffs0h") + +[node name="Foot Sensor Pad" type="CSGMesh3D" parent="XROrigin3D" node_paths=PackedStringArray("_gameConnection")] +gi_mode = 2 +use_collision = true +collision_layer = 4 +collision_mask = 4 +mesh = SubResource("PlaneMesh_1s0mo") +material = SubResource("ShaderMaterial_41fau") +script = ExtResource("3_6061f") +_gameConnection = NodePath("../../Game Connection") + +[node name="Sensor" type="Area3D" parent="XROrigin3D/Foot Sensor Pad"] +collision_layer = 3 +collision_mask = 2 + +[node name="MinMarker" type="Marker3D" parent="XROrigin3D/Foot Sensor Pad/Sensor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.64, 0, -0.824933) + +[node name="MaxMarker" type="Marker3D" parent="XROrigin3D/Foot Sensor Pad/Sensor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.640241, 0, 0.825155) + +[node name="CollisionPolygon3D" type="CollisionShape3D" parent="XROrigin3D/Foot Sensor Pad/Sensor"] +shape = SubResource("BoxShape3D_r3gxn") + +[node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7, 0) + +[node name="LeftHand" type="XRController3D" parent="XROrigin3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1, -0.5) +tracker = &"left_hand" + +[node name="Sensor" type="Area3D" parent="XROrigin3D/LeftHand"] +collision_layer = 2 +collision_mask = 2 +script = ExtResource("4_thw0t") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="XROrigin3D/LeftHand/Sensor"] +shape = ExtResource("5_py4o4") + +[node name="RayCast3D" type="RayCast3D" parent="XROrigin3D/LeftHand/Sensor"] +collision_mask = 4 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="XROrigin3D/LeftHand"] +mesh = ExtResource("2_d3qf6") + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="XROrigin3D/LeftHand"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0740553, 0) +mesh = SubResource("BoxMesh_a5ph8") + +[node name="RightHand" type="XRController3D" parent="XROrigin3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, -0.5) +tracker = &"right_hand" + +[node name="Sensor" type="Area3D" parent="XROrigin3D/RightHand"] +collision_layer = 2 +collision_mask = 2 +script = ExtResource("4_thw0t") +sensorId = 1 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="XROrigin3D/RightHand/Sensor"] +shape = ExtResource("5_py4o4") + +[node name="RayCast3D" type="RayCast3D" parent="XROrigin3D/RightHand/Sensor"] +collision_mask = 4 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="XROrigin3D/RightHand"] +mesh = ExtResource("2_d3qf6") + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="XROrigin3D/RightHand"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0740553, 0) +mesh = SubResource("BoxMesh_a5ph8") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.445432, 0.895316, 0, -0.895316, 0.445432, 0, 5.43573, -0.011737) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_jj1ls") + +[node name="Game Connection" type="Node" parent="." node_paths=PackedStringArray("_footSensor")] +script = ExtResource("5_44hhi") +_footSensor = NodePath("../XROrigin3D/Foot Sensor Pad") diff --git a/README.md b/README.md new file mode 100644 index 0000000..1893076 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# VRDOM +For the people who +- spent money on VR +- live in the middle of bumfuck nowhere and can't just drive 5h to and from the nearest arcade + +This is for that one funny 573 dance game with all those pretty lights. Still pretty WIP, the most basic stuff *should* work though. + +# Building +Grab [Godot 4.1 with .NET support](https://godotengine.org/download/windows) and open the project. You may need to install the NuGet packages yourself. \ No newline at end of file diff --git a/VRDOM.csproj b/VRDOM.csproj new file mode 100644 index 0000000..61defb2 --- /dev/null +++ b/VRDOM.csproj @@ -0,0 +1,9 @@ + + + net6.0 + true + + + + + \ No newline at end of file diff --git a/VRDOM.sln b/VRDOM.sln new file mode 100644 index 0000000..0e3b69b --- /dev/null +++ b/VRDOM.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VRDOM", "VRDOM.csproj", "{D520E313-A4E5-4815-81C5-801581B0C76E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + ExportDebug|Any CPU = ExportDebug|Any CPU + ExportRelease|Any CPU = ExportRelease|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D520E313-A4E5-4815-81C5-801581B0C76E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D520E313-A4E5-4815-81C5-801581B0C76E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D520E313-A4E5-4815-81C5-801581B0C76E}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU + {D520E313-A4E5-4815-81C5-801581B0C76E}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU + {D520E313-A4E5-4815-81C5-801581B0C76E}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU + {D520E313-A4E5-4815-81C5-801581B0C76E}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU + EndGlobalSection +EndGlobal diff --git a/controller.tres b/controller.tres new file mode 100644 index 0000000..efb2121 --- /dev/null +++ b/controller.tres @@ -0,0 +1,4 @@ +[gd_resource type="BoxMesh" format=3 uid="uid://c86k0m3ggdn76"] + +[resource] +size = Vector3(0.1, 0.1, 0.1) diff --git a/controller_collisionshape.tres b/controller_collisionshape.tres new file mode 100644 index 0000000..b8a1d79 --- /dev/null +++ b/controller_collisionshape.tres @@ -0,0 +1,4 @@ +[gd_resource type="BoxShape3D" format=3 uid="uid://rd2eoar5f4gj"] + +[resource] +size = Vector3(0.1, 0.1, 0.1) diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..b370ceb --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..a610e23 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwcpcngsrs8dm" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/openxr_action_map.tres b/openxr_action_map.tres new file mode 100644 index 0000000..f3d1b65 --- /dev/null +++ b/openxr_action_map.tres @@ -0,0 +1,835 @@ +[gd_resource type="OpenXRActionMap" load_steps=197 format=3 uid="uid://6jacgy3u6pau"] + +[sub_resource type="OpenXRAction" id="OpenXRAction_y062n"] +resource_name = "trigger" +localized_name = "Trigger" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_seerx"] +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_s8iuk"] +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_4fliw"] +resource_name = "grip" +localized_name = "Grip" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_vtkrt"] +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_a4qke"] +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_gtsy0"] +resource_name = "grip_force" +localized_name = "Grip force" +toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") + +[sub_resource type="OpenXRAction" id="OpenXRAction_4t61h"] +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_mbh41"] +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_2b35x"] +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_wc4bs"] +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_3meys"] +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_leb4v"] +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_ds8ku"] +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_54yne"] +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_3ajip"] +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_2v5hd"] +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_expdw"] +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_0138q"] +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_1seqp"] +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") + +[sub_resource type="OpenXRAction" id="OpenXRAction_4cghg"] +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_rvi8w"] +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_sv3of"] +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_fei5o"] +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_qs6q3"] +resource_name = "godot" +localized_name = "Godot action set" +actions = [SubResource("OpenXRAction_y062n"), SubResource("OpenXRAction_seerx"), SubResource("OpenXRAction_s8iuk"), SubResource("OpenXRAction_4fliw"), SubResource("OpenXRAction_vtkrt"), SubResource("OpenXRAction_a4qke"), SubResource("OpenXRAction_gtsy0"), SubResource("OpenXRAction_4t61h"), SubResource("OpenXRAction_mbh41"), SubResource("OpenXRAction_2b35x"), SubResource("OpenXRAction_wc4bs"), SubResource("OpenXRAction_3meys"), SubResource("OpenXRAction_leb4v"), SubResource("OpenXRAction_ds8ku"), SubResource("OpenXRAction_54yne"), SubResource("OpenXRAction_3ajip"), SubResource("OpenXRAction_2v5hd"), SubResource("OpenXRAction_expdw"), SubResource("OpenXRAction_0138q"), SubResource("OpenXRAction_1seqp"), SubResource("OpenXRAction_4cghg"), SubResource("OpenXRAction_rvi8w"), SubResource("OpenXRAction_sv3of"), SubResource("OpenXRAction_fei5o")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1lr1w"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mkvmr"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pm370"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g8wiw"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_upisp"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_375vj"] +action = SubResource("OpenXRAction_54yne") +paths = PackedStringArray("/user/hand/left/input/select/click", "/user/hand/right/input/select/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_h7a33"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_l83nv"] +interaction_profile_path = "/interaction_profiles/khr/simple_controller" +bindings = [SubResource("OpenXRIPBinding_1lr1w"), SubResource("OpenXRIPBinding_mkvmr"), SubResource("OpenXRIPBinding_pm370"), SubResource("OpenXRIPBinding_g8wiw"), SubResource("OpenXRIPBinding_upisp"), SubResource("OpenXRIPBinding_375vj"), SubResource("OpenXRIPBinding_h7a33")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1dxdc"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gr4le"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7x18d"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x1gd5"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_eojnc"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f83ke"] +action = SubResource("OpenXRAction_54yne") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f5b8j"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_iq2bx"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bpfx6"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5laq6"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jegcb"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_akuse"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7vqhb"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_edu20"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_m56k4"] +interaction_profile_path = "/interaction_profiles/htc/vive_controller" +bindings = [SubResource("OpenXRIPBinding_1dxdc"), SubResource("OpenXRIPBinding_gr4le"), SubResource("OpenXRIPBinding_7x18d"), SubResource("OpenXRIPBinding_x1gd5"), SubResource("OpenXRIPBinding_eojnc"), SubResource("OpenXRIPBinding_f83ke"), SubResource("OpenXRIPBinding_f5b8j"), SubResource("OpenXRIPBinding_iq2bx"), SubResource("OpenXRIPBinding_bpfx6"), SubResource("OpenXRIPBinding_5laq6"), SubResource("OpenXRIPBinding_jegcb"), SubResource("OpenXRIPBinding_akuse"), SubResource("OpenXRIPBinding_7vqhb"), SubResource("OpenXRIPBinding_edu20")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0rios"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ms761"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hk0al"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_h1ir5"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_blqf0"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1awhh"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wsxge"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6xld6"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vmqoo"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ehcrx"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vet2g"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q2dcl"] +action = SubResource("OpenXRAction_wc4bs") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pdwus"] +action = SubResource("OpenXRAction_3meys") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_758rk"] +action = SubResource("OpenXRAction_leb4v") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ve1pp"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_0nr80"] +interaction_profile_path = "/interaction_profiles/microsoft/motion_controller" +bindings = [SubResource("OpenXRIPBinding_0rios"), SubResource("OpenXRIPBinding_ms761"), SubResource("OpenXRIPBinding_hk0al"), SubResource("OpenXRIPBinding_h1ir5"), SubResource("OpenXRIPBinding_blqf0"), SubResource("OpenXRIPBinding_1awhh"), SubResource("OpenXRIPBinding_wsxge"), SubResource("OpenXRIPBinding_6xld6"), SubResource("OpenXRIPBinding_vmqoo"), SubResource("OpenXRIPBinding_ehcrx"), SubResource("OpenXRIPBinding_vet2g"), SubResource("OpenXRIPBinding_q2dcl"), SubResource("OpenXRIPBinding_pdwus"), SubResource("OpenXRIPBinding_758rk"), SubResource("OpenXRIPBinding_ve1pp")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fum5p"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xbfgg"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qtuq8"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hwaoo"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_61hx0"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6i1a7"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0ensj"] +action = SubResource("OpenXRAction_2v5hd") +paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qkpjp"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g73pc"] +action = SubResource("OpenXRAction_0138q") +paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cfodb"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_aa4pf"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_uoek2"] +action = SubResource("OpenXRAction_s8iuk") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wh0qn"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sbuho"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qq2je"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_w0olk"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qcnqk"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pb6tx"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_coslu"] +interaction_profile_path = "/interaction_profiles/oculus/touch_controller" +bindings = [SubResource("OpenXRIPBinding_fum5p"), SubResource("OpenXRIPBinding_xbfgg"), SubResource("OpenXRIPBinding_qtuq8"), SubResource("OpenXRIPBinding_hwaoo"), SubResource("OpenXRIPBinding_61hx0"), SubResource("OpenXRIPBinding_6i1a7"), SubResource("OpenXRIPBinding_0ensj"), SubResource("OpenXRIPBinding_qkpjp"), SubResource("OpenXRIPBinding_g73pc"), SubResource("OpenXRIPBinding_cfodb"), SubResource("OpenXRIPBinding_aa4pf"), SubResource("OpenXRIPBinding_uoek2"), SubResource("OpenXRIPBinding_wh0qn"), SubResource("OpenXRIPBinding_sbuho"), SubResource("OpenXRIPBinding_qq2je"), SubResource("OpenXRIPBinding_w0olk"), SubResource("OpenXRIPBinding_qcnqk"), SubResource("OpenXRIPBinding_pb6tx")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wavuv"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qg0bj"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3b2hc"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nbnpu"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fx2n0"] +action = SubResource("OpenXRAction_54yne") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cnjem"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/back/click", "/user/hand/right/input/back/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_17m8t"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2d0nq"] +action = SubResource("OpenXRAction_2v5hd") +paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2btaf"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_oo1jo"] +action = SubResource("OpenXRAction_0138q") +paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mcxpd"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dt10d"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_da06j"] +action = SubResource("OpenXRAction_s8iuk") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8mcic"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ej0ux"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1l68r"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1c8ws"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pk2h5"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0g3ls"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_dwef8"] +interaction_profile_path = "/interaction_profiles/pico/neo3_controller" +bindings = [SubResource("OpenXRIPBinding_wavuv"), SubResource("OpenXRIPBinding_qg0bj"), SubResource("OpenXRIPBinding_3b2hc"), SubResource("OpenXRIPBinding_nbnpu"), SubResource("OpenXRIPBinding_fx2n0"), SubResource("OpenXRIPBinding_cnjem"), SubResource("OpenXRIPBinding_17m8t"), SubResource("OpenXRIPBinding_2d0nq"), SubResource("OpenXRIPBinding_2btaf"), SubResource("OpenXRIPBinding_oo1jo"), SubResource("OpenXRIPBinding_mcxpd"), SubResource("OpenXRIPBinding_dt10d"), SubResource("OpenXRIPBinding_da06j"), SubResource("OpenXRIPBinding_8mcic"), SubResource("OpenXRIPBinding_ej0ux"), SubResource("OpenXRIPBinding_1l68r"), SubResource("OpenXRIPBinding_1c8ws"), SubResource("OpenXRIPBinding_pk2h5"), SubResource("OpenXRIPBinding_0g3ls")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vrpj5"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ryr8e"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_og7cr"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_oukxt"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7sojt"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_j2vfe"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/a/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ee1qf"] +action = SubResource("OpenXRAction_2v5hd") +paths = PackedStringArray("/user/hand/left/input/a/touch", "/user/hand/right/input/a/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ywty5"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/b/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g0yxg"] +action = SubResource("OpenXRAction_0138q") +paths = PackedStringArray("/user/hand/left/input/b/touch", "/user/hand/right/input/b/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vlagd"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hlhwq"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k2pgv"] +action = SubResource("OpenXRAction_s8iuk") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gq6rk"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3n3gf"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1ky72"] +action = SubResource("OpenXRAction_gtsy0") +paths = PackedStringArray("/user/hand/left/input/squeeze/force", "/user/hand/right/input/squeeze/force") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x06h7"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jr3bv"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x4v5r"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5jh43"] +action = SubResource("OpenXRAction_wc4bs") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xj2ji"] +action = SubResource("OpenXRAction_3meys") +paths = PackedStringArray("/user/hand/left/input/trackpad/force", "/user/hand/right/input/trackpad/force") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_t3c1u"] +action = SubResource("OpenXRAction_leb4v") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ld2y0"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_orejf"] +interaction_profile_path = "/interaction_profiles/valve/index_controller" +bindings = [SubResource("OpenXRIPBinding_vrpj5"), SubResource("OpenXRIPBinding_ryr8e"), SubResource("OpenXRIPBinding_og7cr"), SubResource("OpenXRIPBinding_oukxt"), SubResource("OpenXRIPBinding_7sojt"), SubResource("OpenXRIPBinding_j2vfe"), SubResource("OpenXRIPBinding_ee1qf"), SubResource("OpenXRIPBinding_ywty5"), SubResource("OpenXRIPBinding_g0yxg"), SubResource("OpenXRIPBinding_vlagd"), SubResource("OpenXRIPBinding_hlhwq"), SubResource("OpenXRIPBinding_k2pgv"), SubResource("OpenXRIPBinding_gq6rk"), SubResource("OpenXRIPBinding_3n3gf"), SubResource("OpenXRIPBinding_1ky72"), SubResource("OpenXRIPBinding_x06h7"), SubResource("OpenXRIPBinding_jr3bv"), SubResource("OpenXRIPBinding_x4v5r"), SubResource("OpenXRIPBinding_5jh43"), SubResource("OpenXRIPBinding_xj2ji"), SubResource("OpenXRIPBinding_t3c1u"), SubResource("OpenXRIPBinding_ld2y0")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nwe24"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_62a71"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_flxka"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_07yjo"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7aoxy"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mrwqd"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_onpfa"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0664x"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_w807y"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fra6p"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sb4na"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8rtwo"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qrr2e"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gnbgw"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_jcpt7"] +interaction_profile_path = "/interaction_profiles/hp/mixed_reality_controller" +bindings = [SubResource("OpenXRIPBinding_nwe24"), SubResource("OpenXRIPBinding_62a71"), SubResource("OpenXRIPBinding_flxka"), SubResource("OpenXRIPBinding_07yjo"), SubResource("OpenXRIPBinding_7aoxy"), SubResource("OpenXRIPBinding_mrwqd"), SubResource("OpenXRIPBinding_onpfa"), SubResource("OpenXRIPBinding_0664x"), SubResource("OpenXRIPBinding_w807y"), SubResource("OpenXRIPBinding_fra6p"), SubResource("OpenXRIPBinding_sb4na"), SubResource("OpenXRIPBinding_8rtwo"), SubResource("OpenXRIPBinding_qrr2e"), SubResource("OpenXRIPBinding_gnbgw")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kdnwj"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_smeve"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fglyf"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_yc6jt"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8fwi4"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7nkhk"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jy8rl"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hpgo7"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4q5ub"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nelm6"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ph4wk"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1661t"] +action = SubResource("OpenXRAction_wc4bs") +paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_l5otv"] +action = SubResource("OpenXRAction_3meys") +paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pvix6"] +action = SubResource("OpenXRAction_leb4v") +paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wc3gb"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_vdhpc"] +interaction_profile_path = "/interaction_profiles/samsung/odyssey_controller" +bindings = [SubResource("OpenXRIPBinding_kdnwj"), SubResource("OpenXRIPBinding_smeve"), SubResource("OpenXRIPBinding_fglyf"), SubResource("OpenXRIPBinding_yc6jt"), SubResource("OpenXRIPBinding_8fwi4"), SubResource("OpenXRIPBinding_7nkhk"), SubResource("OpenXRIPBinding_jy8rl"), SubResource("OpenXRIPBinding_hpgo7"), SubResource("OpenXRIPBinding_4q5ub"), SubResource("OpenXRIPBinding_nelm6"), SubResource("OpenXRIPBinding_ph4wk"), SubResource("OpenXRIPBinding_1661t"), SubResource("OpenXRIPBinding_l5otv"), SubResource("OpenXRIPBinding_pvix6"), SubResource("OpenXRIPBinding_wc3gb")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6pq45"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q21y2"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_fxbve"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x82yu"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dfgrh"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ldgwr"] +action = SubResource("OpenXRAction_54yne") +paths = PackedStringArray("/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7mbc0"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8puxy"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ogvyw"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_662xs"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0gpqb"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_64uy7"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_no5tl"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_stsrw"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rhl1w"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_awhlk"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_ymb65"] +interaction_profile_path = "/interaction_profiles/htc/vive_cosmos_controller" +bindings = [SubResource("OpenXRIPBinding_6pq45"), SubResource("OpenXRIPBinding_q21y2"), SubResource("OpenXRIPBinding_fxbve"), SubResource("OpenXRIPBinding_x82yu"), SubResource("OpenXRIPBinding_dfgrh"), SubResource("OpenXRIPBinding_ldgwr"), SubResource("OpenXRIPBinding_7mbc0"), SubResource("OpenXRIPBinding_8puxy"), SubResource("OpenXRIPBinding_ogvyw"), SubResource("OpenXRIPBinding_662xs"), SubResource("OpenXRIPBinding_0gpqb"), SubResource("OpenXRIPBinding_64uy7"), SubResource("OpenXRIPBinding_no5tl"), SubResource("OpenXRIPBinding_stsrw"), SubResource("OpenXRIPBinding_rhl1w"), SubResource("OpenXRIPBinding_awhlk")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_r45x1"] +action = SubResource("OpenXRAction_1seqp") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v3j5x"] +action = SubResource("OpenXRAction_4cghg") +paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_i5lfi"] +action = SubResource("OpenXRAction_rvi8w") +paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_je57r"] +action = SubResource("OpenXRAction_sv3of") +paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pikjn"] +action = SubResource("OpenXRAction_ds8ku") +paths = PackedStringArray("/user/hand/left/input/menu/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wkuva"] +action = SubResource("OpenXRAction_54yne") +paths = PackedStringArray("/user/hand/right/input/system/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_llgws"] +action = SubResource("OpenXRAction_3ajip") +paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6fk1c"] +action = SubResource("OpenXRAction_expdw") +paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_o3tve"] +action = SubResource("OpenXRAction_y062n") +paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kcw08"] +action = SubResource("OpenXRAction_seerx") +paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1rhrb"] +action = SubResource("OpenXRAction_s8iuk") +paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qigcd"] +action = SubResource("OpenXRAction_4fliw") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_l883a"] +action = SubResource("OpenXRAction_vtkrt") +paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5si61"] +action = SubResource("OpenXRAction_4t61h") +paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_481oo"] +action = SubResource("OpenXRAction_mbh41") +paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_o480n"] +action = SubResource("OpenXRAction_2b35x") +paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ynweh"] +action = SubResource("OpenXRAction_leb4v") +paths = PackedStringArray("/user/hand/left/input/thumbrest/touch", "/user/hand/right/input/thumbrest/touch") + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mtx5n"] +action = SubResource("OpenXRAction_fei5o") +paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") + +[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_mbvhu"] +interaction_profile_path = "/interaction_profiles/htc/vive_focus3_controller" +bindings = [SubResource("OpenXRIPBinding_r45x1"), SubResource("OpenXRIPBinding_v3j5x"), SubResource("OpenXRIPBinding_i5lfi"), SubResource("OpenXRIPBinding_je57r"), SubResource("OpenXRIPBinding_pikjn"), SubResource("OpenXRIPBinding_wkuva"), SubResource("OpenXRIPBinding_llgws"), SubResource("OpenXRIPBinding_6fk1c"), SubResource("OpenXRIPBinding_o3tve"), SubResource("OpenXRIPBinding_kcw08"), SubResource("OpenXRIPBinding_1rhrb"), SubResource("OpenXRIPBinding_qigcd"), SubResource("OpenXRIPBinding_l883a"), SubResource("OpenXRIPBinding_5si61"), SubResource("OpenXRIPBinding_481oo"), SubResource("OpenXRIPBinding_o480n"), SubResource("OpenXRIPBinding_ynweh"), SubResource("OpenXRIPBinding_mtx5n")] + +[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3xtv4"] +action = SubResource("OpenXRAction_1seqp") +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_jsp5c"] +action = SubResource("OpenXRAction_fei5o") +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_5qrmo"] +interaction_profile_path = "/interaction_profiles/htc/vive_tracker_htcx" +bindings = [SubResource("OpenXRIPBinding_3xtv4"), SubResource("OpenXRIPBinding_jsp5c")] + +[resource] +action_sets = [SubResource("OpenXRActionSet_qs6q3")] +interaction_profiles = [SubResource("OpenXRInteractionProfile_l83nv"), SubResource("OpenXRInteractionProfile_m56k4"), SubResource("OpenXRInteractionProfile_0nr80"), SubResource("OpenXRInteractionProfile_coslu"), SubResource("OpenXRInteractionProfile_dwef8"), SubResource("OpenXRInteractionProfile_orejf"), SubResource("OpenXRInteractionProfile_jcpt7"), SubResource("OpenXRInteractionProfile_vdhpc"), SubResource("OpenXRInteractionProfile_ymb65"), SubResource("OpenXRInteractionProfile_mbvhu"), SubResource("OpenXRInteractionProfile_5qrmo")] diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..ca370cc --- /dev/null +++ b/project.godot @@ -0,0 +1,25 @@ +; 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="VRDOM" +run/main_scene="res://Main.tscn" +config/features=PackedStringArray("4.1", "C#", "Forward Plus") +config/icon="res://icon.svg" + +[dotnet] + +project/assembly_name="VRDOM" + +[xr] + +openxr/enabled=true +shaders/enabled=true diff --git a/scripts/DisplayCapture.cs b/scripts/DisplayCapture.cs new file mode 100644 index 0000000..81c2379 --- /dev/null +++ b/scripts/DisplayCapture.cs @@ -0,0 +1,66 @@ +using System.Threading; +using System.Collections.Generic; +using System.Linq; +using Godot; +using ScreenCapture.NET; + +public partial class DisplayCapture : CsgMesh3D +{ + private IScreenCapture _screenCapture; + private CaptureZone _capZone; + private ImageTexture _texture; + private Image _image; + private Thread _capThread; + private CancellationTokenSource cancel = new CancellationTokenSource(); + + public override void _Ready() + { + // Create a screen-capture service + IScreenCaptureService screenCaptureService = new DX11ScreenCaptureService(); + + // Get all available graphics cards + IEnumerable graphicsCards = screenCaptureService.GetGraphicsCards(); + + // Get the displays from the graphics card(s) you are interested in + IEnumerable displays = screenCaptureService.GetDisplays(graphicsCards.First()); + + // Create a screen-capture for all screens you want to capture + _screenCapture = screenCaptureService.GetScreenCapture(displays.First()); + + // Register the regions you want to capture on the screen + // Capture the whole screen + _capZone = _screenCapture.RegisterCaptureZone(0, 0, _screenCapture.Display.Width, _screenCapture.Display.Height); + + _image = Image.Create(_capZone.Width, _capZone.Height, false, Image.Format.Rgba8); + _image.Fill(Color.Color8(0, 0, 0, 255)); + _texture = ImageTexture.CreateFromImage(_image); + + _capThread = new(new ThreadStart(RefreshCaptureThread)); + _capThread.Start(); + } + + void RefreshCaptureThread() + { + while (!cancel.IsCancellationRequested) + { + _screenCapture.CaptureScreen(); + lock (_capZone.Buffer) + { + _image.SetData(_capZone.Width, _capZone.Height, false, Image.Format.Rgba8, _capZone.Buffer); + _texture.CallDeferred(ImageTexture.MethodName.Update, _image); + Thread.Sleep(16); + } + } + } + + public override void _ExitTree() + { + cancel.Cancel(); + _screenCapture.Dispose(); + } + + public override void _Process(double delta) + { + (Material as ShaderMaterial).SetShaderParameter("texture_albedo", _texture); + } +} \ No newline at end of file diff --git a/scripts/FootSensor.cs b/scripts/FootSensor.cs new file mode 100644 index 0000000..d982236 --- /dev/null +++ b/scripts/FootSensor.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using Godot; +using VRDOM; + +public partial class FootSensor : CsgMesh3D +{ + [Export] + private GameConnection _gameConnection; + + private Area3D _sensor; + private Marker3D MinMarker; + private Marker3D MaxMarker; + private Dictionary _activeSensors = new Dictionary(); + public Vector3[] gpu_led_data = new Vector3[1862]; + private Vector2 defaultTouchSize = new Vector2(0.15f, 0.15f); + + public override void _PhysicsProcess(double delta) + { + List touchCommands = new List(); + + foreach (var pair in _activeSensors) + _activeSensors[pair.Key] = false; + + foreach (Area3D area in _sensor.GetOverlappingAreas()) + { + var sensorTrigger = area as SensorTrigger; + RayCast3D raycast = area.GetNode("RayCast3D") as RayCast3D; + if (raycast.IsColliding()) + { + if (_activeSensors.ContainsKey(sensorTrigger.sensorId)) + { + _activeSensors[sensorTrigger.sensorId] = true; + //GD.Print($"move event on {sensorTrigger.sensorId}!"); + //move event! + touchCommands.Add(new TouchCommand(sensorTrigger.sensorId, (int)TouchEvents.TOUCH_MOVE, GetLocalTouchPosition(new Vector2(raycast.GetCollisionPoint().X, raycast.GetCollisionPoint().Z)), defaultTouchSize)); + + } + else + { + _activeSensors.Add(sensorTrigger.sensorId, true); + //GD.Print($"down event on {sensorTrigger.sensorId}!"); + //down event! + touchCommands.Add(new TouchCommand(sensorTrigger.sensorId, (int)TouchEvents.TOUCH_DOWN, GetLocalTouchPosition(new Vector2(raycast.GetCollisionPoint().X, raycast.GetCollisionPoint().Z)), defaultTouchSize)); + } + } + } + + foreach (var pair in _activeSensors) + { + if (pair.Value == false) + { + _activeSensors.Remove(pair.Key); + //GD.Print($"up event on {pair.Key}!"); + //up event! + touchCommands.Add(new TouchCommand(pair.Key, (int)TouchEvents.TOUCH_UP, new Vector2(0, 0), defaultTouchSize)); + } + } + _gameConnection.setTouch(touchCommands); + } + + public Vector2 GetLocalTouchPosition(Vector2 vec) + { + float x = 1 - (vec.X - MinMarker.GlobalPosition.X) / (MaxMarker.GlobalPosition.X - MinMarker.GlobalPosition.X); + float y = 1 - (vec.Y - MinMarker.GlobalPosition.Z) / (MaxMarker.GlobalPosition.Z - MinMarker.GlobalPosition.Z); + return new Vector2(1 - x, 1 - y); + } + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + _sensor = GetNode("Sensor") as Area3D; + MinMarker = GetNode("Sensor/MinMarker") as Marker3D; + MaxMarker = GetNode("Sensor/MaxMarker") as Marker3D; + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + (Material as ShaderMaterial).SetShaderParameter("led_data", gpu_led_data); + } +} diff --git a/scripts/GameConnection.cs b/scripts/GameConnection.cs new file mode 100644 index 0000000..7c46b8c --- /dev/null +++ b/scripts/GameConnection.cs @@ -0,0 +1,95 @@ +using Godot; +using System.Collections.Generic; +using System.Text; +using VRDOM; + +public partial class GameConnection : Node +{ + [Export] + private string _websocket_url = "ws://localhost:9002"; + [Export] + private FootSensor _footSensor; + + private WebSocketPeer wsPeer = new WebSocketPeer(); + double lightingGetInterval = 0.0166; + double lightingGetTimer = 0; + + public void getLighting() + { + if (wsPeer.GetReadyState() == WebSocketPeer.State.Open) + wsPeer.Send(Encoding.UTF8.GetBytes("{\"id\":0,\"module\":\"drs\",\"function\":\"tapeled_get\",\"params\":[]}")); + } + + public void setTouch(List touchCommands) + { + if (touchCommands.Count == 0) + return; + + if (wsPeer.GetReadyState() == WebSocketPeer.State.Open) + { + string touchCommandString = "{\"id\":1,\"module\":\"drs\",\"function\":\"touch_set\",\"params\":["; + foreach (var touchCommand in touchCommands) + { + touchCommandString += "[" + touchCommand.touchEvent + "," + touchCommand.sensorId + "," + touchCommand.touchPosition.X.ToString("0.0000") + "," + touchCommand.touchPosition.Y.ToString("0.0000") + "," + touchCommand.touchSize.X + "," + touchCommand.touchSize.Y + "],"; + } + touchCommandString = touchCommandString.Remove(touchCommandString.Length - 1); + touchCommandString += "]}"; + wsPeer.Send(Encoding.UTF8.GetBytes(touchCommandString)); + } + } + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + GD.Print("Connecting WebSocket..."); + wsPeer.ConnectToUrl(_websocket_url); + wsPeer.EncodeBufferMaxSize = 16 * 1024 * 1024; + wsPeer.InboundBufferSize = 16 * 1024 * 1024; + wsPeer.OutboundBufferSize = 16 * 1024 * 1024; + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + lightingGetTimer += delta; + wsPeer.Poll(); + var state = wsPeer.GetReadyState(); + switch (state) + { + case WebSocketPeer.State.Open: + if (lightingGetTimer >= lightingGetInterval) + { + getLighting(); + lightingGetTimer = 0; + } + + for (int i = 0; i < wsPeer.GetAvailablePacketCount(); i++) + { + string packetText = Encoding.UTF8.GetString(wsPeer.GetPacket()); + if (packetText.Contains("id")) + { + var dict = Json.ParseString(packetText).AsGodotDictionary(); + if (dict.ContainsKey("data") && dict["id"].AsInt32() == 0) + { + int[] ledData = dict["data"].AsGodotArray()[0].AsInt32Array(); + //The LED data is in the format of [r, g, b, r, g, b, ...] + //We need to turn that into an array of Vector3s and then push that to the shader + for (int j = 0; j < ledData.Length; j += 3) + { + _footSensor.gpu_led_data[j / 3] = new Vector3(ledData[j], ledData[j + 1], ledData[j + 2]); + } + } + } + } + break; + case WebSocketPeer.State.Closed: + GD.Print("WebSocket closed."); + var code = wsPeer.GetCloseCode(); + var reason = wsPeer.GetCloseReason(); + GD.Print("WebSocket closed with code: %d, reason %s. Clean: %s", code, reason, code != -1); + + SetProcess(false); + break; + } + } +} diff --git a/scripts/GameInfo.cs b/scripts/GameInfo.cs new file mode 100644 index 0000000..d2474cb --- /dev/null +++ b/scripts/GameInfo.cs @@ -0,0 +1,24 @@ +using Godot; + +namespace VRDOM; + +public enum TouchEvents +{ + TOUCH_DOWN = 0, + TOUCH_UP = 1, + TOUCH_MOVE = 2, +} + +public class TouchCommand { + public int sensorId; + public int touchEvent; + public Vector2 touchPosition; + public Vector2 touchSize; + + public TouchCommand(int sensorId, int touchEvent, Vector2 touchPosition, Vector2 touchSize) { + this.sensorId = sensorId; + this.touchEvent = touchEvent; + this.touchPosition = touchPosition; + this.touchSize = touchSize; + } +} \ No newline at end of file diff --git a/scripts/RootInit.cs b/scripts/RootInit.cs new file mode 100644 index 0000000..6b9d8f8 --- /dev/null +++ b/scripts/RootInit.cs @@ -0,0 +1,25 @@ +using Godot; + +public partial class RootInit : Node3D +{ + private XRInterface _xrInterface; + + public override void _Ready() + { + _xrInterface = XRServer.FindInterface("OpenXR"); + if(_xrInterface != null && _xrInterface.IsInitialized()) + { + GD.Print("OpenXR initialized successfully"); + + // Turn off v-sync! + DisplayServer.WindowSetVsyncMode(DisplayServer.VSyncMode.Disabled); + + // Change our main viewport to output to the HMD + GetViewport().UseXR = true; + } + else + { + GD.Print("OpenXR not initialized, please check if your headset is connected"); + } + } +} \ No newline at end of file diff --git a/scripts/SensorTrigger.cs b/scripts/SensorTrigger.cs new file mode 100644 index 0000000..e57621a --- /dev/null +++ b/scripts/SensorTrigger.cs @@ -0,0 +1,17 @@ +using Godot; + +public partial class SensorTrigger : Area3D +{ + [Export] + public int sensorId; + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + } +} diff --git a/shaders/ColorSwap.gdshader b/shaders/ColorSwap.gdshader new file mode 100644 index 0000000..1a20d8f --- /dev/null +++ b/shaders/ColorSwap.gdshader @@ -0,0 +1,9 @@ +shader_type spatial; +render_mode unshaded; +uniform sampler2D texture_albedo : source_color; +void fragment() +{ + vec4 albedo_tex = texture(texture_albedo, UV); + ALBEDO = albedo_tex.bgr; + ALPHA = albedo_tex.a; +} \ No newline at end of file diff --git a/shaders/FootSensor.gdshader b/shaders/FootSensor.gdshader new file mode 100644 index 0000000..2de7d49 --- /dev/null +++ b/shaders/FootSensor.gdshader @@ -0,0 +1,19 @@ +shader_type spatial; +uniform vec3 led_data[1862]; +const int SIZE_Y = 49; +const int SIZE_X = 38; +void fragment() { + int coord_y = int(floor(float(SIZE_Y) * UV.y)); + int coord_x = int(floor(float(SIZE_X) * UV.x)); + + vec3 coord_color = led_data[(coord_y * SIZE_X + coord_x)]; + + vec2 local_UV = vec2((UV.x - float(coord_x) * 1.0/float(SIZE_X))*float(SIZE_X), + (UV.y - float(coord_y) * 1.0/float(SIZE_Y))*float(SIZE_Y)); + + float dist = ((local_UV.x - 0.5)*(local_UV.x - 0.5) + (local_UV.y - 0.5)*(local_UV.y - 0.5)); + float factor = exp(-25.0*dist); + + ALBEDO = factor*coord_color; + EMISSION = ALBEDO; +} \ No newline at end of file