You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
10 KiB
275 lines
10 KiB
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. =========== |
|
|
|
using HTC.UnityPlugin.Utility; |
|
using System; |
|
using UnityEngine; |
|
|
|
namespace HTC.UnityPlugin.VRModuleManagement |
|
{ |
|
public enum VRModuleDeviceClass |
|
{ |
|
Invalid, |
|
HMD, |
|
Controller, |
|
GenericTracker, |
|
TrackingReference, |
|
} |
|
|
|
public enum VRModuleDeviceModel |
|
{ |
|
Unknown, |
|
ViveHMD, |
|
ViveController, |
|
ViveTracker, |
|
ViveBaseStation, |
|
OculusHMD, |
|
OculusTouchLeft, |
|
OculusTouchRight, |
|
OculusSensor, |
|
KnucklesLeft, |
|
KnucklesRight, |
|
DaydreamHMD, |
|
DaydreamController, |
|
ViveFocusHMD, |
|
ViveFocusFinch, |
|
} |
|
|
|
public enum VRModuleRawButton |
|
{ |
|
System = 0, |
|
ApplicationMenu = 1, |
|
Grip = 2, |
|
DPadLeft = 3, |
|
DPadUp = 4, |
|
DPadRight = 5, |
|
DPadDown = 6, |
|
A = 7, |
|
ProximitySensor = 31, |
|
Axis0 = 32, |
|
Axis1 = 33, |
|
Axis2 = 34, |
|
Axis3 = 35, |
|
Axis4 = 36, |
|
|
|
// alias |
|
DashboardBack = 2, // Grip |
|
Touchpad = 32, // Axis0 |
|
Trigger = 33, // Axis1 |
|
CapSenseGrip = 34, // Axis2 |
|
} |
|
|
|
public enum VRModuleRawAxis |
|
{ |
|
Axis0X, |
|
Axis0Y, |
|
Axis1X, |
|
Axis1Y, |
|
Axis2X, |
|
Axis2Y, |
|
Axis3X, |
|
Axis3Y, |
|
Axis4X, |
|
Axis4Y, |
|
|
|
// alias |
|
TouchpadX = Axis0X, |
|
TouchpadY = Axis0Y, |
|
Trigger = Axis1X, |
|
CapSenseGrip = Axis2X, |
|
IndexCurl = Axis3X, |
|
MiddleCurl = Axis3Y, |
|
RingCurl = Axis4X, |
|
PinkyCurl = Axis4Y, |
|
} |
|
|
|
public interface IVRModuleDeviceStateRW |
|
{ |
|
uint deviceIndex { get; } |
|
string serialNumber { get; set; } |
|
string modelNumber { get; set; } |
|
string renderModelName { get; set; } |
|
VRModuleDeviceClass deviceClass { get; set; } |
|
VRModuleDeviceModel deviceModel { get; set; } |
|
|
|
bool isConnected { get; set; } |
|
bool isPoseValid { get; set; } |
|
bool isOutOfRange { get; set; } |
|
bool isCalibrating { get; set; } |
|
bool isUninitialized { get; set; } |
|
Vector3 velocity { get; set; } |
|
Vector3 angularVelocity { get; set; } |
|
Vector3 position { get; set; } |
|
Quaternion rotation { get; set; } |
|
RigidPose pose { get; set; } |
|
|
|
ulong buttonPressed { get; set; } |
|
ulong buttonTouched { get; set; } |
|
float[] axisValue { get; } |
|
|
|
bool GetButtonPress(VRModuleRawButton button); |
|
bool GetButtonTouch(VRModuleRawButton button); |
|
float GetAxisValue(VRModuleRawAxis axis); |
|
|
|
void SetButtonPress(VRModuleRawButton button, bool value); |
|
void SetButtonTouch(VRModuleRawButton button, bool value); |
|
void SetAxisValue(VRModuleRawAxis axis, float value); |
|
void ResetAxisValues(); |
|
void Reset(); |
|
} |
|
|
|
public interface IVRModuleDeviceState |
|
{ |
|
uint deviceIndex { get; } |
|
string serialNumber { get; } |
|
string modelNumber { get; } |
|
string renderModelName { get; } |
|
VRModuleDeviceClass deviceClass { get; } |
|
VRModuleDeviceModel deviceModel { get; } |
|
|
|
bool isConnected { get; } |
|
bool isPoseValid { get; } |
|
bool isOutOfRange { get; } |
|
bool isCalibrating { get; } |
|
bool isUninitialized { get; } |
|
Vector3 velocity { get; } |
|
Vector3 angularVelocity { get; } |
|
Vector3 position { get; } |
|
Quaternion rotation { get; } |
|
RigidPose pose { get; } |
|
|
|
ulong buttonPressed { get; } |
|
ulong buttonTouched { get; } |
|
|
|
bool GetButtonPress(VRModuleRawButton button); |
|
bool GetButtonTouch(VRModuleRawButton button); |
|
float GetAxisValue(VRModuleRawAxis axis); |
|
} |
|
|
|
public partial class VRModule : SingletonBehaviour<VRModule> |
|
{ |
|
[Serializable] |
|
private class DeviceState : IVRModuleDeviceState, IVRModuleDeviceStateRW |
|
{ |
|
[SerializeField] |
|
private string m_serialNumber; |
|
[SerializeField] |
|
private string m_modelNumber; |
|
[SerializeField] |
|
private string m_renderModelName; |
|
[SerializeField] |
|
private VRModuleDeviceClass m_deviceClass; |
|
[SerializeField] |
|
private VRModuleDeviceModel m_deviceModel; |
|
|
|
[SerializeField] |
|
private bool m_isPoseValid; |
|
[SerializeField] |
|
private bool m_isConnected; |
|
[SerializeField] |
|
private bool m_isOutOfRange; |
|
[SerializeField] |
|
private bool m_isCalibrating; |
|
[SerializeField] |
|
private bool m_isUninitialized; |
|
[SerializeField] |
|
private Vector3 m_velocity; |
|
[SerializeField] |
|
private Vector3 m_angularVelocity; |
|
[SerializeField] |
|
private Vector3 m_position; |
|
[SerializeField] |
|
private Quaternion m_rotation; |
|
|
|
// device property, changed only when connected or disconnected |
|
public uint deviceIndex { get; private set; } |
|
public string serialNumber { get { return m_serialNumber; } set { m_serialNumber = value; } } |
|
public string modelNumber { get { return m_modelNumber; } set { m_modelNumber = value; } } |
|
public string renderModelName { get { return m_renderModelName; } set { m_renderModelName = value; } } |
|
public VRModuleDeviceClass deviceClass { get { return m_deviceClass; } set { m_deviceClass = value; } } |
|
public VRModuleDeviceModel deviceModel { get { return m_deviceModel; } set { m_deviceModel = value; } } |
|
// device pose state |
|
public bool isPoseValid { get { return m_isPoseValid; } set { m_isPoseValid = value; } } |
|
public bool isConnected { get { return m_isConnected; } set { m_isConnected = value; } } |
|
public bool isOutOfRange { get { return m_isOutOfRange; } set { m_isOutOfRange = value; } } |
|
public bool isCalibrating { get { return m_isCalibrating; } set { m_isCalibrating = value; } } |
|
public bool isUninitialized { get { return m_isUninitialized; } set { m_isUninitialized = value; } } |
|
public Vector3 velocity { get { return m_velocity; } set { m_velocity = value; } } |
|
public Vector3 angularVelocity { get { return m_angularVelocity; } set { m_angularVelocity = value; } } |
|
public Vector3 position { get { return m_position; } set { m_position = value; } } |
|
public Quaternion rotation { get { return m_rotation; } set { m_rotation = value; } } |
|
public RigidPose pose { get { return new RigidPose(m_position, m_rotation); } set { m_position = value.pos; m_rotation = value.rot; } } |
|
|
|
// device input state |
|
[SerializeField] |
|
public ulong m_buttonPressed; |
|
[SerializeField] |
|
public ulong m_buttonTouched; |
|
[SerializeField] |
|
public float[] m_axisValue; |
|
|
|
public ulong buttonPressed { get { return m_buttonPressed; } set { m_buttonPressed = value; } } |
|
public ulong buttonTouched { get { return m_buttonTouched; } set { m_buttonTouched = value; } } |
|
public float[] axisValue { get { return m_axisValue; } } |
|
|
|
public bool GetButtonPress(VRModuleRawButton button) { return EnumUtils.GetFlag(m_buttonPressed, (int)button); } |
|
public bool GetButtonTouch(VRModuleRawButton button) { return EnumUtils.GetFlag(m_buttonTouched, (int)button); } |
|
public float GetAxisValue(VRModuleRawAxis axis) { return m_axisValue[(int)axis]; } |
|
|
|
public void SetButtonPress(VRModuleRawButton button, bool value) { m_buttonPressed = value ? EnumUtils.SetFlag(m_buttonPressed, (int)button) : EnumUtils.UnsetFlag(m_buttonPressed, (int)button); } |
|
public void SetButtonTouch(VRModuleRawButton button, bool value) { m_buttonTouched = value ? EnumUtils.SetFlag(m_buttonTouched, (int)button) : EnumUtils.UnsetFlag(m_buttonTouched, (int)button); } |
|
public void SetAxisValue(VRModuleRawAxis axis, float value) { m_axisValue[(int)axis] = value; } |
|
public void ResetAxisValues() { Array.Clear(m_axisValue, 0, m_axisValue.Length); } |
|
|
|
public DeviceState(uint deviceIndex) |
|
{ |
|
this.deviceIndex = deviceIndex; |
|
this.m_axisValue = new float[EnumUtils.GetMaxValue(typeof(VRModuleRawAxis)) + 1]; |
|
Reset(); |
|
} |
|
|
|
public void CopyFrom(DeviceState state) |
|
{ |
|
m_serialNumber = state.m_serialNumber; |
|
m_modelNumber = state.m_modelNumber; |
|
m_renderModelName = state.m_renderModelName; |
|
m_deviceClass = state.m_deviceClass; |
|
m_deviceModel = state.m_deviceModel; |
|
|
|
m_isPoseValid = state.m_isPoseValid; |
|
m_isConnected = state.m_isConnected; |
|
m_isOutOfRange = state.m_isOutOfRange; |
|
m_isCalibrating = state.m_isCalibrating; |
|
m_isUninitialized = state.m_isUninitialized; |
|
m_velocity = state.m_velocity; |
|
m_angularVelocity = state.m_angularVelocity; |
|
m_position = state.m_position; |
|
m_rotation = state.m_rotation; |
|
|
|
m_buttonPressed = state.m_buttonPressed; |
|
m_buttonTouched = state.m_buttonTouched; |
|
Array.Copy(state.m_axisValue, m_axisValue, m_axisValue.Length); |
|
} |
|
|
|
public void Reset() |
|
{ |
|
deviceClass = VRModuleDeviceClass.Invalid; |
|
serialNumber = string.Empty; |
|
modelNumber = string.Empty; |
|
renderModelName = string.Empty; |
|
isConnected = false; |
|
isPoseValid = false; |
|
isOutOfRange = false; |
|
isCalibrating = false; |
|
isUninitialized = false; |
|
velocity = Vector3.zero; |
|
angularVelocity = Vector3.zero; |
|
m_position = Vector3.zero; |
|
m_rotation = Quaternion.identity; |
|
|
|
m_buttonPressed = 0ul; |
|
m_buttonTouched = 0ul; |
|
ResetAxisValues(); |
|
} |
|
} |
|
} |
|
} |