├── .gitignore ├── .gitattributes ├── README.md ├── 3D GUI.csproj ├── project.godot ├── 3DUI.tscn ├── icon.svg.import ├── 3D GUI.sln ├── LICENSE ├── Player ├── Hand.cs └── Player.tscn ├── icon.svg ├── main.tscn ├── UI3D.cs └── openxr_action_map.tres /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | .vs/ -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Godot 3D UI for VR and mouse interactions 2 | 3 | This branch is a demo scene for a UI in Godot 4, that works with VR controllers and mouse pointer. 4 | -------------------------------------------------------------------------------- /3D GUI.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net6.0 4 | true 5 | DGUI 6 | 7 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="3D GUI" 14 | run/main_scene="res://main.tscn" 15 | config/features=PackedStringArray("4.0", "C#", "Forward Plus") 16 | config/icon="res://icon.svg" 17 | 18 | [dotnet] 19 | 20 | project/assembly_name="3D GUI" 21 | 22 | [xr] 23 | 24 | openxr/enabled=true 25 | shaders/enabled=true 26 | -------------------------------------------------------------------------------- /3DUI.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://bqq3lrdx6uy6n"] 2 | 3 | [ext_resource type="Script" path="res://UI3D.cs" id="1_rx6mn"] 4 | 5 | [sub_resource type="QuadMesh" id="QuadMesh_1tg5i"] 6 | resource_local_to_scene = true 7 | 8 | [sub_resource type="BoxShape3D" id="BoxShape3D_5tcmx"] 9 | size = Vector3(1, 1, 0.0746835) 10 | 11 | [node name="3DUI" type="Node3D" node_paths=PackedStringArray("quad", "area", "shape")] 12 | script = ExtResource("1_rx6mn") 13 | quad = NodePath("MeshInstance3D") 14 | area = NodePath("MeshInstance3D/Area3D") 15 | shape = NodePath("MeshInstance3D/Area3D/CollisionShape3D") 16 | 17 | [node name="MeshInstance3D" type="MeshInstance3D" parent="."] 18 | mesh = SubResource("QuadMesh_1tg5i") 19 | 20 | [node name="Area3D" type="Area3D" parent="MeshInstance3D"] 21 | 22 | [node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/Area3D"] 23 | shape = SubResource("BoxShape3D_5tcmx") 24 | -------------------------------------------------------------------------------- /icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://8ty6fbvkdaek" 6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /3D GUI.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 2012 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "3D GUI", "3D GUI.csproj", "{F28503A7-0D50-413A-861C-9AA320C2FC45}" 4 | EndProject 5 | Global 6 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 7 | Debug|Any CPU = Debug|Any CPU 8 | ExportDebug|Any CPU = ExportDebug|Any CPU 9 | ExportRelease|Any CPU = ExportRelease|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU 15 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU 16 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU 17 | {F28503A7-0D50-413A-861C-9AA320C2FC45}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU 18 | EndGlobalSection 19 | EndGlobal 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Mateusz Zdrzałek 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Player/Hand.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | 3 | public partial class Hand : XRController3D 4 | { 5 | [Export] 6 | public RayCast3D raycastCursor; 7 | 8 | [Export] 9 | public MeshInstance3D raycastVisualizer; 10 | 11 | public override void _Ready() 12 | { 13 | ButtonPressed += HandleButtonPress; 14 | 15 | raycastVisualizer.Visible = false; 16 | } 17 | 18 | public UI3D hoveredUi; 19 | 20 | public override void _PhysicsProcess(double delta) 21 | { 22 | if (raycastCursor.IsColliding()) 23 | { 24 | HandleRaycastCollision(); 25 | } 26 | else if (hoveredUi != null || raycastVisualizer.Visible) 27 | { 28 | HideRaycastVisualizer(); 29 | } 30 | } 31 | 32 | private void HideRaycastVisualizer() 33 | { 34 | raycastVisualizer.Visible = false; 35 | hoveredUi = null; 36 | } 37 | 38 | private void HandleRaycastCollision() 39 | { 40 | if (raycastCursor.GetCollider() is not Area3D area) 41 | { 42 | HideRaycastVisualizer(); 43 | return; 44 | } 45 | 46 | if (area.GetParent() is not MeshInstance3D mesh) 47 | { 48 | HideRaycastVisualizer(); 49 | return; 50 | } 51 | 52 | if (mesh.GetParent() is not UI3D ui) 53 | { 54 | HideRaycastVisualizer(); 55 | return; 56 | } 57 | 58 | raycastVisualizer.Visible = true; 59 | hoveredUi = ui; 60 | 61 | var point = raycastCursor.GetCollisionPoint(); 62 | 63 | ui.HandleSynteticMouseMotion(point); 64 | } 65 | 66 | private void HandleButtonPress(string name) 67 | { 68 | if (name == "trigger_click") 69 | { 70 | if (hoveredUi != null) 71 | { 72 | HandleUIClick(); 73 | } 74 | } 75 | } 76 | 77 | private void HandleUIClick() 78 | { 79 | var point = raycastCursor.GetCollisionPoint(); 80 | 81 | hoveredUi.HandleSynteticMouseClick(point, true); 82 | hoveredUi.HandleSynteticMouseClick(point, false); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Player/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://d0gifc85g2m56"] 2 | 3 | [ext_resource type="Script" path="res://Player/Hand.cs" id="1_xs8um"] 4 | 5 | [sub_resource type="CylinderMesh" id="CylinderMesh_15nf6"] 6 | top_radius = 0.0 7 | bottom_radius = 0.01 8 | 9 | [node name="Player" type="XROrigin3D"] 10 | 11 | [node name="XRCamera3D" type="XRCamera3D" parent="."] 12 | 13 | [node name="Left" type="XRController3D" parent="." node_paths=PackedStringArray("raycastCursor", "raycastVisualizer")] 14 | tracker = &"left_hand" 15 | script = ExtResource("1_xs8um") 16 | raycastCursor = NodePath("RayCast3D") 17 | raycastVisualizer = NodePath("MeshInstance3D") 18 | 19 | [node name="RayCast3D" type="RayCast3D" parent="Left"] 20 | transform = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0) 21 | target_position = Vector3(0, -10, 0) 22 | collide_with_areas = true 23 | 24 | [node name="MeshInstance3D" type="MeshInstance3D" parent="Left"] 25 | transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -1) 26 | mesh = SubResource("CylinderMesh_15nf6") 27 | 28 | [node name="CSGSphere3D" type="CSGSphere3D" parent="Left"] 29 | radius = 0.0472235 30 | 31 | [node name="Right" type="XRController3D" parent="." node_paths=PackedStringArray("raycastCursor", "raycastVisualizer")] 32 | tracker = &"right_hand" 33 | script = ExtResource("1_xs8um") 34 | raycastCursor = NodePath("RayCast3D") 35 | raycastVisualizer = NodePath("MeshInstance3D") 36 | 37 | [node name="RayCast3D" type="RayCast3D" parent="Right"] 38 | transform = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0) 39 | target_position = Vector3(0, -10, 0) 40 | collide_with_areas = true 41 | 42 | [node name="MeshInstance3D" type="MeshInstance3D" parent="Right"] 43 | transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -1) 44 | mesh = SubResource("CylinderMesh_15nf6") 45 | 46 | [node name="CSGSphere3D" type="CSGSphere3D" parent="Right"] 47 | radius = 0.0472235 48 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://bwdpu05wxjipo"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://d0gifc85g2m56" path="res://Player/Player.tscn" id="1_mlqki"] 4 | [ext_resource type="PackedScene" uid="uid://bqq3lrdx6uy6n" path="res://3DUI.tscn" id="2_t18ui"] 5 | 6 | [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_mr74m"] 7 | 8 | [sub_resource type="Sky" id="Sky_uchpi"] 9 | sky_material = SubResource("ProceduralSkyMaterial_mr74m") 10 | 11 | [sub_resource type="Environment" id="Environment_gbcny"] 12 | background_mode = 2 13 | sky = SubResource("Sky_uchpi") 14 | 15 | [node name="main" type="Node3D"] 16 | 17 | [node name="CSGBox3D" type="CSGBox3D" parent="."] 18 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) 19 | size = Vector3(10, 1, 10) 20 | 21 | [node name="Player" parent="." instance=ExtResource("1_mlqki")] 22 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) 23 | 24 | [node name="3DUI" parent="." node_paths=PackedStringArray("subViewport") instance=ExtResource("2_t18ui")] 25 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -2) 26 | subViewport = NodePath("SubViewport") 27 | 28 | [node name="SubViewport" type="SubViewport" parent="3DUI"] 29 | size = Vector2i(1024, 1024) 30 | 31 | [node name="Control" type="Control" parent="3DUI/SubViewport"] 32 | layout_mode = 3 33 | anchors_preset = 8 34 | anchor_left = 0.5 35 | anchor_top = 0.5 36 | anchor_right = 0.5 37 | anchor_bottom = 0.5 38 | offset_left = -512.0 39 | offset_top = -512.0 40 | offset_right = 512.0 41 | offset_bottom = 512.0 42 | grow_horizontal = 2 43 | grow_vertical = 2 44 | 45 | [node name="Button" type="Button" parent="3DUI/SubViewport/Control"] 46 | layout_mode = 1 47 | anchors_preset = 8 48 | anchor_left = 0.5 49 | anchor_top = 0.5 50 | anchor_right = 0.5 51 | anchor_bottom = 0.5 52 | offset_left = -59.0 53 | offset_top = -61.0 54 | offset_right = 61.0 55 | offset_bottom = 59.0 56 | grow_horizontal = 2 57 | grow_vertical = 2 58 | text = "1" 59 | 60 | [node name="3DUI2" parent="." node_paths=PackedStringArray("subViewport") instance=ExtResource("2_t18ui")] 61 | transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1, 2) 62 | subViewport = NodePath("SubViewport") 63 | 64 | [node name="SubViewport" type="SubViewport" parent="3DUI2"] 65 | size = Vector2i(1024, 1024) 66 | 67 | [node name="Control2" type="Control" parent="3DUI2/SubViewport"] 68 | layout_mode = 3 69 | anchors_preset = 8 70 | anchor_left = 0.5 71 | anchor_top = 0.5 72 | anchor_right = 0.5 73 | anchor_bottom = 0.5 74 | offset_left = -512.0 75 | offset_top = -512.0 76 | offset_right = 512.0 77 | offset_bottom = 512.0 78 | grow_horizontal = 2 79 | grow_vertical = 2 80 | 81 | [node name="Button" type="Button" parent="3DUI2/SubViewport/Control2"] 82 | layout_mode = 1 83 | anchors_preset = 8 84 | anchor_left = 0.5 85 | anchor_top = 0.5 86 | anchor_right = 0.5 87 | anchor_bottom = 0.5 88 | offset_left = -59.0 89 | offset_top = -61.0 90 | offset_right = 61.0 91 | offset_bottom = 59.0 92 | grow_horizontal = 2 93 | grow_vertical = 2 94 | text = "2" 95 | 96 | [node name="3DUI3" parent="." node_paths=PackedStringArray("subViewport") instance=ExtResource("2_t18ui")] 97 | transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2, 1, 0) 98 | subViewport = NodePath("SubViewport") 99 | 100 | [node name="SubViewport" type="SubViewport" parent="3DUI3"] 101 | size = Vector2i(1024, 1024) 102 | 103 | [node name="Control3" type="Control" parent="3DUI3/SubViewport"] 104 | layout_mode = 3 105 | anchors_preset = 8 106 | anchor_left = 0.5 107 | anchor_top = 0.5 108 | anchor_right = 0.5 109 | anchor_bottom = 0.5 110 | offset_left = -512.0 111 | offset_top = -512.0 112 | offset_right = 512.0 113 | offset_bottom = 512.0 114 | grow_horizontal = 2 115 | grow_vertical = 2 116 | 117 | [node name="Button" type="Button" parent="3DUI3/SubViewport/Control3"] 118 | layout_mode = 1 119 | anchors_preset = 8 120 | anchor_left = 0.5 121 | anchor_top = 0.5 122 | anchor_right = 0.5 123 | anchor_bottom = 0.5 124 | offset_left = -59.0 125 | offset_top = -61.0 126 | offset_right = 61.0 127 | offset_bottom = 59.0 128 | grow_horizontal = 2 129 | grow_vertical = 2 130 | text = "3" 131 | 132 | [node name="3DUI4" parent="." node_paths=PackedStringArray("subViewport") instance=ExtResource("2_t18ui")] 133 | transform = Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 2, 1, 0) 134 | subViewport = NodePath("SubViewport") 135 | 136 | [node name="SubViewport" type="SubViewport" parent="3DUI4"] 137 | size = Vector2i(1024, 1024) 138 | 139 | [node name="Control4" type="Control" parent="3DUI4/SubViewport"] 140 | layout_mode = 3 141 | anchors_preset = 8 142 | anchor_left = 0.5 143 | anchor_top = 0.5 144 | anchor_right = 0.5 145 | anchor_bottom = 0.5 146 | offset_left = -512.0 147 | offset_top = -512.0 148 | offset_right = 512.0 149 | offset_bottom = 512.0 150 | grow_horizontal = 2 151 | grow_vertical = 2 152 | 153 | [node name="Button" type="Button" parent="3DUI4/SubViewport/Control4"] 154 | layout_mode = 1 155 | anchors_preset = 8 156 | anchor_left = 0.5 157 | anchor_top = 0.5 158 | anchor_right = 0.5 159 | anchor_bottom = 0.5 160 | offset_left = -59.0 161 | offset_top = -61.0 162 | offset_right = 61.0 163 | offset_bottom = 59.0 164 | grow_horizontal = 2 165 | grow_vertical = 2 166 | text = "4" 167 | 168 | [node name="WorldEnvironment" type="WorldEnvironment" parent="."] 169 | environment = SubResource("Environment_gbcny") 170 | -------------------------------------------------------------------------------- /UI3D.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | 3 | public partial class UI3D : Node3D 4 | { 5 | [Export] 6 | public SubViewport subViewport; 7 | 8 | [Export] 9 | public MeshInstance3D quad; 10 | 11 | [Export] 12 | public Area3D area; 13 | 14 | [Export] 15 | public CollisionShape3D shape; 16 | 17 | private Vector2 quadSize; 18 | private bool isMouseHeld = false; 19 | private bool isMouseInside = false; 20 | private Vector3? lastMousePosition3D; 21 | private Vector2 lastMousePosition2D = Vector2.Zero; 22 | 23 | public override void _Ready() 24 | { 25 | area.MouseEntered += MouseEnteredArea; 26 | 27 | CalculateSizes(); 28 | } 29 | 30 | private void CalculateSizes() 31 | { 32 | var mesh = (QuadMesh)quad.Mesh; 33 | 34 | var material = new StandardMaterial3D 35 | { 36 | AlbedoTexture = subViewport.GetTexture(), 37 | CullMode = BaseMaterial3D.CullModeEnum.Disabled 38 | }; 39 | 40 | mesh.Material = material; 41 | 42 | mesh.Size = new Vector2(subViewport.Size.X / 1024f, subViewport.Size.Y / 1024f); 43 | 44 | (shape.Shape as BoxShape3D).Size = new Vector3(mesh.Size.X, mesh.Size.Y, .1f); 45 | } 46 | 47 | public override void _ExitTree() 48 | { 49 | area.MouseEntered -= MouseEnteredArea; 50 | } 51 | 52 | private void MouseEnteredArea() 53 | { 54 | isMouseInside = true; 55 | } 56 | 57 | public override void _UnhandledInput(InputEvent @event) 58 | { 59 | bool isMouseEvent = false; 60 | 61 | if (@event is InputEventMouse || @event is InputEventMouseButton || @event is InputEventMouseMotion) 62 | { 63 | isMouseEvent = true; 64 | } 65 | 66 | if (isMouseEvent && (isMouseInside || isMouseHeld)) 67 | { 68 | HandleMouse((InputEventMouse)@event); 69 | } 70 | else if (!isMouseEvent) 71 | { 72 | subViewport.PushInput(@event); 73 | } 74 | } 75 | 76 | private void HandleMouse(InputEventMouse @event) 77 | { 78 | isMouseInside = FindMouse(@event.GlobalPosition, out Vector3 position); 79 | 80 | HandleMouseInPosition(@event, position); 81 | } 82 | 83 | public void HandleSynteticMouseMotion(Vector3 position) 84 | { 85 | var ev = new InputEventMouseMotion(); 86 | 87 | isMouseInside = true; 88 | 89 | HandleMouseInPosition(ev, position); 90 | } 91 | 92 | public void HandleSynteticMouseClick(Vector3 position, bool pressed) 93 | { 94 | var ev = new InputEventMouseButton() { ButtonIndex = MouseButton.Left, Pressed = pressed }; 95 | 96 | isMouseInside = true; 97 | 98 | HandleMouseInPosition(ev, position); 99 | } 100 | 101 | private void HandleMouseInPosition(InputEventMouse @event, Vector3 position) 102 | { 103 | quadSize = (quad.Mesh as QuadMesh).Size; 104 | 105 | if (@event is InputEventMouseButton) 106 | { 107 | isMouseHeld = @event.IsPressed(); 108 | } 109 | 110 | Vector3 mousePosition3D; 111 | 112 | if (isMouseInside) 113 | { 114 | mousePosition3D = area.GlobalTransform.AffineInverse() * position; 115 | lastMousePosition3D = mousePosition3D; 116 | } 117 | else 118 | { 119 | if (lastMousePosition3D != null) 120 | { 121 | mousePosition3D = (Vector3)lastMousePosition3D; 122 | } 123 | else 124 | { 125 | mousePosition3D = Vector3.Zero; 126 | } 127 | } 128 | 129 | var mousePosition2D = new Vector2(mousePosition3D.X, -mousePosition3D.Y); 130 | 131 | mousePosition2D.X += quadSize.X / 2; 132 | mousePosition2D.Y += quadSize.Y / 2; 133 | 134 | mousePosition2D.X /= quadSize.X; 135 | mousePosition2D.Y /= quadSize.Y; 136 | 137 | mousePosition2D.X *= subViewport.Size.X; 138 | mousePosition2D.Y *= subViewport.Size.Y; 139 | 140 | @event.Position = mousePosition2D; 141 | @event.GlobalPosition = mousePosition2D; 142 | 143 | if (@event is InputEventMouseMotion) 144 | { 145 | (@event as InputEventMouseMotion).Relative = mousePosition2D - lastMousePosition2D; 146 | } 147 | 148 | lastMousePosition2D = mousePosition2D; 149 | 150 | subViewport.PushInput(@event); 151 | } 152 | 153 | private bool FindMouse(Vector2 globalPosition, out Vector3 position) 154 | { 155 | var camera = GetViewport().GetCamera3D(); 156 | 157 | var from = camera.ProjectRayOrigin(globalPosition); 158 | var dist = FindFurtherDistanceTo(camera.Transform.Origin); 159 | var to = from + camera.ProjectRayNormal(globalPosition) * dist; 160 | 161 | var parameters = new PhysicsRayQueryParameters3D() { From = from, To = to, CollideWithAreas = true, CollisionMask = area.CollisionLayer, CollideWithBodies = false }; 162 | 163 | var result = GetWorld3D().DirectSpaceState.IntersectRay(parameters); 164 | 165 | position = Vector3.Zero; 166 | 167 | if (result.Count > 0) 168 | { 169 | position = (Vector3)result["position"]; 170 | 171 | return true; 172 | } 173 | else 174 | { 175 | return false; 176 | } 177 | } 178 | 179 | private float FindFurtherDistanceTo(Vector3 origin) 180 | { 181 | Vector3[] edges = new Vector3[] { 182 | area.ToGlobal(new Vector3(quadSize.X / 2, quadSize.Y / 2, 0)), 183 | area.ToGlobal(new Vector3(quadSize.X / 2, -quadSize.Y / 2, 0)), 184 | area.ToGlobal(new Vector3(-quadSize.X / 2, quadSize.Y / 2, 0)), 185 | area.ToGlobal(new Vector3(-quadSize.X / 2, -quadSize.Y / 2, 0)), 186 | }; 187 | 188 | float farDistance = 0; 189 | 190 | foreach (var edge in edges) 191 | { 192 | var tempDistance = origin.DistanceTo(edge); 193 | 194 | if (tempDistance > farDistance) 195 | { 196 | farDistance = tempDistance; 197 | } 198 | } 199 | 200 | return farDistance; 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /openxr_action_map.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="OpenXRActionMap" load_steps=195 format=3 uid="uid://cd2ql48s13ag7"] 2 | 3 | [sub_resource type="OpenXRAction" id="OpenXRAction_55duo"] 4 | resource_name = "trigger" 5 | localized_name = "Trigger" 6 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 7 | 8 | [sub_resource type="OpenXRAction" id="OpenXRAction_jnvwu"] 9 | resource_name = "trigger_click" 10 | localized_name = "Trigger click" 11 | action_type = 0 12 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 13 | 14 | [sub_resource type="OpenXRAction" id="OpenXRAction_1saiv"] 15 | resource_name = "trigger_touch" 16 | localized_name = "Trigger touching" 17 | action_type = 0 18 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 19 | 20 | [sub_resource type="OpenXRAction" id="OpenXRAction_fapth"] 21 | resource_name = "grip" 22 | localized_name = "Grip" 23 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 24 | 25 | [sub_resource type="OpenXRAction" id="OpenXRAction_xrwu1"] 26 | resource_name = "grip_click" 27 | localized_name = "Grip click" 28 | action_type = 0 29 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 30 | 31 | [sub_resource type="OpenXRAction" id="OpenXRAction_arvfm"] 32 | resource_name = "grip_touch" 33 | localized_name = "Grip touching" 34 | action_type = 0 35 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 36 | 37 | [sub_resource type="OpenXRAction" id="OpenXRAction_6u0s6"] 38 | resource_name = "primary" 39 | localized_name = "Primary joystick/thumbstick/trackpad" 40 | action_type = 2 41 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 42 | 43 | [sub_resource type="OpenXRAction" id="OpenXRAction_l6pre"] 44 | resource_name = "primary_click" 45 | localized_name = "Primary joystick/thumbstick/trackpad click" 46 | action_type = 0 47 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 48 | 49 | [sub_resource type="OpenXRAction" id="OpenXRAction_6soob"] 50 | resource_name = "primary_touch" 51 | localized_name = "Primary joystick/thumbstick/trackpad touching" 52 | action_type = 0 53 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 54 | 55 | [sub_resource type="OpenXRAction" id="OpenXRAction_5uf3q"] 56 | resource_name = "secondary" 57 | localized_name = "Secondary joystick/thumbstick/trackpad" 58 | action_type = 2 59 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 60 | 61 | [sub_resource type="OpenXRAction" id="OpenXRAction_xfm72"] 62 | resource_name = "secondary_click" 63 | localized_name = "Secondary joystick/thumbstick/trackpad click" 64 | action_type = 0 65 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 66 | 67 | [sub_resource type="OpenXRAction" id="OpenXRAction_cuv1q"] 68 | resource_name = "secondary_touch" 69 | localized_name = "Secondary joystick/thumbstick/trackpad touching" 70 | action_type = 0 71 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 72 | 73 | [sub_resource type="OpenXRAction" id="OpenXRAction_u7std"] 74 | resource_name = "menu_button" 75 | localized_name = "Menu button" 76 | action_type = 0 77 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 78 | 79 | [sub_resource type="OpenXRAction" id="OpenXRAction_1wsno"] 80 | resource_name = "select_button" 81 | localized_name = "Select button" 82 | action_type = 0 83 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 84 | 85 | [sub_resource type="OpenXRAction" id="OpenXRAction_qe7om"] 86 | resource_name = "ax_button" 87 | localized_name = "A/X button" 88 | action_type = 0 89 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 90 | 91 | [sub_resource type="OpenXRAction" id="OpenXRAction_ijhea"] 92 | resource_name = "ax_touch" 93 | localized_name = "A/X touching" 94 | action_type = 0 95 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 96 | 97 | [sub_resource type="OpenXRAction" id="OpenXRAction_mhncd"] 98 | resource_name = "by_button" 99 | localized_name = "B/Y button" 100 | action_type = 0 101 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 102 | 103 | [sub_resource type="OpenXRAction" id="OpenXRAction_6rybi"] 104 | resource_name = "by_touch" 105 | localized_name = "B/Y touching" 106 | action_type = 0 107 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 108 | 109 | [sub_resource type="OpenXRAction" id="OpenXRAction_7bqr1"] 110 | resource_name = "default_pose" 111 | localized_name = "Default pose" 112 | action_type = 3 113 | 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") 114 | 115 | [sub_resource type="OpenXRAction" id="OpenXRAction_pxc5c"] 116 | resource_name = "aim_pose" 117 | localized_name = "Aim pose" 118 | action_type = 3 119 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 120 | 121 | [sub_resource type="OpenXRAction" id="OpenXRAction_dsu2j"] 122 | resource_name = "grip_pose" 123 | localized_name = "Grip pose" 124 | action_type = 3 125 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 126 | 127 | [sub_resource type="OpenXRAction" id="OpenXRAction_1d1o3"] 128 | resource_name = "palm_pose" 129 | localized_name = "Palm pose" 130 | action_type = 3 131 | toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right") 132 | 133 | [sub_resource type="OpenXRAction" id="OpenXRAction_87dm3"] 134 | resource_name = "haptic" 135 | localized_name = "Haptic" 136 | action_type = 4 137 | 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") 138 | 139 | [sub_resource type="OpenXRActionSet" id="OpenXRActionSet_kotkd"] 140 | resource_name = "godot" 141 | localized_name = "Godot action set" 142 | actions = [SubResource("OpenXRAction_55duo"), SubResource("OpenXRAction_jnvwu"), SubResource("OpenXRAction_1saiv"), SubResource("OpenXRAction_fapth"), SubResource("OpenXRAction_xrwu1"), SubResource("OpenXRAction_arvfm"), SubResource("OpenXRAction_6u0s6"), SubResource("OpenXRAction_l6pre"), SubResource("OpenXRAction_6soob"), SubResource("OpenXRAction_5uf3q"), SubResource("OpenXRAction_xfm72"), SubResource("OpenXRAction_cuv1q"), SubResource("OpenXRAction_u7std"), SubResource("OpenXRAction_1wsno"), SubResource("OpenXRAction_qe7om"), SubResource("OpenXRAction_ijhea"), SubResource("OpenXRAction_mhncd"), SubResource("OpenXRAction_6rybi"), SubResource("OpenXRAction_7bqr1"), SubResource("OpenXRAction_pxc5c"), SubResource("OpenXRAction_dsu2j"), SubResource("OpenXRAction_1d1o3"), SubResource("OpenXRAction_87dm3")] 143 | 144 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_oeqi7"] 145 | action = SubResource("OpenXRAction_7bqr1") 146 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 147 | 148 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_iamh1"] 149 | action = SubResource("OpenXRAction_pxc5c") 150 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 151 | 152 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bej6k"] 153 | action = SubResource("OpenXRAction_dsu2j") 154 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 155 | 156 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ri3lx"] 157 | action = SubResource("OpenXRAction_1d1o3") 158 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 159 | 160 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qv7bb"] 161 | action = SubResource("OpenXRAction_u7std") 162 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") 163 | 164 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6w7q6"] 165 | action = SubResource("OpenXRAction_1wsno") 166 | paths = PackedStringArray("/user/hand/left/input/select/click", "/user/hand/right/input/select/click") 167 | 168 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tqlaw"] 169 | action = SubResource("OpenXRAction_87dm3") 170 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 171 | 172 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_cr1r0"] 173 | interaction_profile_path = "/interaction_profiles/khr/simple_controller" 174 | bindings = [SubResource("OpenXRIPBinding_oeqi7"), SubResource("OpenXRIPBinding_iamh1"), SubResource("OpenXRIPBinding_bej6k"), SubResource("OpenXRIPBinding_ri3lx"), SubResource("OpenXRIPBinding_qv7bb"), SubResource("OpenXRIPBinding_6w7q6"), SubResource("OpenXRIPBinding_tqlaw")] 175 | 176 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c2tpp"] 177 | action = SubResource("OpenXRAction_7bqr1") 178 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 179 | 180 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ackn2"] 181 | action = SubResource("OpenXRAction_pxc5c") 182 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 183 | 184 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sd1o6"] 185 | action = SubResource("OpenXRAction_dsu2j") 186 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 187 | 188 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8o0q6"] 189 | action = SubResource("OpenXRAction_1d1o3") 190 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 191 | 192 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mto7t"] 193 | action = SubResource("OpenXRAction_u7std") 194 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") 195 | 196 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_br78p"] 197 | action = SubResource("OpenXRAction_1wsno") 198 | paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") 199 | 200 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_53cpx"] 201 | action = SubResource("OpenXRAction_55duo") 202 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 203 | 204 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q2838"] 205 | action = SubResource("OpenXRAction_jnvwu") 206 | paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") 207 | 208 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ytb1g"] 209 | action = SubResource("OpenXRAction_fapth") 210 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 211 | 212 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gmngx"] 213 | action = SubResource("OpenXRAction_xrwu1") 214 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 215 | 216 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hmrxc"] 217 | action = SubResource("OpenXRAction_6u0s6") 218 | paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") 219 | 220 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6vwgn"] 221 | action = SubResource("OpenXRAction_l6pre") 222 | paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") 223 | 224 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xqxtn"] 225 | action = SubResource("OpenXRAction_6soob") 226 | paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") 227 | 228 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_b5w1v"] 229 | action = SubResource("OpenXRAction_87dm3") 230 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 231 | 232 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_jno2c"] 233 | interaction_profile_path = "/interaction_profiles/htc/vive_controller" 234 | bindings = [SubResource("OpenXRIPBinding_c2tpp"), SubResource("OpenXRIPBinding_ackn2"), SubResource("OpenXRIPBinding_sd1o6"), SubResource("OpenXRIPBinding_8o0q6"), SubResource("OpenXRIPBinding_mto7t"), SubResource("OpenXRIPBinding_br78p"), SubResource("OpenXRIPBinding_53cpx"), SubResource("OpenXRIPBinding_q2838"), SubResource("OpenXRIPBinding_ytb1g"), SubResource("OpenXRIPBinding_gmngx"), SubResource("OpenXRIPBinding_hmrxc"), SubResource("OpenXRIPBinding_6vwgn"), SubResource("OpenXRIPBinding_xqxtn"), SubResource("OpenXRIPBinding_b5w1v")] 235 | 236 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_u1xot"] 237 | action = SubResource("OpenXRAction_7bqr1") 238 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 239 | 240 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_eixfh"] 241 | action = SubResource("OpenXRAction_pxc5c") 242 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 243 | 244 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_trftx"] 245 | action = SubResource("OpenXRAction_dsu2j") 246 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 247 | 248 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lilno"] 249 | action = SubResource("OpenXRAction_1d1o3") 250 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 251 | 252 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_thawq"] 253 | action = SubResource("OpenXRAction_u7std") 254 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") 255 | 256 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_1d3t1"] 257 | action = SubResource("OpenXRAction_55duo") 258 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 259 | 260 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f4knq"] 261 | action = SubResource("OpenXRAction_jnvwu") 262 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 263 | 264 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0s303"] 265 | action = SubResource("OpenXRAction_fapth") 266 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 267 | 268 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_suwtd"] 269 | action = SubResource("OpenXRAction_xrwu1") 270 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 271 | 272 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f53aa"] 273 | action = SubResource("OpenXRAction_6u0s6") 274 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 275 | 276 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_wktm2"] 277 | action = SubResource("OpenXRAction_l6pre") 278 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 279 | 280 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_j6ife"] 281 | action = SubResource("OpenXRAction_5uf3q") 282 | paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") 283 | 284 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sy3df"] 285 | action = SubResource("OpenXRAction_xfm72") 286 | paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") 287 | 288 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2olvh"] 289 | action = SubResource("OpenXRAction_cuv1q") 290 | paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") 291 | 292 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ogtiu"] 293 | action = SubResource("OpenXRAction_87dm3") 294 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 295 | 296 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_vqfsn"] 297 | interaction_profile_path = "/interaction_profiles/microsoft/motion_controller" 298 | bindings = [SubResource("OpenXRIPBinding_u1xot"), SubResource("OpenXRIPBinding_eixfh"), SubResource("OpenXRIPBinding_trftx"), SubResource("OpenXRIPBinding_lilno"), SubResource("OpenXRIPBinding_thawq"), SubResource("OpenXRIPBinding_1d3t1"), SubResource("OpenXRIPBinding_f4knq"), SubResource("OpenXRIPBinding_0s303"), SubResource("OpenXRIPBinding_suwtd"), SubResource("OpenXRIPBinding_f53aa"), SubResource("OpenXRIPBinding_wktm2"), SubResource("OpenXRIPBinding_j6ife"), SubResource("OpenXRIPBinding_sy3df"), SubResource("OpenXRIPBinding_2olvh"), SubResource("OpenXRIPBinding_ogtiu")] 299 | 300 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_e51nl"] 301 | action = SubResource("OpenXRAction_7bqr1") 302 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 303 | 304 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_d8qpq"] 305 | action = SubResource("OpenXRAction_pxc5c") 306 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 307 | 308 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qyij3"] 309 | action = SubResource("OpenXRAction_dsu2j") 310 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 311 | 312 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_onuh2"] 313 | action = SubResource("OpenXRAction_1d1o3") 314 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 315 | 316 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5ke0n"] 317 | action = SubResource("OpenXRAction_u7std") 318 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/system/click") 319 | 320 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_hff1e"] 321 | action = SubResource("OpenXRAction_qe7om") 322 | paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") 323 | 324 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_lfmwr"] 325 | action = SubResource("OpenXRAction_ijhea") 326 | paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") 327 | 328 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_36lx8"] 329 | action = SubResource("OpenXRAction_mhncd") 330 | paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") 331 | 332 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qknea"] 333 | action = SubResource("OpenXRAction_6rybi") 334 | paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") 335 | 336 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_b41hm"] 337 | action = SubResource("OpenXRAction_55duo") 338 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 339 | 340 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3we4y"] 341 | action = SubResource("OpenXRAction_jnvwu") 342 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 343 | 344 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v188b"] 345 | action = SubResource("OpenXRAction_1saiv") 346 | paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") 347 | 348 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6a2oq"] 349 | action = SubResource("OpenXRAction_fapth") 350 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 351 | 352 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_sgvca"] 353 | action = SubResource("OpenXRAction_xrwu1") 354 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 355 | 356 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5f77b"] 357 | action = SubResource("OpenXRAction_6u0s6") 358 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 359 | 360 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bepqe"] 361 | action = SubResource("OpenXRAction_l6pre") 362 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 363 | 364 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xk0rj"] 365 | action = SubResource("OpenXRAction_6soob") 366 | paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") 367 | 368 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ine6x"] 369 | action = SubResource("OpenXRAction_87dm3") 370 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 371 | 372 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_7x666"] 373 | interaction_profile_path = "/interaction_profiles/oculus/touch_controller" 374 | bindings = [SubResource("OpenXRIPBinding_e51nl"), SubResource("OpenXRIPBinding_d8qpq"), SubResource("OpenXRIPBinding_qyij3"), SubResource("OpenXRIPBinding_onuh2"), SubResource("OpenXRIPBinding_5ke0n"), SubResource("OpenXRIPBinding_hff1e"), SubResource("OpenXRIPBinding_lfmwr"), SubResource("OpenXRIPBinding_36lx8"), SubResource("OpenXRIPBinding_qknea"), SubResource("OpenXRIPBinding_b41hm"), SubResource("OpenXRIPBinding_3we4y"), SubResource("OpenXRIPBinding_v188b"), SubResource("OpenXRIPBinding_6a2oq"), SubResource("OpenXRIPBinding_sgvca"), SubResource("OpenXRIPBinding_5f77b"), SubResource("OpenXRIPBinding_bepqe"), SubResource("OpenXRIPBinding_xk0rj"), SubResource("OpenXRIPBinding_ine6x")] 375 | 376 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_frooh"] 377 | action = SubResource("OpenXRAction_7bqr1") 378 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 379 | 380 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_e6tou"] 381 | action = SubResource("OpenXRAction_pxc5c") 382 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 383 | 384 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_s5kqq"] 385 | action = SubResource("OpenXRAction_dsu2j") 386 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 387 | 388 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mu076"] 389 | action = SubResource("OpenXRAction_1d1o3") 390 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 391 | 392 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3mv8m"] 393 | action = SubResource("OpenXRAction_1wsno") 394 | paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") 395 | 396 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_oviwv"] 397 | action = SubResource("OpenXRAction_u7std") 398 | paths = PackedStringArray("/user/hand/left/input/back/click", "/user/hand/right/input/back/click") 399 | 400 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_h1f2f"] 401 | action = SubResource("OpenXRAction_qe7om") 402 | paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") 403 | 404 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_8q7si"] 405 | action = SubResource("OpenXRAction_ijhea") 406 | paths = PackedStringArray("/user/hand/left/input/x/touch", "/user/hand/right/input/a/touch") 407 | 408 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_themp"] 409 | action = SubResource("OpenXRAction_mhncd") 410 | paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") 411 | 412 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ufof8"] 413 | action = SubResource("OpenXRAction_6rybi") 414 | paths = PackedStringArray("/user/hand/left/input/y/touch", "/user/hand/right/input/b/touch") 415 | 416 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tlal3"] 417 | action = SubResource("OpenXRAction_55duo") 418 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 419 | 420 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3f7yd"] 421 | action = SubResource("OpenXRAction_jnvwu") 422 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 423 | 424 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_n8qpf"] 425 | action = SubResource("OpenXRAction_1saiv") 426 | paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") 427 | 428 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rgj2u"] 429 | action = SubResource("OpenXRAction_fapth") 430 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 431 | 432 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_r685s"] 433 | action = SubResource("OpenXRAction_xrwu1") 434 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 435 | 436 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5mn6o"] 437 | action = SubResource("OpenXRAction_6u0s6") 438 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 439 | 440 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ifynk"] 441 | action = SubResource("OpenXRAction_l6pre") 442 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 443 | 444 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ui5vu"] 445 | action = SubResource("OpenXRAction_6soob") 446 | paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") 447 | 448 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bt1jn"] 449 | action = SubResource("OpenXRAction_87dm3") 450 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 451 | 452 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_cwq0f"] 453 | interaction_profile_path = "/interaction_profiles/pico/neo3_controller" 454 | bindings = [SubResource("OpenXRIPBinding_frooh"), SubResource("OpenXRIPBinding_e6tou"), SubResource("OpenXRIPBinding_s5kqq"), SubResource("OpenXRIPBinding_mu076"), SubResource("OpenXRIPBinding_3mv8m"), SubResource("OpenXRIPBinding_oviwv"), SubResource("OpenXRIPBinding_h1f2f"), SubResource("OpenXRIPBinding_8q7si"), SubResource("OpenXRIPBinding_themp"), SubResource("OpenXRIPBinding_ufof8"), SubResource("OpenXRIPBinding_tlal3"), SubResource("OpenXRIPBinding_3f7yd"), SubResource("OpenXRIPBinding_n8qpf"), SubResource("OpenXRIPBinding_rgj2u"), SubResource("OpenXRIPBinding_r685s"), SubResource("OpenXRIPBinding_5mn6o"), SubResource("OpenXRIPBinding_ifynk"), SubResource("OpenXRIPBinding_ui5vu"), SubResource("OpenXRIPBinding_bt1jn")] 455 | 456 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_g0tka"] 457 | action = SubResource("OpenXRAction_7bqr1") 458 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 459 | 460 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kpecv"] 461 | action = SubResource("OpenXRAction_pxc5c") 462 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 463 | 464 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6f4jl"] 465 | action = SubResource("OpenXRAction_dsu2j") 466 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 467 | 468 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y1ouc"] 469 | action = SubResource("OpenXRAction_1d1o3") 470 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 471 | 472 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k1t68"] 473 | action = SubResource("OpenXRAction_u7std") 474 | paths = PackedStringArray("/user/hand/left/input/system/click", "/user/hand/right/input/system/click") 475 | 476 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_36pkj"] 477 | action = SubResource("OpenXRAction_qe7om") 478 | paths = PackedStringArray("/user/hand/left/input/a/click", "/user/hand/right/input/a/click") 479 | 480 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_x2qxd"] 481 | action = SubResource("OpenXRAction_ijhea") 482 | paths = PackedStringArray("/user/hand/left/input/a/touch", "/user/hand/right/input/a/touch") 483 | 484 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bntpd"] 485 | action = SubResource("OpenXRAction_mhncd") 486 | paths = PackedStringArray("/user/hand/left/input/b/click", "/user/hand/right/input/b/click") 487 | 488 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jhmxn"] 489 | action = SubResource("OpenXRAction_6rybi") 490 | paths = PackedStringArray("/user/hand/left/input/b/touch", "/user/hand/right/input/b/touch") 491 | 492 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_q5sml"] 493 | action = SubResource("OpenXRAction_55duo") 494 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 495 | 496 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jff28"] 497 | action = SubResource("OpenXRAction_jnvwu") 498 | paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") 499 | 500 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_auyr4"] 501 | action = SubResource("OpenXRAction_1saiv") 502 | paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") 503 | 504 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mso1o"] 505 | action = SubResource("OpenXRAction_fapth") 506 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 507 | 508 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_okjko"] 509 | action = SubResource("OpenXRAction_xrwu1") 510 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 511 | 512 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rnpfh"] 513 | action = SubResource("OpenXRAction_6u0s6") 514 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 515 | 516 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_84ovo"] 517 | action = SubResource("OpenXRAction_l6pre") 518 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 519 | 520 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_krp2a"] 521 | action = SubResource("OpenXRAction_6soob") 522 | paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") 523 | 524 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_a0ioy"] 525 | action = SubResource("OpenXRAction_5uf3q") 526 | paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") 527 | 528 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_87k7k"] 529 | action = SubResource("OpenXRAction_xfm72") 530 | paths = PackedStringArray("/user/hand/left/input/trackpad/force", "/user/hand/right/input/trackpad/force") 531 | 532 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_08hic"] 533 | action = SubResource("OpenXRAction_cuv1q") 534 | paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") 535 | 536 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ylsb7"] 537 | action = SubResource("OpenXRAction_87dm3") 538 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 539 | 540 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_hl3my"] 541 | interaction_profile_path = "/interaction_profiles/valve/index_controller" 542 | bindings = [SubResource("OpenXRIPBinding_g0tka"), SubResource("OpenXRIPBinding_kpecv"), SubResource("OpenXRIPBinding_6f4jl"), SubResource("OpenXRIPBinding_y1ouc"), SubResource("OpenXRIPBinding_k1t68"), SubResource("OpenXRIPBinding_36pkj"), SubResource("OpenXRIPBinding_x2qxd"), SubResource("OpenXRIPBinding_bntpd"), SubResource("OpenXRIPBinding_jhmxn"), SubResource("OpenXRIPBinding_q5sml"), SubResource("OpenXRIPBinding_jff28"), SubResource("OpenXRIPBinding_auyr4"), SubResource("OpenXRIPBinding_mso1o"), SubResource("OpenXRIPBinding_okjko"), SubResource("OpenXRIPBinding_rnpfh"), SubResource("OpenXRIPBinding_84ovo"), SubResource("OpenXRIPBinding_krp2a"), SubResource("OpenXRIPBinding_a0ioy"), SubResource("OpenXRIPBinding_87k7k"), SubResource("OpenXRIPBinding_08hic"), SubResource("OpenXRIPBinding_ylsb7")] 543 | 544 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_a7vvt"] 545 | action = SubResource("OpenXRAction_7bqr1") 546 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 547 | 548 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_pvupb"] 549 | action = SubResource("OpenXRAction_pxc5c") 550 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 551 | 552 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_m8ikt"] 553 | action = SubResource("OpenXRAction_dsu2j") 554 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 555 | 556 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_iipm7"] 557 | action = SubResource("OpenXRAction_1d1o3") 558 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 559 | 560 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_babb3"] 561 | action = SubResource("OpenXRAction_u7std") 562 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") 563 | 564 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_k5wpk"] 565 | action = SubResource("OpenXRAction_qe7om") 566 | paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") 567 | 568 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ijmfd"] 569 | action = SubResource("OpenXRAction_mhncd") 570 | paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") 571 | 572 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_mc2ou"] 573 | action = SubResource("OpenXRAction_55duo") 574 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 575 | 576 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_07peu"] 577 | action = SubResource("OpenXRAction_jnvwu") 578 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 579 | 580 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_f54se"] 581 | action = SubResource("OpenXRAction_fapth") 582 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 583 | 584 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_n2fkb"] 585 | action = SubResource("OpenXRAction_xrwu1") 586 | paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value") 587 | 588 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dina5"] 589 | action = SubResource("OpenXRAction_6u0s6") 590 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 591 | 592 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_nwohl"] 593 | action = SubResource("OpenXRAction_l6pre") 594 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 595 | 596 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6vvam"] 597 | action = SubResource("OpenXRAction_87dm3") 598 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 599 | 600 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_3mxfg"] 601 | interaction_profile_path = "/interaction_profiles/hp/mixed_reality_controller" 602 | bindings = [SubResource("OpenXRIPBinding_a7vvt"), SubResource("OpenXRIPBinding_pvupb"), SubResource("OpenXRIPBinding_m8ikt"), SubResource("OpenXRIPBinding_iipm7"), SubResource("OpenXRIPBinding_babb3"), SubResource("OpenXRIPBinding_k5wpk"), SubResource("OpenXRIPBinding_ijmfd"), SubResource("OpenXRIPBinding_mc2ou"), SubResource("OpenXRIPBinding_07peu"), SubResource("OpenXRIPBinding_f54se"), SubResource("OpenXRIPBinding_n2fkb"), SubResource("OpenXRIPBinding_dina5"), SubResource("OpenXRIPBinding_nwohl"), SubResource("OpenXRIPBinding_6vvam")] 603 | 604 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dpfrg"] 605 | action = SubResource("OpenXRAction_7bqr1") 606 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 607 | 608 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y0vu7"] 609 | action = SubResource("OpenXRAction_pxc5c") 610 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 611 | 612 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jmmp4"] 613 | action = SubResource("OpenXRAction_dsu2j") 614 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 615 | 616 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_v3fw0"] 617 | action = SubResource("OpenXRAction_1d1o3") 618 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 619 | 620 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dfc5k"] 621 | action = SubResource("OpenXRAction_u7std") 622 | paths = PackedStringArray("/user/hand/left/input/menu/click", "/user/hand/right/input/menu/click") 623 | 624 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5f0ld"] 625 | action = SubResource("OpenXRAction_55duo") 626 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 627 | 628 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2cb3g"] 629 | action = SubResource("OpenXRAction_jnvwu") 630 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 631 | 632 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ugiub"] 633 | action = SubResource("OpenXRAction_fapth") 634 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 635 | 636 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4e4lx"] 637 | action = SubResource("OpenXRAction_xrwu1") 638 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 639 | 640 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_txvlg"] 641 | action = SubResource("OpenXRAction_6u0s6") 642 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 643 | 644 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_d6wa8"] 645 | action = SubResource("OpenXRAction_l6pre") 646 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 647 | 648 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_kweqv"] 649 | action = SubResource("OpenXRAction_5uf3q") 650 | paths = PackedStringArray("/user/hand/left/input/trackpad", "/user/hand/right/input/trackpad") 651 | 652 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2b7wk"] 653 | action = SubResource("OpenXRAction_xfm72") 654 | paths = PackedStringArray("/user/hand/left/input/trackpad/click", "/user/hand/right/input/trackpad/click") 655 | 656 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_uno8g"] 657 | action = SubResource("OpenXRAction_cuv1q") 658 | paths = PackedStringArray("/user/hand/left/input/trackpad/touch", "/user/hand/right/input/trackpad/touch") 659 | 660 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_h7h10"] 661 | action = SubResource("OpenXRAction_87dm3") 662 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 663 | 664 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_f70rd"] 665 | interaction_profile_path = "/interaction_profiles/samsung/odyssey_controller" 666 | bindings = [SubResource("OpenXRIPBinding_dpfrg"), SubResource("OpenXRIPBinding_y0vu7"), SubResource("OpenXRIPBinding_jmmp4"), SubResource("OpenXRIPBinding_v3fw0"), SubResource("OpenXRIPBinding_dfc5k"), SubResource("OpenXRIPBinding_5f0ld"), SubResource("OpenXRIPBinding_2cb3g"), SubResource("OpenXRIPBinding_ugiub"), SubResource("OpenXRIPBinding_4e4lx"), SubResource("OpenXRIPBinding_txvlg"), SubResource("OpenXRIPBinding_d6wa8"), SubResource("OpenXRIPBinding_kweqv"), SubResource("OpenXRIPBinding_2b7wk"), SubResource("OpenXRIPBinding_uno8g"), SubResource("OpenXRIPBinding_h7h10")] 667 | 668 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0n88j"] 669 | action = SubResource("OpenXRAction_7bqr1") 670 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 671 | 672 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ie2i8"] 673 | action = SubResource("OpenXRAction_pxc5c") 674 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 675 | 676 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_haa3o"] 677 | action = SubResource("OpenXRAction_dsu2j") 678 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 679 | 680 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gbcus"] 681 | action = SubResource("OpenXRAction_1d1o3") 682 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 683 | 684 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bvgno"] 685 | action = SubResource("OpenXRAction_u7std") 686 | paths = PackedStringArray("/user/hand/left/input/menu/click") 687 | 688 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jyqxm"] 689 | action = SubResource("OpenXRAction_1wsno") 690 | paths = PackedStringArray("/user/hand/left/input/system/click") 691 | 692 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_02nsk"] 693 | action = SubResource("OpenXRAction_qe7om") 694 | paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") 695 | 696 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7om03"] 697 | action = SubResource("OpenXRAction_mhncd") 698 | paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") 699 | 700 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ugewi"] 701 | action = SubResource("OpenXRAction_55duo") 702 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 703 | 704 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ywet6"] 705 | action = SubResource("OpenXRAction_jnvwu") 706 | paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") 707 | 708 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_xcp6e"] 709 | action = SubResource("OpenXRAction_fapth") 710 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 711 | 712 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_67ltt"] 713 | action = SubResource("OpenXRAction_xrwu1") 714 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 715 | 716 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_6k77f"] 717 | action = SubResource("OpenXRAction_6u0s6") 718 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 719 | 720 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_djjya"] 721 | action = SubResource("OpenXRAction_l6pre") 722 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 723 | 724 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_olwxq"] 725 | action = SubResource("OpenXRAction_6soob") 726 | paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") 727 | 728 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_m7rrm"] 729 | action = SubResource("OpenXRAction_87dm3") 730 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 731 | 732 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_x1emj"] 733 | interaction_profile_path = "/interaction_profiles/htc/vive_cosmos_controller" 734 | bindings = [SubResource("OpenXRIPBinding_0n88j"), SubResource("OpenXRIPBinding_ie2i8"), SubResource("OpenXRIPBinding_haa3o"), SubResource("OpenXRIPBinding_gbcus"), SubResource("OpenXRIPBinding_bvgno"), SubResource("OpenXRIPBinding_jyqxm"), SubResource("OpenXRIPBinding_02nsk"), SubResource("OpenXRIPBinding_7om03"), SubResource("OpenXRIPBinding_ugewi"), SubResource("OpenXRIPBinding_ywet6"), SubResource("OpenXRIPBinding_xcp6e"), SubResource("OpenXRIPBinding_67ltt"), SubResource("OpenXRIPBinding_6k77f"), SubResource("OpenXRIPBinding_djjya"), SubResource("OpenXRIPBinding_olwxq"), SubResource("OpenXRIPBinding_m7rrm")] 735 | 736 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_84ftb"] 737 | action = SubResource("OpenXRAction_7bqr1") 738 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 739 | 740 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_gxock"] 741 | action = SubResource("OpenXRAction_pxc5c") 742 | paths = PackedStringArray("/user/hand/left/input/aim/pose", "/user/hand/right/input/aim/pose") 743 | 744 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_qq0uv"] 745 | action = SubResource("OpenXRAction_dsu2j") 746 | paths = PackedStringArray("/user/hand/left/input/grip/pose", "/user/hand/right/input/grip/pose") 747 | 748 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_smo66"] 749 | action = SubResource("OpenXRAction_1d1o3") 750 | paths = PackedStringArray("/user/hand/left/input/palm_ext/pose", "/user/hand/right/input/palm_ext/pose") 751 | 752 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_efo4h"] 753 | action = SubResource("OpenXRAction_u7std") 754 | paths = PackedStringArray("/user/hand/left/input/menu/click") 755 | 756 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_3t4io"] 757 | action = SubResource("OpenXRAction_1wsno") 758 | paths = PackedStringArray("/user/hand/left/input/system/click") 759 | 760 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_5hop2"] 761 | action = SubResource("OpenXRAction_qe7om") 762 | paths = PackedStringArray("/user/hand/left/input/x/click", "/user/hand/right/input/a/click") 763 | 764 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_djryn"] 765 | action = SubResource("OpenXRAction_mhncd") 766 | paths = PackedStringArray("/user/hand/left/input/y/click", "/user/hand/right/input/b/click") 767 | 768 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_tc38c"] 769 | action = SubResource("OpenXRAction_55duo") 770 | paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value") 771 | 772 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_y581x"] 773 | action = SubResource("OpenXRAction_jnvwu") 774 | paths = PackedStringArray("/user/hand/left/input/trigger/click", "/user/hand/right/input/trigger/click") 775 | 776 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_flop2"] 777 | action = SubResource("OpenXRAction_1saiv") 778 | paths = PackedStringArray("/user/hand/left/input/trigger/touch", "/user/hand/right/input/trigger/touch") 779 | 780 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_c10qp"] 781 | action = SubResource("OpenXRAction_fapth") 782 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 783 | 784 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_m6bsd"] 785 | action = SubResource("OpenXRAction_xrwu1") 786 | paths = PackedStringArray("/user/hand/left/input/squeeze/click", "/user/hand/right/input/squeeze/click") 787 | 788 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_cpsqg"] 789 | action = SubResource("OpenXRAction_6u0s6") 790 | paths = PackedStringArray("/user/hand/left/input/thumbstick", "/user/hand/right/input/thumbstick") 791 | 792 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_jj0p1"] 793 | action = SubResource("OpenXRAction_l6pre") 794 | paths = PackedStringArray("/user/hand/left/input/thumbstick/click", "/user/hand/right/input/thumbstick/click") 795 | 796 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_7aetu"] 797 | action = SubResource("OpenXRAction_6soob") 798 | paths = PackedStringArray("/user/hand/left/input/thumbstick/touch", "/user/hand/right/input/thumbstick/touch") 799 | 800 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_iqw6v"] 801 | action = SubResource("OpenXRAction_cuv1q") 802 | paths = PackedStringArray("/user/hand/left/input/thumbrest/touch", "/user/hand/right/input/thumbrest/touch") 803 | 804 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_4lofl"] 805 | action = SubResource("OpenXRAction_87dm3") 806 | paths = PackedStringArray("/user/hand/left/output/haptic", "/user/hand/right/output/haptic") 807 | 808 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_ewwvc"] 809 | interaction_profile_path = "/interaction_profiles/htc/vive_focus3_controller" 810 | bindings = [SubResource("OpenXRIPBinding_84ftb"), SubResource("OpenXRIPBinding_gxock"), SubResource("OpenXRIPBinding_qq0uv"), SubResource("OpenXRIPBinding_smo66"), SubResource("OpenXRIPBinding_efo4h"), SubResource("OpenXRIPBinding_3t4io"), SubResource("OpenXRIPBinding_5hop2"), SubResource("OpenXRIPBinding_djryn"), SubResource("OpenXRIPBinding_tc38c"), SubResource("OpenXRIPBinding_y581x"), SubResource("OpenXRIPBinding_flop2"), SubResource("OpenXRIPBinding_c10qp"), SubResource("OpenXRIPBinding_m6bsd"), SubResource("OpenXRIPBinding_cpsqg"), SubResource("OpenXRIPBinding_jj0p1"), SubResource("OpenXRIPBinding_7aetu"), SubResource("OpenXRIPBinding_iqw6v"), SubResource("OpenXRIPBinding_4lofl")] 811 | 812 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_2h4ce"] 813 | action = SubResource("OpenXRAction_7bqr1") 814 | 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") 815 | 816 | [sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_552k3"] 817 | action = SubResource("OpenXRAction_87dm3") 818 | 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") 819 | 820 | [sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_kgn04"] 821 | interaction_profile_path = "/interaction_profiles/htc/vive_tracker_htcx" 822 | bindings = [SubResource("OpenXRIPBinding_2h4ce"), SubResource("OpenXRIPBinding_552k3")] 823 | 824 | [resource] 825 | action_sets = [SubResource("OpenXRActionSet_kotkd")] 826 | interaction_profiles = [SubResource("OpenXRInteractionProfile_cr1r0"), SubResource("OpenXRInteractionProfile_jno2c"), SubResource("OpenXRInteractionProfile_vqfsn"), SubResource("OpenXRInteractionProfile_7x666"), SubResource("OpenXRInteractionProfile_cwq0f"), SubResource("OpenXRInteractionProfile_hl3my"), SubResource("OpenXRInteractionProfile_3mxfg"), SubResource("OpenXRInteractionProfile_f70rd"), SubResource("OpenXRInteractionProfile_x1emj"), SubResource("OpenXRInteractionProfile_ewwvc"), SubResource("OpenXRInteractionProfile_kgn04")] 827 | --------------------------------------------------------------------------------