#if ENABLE_INPUT_SYSTEM using System; using System.Collections; using System.Collections.Generic; using HurricaneVR.Framework.Core; using HurricaneVR.Framework.Shared; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Utilities; #if USING_OPENXR using UnityEngine.XR.OpenXR.Input; #endif namespace HurricaneVR.Framework.ControllerInput { public class HVRInputSystemController : HVRController { public static HVRInputActions InputActions = null; private InputDevice _inputDevice; public bool IsOpenXR; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void Cleanup() { if (InputActions != null) { InputActions.Disable(); InputActions.Dispose(); InputActions = null; } } public static void Init() { if (InputActions == null) { InputActions = new HVRInputActions(); InputActions.Enable(); } } protected override void Start() { base.Start(); Init(); UnityEngine.InputSystem.InputSystem.onDeviceChange += OnDeviceChanged; } private void OnDeviceChanged(InputDevice device, InputDeviceChange change) { if (change == InputDeviceChange.Added) { if (device.usages.Contains(CommonUsages.LeftHand) && Side == HVRHandSide.Left || device.usages.Contains(CommonUsages.RightHand) && Side == HVRHandSide.Right) { _inputDevice = device; } } } protected override void UpdateInput() { if (Side == HVRHandSide.Left) { JoystickAxis = InputActions.LeftHand.Primary2DAxis.ReadValue(); SetBool(out JoystickClicked, InputActions.LeftHand.Primary2DAxisClick); SetBool(out TrackPadClicked, InputActions.LeftHand.Secondary2DAxisClick); TrackpadAxis = InputActions.LeftHand.Secondary2DAxis.ReadValue(); Grip = InputActions.LeftHand.Grip.ReadValue(); GripForce = InputActions.LeftHand.GripForce.ReadValue(); Trigger = InputActions.LeftHand.Trigger.ReadValue(); SetBool(out PrimaryButton, InputActions.LeftHand.PrimaryButton); SetBool(out SecondaryButton, InputActions.LeftHand.SecondaryButton); SetBool(out PrimaryTouch, InputActions.LeftHand.PrimaryTouch); SetBool(out SecondaryTouch, InputActions.LeftHand.SecondaryTouch); SetBool(out JoystickTouch, InputActions.LeftHand.Primary2DAxisTouch); SetBool(out TrackPadTouch, InputActions.LeftHand.Secondary2DAxisTouch); SetBool(out TriggerTouch, InputActions.LeftHand.TriggerTouch); SetBool(out MenuButton, InputActions.LeftHand.Menu); SetBool(out GripButton, InputActions.LeftHand.GripPress); SetBool(out TriggerButton, InputActions.LeftHand.TriggerPress); } else { JoystickAxis = InputActions.RightHand.Primary2DAxis.ReadValue(); SetBool(out JoystickClicked, InputActions.RightHand.Primary2DAxisClick); SetBool(out TrackPadClicked, InputActions.RightHand.Secondary2DAxisClick); TrackpadAxis = InputActions.RightHand.Secondary2DAxis.ReadValue(); Grip = InputActions.RightHand.Grip.ReadValue(); GripForce = InputActions.RightHand.GripForce.ReadValue(); Trigger = InputActions.RightHand.Trigger.ReadValue(); SetBool(out PrimaryButton, InputActions.RightHand.PrimaryButton); SetBool(out SecondaryButton, InputActions.RightHand.SecondaryButton); SetBool(out PrimaryTouch, InputActions.RightHand.PrimaryTouch); SetBool(out SecondaryTouch, InputActions.RightHand.SecondaryTouch); SetBool(out JoystickTouch, InputActions.RightHand.Primary2DAxisTouch); SetBool(out TrackPadTouch, InputActions.RightHand.Secondary2DAxisTouch); SetBool(out TriggerTouch, InputActions.RightHand.TriggerTouch); SetBool(out MenuButton, InputActions.RightHand.Menu); SetBool(out GripButton, InputActions.RightHand.GripPress); SetBool(out TriggerButton, InputActions.RightHand.TriggerPress); } } private void SetBool(out bool val, InputAction action) { val = false; if (action.activeControl != null) { var type = action.activeControl.valueType; if (type == typeof(bool)) { val = action.ReadValue(); } else if (type == typeof(float)) { val = action.ReadValue() > .5f; } } } public override void Vibrate(float amplitude, float duration = 1, float frequency = 1) { if (HVRSettings.Instance.DisableHaptics) return; #if USING_OPENXR if (IsOpenXR) { var action = Side == HVRHandSide.Left ? InputActions.LeftHand.Haptics : InputActions.RightHand.Haptics; if (action != null && _inputDevice != null) { OpenXRInput.SendHapticImpulse(action, amplitude, frequency, duration, _inputDevice); return; } } #endif base.Vibrate(amplitude, duration, frequency); } } } #endif