diff --git a/.gitignore b/.gitignore index 4ba4c2bdc..ce388be36 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,11 @@ OpenGothic !.claude/README.md !.claude/CLAUDE-SETUP.md !.claude/statuslines/ + +# Package samples (e.g. XR Interaction Toolkit Starter Assets, XR Interaction Simulator) are re-importable from the +# Package Manager. What we need is copied into Gothic-VR/, so nothing may reference Assets/Samples/. +/[Aa]ssets/[Ss]amples/ +/[Aa]ssets/[Ss]amples.meta + + +ultimatexr-unity/ \ No newline at end of file diff --git a/Assets/Gothic-Core/Resources/DeveloperConfigs/Lab.HVR.Simulator.asset b/Assets/Gothic-Core/Resources/DeveloperConfigs/Lab.HVR.Simulator.asset index 3e16572f6..dfd33b053 100644 --- a/Assets/Gothic-Core/Resources/DeveloperConfigs/Lab.HVR.Simulator.asset +++ b/Assets/Gothic-Core/Resources/DeveloperConfigs/Lab.HVR.Simulator.asset @@ -14,10 +14,13 @@ MonoBehaviour: m_EditorClassIdentifier: PreselectGameVersion: 1 GameVersion: 0 + PreSelectMod: 0 ModIni: + ModPath: GameControls: 0 + VrInteractionBackend: 0 EnableVRDeviceSimulator: 1 - ActivateMarvinMode: 1 + PreselectMarvinMode: 0 EnableZSpyLogs: 0 AllDebugChannels: 0 ZSpyChannels: @@ -51,6 +54,7 @@ MonoBehaviour: ShowVOBMeshCullingGizmos: 0 ShowCapsuleOverlapGizmos: 0 EnableNpcs: 0 + EnableCombatSystem: 0 EnableNpcMeshCulling: 1 NpcCullingDistance: 50 SpawnNpcInstances: @@ -58,6 +62,8 @@ MonoBehaviour: SpawnMonsterInstances: Value: EnableNpcEyeBlinking: 0 + EnableNpcLooting: 0 + EnableDialogFreeMovement: 1 ShowNpcColliders: 0 ShowFreePoints: 0 ShowWayPoints: 0 diff --git a/Assets/Gothic-Core/Resources/DeveloperConfigs/Production.asset b/Assets/Gothic-Core/Resources/DeveloperConfigs/Production.asset index 96795dbb0..4cec2edf1 100644 --- a/Assets/Gothic-Core/Resources/DeveloperConfigs/Production.asset +++ b/Assets/Gothic-Core/Resources/DeveloperConfigs/Production.asset @@ -18,6 +18,7 @@ MonoBehaviour: ModIni: ModPath: GameControls: 0 + VrInteractionBackend: 0 EnableVRDeviceSimulator: 0 PreselectMarvinMode: 0 EnableZSpyLogs: 0 diff --git a/Assets/Gothic-Core/Scripts/Models/Config/DeveloperConfig.cs b/Assets/Gothic-Core/Scripts/Models/Config/DeveloperConfig.cs index b787caf0a..cef1c677a 100644 --- a/Assets/Gothic-Core/Scripts/Models/Config/DeveloperConfig.cs +++ b/Assets/Gothic-Core/Scripts/Models/Config/DeveloperConfig.cs @@ -60,6 +60,10 @@ public class DebugChannelTypesCollection : CollectionWrapper + /// VR interaction framework which provides the VR ports (rig, input, haptics, UI pointers). + /// Stored as int in DeveloperConfig assets. Don't change the values. + /// + public enum VrInteractionBackend + { + /// + /// HurricaneVR (commercial). Needs the scripting define GOTHIC_HVR_INSTALLED. + /// + Hvr = 0, + + /// + /// XR Interaction Toolkit (free, always installed). + /// + Xri = 1 + } +} diff --git a/Assets/Gothic-Core/Scripts/Models/Context/VrInteractionBackend.cs.meta b/Assets/Gothic-Core/Scripts/Models/Context/VrInteractionBackend.cs.meta new file mode 100644 index 000000000..6b6e8def4 --- /dev/null +++ b/Assets/Gothic-Core/Scripts/Models/Context/VrInteractionBackend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4012edafe62e55640a017053632facf0 \ No newline at end of file diff --git a/Assets/Gothic-VR/Resources/VR/Input.meta b/Assets/Gothic-VR/Resources/VR/Input.meta new file mode 100644 index 000000000..cb4a097d2 --- /dev/null +++ b/Assets/Gothic-VR/Resources/VR/Input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 058bc8d73faeb40459489dd1819e22c7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions new file mode 100644 index 000000000..dd56af770 --- /dev/null +++ b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions @@ -0,0 +1,3743 @@ +{ + "version": 1, + "name": "GothicVR", + "maps": [ + { + "name": "Gothic Left", + "id": "ae3d4878-9785-4c76-907e-83e08a1f4b07", + "actions": [ + { + "name": "Grip", + "type": "Button", + "id": "aac042e1-60a1-47b7-a84c-c90611ea7c88", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Trigger", + "type": "Button", + "id": "4f10732e-32c9-4bf6-ba95-c772a9014e83", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary", + "type": "Button", + "id": "059cc301-a609-4450-80c6-d16b621339e9", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary", + "type": "Button", + "id": "f0676d76-25fb-4b3f-aa78-03cf09711b20", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Menu", + "type": "Button", + "id": "19140b0c-f1a5-4f7e-be3d-56e040868ac8", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Joystick Button", + "type": "Button", + "id": "ffbc2590-c3dc-4798-9302-7e51d8d3a6a8", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Velocity", + "type": "Value", + "id": "c2928db7-b442-4c80-8a5b-ead41abd27bb", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Haptic", + "type": "PassThrough", + "id": "b02dba25-8db5-4bc3-bff0-31824a9d8e5b", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "755e9466-e4da-4d41-89b0-161bfd5d1c32", + "path": "{LeftHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ade99134-fcb3-4315-bc87-cca73113d75b", + "path": "{LeftHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Trigger", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "6e11c585-cda5-4fd8-8d35-8900be304e48", + "path": "{LeftHand}/{PrimaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "28f2698a-6a35-4653-a0e7-48ce583139ed", + "path": "{LeftHand}/{SecondaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "220e78f3-b137-4d8f-9f7b-ff948d5d7971", + "path": "{LeftHand}/{MenuButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Menu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4d7d1179-038a-4804-9d57-3cfc218f5af8", + "path": "{LeftHand}/{Primary2DAxisClick}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Joystick Button", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "882510ec-4d64-4585-8cc4-de2d410609ea", + "path": "{LeftHand}/deviceVelocity", + "interactions": "", + "processors": "", + "groups": "", + "action": "Velocity", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b0d88218-c298-4868-9e7b-42c9a08e9312", + "path": "{LeftHand}/devicePose/velocity", + "interactions": "", + "processors": "", + "groups": "", + "action": "Velocity", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bd050c7b-adc5-4ba1-ba6e-b69066f09db3", + "path": "{LeftHand}/*", + "interactions": "", + "processors": "", + "groups": "", + "action": "Haptic", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "Gothic Right", + "id": "47971841-3f5c-4993-a88b-4f927e9b92e4", + "actions": [ + { + "name": "Grip", + "type": "Button", + "id": "67bb71b6-bf3f-47e9-8518-9da5ac4d7aa8", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Trigger", + "type": "Button", + "id": "bf18e338-8d79-426d-8789-bfa179312ff4", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary", + "type": "Button", + "id": "70447b16-0c91-401c-8d60-ed918215962d", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary", + "type": "Button", + "id": "cb3dbd1a-f3f8-4cd7-bf7b-7b1031eed1c1", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Menu", + "type": "Button", + "id": "8b6bdc9f-96f3-4b47-ae6b-c9e41fc43b76", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Joystick Button", + "type": "Button", + "id": "55b40405-bde0-4594-96db-2f54eb64c5a6", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Velocity", + "type": "Value", + "id": "cbad0a47-85ee-4e98-ad6c-f8049a67bfe2", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Haptic", + "type": "PassThrough", + "id": "7b8e1735-cd86-45c0-b044-332684555d27", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "788d2b31-57df-41cc-bd60-6eda465018b4", + "path": "{RightHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9e1df6b7-364f-4c5b-9654-ee6f28153c98", + "path": "{RightHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Trigger", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "66c4ab17-3730-4dcf-b446-304c2b7b43e1", + "path": "{RightHand}/{PrimaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1ee102d0-27bd-4294-9aa7-d94847109ec1", + "path": "{RightHand}/{SecondaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5d94700e-4dd8-4e40-b3a7-48652e40d798", + "path": "{RightHand}/{MenuButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Menu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "023a026f-c793-4b2e-b894-f3a9504f9533", + "path": "{RightHand}/{Primary2DAxisClick}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Joystick Button", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "74623200-2955-44f1-8d6c-8463b2b626f7", + "path": "{RightHand}/deviceVelocity", + "interactions": "", + "processors": "", + "groups": "", + "action": "Velocity", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eb6ccc53-2c98-4e5f-a35f-2278b45fc100", + "path": "{RightHand}/devicePose/velocity", + "interactions": "", + "processors": "", + "groups": "", + "action": "Velocity", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3748174-ce54-452d-a7c5-841425e37515", + "path": "{RightHand}/*", + "interactions": "", + "processors": "", + "groups": "", + "action": "Haptic", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "Gothic", + "id": "9ef26729-0118-4bdc-b2e4-f644e380c917", + "actions": [ + { + "name": "Menu", + "type": "Button", + "id": "c6cf008d-8047-4319-b5fd-46763b0e0dca", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "4f59678e-957d-479d-80c4-dbabd3f76c6b", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "48bd247c-a066-487e-bfe2-2df452d78035", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "c91d867d-533f-4c01-a5ff-7d04ad23a280", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "2f5a8fb8-cc88-48c1-8d6c-1b5eabae2ee5", + "path": "{LeftHand}/{SecondaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Menu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9d489765-3b50-428d-9288-9a986f4c93ff", + "path": "/escape", + "interactions": "", + "processors": "", + "groups": "", + "action": "Menu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "22749dcb-805d-4bb5-b6bc-01baa2b38fc0", + "path": "{RightHand}/{PrimaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d5341926-6b48-4096-8b91-76a5e3b84808", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1f7f1128-b9fe-4539-8c73-1b94ba51e111", + "path": "{RightHand}/{SecondaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e3f30bb9-cd1c-4fc6-9531-d5d9421cc255", + "path": "/z", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e86e04ee-bd12-4e08-8742-417b8b2267f7", + "path": "/x", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a27904cc-adca-4daa-9c4d-6d1e755085ef", + "path": "{LeftHand}/{Primary2DAxisClick}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8810bed4-d1c4-48a4-972b-93cc6086cafe", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Head", + "id": "09ff3ccc-21b4-4346-a3a2-7c978b5af892", + "actions": [ + { + "name": "Position", + "type": "Value", + "id": "1a9029f8-7a46-46b9-9eff-e9ae8365f611", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Rotation", + "type": "Value", + "id": "aed87fe6-2b01-4dd2-a8fa-195578fd8158", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Is Tracked", + "type": "Button", + "id": "6bb4e248-e42b-47c3-b66c-79566508ca74", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Tracking State", + "type": "Value", + "id": "08654a17-c094-4bbd-8946-415ae4ce2406", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Eye Gaze Position", + "type": "Value", + "id": "dde820a2-0462-4756-be47-630b5b56c115", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Eye Gaze Rotation", + "type": "Value", + "id": "8ac32629-4403-4068-aae5-2cd243e230c2", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Eye Gaze Is Tracked", + "type": "Button", + "id": "ea26ba43-844b-4585-817a-2f124b571813", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Eye Gaze Tracking State", + "type": "Value", + "id": "73053154-2fbc-4d78-9cac-000282b64f79", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "cff1f981-6e1f-4e2c-a90c-715a0ea2e80e", + "path": "/centerEyePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4d22c160-9642-4784-bed3-f108d9099185", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e2017383-a3f6-4c46-acb1-012b8eece9cc", + "path": "/centerEyeRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "30a88e64-475a-4a1c-aca0-80b6a2bc3327", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Quaternion Fallback", + "id": "fd9bd2d1-a464-4069-bf55-7f7a3cdb5a96", + "path": "QuaternionFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Rotation", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "ef9a3bee-0af0-4688-81d3-49c2d9be0def", + "path": "/pose/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "aaf13e7c-a814-4c6e-9349-042da0cb27e9", + "path": "/centerEyeRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "3e829ba4-2fad-45ea-8114-7670f0e484be", + "path": "", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Vector 3 Fallback", + "id": "0cf0b092-6006-474b-9cf5-dc4039450f39", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "872dc9a3-bab9-4b3f-9f84-8d12371f1f67", + "path": "/pose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "2f870b88-8825-4a62-b02e-b5a523723446", + "path": "/centerEyePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "eaececb1-b4a3-4b47-83c2-60562a364085", + "path": "", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Integer Fallback", + "id": "1a6685cf-ae82-4f22-a967-75610a8e71ed", + "path": "IntegerFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Tracking State", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "0dc9d652-871d-4ba5-94a1-50cf8218009a", + "path": "/pose/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Tracking State", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "9bbd034f-9254-4dd5-9df7-d84f53b0bc8d", + "path": "/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Tracking State", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "d5e35a2f-03c4-432a-8e5e-d200278bf0a9", + "path": "", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Tracking State", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "43a7b1a1-e99a-4346-a058-5b68c535729d", + "path": "/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Tracking State", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "15eff92f-dac7-4e6e-986c-08b3f1e73fac", + "path": "/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Is Tracked", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Button Fallback", + "id": "c262df21-2ffb-4295-93cc-8fdb5649da7e", + "path": "ButtonFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Is Tracked", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "f77492f8-09ee-49d0-b821-7c31cb5c2a16", + "path": "/pose/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Is Tracked", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "960252ae-88e8-427a-ac9f-ecac6fb3c7d1", + "path": "/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Is Tracked", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "dfc94c22-a115-471f-9f17-8cb6bc7f6637", + "path": "", + "interactions": "", + "processors": "", + "groups": "", + "action": "Eye Gaze Is Tracked", + "isComposite": false, + "isPartOfComposite": true + } + ] + }, + { + "name": "XRI Left", + "id": "5fe596f9-1b7b-49b7-80a7-3b5195caf74d", + "actions": [ + { + "name": "Position", + "type": "Value", + "id": "83a7af0b-87e3-42c3-a909-95fbf8091e4f", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Rotation", + "type": "Value", + "id": "cb6b7130-2bac-4ef7-abe4-6991ae7d419d", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Is Tracked", + "type": "Button", + "id": "82eb6741-beef-48d3-83ab-a957dc1caa1e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Tracking State", + "type": "Value", + "id": "d20fc51c-7916-43a7-8b03-706049966aea", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Haptic Device", + "type": "PassThrough", + "id": "664a62b0-e178-421d-b3f8-014eec01591d", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Aim Position", + "type": "Value", + "id": "c73a0160-3d9b-4dde-96f9-6a390e68778c", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Aim Rotation", + "type": "Value", + "id": "f208faac-e869-4280-ac9c-9b3d0ab819bb", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Meta Aim Flags", + "type": "Value", + "id": "f98e71db-49b4-4882-8991-a0e386733e87", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Pinch Position", + "type": "Value", + "id": "cac52a91-5970-4ad2-8c86-a8c0e91a1837", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Poke Position", + "type": "Value", + "id": "4c557d81-3795-4355-a83e-6f886221d011", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Poke Rotation", + "type": "Value", + "id": "0565b7f7-f841-4395-98df-a77f4dd6d9c9", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grip Position", + "type": "Value", + "id": "e1240870-ef45-4f3e-8110-ff1b9049c4ca", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grip Rotation", + "type": "Value", + "id": "41873a55-b316-4dbe-96e6-93477eef5e47", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Thumbstick", + "type": "Value", + "id": "c01850c4-700b-4ae6-a187-a894afef5bbd", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "Quaternion Fallback", + "id": "61466a56-4ee4-47b1-aa6a-4806de1de5f2", + "path": "QuaternionFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "afdcfbff-e241-4fdd-a6d1-23b0bf273360", + "path": "{LeftHand}/pointerRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "ed03d944-4c09-4c38-8b68-5c844e18ca7c", + "path": "{LeftHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "c98fc8c8-7fc6-4909-89b6-c5b7568e7275", + "path": "{LeftHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Vector 3 Fallback", + "id": "14aeff85-d719-43ff-a124-b1cd7ca8686d", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "abf752ec-feee-4d51-b530-f0870f48acc9", + "path": "{LeftHand}/pointerPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "6580b669-0651-401c-9779-85ef22689130", + "path": "{LeftHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "ae101942-9eaa-4c53-a388-cafc3fd89bdf", + "path": "{LeftHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "acdf9550-5529-4ff7-8558-73ecdf0d75bd", + "path": "{LeftHand}/*", + "interactions": "", + "processors": "", + "groups": "", + "action": "Haptic Device", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "97a0351f-659b-482a-8fa0-19015ccd055e", + "path": "{LeftHand}/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Tracking State", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "34454fec-7610-497a-b1a5-d3d5f01b312c", + "path": "{LeftHand}/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Tracking State", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "28df8d2f-b563-4377-bd11-6c8932ee591c", + "path": "{LeftHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8ee39b25-fde6-4195-bc6e-68caadef9183", + "path": "{LeftHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ec4a1046-3843-445d-8ad4-a769823faa86", + "path": "{LeftHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d29757d4-ec35-4477-8a26-1d14acd14ba9", + "path": "{LeftHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "938b6e3d-9fc2-4fba-a049-738668dc07e5", + "path": "{LeftHand}/aimPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "2623b909-75bd-40da-97bd-ae1ecfb0a89b", + "path": "{LeftHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c3ff2c3c-d1ef-40c9-8777-72ee03df3ff3", + "path": "{LeftHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "68633061-addf-447b-969e-06249302eaad", + "path": "{LeftHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4848899c-8c90-455a-a915-6422290f501b", + "path": "{LeftHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "73f3c491-d5ec-4851-84f5-9138a454eb5c", + "path": "{LeftHand}/aimRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Vector 3 Fallback", + "id": "aff6849b-544f-473c-9d7e-da40488aa6ab", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "e62f5918-8922-4a59-ae42-179b1fde0d29", + "path": "{LeftHand}/pinchPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "1e9cdc2b-24e6-4624-9bd8-02c7dcf68fb4", + "path": "{LeftHand}/pinchPose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "0adea6d4-f14c-4243-8217-dd63b6529bcc", + "path": "{LeftHand}/pinchPose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Vector 3 Fallback", + "id": "2ef93166-d4e5-471d-8321-71e7cdec9220", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "55020194-7022-4059-8424-8ecc0de92c13", + "path": "{LeftHand}/pokePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "9a8820cc-2172-4641-9fae-0c416b2649e2", + "path": "{LeftHand}/pokePose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "ef0a4717-47f8-47a3-8dae-fd0cba366115", + "path": "{LeftHand}/pokePose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Quaternion Fallback", + "id": "892e5765-05a7-460a-942c-32e8a36bd441", + "path": "QuaternionFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "5f5fb46a-effc-4105-bb74-d30dc9cd1f43", + "path": "{LeftHand}/pokeRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "8fba8372-e2dd-4a31-8048-45d49484323e", + "path": "{LeftHand}/pokePose/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "8c1d4e9b-88f5-4966-a6e4-0f22f7bb896d", + "path": "{LeftHand}/pokePose/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "f1de7b81-80d1-4207-8f19-4fb96a537bb3", + "path": "{LeftHand}/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Is Tracked", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d9f33fe3-b3bf-48c1-a8bc-dd6a4ddfba94", + "path": "{LeftHand}/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Is Tracked", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "286f44f6-74a5-4f92-8468-42445c7a3cb8", + "path": "{LeftHand}/aimFlags", + "interactions": "", + "processors": "", + "groups": "", + "action": "Meta Aim Flags", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "21a4b6f9-1ebe-434f-b572-066a77b04c48", + "path": "{LeftHand}/gripPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3c1f9e74-aba4-41d6-b519-90ed563be5d7", + "path": "{LeftHand}/gripRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "0123e5fd-aec0-4ab3-b201-2e6c65d2b93e", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Thumbstick", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Left Interaction", + "id": "7a5e7537-cc30-4eb1-a544-6946baa8f3eb", + "actions": [ + { + "name": "Select", + "type": "Button", + "id": "33754c03-48ec-46ef-9bc6-22ed6bfdd8e8", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Select Value", + "type": "Value", + "id": "e6005f29-e4c1-4f3b-8bf7-3a28bab5ca9c", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Activate", + "type": "Button", + "id": "0c0991c5-d329-4afc-8892-1076b440477c", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Activate Value", + "type": "Value", + "id": "0c3d0ec9-85a1-45b3-839b-1ca43f859ecd", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "UI Press", + "type": "Button", + "id": "7e1eced7-c774-4fe5-be8f-d8711f646d9e", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "UI Press Value", + "type": "Value", + "id": "f241c1aa-1050-4338-b2bf-a4a47776693d", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "UI Scroll", + "type": "Value", + "id": "a5372626-7022-4ba7-b152-6f26318fd8a8", + "expectedControlType": "Vector2", + "processors": "InvertVector2(invertY=false)", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Translate Manipulation", + "type": "Value", + "id": "bfa204c7-3c92-4193-bad1-39eb71920042", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Rotate Manipulation", + "type": "Value", + "id": "21b75b25-12ad-410f-b4f8-a7745b7aca27", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Manipulation", + "type": "Value", + "id": "93bd97c5-fd23-4853-8045-1b12324aa24e", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Scale Toggle", + "type": "Button", + "id": "80ed7d74-56de-473c-bf76-da3bdd16b562", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Scale Over Time", + "type": "Value", + "id": "2257500c-1efb-4f69-a54d-ed5db2708616", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "71a4d23f-3e9a-4513-923b-ba388c5e84bf", + "path": "{LeftHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "73325635-d9e5-481a-9279-ae7be089422d", + "path": "{LeftHand}/indexPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3bbf9f24-2edd-41b9-8456-683298f1e58c", + "path": "{LeftHand}/graspFirm", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a86585c7-1d41-40e2-a7ca-bb76cca5c32a", + "path": "{LeftHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ebab6345-d4f7-4a42-94b3-12d4464de218", + "path": "{LeftHand}/squeezePressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "87d9a1e7-704b-43bb-be2a-f2d8ecfde8b7", + "path": "{LeftHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "502d470d-dc8a-46a5-8391-81cba04305cf", + "path": "{LeftHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7fa12256-8331-468c-9951-60255e867cd6", + "path": "{LeftHand}/graspFirm", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "49a23327-a116-48c0-8af9-0d2c50c15a88", + "path": "{LeftHand}/{Grip}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "304be843-4b23-45d9-89fa-005ac163d9b9", + "path": "{LeftHand}/pinchStrengthIndex", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "2a4b758a-252a-484c-9a26-438954189c08", + "path": "{LeftHand}/graspValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bc272ed6-7655-4292-9c21-e5b87bec4350", + "path": "{LeftHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a8d99ae3-e736-4370-ad5e-9fa45cb7a1be", + "path": "{LeftHand}/squeeze", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7bb4b9cf-262f-4f6c-ac85-8a228792bc2e", + "path": "{LeftHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d08c5dcc-5696-4ca7-8f1f-a34a297b4501", + "path": "{LeftHand}/graspValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "487f4f2e-9e9b-49aa-b0f2-4037a24624f5", + "path": "{LeftHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Activate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3b8b1b59-2fdc-4998-8259-50341075d9a2", + "path": "{LeftHand}/{Trigger}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Activate Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b34c79c1-ab5e-4851-87ac-abc43705eae0", + "path": "{LeftHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a5bf6a12-a026-46d1-a793-7252c49aaf66", + "path": "{LeftHand}/indexPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fc8b2287-429e-4be4-a34b-cca7c50eeb52", + "path": "{LeftHand}/pointerActivated", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ca931b95-39e0-4db1-9887-f5a5f68298d4", + "path": "{LeftHand}/selectPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "36eadd9a-281d-47fe-9d16-5870d6e00480", + "path": "{LeftHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7bed2e1f-113a-4779-848d-a4f93136bb84", + "path": "{LeftHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "71d94579-1bf4-4034-ab9e-e7166842128f", + "path": "{LeftHand}/{Trigger}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d250c9be-4bf2-4b5c-8962-4fcf5d53bdb3", + "path": "{LeftHand}/pinchStrengthIndex", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c4c2fc93-75fe-4910-95ca-6b1cc163a48a", + "path": "{LeftHand}/pointerActivateValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c7b5ae56-e532-43a3-a053-8d66df507df1", + "path": "{LeftHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "92437f05-43d7-40d1-9e19-33cb9d5013e7", + "path": "{LeftHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8ed313a6-c966-4669-8a62-4bb2319d485b", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(y=0),StickDeadzone", + "groups": "", + "action": "Rotate Manipulation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7b30ca4b-9f98-4a44-9af5-a89412d5cdc8", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Scroll", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8f872fc5-75dc-49e5-9bbd-f2e4d4498c65", + "path": "{LeftHand}/{Primary2DAxisClick}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Scale Toggle", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b21d690b-51fc-413f-a887-08a2a39af3fc", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(x=0),StickDeadzone", + "groups": "", + "action": "Scale Over Time", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5fe0ed53-b4d3-4cd8-b567-397a7d1e1c6a", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "StickDeadzone", + "groups": "", + "action": "Manipulation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "370f21e3-a80b-4b07-990b-299c2da0929a", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(x=0),StickDeadzone", + "groups": "", + "action": "Translate Manipulation", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Left Locomotion", + "id": "22336389-9fb1-4c2c-8635-0ed30db0d29e", + "actions": [ + { + "name": "Teleport Mode", + "type": "Value", + "id": "a21db72c-4843-4839-b4d0-3ce8d287cb86", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Teleport Mode Cancel", + "type": "Button", + "id": "89ce8348-6001-41a3-85b9-f8f2e2dcad7c", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Turn", + "type": "Value", + "id": "9164e093-ebd4-4923-af32-1b52f31c2d66", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Snap Turn", + "type": "Value", + "id": "8c14e969-a054-4f12-840c-4e0bd85173d9", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Move", + "type": "Value", + "id": "9693e25f-8a4f-4aed-842f-3961243c69a1", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grab Move", + "type": "Button", + "id": "c5a6d766-d487-42ae-b293-da4749469e18", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "8da6ed3a-f621-49fe-8c76-1f6b7d7754d6", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "Sector(directions=1)", + "processors": "", + "groups": "", + "action": "Teleport Mode", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b8aebee7-fa03-43d4-bfb7-77a3f87452cc", + "path": "{LeftHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Teleport Mode Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "99cb7ad1-51ec-4611-af68-92a85f2c17d6", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "Sector(directions=12,sweepBehavior=1),Sector(directions=2,sweepBehavior=2)", + "processors": "", + "groups": "", + "action": "Turn", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8e383b1a-270f-4c20-819b-89a59cffb498", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "", + "processors": "StickDeadzone", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9e2fa814-8cbd-4c65-a60d-a1503f30ffd8", + "path": "{LeftHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grab Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a46b49d0-0754-4dac-a9a5-a822e10751f2", + "path": "{LeftHand}/{Primary2DAxis}", + "interactions": "Sector(directions=12,sweepBehavior=1),Sector(directions=2,sweepBehavior=2)", + "processors": "", + "groups": "", + "action": "Snap Turn", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Right", + "id": "7960f8ef-2bf3-4281-aecc-4c03809d6c8c", + "actions": [ + { + "name": "Position", + "type": "Value", + "id": "c4990d70-7b8a-4ce1-b03c-da86716b8352", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Rotation", + "type": "Value", + "id": "ee6bf5bf-bb0a-4a50-8327-cb654b19e298", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Is Tracked", + "type": "Button", + "id": "a705ffe4-b2c8-4b78-847f-25257d4e30af", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Tracking State", + "type": "Value", + "id": "167ea203-5bfb-4d74-bde9-8026b7483102", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Haptic Device", + "type": "PassThrough", + "id": "57b2a1b4-3290-46d6-ac07-4854ee8f91b1", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Aim Position", + "type": "Value", + "id": "daf49d5d-4ba8-4bf7-9010-e7cae2096907", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Aim Rotation", + "type": "Value", + "id": "148c182f-63ef-4709-8057-f6ea8070cb5c", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Meta Aim Flags", + "type": "Value", + "id": "93a75a21-033e-440c-9954-ff264afb2db9", + "expectedControlType": "Integer", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Pinch Position", + "type": "Value", + "id": "7a2e5dcd-3e49-4622-90ea-6607994f2be0", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Poke Position", + "type": "Value", + "id": "496d56bd-afd7-495b-a326-16e4ef742bc1", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Poke Rotation", + "type": "Value", + "id": "3767652c-5427-421b-8f8d-660106453cb1", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grip Position", + "type": "Value", + "id": "defe4495-ba8f-4958-b2fb-98d889e45ac5", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grip Rotation", + "type": "Value", + "id": "6bc56065-b0db-4265-8cef-5c7d4f40128a", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Thumbstick", + "type": "Value", + "id": "b8c0ccd3-e1b6-4913-96b3-e0864c9ac6bd", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "Quaternion Fallback", + "id": "84e51e1c-1b95-4f3e-a61f-29da6c1f0816", + "path": "QuaternionFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "3722d501-eb80-4f61-9361-08a5ea7a1394", + "path": "{RightHand}/pointerRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "2e6ad191-d5aa-4919-aac6-295c83387a72", + "path": "{RightHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "b9ecb60d-341e-47cf-b50a-41d5815af8b0", + "path": "{RightHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Vector 3 Fallback", + "id": "74e968f1-ad08-4a82-a68d-764517faecef", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "9717e367-64a4-440a-9974-1e641d753eb2", + "path": "{RightHand}/pointerPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "0794a41d-29ef-48ec-a452-6b7de29b52fa", + "path": "{RightHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "3ef0a781-60c5-48bc-a584-f95553f8ae0a", + "path": "{RightHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "6011e1e6-b2dd-4cb1-8da5-29b03868f2c5", + "path": "{RightHand}/*", + "interactions": "", + "processors": "", + "groups": "", + "action": "Haptic Device", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "03ccbaec-eeca-4fc4-8281-ee1758b4eb9b", + "path": "{RightHand}/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Tracking State", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "714d1173-f908-4bca-951c-4adb4eb7b4c5", + "path": "{RightHand}/trackingState", + "interactions": "", + "processors": "", + "groups": "", + "action": "Tracking State", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "dd822fc8-c655-4a4d-87d0-9575760b6dca", + "path": "{RightHand}/devicePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e60d7767-705f-4af2-ae42-f135e6580630", + "path": "{RightHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d34dafcf-a3a4-4511-a73f-1ecbfd6099c8", + "path": "{RightHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "720d5e83-6877-4504-9b4a-aa550c2593af", + "path": "{RightHand}/pointer/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d5e01c2b-7d1d-4866-a59e-a2aae1290e59", + "path": "{RightHand}/aimPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "2bb1158a-2d78-446b-9351-6f9b3f1364cb", + "path": "{RightHand}/deviceRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "256fbef4-95a6-4127-ac3e-6a259b640666", + "path": "{RightHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d46291b9-775e-457b-a909-649a301d55c3", + "path": "{RightHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "2fac2635-e015-4fb7-9578-34b85a5d5797", + "path": "{RightHand}/pointer/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "43fa4f6a-9bc1-47f1-9c04-3840e77ba4ec", + "path": "{RightHand}/aimRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Aim Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Vector 3 Fallback", + "id": "0323576b-ec88-4459-a791-4afeada3f7c8", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "0bdf98f1-d1a8-443f-805e-9718b34fc6ea", + "path": "{RightHand}/pinchPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "0bd62ec6-1259-40f6-aa0a-71b82a790764", + "path": "{RightHand}/pinchPose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "7271c456-534a-4e51-9835-1ebd589a938e", + "path": "{RightHand}/pinchPose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Pinch Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Vector 3 Fallback", + "id": "5724159b-b0ee-4458-b567-63874ee6e24a", + "path": "Vector3Fallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "3f5ff135-3cfa-48b6-a35c-aa52badc1d6e", + "path": "{RightHand}/pokePosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "c46e492c-1618-4d10-8c99-3079cf9deda6", + "path": "{RightHand}/pokePose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "34b9f870-767e-422c-b558-0708567a1a5d", + "path": "{RightHand}/pokePose/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Position", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Quaternion Fallback", + "id": "74a5f1ad-f8ed-42cf-aff3-eb911325ca7d", + "path": "QuaternionFallback", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "first", + "id": "595c1ccb-9c05-411a-a2fd-e892ca0c9091", + "path": "{RightHand}/pokeRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "second", + "id": "d7ce6129-ec94-4757-9595-aaf1032cae86", + "path": "{RightHand}/pokePose/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "third", + "id": "0e7b9607-caf5-46cc-adb9-2a1500c718a4", + "path": "{RightHand}/pokePose/rotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Poke Rotation", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1de48aee-890b-4dbb-a02d-51df9bd39db7", + "path": "{RightHand}/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Is Tracked", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5a0c4fe0-639a-44e0-beeb-4e11e0dea7ef", + "path": "{RightHand}/isTracked", + "interactions": "", + "processors": "", + "groups": "", + "action": "Is Tracked", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5469d4d1-9645-4397-a596-d74f876eafc2", + "path": "{RightHand}/aimFlags", + "interactions": "", + "processors": "", + "groups": "", + "action": "Meta Aim Flags", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "efcaf94e-8faa-439e-983b-c65f79c3b743", + "path": "{RightHand}/gripPosition", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip Position", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "70a747b6-46e8-4d3b-aaec-20bcab8f1dd7", + "path": "{RightHand}/gripRotation", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip Rotation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "709cc921-f3b0-4dc8-88d4-7787b8a3ced1", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Thumbstick", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Right Interaction", + "id": "461bce25-7762-40c5-b639-f190649be6d6", + "actions": [ + { + "name": "Select", + "type": "Button", + "id": "ac96c10b-c955-4a46-8e67-bf16bc069b53", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Select Value", + "type": "Value", + "id": "39bbf1ac-21a3-413d-90f6-6dbf6efeaabe", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Activate", + "type": "Button", + "id": "41976d89-60de-4deb-bff9-16b4af96b290", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Activate Value", + "type": "Value", + "id": "c3ca6ed7-3d25-44a2-b1d8-5be4eb699370", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "UI Press", + "type": "Button", + "id": "65174b45-c2ee-4f90-93bb-fb4084eaaab3", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "UI Press Value", + "type": "Value", + "id": "962ac033-ec42-4981-88a4-551ad9be6ecb", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "UI Scroll", + "type": "Value", + "id": "c283b939-751f-426e-8462-142a529993e3", + "expectedControlType": "Vector2", + "processors": "InvertVector2(invertY=false)", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Translate Manipulation", + "type": "Value", + "id": "6f7cf253-7062-443b-b10f-2be48a33f027", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Rotate Manipulation", + "type": "Value", + "id": "9b5d8312-f609-4895-b70f-81a722b2ae11", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Manipulation", + "type": "Value", + "id": "b950a329-6492-4e29-b563-afc726f81e95", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Scale Toggle", + "type": "Button", + "id": "5ad73d15-99a4-4bce-a76f-f49815602416", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Scale Over Time", + "type": "Value", + "id": "19a21f59-bd21-4f77-b29d-4fda26ef6769", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "1ce80054-410d-4112-a332-50faa7fb4f23", + "path": "{RightHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1d5b47ea-64e3-4b99-b620-de6c360908be", + "path": "{RightHand}/indexPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1fe3ab58-51f3-4274-995c-176ac72d9610", + "path": "{RightHand}/graspFirm", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f6083118-4e38-45a2-afaf-52fa60444f78", + "path": "{RightHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82f232f1-6246-4d1e-aacc-a7ccc16c76d9", + "path": "{RightHand}/squeezePressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "69580c32-8c9a-47d9-8b23-b53d760ca5da", + "path": "{RightHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fe3bfc2a-3586-4334-8b73-d6d5f4d46f68", + "path": "/click", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "6e62575c-e262-4a40-91f0-8a4dd9ffb2d9", + "path": "{RightHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ffad08e7-8ce9-47a3-b22c-a5295117a45a", + "path": "{RightHand}/graspFirm", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "dd433817-216c-46b9-8dd3-f3a4ea1767b9", + "path": "{RightHand}/{Grip}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "770a07b5-a199-4342-b4a5-b3baafbe2bcb", + "path": "{RightHand}/pinchStrengthIndex", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e8d22d4b-ac0c-452b-9f5e-247f94754302", + "path": "{RightHand}/graspValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c850e784-816f-4df7-8759-a725cb4a84bf", + "path": "{RightHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e890a130-d436-4b52-a092-bff81d18bfb7", + "path": "{RightHand}/squeeze", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "0a8a448a-b838-4e13-8eeb-3e3a95e88f2f", + "path": "{RightHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c184e047-2003-4172-9a3d-af4fcbaae04f", + "path": "{RightHand}/graspValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "Select Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fa59aed1-ae0b-4074-a58c-294b85f46228", + "path": "{RightHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Activate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "150f414f-61bf-47b1-b4f8-f772a2a40565", + "path": "{RightHand}/{Trigger}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Activate Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "92bb5b8f-bf48-4dab-af05-50a865773895", + "path": "{RightHand}/{TriggerButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1652c26e-d835-461f-b46b-55b146fd9bba", + "path": "{RightHand}/indexPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7ae41e93-9c2b-4d15-8387-0eddbc823053", + "path": "{RightHand}/pointerActivated", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f8a900c7-8116-4f44-9d24-8f19caf07108", + "path": "{RightHand}/selectPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a65008a0-f3b6-4060-b3a0-3eabaf0563bf", + "path": "{RightHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9f9680ed-d2d2-48bc-9df6-457972fa3d52", + "path": "{RightHand}/pinchTouched", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "174a58ab-1be9-47d5-ab2d-0dcfb077b490", + "path": "/click", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5b4ef08d-9ddd-4f0a-8539-d1114d14d143", + "path": "{RightHand}/{Trigger}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "620cd3c3-a8c2-4a24-825a-ef6eb1cb41ef", + "path": "{RightHand}/pinchStrengthIndex", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4bfac4d7-1bce-4fa7-a6b1-00eb7e5f346e", + "path": "{RightHand}/pointerActivateValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e2fbf204-5031-483f-beaa-abf05113dbc7", + "path": "{RightHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "52496581-824b-4081-94aa-9a1ab52f636d", + "path": "{RightHand}/pinchValue", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Press Value", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5c0fa06c-b670-477f-a95d-eb3b4880e439", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(y=0),StickDeadzone", + "groups": "", + "action": "Rotate Manipulation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "af6fd279-2f48-4f51-8e9d-29b0b9d926f8", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "", + "action": "UI Scroll", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d8258e49-f7cc-44d7-bc27-77c2161e2005", + "path": "{RightHand}/{Primary2DAxisClick}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Scale Toggle", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ef10c39a-2987-41bb-bb80-0e476240adaa", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(x=0),StickDeadzone", + "groups": "", + "action": "Scale Over Time", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c4b46d7d-8231-4672-83f9-75af565faf57", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "StickDeadzone", + "groups": "", + "action": "Manipulation", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4caf4e8d-13e5-4bd6-8f42-b6b99c315ad0", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "ScaleVector2(x=0),StickDeadzone", + "groups": "", + "action": "Translate Manipulation", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI Right Locomotion", + "id": "99ce76d3-82c5-4289-9670-2ecffa6833fd", + "actions": [ + { + "name": "Teleport Mode", + "type": "Value", + "id": "a6c7231d-c55d-4dd4-9e87-877bb5522ef5", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Teleport Mode Cancel", + "type": "Button", + "id": "d587b60c-39a0-4365-8075-477ce484ba0f", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Turn", + "type": "Value", + "id": "9fb2eb2b-2fb6-4328-8167-10a1bf11b424", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Snap Turn", + "type": "Value", + "id": "44441ad6-5762-466d-ad54-aa44fcd61a5c", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Move", + "type": "Value", + "id": "00a4dc9f-1ee6-4349-b0e9-72d5dccaadd6", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grab Move", + "type": "Button", + "id": "cfb29d37-3db0-4e5d-a73b-7d48a19e279e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "01c7fda4-9c15-4167-8b87-58024f21d903", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "62690862-4688-4010-975b-b3d9c6062157", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "Sector(directions=1)", + "processors": "", + "groups": "", + "action": "Teleport Mode", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "de466e6e-12bf-46a1-b0fd-ffbc343f3399", + "path": "{RightHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Teleport Mode Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d6c08c3d-3d41-4695-994d-1ac9016a5a9e", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "Sector(directions=12,sweepBehavior=1),Sector(directions=2,sweepBehavior=2)", + "processors": "", + "groups": "", + "action": "Turn", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "022046aa-be71-4288-859d-6dd42844f6e6", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "", + "processors": "StickDeadzone", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7ecb549e-ab98-4a4b-b979-38068fe3b811", + "path": "{RightHand}/{GripButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grab Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "31d838df-4d4e-4c16-a373-b9c07d9d2e2a", + "path": "{RightHand}/{Primary2DAxis}", + "interactions": "Sector(directions=12,sweepBehavior=1),Sector(directions=2,sweepBehavior=2)", + "processors": "", + "groups": "", + "action": "Snap Turn", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "052b129b-fc83-4b33-a606-af10ad595c3e", + "path": "{RightHand}/{PrimaryButton}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "XRI UI", + "id": "edd65a7c-601c-4915-8307-025a081d8790", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "c9a92aca-49d5-4910-8ade-8e994f0a31f0", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "eba98c2e-6268-4233-bb88-946287bc753c", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "448b396b-0885-4543-ac5a-8b3405da6791", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "682022c0-857a-4332-8753-7f8fcdf84d37", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "b194cd98-7e4f-457a-a60c-cebc25dc32a2", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "bd7fc534-75e3-489d-94fb-3d45cb78d8f3", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "cc5f5666-a75c-4dfc-8566-ded8ec9b4ae3", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "533aeb95-18b2-4a83-a69d-f6e0be72ff8a", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "e87fa299-8441-4620-89dd-0564c7d552e2", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "445a013e-9c17-48a2-9856-067e4826df03", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "05c1e38e-79dd-41cb-95d5-74f42e65d92f", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "029b1a68-89af-484c-904f-be2b56b0b89c", + "path": "/click", + "interactions": "", + "processors": "", + "groups": "", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "57909bb4-1088-4975-9227-ecc87a305257", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "2740386d-d4b6-4342-903c-d9390783f04a", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": "", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9a4ffad3-ad80-4d97-a288-9a117b21d65b", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": "", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d6fd3bb5-c747-4eba-b599-1c6d7c738e2a", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": "", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "673084aa-69c2-4192-9c12-6bca1d428778", + "path": "/tertiaryClick", + "interactions": "", + "processors": "", + "groups": "", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fb2286cc-fa20-4564-bff6-9f790f12cf6b", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7311e597-1971-4442-a9b3-c1de5a20b586", + "path": "/secondaryClick", + "interactions": "", + "processors": "", + "groups": "", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "54eb7da2-546a-4d75-bfcc-ae38be303a59", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Gamepad", + "id": "4c9a5170-d325-45ee-8ef9-fc12d1f5a97e", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "c846c708-b27e-4ac9-9a83-c80ac5c263d5", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "caf2fb01-3e95-47c1-8663-315057149d48", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "830d65e9-887d-45b4-8386-562deb29e465", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "e5c71442-9909-46d8-aa56-8fa3574a8227", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "210246e8-c3c4-4edc-be9c-1916858346df", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "fb701ef0-9910-4639-80d1-2c1c03f871ed", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "3de9f409-fb44-4311-8705-b4f4e7cd3029", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "bd001ba1-d6a2-4a97-9c87-36b5b92728af", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fcc0a2cd-a126-43ad-bb1e-ffc1ae7668c7", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "65cbb13a-6e00-4973-9887-e49e06575091", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3c5803e2-42d0-4d48-bbd6-41ce4442df0b", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "d5b1219c-0df6-4bc5-ad11-205b748cade4", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "065d2394-f10a-46df-b6cb-2c56a6c842ea", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "29921809-7785-44a1-a316-e96307174552", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "49817cc8-fecc-406d-a187-6393de317e95", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "ef33431d-17d0-4e1c-90f2-bbaa2ef9a8b7", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "5ddfdce2-0f11-4f4e-8931-0ae6fb289ac7", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "5ceab4e0-1600-4bfb-acf6-8d02c4e10aea", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "94e10d8b-5bfa-439d-afae-b975efac2b7b", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "9fc7d14a-385d-4ca5-b185-906e049b7eed", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d7e5e0c4-05dc-4f2f-8649-a66fe843caed", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "76ab9656-e168-4b2c-9a6b-d8d6da981e4f", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "ad7bc5b3-6ada-42a2-9cba-5c7334cba7be", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9f2a7c29-a588-4b6a-a966-955eb408c526", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "67f51768-1493-4444-b118-82d398a16fdd", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "198e6869-709e-448d-96d4-27186c9d56e6", + "path": "/Press", + "interactions": "", + "processors": "", + "groups": "", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} diff --git a/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions.meta b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions.meta new file mode 100644 index 000000000..962534873 --- /dev/null +++ b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 2924cdc729619de4a8f9d4046047a886 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/Assets/Gothic-VR/Scripts/Adapters/Context/VRContextBootstrap.cs b/Assets/Gothic-VR/Scripts/Adapters/Context/VRContextBootstrap.cs index 94a0c7f45..3cd2f663c 100644 --- a/Assets/Gothic-VR/Scripts/Adapters/Context/VRContextBootstrap.cs +++ b/Assets/Gothic-VR/Scripts/Adapters/Context/VRContextBootstrap.cs @@ -1,9 +1,11 @@ -using System; using Gothic.Core.Adapters.Context; using Gothic.Core.Extensions; using Gothic.Core.Logging; +using Gothic.Core.Models.Config; using Gothic.Core.Models.Context; +using Gothic.Core.Services.Config; using Gothic.Core.Services.Context; +using Gothic.VR.Interaction.Backends.Xri; using Gothic.VR.Interaction.Ports; using Gothic.VR.Services.Context; using Reflex.Attributes; @@ -25,17 +27,45 @@ public class VRContextBootstrap : AbstractContextBootstrap [Inject] private readonly ContextMenuService _contextMenuService; [Inject] private readonly ContextDialogService _contextDialogService; [Inject] private readonly ContextTextInputService _contextTextInputService; + [Inject] private readonly ConfigService _configService; + +#if GOTHIC_HVR_INSTALLED + public const bool IsHvrInstalled = true; +#else + public const bool IsHvrInstalled = false; +#endif /// - /// Returns the VR backend compiled into this build, or null if none is available. + /// Returns the VR backend requested by DeveloperConfig.VrInteractionBackend. Hvr falls back to Xri if HVR + /// isn't compiled in (no GOTHIC_HVR_INSTALLED). Xri is always available. /// - public static IVrBackend SelectBackend() + public static IVrBackend SelectBackend(DeveloperConfig developerConfig) { + switch (GetEffectiveBackend(developerConfig)) + { #if GOTHIC_HVR_INSTALLED - return new HvrBackend(); -#else - return null; + case VrInteractionBackend.Hvr: + return new HvrBackend(); #endif + default: + return new XriBackend(); + } + } + + /// + /// The backend which SelectBackend() creates. Without a DeveloperConfig (e.g. not set yet), HVR is used if + /// installed, otherwise XRI. + /// + public static VrInteractionBackend GetEffectiveBackend(DeveloperConfig developerConfig) + { + var requested = developerConfig == null + ? (IsHvrInstalled ? VrInteractionBackend.Hvr : VrInteractionBackend.Xri) + : developerConfig.VrInteractionBackend; + + if (requested == VrInteractionBackend.Hvr && !IsHvrInstalled) + return VrInteractionBackend.Xri; + + return requested; } protected override void RegisterControlModule(Controls controls) @@ -43,14 +73,13 @@ protected override void RegisterControlModule(Controls controls) if (controls != Controls.VR) return; - var backend = SelectBackend(); - if (backend == null) + var developerConfig = _configService.Dev; + var backend = SelectBackend(developerConfig); + if (developerConfig != null && developerConfig.VrInteractionBackend == VrInteractionBackend.Hvr && + !IsHvrInstalled) { - const string message = "VR controls are set, but no VR backend is available. " + - "Set DeveloperConfig > Controls.GameControls = Flat, or install a VR backend " + - "(e.g. HVR, plus scripting define >GOTHIC_HVR_INSTALLED<)."; - Logger.LogError(message, LogCat.VR); - throw new ArgumentException(message); + Logger.LogWarning("DeveloperConfig.VrInteractionBackend is Hvr, but HVR isn't installed " + + "(no scripting define >GOTHIC_HVR_INSTALLED<). Falling back to XRI.", LogCat.VR); } Logger.Log($"VR backend: {backend.Name}", LogCat.VR); diff --git a/Assets/Gothic-VR/Scripts/Gothic.VR.asmdef b/Assets/Gothic-VR/Scripts/Gothic.VR.asmdef index 3f80e02b7..41cf96aab 100644 --- a/Assets/Gothic-VR/Scripts/Gothic.VR.asmdef +++ b/Assets/Gothic-VR/Scripts/Gothic.VR.asmdef @@ -10,7 +10,8 @@ "GUID:0d8f4c49947fe5d4fa1d45d830f1681a", "GUID:e40ba710768534012815d3193fa296cb", "GUID:5a20be0fd8f247ccb50f69086136ea87", - "GUID:1530a967b84cfb44dbdd5e8a1989764f" + "GUID:1530a967b84cfb44dbdd5e8a1989764f", + "GUID:fe685ec1767f73d42b749ea8045bfe43" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri.meta new file mode 100644 index 000000000..022728858 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 49b595ee08adfdf4fbabff0f5286d7cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs new file mode 100644 index 000000000..6592782f1 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs @@ -0,0 +1,28 @@ +using Gothic.Core.Logging; +using Gothic.VR.Interaction.Ports; +using Reflex.Core; +using Logger = Gothic.Core.Logging.Logger; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// XR Interaction Toolkit backend. Always compiled, as XRI is a free package. + /// Implemented: input, haptics, SFX. Missing: the XRI player rig (IVrRig, HVR phase 1b) and the UI laser pointers + /// (IVrUiPointers, HVR phase 1c; registered as a placeholder which only warns). + /// + public class XriBackend : IVrBackend + { + public string Name => "XR Interaction Toolkit"; + + public void InstallBindings(ContainerBuilder containerBuilder) + { + Logger.LogWarning("XRI backend is work in progress: input and haptics work. The XRI player rig " + + "(HVR phase 1b) and UI laser pointers (phase 1c) are missing.", LogCat.VR); + + containerBuilder.AddSingleton(typeof(XriInput), typeof(IVrInput), typeof(XriInput)); + containerBuilder.AddSingleton(typeof(XriHaptics), typeof(IVrHaptics)); + containerBuilder.AddSingleton(typeof(XriUiPointers), typeof(IVrUiPointers)); + containerBuilder.AddSingleton(typeof(XriSfxPlayer), typeof(IVrSfxPlayer)); + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs.meta new file mode 100644 index 000000000..02f73aed4 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bf2e5819b9fc37549a491e139cf70ad8 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs new file mode 100644 index 000000000..24fbddbb5 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs @@ -0,0 +1,14 @@ +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Gothic actions of the "Gothic" map in GothicVR.inputactions. Read by the XRI rig (locomotion), not by game + /// code, which uses IVrInput.GetButton(). + /// + public enum XriGothicAction + { + Menu, + Jump, + Crouch, + Sprint + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs.meta new file mode 100644 index 000000000..076f60a15 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGothicAction.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a5d4464932eeb2b4ba57d7667c537bb5 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs new file mode 100644 index 000000000..b8e8f7896 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs @@ -0,0 +1,78 @@ +using Gothic.Core.Logging; +using Gothic.VR.Interaction.Models; +using Gothic.VR.Interaction.Ports; +using UnityEngine.InputSystem; +using UnityEngine.XR.Interaction.Toolkit.Inputs.Haptics; +using Logger = Gothic.Core.Logging.Logger; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Sends the haptic presets through the "Haptic" actions of GothicVR.inputactions (same mechanism as XRI's + /// HapticImpulsePlayer, but without needing a component on the rig). + /// + public class XriHaptics : IVrHaptics + { + // Indexed by VrHapticPreset. Same values as the HVR backend sends to the device: HVR's + // HapticData(duration, amplitude, frequency) constructor gets them in that order. + private static readonly (float Amplitude, float Duration, float Frequency)[] _presets = + { + // Info + (0.25f, 0.15f, 30f), + + // Warning + (0.5f, 0.25f, 100f), + + // Error + (0.8f, 0.4f, 175f), + + // Success + (0.6f, 0.5f, 80f) + }; + + private readonly XriInput _input; + private readonly XRInputHapticImpulseProvider[] _providers = new XRInputHapticImpulseProvider[2]; + private readonly bool[] _isMissingDeviceLogged = new bool[2]; + + public XriHaptics(XriInput input) + { + _input = input; + } + + public void Vibrate(VrHandSide side, VrHapticPreset preset) + { + var channel = GetProvider(side)?.GetChannelGroup()?.GetChannel(); + if (channel == null) + { + if (!_isMissingDeviceLogged[(int)side]) + { + Logger.LogWarning($"XRI backend: no haptic device for {side} hand. Vibration skipped.", LogCat.VR); + _isMissingDeviceLogged[(int)side] = true; + } + + return; + } + + var (amplitude, duration, frequency) = _presets[(int)preset]; + channel.SendHapticImpulse(amplitude, duration, frequency); + } + + private XRInputHapticImpulseProvider GetProvider(VrHandSide side) + { + if (_providers[(int)side] != null) + return _providers[(int)side]; + + var action = _input.GetHapticAction(side); + if (action == null) + return null; + + _providers[(int)side] = new XRInputHapticImpulseProvider + { + inputSourceMode = XRInputHapticImpulseProvider.InputSourceMode.InputActionReference, + inputActionReference = InputActionReference.Create(action) + }; + + return _providers[(int)side]; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs.meta new file mode 100644 index 000000000..a019b4d28 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriHaptics.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f258bdb39f60a84488a6827f5622ed18 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs new file mode 100644 index 000000000..343decabb --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs @@ -0,0 +1,131 @@ +using Gothic.Core.Extensions; +using Gothic.Core.Logging; +using Gothic.VR.Interaction.Models; +using Gothic.VR.Interaction.Ports; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.SceneManagement; +using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation; +using Logger = Gothic.Core.Logging.Logger; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Controller input from GothicVR.inputactions (maps "Gothic Left", "Gothic Right" and "Gothic"). + /// The XRI maps of the same asset are enabled by the XRI rig's components, not here. + /// + public class XriInput : IVrInput + { + public const string InputActionsResourcePath = "VR/Input/GothicVR"; + + private const string _leftHandMapName = "Gothic Left"; + private const string _rightHandMapName = "Gothic Right"; + private const string _gothicMapName = "Gothic"; + private const string _velocityActionName = "Velocity"; + private const string _hapticActionName = "Haptic"; + + // Indexed by VrButton. + private static readonly string[] _buttonActionNames = + { + "Grip", "Trigger", "Primary", "Secondary", "Menu", "Joystick Button" + }; + + // Indexed by XriGothicAction. + private static readonly string[] _gothicActionNames = { "Menu", "Jump", "Crouch", "Sprint" }; + + private readonly InputAction[,] _buttons = new InputAction[2, _buttonActionNames.Length]; + private readonly InputAction[] _velocities = new InputAction[2]; + private readonly InputAction[] _haptics = new InputAction[2]; + private readonly InputAction[] _gothicActions = new InputAction[_gothicActionNames.Length]; + + private XRInteractionSimulator _simulator; + private bool _isSimulatorActive; + + public InputActionAsset Actions { get; } + + public bool IsSimulator => _isSimulatorActive && _simulator != null && _simulator.isActiveAndEnabled; + + public XriInput() + { + Actions = Resources.Load(InputActionsResourcePath); + if (Actions == null) + { + Logger.LogError($"XRI input actions not found at Resources/{InputActionsResourcePath}. " + + "VR controller input won't work.", LogCat.VR); + return; + } + + InitHand(VrHandSide.Left, _leftHandMapName); + InitHand(VrHandSide.Right, _rightHandMapName); + + var gothicMap = Actions.FindActionMap(_gothicMapName, true); + for (var i = 0; i < _gothicActionNames.Length; i++) + _gothicActions[i] = gothicMap.FindAction(_gothicActionNames[i], true); + gothicMap.Enable(); + } + + private void InitHand(VrHandSide side, string mapName) + { + var map = Actions.FindActionMap(mapName, true); + for (var i = 0; i < _buttonActionNames.Length; i++) + _buttons[(int)side, i] = map.FindAction(_buttonActionNames[i], true); + + _velocities[(int)side] = map.FindAction(_velocityActionName, true); + _haptics[(int)side] = map.FindAction(_hapticActionName, true); + map.Enable(); + } + + public VrButtonState GetButton(VrHandSide side, VrButton button) + { + return ToState(_buttons[(int)side, (int)button]); + } + + /// + /// Gothic-specific actions (jump, crouch, sprint, menu) incl. their simulator keys. + /// + public VrButtonState GetGothicAction(XriGothicAction action) + { + return ToState(_gothicActions[(int)action]); + } + + public Vector3 GetControllerVelocity(VrHandSide side) + { + var action = _velocities[(int)side]; + return action == null ? Vector3.zero : action.ReadValue(); + } + + /// + /// Pass-through action bound to the controller device, used to send haptic impulses. + /// + public InputAction GetHapticAction(VrHandSide side) + { + return _haptics[(int)side]; + } + + public void SetDeviceSimulatorActive(bool isActive) + { + _isSimulatorActive = isActive; + + if (_simulator == null) + _simulator = SceneManager.GetActiveScene().GetComponentInChildren(true); + + if (_simulator == null) + { + if (isActive) + Logger.LogWarning("XRI backend: no XR Interaction Simulator in the active scene. " + + "It's added to the player scene with HVR phase 1d.", LogCat.VR); + return; + } + + _simulator.gameObject.SetActive(isActive); + } + + private static VrButtonState ToState(InputAction action) + { + if (action == null) + return default; + + return new VrButtonState(action.IsPressed(), action.WasPressedThisFrame(), action.WasReleasedThisFrame()); + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs.meta new file mode 100644 index 000000000..0768623e1 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 457359140fd5a5a489886793d48cbd94 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs new file mode 100644 index 000000000..967621237 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Gothic.VR.Interaction.Ports; +using UnityEngine; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Minimal 3D one-shot player via AudioSource.PlayClipAtPoint (fully spatial, default rolloff, no mixer group). + /// HVR's pool used a reference AudioSource from HVRGlobal.prefab; an own pool with the same settings is a later + /// phase. + /// + public class XriSfxPlayer : IVrSfxPlayer + { + private readonly Dictionary _lastPlayTimes = new(); + + public void Play(AudioClip clip, Vector3 position) + { + if (clip == null) + return; + + AudioSource.PlayClipAtPoint(clip, position); + } + + public void PlayWithCooldown(AudioClip clip, Vector3 position, Guid sourceId, float cooldownTime) + { + if (_lastPlayTimes.TryGetValue(sourceId, out var lastPlayTime) && Time.time - lastPlayTime < cooldownTime) + return; + + _lastPlayTimes[sourceId] = Time.time; + Play(clip, position); + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs.meta new file mode 100644 index 000000000..18e114080 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSfxPlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1027cae857758ee4a9c0a4f6f9290455 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs new file mode 100644 index 000000000..8af62e105 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs @@ -0,0 +1,51 @@ +using Gothic.Core.Logging; +using Gothic.VR.Interaction.Models; +using Gothic.VR.Interaction.Ports; +using UnityEngine; +using UnityEngine.EventSystems; +using Logger = Gothic.Core.Logging.Logger; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// NOT IMPLEMENTED YET (HVR phase 1c): XRUIInputModule, TrackedDeviceGraphicRaycaster per canvas and the + /// interactor-to-hand lookup. Until then, no UI laser pointers exist on the XRI backend and every call only logs + /// a single warning. + /// + public class XriUiPointers : IVrUiPointers + { + private bool _isWarningLogged; + + public void RegisterCanvas(Canvas canvas) + { + LogNotImplemented(); + } + + public void UnregisterCanvas(Canvas canvas) + { + LogNotImplemented(); + } + + public void RegisterAllCanvases() + { + LogNotImplemented(); + } + + public bool TryGetHandSide(PointerEventData eventData, out VrHandSide side) + { + LogNotImplemented(); + side = default; + return false; + } + + private void LogNotImplemented() + { + if (_isWarningLogged) + return; + + Logger.LogWarning("XRI backend: UI laser pointers aren't implemented yet (HVR phase 1c). " + + "Menus can't be clicked with the controllers.", LogCat.VR); + _isWarningLogged = true; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs.meta new file mode 100644 index 000000000..359dddbf6 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ff1f0b73dd866294bafa7ae1e4d14251 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/ReflexVRSceneInstaller.cs b/Assets/Gothic-VR/Scripts/ReflexVRSceneInstaller.cs index 766db0e4f..9e0cd3c38 100644 --- a/Assets/Gothic-VR/Scripts/ReflexVRSceneInstaller.cs +++ b/Assets/Gothic-VR/Scripts/ReflexVRSceneInstaller.cs @@ -1,10 +1,9 @@ using Gothic.Core; -using Gothic.Core.Logging; +using Gothic.Core.Services.Config; using Gothic.VR.Adapters.Context; using Gothic.VR.Services; using Reflex.Core; using UnityEngine; -using Logger = Gothic.Core.Logging.Logger; namespace Gothic.VR { @@ -17,13 +16,10 @@ public void InstallBindings(ContainerBuilder containerBuilder) { containerBuilder.OnContainerBuilt += (container) => ReflexProjectInstaller.DIContainer = container; - // VR ports (IVrInput, IVrHaptics, ...) come from the active backend. - // Without a backend, nothing is registered and VRContextBootstrap fails the boot with a clear error. - var backend = VRContextBootstrap.SelectBackend(); - if (backend == null) - Logger.LogError("No VR backend available. VR ports aren't registered.", LogCat.VR); - else - backend.InstallBindings(containerBuilder); + // VR ports (IVrInput, IVrHaptics, ...) come from the active backend (DeveloperConfig.VrInteractionBackend). + // At this point, DIContainer is still the parent (project) container. + var developerConfig = ReflexProjectInstaller.DIContainer?.Resolve().Dev; + VRContextBootstrap.SelectBackend(developerConfig).InstallBindings(containerBuilder); containerBuilder.AddSingleton(typeof(VRPlayerService)); containerBuilder.AddSingleton(typeof(VRWeaponService)); diff --git a/Assets/Gothic-VR/Scripts/Services/Context/VRContextInteractionService.cs b/Assets/Gothic-VR/Scripts/Services/Context/VRContextInteractionService.cs index f04cb3bef..64e49f54f 100644 --- a/Assets/Gothic-VR/Scripts/Services/Context/VRContextInteractionService.cs +++ b/Assets/Gothic-VR/Scripts/Services/Context/VRContextInteractionService.cs @@ -111,6 +111,15 @@ public void SetupPlayerController(DeveloperConfig developerConfig) // VR Player: Gothic part and the backend's rig live on the same GameObject. _player = activeScene.GetComponentInChildren(true)!; _rig = _player.GetComponent(); + if (_rig == null) + { + // e.g., VrInteractionBackend = Xri before the XRI rig exists (HVR phase 1b) and without HVR installed. + const string message = "VR player has no IVrRig (rig of the active VR backend). " + + "Check DeveloperConfig.VrInteractionBackend and the rigs in Player.unity."; + Logger.LogError(message, LogCat.VR); + throw new MissingComponentException(message); + } + _player.transform.parent.parent.gameObject.SetActive(true); _defaultStepOffset = _rig.StepOffset; ApplyComfortSettings(true); diff --git a/Assets/XRI.meta b/Assets/XRI.meta new file mode 100644 index 000000000..012557522 --- /dev/null +++ b/Assets/XRI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3440afc307929ce44bfdf9997819fa20 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings.meta b/Assets/XRI/Settings.meta new file mode 100644 index 000000000..bf4644322 --- /dev/null +++ b/Assets/XRI/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5386dc25fd0da34b8370c977245b747 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings/Resources.meta b/Assets/XRI/Settings/Resources.meta new file mode 100644 index 000000000..57b69446b --- /dev/null +++ b/Assets/XRI/Settings/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc8a582d373b171419f5319e333c751b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset b/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset new file mode 100644 index 000000000..87dbbee29 --- /dev/null +++ b/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 191492db6e452eb468b95433ec162164, type: 3} + m_Name: InteractionLayerSettings + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.InteractionLayerSettings + m_LayerNames: + - Default + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - diff --git a/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset.meta b/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset.meta new file mode 100644 index 000000000..cededb6a7 --- /dev/null +++ b/Assets/XRI/Settings/Resources/InteractionLayerSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b4028f922ec49c5418135e5dec070af3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset b/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset new file mode 100644 index 000000000..d35bf348f --- /dev/null +++ b/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 690929a59dc7a42da9030305190d391f, type: 3} + m_Name: XRDeviceSimulatorSettings + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation.XRDeviceSimulatorSettings + m_AutomaticallyInstantiateSimulatorPrefab: 0 + m_AutomaticallyInstantiateInEditorOnly: 1 + m_UseClassic: 0 + m_SimulatorPrefab: {fileID: 0} diff --git a/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset.meta b/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset.meta new file mode 100644 index 000000000..b9519b6ac --- /dev/null +++ b/Assets/XRI/Settings/Resources/XRDeviceSimulatorSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3be9e95852f3e8e499d804683f570cdd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset b/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset new file mode 100644 index 000000000..e49708515 --- /dev/null +++ b/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6997f42bad4642c489acf04ed9ac1414, type: 3} + m_Name: XRInteractionRuntimeSettings + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.XRInteractionRuntimeSettings + m_ManagerCreationMode: 0 + m_InteractionManagerSingletonMode: 0 + m_InteractionManagerRegistrationMode: 0 + m_UIModuleRegistrationMode: 0 diff --git a/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset.meta b/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset.meta new file mode 100644 index 000000000..c41041e0b --- /dev/null +++ b/Assets/XRI/Settings/Resources/XRInteractionRuntimeSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3db2a3724f08df442ae1babd6711efbf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XRI/Settings/XRInteractionEditorSettings.asset b/Assets/XRI/Settings/XRInteractionEditorSettings.asset new file mode 100644 index 000000000..17550f464 --- /dev/null +++ b/Assets/XRI/Settings/XRInteractionEditorSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2d38fb1463c5c804b8847c20e8873623, type: 3} + m_Name: XRInteractionEditorSettings + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit.Editor::UnityEditor.XR.Interaction.Toolkit.XRInteractionEditorSettings + m_InputReaderPropertyDrawerMode: 0 diff --git a/Assets/XRI/Settings/XRInteractionEditorSettings.asset.meta b/Assets/XRI/Settings/XRInteractionEditorSettings.asset.meta new file mode 100644 index 000000000..f7f8172a0 --- /dev/null +++ b/Assets/XRI/Settings/XRInteractionEditorSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5170312514b9df94581375084183b96f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md b/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md index d5ddc86bc..93cd86bf0 100644 --- a/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md +++ b/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md @@ -18,18 +18,31 @@ menus and dialogs, and watch videos, on a headset or in the simulator. Grabbing ## Packages -- Add `com.unity.xr.interaction.toolkit` 3.x. Pin an exact version that is at least 2 weeks old and compatible with +- [x] Add `com.unity.xr.interaction.toolkit` 3.x. Pin an exact version that is at least 2 weeks old and compatible with Unity 6000.3 (check the package manager "compatible" list). `com.unity.inputsystem` and `com.unity.xr.core-utils` - come in as dependencies. -- Import the samples **Starter Assets** (input actions, reference rig) and **XR Interaction Simulator**. Copy what we + come in as dependencies. (1a: **3.6.1**, latest stable in the compatible list, published 2026-09-17. Unity's + "recommended" for 6000.3 is still 3.3.2. Input System 1.19 and core-utils were already installed. XRI created its + settings assets in `Assets/XRI/Settings/`, which are committed.) +- [x] Import the samples **Starter Assets** (input actions, reference rig) and **XR Interaction Simulator**. Copy what we need into `Gothic-VR/` and don't reference the `Samples/` folder from our prefabs, so a sample re-import can't break - us. + us. (1a: only the input actions are copied so far. `Assets/Samples/` is **git-ignored**: 44 MB of demo content + that can be re-imported from the Package Manager, and a fresh clone without it shows any accidental reference as + missing. Import both samples locally (Package Manager > XR Interaction Toolkit > Samples) before copying more, + e.g. the reference rig (1b) or the simulator prefab (1d). Copied prefabs that use sample scripts need those + scripts copied too.) - Keep OpenXR 1.16, the Meta Quest feature, `pico-openxr-sdk` and XR Hands 1.7 as they are. XRI uses exactly these. ## Backend switch -- Add `DeveloperConfig.VrInteractionBackend { Hvr, Xri }`: the C# field **and** the value in the DeveloperConfig +- [x] Add `DeveloperConfig.VrInteractionBackend { Hvr, Xri }`: the C# field **and** the value in the DeveloperConfig asset (see the `feature-checklist` skill). Default `Hvr` while HVR is installed, `Xri` otherwise. + (1a: enum `Gothic.Core.Models.Context.VrInteractionBackend` (`Hvr = 0`, `Xri = 1`); `Production.asset` and + `Lab.HVR.Simulator.asset` set to `Hvr`. "Xri otherwise" is a runtime fallback: `VRContextBootstrap.SelectBackend()` + returns the XRI backend when `Hvr` is requested but `GOTHIC_HVR_INSTALLED` is missing, with a warning. + `ReflexVRSceneInstaller` and `VRContextBootstrap` both call `SelectBackend(DeveloperConfig)`; it can't return + null any more. `XriBackend` registers `XriInput`, `XriHaptics`, `XriSfxPlayer` (minimal `PlayClipAtPoint`, no + pool) and a placeholder `XriUiPointers` that only warns until 1c. Without an `IVrRig` on the player, + `SetupPlayerController` now fails with a clear error instead of a NullReferenceException.) - `Player.unity` (and `Lab.unity`) contain both rigs, disabled. `VRContextInteractionService.SetupPlayerController` enables the one matching the backend (today it already enables `transform.parent.parent`). - The Xri backend files carry no define, since XRI is free and always installed. The Hvr backend stays behind @@ -87,6 +100,22 @@ Start from the Starter Assets actions and add Gothic actions per hand: `XriInput : IVrInput` reads the actions and keeps a `VrButtonState` per hand/button (pressed this frame / held / released this frame). `IsSimulator` is true when the simulator is active. +- [x] Done in 1a. `GothicVR.inputactions` = the Starter Assets actions (without the mobile-AR maps "Touchscreen + Gestures" and "Android Mouse Interaction") plus three own maps: + - `Gothic Left` / `Gothic Right`: `Grip`, `Trigger`, `Primary`, `Secondary`, `Menu`, `Joystick Button` (bound via + the generic `{Hand}/{Usage}` paths, order = `VrButton`), `Velocity` (`deviceVelocity` or + `devicePose/velocity`, for swimming) and `Haptic` (pass-through on the device, for `XriHaptics`). + - `Gothic`: `Menu`, `Jump`, `Crouch`, `Sprint` with the controller bindings and simulator keys from the table. + Read by the XRI rig via `XriInput.GetGothicAction(XriGothicAction)`. The keyboard bindings are always active + (not only in the simulator); 1d should check them against the simulator's own keys. Vive trackpad-up crouch is + not bound. + - BothGrips and SkipVideo stay derived in `VRPlayer` / `VRCinema` from `IVrInput.GetButton`, no own actions. + - `XriInput` enables only the three `Gothic*` maps. The `XRI *` maps are left for the rig's components (1b), + e.g. via an `InputActionManager` on the rig. + - `VrButtonState` comes from `InputAction.IsPressed()` / `WasPressedThisFrame()` / `WasReleasedThisFrame()`. + - `IsSimulator` / `SetDeviceSimulatorActive` look for an `XRInteractionSimulator` in the active scene (warning if + missing until 1d). + ## Haptics `XriHaptics : IVrHaptics` uses one `HapticImpulsePlayer` per controller. Map the presets from `VrHapticsService` @@ -94,6 +123,13 @@ released this frame). `IsSimulator` is true when the simulator is active. Success 0.5/0.6/80). Note: HVR's `HapticData(duration, amplitude, frequency)` argument order. Check it and keep the same perceived strength. +- [x] Done in 1a. Checked: `HapticData`'s constructor is `(duration, amplitude, frequency)`, so the values listed + above (written as amplitude/duration/frequency in `HvrHaptics`) were really sent as amplitude 0.25/0.5/0.8/0.6 and + duration 0.15/0.25/0.4/0.5 s. `XriHaptics` sends exactly those (frequencies unchanged), so perceived strength stays + the same. The `HvrHaptics` comment is misleading but left untouched (Hvr backend unchanged). + Deviation: no `HapticImpulsePlayer` component; `XriHaptics` builds an `XRInputHapticImpulseProvider` per hand + from the `Gothic Left/Right/Haptic` actions (what the player does internally), so it needs nothing on the rig. + ## UI - `EventSystem` gets `XRUIInputModule` instead of `HVRInputModule` (rig variant only). diff --git a/Packages/manifest.json b/Packages/manifest.json index 03c602def..27a93e79a 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -2,6 +2,7 @@ "dependencies": { "com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main", "com.domybest.mybox": "https://github.com/Deadcows/MyBox.git", + "com.gothic.core.binaries": "https://github.com/Gothic-Unity-Project/binary-dependencies.git?path=/Core", "com.gustavopsantos.reflex": "https://github.com/gustavopsantos/reflex.git?path=/Assets/Reflex/#12.0.1", "com.hurricanevrextensions.simulator": "https://github.com/Gothic-Unity-Project/hvr-simulator.git", "com.unity.ai.inference": "2.6.0", @@ -15,10 +16,10 @@ "com.unity.render-pipelines.universal": "17.3.0", "com.unity.ugui": "2.0.0", "com.unity.xr.hands": "1.7.3", + "com.unity.xr.interaction.toolkit": "3.6.1", "com.unity.xr.management": "4.5.4", "com.unity.xr.openxr": "1.16.1", "com.unity.xr.openxr.picoxr": "https://github.com/Gothic-Unity-Project/pico-openxr-sdk.git", - "com.gothic.core.binaries": "https://github.com/Gothic-Unity-Project/binary-dependencies.git?path=/Core", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index fe4c8ebb3..075083f11 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -360,6 +360,22 @@ }, "url": "https://packages.unity.com" }, + "com.unity.xr.interaction.toolkit": { + "version": "3.6.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "2.0.0", + "com.unity.modules.xr": "1.0.0", + "com.unity.inputsystem": "1.8.1", + "com.unity.mathematics": "1.2.6", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.xr.core-utils": "2.4.0", + "com.unity.modules.physics": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.xr.legacyinputhelpers": { "version": "2.1.13", "depth": 1,