private void _UpdateState() { ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; ExternApi.ArPresto_getStatus(ref prestoStatus); IsTracking = prestoStatus == ApiPrestoStatus.Resumed; SessionStatus = prestoStatus.ToSessionStatus(); }
private void _OnEarlyUpdate() { // Update session activity before EarlyUpdate. if (m_CachedSessionEnabled.HasValue) { _SetSessionEnabled(m_CachedSessionEnabled.Value); m_CachedSessionEnabled = null; } // Perform updates before calling ArPresto_update. _UpdateDisplayGeometry(); if (SessionComponent != null) { _SetCameraDirection(SessionComponent.DeviceCameraDirection); _SetConfiguration(SessionComponent.SessionConfig); } // Update ArPresto and potentially ArCore. ExternApi.ArPresto_update(); // Get state information from ARPresto. ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; ExternApi.ArPresto_getStatus(ref prestoStatus); SessionStatus = prestoStatus.ToSessionStatus(); LostTrackingReason = LostTrackingReason.None; if (NativeSession != null && SessionStatus == SessionStatus.LostTracking) { var cameraHandle = NativeSession.FrameApi.AcquireCamera(); LostTrackingReason = NativeSession.CameraApi.GetLostTrackingReason(cameraHandle); NativeSession.CameraApi.Release(cameraHandle); } // Get the current session from presto and note if it has changed. IntPtr sessionHandle = IntPtr.Zero; ExternApi.ArPresto_getSession(ref sessionHandle); IsSessionChangedThisFrame = m_CachedSessionHandle != sessionHandle; m_CachedSessionHandle = sessionHandle; ExternApi.ArPresto_getFrame(ref m_CachedFrameHandle); // Update the native session with the newest frame. if (NativeSession != null) { NativeSession.OnUpdate(m_CachedFrameHandle); } _UpdateTextureIfNeeded(); if (EarlyUpdate != null) { EarlyUpdate(); } }
private void _OnEarlyUpdate() { // Perform updates before calling ArPresto_update. _UpdateDisplayGeometry(); if (SessionComponent != null) { _SetConfiguration(SessionComponent.SessionConfig); } // Update ArPresto and potentially ArCore. ExternApi.ArPresto_update(); // Get state information from ARPresto. ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; IntPtr sessionHandle = IntPtr.Zero; IntPtr frameHandle = IntPtr.Zero; ExternApi.ArPresto_getStatus(ref prestoStatus); ExternApi.ArPresto_getSession(ref sessionHandle); ExternApi.ArPresto_getFrame(ref frameHandle); SessionStatus = prestoStatus.ToSessionStatus(); // Update native session reference to match presto. if (sessionHandle == IntPtr.Zero) { NativeSession = null; } else if (NativeSession == null) { NativeSession = new NativeSession(sessionHandle, frameHandle); } // Update the native session with the newest frame. if (NativeSession != null) { NativeSession.OnUpdate(frameHandle); } _UpdateTextureIfNeeded(); if (EarlyUpdate != null) { EarlyUpdate(); } }
public static SessionStatus ToSessionStatus(this ApiPrestoStatus prestoStatus) { switch (prestoStatus) { case ApiPrestoStatus.Uninitialized: return(SessionStatus.None); case ApiPrestoStatus.RequestingApkInstall: case ApiPrestoStatus.RequestingPermission: return(SessionStatus.Initializing); case ApiPrestoStatus.Resumed: return(SessionStatus.Tracking); case ApiPrestoStatus.ResumedNotTracking: return(SessionStatus.LostTracking); case ApiPrestoStatus.Paused: return(SessionStatus.NotTracking); case ApiPrestoStatus.ErrorFatal: return(SessionStatus.FatalError); case ApiPrestoStatus.ErrorApkNotAvailable: return(SessionStatus.ErrorApkNotAvailable); case ApiPrestoStatus.ErrorPermissionNotGranted: return(SessionStatus.ErrorPermissionNotGranted); case ApiPrestoStatus.ErrorSessionConfigurationNotSupported: return(SessionStatus.ErrorSessionConfigurationNotSupported); case ApiPrestoStatus.ErrorCameraNotAvailable: return(SessionStatus.ErrorCameraNotAvailable); case ApiPrestoStatus.ErrorIllegalState: return(SessionStatus.ErrorIllegalState); case ApiPrestoStatus.ErrorInvalidCameraConfig: return(SessionStatus.ErrorInvalidCameraConfig); default: Debug.LogErrorFormat("Unexpected presto status {0}", prestoStatus); return(SessionStatus.FatalError); } }
private bool SetCameraDirection(DeviceCameraDirection cameraDirection) { // The camera direction has not changed. if (_cachedCameraDirection.HasValue && _cachedCameraDirection.Value == cameraDirection) { return(false); } if (InstantPreviewManager.IsProvidingPlatform && cameraDirection == DeviceCameraDirection.BackFacing) { return(false); } else if (InstantPreviewManager.IsProvidingPlatform) { InstantPreviewManager.LogLimitedSupportMessage( "enable front-facing (selfie) camera"); _cachedCameraDirection = DeviceCameraDirection.BackFacing; if (SessionComponent != null) { SessionComponent.DeviceCameraDirection = DeviceCameraDirection.BackFacing; } return(false); } _cachedCameraDirection = cameraDirection; ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; ExternApi.ArPresto_getStatus(ref prestoStatus); if (prestoStatus == ApiPrestoStatus.ErrorInvalidCameraConfig) { // if the session is paused by invalid camera configuration, // attempt to recover by changing the camera direction: OnBeforeResumeSession(_cachedSessionHandle); } return(true); }
public static extern void ArPresto_getStatus(ref ApiPrestoStatus prestoStatus);
private void _OnEarlyUpdate() { _SetCameraTextureName(); // Update session activity before EarlyUpdate. if (m_HaveDisableToEnableTransition) { _SetSessionEnabled(false); _SetSessionEnabled(true); m_HaveDisableToEnableTransition = false; // Avoid firing session enable event twice. if (m_DesiredSessionState.HasValue && m_DesiredSessionState.Value) { m_DesiredSessionState = null; } } if (m_DesiredSessionState.HasValue) { _SetSessionEnabled(m_DesiredSessionState.Value); m_DesiredSessionState = null; } // Perform updates before calling ArPresto_update. if (SessionComponent != null) { IntPtr previousSession = IntPtr.Zero; ExternApi.ArPresto_getSession(ref previousSession); if (UpdateSessionFeatures != null) { UpdateSessionFeatures(); } _SetCameraDirection(SessionComponent.DeviceCameraDirection); IntPtr currentSession = IntPtr.Zero; ExternApi.ArPresto_getSession(ref currentSession); // Fire the session enabled event when the underlying session has been changed // due to session feature update(camera direction etc). if (previousSession != currentSession) { _FireOnSessionSetEnabled(false); _FireOnSessionSetEnabled(true); } // Validate and convert the SessionConfig to a Instant Preview supported config by // logging and disabling limited supported features. if (InstantPreviewManager.IsProvidingPlatform && SessionComponent.SessionConfig != null && !InstantPreviewManager.ValidateSessionConfig(SessionComponent.SessionConfig)) { // A new SessionConfig object will be created based on the original // SessionConfig with all limited support features disabled. SessionComponent.SessionConfig = InstantPreviewManager.GenerateInstantPreviewSupportedConfig( SessionComponent.SessionConfig); } _UpdateConfiguration(SessionComponent.SessionConfig); } _UpdateDisplayGeometry(); // Update ArPresto and potentially ArCore. ExternApi.ArPresto_update(); if (SystemInfo.graphicsMultiThreaded && !InstantPreviewManager.IsProvidingPlatform) { // Synchronize render thread with update call. ExternApi.ARCoreRenderingUtils_CreatePostUpdateFence(); } SessionStatus previousSessionStatus = SessionStatus; // Get state information from ARPresto. ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; ExternApi.ArPresto_getStatus(ref prestoStatus); SessionStatus = prestoStatus.ToSessionStatus(); LostTrackingReason = LostTrackingReason.None; if (NativeSession != null && SessionStatus == SessionStatus.LostTracking) { var cameraHandle = NativeSession.FrameApi.AcquireCamera(); LostTrackingReason = NativeSession.CameraApi.GetLostTrackingReason(cameraHandle); NativeSession.CameraApi.Release(cameraHandle); } // If the current status is an error, check if the SessionStatus error state changed. if (SessionStatus.IsError() && previousSessionStatus.IsError() != SessionStatus.IsError()) { // Disable internal session bits so we properly pause the session due to error. _FireOnSessionSetEnabled(false); m_DisabledSessionOnErrorState = true; } else if (SessionStatus.IsValid() && m_DisabledSessionOnErrorState) { if (SessionComponent.enabled) { _FireOnSessionSetEnabled(true); } m_DisabledSessionOnErrorState = false; } // Get the current session from presto and note if it has changed. IntPtr sessionHandle = IntPtr.Zero; ExternApi.ArPresto_getSession(ref sessionHandle); IsSessionChangedThisFrame = m_CachedSessionHandle != sessionHandle; m_CachedSessionHandle = sessionHandle; ExternApi.ArPresto_getFrame(ref m_CachedFrameHandle); // Update the native session with the newest frame. if (NativeSession != null) { NativeSession.OnUpdate(m_CachedFrameHandle); } _UpdateTextureIfNeeded(); if (EarlyUpdate != null) { EarlyUpdate(); } }
private void _OnEarlyUpdate() { // Update session activity before EarlyUpdate. if (m_HaveDisableToEnableTransition) { _SetSessionEnabled(false); _SetSessionEnabled(true); m_HaveDisableToEnableTransition = false; // Avoid firing session enable event twice. if (m_DesiredSessionState.HasValue && m_DesiredSessionState.Value) { m_DesiredSessionState = null; } } if (m_DesiredSessionState.HasValue) { _SetSessionEnabled(m_DesiredSessionState.Value); m_DesiredSessionState = null; } // Perform updates before calling ArPresto_update. if (SessionComponent != null) { IntPtr previousSession = IntPtr.Zero; ExternApi.ArPresto_getSession(ref previousSession); if (UpdateSessionFeatures != null) { UpdateSessionFeatures(); } _SetCameraDirection(SessionComponent.DeviceCameraDirection); IntPtr currentSession = IntPtr.Zero; ExternApi.ArPresto_getSession(ref currentSession); // Fire the session enabled event when the underlying session has been changed // due to session feature update(camera direction etc). if (previousSession != currentSession) { _FireOnSessionSetEnabled(false); _FireOnSessionSetEnabled(true); } _SetConfiguration(SessionComponent.SessionConfig); } _UpdateDisplayGeometry(); // Update ArPresto and potentially ArCore. ExternApi.ArPresto_update(); SessionStatus previousSessionStatus = SessionStatus; // Get state information from ARPresto. ApiPrestoStatus prestoStatus = ApiPrestoStatus.Uninitialized; ExternApi.ArPresto_getStatus(ref prestoStatus); SessionStatus = prestoStatus.ToSessionStatus(); LostTrackingReason = LostTrackingReason.None; if (NativeSession != null && SessionStatus == SessionStatus.LostTracking) { var cameraHandle = NativeSession.FrameApi.AcquireCamera(); LostTrackingReason = NativeSession.CameraApi.GetLostTrackingReason(cameraHandle); NativeSession.CameraApi.Release(cameraHandle); } // If the current status is an error, check if the SessionStatus error state changed. if (SessionStatus.IsError() && previousSessionStatus.IsError() != SessionStatus.IsError()) { // Disable internal session bits so we properly pause the session due to error. _FireOnSessionSetEnabled(false); m_DisabledSessionOnErrorState = true; } else if (SessionStatus.IsValid() && m_DisabledSessionOnErrorState) { if (SessionComponent.enabled) { _FireOnSessionSetEnabled(true); } m_DisabledSessionOnErrorState = false; } // Get the current session from presto and note if it has changed. IntPtr sessionHandle = IntPtr.Zero; ExternApi.ArPresto_getSession(ref sessionHandle); IsSessionChangedThisFrame = m_CachedSessionHandle != sessionHandle; m_CachedSessionHandle = sessionHandle; ExternApi.ArPresto_getFrame(ref m_CachedFrameHandle); // Update the native session with the newest frame. if (NativeSession != null) { NativeSession.OnUpdate(m_CachedFrameHandle); } _UpdateTextureIfNeeded(); if (EarlyUpdate != null) { EarlyUpdate(); } }