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
3 years ago
|
//========= 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 { }
|
||
|
}
|
||
|
}
|