TaiZhouCangChu_VRanime/Assets/HTC.UnityPlugin/VRModule/Modules/UnityXRModule.cs

703 lines
43 KiB
C#

//========= Copyright 2016-2023, HTC Corporation. All rights reserved. ===========
using HTC.UnityPlugin.Utility;
using HTC.UnityPlugin.Vive;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using System;
#if UNITY_2017_2_OR_NEWER
using UnityEngine.XR;
#endif
#if VIU_XR_GENERAL_SETTINGS
using UnityEngine.XR.Management;
using UnityEngine.SpatialTracking;
#endif
namespace HTC.UnityPlugin.VRModuleManagement
{
[Obsolete("Use VRModuleKnownXRInputSubsystem instead")]
public enum XRInputSubsystemType
{
Unknown,
OpenVR,
Oculus,
WMR,
MagicLeap,
}
public sealed class UnityXRModule : UnityXRModuleBase
{
public override int moduleOrder { get { return (int)DefaultModuleOrder.UnityXR; } }
public override int moduleIndex { get { return (int)VRModuleSelectEnum.UnityXR; } }
public const string WAVE_XR_LOADER_NAME = "Wave XR Loader";
public const string WAVE_XR_LOADER_CLASS_NAME = "WaveXRLoader";
public const string OPENXR_LOADER_NAME = "Open XR Loader";
public const string OPENXR_LOADER_CLASS_NAME = "OpenXRLoader";
#if UNITY_2019_3_OR_NEWER && VIU_XR_GENERAL_SETTINGS
private class CameraCreator : VRCameraHook.CameraCreator
{
public override bool shouldActive { get { return s_moduleInstance != null && s_moduleInstance.isActivated; } }
public override void CreateCamera(VRCameraHook hook)
{
if (hook.GetComponent<TrackedPoseDriver>() == null)
{
hook.gameObject.AddComponent<TrackedPoseDriver>();
}
}
}
private static UnityXRModule s_moduleInstance;
public override bool ShouldActiveModule()
{
return VIUSettings.activateUnityXRModule && HasActiveLoader();
}
public override void OnActivated()
{
s_moduleInstance = this;
base.OnActivated();
}
public override void OnDeactivated()
{
base.OnDeactivated();
s_moduleInstance = null;
}
private Action<IVRModuleDeviceStateRW, InputDevice>[] updateControllerStateDelegates = new Action<IVRModuleDeviceStateRW, InputDevice>[VRModule.MAX_DEVICE_COUNT];
protected override void UpdateNewConnectedInputDevice(IVRModuleDeviceStateRW state, InputDevice device)
{
Action<IVRModuleDeviceStateRW, InputDevice> updateFunc;
switch (state.deviceModel)
{
case VRModuleDeviceModel.ViveController:
updateFunc = UpdateViveControllerState;
break;
case VRModuleDeviceModel.ViveCosmosControllerLeft:
case VRModuleDeviceModel.ViveCosmosControllerRight:
updateFunc = UpdateViveCosmosControllerState;
break;
case VRModuleDeviceModel.ViveTracker:
case VRModuleDeviceModel.ViveTracker3:
updateFunc = UpdateViveTrackerState;
break;
case VRModuleDeviceModel.OculusTouchLeft:
case VRModuleDeviceModel.OculusTouchRight:
case VRModuleDeviceModel.OculusGoController:
case VRModuleDeviceModel.OculusQuestControllerLeft:
case VRModuleDeviceModel.OculusQuestControllerRight:
case VRModuleDeviceModel.OculusQuest2ControllerLeft:
case VRModuleDeviceModel.OculusQuest2ControllerRight:
updateFunc = UpdateOculusControllerState;
break;
case VRModuleDeviceModel.WMRControllerLeft:
case VRModuleDeviceModel.WMRControllerRight:
updateFunc = UpdateWMRControllerState;
break;
case VRModuleDeviceModel.KnucklesLeft:
case VRModuleDeviceModel.KnucklesRight:
case VRModuleDeviceModel.IndexControllerLeft:
case VRModuleDeviceModel.IndexControllerRight:
updateFunc = UpdateIndexControllerState;
break;
case VRModuleDeviceModel.MagicLeapController:
updateFunc = UpdateMagicLeapControllerState;
break;
case VRModuleDeviceModel.ViveFocusChirp:
updateFunc = UpdateViveFocusChirpControllerState;
break;
case VRModuleDeviceModel.ViveFocusFinch:
case VRModuleDeviceModel.ViveFlowPhoneController:
updateFunc = UpdateViveFocusFinchControllerState;
break;
case VRModuleDeviceModel.KhronosSimpleController:
updateFunc = UpdateKhronosSimpleControllerState;
break;
case VRModuleDeviceModel.ViveFocus3ControllerLeft:
case VRModuleDeviceModel.ViveFocus3ControllerRight:
updateFunc = UpdateWaveCRControllerState;
break;
case VRModuleDeviceModel.ViveWristTracker:
updateFunc = UpdateViveWristTrackerState;
break;
default:
updateFunc = UpdateUnknownControllerState;
break;
}
updateControllerStateDelegates[state.deviceIndex] = updateFunc;
}
protected override void UpdateInputDevicesControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
var updateFunc = updateControllerStateDelegates[state.deviceIndex];
if (updateFunc != null) { updateFunc(state, device); }
}
private void UpdateControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
switch (state.deviceModel)
{
case VRModuleDeviceModel.ViveController:
UpdateViveControllerState(state, device);
break;
case VRModuleDeviceModel.ViveCosmosControllerLeft:
case VRModuleDeviceModel.ViveCosmosControllerRight:
UpdateViveCosmosControllerState(state, device);
break;
case VRModuleDeviceModel.ViveTracker:
UpdateViveTrackerState(state, device);
break;
case VRModuleDeviceModel.OculusTouchLeft:
case VRModuleDeviceModel.OculusTouchRight:
case VRModuleDeviceModel.OculusGoController:
case VRModuleDeviceModel.OculusQuestControllerLeft:
case VRModuleDeviceModel.OculusQuestControllerRight:
UpdateOculusControllerState(state, device);
break;
case VRModuleDeviceModel.WMRControllerLeft:
case VRModuleDeviceModel.WMRControllerRight:
UpdateWMRControllerState(state, device);
break;
case VRModuleDeviceModel.KnucklesLeft:
case VRModuleDeviceModel.KnucklesRight:
case VRModuleDeviceModel.IndexControllerLeft:
case VRModuleDeviceModel.IndexControllerRight:
UpdateIndexControllerState(state, device);
break;
case VRModuleDeviceModel.MagicLeapController:
UpdateMagicLeapControllerState(state, device);
break;
case VRModuleDeviceModel.ViveFocusChirp:
UpdateViveFocusChirpControllerState(state, device);
break;
case VRModuleDeviceModel.ViveFocusFinch:
UpdateViveFocusFinchControllerState(state, device);
break;
}
}
private void UpdateUnknownControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton);
bool primaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryTouch);
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton);
bool secondaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryTouch);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxisClick);
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxisTouch);
float triggerValue = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
float gripValue = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
Vector2 primary2DAxisValue = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
Vector2 secondary2DAxisValue = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis);
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, secondaryButton | menuButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Joystick, secondary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.A, primaryTouch);
state.SetButtonTouch(VRModuleRawButton.ApplicationMenu, secondaryTouch | menuButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Grip, gripButton);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetButtonTouch(VRModuleRawButton.Joystick, secondary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, triggerValue);
state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, gripValue);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxisValue.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxisValue.y);
state.SetAxisValue(VRModuleRawAxis.JoystickX, secondary2DAxisValue.x);
state.SetAxisValue(VRModuleRawAxis.JoystickY, secondary2DAxisValue.y);
}
private void UpdateViveControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool primaryAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.Touchpad, primaryAxisClick);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenXR)
{
bool systemButton = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("SystemButton")); // Always false
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip); // 0 or 1
state.SetButtonPress(VRModuleRawButton.System, systemButton);
state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
}
}
private void UpdateViveCosmosControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton); // X/A
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton); // Y/B
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, secondaryButton);
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenVR)
{
bool primaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryTouch); // X/A
bool secondaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryTouch); // Y/B
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool bumperButton = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("BumperButton"));
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool triggerTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerTouch"));
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Bumper, bumperButton);
state.SetButtonTouch(VRModuleRawButton.A, primaryTouch);
state.SetButtonTouch(VRModuleRawButton.ApplicationMenu, secondaryTouch);
state.SetButtonTouch(VRModuleRawButton.Grip, gripButton);
state.SetButtonTouch(VRModuleRawButton.Bumper, bumperButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
}
else if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenXR)
{
bool gripPressed = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("GripPressed"));
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool triggerPressed = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerPressed"));
bool shoulderButton = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("ShoulderButton"));
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
state.SetButtonPress(VRModuleRawButton.Grip, gripPressed);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerPressed);
state.SetButtonPress(VRModuleRawButton.Bumper, shoulderButton);
state.SetButtonTouch(VRModuleRawButton.A, primaryButton);
state.SetButtonTouch(VRModuleRawButton.ApplicationMenu, secondaryButton);
state.SetButtonTouch(VRModuleRawButton.Grip, gripPressed);
state.SetButtonTouch(VRModuleRawButton.Bumper, shoulderButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerPressed);
// conflict with JoystickX
//state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
// menuButton conflicts with secondaryButton
// Unused
// [Vector3] PointerPosition
// [Quaternion] PointerRotation
// [Vector3] PointerVelocity
// [Vector3] PointerAngularVelocity
}
}
private void UpdateViveTrackerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
}
private void UpdateOculusControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton); // X/A
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton); // Y/B
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool primaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryTouch); // X/A
bool secondaryTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryTouch); // Y/B
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Joystick
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch); // Joystick
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Joystick
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, secondaryButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripButton);
state.SetButtonPress(VRModuleRawButton.Axis0, primary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.A, primaryTouch);
state.SetButtonTouch(VRModuleRawButton.ApplicationMenu, secondaryTouch);
state.SetButtonTouch(VRModuleRawButton.Grip, grip >= 0.05f);
state.SetButtonTouch(VRModuleRawButton.CapSenseGrip, grip >= 0.05f);
state.SetButtonTouch(VRModuleRawButton.Axis0, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenVR)
{
bool triggerTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerTouch"));
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
}
else if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.Oculus)
{
bool thumbrest = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Thumbrest"));
float indexTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("IndexTouch"));
float thumbTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("ThumbTouch")); // Not in use
state.SetButtonTouch(VRModuleRawButton.Touchpad, thumbrest);
state.SetButtonTouch(VRModuleRawButton.Trigger, indexTouch >= 1.0f);
if ((device.characteristics & InputDeviceCharacteristics.Left) != 0)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
state.SetButtonPress(VRModuleRawButton.System, menuButton);
}
}
else if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenXR)
{
bool triggerTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerTouch"));
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
if ((device.characteristics & InputDeviceCharacteristics.Left) != 0)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
state.SetButtonPress(VRModuleRawButton.System, menuButton);
}
// Unused
// [Vector3] PointerPosition
// [Quaternion] PointerRotation
// [Vector3] PointerVelocity
// [Vector3] PointerAngularVelocity
}
}
private void UpdateWMRControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenVR)
{
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Touchpad
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisClick"));
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch); // Touchpad
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Touchpad
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // Joystick
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Joystick, secondary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetButtonTouch(VRModuleRawButton.Joystick, secondary2DAxisClick);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
state.SetAxisValue(VRModuleRawAxis.JoystickX, secondary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.JoystickY, secondary2DAxis.y);
}
else if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.WindowsXR)
{
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
float sourceLossRisk = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("SourceLossRisk")); // Not in use
Vector3 pointerPosition = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Vector3>("PointerPosition")); // Not in use
Vector3 sourceMitigationDirection = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Vector3>("SourceMitigationDirection")); // Not in use
Quaternion pointerRotation = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Quaternion>("PointerRotation")); // Not in use
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Touchpad
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisClick"));
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch); // Touchpad
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Touchpad
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // Joystick
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Joystick, secondary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetButtonTouch(VRModuleRawButton.Joystick, secondary2DAxisClick);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
state.SetAxisValue(VRModuleRawAxis.JoystickX, secondary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.JoystickY, secondary2DAxis.y);
// conflict with JoystickX
//state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
}
else if (KnownActiveInputSubsystem == VRModuleKnownXRInputSubsystem.OpenXR)
{
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Joystick; always false
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxisClick); // Touchpad
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisTouch")); // Touchpad
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Joystick; always 0
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // Touchpad
state.SetButtonPress(VRModuleRawButton.Touchpad, secondary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Joystick, primary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.Touchpad, secondary2DAxisTouch);
state.SetButtonTouch(VRModuleRawButton.Joystick, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, secondary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, secondary2DAxis.y);
state.SetAxisValue(VRModuleRawAxis.JoystickX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.JoystickY, primary2DAxis.y);
// conflict with JoystickX
//state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
}
}
private void UpdateIndexControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool menuTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("MenuTouch"));
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton);
bool primaryTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("PrimaryTouch"));
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton); // B
bool secondaryTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("SecondaryTouch"));
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
float gripForce = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("GripForce"));
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool triggerTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerTouch"));
// joystick
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
// touchpad
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis);
float secondary2DAxisForce = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("Secondary2DAxisForce"));
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisTouch"));
state.SetButtonPress(VRModuleRawButton.System, menuButton);
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, secondaryButton);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Touchpad, secondary2DAxisForce > 0.5f);
state.SetButtonPress(VRModuleRawButton.Joystick, primary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.System, menuTouch);
state.SetButtonTouch(VRModuleRawButton.A, primaryTouch);
state.SetButtonTouch(VRModuleRawButton.ApplicationMenu, secondaryTouch);
state.SetButtonTouch(VRModuleRawButton.Grip, grip > 0f);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
state.SetButtonTouch(VRModuleRawButton.Touchpad, secondary2DAxisTouch);
state.SetButtonTouch(VRModuleRawButton.Joystick, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, secondary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, secondary2DAxis.y);
state.SetAxisValue(VRModuleRawAxis.JoystickX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.JoystickY, primary2DAxis.y);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.Axis1Y, gripForce);
}
private void UpdateMagicLeapControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton); // Bumper
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
uint MLControllerType = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<uint>("MLControllerType")); // Not in use
uint MLControllerDOF = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<uint>("MLControllerDOF")); // Not in use
uint MLControllerCalibrationAccuracy = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<uint>("MLControllerCalibrationAccuracy")); // Not in use
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
float MLControllerTouch1Force = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("MLControllerTouch1Force")); // Not in use
float MLControllerTouch2Force = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<float>("MLControllerTouch2Force")); // Not in use
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // Not in use
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.Bumper, secondaryButton);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
}
private void UpdateKhronosSimpleControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
// Unused
// [Vector3] PointerPosition
// [Quaternion] PointerRotation
// [Vector3] PointerVelocity
// [Vector3] PointerAngularVelocity
}
private void UpdateViveWristTrackerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, primaryButton);
state.SetButtonPress(VRModuleRawButton.System, menuButton);
}
private void UpdateWaveCRControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick);
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch);
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisClick"));
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisTouch"));
bool primaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.primaryButton);
bool secondaryButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondaryButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool triggerTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("TriggerTouch"));
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool gripTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("GripTouch"));
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
float grip = GetDeviceFeatureValueOrDefault(device, CommonUsages.grip);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis);
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis);
Vector2 dPad = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Vector2>("DPad"));
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetButtonPress(VRModuleRawButton.A, primaryButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, secondaryButton);
state.SetButtonPress(VRModuleRawButton.System, menuButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonTouch(VRModuleRawButton.Grip, gripTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
}
private void UpdateViveFocusChirpControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Touchpad
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch); // Touchpad
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisClick")); // No data
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisTouch")); // No data
bool gripButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.gripButton);
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton);
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger);
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Touchpad
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // No data
Vector2 dPad = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Vector2>("DPad"));
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Grip, gripButton);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.DPadUp, dPad.y > 0);
state.SetButtonPress(VRModuleRawButton.DPadDown, dPad.y < 0);
state.SetButtonPress(VRModuleRawButton.DPadLeft, dPad.x < 0);
state.SetButtonPress(VRModuleRawButton.DPadRight, dPad.x > 0);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
}
private void UpdateViveFocusFinchControllerState(IVRModuleDeviceStateRW state, InputDevice device)
{
bool primary2DAxisClick = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisClick); // Touchpad
bool primary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxisTouch); // Touchpad
bool secondary2DAxisClick = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisClick")); // No data
bool secondary2DAxisTouch = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<bool>("Secondary2DAxisTouch")); // No data
bool triggerButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.triggerButton);
bool menuButton = GetDeviceFeatureValueOrDefault(device, CommonUsages.menuButton); // No Data
float trigger = GetDeviceFeatureValueOrDefault(device, CommonUsages.trigger); // No Data
Vector2 primary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.primary2DAxis); // Touchpad
Vector2 secondary2DAxis = GetDeviceFeatureValueOrDefault(device, CommonUsages.secondary2DAxis); // No data
Vector2 dPad = GetDeviceFeatureValueOrDefault(device, new InputFeatureUsage<Vector2>("DPad")); // No Data
state.SetButtonPress(VRModuleRawButton.Touchpad, primary2DAxisClick);
state.SetButtonPress(VRModuleRawButton.Trigger, triggerButton);
state.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuButton);
state.SetButtonPress(VRModuleRawButton.DPadUp, dPad.y > 0);
state.SetButtonPress(VRModuleRawButton.DPadDown, dPad.y < 0);
state.SetButtonPress(VRModuleRawButton.DPadLeft, dPad.x < 0);
state.SetButtonPress(VRModuleRawButton.DPadRight, dPad.x > 0);
state.SetButtonTouch(VRModuleRawButton.Touchpad, primary2DAxisTouch);
state.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
state.SetAxisValue(VRModuleRawAxis.TouchpadX, primary2DAxis.x);
state.SetAxisValue(VRModuleRawAxis.TouchpadY, primary2DAxis.y);
}
#endif
}
}