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
3 years ago
|
//========= 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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|