private void Update() { #if UNITY_EDITOR UpdateStatsElement(framerateStatistics, 1.0f / Time.deltaTime); int captureFrameIndex = UnityCompositorInterface.GetCaptureFrameIndex(); int prevCompositeFrame = CurrentCompositeFrame; //Set our current frame towards the latest captured frame. Dont get too close to it, and dont fall too far behind int step = (captureFrameIndex - CurrentCompositeFrame); if (step < 8) { step = 0; } else if (step > 16) { step -= 16; } else { step = 1; } CurrentCompositeFrame += step; UnityCompositorInterface.SetCompositeFrameIndex(CurrentCompositeFrame); #region Spectator View Transform if (IsCalibrationDataLoaded && transform.parent != null) { //Update time syncronizer { float captureTime = GetTimeFromFrame(captureFrameIndex); SpectatorViewPoseCache.PoseData poseData = poseCache.GetLatestPose(); if (poseData != null) { timeSynchronizer.Update(UnityCompositorInterface.GetCaptureFrameIndex(), captureTime, poseData.Index, poseData.TimeStamp); } } if (overrideCameraPose) { transform.parent.localPosition = overrideCameraPosition; transform.parent.localRotation = overrideCameraRotation; } else { //Set camera transform for the currently composited frame float cameraTime = GetTimeFromFrame(prevCompositeFrame); float poseTime = timeSynchronizer.GetPoseTimeFromCameraTime(cameraTime); Quaternion currRot; Vector3 currPos; poseTime += VideoTimestampToHolographicTimestampOffset; if (captureFrameIndex <= 0) //No frames captured yet, lets use the very latest camera transform { poseTime = float.MaxValue; } poseCache.GetPose(poseTime, out currPos, out currRot); transform.parent.localPosition = currPos; transform.parent.localRotation = currRot; } } #endregion if (!isVideoFrameProviderInitialized) { isVideoFrameProviderInitialized = UnityCompositorInterface.InitializeFrameProviderOnDevice(CaptureDevice); if (isVideoFrameProviderInitialized) { CurrentCompositeFrame = 0; timeSynchronizer.Reset(); poseCache.Reset(); } } UnityCompositorInterface.UpdateCompositor(); #endif }
private void Update() { #if UNITY_EDITOR UpdateStatsElement(framerateStatistics, 1.0f / Time.deltaTime); int captureFrameIndex = UnityCompositorInterface.GetCaptureFrameIndex(); int prevCompositeFrame = CurrentCompositeFrame; //Set our current frame towards the latest captured frame. Dont get too close to it, and dont fall too far behind int step = (captureFrameIndex - CurrentCompositeFrame); if (step < 8) { step = 0; } else if (step > 16) { step -= 16; } else { step = 1; } CurrentCompositeFrame += step; UnityCompositorInterface.SetCompositeFrameIndex(CurrentCompositeFrame); #region Spectator View Transform if (IsCalibrationDataLoaded && transform.parent != null) { //Update time syncronizer { float captureTime = GetTimeFromFrame(captureFrameIndex); SpectatorViewPoseCache.PoseData poseData = poseCache.GetLatestPose(); if (poseData != null) { timeSynchronizer.Update(UnityCompositorInterface.GetCaptureFrameIndex(), captureTime, poseData.Index, poseData.TimeStamp); } } if (overrideCameraPose) { transform.parent.localPosition = overrideCameraPosition; transform.parent.localRotation = overrideCameraRotation; } else { //Set camera transform for the currently composited frame float cameraTime = GetTimeFromFrame(prevCompositeFrame); float poseTime = timeSynchronizer.GetPoseTimeFromCameraTime(cameraTime); Quaternion currRot; Vector3 currPos; poseTime += VideoTimestampToHolographicTimestampOffset; if (captureFrameIndex <= 0) //No frames captured yet, lets use the very latest camera transform { poseTime = float.MaxValue; } poseCache.GetPose(poseTime, out currPos, out currRot); transform.parent.localPosition = currPos; transform.parent.localRotation = currRot; } } #endregion if (!isVideoFrameProviderInitialized) { if (UnityCompositorInterface.IsFrameProviderSupported(CaptureDevice) && UnityCompositorInterface.IsOutputFrameProviderSupported(OutputDevice)) { isVideoFrameProviderInitialized = UnityCompositorInterface.InitializeFrameProviderOnDevice(CaptureDevice, OutputDevice); if (isVideoFrameProviderInitialized) { CurrentCompositeFrame = 0; timeSynchronizer.Reset(); poseCache.Reset(); if (UnityCompositorInterface.IsCameraCalibrationInformationAvailable()) { stationaryCameraBroadcaster.SetActive(true); HolographicCameraObserver.Instance.ConnectTo("127.0.0.1"); } } } else { Debug.LogWarning($"The current device selection, Capture: {CaptureDevice}, Output: {OutputDevice}, is not supported by your build of SpectatorView.Compositor.UnityPlugin.dll."); } } UnityCompositorInterface.UpdateCompositor(); #endif }