public PreviousFrameData GetMotionDataForCamera(Camera camera, CameraData camData)
        {
            // Get MotionData
            PreviousFrameData motionData;

            if (!m_CameraFrameData.TryGetValue(camera, out motionData))
            {
                motionData = new PreviousFrameData();
                m_CameraFrameData.Add(camera, motionData);
            }

            // Calculate motion data
            CalculateTime();
            UpdateMotionData(camera, camData, motionData);
            return(motionData);
        }
        void UpdateMotionData(Camera camera, CameraData cameraData, PreviousFrameData motionData)
        {
            // The actual projection matrix used in shaders is actually massaged a bit to work across all platforms
            // (different Z value ranges etc.)

            // A camera could be rendered multiple times per frame, only updates the previous view proj & pos if needed
#if ENABLE_VR && ENABLE_XR_MODULE
            if (cameraData.xr.enabled)
            {
                var gpuVP0 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrix(0), true) * cameraData.GetViewMatrix(0);
                var gpuVP1 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrix(1), true) * cameraData.GetViewMatrix(1);

                // Last frame data
                if (motionData.lastFrameActive != Time.frameCount)
                {
                    bool firstFrame         = motionData.isFirstFrame;
                    var  prevViewProjStereo = motionData.previousViewProjectionMatrixStereo;
                    prevViewProjStereo[0]   = firstFrame ? gpuVP0 : prevViewProjStereo[0];
                    prevViewProjStereo[1]   = firstFrame ? gpuVP1 : prevViewProjStereo[1];
                    motionData.isFirstFrame = false;
                }

                // Current frame data
                var viewProjStereo = motionData.viewProjectionMatrixStereo;
                viewProjStereo[0] = gpuVP0;
                viewProjStereo[1] = gpuVP1;
            }
            else
#endif
            {
                var gpuProj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); // Had to change this from 'false'
                var gpuView = camera.worldToCameraMatrix;
                var gpuVP   = gpuProj * gpuView;

                // Last frame data
                if (motionData.lastFrameActive != Time.frameCount)
                {
                    motionData.previousViewProjectionMatrix = motionData.isFirstFrame ? gpuVP : motionData.viewProjectionMatrix;
                    motionData.isFirstFrame = false;
                }

                // Current frame data
                motionData.viewProjectionMatrix = gpuVP;
            }

            motionData.lastFrameActive = Time.frameCount;
        }
Esempio n. 3
0
 internal void Setup(RTHandle color, RTHandle depth, PreviousFrameData frameData)
 {
     m_MotionData = frameData;
     m_Color      = color;
     m_Depth      = depth;
 }
Esempio n. 4
0
 internal void Setup(PreviousFrameData frameData)
 {
     m_MotionData = frameData;
 }