18using System.Collections.Generic;
21#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
22using UnityEngine.InputSystem;
23using UnityEngine.InputSystem.Controls;
36 #region Private Fields
41 private Dictionary<GlassesHandle, GlassesCore>
glassesCores =
new Dictionary<GlassesHandle, GlassesCore>();
44 private HashSet<GlassesHandle>
lostHandles =
new HashSet<GlassesHandle>();
122 #endregion Public Fields
125 #region Public Functions
135 if(playerIndex ==
PlayerIndex.None || !
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
140 return Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore)
141 && glassesCore.TrackingUpdated;
153 Log.
Error(
"Glasses.Reset() could not find any spectator settings.");
160 foreach (var glassesCore
in Instance.glassesCores.Values)
162 glassesCore.Reset(glassesSettings, spectatorSettings);
167 if(
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
169 Reset(glassesSettings, spectatorSettings, glassesHandle);
184 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
194 return Validate(glassesSettings, spectatorSettings, glassesHandle);
209 foreach (var glassesCore
in Instance.glassesCores.Values)
211 glassesCore.Update(glassesSettings, scaleSettings, gameBoardSettings, spectatorSettings);
222 return Player.TryGetGlassesHandle(playerIndex, out var glassesHandle)
233 return Player.TryGetGlassesHandle(playerIndex, out var glassesHandle)
237#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
238 public static bool TryGetGlassesDevice(
PlayerIndex playerIndex, out GlassesDevice glassesDevice)
240 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
242 glassesDevice =
null;
246 return TryGetGlassesDevice(glassesHandle, out glassesDevice);
252 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
269 if(
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle) &&
Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
271 pose = glassesCore.Pose_UnityWorldSpace;
287 if (
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle) &&
Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
289 pose = glassesCore.previewCore.Pose_UnityWorldSpace;
298 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
307 if (!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
316 if (!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
326 UInt64[] glassesHandles =
new UInt64[
GlassesSettings.MAX_SUPPORTED_GLASSES_COUNT];
327 Debug.Assert(glassesHandles.Length <= Byte.MaxValue);
328 byte glassesCount = (byte)glassesHandles.Length;
336 catch (System.Exception e)
338 Log.
Error($
"Error getting glasses handles: {e.Message}");
354 var lostHandle = keyValuePair.Key;
355 var glassesCore = keyValuePair.Value;
357 glassesCore.Dispose();
365 for (
int i = 0; i < glassesCount; i++)
371 if (!
glassesCores.ContainsKey(glassesHandles[i]) && !
Player.AllSupportedPlayersConnected())
373#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
374 glassesCores[glassesHandles[i]] =
new GlassesDeviceCore(glassesHandles[i]);
376 glassesCores[glassesHandles[i]] =
new GlassesCore(glassesHandles[i]);
397 if (!
Instance.defaultGlassesHandle.HasValue && result == 0 && glassesCount > 0)
399 Instance.defaultGlassesHandle = glassesHandles[0];
405 Instance.defaultGlassesHandle =
null;
409 #endregion Public Functions
412 #region Internal Functions
416 if (Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore) && spectatorSettings !=
null)
418 glassesCore.Reset(glassesSettings, spectatorSettings);
424 return Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore)
425 && glassesCore.Validate(glassesSettings, spectatorSettings);
431 if (Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
433 glassesCore.Update(glassesSettings, scaleSettings, gameBoardSettings, spectatorSettings);
437 internal static bool IsTracked(GlassesHandle glassesHandle)
439 return Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore)
440 && glassesCore.IsTracked;
443 internal static bool IsConnected(GlassesHandle glassesHandle)
445 return Instance.glassesCores.ContainsKey(glassesHandle);
448#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
449 internal static bool TryGetGlassesDevice(GlassesHandle glassesHandle, out GlassesDevice glassesDevice)
451 if(!Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore)
452 || !(glassesCore is GlassesDeviceCore glassesDeviceCore))
454 glassesDevice =
null;
458 glassesDevice = glassesDeviceCore.glassesDevice;
463 internal static bool TryGetFriendlyName(GlassesHandle glassesHandle, out
string friendlyName)
465 if(!Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
471 return glassesCore.TryGetFriendlyName(out friendlyName);
480 internal static GlassesHandle? GetDefaultGlassesHandle()
482 var defaultGlassesHandle = Instance.defaultGlassesHandle;
483 return defaultGlassesHandle.HasValue && Instance.glassesCores.ContainsKey(defaultGlassesHandle.Value)
484 ? defaultGlassesHandle
488 internal static void SetDefaultGlassesHandle(GlassesHandle glassesHandle)
490 Instance.defaultGlassesHandle = glassesHandle;
493 internal static GlassesHandle[] GetAllConnectedGlassesHandles()
495 var keys = Instance.glassesCores.Keys;
496 GlassesHandle[] glassesHandles =
new GlassesHandle[keys.Count];
497 keys.CopyTo(glassesHandles, 0);
498 return glassesHandles;
501 internal static void OnDisable()
503 foreach (var glassesCore
in Instance.glassesCores.Values)
505 glassesCore.Dispose();
507 Instance.glassesCores.Clear();
510 #endregion Internal Functions
512 #region Private Functions
514 private static GameObject
GetPoseRoot(GlassesHandle glassesHandle)
516 if (!Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
520 return glassesCore.headPose.gameObject;
523 private static Camera
GetLeftEye(GlassesHandle glassesHandle)
525 if (!Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
529 return glassesCore.leftEye;
534 if (!Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
539 return glassesCore.rightEye;
545 && Instance.glassesCores.TryGetValue(glassesHandle, out var glassesCore))
558 spectatorSettings = tiltFiveManager2.spectatorSettings;
564 spectatorSettings = tiltFiveManager.spectatorSettings;
569 spectatorSettings =
null;
580 public Transform headPose => headPoseRoot.transform;
591 private readonly Vector3 DEFAULT_GLASSES_POSITION_GAME_BOARD_SPACE =
new Vector3(0f, 0.5f, -0.5f);
600 private readonly Quaternion DEFAULT_GLASSES_ROTATION_GAME_BOARD_SPACE = Quaternion.Euler(
new Vector3(-45f, 0f, 0f));
603 GlassesHandle glassesHandle,
607 this.glassesHandle = glassesHandle;
608 this.glassesPoseUsage = glassesPoseUsage;
609 headPoseRoot =
new GameObject(name);
614 GameObject.Destroy(headPoseRoot);
629 base.Update(glassesSettings, scaleSettings, gameBoardSettings);
634 pose_UGBD =
new Pose(
635 DEFAULT_GLASSES_POSITION_GAME_BOARD_SPACE,
636 DEFAULT_GLASSES_ROTATION_GAME_BOARD_SPACE);
643 pose_UWRLD = GameboardToWorldSpace(pose_UGBD, scaleSettings, gameBoardSettings);
648 connected = IsConnected(glassesHandle);
654 out
bool poseIsValid,
664 ref glassesPoseResult,
667 catch (System.Exception e)
673 poseIsValid = result == 0 && glassesPoseResult.GameboardType !=
GameboardType.GameboardType_None;
674 glassesPose = glassesPoseResult;
684 pose_UGBD = GetPoseGameboardSpace(glassesPose);
693 var newPose_GameboardSpace = GetPoseGameboardSpace(glassesPose);
700 pose_UGBD =
new Pose(pose_UGBD.position, newPose_GameboardSpace.rotation);
710 pose_UGBD =
new Pose(WorldToGameboardSpace(settings.
previewPose.position, scaleSettings, gameboardSettings),
711 WorldToGameboardSpace(settings.
previewPose.rotation, gameboardSettings));
720 pose_UGBD = newPose_GameboardSpace;
734 headPose.SetPositionAndRotation(headPose.position, pose_UWRLD.rotation);
744 headPose.SetPositionAndRotation(
755 headPose.SetPositionAndRotation(pose_UWRLD.position, pose_UWRLD.rotation);
775 Quaternion rotToDC_GBD = Quaternion.AngleAxis((-Mathf.PI / 2f) * Mathf.Rad2Deg, Vector3.right);
777 Quaternion rotToGBD_DC = Quaternion.Inverse(rotToDC_GBD);
781 Quaternion rotToGLS_DC = rotToGLS_GBD * rotToGBD_DC;
783 Quaternion rotToUGBD_UGLS =
new Quaternion(rotToGLS_DC.x, rotToGLS_DC.y, -rotToGLS_DC.z, rotToGLS_DC.w);
786 Vector3 posOfUGLS_UGBD = ConvertPosGBDToUGBD(glassesPose.
PosOfGLS_GBD);
788 return new Pose(posOfUGLS_UGBD, rotToUGBD_UGLS);
817 base.Update(glassesSettings, scaleSettings, gameBoardSettings);
833 public bool configured =
false;
835 public Dictionary<AREyes, Vector3> eyePositions =
new Dictionary<AREyes, Vector3>()
837 {
AREyes.EYE_LEFT,
new Vector3() },
838 {
AREyes.EYE_RIGHT,
new Vector3() }
841 public Dictionary<AREyes, Quaternion> eyeRotations =
new Dictionary<AREyes, Quaternion>()
843 {
AREyes.EYE_LEFT,
new Quaternion() },
844 {
AREyes.EYE_RIGHT,
new Quaternion() }
852 if(!
Player.TryGetPlayerIndex(glassesHandle, out playerIndex))
854 Player.TryAddPlayer(glassesHandle, out playerIndex);
859 Log.
Info($
"Glasses {glassesHandle} connected.");
864 GameObject.Destroy(splitStereoCamera);
865 GameObject.Destroy(baseObject);
871 Log.
Info($
"Glasses {glassesHandle} (\"{friendlyName}\") disconnected");
878 public bool TrackingUpdated {
get;
private set; } =
false;
895 base.Reset(glassesSettings);
901 Log.
Error($
"Required Camera assignment missing from { spectatorSettings.GetType() }. Check Spectator settings in Tilt Five Manager");
906 if (glassesSettings.tiltFiveXR)
910 if (
null == splitStereoCamera)
913 GameObject spectatorCameraObject = spectatorSettings.
spectatorCamera.gameObject;
917 if (
null == headPoseRoot)
920 headPoseRoot =
new GameObject($
"Glasses {glassesHandle}");
925 baseObject = GameObject.Instantiate(glassesSettings.
objectTemplate);
926 baseObject.transform.parent = headPoseRoot.transform;
927 baseObject.name = $
"{baseObject.transform.parent.name} - Prefab {playerIndex}";
929#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
934 var playerInput = baseObject.GetComponentInChildren<PlayerInput>();
935 var playerInputManager = GameObject.FindObjectOfType<PlayerInputManager>();
936 if (playerInput !=
null && playerInputManager ==
null)
938 Log.
Warn(
"No PlayerInputManager detected. " +
939 "Add a PlayerInputManager to the scene to enable the Input System " +
940 "to enumerate players as T5 devices connect/disconnect.");
943 if (playerInput !=
null && playerInput.actions !=
null && playerInput.actions.controlSchemes.Count < 1)
950 Log.
Warn(
"The prefab provided to TiltFiveManager2 appears to have a PlayerInput component " +
951 "with an action map assigned, but the provided action map has no defined control schemes. " +
952 "This may cause the input system to fail to create a new InputUser for players 2 and beyond. " +
953 "Consider defining a control scheme in the provided action map.");
958 splitStereoCamera.
Initialize(headPoseRoot, glassesSettings, spectatorSettings);
964 TryGetFriendlyName(out friendlyName);
979 valid &= splitStereoCamera !=
null
980 && glassesSettings.cameraTemplate == splitStereoCamera.cameraTemplate
981 && spectatorSettings == splitStereoCamera.spectatorSettings;
995 catch (System.Exception e)
997 Log.
Error($
"Error getting friendly name: {e.Message}");
1001 friendlyName = (result == 0)
1002 ? friendlyNameResult
1020 TrackingUpdated =
false;
1022 if (
null == glassesSettings)
1024 Log.
Error(
"GlassesSettings configuration required for Glasses tracking Update.");
1028 if (
null == splitStereoCamera)
1030 Log.
Error($
"Stereo camera(s) missing from Glasses {glassesHandle} - aborting Update.");
1036 Log.
Warn(
"Found mismatched template Cameras in GlassesCore Update - should call Reset.");
1040 if (spectatorSettings != splitStereoCamera.spectatorSettings)
1042 Log.
Warn(
"Found mismatched spectator settings in GlassesCore Update - should call Reset.");
1047 base.Update(glassesSettings, scaleSettings, gameBoardSettings);
1048 previewCore.
Update(glassesSettings, scaleSettings, gameBoardSettings);
1051 glassesAvailable = isConnected;
1052 splitStereoCamera.glassesHandle = glassesHandle;
1053 splitStereoCamera.enabled = glassesAvailable;
1056 splitStereoCamera.glassesSettings = glassesSettings;
1057 splitStereoCamera.spectatorSettings = spectatorSettings;
1062 && spectatorGlassesHandle == glassesHandle;
1065 float scaleToUGBD_UWRLD = scaleSettings.physicalMetersPerWorldSpaceUnit * gameBoardSettings.
gameBoardScale;
1069 splitStereoCamera.posUGBD_UWRLD = gameboardPos_UWRLD.position;
1070 splitStereoCamera.rotToUGBD_UWRLD = gameboardPos_UWRLD.rotation;
1071 splitStereoCamera.scaleToUGBD_UWRLD = scaleToUGBD_UWRLD;
1088 Log.
Error(
"Failed to obtain Glasses IPD");
1090 float ipd_UWRLD = scaleToUWRLD_UGBD * ipd_UGBD;
1091 Vector3 eyeOffset = (headPose.right.normalized * (ipd_UWRLD * 0.5f));
1094 eyePositions[
AREyes.EYE_LEFT] = headPose.position - eyeOffset;
1095 eyeRotations[
AREyes.EYE_LEFT] = headPose.rotation;
1098 eyePositions[
AREyes.EYE_RIGHT] = headPose.position + eyeOffset;
1099 eyeRotations[
AREyes.EYE_RIGHT] = headPose.rotation;
1102 if (
null != leftEyeCamera)
1104 GameObject leftEye = leftEyeCamera.gameObject;
1105 leftEye.transform.position = eyePositions[
AREyes.EYE_LEFT];
1106 leftEye.transform.rotation = eyeRotations[
AREyes.EYE_LEFT];
1109 leftEyeCamera.nearClipPlane = glassesSettings.nearClipPlane / scaleToUGBD_UWRLD;
1110 leftEyeCamera.farClipPlane = glassesSettings.farClipPlane / scaleToUGBD_UWRLD;
1111 leftEyeCamera.fieldOfView = glassesSettings.
fieldOfView;
1112 leftEyeCamera.cullingMask = glassesSettings.
cullingMask;
1116 if (
null != rightEyeCamera)
1118 GameObject rightEye = rightEyeCamera.gameObject;
1119 rightEye.transform.position = eyePositions[
AREyes.EYE_RIGHT];
1120 rightEye.transform.rotation = eyeRotations[
AREyes.EYE_RIGHT];
1123 rightEyeCamera.nearClipPlane = glassesSettings.nearClipPlane / scaleToUGBD_UWRLD;
1124 rightEyeCamera.farClipPlane = glassesSettings.farClipPlane / scaleToUGBD_UWRLD;
1125 rightEyeCamera.fieldOfView = glassesSettings.
fieldOfView;
1126 rightEyeCamera.cullingMask = glassesSettings.
cullingMask;
1130 if (!TryGetFriendlyName(out glassesSettings.
friendlyName))
1138 base.SetDrivenObjectTransform(settings, scaleSettings, gameBoardSettings);
1142#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
1143 private class GlassesDeviceCore : GlassesCore, IDisposable
1145 internal GlassesDevice glassesDevice;
1147 private enum TrackingState :
int
1154 public GlassesDeviceCore(GlassesHandle glassesHandle) : base(glassesHandle)
1156 glassesDevice =
Input.GetGlassesDevice(playerIndex);
1158 if(glassesDevice !=
null && glassesDevice.added)
1160 InputSystem.EnableDevice(glassesDevice);
1164 public override void Dispose()
1168 if(glassesDevice !=
null && glassesDevice.added)
1170 InputSystem.DisableDevice(glassesDevice);
1176 base.SetDrivenObjectTransform(settings, scaleSettings, gameboardSettings);
1178 if(glassesDevice ==
null || !glassesDevice.added)
1184 QueueDeltaStateEvent(glassesDevice.devicePosition, pose_UWRLD.position);
1185 QueueDeltaStateEvent(glassesDevice.centerEyePosition, pose_UWRLD.position);
1186 QueueDeltaStateEvent(glassesDevice.leftEyePosition, eyePositions[
AREyes.EYE_LEFT]);
1187 QueueDeltaStateEvent(glassesDevice.rightEyePosition, eyePositions[
AREyes.EYE_RIGHT]);
1190 QueueDeltaStateEvent(glassesDevice.deviceRotation, pose_UWRLD.rotation);
1191 QueueDeltaStateEvent(glassesDevice.centerEyeRotation, pose_UWRLD.rotation);
1192 QueueDeltaStateEvent(glassesDevice.leftEyeRotation, pose_UWRLD.rotation);
1193 QueueDeltaStateEvent(glassesDevice.rightEyeRotation, pose_UWRLD.rotation);
1196 QueueDeltaStateEvent(glassesDevice.RawPosition, pose_UGBD.position);
1197 QueueDeltaStateEvent(glassesDevice.RawLeftEyePosition, WorldToGameboardSpace(eyePositions[
AREyes.EYE_LEFT], scaleSettings, gameboardSettings));
1198 QueueDeltaStateEvent(glassesDevice.RawRightEyePosition, WorldToGameboardSpace(eyePositions[
AREyes.EYE_RIGHT], scaleSettings, gameboardSettings));
1201 QueueDeltaStateEvent(glassesDevice.RawRotation, pose_UGBD.rotation);
1202 QueueDeltaStateEvent(glassesDevice.leftEyeRotation, pose_UGBD.rotation);
1203 QueueDeltaStateEvent(glassesDevice.rightEyeRotation, pose_UGBD.rotation);
1205 InputSystem.QueueDeltaStateEvent(glassesDevice.isTracked, isTracked);
1207 var trackingState = TrackingState.Tracking;
1210 trackingState = settings.FailureMode == TrackableSettings.TrackingFailureMode.FreezePosition
1211 ? TrackingState.Limited
1212 : TrackingState.None;
1215 InputSystem.QueueDeltaStateEvent(glassesDevice.trackingState, (
int)trackingState);
1218 private static void QueueDeltaStateEvent(Vector3Control vector3Control, Vector3 delta)
1220 InputSystem.QueueDeltaStateEvent(vector3Control.x, delta.x);
1221 InputSystem.QueueDeltaStateEvent(vector3Control.y, delta.y);
1222 InputSystem.QueueDeltaStateEvent(vector3Control.z, delta.z);
1227 private static void QueueDeltaStateEvent(QuaternionControl quaternionControl, Quaternion delta)
1229 InputSystem.QueueDeltaStateEvent(quaternionControl.w, delta.w);
1230 InputSystem.QueueDeltaStateEvent(quaternionControl.x, delta.x);
1231 InputSystem.QueueDeltaStateEvent(quaternionControl.y, delta.y);
1232 InputSystem.QueueDeltaStateEvent(quaternionControl.z, delta.z);
TiltFive.Glasses.AREyes AREyes
The Camera Frame API and runtime.
static bool GetGlassesIPD(UInt64 glassesHandle, ref float glassesIPD)
Represents the game board.
float gameBoardScale
The game board's scale multiplies the perceived size of objects in the scene.
T5_GlassesPoseUsage glassesPoseUsage
BaseGlassesCore(GlassesHandle glassesHandle, T5_GlassesPoseUsage glassesPoseUsage, string name)
override void SetDrivenObjectTransform(GlassesSettings settings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
GlassesHandle glassesHandle
override bool TryGetStateFromPlugin(out T5_GlassesPose glassesPose, out bool poseIsValid, GameBoardSettings gameBoardSettings)
override bool TryCheckConnected(out bool connected)
Determines whether the tracked object is still connected.
override void SetInvalidPoseGameboardSpace(in T5_GlassesPose glassesPose, GlassesSettings settings, ScaleSettings scaleSettings, GameBoardSettings gameboardSettings)
override void Update(GlassesSettings glassesSettings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
Updates this T:TiltFive.Glasses.BaseGlassesCore
override void SetPoseUnityWorldSpace(ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
Sets the pose values of the tracked object in Unity World Space.
Pose GetPoseGameboardSpace(T5_GlassesPose glassesPose)
override void SetPoseGameboardSpace(in T5_GlassesPose glassesPose, GlassesSettings glassesSettings, ScaleSettings scaleSettings, GameBoardSettings gameboardSettings)
override void SetDefaultPoseGameboardSpace(GlassesSettings settings)
Internal Glasses core runtime.
bool Validate(GlassesSettings glassesSettings, SpectatorSettings spectatorSettings)
Tests this T:TiltFive.Glasses.GlassesCore for validity with the parameterized T:TiltFive....
void Reset(GlassesSettings glassesSettings, SpectatorSettings spectatorSettings)
Reset this T:TiltFive.Glasses.GlassesCore
GlassesCore(GlassesHandle glassesHandle)
virtual void Update(GlassesSettings glassesSettings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings, SpectatorSettings spectatorSettings)
Updates this T:TiltFive.Glasses.GlassesCore
bool TryGetFriendlyName(out string friendlyName)
Dictionary< AREyes, Vector3 > eyePositions
GlassesPreviewCore previewCore
override void SetDrivenObjectTransform(GlassesSettings settings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
bool configured
Configuration ready indicator.
Trackable core for the smoothed glasses preview pose.
new void Update(GlassesSettings glassesSettings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
Updates this T:TiltFive.Glasses.GlassesPreviewCore
GlassesPreviewCore(GlassesHandle glassesHandle)
The Glasses API and runtime.
static Camera GetLeftEye(PlayerIndex playerIndex)
HashSet< GlassesHandle > incomingHandles
static Vector3 up
Gets the head orientation's up vector.
static bool TryGetPreviewPose(PlayerIndex playerIndex, out Pose pose)
Attempts to get the position and orientation of the specified player's glasses, smoothed for on-scree...
static bool updated
Gets a value indicating whether this T:TiltFive.Glasses is updated.
static Vector3 leftEyePosition
Gets the left eye position.
static Camera GetRightEye(GlassesHandle glassesHandle)
static bool IsTracked(PlayerIndex playerIndex=PlayerIndex.One)
Indicate if the specified glasses are tracked.
GlassesHandle? defaultGlassesHandle
The identifier for the first detected pair of glasses.
static Vector3 rightEyePosition
Gets the right eye position.
static void Reset(GlassesSettings glassesSettings, SpectatorSettings spectatorSettings=null, PlayerIndex playerIndex=PlayerIndex.None)
Reset this T:TiltFive.Glasses.
static Vector3 position
Gets the head pose position.
static bool TryGetFriendlyName(PlayerIndex playerIndex, out string friendlyName)
static Vector3 forward
Gets the head orientation's forward vector.
Dictionary< GlassesHandle, GlassesCore > glassesCores
The glasses core runtimes.
static GameObject GetPoseRoot(PlayerIndex playerIndex)
static Vector3 right
Gets the head orientation's right vector.
static void Update(GlassesSettings glassesSettings, ScaleSettings scaleSettings, GameBoardSettings gameBoardSettings)
Updates this T:TiltFive.Glasses.
static GlassesCore GetPlayerOneGlassesCore()
static GameObject GetPoseRoot(GlassesHandle glassesHandle)
static Camera GetLeftEye(GlassesHandle glassesHandle)
static bool TryGetPose(PlayerIndex playerIndex, out Pose pose)
Attempts to get the position and orientation of the specified player's glasses.
static Quaternion rotation
Gets the head pose rotation.
static bool glassesAvailable
Indicates whether the glasses are plugged in and functioning.
static bool IsConnected(PlayerIndex playerIndex=PlayerIndex.One)
Indicate if the specified glasses are connected.
static bool Validate(GlassesSettings glassesSettings, SpectatorSettings spectatorSettings=null, PlayerIndex playerIndex=PlayerIndex.One)
Validates the specified glassesSettings with the specified glasses core.
static bool configured
Gets a value indicating whether this T:TiltFive.Glasses is configured.
static void ScanForGlasses()
HashSet< GlassesHandle > lostHandles
static bool headPoseUpdated(PlayerIndex playerIndex=PlayerIndex.One)
Returns a boolean indication that the head pose was successfully updated.
static Camera GetRightEye(PlayerIndex playerIndex)
static bool TryGetSpectatorSettings(out SpectatorSettings spectatorSettings)
GlassesSettings encapsulates all configuration data used by the Glasses' tracking runtime to compute ...
Camera cameraTemplate
The camera used as a template for creating the eye cameras at runtime.
static readonly string DEFAULT_FRIENDLY_NAME
const float DEFAULT_IPD_UGBD
LayerMask cullingMask
The culling mask to be used by the eye cameras for this pair of glasses.
GameObject objectTemplate
The object used as a template for creating the base Game Object when a pair of glasses connects.
static void Warn(string m, params object[] list)
WARN logging function call.
static void Info(string m, params object[] list)
INFO logging function call.
static void Error(string m, params object[] list)
ERROR logging function call.
static int GetGlassesPose(UInt64 glassesHandle, ref T5_GlassesPose glassesPose, [MarshalAs(UnmanagedType.I4)] T5_GlassesPoseUsage glassesPoseUsage)
static int GetGlassesFriendlyName(UInt64 glassesHandle, ref T5_StringUTF8 glassesFriendlyName)
static int RefreshGlassesAvailable()
static int GetGlassesHandles(ref byte handleCount, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] UInt64[] glassesHandle)
Provides access to player settings and functionality.
static bool IsConnected(PlayerIndex playerIndex)
Determines whether the specified player has an associated pair of glasses connected.
ScaleSettings contains the scale data used to translate between Unity units and the user's physical s...
float GetScaleToUWRLD_UGBD(float gameboardScale)
PlayerIndex spectatedPlayer
The player that will have their perspective mirrored on screen.
Camera spectatorCamera
The camera used for rendering the onscreen preview.
void Initialize(GameObject headPoseRoot, GlassesSettings glassesSettings, SpectatorSettings spectatorSettings)
Camera leftEyeCamera
The left eye Camera property.
Camera cameraTemplate
The Camera used as a template when creating the eye cameras.
Camera rightEyeCamera
The right eye Camera property.
static bool TryGetISceneInfo(out ISceneInfo sceneInfo)
Pose Pose_UnityWorldSpace
The Pose of the trackable in Unity world space.
bool RejectUntrackedPositionData
TrackingFailureMode FailureMode
T5_GlassesPoseUsage
Glasses pose usage indicator.
@ SpectatorPresentation
The pose will be used to render images to be presented on a device other than the glasses,...
@ GlassesPresentation
The pose will be used to render images to be presented on the glasses.
GameboardType
The type of Gameboard being tracked by the glasses.
PlayerIndex
The Player index (e.g. Player One, Player Two, etc)
Headset pose information to be retrieved with NativePlugin.GetGlassesPose(ref T5_GlassesPose)
GameboardType GameboardType
Quaternion RotationToGLS_GBD
Represents a string value.
void Dispose()
Safely disposes of this T5_StringUTF8 and any unmanaged memory allocated during its construction.