Example #1
0
    //----------------------------------------------------------------------------

    void UpdateFrame()
    {
        m_CameraDescription.DT       = Time.smoothDeltaTime;
        m_TimeMultiplier             = Mathf.Max(m_TimeMultiplier, 0.0f);
        m_TimeMultiplier             = Mathf.Min(m_TimeMultiplier, 8.0f);
        m_CameraDescription.DT      *= m_TimeMultiplier;
        m_CameraDescription.NearClip = this.m_Camera.nearClipPlane;
        m_CameraDescription.FarClip  = this.m_Camera.farClipPlane;
        m_CameraDescription.LODBias  = m_TextureLODBias;
        m_CameraDescription.DepthBpp = (int)m_DepthGrabFormat;

        // Set the camera flags
        m_CameraDescription.Flags  = 0;
        m_CameraDescription.Flags |= m_UseDepthGrabToZTest ? (int)PKFxManager.CamFlags.UseDepthGrabberTexture : 0;
        // We need to recreate the depth texture on the native side when "Use Depth Grab To Z Test" is enabled
        if (this.m_Camera.pixelWidth != m_PrevScreenWidth || this.m_Camera.pixelHeight != m_PrevScreenHeight)
        {
            m_CameraDescription.Flags |= (int)PKFxManager.CamFlags.ScreenResolutionChanged;
            // If the screen resolution has changed, we remove the setup of the depth grab and of the distortion
            if (m_CmdBufDepthGrabber != null)
            {
                if (m_Camera.actualRenderingPath == RenderingPath.DeferredLighting || m_Camera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    m_Camera.RemoveCommandBuffer(CameraEvent.AfterFinalPass, m_CmdBufDepthGrabber);
                }
                else
                {
                    m_Camera.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, m_CmdBufDepthGrabber);
                }
                m_CmdBufDepthGrabber.Clear();
                m_CmdBufDepthGrabber = null;
            }
            if (m_DepthRT != null)
            {
                DepthRT = IntPtr.Zero;
                m_DepthRT.Release();
                m_DepthRT = null;
            }

            if (m_DistortionRT != null)
            {
                m_DistortionRT.Release();
                m_DistortionRT = null;
            }
            if (m_CmdBufDisto != null)
            {
                m_Camera.RemoveCommandBuffer(CameraEvent.BeforeImageEffects, m_CmdBufDisto);
                m_CmdBufDisto.Clear();
                m_CmdBufDisto = null;
            }
            else if (m_EnableDistortion && m_DistortionRT == null)
            {
                SetupDistortionPass();
                if (m_Camera.actualRenderingPath == RenderingPath.Forward)
                {
                    PKFxDistortionEffect distoPostFx = GetComponent <PKFxDistortionEffect>();
                    if (distoPostFx != null)
                    {
                        distoPostFx._DistortionRT = m_DistortionRT;
                    }
                }
            }
            // We then update the prev screen size
            m_PrevScreenWidth  = this.m_Camera.pixelWidth;
            m_PrevScreenHeight = this.m_Camera.pixelHeight;
        }

#if UNITY_STEREOSCOPIC_EYE
        PKFxManager.LogicalUpdate(m_CameraDescription.DT);
        if (!m_Camera.stereoEnabled)
        {
            UpdateViewMatrix();
            UpdateProjectionMatrix();
            m_CurrentCameraID = m_CameraID;
            PKFxManager.UpdateCamDesc(m_CurrentCameraID, m_CameraDescription, false);
        }
        else
        {
            // stereo-cam's first eye.
            UpdateViewMatrix(true, Camera.StereoscopicEye.Left);
            UpdateProjectionMatrix(true, Camera.StereoscopicEye.Left);
            m_CurrentCameraID = m_CameraID;
            PKFxManager.UpdateCamDesc(m_CurrentCameraID, m_CameraDescription, false);
            // second eye.
            UpdateViewMatrix(true, Camera.StereoscopicEye.Right);
            UpdateProjectionMatrix(true, Camera.StereoscopicEye.Right);
            m_CurrentCameraID = m_VRReservedID;
            PKFxManager.UpdateCamDesc(m_CurrentCameraID, m_CameraDescription, false);
        }
#else
        if (m_Camera.stereoEnabled)
        {
            Debug.LogError("[PKFX] VR is not supported on Unity 5.2 and 5.3");
            return;
        }
        UpdateViewMatrix();
        UpdateProjectionMatrix();
        if (m_CurrentFrameID != m_LastUpdateFrameID)
        {
            m_CurrentCameraID = m_CameraID;
            PKFxManager.LogicalUpdate(m_CameraDescription.DT);
            PKFxManager.UpdateCamDesc(m_CurrentCameraID, m_CameraDescription, false);
            m_LastUpdateFrameID = m_CurrentFrameID;
        }
#endif
    }
    //----------------------------------------------------------------------------

    IEnumerator     Start()
    {
        base.BaseInitialize();
        yield return(WaitForPack(true));

        if (Application.isEditor && QualitySettings.desiredColorSpace != ColorSpace.Linear)
        {
            Debug.LogWarning("[PKFX] Current rendering not in linear space. " +
                             "Colors may not be accurate.\n" +
                             "To properly set the color space, go to \"Player Settings\">\"Other Settings\">\"Color Space\"");
        }

        m_IsDepthCopyEnabled = (m_EnableSoftParticles || m_EnableDistortion);

        if (m_EnableDistortion && !SystemInfo.supportsImageEffects)
        {
            Debug.LogWarning("[PKFX] Image effects not supported, distortions disabled.");
            m_EnableDistortion = false;
        }

        if (m_UseSceneMesh && m_SceneMeshPkmmPath.Length > 0)
        {
            if (PKFxManager.LoadPkmmAsSceneMesh(m_SceneMeshPkmmPath))
            {
                Debug.Log("[PKFX] Scene Mesh loaded");
            }
            else
            {
                Debug.LogError("[PKFX] Failed to load mesh " + m_SceneMeshPkmmPath + " as scene mesh");
            }
        }

        if (m_EnableDistortion || m_EnableSoftParticles)
        {
            SetupDepthGrab();
        }
        if (m_IsDepthCopyEnabled && m_EnableDistortion && m_Camera.actualRenderingPath == RenderingPath.Forward)
        {
            SetupDistortionPass();
            if (m_EnableDistortion && m_Camera.actualRenderingPath == RenderingPath.Forward)
            {
                m_PostFx = gameObject.AddComponent <PKFxDistortionEffect>();
                m_PostFx.m_MaterialDistortion = m_DistortionMat;
                m_PostFx.m_MaterialBlur       = m_EnableBlur ? m_DistBlurMat : null;
                m_PostFx.m_BlurFactor         = m_BlurFactor;
                m_PostFx._DistortionRT        = m_DistortionRT;
                m_PostFx.hideFlags            = HideFlags.HideAndDontSave;
            }
        }
        if (m_BoundShaders != null)
        {
            for (int iShader = 0; iShader < m_BoundShaders.Count; ++iShader)
            {
                if (m_BoundShaders[iShader] != null && !string.IsNullOrEmpty(m_BoundShaders[iShader].m_ShaderName))
                {
                    if (!string.IsNullOrEmpty(m_BoundShaders[iShader].m_ShaderGroup))
                    {
                        m_BoundShaders[iShader].m_LoadedShaderId = PKFxManager.LoadShader(m_BoundShaders[iShader].GetDesc());
                        m_BoundShaders[iShader].UpdateShaderConstants(true);
                    }
                    else
                    {
                        Debug.LogWarning("[PKFX] " + m_BoundShaders[iShader].m_ShaderName + " has no ShaderGroup, it will not be loaded");
                    }
                }
            }
        }
    }