private void Update() { if (ViveSR_DualCameraRig.DualCameraStatus == DualCameraStatus.WORKING) { if (!CallbackMode) { if (UpdateDistortedMaterial) { // native buffer ptr method 1: // get native buffer ptr & let native(cpp) do texture upload //StartCoroutine(UpdateGPUFishEyeTexture()); ViveSR_DualCameraImageCapture.UpdateDistortedImage(); } if (UpdateUndistortedMaterial) { /* * if(ViveSR_DualCameraImageCapture.UndistortTextureIsNative) * StartCoroutine(UpdateGPUUndistortTexture()); */ ViveSR_DualCameraImageCapture.UpdateUndistortedImage(); } if (UpdateDepthMaterial) { ViveSR_DualCameraImageCapture.UpdateDepthImage(); } } #region Distorted Image if (_UpdateDistortedMaterial) { int currentCameraTimeIndex = ViveSR_DualCameraImageCapture.DistortedTimeIndex; if (currentCameraTimeIndex != LastDistortedTextureUpdateTime) { DistortedTimer.Add(currentCameraTimeIndex - LastDistortedTextureUpdateTime); RealDistortedFPS = 1000 / DistortedTimer.AverageLeast(100); int frameIndex, timeIndex; Texture2D textureCameraLeft, textureCameraRight; ViveSR_DualCameraImageCapture.GetDistortedTexture(out textureCameraLeft, out textureCameraRight, out frameIndex, out timeIndex, out PoseDistorted[(int)DualCameraIndex.LEFT], out PoseDistorted[(int)DualCameraIndex.RIGHT]); for (int i = 0; i < DistortedLeft.Count; i++) { if (DistortedLeft[i] != null) { DistortedLeft[i].mainTexture = textureCameraLeft; if (ViveSR_DualCameraImageCapture.DistortTextureIsNative) { DistortedLeft[i].mainTextureScale = new Vector2(1, 0.5f); DistortedLeft[i].mainTextureOffset = new Vector2(0, 0.5f); } } } for (int i = 0; i < DistortedRight.Count; i++) { if (DistortedRight[i] != null) { DistortedRight[i].mainTexture = textureCameraRight; if (ViveSR_DualCameraImageCapture.DistortTextureIsNative) { DistortedRight[i].mainTextureScale = new Vector2(1, 0.5f); } } } LastDistortedTextureUpdateTime = currentCameraTimeIndex; //change pose update flow to camera preRender if (EnablePreRender == false) { ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.RIGHT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.RIGHT]); } } } #endregion #region Undistorted Image if (_UpdateUndistortedMaterial) { int currentUndistortedTimeIndex = ViveSR_DualCameraImageCapture.UndistortedTimeIndex; if (currentUndistortedTimeIndex != LastUndistortedTextureUpdateTime) { UndistortedTimer.Add(currentUndistortedTimeIndex - LastUndistortedTextureUpdateTime); RealUndistortedFPS = 1000 / UndistortedTimer.AverageLeast(100); int FrameIndexUndistorted, TimeIndexUndistorted; ViveSR_DualCameraImageCapture.GetUndistortedTexture(out TextureUndistorted[(int)DualCameraIndex.LEFT], out TextureUndistorted[(int)DualCameraIndex.RIGHT], out FrameIndexUndistorted, out TimeIndexUndistorted, out PoseUndistorted[(int)DualCameraIndex.LEFT], out PoseUndistorted[(int)DualCameraIndex.RIGHT]); for (int i = 0; i < UndistortedLeft.Count; i++) { if (UndistortedLeft[i] != null) { UndistortedLeft[i].mainTexture = TextureUndistorted[(int)DualCameraIndex.LEFT]; // restore the tiling / offset which may be modified if (ViveSR_DualCameraImageCapture.DistortTextureIsNative) { UndistortedLeft[i].mainTextureScale = Vector2.one; UndistortedLeft[i].mainTextureOffset = Vector2.zero; } } } for (int i = 0; i < UndistortedRight.Count; i++) { if (UndistortedRight[i] != null) { UndistortedRight[i].mainTexture = TextureUndistorted[(int)DualCameraIndex.RIGHT]; // restore the tiling / offset which may be modified if (ViveSR_DualCameraImageCapture.DistortTextureIsNative) { UndistortedRight[i].mainTextureScale = Vector2.one; } } } LastUndistortedTextureUpdateTime = currentUndistortedTimeIndex; if (_UndistortMethod == UndistortionMethod.DEFISH_BY_SRMODULE && EnablePreRender == false) { ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.RIGHT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.RIGHT]); } } } #endregion #region Depth Image if (_UpdateDepthMaterial) { int currentDepthTimeIndex = ViveSR_DualCameraImageCapture.DepthTimeIndex; if (currentDepthTimeIndex != LastDepthTextureUpdateTime) { DepthTimer.Add(currentDepthTimeIndex - LastDepthTextureUpdateTime); RealDepthFPS = 1000 / DepthTimer.AverageLeast(100); int frameIndex, timeIndex; Texture2D textureDepth; Matrix4x4 PoseDepth; ViveSR_DualCameraImageCapture.GetDepthTexture(out textureDepth, out frameIndex, out timeIndex, out PoseDepth); for (int i = 0; i < Depth.Count; i++) { if (Depth[i] != null) { Depth[i].mainTexture = textureDepth; } } LastDepthTextureUpdateTime = currentDepthTimeIndex; } } #endregion } }
private void PreRender(Camera eye) { if (EnablePreRender == false) { return; } if (LastDistortedTextureUpdateTime != 0 || LastUndistortedTextureUpdateTime != 0) { if (ViveSR_DualCameraRig.Instance.DualCameraLeft == eye || ViveSR_DualCameraRig.Instance.DualCameraRight == eye) { if (UpdateUndistortedMaterial == true && _UndistortMethod == UndistortionMethod.DEFISH_BY_SRMODULE) { ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.RIGHT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.RIGHT]); } else if (_UpdateDistortedMaterial) { ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.LEFT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.RIGHT]); ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.RIGHT]); } } } }