146 lines
4.6 KiB
C#
146 lines
4.6 KiB
C#
using System;
|
|
using System.Runtime.InteropServices.WindowsRuntime;
|
|
using HurricaneVR.Framework.ControllerInput;
|
|
using HurricaneVR.Framework.Shared;
|
|
using UnityEngine;
|
|
using UnityEngine.Serialization;
|
|
|
|
namespace HurricaneVR.Framework.Components
|
|
{
|
|
/// <summary>
|
|
/// Stores Unity SDK and Device offset combinations to handle the differences between SDK's and the position and rotation values they report.
|
|
/// </summary>
|
|
[CreateAssetMenu(menuName = "HurricaneVR/Controller Offsets", fileName = "ControllerOffset")]
|
|
public class HVRControllerOffsets : ScriptableObject
|
|
{
|
|
[Header("Unity XR")]
|
|
public HVRDevicePoseOffset Oculus;
|
|
|
|
public HVRDevicePoseOffset WMR;
|
|
public HVRDevicePoseOffset Pico;
|
|
|
|
[Header("SteamVR")]
|
|
public HVRDevicePoseOffset OculusSteamVR;
|
|
|
|
public HVRDevicePoseOffset WMRSteamVR;
|
|
public HVRDevicePoseOffset ReverbG2SteamVR;
|
|
public HVRDevicePoseOffset CosmosSteamVR;
|
|
public HVRDevicePoseOffset ViveSteamVR;
|
|
public HVRDevicePoseOffset KnucklesSteamVR;
|
|
|
|
[Header("OpenXR")]
|
|
public HVRDevicePoseOffset OculusOpenXR;
|
|
|
|
public HVRDevicePoseOffset WMROpenXR;
|
|
public HVRDevicePoseOffset ReverbG2OpenXR;
|
|
public HVRDevicePoseOffset ViveOpenXR;
|
|
public HVRDevicePoseOffset CosmosOpenXR;
|
|
public HVRDevicePoseOffset KnucklesOpenXR;
|
|
public HVRDevicePoseOffset PicoOpenXR;
|
|
|
|
public HVRDevicePoseOffset GetDeviceOffset(HVRHandSide side)
|
|
{
|
|
if (side == HVRHandSide.Left)
|
|
return GetDeviceOffset(HVRInputManager.Instance.LeftController.ControllerType);
|
|
return GetDeviceOffset(HVRInputManager.Instance.RightController.ControllerType);
|
|
}
|
|
|
|
public HVRDevicePoseOffset GetDeviceOffset(HVRControllerType type)
|
|
{
|
|
var steamVR = HVRInputManager.Instance.IsSteamVR;
|
|
var openXr = HVRInputManager.Instance.IsOpenXR;
|
|
|
|
switch (type)
|
|
{
|
|
case HVRControllerType.Oculus:
|
|
if (steamVR)
|
|
{
|
|
return OculusSteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return OculusOpenXR;
|
|
}
|
|
else
|
|
{
|
|
return Oculus;
|
|
}
|
|
case HVRControllerType.WMR:
|
|
if (steamVR)
|
|
{
|
|
return WMRSteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return WMROpenXR;
|
|
}
|
|
else
|
|
{
|
|
return WMR;
|
|
}
|
|
case HVRControllerType.Vive:
|
|
if (steamVR)
|
|
{
|
|
return ViveSteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return ViveOpenXR;
|
|
}
|
|
|
|
break;
|
|
case HVRControllerType.Knuckles:
|
|
if (steamVR)
|
|
{
|
|
return KnucklesSteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return KnucklesOpenXR;
|
|
}
|
|
|
|
break;
|
|
case HVRControllerType.Cosmos:
|
|
if (steamVR)
|
|
{
|
|
return CosmosSteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return CosmosOpenXR;
|
|
}
|
|
|
|
break;
|
|
case HVRControllerType.ReverbG2:
|
|
if (steamVR)
|
|
{
|
|
return ReverbG2SteamVR;
|
|
}
|
|
else if (openXr)
|
|
{
|
|
return ReverbG2OpenXR;
|
|
}
|
|
|
|
break;
|
|
case HVRControllerType.Pico:
|
|
if (steamVR) //is there a way to detect pico when using steamvr? it's emulated as a oculus device
|
|
return null;
|
|
if (openXr)
|
|
return PicoOpenXR;
|
|
return Pico;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class HVRDevicePoseOffset
|
|
{
|
|
public Vector3 Position;
|
|
|
|
[FormerlySerializedAs("_rotation")]
|
|
[SerializeField]
|
|
public Vector3 Rotation;
|
|
}
|
|
} |