//---------------------------------------------------------------------------- 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"); } } } } }