415 lines
19 KiB
C#
415 lines
19 KiB
C#
//========= Copyright 2016-2023, HTC Corporation. All rights reserved. ===========
|
|
|
|
using UnityEngine;
|
|
using HTC.UnityPlugin.Vive;
|
|
|
|
#if UNITY_2017_2_OR_NEWER
|
|
using UnityEngine.XR;
|
|
#else
|
|
using XRSettings = UnityEngine.VR.VRSettings;
|
|
using XRDevice = UnityEngine.VR.VRDevice;
|
|
#endif
|
|
|
|
namespace HTC.UnityPlugin.VRModuleManagement
|
|
{
|
|
public sealed partial class UnityEngineVRModule : VRModule.ModuleBase
|
|
{
|
|
public override int moduleOrder { get { return (int)DefaultModuleOrder.UnityNativeVR; } }
|
|
|
|
public override int moduleIndex { get { return (int)VRModuleSelectEnum.UnityNativeVR; } }
|
|
|
|
#if !UNITY_2020_1_OR_NEWER
|
|
private static KeyCode[] s_keyCodes = new KeyCode[]
|
|
{
|
|
KeyCode.JoystickButton0,
|
|
KeyCode.JoystickButton1,
|
|
KeyCode.JoystickButton2,
|
|
KeyCode.JoystickButton3,
|
|
KeyCode.JoystickButton4,
|
|
KeyCode.JoystickButton5,
|
|
KeyCode.JoystickButton6,
|
|
KeyCode.JoystickButton7,
|
|
KeyCode.JoystickButton8,
|
|
KeyCode.JoystickButton9,
|
|
KeyCode.JoystickButton10,
|
|
KeyCode.JoystickButton11,
|
|
KeyCode.JoystickButton12,
|
|
KeyCode.JoystickButton13,
|
|
KeyCode.JoystickButton14,
|
|
KeyCode.JoystickButton15,
|
|
KeyCode.JoystickButton16,
|
|
KeyCode.JoystickButton17,
|
|
KeyCode.JoystickButton18,
|
|
KeyCode.JoystickButton19,
|
|
};
|
|
|
|
private static string[] s_axisNames = new string[]
|
|
{
|
|
"HTC_VIU_UnityAxis1",
|
|
"HTC_VIU_UnityAxis2",
|
|
"HTC_VIU_UnityAxis3",
|
|
"HTC_VIU_UnityAxis4",
|
|
"HTC_VIU_UnityAxis5",
|
|
"HTC_VIU_UnityAxis6",
|
|
"HTC_VIU_UnityAxis7",
|
|
"HTC_VIU_UnityAxis8",
|
|
"HTC_VIU_UnityAxis9",
|
|
"HTC_VIU_UnityAxis10",
|
|
"HTC_VIU_UnityAxis11",
|
|
"HTC_VIU_UnityAxis12",
|
|
"HTC_VIU_UnityAxis13",
|
|
"HTC_VIU_UnityAxis14",
|
|
"HTC_VIU_UnityAxis15",
|
|
"HTC_VIU_UnityAxis16",
|
|
"HTC_VIU_UnityAxis17",
|
|
"HTC_VIU_UnityAxis18",
|
|
"HTC_VIU_UnityAxis19",
|
|
"HTC_VIU_UnityAxis20",
|
|
"HTC_VIU_UnityAxis21",
|
|
"HTC_VIU_UnityAxis22",
|
|
"HTC_VIU_UnityAxis23",
|
|
"HTC_VIU_UnityAxis24",
|
|
"HTC_VIU_UnityAxis25",
|
|
"HTC_VIU_UnityAxis26",
|
|
"HTC_VIU_UnityAxis27",
|
|
};
|
|
|
|
public static bool GetUnityButton(int id)
|
|
{
|
|
return Input.GetKey(s_keyCodes[id]);
|
|
}
|
|
|
|
public static float GetUnityAxis(int id)
|
|
{
|
|
return Input.GetAxisRaw(s_axisNames[id - 1]);
|
|
}
|
|
#if UNITY_EDITOR
|
|
public static int GetUnityAxisCount() { return s_axisNames.Length; }
|
|
|
|
public static string GetUnityAxisNameByIndex(int index) { return s_axisNames[index]; }
|
|
|
|
public static int GetUnityAxisIdByIndex(int index) { return index + 1; }
|
|
#endif
|
|
|
|
public override bool ShouldActiveModule() { return VIUSettings.activateUnityNativeVRModule && XRSettings.enabled; }
|
|
|
|
public override void Update()
|
|
{
|
|
// set physics update rate to vr render rate
|
|
if (VRModule.lockPhysicsUpdateRateToRenderFrequency && Time.timeScale > 0.0f)
|
|
{
|
|
// FIXME: VRDevice.refreshRate returns zero in Unity 5.6.0 or older version
|
|
#if UNITY_5_6_OR_NEWER
|
|
Time.fixedDeltaTime = 1f / XRDevice.refreshRate;
|
|
#else
|
|
Time.fixedDeltaTime = 1f / 90f;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
private static void UpdateLeftControllerInput(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
switch (currState.deviceModel)
|
|
{
|
|
case VRModuleDeviceModel.ViveCosmosControllerLeft:
|
|
case VRModuleDeviceModel.ViveController:
|
|
Update_L_Vive(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.OculusQuestControllerLeft:
|
|
case VRModuleDeviceModel.OculusGoController:
|
|
case VRModuleDeviceModel.OculusTouchLeft:
|
|
Update_L_OculusTouch(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.KnucklesLeft:
|
|
case VRModuleDeviceModel.IndexControllerLeft:
|
|
Update_L_Knuckles(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.WMRControllerLeft:
|
|
Update_L_MicrosoftMR(prevState, currState);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void UpdateRightControllerInput(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
switch (currState.deviceModel)
|
|
{
|
|
case VRModuleDeviceModel.ViveCosmosControllerRight:
|
|
case VRModuleDeviceModel.ViveController:
|
|
Update_R_Vive(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.OculusQuestControllerRight:
|
|
case VRModuleDeviceModel.OculusGoController:
|
|
case VRModuleDeviceModel.OculusTouchRight:
|
|
Update_R_OculusTouch(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.KnucklesRight:
|
|
case VRModuleDeviceModel.IndexControllerRight:
|
|
Update_R_Knuckles(prevState, currState);
|
|
break;
|
|
case VRModuleDeviceModel.WMRControllerRight:
|
|
Update_R_MicrosoftMR(prevState, currState);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void Update_L_Vive(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var primaryButtonPress = GetUnityButton(3);
|
|
var menuPress = GetUnityButton(2);
|
|
var padPress = GetUnityButton(8);
|
|
var triggerTouch = GetUnityButton(14);
|
|
var padTouch = GetUnityButton(16);
|
|
|
|
var padX = GetUnityAxis(1);
|
|
var padY = GetUnityAxis(2);
|
|
var trigger = GetUnityAxis(9);
|
|
var grip = GetUnityAxis(11);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.A, primaryButtonPress);
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
}
|
|
|
|
private static void Update_R_Vive(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var primaryButtonPress = GetUnityButton(1);
|
|
var menuPress = GetUnityButton(0);
|
|
var padPress = GetUnityButton(9);
|
|
var triggerTouch = GetUnityButton(15);
|
|
var padTouch = GetUnityButton(17);
|
|
|
|
var padX = GetUnityAxis(4);
|
|
var padY = GetUnityAxis(5);
|
|
var trigger = GetUnityAxis(10);
|
|
var grip = GetUnityAxis(12);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.A, primaryButtonPress);
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
}
|
|
|
|
private static void Update_L_OculusTouch(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var startPress = GetUnityButton(6);
|
|
var xPress = GetUnityButton(2);
|
|
var yPress = GetUnityButton(3);
|
|
var stickPress = GetUnityButton(8);
|
|
var gripPress = GetUnityButton(4);
|
|
var xTouch = GetUnityButton(12);
|
|
var yTouch = GetUnityButton(13);
|
|
var triggerTouch = GetUnityButton(14);
|
|
var stickTouch = GetUnityButton(16);
|
|
|
|
var stickX = GetUnityAxis(1);
|
|
var stickY = GetUnityAxis(2);
|
|
var trigger = GetUnityAxis(9);
|
|
var grip = GetUnityAxis(11);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.System, startPress);
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, yPress);
|
|
currState.SetButtonPress(VRModuleRawButton.A, xPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, stickPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, gripPress);
|
|
currState.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripPress);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, yTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.A, xTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, stickTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Grip, grip >= 0.05f);
|
|
currState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, grip >= 0.05f);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, stickX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -stickY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
|
|
}
|
|
|
|
private static void Update_R_OculusTouch(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var aPress = GetUnityButton(0);
|
|
var bPress = GetUnityButton(1);
|
|
var stickPress = GetUnityButton(9);
|
|
var gripPress = GetUnityButton(5);
|
|
var aTouch = GetUnityButton(10);
|
|
var bTouch = GetUnityButton(11);
|
|
var triggerTouch = GetUnityButton(15);
|
|
var stickTouch = GetUnityButton(17);
|
|
|
|
var stickX = GetUnityAxis(4);
|
|
var stickY = GetUnityAxis(5);
|
|
var trigger = GetUnityAxis(10);
|
|
var grip = GetUnityAxis(12);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, bPress);
|
|
currState.SetButtonPress(VRModuleRawButton.A, aPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, stickPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, gripPress);
|
|
currState.SetButtonPress(VRModuleRawButton.CapSenseGrip, gripPress);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, bTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.A, aTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, stickTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Grip, grip >= 0.05f);
|
|
currState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, grip >= 0.05f);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, stickX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -stickY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
|
|
}
|
|
|
|
private static void Update_L_Knuckles(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var innerPress = GetUnityButton(2);
|
|
var outerPress = GetUnityButton(3);
|
|
var padPress = GetUnityButton(8);
|
|
var triggerTouch = GetUnityButton(14);
|
|
var padTouch = GetUnityButton(16);
|
|
|
|
var padX = GetUnityAxis(1);
|
|
var padY = GetUnityAxis(2);
|
|
var trigger = GetUnityAxis(9);
|
|
var grip = GetUnityAxis(11);
|
|
var index = GetUnityAxis(20);
|
|
var middle = GetUnityAxis(22);
|
|
var ring = GetUnityAxis(24);
|
|
var pinky = GetUnityAxis(26);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, outerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.A, innerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
|
|
currState.SetAxisValue(VRModuleRawAxis.IndexCurl, index);
|
|
currState.SetAxisValue(VRModuleRawAxis.MiddleCurl, middle);
|
|
currState.SetAxisValue(VRModuleRawAxis.RingCurl, ring);
|
|
currState.SetAxisValue(VRModuleRawAxis.PinkyCurl, pinky);
|
|
}
|
|
|
|
private static void Update_R_Knuckles(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var innerPress = GetUnityButton(0);
|
|
var outerPress = GetUnityButton(1);
|
|
var padPress = GetUnityButton(9);
|
|
var triggerTouch = GetUnityButton(15);
|
|
var padTouch = GetUnityButton(17);
|
|
|
|
var padX = GetUnityAxis(4);
|
|
var padY = GetUnityAxis(5);
|
|
var trigger = GetUnityAxis(10);
|
|
var grip = GetUnityAxis(12);
|
|
var index = GetUnityAxis(21);
|
|
var middle = GetUnityAxis(23);
|
|
var ring = GetUnityAxis(25);
|
|
var pinky = GetUnityAxis(27);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, outerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.A, innerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.55f, 0.45f));
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1.0f);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, triggerTouch);
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, grip);
|
|
currState.SetAxisValue(VRModuleRawAxis.IndexCurl, index);
|
|
currState.SetAxisValue(VRModuleRawAxis.MiddleCurl, middle);
|
|
currState.SetAxisValue(VRModuleRawAxis.RingCurl, ring);
|
|
currState.SetAxisValue(VRModuleRawAxis.PinkyCurl, pinky);
|
|
}
|
|
|
|
private static void Update_L_MicrosoftMR(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var menuPress = GetUnityButton(2);
|
|
var padPress = GetUnityButton(8);
|
|
var triggerPress = GetUnityButton(14);
|
|
var padTouch = GetUnityButton(16);
|
|
|
|
var stickX = GetUnityAxis(1);
|
|
var stickY = GetUnityAxis(2);
|
|
var trigger = GetUnityAxis(9);
|
|
var grip = GetUnityAxis(11);
|
|
var padX = GetUnityAxis(17);
|
|
var padY = GetUnityAxis(18);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, triggerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1f);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.25f, 0.20f));
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.JoystickX, stickX);
|
|
currState.SetAxisValue(VRModuleRawAxis.JoystickY, -stickY);
|
|
}
|
|
|
|
private static void Update_R_MicrosoftMR(IVRModuleDeviceState prevState, IVRModuleDeviceStateRW currState)
|
|
{
|
|
var menuPress = GetUnityButton(0);
|
|
var padPress = GetUnityButton(9);
|
|
var triggerPress = GetUnityButton(15);
|
|
var padTouch = GetUnityButton(17);
|
|
|
|
var stickX = GetUnityAxis(4);
|
|
var stickY = GetUnityAxis(5);
|
|
var trigger = GetUnityAxis(10);
|
|
var grip = GetUnityAxis(12);
|
|
var padX = GetUnityAxis(19);
|
|
var padY = GetUnityAxis(20);
|
|
|
|
currState.SetButtonPress(VRModuleRawButton.ApplicationMenu, menuPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Touchpad, padPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Trigger, triggerPress);
|
|
currState.SetButtonPress(VRModuleRawButton.Grip, grip >= 1f);
|
|
|
|
currState.SetButtonTouch(VRModuleRawButton.Touchpad, padTouch);
|
|
currState.SetButtonTouch(VRModuleRawButton.Trigger, AxisToPress(prevState.GetButtonPress(VRModuleRawButton.Trigger), trigger, 0.25f, 0.20f));
|
|
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadX, padX);
|
|
currState.SetAxisValue(VRModuleRawAxis.TouchpadY, -padY);
|
|
currState.SetAxisValue(VRModuleRawAxis.Trigger, trigger);
|
|
currState.SetAxisValue(VRModuleRawAxis.JoystickX, stickX);
|
|
currState.SetAxisValue(VRModuleRawAxis.JoystickY, -stickY);
|
|
}
|
|
#endif
|
|
}
|
|
} |