private static void SetCallbackEnable(bool enable) { if (enable == _CallbackMode) { return; } if (enable) { if (UpdateDistortedMaterial) { ViveSR_DualCameraImageCapture.RegisterDistortedCallback(); } if (UpdateUndistortedMaterial) { ViveSR_DualCameraImageCapture.RegisterUndistortedCallback(); } if (UpdateDepthMaterial) { ViveSR_DualCameraImageCapture.RegisterDepthCallback(); } } else { ViveSR_DualCameraImageCapture.UnregisterDistortedCallback(); ViveSR_DualCameraImageCapture.UnregisterUndistortedCallback(); ViveSR_DualCameraImageCapture.UnregisterDepthCallback(); } _CallbackMode = enable; }
private void DepthGUI() { bool EnableDepth = GUILayout.Toggle(ViveSR_DualCameraImageCapture.DepthProcessing, "Depth Processing"); if (ViveSR_DualCameraImageCapture.DepthProcessing != EnableDepth) { ViveSR_DualCameraImageCapture.EnableDepthProcess(EnableDepth); } if (ViveSR_DualCameraImageCapture.DepthProcessing) { ViveSR_DualCameraImageCapture.DepthRefinement = GUILayout.Toggle(ViveSR_DualCameraImageCapture.DepthRefinement, "Depth Refinement"); ViveSR_DualCameraImageCapture.DepthEdgeEnhance = GUILayout.Toggle(ViveSR_DualCameraImageCapture.DepthEdgeEnhance, "Depth Edge Enhance"); } ViveSR_DualCameraDepthCollider.UpdateDepthCollider = GUILayout.Toggle(ViveSR_DualCameraDepthCollider.UpdateDepthCollider, "Depth Mesh Collider"); if (ViveSR_DualCameraDepthCollider.UpdateDepthCollider) { ViveSR_DualCameraDepthCollider.UpdateDepthColliderRange = GUILayout.Toggle(ViveSR_DualCameraDepthCollider.UpdateDepthColliderRange, "Depth Mesh Collider Range"); ViveSR_DualCameraDepthCollider.ColliderMeshVisibility = GUILayout.Toggle(ViveSR_DualCameraDepthCollider.ColliderMeshVisibility, "Show Depth Mesh Collider"); GUILayout.Label("Set Mesh Near Distance:"); GUILayout.BeginHorizontal(); float NearDiatanceThres = ViveSR_DualCameraDepthCollider.UpdateColliderNearDistance = GUILayout.HorizontalSlider(ViveSR_DualCameraDepthCollider.UpdateColliderNearDistance, 0.0f, 10.0f); GUILayout.Label("" + NearDiatanceThres.ToString("0.00")); GUILayout.EndHorizontal(); GUILayout.Label("Set Mesh Far Distance:"); GUILayout.BeginHorizontal(); float FarDiatanceThres = ViveSR_DualCameraDepthCollider.UpdateColliderFarDistance = GUILayout.HorizontalSlider(ViveSR_DualCameraDepthCollider.UpdateColliderFarDistance, 0.0f, 10.0f); GUILayout.Label("" + FarDiatanceThres.ToString("0.00")); GUILayout.EndHorizontal(); } }
public override bool Initial() { DualCameraStatus = DualCameraStatus.IDLE; if (!ViveSR.Instance.EnableSeeThroughModule) { return(false); } if (ViveSR.FrameworkStatus == FrameworkStatus.WORKING) { int result = ViveSR_DualCameraImageCapture.Initial(); if (result != (int)Error.WORK) { DualCameraStatus = DualCameraStatus.ERROR; LastError = "[ViveSR] Initial Camera error " + result; Debug.LogError(LastError); return(false); } if (DualCameraCalibration != null) { DualCameraCalibration.LoadDeviceParameter(); } if (TrackedCameraLeft != null) { if (TrackedCameraLeft.ImagePlane != null) { TrackedCameraLeft.ImagePlane.Initial(); } if (TrackedCameraLeft.ImagePlaneCalibration != null) { TrackedCameraLeft.ImagePlaneCalibration.Initial(); TrackedCameraLeft.ImagePlaneCalibration.gameObject.SetActive(false); } } if (TrackedCameraRight != null) { if (TrackedCameraRight.ImagePlane != null) { TrackedCameraRight.ImagePlane.Initial(); } if (TrackedCameraRight.ImagePlaneCalibration != null) { TrackedCameraRight.ImagePlaneCalibration.Initial(); TrackedCameraRight.ImagePlaneCalibration.gameObject.SetActive(false); } } DualCameraStatus = DualCameraStatus.WORKING; SetMode(Mode); return(true); } return(false); }
public override bool Release() { DualCameraStatus = DualCameraStatus.IDLE; if (!ViveSR.Instance.EnableSeeThroughModule) { return(false); } ViveSR_DualCameraImageCapture.EnableDepthProcess(false); ViveSR_DualCameraImageCapture.Release(); if (DualCameraCalibration != null) { DualCameraCalibration.SaveDeviceParameter(); } return(true); }
void Start() { if (_computeShader != null) { _clearMat = new Material(Shader.Find("Unlit/Color")); _clearMat.color = Color.black; // kernel _kernel = _computeShader.FindKernel("CSMain"); // constant buffer _width = ViveSR_DualCameraImageCapture.DepthImageWidth; _height = ViveSR_DualCameraImageCapture.DepthImageHeight; _depthParam.x = (float)ViveSR_DualCameraImageCapture.FocalLength_L; _depthParam.y = (float)ViveSR_DualCameraImageCapture.Baseline; _depthParam.z = ViveSR_DualCameraImageRenderer.OcclusionNearDistance; _depthParam.w = ViveSR_DualCameraImageRenderer.OcclusionFarDistance; // input texture int frameIndex, timeIndex; Texture2D textureDepth; Matrix4x4 Pose_L; ViveSR_DualCameraImageCapture.GetDepthTexture(out textureDepth, out frameIndex, out timeIndex, out Pose_L); // result texture _warpDepth = new RenderTexture(_width, _height, 0, RenderTextureFormat.RFloat); _warpDepth.enableRandomWrite = true; _warpDepth.Create(); // bind _computeShader.SetInt("ImageWidth", _width); _computeShader.SetVector("DepthParam", _depthParam); _computeShader.SetTexture(_kernel, "DepthInput", textureDepth); _computeShader.SetTexture(_kernel, "Result", _warpDepth); } }
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]); } } } }