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.
316 lines
15 KiB
316 lines
15 KiB
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. =========== |
|
|
|
#if UNITY_5_5_OR_NEWER && !UNITY_2017_1_OR_NEWER |
|
using HTC.UnityPlugin.Utility; |
|
using System.Text.RegularExpressions; |
|
using UnityEngine; |
|
using UnityEngine.VR; |
|
#endif |
|
|
|
namespace HTC.UnityPlugin.VRModuleManagement |
|
{ |
|
public sealed partial class UnityEngineVRModule : VRModule.ModuleBase |
|
{ |
|
#if UNITY_5_5_OR_NEWER && !UNITY_2017_1_OR_NEWER |
|
private static readonly Regex m_viveRgx = new Regex("^.*(htc|vive|openvr).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex m_oculusRgx = new Regex("^.*(oculus).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex m_leftRgx = new Regex("^.*left.*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex m_rightRgx = new Regex("^.*right.*$", RegexOptions.IgnoreCase); |
|
|
|
private readonly uint m_headIndex = 0u; |
|
private readonly uint m_leftIndex = 1u; |
|
private readonly uint m_rightIndex = 2u; |
|
|
|
private string m_leftJoystickName = string.Empty; |
|
private string m_rightJoystickName = string.Empty; |
|
private int m_leftJoystickNameIndex = -1; |
|
private int m_rightJoystickNameIndex = -1; |
|
|
|
#if UNITY_5_6_OR_NEWER |
|
private TrackingSpaceType m_prevTrackingSpace; |
|
|
|
public override void OnActivated() |
|
{ |
|
m_prevTrackingSpace = VRDevice.GetTrackingSpaceType(); |
|
UpdateTrackingSpaceType(); |
|
} |
|
|
|
public override void OnDeactivated() |
|
{ |
|
VRDevice.SetTrackingSpaceType(m_prevTrackingSpace); |
|
} |
|
|
|
public override void UpdateTrackingSpaceType() |
|
{ |
|
switch (VRModule.trackingSpaceType) |
|
{ |
|
case VRModuleTrackingSpaceType.Stationary: |
|
VRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary); |
|
break; |
|
case VRModuleTrackingSpaceType.RoomScale: |
|
VRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale); |
|
break; |
|
} |
|
} |
|
#endif |
|
|
|
public override uint GetLeftControllerDeviceIndex() { return m_leftIndex; } |
|
|
|
public override uint GetRightControllerDeviceIndex() { return m_rightIndex; } |
|
|
|
public override void UpdateDeviceState(IVRModuleDeviceState[] prevState, IVRModuleDeviceStateRW[] currState) |
|
{ |
|
var joystickNames = default(string[]); |
|
|
|
// head |
|
var headCurrState = currState[m_headIndex]; |
|
var headPrevState = prevState[m_headIndex]; |
|
|
|
headCurrState.isConnected = VRDevice.isPresent; |
|
|
|
if (headCurrState.isConnected) |
|
{ |
|
if (!headPrevState.isConnected) |
|
{ |
|
headCurrState.deviceClass = VRModuleDeviceClass.HMD; |
|
headCurrState.serialNumber = VRDevice.model + " HMD"; |
|
headCurrState.modelNumber = VRDevice.model + " HMD"; |
|
|
|
if (m_viveRgx.IsMatch(VRDevice.model)) |
|
{ |
|
headCurrState.deviceModel = VRModuleDeviceModel.ViveHMD; |
|
} |
|
else if (m_oculusRgx.IsMatch(VRDevice.model)) |
|
{ |
|
headCurrState.deviceModel = VRModuleDeviceModel.OculusHMD; |
|
} |
|
else |
|
{ |
|
headCurrState.deviceModel = VRModuleDeviceModel.Unknown; |
|
} |
|
|
|
headCurrState.renderModelName = VRDevice.model + " " + headCurrState.deviceModel.ToString(); |
|
} |
|
|
|
headCurrState.position = InputTracking.GetLocalPosition(VRNode.Head); |
|
headCurrState.rotation = InputTracking.GetLocalRotation(VRNode.Head); |
|
headCurrState.isPoseValid = headCurrState.pose != RigidPose.identity && headCurrState.pose != headPrevState.pose; |
|
} |
|
else |
|
{ |
|
if (headPrevState.isConnected) |
|
{ |
|
headCurrState.Reset(); |
|
} |
|
} |
|
|
|
// right |
|
var rightCurrState = currState[m_rightIndex]; |
|
var rightPrevState = prevState[m_rightIndex]; |
|
|
|
rightCurrState.position = InputTracking.GetLocalPosition(VRNode.RightHand); |
|
rightCurrState.rotation = InputTracking.GetLocalRotation(VRNode.RightHand); |
|
rightCurrState.isPoseValid = rightCurrState.pose != RigidPose.identity && rightCurrState.pose != rightPrevState.pose; |
|
|
|
// right connected state |
|
if (rightCurrState.isPoseValid) |
|
{ |
|
if (!rightPrevState.isConnected) |
|
{ |
|
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); } |
|
for (int i = joystickNames.Length - 1; i >= 0; --i) |
|
{ |
|
if (!string.IsNullOrEmpty(joystickNames[i]) && m_rightRgx.IsMatch(joystickNames[i])) |
|
{ |
|
rightCurrState.isConnected = true; |
|
m_rightJoystickName = joystickNames[i]; |
|
m_rightJoystickNameIndex = i; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (rightPrevState.isConnected) |
|
{ |
|
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); } |
|
if (string.IsNullOrEmpty(joystickNames[m_rightJoystickNameIndex])) |
|
{ |
|
rightCurrState.isConnected = false; |
|
m_rightJoystickName = string.Empty; |
|
m_rightJoystickNameIndex = -1; |
|
} |
|
} |
|
} |
|
// right input state |
|
if (rightCurrState.isConnected) |
|
{ |
|
if (!rightPrevState.isConnected) |
|
{ |
|
rightCurrState.deviceClass = VRModuleDeviceClass.Controller; |
|
rightCurrState.serialNumber = m_rightJoystickName; |
|
rightCurrState.modelNumber = VRDevice.model + " Controller"; |
|
|
|
if (m_viveRgx.IsMatch(VRDevice.model)) |
|
{ |
|
rightCurrState.deviceModel = VRModuleDeviceModel.ViveController; |
|
} |
|
else if (m_oculusRgx.IsMatch(VRDevice.model)) |
|
{ |
|
rightCurrState.deviceModel = VRModuleDeviceModel.OculusTouchRight; |
|
} |
|
else |
|
{ |
|
rightCurrState.deviceModel = VRModuleDeviceModel.Unknown; |
|
} |
|
|
|
rightCurrState.renderModelName = VRDevice.model + " " + rightCurrState.deviceModel.ToString(); |
|
} |
|
|
|
var rightMenuPress = Input.GetKey(ButtonKeyCode.RMenuPress); |
|
var rightAButtonPress = Input.GetKey(ButtonKeyCode.RAKeyPress); |
|
var rightPadPress = Input.GetKey(ButtonKeyCode.RPadPress); |
|
|
|
var rightMenuTouch = Input.GetKey(ButtonKeyCode.RMenuTouch); |
|
var rightAButtonTouch = Input.GetKey(ButtonKeyCode.RAKeyTouch); |
|
var rightPadTouch = Input.GetKey(ButtonKeyCode.RPadTouch); |
|
var rightTriggerTouch = Input.GetKey(ButtonKeyCode.RTriggerTouch); |
|
|
|
var rightTrackpadX = Input.GetAxisRaw(ButtonAxisName.RPadX); |
|
var rightTrackpadY = Input.GetAxisRaw(ButtonAxisName.RPadY); |
|
var rightTrigger = Input.GetAxisRaw(ButtonAxisName.RTrigger); |
|
var rightGrip = Input.GetAxisRaw(ButtonAxisName.RGrip); |
|
|
|
rightCurrState.SetButtonPress(VRModuleRawButton.ApplicationMenu, rightMenuPress); |
|
rightCurrState.SetButtonPress(VRModuleRawButton.A, rightAButtonPress); |
|
rightCurrState.SetButtonPress(VRModuleRawButton.Touchpad, rightPadPress); |
|
rightCurrState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.Trigger), rightTrigger, 0.55f, 0.45f)); |
|
rightCurrState.SetButtonPress(VRModuleRawButton.Grip, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.Grip), rightGrip, 0.55f, 0.45f)); |
|
rightCurrState.SetButtonPress(VRModuleRawButton.CapSenseGrip, AxisToPress(rightPrevState.GetButtonPress(VRModuleRawButton.CapSenseGrip), rightGrip, 0.55f, 0.45f)); |
|
|
|
rightCurrState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, rightMenuTouch); |
|
rightCurrState.SetButtonTouch(VRModuleRawButton.A, rightAButtonTouch); |
|
rightCurrState.SetButtonTouch(VRModuleRawButton.Touchpad, rightPadTouch); |
|
rightCurrState.SetButtonTouch(VRModuleRawButton.Trigger, rightTriggerTouch); |
|
rightCurrState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, AxisToPress(rightPrevState.GetButtonTouch(VRModuleRawButton.CapSenseGrip), rightGrip, 0.25f, 0.20f)); |
|
|
|
rightCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, rightTrackpadX); |
|
rightCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, rightTrackpadY); |
|
rightCurrState.SetAxisValue(VRModuleRawAxis.Trigger, rightTrigger); |
|
rightCurrState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, rightGrip); |
|
} |
|
else |
|
{ |
|
if (rightPrevState.isConnected) |
|
{ |
|
rightCurrState.Reset(); |
|
} |
|
} |
|
|
|
// left |
|
var leftCurrState = currState[m_leftIndex]; |
|
var leftPrevState = prevState[m_leftIndex]; |
|
|
|
leftCurrState.position = InputTracking.GetLocalPosition(VRNode.LeftHand); |
|
leftCurrState.rotation = InputTracking.GetLocalRotation(VRNode.LeftHand); |
|
leftCurrState.isPoseValid = leftCurrState.pose != RigidPose.identity && leftCurrState.pose != leftPrevState.pose; |
|
// left connected state |
|
if (leftCurrState.isPoseValid) |
|
{ |
|
if (!leftPrevState.isConnected) |
|
{ |
|
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); } |
|
for (int i = joystickNames.Length - 1; i >= 0; --i) |
|
{ |
|
if (!string.IsNullOrEmpty(joystickNames[i]) && m_leftRgx.IsMatch(joystickNames[i])) |
|
{ |
|
leftCurrState.isConnected = true; |
|
m_leftJoystickName = joystickNames[i]; |
|
m_leftJoystickNameIndex = i; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (leftPrevState.isConnected) |
|
{ |
|
if (joystickNames == null) { joystickNames = Input.GetJoystickNames(); } |
|
if (string.IsNullOrEmpty(joystickNames[m_leftJoystickNameIndex])) |
|
{ |
|
leftCurrState.isConnected = false; |
|
m_leftJoystickName = string.Empty; |
|
m_leftJoystickNameIndex = -1; |
|
} |
|
} |
|
} |
|
// left input state |
|
if (leftCurrState.isConnected) |
|
{ |
|
if (!leftPrevState.isConnected) |
|
{ |
|
leftCurrState.deviceClass = VRModuleDeviceClass.Controller; |
|
leftCurrState.serialNumber = m_leftJoystickName; |
|
leftCurrState.modelNumber = VRDevice.model + " Controller"; |
|
|
|
if (m_viveRgx.IsMatch(VRDevice.model)) |
|
{ |
|
leftCurrState.deviceModel = VRModuleDeviceModel.ViveController; |
|
} |
|
else if (m_oculusRgx.IsMatch(VRDevice.model)) |
|
{ |
|
leftCurrState.deviceModel = VRModuleDeviceModel.OculusTouchLeft; |
|
} |
|
else |
|
{ |
|
leftCurrState.deviceModel = VRModuleDeviceModel.Unknown; |
|
} |
|
|
|
leftCurrState.renderModelName = VRDevice.model + " " + leftCurrState.deviceModel.ToString(); |
|
} |
|
|
|
var leftMenuPress = Input.GetKey(ButtonKeyCode.LMenuPress); |
|
var leftAButtonPress = Input.GetKey(ButtonKeyCode.LAKeyPress); |
|
var leftPadPress = Input.GetKey(ButtonKeyCode.LPadPress); |
|
|
|
var leftMenuTouch = Input.GetKey(ButtonKeyCode.LMenuTouch); |
|
var leftAButtonTouch = Input.GetKey(ButtonKeyCode.LAKeyTouch); |
|
var leftPadTouch = Input.GetKey(ButtonKeyCode.LPadTouch); |
|
var leftTriggerTouch = Input.GetKey(ButtonKeyCode.LTriggerTouch); |
|
|
|
var leftTrackpadX = Input.GetAxisRaw(ButtonAxisName.LPadX); |
|
var leftTrackpadY = Input.GetAxisRaw(ButtonAxisName.LPadY); |
|
var leftTrigger = Input.GetAxisRaw(ButtonAxisName.LTrigger); |
|
var leftGrip = Input.GetAxisRaw(ButtonAxisName.LGrip); |
|
|
|
leftCurrState.SetButtonPress(VRModuleRawButton.ApplicationMenu, leftMenuPress); |
|
leftCurrState.SetButtonPress(VRModuleRawButton.A, leftAButtonPress); |
|
leftCurrState.SetButtonPress(VRModuleRawButton.Touchpad, leftPadPress); |
|
leftCurrState.SetButtonPress(VRModuleRawButton.Trigger, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.Trigger), leftTrigger, 0.55f, 0.45f)); |
|
leftCurrState.SetButtonPress(VRModuleRawButton.Grip, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.Grip), leftGrip, 0.55f, 0.45f)); |
|
leftCurrState.SetButtonPress(VRModuleRawButton.CapSenseGrip, AxisToPress(leftPrevState.GetButtonPress(VRModuleRawButton.CapSenseGrip), leftGrip, 0.55f, 0.45f)); |
|
|
|
leftCurrState.SetButtonTouch(VRModuleRawButton.ApplicationMenu, leftMenuTouch); |
|
leftCurrState.SetButtonTouch(VRModuleRawButton.A, leftAButtonTouch); |
|
leftCurrState.SetButtonTouch(VRModuleRawButton.Touchpad, leftPadTouch); |
|
leftCurrState.SetButtonTouch(VRModuleRawButton.Trigger, leftTriggerTouch); |
|
leftCurrState.SetButtonTouch(VRModuleRawButton.CapSenseGrip, AxisToPress(leftPrevState.GetButtonTouch(VRModuleRawButton.CapSenseGrip), leftGrip, 0.25f, 0.20f)); |
|
|
|
leftCurrState.SetAxisValue(VRModuleRawAxis.TouchpadX, leftTrackpadX); |
|
leftCurrState.SetAxisValue(VRModuleRawAxis.TouchpadY, leftTrackpadY); |
|
leftCurrState.SetAxisValue(VRModuleRawAxis.Trigger, leftTrigger); |
|
leftCurrState.SetAxisValue(VRModuleRawAxis.CapSenseGrip, leftGrip); |
|
} |
|
else |
|
{ |
|
if (leftPrevState.isConnected) |
|
{ |
|
leftCurrState.Reset(); |
|
} |
|
} |
|
} |
|
#endif |
|
} |
|
} |