From dc278deabac95a797f799e3db6e41113b8ae3d89 Mon Sep 17 00:00:00 2001 From: Vivero Date: Tue, 19 May 2020 15:23:49 -0700 Subject: [PATCH] add mouse interactions using your index fingertip --- .../KerbalVR/Assets/Input/actions.json | 7 +- .../Assets/Input/bindings_knuckles.json | 76 ++- .../Assets/Input/bindings_oculus_touch.json | 505 ++++++++++-------- .../Input/bindings_vive_controller.json | 292 ++++++---- .../InteractionSystem/KerbalVR_Hand.cs | 82 ++- .../SteamVR_Input_ActionSet_flight.cs | 8 + .../SteamVR_Input/SteamVR_Input_Actions.cs | 15 + .../StreamingAssets/SteamVR/actions.json | 7 +- .../SteamVR/bindings_knuckles.json | 76 ++- .../SteamVR/bindings_oculus_touch.json | 505 ++++++++++-------- .../SteamVR/bindings_vive_controller.json | 292 ++++++---- 11 files changed, 1118 insertions(+), 747 deletions(-) diff --git a/KerbalVR_Mod/KerbalVR/Assets/Input/actions.json b/KerbalVR_Mod/KerbalVR/Assets/Input/actions.json index b188cf1f..9d08fc4e 100644 --- a/KerbalVR_Mod/KerbalVR/Assets/Input/actions.json +++ b/KerbalVR_Mod/KerbalVR/Assets/Input/actions.json @@ -61,6 +61,10 @@ "name": "/actions/flight/in/ThrottleStick", "type": "vector2" }, + { + "name": "/actions/flight/in/InteractClick", + "type": "boolean" + }, { "name": "/actions/EVA/in/Teleport", "type": "boolean" @@ -149,7 +153,8 @@ "/actions/flight/in/FlightStick": "Flight Stick", "/actions/flight/in/YawStick": "Yaw Control", "/actions/flight/in/ThrottleStick": "Throttle Control", - "/actions/EVA/in/Teleport": "Teleport" + "/actions/EVA/in/Teleport": "Teleport", + "/actions/flight/in/InteractClick": "Interaction Click" } ] } \ No newline at end of file diff --git a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_knuckles.json b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_knuckles.json index 4c5443d7..6513e059 100644 --- a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_knuckles.json +++ b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_knuckles.json @@ -70,15 +70,6 @@ "mode" : "force_sensor", "path" : "/user/hand/right/input/grip" }, - { - "inputs" : { - "click" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "button", - "path" : "/user/hand/left/input/trackpad" - }, { "inputs" : { "click" : { @@ -88,43 +79,6 @@ "mode" : "button", "path" : "/user/hand/right/input/trigger" }, - { - "inputs" : { - "click" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "button", - "path" : "/user/hand/right/input/trackpad" - }, - { - "inputs" : { - "north" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "dpad", - "parameters" : { - "deadzone_pct" : "25", - "overlap_pct" : "30", - "sub_mode" : "touch" - }, - "path" : "/user/hand/left/input/thumbstick" - }, - { - "inputs" : { - "north" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "dpad", - "parameters" : { - "deadzone_pct" : "25", - "overlap_pct" : "30", - "sub_mode" : "touch" - }, - "path" : "/user/hand/right/input/thumbstick" - }, { "inputs" : { "east" : { @@ -188,6 +142,10 @@ ] }, "/actions/editor" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -210,6 +168,10 @@ ] }, "/actions/eva" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -232,6 +194,10 @@ ] }, "/actions/flight" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -271,6 +237,24 @@ "smooth_scroll_trackpad_aspect_ratio" : "0.6" }, "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/b" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/b" } ] }, diff --git a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_oculus_touch.json b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_oculus_touch.json index 0bbaf55e..3e0ac854 100644 --- a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_oculus_touch.json +++ b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_oculus_touch.json @@ -1,231 +1,290 @@ { - "app_key": "application.generated.unity.kerbalvr_unitysteamvr.exe", - "bindings": { - "/actions/buggy": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [], - "skeleton": [] - }, - "/actions/default": { - "chords": [], - "poses": [ - { - "output": "/actions/default/in/pose", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/default/in/pose", - "path": "/user/hand/right/pose/raw" - } - ], - "haptics": [ - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/right/output/haptic" - } - ], - "sources": [ - { - "path": "/user/hand/left/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" - } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.8", - "click_deactivate_threshold": "0.7" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" - } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" - } - } - }, - { - "path": "/user/hand/left/input/joystick", - "mode": "dpad", - "parameters": { - "deadzone_pct": "85", - "overlap_pct": "0", - "sub_mode": "touch" - }, - "inputs": { - "east": { - "output": "/actions/default/in/snapturnright" - }, - "west": { - "output": "/actions/default/in/snapturnleft" - } - } - }, - { - "path": "/user/hand/right/input/joystick", - "mode": "dpad", - "parameters": { - "deadzone_pct": "85", - "overlap_pct": "0", - "sub_mode": "touch" - }, - "inputs": { - "east": { - "output": "/actions/default/in/snapturnright" - }, - "west": { - "output": "/actions/default/in/snapturnleft" - } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.8", - "click_deactivate_threshold": "0.7" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" - } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + "action_manifest_version" : 0, + "alias_info" : {}, + "app_key" : "application.generated.unity.kerbalvr_unitysteamvr.exe", + "bindings" : { + "/actions/buggy" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], + "sources" : [] + }, + "/actions/default" : { + "chords" : [], + "haptics" : [ + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/left/output/haptic" + }, + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/right/output/haptic" } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ], + "poses" : [ + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/left/pose/raw" + }, + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/right/pose/raw" } - } - } - ], - "skeleton": [ - { - "output": "/actions/default/in/skeletonlefthand", - "path": "/user/hand/left/input/skeleton/left" - }, - { - "output": "/actions/default/in/skeletonrighthand", - "path": "/user/hand/right/input/skeleton/right" - } - ] - }, - "/actions/editor": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [ - { - "path": "/user/hand/left/input/joystick", - "mode": "joystick", - "parameters": {}, - "inputs": { - "position": { - "output": "/actions/editor/in/move" + ], + "skeleton" : [ + { + "output" : "/actions/default/in/skeletonlefthand", + "path" : "/user/hand/left/input/skeleton/left" + }, + { + "output" : "/actions/default/in/skeletonrighthand", + "path" : "/user/hand/right/input/skeleton/right" } - } - }, - { - "path": "/user/hand/right/input/joystick", - "mode": "joystick", - "parameters": {}, - "inputs": { - "position": { - "output": "/actions/editor/in/move" + ], + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.8", + "click_deactivate_threshold" : "0.7" + }, + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trigger" + }, + { + "inputs" : { + "north" : { + "output" : "/actions/default/in/teleport" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "25", + "overlap_pct" : "30", + "sub_mode" : "touch" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "north" : { + "output" : "/actions/default/in/teleport" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "25", + "overlap_pct" : "30", + "sub_mode" : "touch" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "east" : { + "output" : "/actions/default/in/snapturnright" + }, + "west" : { + "output" : "/actions/default/in/snapturnleft" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "85", + "overlap_pct" : "0", + "sub_mode" : "touch" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "east" : { + "output" : "/actions/default/in/snapturnright" + }, + "west" : { + "output" : "/actions/default/in/snapturnleft" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "85", + "overlap_pct" : "0", + "sub_mode" : "touch" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.8", + "click_deactivate_threshold" : "0.7" + }, + "path" : "/user/hand/right/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/grip" } - } - } - ], - "skeleton": [] - }, - "/actions/flight": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [ - { - "path": "/user/hand/right/input/joystick", - "mode": "joystick", - "parameters": { - "deadzone_pct": "10", - "invert": "y" - }, - "inputs": { - "position": { - "output": "/actions/flight/in/flightstick" + ] + }, + "/actions/editor" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "joystick", + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "joystick", + "path" : "/user/hand/right/input/joystick" } - } - }, - { - "path": "/user/hand/left/input/joystick", - "mode": "joystick", - "parameters": { - "deadzone_pct": "10" - }, - "inputs": { - "position": { - "output": "/actions/flight/in/yawstick" + ] + }, + "/actions/eva" : { + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/trigger" } - } - }, - { - "path": "/user/hand/left/input/trigger", - "mode": "scalar_constant", - "parameters": { - "on/x": "0", - "on/y": "1" - }, - "inputs": { - "value": { - "output": "/actions/flight/in/throttlestick" + ] + }, + "/actions/flight" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/flightstick" + } + }, + "mode" : "joystick", + "parameters" : { + "deadzone_pct" : "10", + "invert" : "y" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/yawstick" + } + }, + "mode" : "joystick", + "parameters" : { + "deadzone_pct" : "10" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "value" : { + "output" : "/actions/flight/in/throttlestick" + } + }, + "mode" : "scalar_constant", + "parameters" : { + "on/x" : "0", + "on/y" : "1" + }, + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/b" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/y" } - } - } - ], - "skeleton": [] - }, - "/actions/platformer": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [], - "skeleton": [] - } - }, - "controller_type": "oculus_touch", - "description": "Default VR controls for use with Kerbal Space Program and the KerbalVR mod.", - "name": "KerbalVR (Oculus Touch) Defaults" -} \ No newline at end of file + ] + }, + "/actions/platformer" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], + "sources" : [] + } + }, + "category" : "steamvr_input", + "controller_type" : "oculus_touch", + "description" : "Default VR controls for use with Kerbal Space Program and the KerbalVR mod.", + "name" : "KerbalVR (Oculus Touch) Defaults", + "options" : {}, + "simulated_actions" : [] +} diff --git a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_vive_controller.json b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_vive_controller.json index 01772048..2977eaa1 100644 --- a/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_vive_controller.json +++ b/KerbalVR_Mod/KerbalVR/Assets/Input/bindings_vive_controller.json @@ -1,110 +1,196 @@ { - "bindings": { - "/actions/default": { - "chords": [], - "poses": [ - { - "output": "/actions/default/in/pose", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/default/in/pose", - "path": "/user/hand/right/pose/raw" - } - ], - "haptics": [ - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/right/output/haptic" - } - ], - "sources": [ - { - "path": "/user/hand/left/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" + "action_manifest_version" : 0, + "alias_info" : {}, + "app_key" : "application.generated.unity.kerbalvr_unitysteamvr.exe", + "bindings" : { + "/actions/default" : { + "chords" : [], + "haptics" : [ + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/left/output/haptic" + }, + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/right/output/haptic" } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.05", - "click_deactivate_threshold": "0", - "force_input": "force" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" + ], + "poses" : [ + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/left/pose/raw" + }, + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/right/pose/raw" } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" + ], + "skeleton" : [ + { + "output" : "/actions/default/in/skeletonlefthand", + "path" : "/user/hand/left/input/skeleton/left" + }, + { + "output" : "/actions/default/in/skeletonrighthand", + "path" : "/user/hand/right/input/skeleton/right" } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.05", - "click_deactivate_threshold": "0", - "force_input": "force" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" + ], + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.05", + "click_deactivate_threshold" : "0", + "force_input" : "force" + }, + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.05", + "click_deactivate_threshold" : "0", + "force_input" : "force" + }, + "path" : "/user/hand/right/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/trigger" } - } - }, - { - "path": "/user/hand/left/input/trigger", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ] + }, + "/actions/editor" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/right/input/trackpad" } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ] + }, + "/actions/eva" : { + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trackpad" } - } - } - ], - "skeleton": [ - { - "output": "/actions/default/in/skeletonlefthand", - "path": "/user/hand/left/input/skeleton/left" - }, - { - "output": "/actions/default/in/skeletonrighthand", - "path": "/user/hand/right/input/skeleton/right" - } - ] - } - }, - "controller_type": "vive_controller", - "description": "VR controls for use with the KerbalVR mod in Kerbal Space Program", - "name": "KerbalVR (Vive Controller) Defaults" -} \ No newline at end of file + ] + }, + "/actions/flight" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/flightstick" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/right/input/trackpad" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/yawstick" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/application_menu" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/application_menu" + } + ] + } + }, + "category" : "steamvr_input", + "controller_type" : "vive_controller", + "description" : "VR controls for use with the KerbalVR mod in Kerbal Space Program", + "name" : "KerbalVR (Vive Controller) Defaults", + "options" : {}, + "simulated_actions" : [] +} diff --git a/KerbalVR_Mod/KerbalVR/InteractionSystem/KerbalVR_Hand.cs b/KerbalVR_Mod/KerbalVR/InteractionSystem/KerbalVR_Hand.cs index c27e9272..68f075a7 100644 --- a/KerbalVR_Mod/KerbalVR/InteractionSystem/KerbalVR_Hand.cs +++ b/KerbalVR_Mod/KerbalVR/InteractionSystem/KerbalVR_Hand.cs @@ -1,5 +1,6 @@ using KerbalVR.InternalModules; using System; +using System.Collections.Generic; using UnityEngine; using Valve.VR; @@ -49,9 +50,17 @@ public class Hand : MonoBehaviour { protected InteractableInternalModule hoveredObject; protected InteractableInternalModule heldObject; protected SteamVR_Action_Boolean actionGrab; + + // interacting with mouse-clickable objects + protected FingertipCollider fingertipInteraction; + protected SteamVR_Action_Boolean actionClick; #endregion + /// + /// Creates the render models for the hands; sets up behavior scripts on the hands, + /// including colliders for interacting with objects. + /// public void Initialize() { // verify members are set correctly if (handType != SteamVR_Input_Sources.LeftHand && handType != SteamVR_Input_Sources.RightHand) { @@ -67,7 +76,8 @@ public void Initialize() { DontDestroyOnLoad(handObject); // cache the hand renderers - string renderModelPath = (handType == SteamVR_Input_Sources.LeftHand) ? "slim_l/vr_glove_right_slim" : "slim_r/vr_glove_right_slim"; + string renderModelParentPath = (handType == SteamVR_Input_Sources.LeftHand) ? "slim_l" : "slim_r"; + string renderModelPath = renderModelParentPath + "/vr_glove_right_slim"; Transform handSkin = handObject.transform.Find(renderModelPath); handRenderer = handSkin.gameObject.GetComponent(); handRenderer.enabled = false; @@ -104,10 +114,18 @@ public void Initialize() { handRigidbody.useGravity = false; handRigidbody.isKinematic = true; + // add fingertip collider for "mouse clicks" + string fingertipTransformPath = renderModelParentPath + "/Root/wrist_r/finger_index_meta_r/finger_index_0_r/finger_index_1_r/finger_index_2_r/finger_index_r_end"; + Transform fingertipTransform = handObject.transform.Find(fingertipTransformPath); + fingertipInteraction = fingertipTransform.gameObject.AddComponent(); + // set up actions actionGrab = SteamVR_Input.GetBooleanAction("default", "GrabGrip"); actionGrab[handType].onChange += OnChangeGrab; + actionClick = SteamVR_Input.GetBooleanAction("flight", "InteractClick"); + actionClick[handType].onChange += OnChangeInteractClick; + #if DEBUG GameObject gizmo = Utils.CreateGizmo(); gizmo.transform.SetParent(this.transform); @@ -122,6 +140,12 @@ public void Initialize() { #endif } + /// + /// Handle grabbing Interactable objects + /// + /// SteamVR action that triggered this callback + /// Hand type that triggered this callback + /// New state of this action protected void OnChangeGrab(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource, bool newState) { if (newState) { if (hoveredObject != null) { @@ -140,6 +164,25 @@ protected void OnChangeGrab(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sou } } + /// + /// Handle interacting with mouse-clickable objects (like RPM props) + /// + /// SteamVR action that triggered this callback + /// Hand type that triggered this callback + /// New state of this action + protected void OnChangeInteractClick(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource, bool newState) { + if (newState) { + foreach (GameObject go in fingertipInteraction.CollidedGameObjects) { + go.SendMessage("OnMouseDown"); + } + } + else { + foreach (GameObject go in fingertipInteraction.CollidedGameObjects) { + go.SendMessage("OnMouseUp"); + } + } + } + protected void Update() { // should we render the hands in the current scene? bool isRendering = false; @@ -243,5 +286,42 @@ protected void OnTriggerExit(Collider other) { } } } + + + /// + /// A helper class to collect objects that collide with the index fingertip. + /// + protected class FingertipCollider : MonoBehaviour { + + #region Properties + public List CollidedGameObjects { get; protected set; } = new List(); + #endregion + + #region Private Members + protected SphereCollider fingertipCollider; + protected Rigidbody fingertipRigidbody; + #endregion + + protected void Awake() { + fingertipRigidbody = this.gameObject.AddComponent(); + fingertipRigidbody.isKinematic = true; + fingertipCollider = this.gameObject.AddComponent(); + fingertipCollider.isTrigger = true; + fingertipCollider.radius = 0.006f; + } + + protected void OnTriggerEnter(Collider other) { + // only interact with layer 20 (Internal Space) objects + if (other.gameObject.layer == 20 && !CollidedGameObjects.Contains(other.gameObject)) { + CollidedGameObjects.Add(other.gameObject); + } + } + + protected void OnTriggerExit(Collider other) { + if (CollidedGameObjects.Contains(other.gameObject)) { + CollidedGameObjects.Remove(other.gameObject); + } + } + } } } diff --git a/KerbalVR_Mod/KerbalVR/SteamVR_Input/ActionSetClasses/SteamVR_Input_ActionSet_flight.cs b/KerbalVR_Mod/KerbalVR/SteamVR_Input/ActionSetClasses/SteamVR_Input_ActionSet_flight.cs index 663b50f7..cf36a343 100644 --- a/KerbalVR_Mod/KerbalVR/SteamVR_Input/ActionSetClasses/SteamVR_Input_ActionSet_flight.cs +++ b/KerbalVR_Mod/KerbalVR/SteamVR_Input/ActionSetClasses/SteamVR_Input_ActionSet_flight.cs @@ -40,5 +40,13 @@ public virtual SteamVR_Action_Vector2 ThrottleStick return SteamVR_Actions.flight_ThrottleStick; } } + + public virtual SteamVR_Action_Boolean InteractClick + { + get + { + return SteamVR_Actions.flight_InteractClick; + } + } } } diff --git a/KerbalVR_Mod/KerbalVR/SteamVR_Input/SteamVR_Input_Actions.cs b/KerbalVR_Mod/KerbalVR/SteamVR_Input/SteamVR_Input_Actions.cs index cc0380ad..14172bbf 100644 --- a/KerbalVR_Mod/KerbalVR/SteamVR_Input/SteamVR_Input_Actions.cs +++ b/KerbalVR_Mod/KerbalVR/SteamVR_Input/SteamVR_Input_Actions.cs @@ -45,6 +45,8 @@ public partial class SteamVR_Actions private static SteamVR_Action_Vector2 p_flight_ThrottleStick; + private static SteamVR_Action_Boolean p_flight_InteractClick; + private static SteamVR_Action_Boolean p_eVA_Teleport; public static SteamVR_Action_Boolean default_InteractUI @@ -159,6 +161,14 @@ public static SteamVR_Action_Vector2 flight_ThrottleStick } } + public static SteamVR_Action_Boolean flight_InteractClick + { + get + { + return SteamVR_Actions.p_flight_InteractClick.GetCopy(); + } + } + public static SteamVR_Action_Boolean eVA_Teleport { get @@ -184,6 +194,7 @@ private static void InitializeActionArrays() SteamVR_Actions.flight_FlightStick, SteamVR_Actions.flight_YawStick, SteamVR_Actions.flight_ThrottleStick, + SteamVR_Actions.flight_InteractClick, SteamVR_Actions.eVA_Teleport}; Valve.VR.SteamVR_Input.actionsIn = new Valve.VR.ISteamVR_Action_In[] { SteamVR_Actions.default_InteractUI, @@ -199,6 +210,7 @@ private static void InitializeActionArrays() SteamVR_Actions.flight_FlightStick, SteamVR_Actions.flight_YawStick, SteamVR_Actions.flight_ThrottleStick, + SteamVR_Actions.flight_InteractClick, SteamVR_Actions.eVA_Teleport}; Valve.VR.SteamVR_Input.actionsOut = new Valve.VR.ISteamVR_Action_Out[] { SteamVR_Actions.default_Haptic}; @@ -212,6 +224,7 @@ private static void InitializeActionArrays() SteamVR_Actions.default_HeadsetOnHead, SteamVR_Actions.default_SnapTurnLeft, SteamVR_Actions.default_SnapTurnRight, + SteamVR_Actions.flight_InteractClick, SteamVR_Actions.eVA_Teleport}; Valve.VR.SteamVR_Input.actionsSingle = new Valve.VR.SteamVR_Action_Single[] { SteamVR_Actions.default_Squeeze}; @@ -235,6 +248,7 @@ private static void InitializeActionArrays() SteamVR_Actions.flight_FlightStick, SteamVR_Actions.flight_YawStick, SteamVR_Actions.flight_ThrottleStick, + SteamVR_Actions.flight_InteractClick, SteamVR_Actions.eVA_Teleport}; } @@ -254,6 +268,7 @@ private static void PreInitActions() SteamVR_Actions.p_flight_FlightStick = ((SteamVR_Action_Vector2)(SteamVR_Action.Create("/actions/flight/in/FlightStick"))); SteamVR_Actions.p_flight_YawStick = ((SteamVR_Action_Vector2)(SteamVR_Action.Create("/actions/flight/in/YawStick"))); SteamVR_Actions.p_flight_ThrottleStick = ((SteamVR_Action_Vector2)(SteamVR_Action.Create("/actions/flight/in/ThrottleStick"))); + SteamVR_Actions.p_flight_InteractClick = ((SteamVR_Action_Boolean)(SteamVR_Action.Create("/actions/flight/in/InteractClick"))); SteamVR_Actions.p_eVA_Teleport = ((SteamVR_Action_Boolean)(SteamVR_Action.Create("/actions/EVA/in/Teleport"))); } } diff --git a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/actions.json b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/actions.json index b188cf1f..9d08fc4e 100644 --- a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/actions.json +++ b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/actions.json @@ -61,6 +61,10 @@ "name": "/actions/flight/in/ThrottleStick", "type": "vector2" }, + { + "name": "/actions/flight/in/InteractClick", + "type": "boolean" + }, { "name": "/actions/EVA/in/Teleport", "type": "boolean" @@ -149,7 +153,8 @@ "/actions/flight/in/FlightStick": "Flight Stick", "/actions/flight/in/YawStick": "Yaw Control", "/actions/flight/in/ThrottleStick": "Throttle Control", - "/actions/EVA/in/Teleport": "Teleport" + "/actions/EVA/in/Teleport": "Teleport", + "/actions/flight/in/InteractClick": "Interaction Click" } ] } \ No newline at end of file diff --git a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_knuckles.json b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_knuckles.json index 4c5443d7..6513e059 100644 --- a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_knuckles.json +++ b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_knuckles.json @@ -70,15 +70,6 @@ "mode" : "force_sensor", "path" : "/user/hand/right/input/grip" }, - { - "inputs" : { - "click" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "button", - "path" : "/user/hand/left/input/trackpad" - }, { "inputs" : { "click" : { @@ -88,43 +79,6 @@ "mode" : "button", "path" : "/user/hand/right/input/trigger" }, - { - "inputs" : { - "click" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "button", - "path" : "/user/hand/right/input/trackpad" - }, - { - "inputs" : { - "north" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "dpad", - "parameters" : { - "deadzone_pct" : "25", - "overlap_pct" : "30", - "sub_mode" : "touch" - }, - "path" : "/user/hand/left/input/thumbstick" - }, - { - "inputs" : { - "north" : { - "output" : "/actions/default/in/teleport" - } - }, - "mode" : "dpad", - "parameters" : { - "deadzone_pct" : "25", - "overlap_pct" : "30", - "sub_mode" : "touch" - }, - "path" : "/user/hand/right/input/thumbstick" - }, { "inputs" : { "east" : { @@ -188,6 +142,10 @@ ] }, "/actions/editor" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -210,6 +168,10 @@ ] }, "/actions/eva" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -232,6 +194,10 @@ ] }, "/actions/flight" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], "sources" : [ { "inputs" : { @@ -271,6 +237,24 @@ "smooth_scroll_trackpad_aspect_ratio" : "0.6" }, "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/b" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/b" } ] }, diff --git a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_oculus_touch.json b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_oculus_touch.json index 0bbaf55e..3e0ac854 100644 --- a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_oculus_touch.json +++ b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_oculus_touch.json @@ -1,231 +1,290 @@ { - "app_key": "application.generated.unity.kerbalvr_unitysteamvr.exe", - "bindings": { - "/actions/buggy": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [], - "skeleton": [] - }, - "/actions/default": { - "chords": [], - "poses": [ - { - "output": "/actions/default/in/pose", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/default/in/pose", - "path": "/user/hand/right/pose/raw" - } - ], - "haptics": [ - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/right/output/haptic" - } - ], - "sources": [ - { - "path": "/user/hand/left/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" - } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.8", - "click_deactivate_threshold": "0.7" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" - } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" - } - } - }, - { - "path": "/user/hand/left/input/joystick", - "mode": "dpad", - "parameters": { - "deadzone_pct": "85", - "overlap_pct": "0", - "sub_mode": "touch" - }, - "inputs": { - "east": { - "output": "/actions/default/in/snapturnright" - }, - "west": { - "output": "/actions/default/in/snapturnleft" - } - } - }, - { - "path": "/user/hand/right/input/joystick", - "mode": "dpad", - "parameters": { - "deadzone_pct": "85", - "overlap_pct": "0", - "sub_mode": "touch" - }, - "inputs": { - "east": { - "output": "/actions/default/in/snapturnright" - }, - "west": { - "output": "/actions/default/in/snapturnleft" - } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.8", - "click_deactivate_threshold": "0.7" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" - } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + "action_manifest_version" : 0, + "alias_info" : {}, + "app_key" : "application.generated.unity.kerbalvr_unitysteamvr.exe", + "bindings" : { + "/actions/buggy" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], + "sources" : [] + }, + "/actions/default" : { + "chords" : [], + "haptics" : [ + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/left/output/haptic" + }, + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/right/output/haptic" } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ], + "poses" : [ + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/left/pose/raw" + }, + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/right/pose/raw" } - } - } - ], - "skeleton": [ - { - "output": "/actions/default/in/skeletonlefthand", - "path": "/user/hand/left/input/skeleton/left" - }, - { - "output": "/actions/default/in/skeletonrighthand", - "path": "/user/hand/right/input/skeleton/right" - } - ] - }, - "/actions/editor": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [ - { - "path": "/user/hand/left/input/joystick", - "mode": "joystick", - "parameters": {}, - "inputs": { - "position": { - "output": "/actions/editor/in/move" + ], + "skeleton" : [ + { + "output" : "/actions/default/in/skeletonlefthand", + "path" : "/user/hand/left/input/skeleton/left" + }, + { + "output" : "/actions/default/in/skeletonrighthand", + "path" : "/user/hand/right/input/skeleton/right" } - } - }, - { - "path": "/user/hand/right/input/joystick", - "mode": "joystick", - "parameters": {}, - "inputs": { - "position": { - "output": "/actions/editor/in/move" + ], + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.8", + "click_deactivate_threshold" : "0.7" + }, + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trigger" + }, + { + "inputs" : { + "north" : { + "output" : "/actions/default/in/teleport" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "25", + "overlap_pct" : "30", + "sub_mode" : "touch" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "north" : { + "output" : "/actions/default/in/teleport" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "25", + "overlap_pct" : "30", + "sub_mode" : "touch" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "east" : { + "output" : "/actions/default/in/snapturnright" + }, + "west" : { + "output" : "/actions/default/in/snapturnleft" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "85", + "overlap_pct" : "0", + "sub_mode" : "touch" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "east" : { + "output" : "/actions/default/in/snapturnright" + }, + "west" : { + "output" : "/actions/default/in/snapturnleft" + } + }, + "mode" : "dpad", + "parameters" : { + "deadzone_pct" : "85", + "overlap_pct" : "0", + "sub_mode" : "touch" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.8", + "click_deactivate_threshold" : "0.7" + }, + "path" : "/user/hand/right/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/grip" } - } - } - ], - "skeleton": [] - }, - "/actions/flight": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [ - { - "path": "/user/hand/right/input/joystick", - "mode": "joystick", - "parameters": { - "deadzone_pct": "10", - "invert": "y" - }, - "inputs": { - "position": { - "output": "/actions/flight/in/flightstick" + ] + }, + "/actions/editor" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "joystick", + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "joystick", + "path" : "/user/hand/right/input/joystick" } - } - }, - { - "path": "/user/hand/left/input/joystick", - "mode": "joystick", - "parameters": { - "deadzone_pct": "10" - }, - "inputs": { - "position": { - "output": "/actions/flight/in/yawstick" + ] + }, + "/actions/eva" : { + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/trigger" } - } - }, - { - "path": "/user/hand/left/input/trigger", - "mode": "scalar_constant", - "parameters": { - "on/x": "0", - "on/y": "1" - }, - "inputs": { - "value": { - "output": "/actions/flight/in/throttlestick" + ] + }, + "/actions/flight" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/flightstick" + } + }, + "mode" : "joystick", + "parameters" : { + "deadzone_pct" : "10", + "invert" : "y" + }, + "path" : "/user/hand/right/input/joystick" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/yawstick" + } + }, + "mode" : "joystick", + "parameters" : { + "deadzone_pct" : "10" + }, + "path" : "/user/hand/left/input/joystick" + }, + { + "inputs" : { + "value" : { + "output" : "/actions/flight/in/throttlestick" + } + }, + "mode" : "scalar_constant", + "parameters" : { + "on/x" : "0", + "on/y" : "1" + }, + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/b" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/y" } - } - } - ], - "skeleton": [] - }, - "/actions/platformer": { - "chords": [], - "poses": [], - "haptics": [], - "sources": [], - "skeleton": [] - } - }, - "controller_type": "oculus_touch", - "description": "Default VR controls for use with Kerbal Space Program and the KerbalVR mod.", - "name": "KerbalVR (Oculus Touch) Defaults" -} \ No newline at end of file + ] + }, + "/actions/platformer" : { + "chords" : [], + "haptics" : [], + "poses" : [], + "skeleton" : [], + "sources" : [] + } + }, + "category" : "steamvr_input", + "controller_type" : "oculus_touch", + "description" : "Default VR controls for use with Kerbal Space Program and the KerbalVR mod.", + "name" : "KerbalVR (Oculus Touch) Defaults", + "options" : {}, + "simulated_actions" : [] +} diff --git a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_vive_controller.json b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_vive_controller.json index 01772048..2977eaa1 100644 --- a/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_vive_controller.json +++ b/KerbalVR_UnitySteamVR/Assets/StreamingAssets/SteamVR/bindings_vive_controller.json @@ -1,110 +1,196 @@ { - "bindings": { - "/actions/default": { - "chords": [], - "poses": [ - { - "output": "/actions/default/in/pose", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/default/in/pose", - "path": "/user/hand/right/pose/raw" - } - ], - "haptics": [ - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/default/out/haptic", - "path": "/user/hand/right/output/haptic" - } - ], - "sources": [ - { - "path": "/user/hand/left/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" + "action_manifest_version" : 0, + "alias_info" : {}, + "app_key" : "application.generated.unity.kerbalvr_unitysteamvr.exe", + "bindings" : { + "/actions/default" : { + "chords" : [], + "haptics" : [ + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/left/output/haptic" + }, + { + "output" : "/actions/default/out/haptic", + "path" : "/user/hand/right/output/haptic" } - } - }, - { - "path": "/user/hand/left/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.05", - "click_deactivate_threshold": "0", - "force_input": "force" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" + ], + "poses" : [ + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/left/pose/raw" + }, + { + "output" : "/actions/default/in/pose", + "path" : "/user/hand/right/pose/raw" } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "button", - "parameters": {}, - "inputs": { - "click": { - "output": "/actions/default/in/interactui" + ], + "skeleton" : [ + { + "output" : "/actions/default/in/skeletonlefthand", + "path" : "/user/hand/left/input/skeleton/left" + }, + { + "output" : "/actions/default/in/skeletonrighthand", + "path" : "/user/hand/right/input/skeleton/right" } - } - }, - { - "path": "/user/hand/right/input/grip", - "mode": "button", - "parameters": { - "click_activate_threshold": "0.05", - "click_deactivate_threshold": "0", - "force_input": "force" - }, - "inputs": { - "click": { - "output": "/actions/default/in/grabgrip" + ], + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.05", + "click_deactivate_threshold" : "0", + "force_input" : "force" + }, + "path" : "/user/hand/left/input/grip" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/interactui" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trigger" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/default/in/grabgrip" + } + }, + "mode" : "button", + "parameters" : { + "click_activate_threshold" : "0.05", + "click_deactivate_threshold" : "0", + "force_input" : "force" + }, + "path" : "/user/hand/right/input/grip" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/left/input/trigger" + }, + { + "inputs" : { + "pull" : { + "output" : "/actions/default/in/squeeze" + } + }, + "mode" : "trigger", + "path" : "/user/hand/right/input/trigger" } - } - }, - { - "path": "/user/hand/left/input/trigger", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ] + }, + "/actions/editor" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/editor/in/move" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/right/input/trackpad" } - } - }, - { - "path": "/user/hand/right/input/trigger", - "mode": "trigger", - "parameters": {}, - "inputs": { - "pull": { - "output": "/actions/default/in/squeeze" + ] + }, + "/actions/eva" : { + "sources" : [ + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/eva/in/teleport" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/trackpad" } - } - } - ], - "skeleton": [ - { - "output": "/actions/default/in/skeletonlefthand", - "path": "/user/hand/left/input/skeleton/left" - }, - { - "output": "/actions/default/in/skeletonrighthand", - "path": "/user/hand/right/input/skeleton/right" - } - ] - } - }, - "controller_type": "vive_controller", - "description": "VR controls for use with the KerbalVR mod in Kerbal Space Program", - "name": "KerbalVR (Vive Controller) Defaults" -} \ No newline at end of file + ] + }, + "/actions/flight" : { + "sources" : [ + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/flightstick" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/right/input/trackpad" + }, + { + "inputs" : { + "position" : { + "output" : "/actions/flight/in/yawstick" + } + }, + "mode" : "trackpad", + "path" : "/user/hand/left/input/trackpad" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/right/input/application_menu" + }, + { + "inputs" : { + "click" : { + "output" : "/actions/flight/in/interactclick" + } + }, + "mode" : "button", + "path" : "/user/hand/left/input/application_menu" + } + ] + } + }, + "category" : "steamvr_input", + "controller_type" : "vive_controller", + "description" : "VR controls for use with the KerbalVR mod in Kerbal Space Program", + "name" : "KerbalVR (Vive Controller) Defaults", + "options" : {}, + "simulated_actions" : [] +}