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();
            }
        }
Exemple #3
0
        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);
        }
Exemple #4
0
 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);
            }
        }
Exemple #6
0
        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
            }
        }
Exemple #7
0
        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]);
                    }
                }
            }
        }