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.
136 lines
6.2 KiB
136 lines
6.2 KiB
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. =========== |
|
|
|
using HTC.UnityPlugin.Utility; |
|
using System.Text.RegularExpressions; |
|
|
|
namespace HTC.UnityPlugin.VRModuleManagement |
|
{ |
|
public partial class VRModule : SingletonBehaviour<VRModule> |
|
{ |
|
public abstract class ModuleBase |
|
{ |
|
protected const uint MAX_DEVICE_COUNT = VRModule.MAX_DEVICE_COUNT; |
|
protected const uint INVALID_DEVICE_INDEX = VRModule.INVALID_DEVICE_INDEX; |
|
|
|
private static readonly Regex s_viveRgx = new Regex("^.*(vive|htc).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex s_oculusRgx = new Regex("^.*(oculus).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex s_knucklesRgx = new Regex("^.*(knuckles).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex s_daydreamRgx = new Regex("^.*(daydream).*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex s_leftRgx = new Regex("^.*left.*$", RegexOptions.IgnoreCase); |
|
private static readonly Regex s_rightRgx = new Regex("^.*right.*$", RegexOptions.IgnoreCase); |
|
|
|
public virtual bool ShouldActiveModule() { return false; } |
|
|
|
public virtual void OnActivated() { } |
|
|
|
public virtual void OnDeactivated() { } |
|
|
|
public virtual bool HasInputFocus() { return true; } |
|
public virtual uint GetLeftControllerDeviceIndex() { return INVALID_DEVICE_INDEX; } |
|
public virtual uint GetRightControllerDeviceIndex() { return INVALID_DEVICE_INDEX; } |
|
public virtual void UpdateTrackingSpaceType() { } |
|
public virtual void Update() { } |
|
|
|
public virtual void UpdateDeviceState(IVRModuleDeviceState[] prevState, IVRModuleDeviceStateRW[] currState) |
|
{ |
|
for (uint i = 0; i < MAX_DEVICE_COUNT; ++i) |
|
{ |
|
if (prevState[i].isConnected) { currState[i].Reset(); } |
|
} |
|
} |
|
|
|
public virtual void TriggerViveControllerHaptic(uint deviceIndex, ushort durationMicroSec = 500) { } |
|
|
|
protected void InvokeInputFocusEvent(bool value) |
|
{ |
|
VRModule.InvokeInputFocusEvent(value); |
|
} |
|
|
|
protected void InvokeControllerRoleChangedEvent() |
|
{ |
|
VRModule.InvokeControllerRoleChangedEvent(); |
|
} |
|
|
|
protected static void SetupKnownDeviceModel(IVRModuleDeviceStateRW deviceState) |
|
{ |
|
if (s_viveRgx.IsMatch(deviceState.modelNumber) || s_viveRgx.IsMatch(deviceState.renderModelName)) |
|
{ |
|
switch (deviceState.deviceClass) |
|
{ |
|
case VRModuleDeviceClass.HMD: |
|
deviceState.deviceModel = VRModuleDeviceModel.ViveHMD; |
|
return; |
|
case VRModuleDeviceClass.Controller: |
|
deviceState.deviceModel = VRModuleDeviceModel.ViveController; |
|
return; |
|
case VRModuleDeviceClass.GenericTracker: |
|
deviceState.deviceModel = VRModuleDeviceModel.ViveTracker; |
|
return; |
|
case VRModuleDeviceClass.TrackingReference: |
|
deviceState.deviceModel = VRModuleDeviceModel.ViveBaseStation; |
|
return; |
|
} |
|
} |
|
else if (s_oculusRgx.IsMatch(deviceState.modelNumber)) |
|
{ |
|
switch (deviceState.deviceClass) |
|
{ |
|
case VRModuleDeviceClass.HMD: |
|
deviceState.deviceModel = VRModuleDeviceModel.OculusHMD; |
|
return; |
|
case VRModuleDeviceClass.Controller: |
|
if (s_leftRgx.IsMatch(deviceState.modelNumber)) |
|
{ |
|
deviceState.deviceModel = VRModuleDeviceModel.OculusTouchLeft; |
|
return; |
|
} |
|
else if (s_rightRgx.IsMatch(deviceState.modelNumber)) |
|
{ |
|
deviceState.deviceModel = VRModuleDeviceModel.OculusTouchRight; |
|
return; |
|
} |
|
break; |
|
case VRModuleDeviceClass.TrackingReference: |
|
deviceState.deviceModel = VRModuleDeviceModel.OculusSensor; |
|
return; |
|
} |
|
} |
|
else if (deviceState.deviceClass == VRModuleDeviceClass.Controller && s_knucklesRgx.IsMatch(deviceState.modelNumber)) |
|
{ |
|
if (s_leftRgx.IsMatch(deviceState.renderModelName)) |
|
{ |
|
deviceState.deviceModel = VRModuleDeviceModel.KnucklesLeft; |
|
return; |
|
} |
|
else if (s_rightRgx.IsMatch(deviceState.renderModelName)) |
|
{ |
|
deviceState.deviceModel = VRModuleDeviceModel.KnucklesRight; |
|
return; |
|
} |
|
} |
|
else if (s_daydreamRgx.IsMatch(deviceState.modelNumber)) |
|
{ |
|
switch (deviceState.deviceClass) |
|
{ |
|
case VRModuleDeviceClass.HMD: |
|
deviceState.deviceModel = VRModuleDeviceModel.DaydreamHMD; |
|
return; |
|
case VRModuleDeviceClass.Controller: |
|
deviceState.deviceModel = VRModuleDeviceModel.DaydreamController; |
|
return; |
|
} |
|
} |
|
|
|
|
|
deviceState.deviceModel = VRModuleDeviceModel.Unknown; |
|
} |
|
|
|
public static bool AxisToPress(bool previousPressedState, float currentAxisValue, float setThreshold, float unsetThreshold) |
|
{ |
|
return previousPressedState ? currentAxisValue > unsetThreshold : currentAxisValue >= setThreshold; |
|
} |
|
} |
|
|
|
private sealed class DefaultModule : ModuleBase { } |
|
} |
|
} |