12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /****************************************************************************
- * Copyright 2019 Nreal Techonology Limited. All rights reserved.
- *
- * This file is part of NRSDK.
- *
- * https://www.nreal.ai/
- *
- *****************************************************************************/
- namespace NRKernal
- {
- using System;
- using System.Collections;
- using UnityEngine;
- public class NRTrackingModeChangedListener
- {
- public delegate void OnTrackStateChangedDel(bool trackChanging, RenderTexture leftRT, RenderTexture rightRT);
- public event OnTrackStateChangedDel OnTrackStateChanged;
- private NRTrackingModeChangedTip m_LostTrackingTip;
- private Coroutine m_EnableRenderCamera;
- private Coroutine m_DisableRenderCamera;
- private const float MinTimeLastLimited = 0;
- private const float MaxTimeLastLimited = 6f;
- public NRTrackingModeChangedListener()
- {
- NRHMDPoseTracker.OnChangeTrackingMode += OnChangeTrackingMode;
- }
- private void OnChangeTrackingMode(NRHMDPoseTracker.TrackingType origin, NRHMDPoseTracker.TrackingType target)
- {
- NRDebugger.Info("[NRTrackingModeChangedListener] OnChangeTrackingMode origin:{0} target:{1}", origin, target);
- if (target == NRHMDPoseTracker.TrackingType.Tracking0Dof || target == NRHMDPoseTracker.TrackingType.Tracking0DofStable)
- {
- return;
- }
- if (m_EnableRenderCamera != null)
- {
- NRKernalUpdater.Instance.StopCoroutine(m_EnableRenderCamera);
- m_EnableRenderCamera = null;
- }
- m_EnableRenderCamera = NRKernalUpdater.Instance.StartCoroutine(EnableTrackingInitializingRenderCamera());
- }
- public IEnumerator EnableTrackingInitializingRenderCamera()
- {
- if (m_LostTrackingTip == null)
- {
- m_LostTrackingTip = NRTrackingModeChangedTip.Create();
- }
- m_LostTrackingTip.gameObject.SetActive(true);
- var reason = NRFrame.LostTrackingReason;
- m_LostTrackingTip.SetMessage(NativeConstants.TRACKING_MODE_SWITCH_TIP);
- float begin_time = Time.realtimeSinceStartup;
- var endofFrame = new WaitForEndOfFrame();
- yield return endofFrame;
- yield return endofFrame;
- yield return endofFrame;
- NRDebugger.Info("[NRTrackingModeChangedListener] Enter tracking initialize mode...");
- OnTrackStateChanged?.Invoke(true, m_LostTrackingTip.LeftRT, m_LostTrackingTip.RightRT);
- NRHMDPoseTracker postTracker = NRSessionManager.Instance.NRHMDPoseTracker;
- while ((NRFrame.LostTrackingReason != LostTrackingReason.NONE || postTracker.IsTrackModeChanging || (Time.realtimeSinceStartup - begin_time) < MinTimeLastLimited)
- && (Time.realtimeSinceStartup - begin_time) < MaxTimeLastLimited)
- {
- NRDebugger.Info("[NRTrackingModeChangedListener] Wait for tracking: modeChanging={0}, lostTrackReason={1}",
- postTracker.IsTrackModeChanging, NRFrame.LostTrackingReason);
- yield return endofFrame;
- }
- if (m_DisableRenderCamera == null)
- {
- m_DisableRenderCamera = NRKernalUpdater.Instance.StartCoroutine(DisableTrackingInitializingRenderCamera());
- }
- yield return m_DisableRenderCamera;
- m_DisableRenderCamera = null;
- }
- public IEnumerator DisableTrackingInitializingRenderCamera()
- {
- if (m_LostTrackingTip != null)
- {
- m_LostTrackingTip.gameObject.SetActive(false);
- }
- yield return new WaitForEndOfFrame();
- yield return new WaitForEndOfFrame();
- yield return new WaitForEndOfFrame();
- OnTrackStateChanged?.Invoke(false, m_LostTrackingTip.LeftRT, m_LostTrackingTip.RightRT);
- NRDebugger.Info("[NRTrackingModeChangedListener] Exit tracking initialize mode...");
- }
- }
- }
|