69 IntPtr _sendFrameCallback = IntPtr.Zero;
71 protected override void Awake()
77 _sendFrameCallback =
NativePlugin.GetSendFrameCallback();
79 catch (System.DllNotFoundException e)
81 Log.
Info(
"Could not connect to Tilt Five plugin to get callback: {0}", e);
90 QualitySettings.vSyncCount = 0;
91 QualitySettings.maxQueuedFrames = 0;
94 private void LogVersion()
96 string version =
"NOT VERSIONED";
99 TextAsset asset = (TextAsset)Resources.Load(
"pluginversion", typeof(TextAsset));
102 version = asset.text;
106 bool logEnabled = Debug.unityLogger.logEnabled;
109 Debug.unityLogger.logEnabled =
true;
113 StackTraceLogType logType = Application.GetStackTraceLogType(LogType.Log);
116 Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None);
118 Log.
Info(
"\n********************************" +
119 "\n* Tilt Five: Unity SDK Version - " +
121 "\n********************************");
124 Application.SetStackTraceLogType(LogType.Log, logType);
127 Debug.unityLogger.logEnabled = logEnabled;
130 [Obsolete(
"This function has been moved into TiltFive.SystemControl",
true)]
131 public static bool SetApplicationInfo()
133 return SystemControl.SetApplicationInfo();
147 static public bool PresentStereoImages(
149 IntPtr leftTexHandle,
150 IntPtr rightTexHandle,
155 float widthToHeightRatio,
156 Quaternion rotToUSTAGE_ULVC,
157 Vector3 posOfULVC_USTAGE,
158 Quaternion rotToUSTAGE_URVC,
159 Vector3 posOfURVC_USTAGE) {
160 return Player.TryGetGlassesHandle(playerIndex, out var glassesHandle)
161 && PresentStereoImages(glassesHandle,
175 static internal bool PresentStereoImages(
176 GlassesHandle glassesHandle,
177 IntPtr leftTexHandle,
178 IntPtr rightTexHandle,
183 float widthToHeightRatio,
184 Quaternion rotToUSTAGE_ULVC,
185 Vector3 posOfULVC_USTAGE,
186 Quaternion rotToUSTAGE_URVC,
187 Vector3 posOfURVC_USTAGE)
189 return Instance.PresentStereoImagesImpl(glassesHandle,
203 bool PresentStereoImagesImpl(
204 UInt64 glassesHandle,
205 IntPtr leftTexHandle,
206 IntPtr rightTexHandle,
211 float widthToHeightRatio,
212 Quaternion rotToUSTAGE_ULVC,
213 Vector3 posOfULVC_USTAGE,
214 Quaternion rotToUSTAGE_URVC,
215 Vector3 posOfURVC_USTAGE)
234 Quaternion rotToDC_STAGE = Quaternion.AngleAxis(-90f, Vector3.right);
237 float startY_VCI = -Mathf.Tan(fovYDegrees * (0.5f * Mathf.PI / 180.0f));
238 float startX_VCI = startY_VCI * widthToHeightRatio;
239 float width_VCI = -2f * startX_VCI;
240 float height_VCI = -2f * startY_VCI;
241 Rect vci =
new Rect(startX_VCI, startY_VCI, width_VCI, height_VCI);
244 Quaternion rotToLVC_DC =
new Quaternion(rotToUSTAGE_ULVC.x, rotToUSTAGE_ULVC.y, -rotToUSTAGE_ULVC.z, rotToUSTAGE_ULVC.w);
245 Quaternion rotToRVC_DC =
new Quaternion(rotToUSTAGE_URVC.x, rotToUSTAGE_URVC.y, -rotToUSTAGE_URVC.z, rotToUSTAGE_URVC.w);
247 Quaternion rotToLVC_STAGE = rotToLVC_DC * rotToDC_STAGE;
248 Quaternion rotToRVC_STAGE = rotToRVC_DC * rotToDC_STAGE;
251 Vector3 posOfLVC_STAGE =
new Vector3(posOfULVC_USTAGE.x, posOfULVC_USTAGE.z, posOfULVC_USTAGE.y);
252 Vector3 posOfRVC_STAGE =
new Vector3(posOfURVC_USTAGE.x, posOfURVC_USTAGE.z, posOfURVC_USTAGE.y);
255 T5_FrameInfo frameInfo =
new T5_FrameInfo();
257 frameInfo.LeftTexHandle = leftTexHandle;
258 frameInfo.RightTexHandle = rightTexHandle;
260 frameInfo.TexWidth_PIX = (UInt16) texWidth_PIX;
261 frameInfo.TexHeight_PIX = (UInt16) texHeight_PIX;
263 frameInfo.IsSrgb = isSrgb;
264 frameInfo.IsUpsideDown =
false;
268 frameInfo.RotToLVC_STAGE = rotToLVC_STAGE;
269 frameInfo.PosOfLVC_STAGE = posOfLVC_STAGE;
271 frameInfo.RotToRVC_STAGE = rotToRVC_STAGE;
272 frameInfo.PosOfRVC_STAGE = posOfRVC_STAGE;
274 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
277 result = NativePlugin.QueueStereoImages(glassesHandle, frameInfo);
281 Log.Error(e.Message);
284 if (result != NativePlugin.T5_RESULT_SUCCESS) {
288 if(_sendFrameCallback == IntPtr.Zero)
293 _sendFrameCallback = NativePlugin.GetSendFrameCallback();
297 Log.Error(
"Unable to send frame - the native plugin DLL may be failing to load");
301 if (_sendFrameCallback == IntPtr.Zero)
304 Log.Error(
"Unable to send frame - the native plugin returned a null SendFrame callback");
311 GL.IssuePluginEvent(_sendFrameCallback, 0);
312 GL.InvalidateState();
316 Log.Error($
"Failed to execute sendFrame callback: {e.Message}");
323 [Obsolete(
"This function is obsolete. " +
324 "Please use GetDisplayDimensions(PlayerIndex playerIndex, " +
325 "ref Vector2Int displayDimensions) instead.")]
326 public static bool GetDisplayDimensions(ref Vector2Int displayDimensions)
328 return GetDisplayDimensions(
PlayerIndex.One, ref displayDimensions);
331 public static bool GetDisplayDimensions(
333 ref Vector2Int displayDimensions)
335 if (!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
339 return GetDisplayDimensions(glassesHandle, ref displayDimensions);
342 internal static bool GetDisplayDimensions(
343 GlassesHandle glassesHandle,
344 ref Vector2Int displayDimensions)
346 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
349 result = NativePlugin.GetMaxDisplayDimensions(
351 out var framebufferWidth,
352 out var framebufferHeight);
354 if(result == NativePlugin.T5_RESULT_SUCCESS)
356 displayDimensions =
new Vector2Int(framebufferWidth, framebufferHeight);
358 else Log.Warn(
"Display.cs: Failed to retrieve display settings from plugin.");
362 Log.Error(e.Message);
365 return result == NativePlugin.T5_RESULT_SUCCESS;
368 public static bool GetGlassesIPD(UInt64 glassesHandle, ref
float glassesIPD)
370 return Instance.GetGlassesIPDImpl(glassesHandle, ref glassesIPD);
373 private bool GetGlassesIPDImpl(UInt64 glassesHandle, ref
float glassesIPD)
375 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
378 result = NativePlugin.GetGlassesIPD(glassesHandle, ref glassesIPD);
382 Log.Warn(
"Display.cs: Failed to retrieve glasses IPD");
387 Log.Error(e.Message);
390 return result == NativePlugin.T5_RESULT_SUCCESS;
393 internal static void ApplyGraphicsSettings(GraphicsSettings graphicsSettings)
398 Application.targetFrameRate = GraphicsSettings.PREFERRED_GLASSES_FRAMERATE;
399 QualitySettings.vSyncCount = GraphicsSettings.VSYNC_DISABLED;
404 Application.targetFrameRate = graphicsSettings.applicationTargetFramerate;
405 QualitySettings.vSyncCount = graphicsSettings.applicationVSyncCount;