diff options
Diffstat (limited to 'RTP_DeferredParams.cs')
-rw-r--r-- | RTP_DeferredParams.cs | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/RTP_DeferredParams.cs b/RTP_DeferredParams.cs new file mode 100644 index 0000000..2730d4a --- /dev/null +++ b/RTP_DeferredParams.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +[AddComponentMenu("Relief Terrain/Helpers/Deferred Params")] +[RequireComponent(typeof(Camera))] +[DisallowMultipleComponent] +[ExecuteInEditMode] +public class RTP_DeferredParams : MonoBehaviour +{ + private Camera mycam; + + private CommandBuffer combufPreLight; + + private CommandBuffer combufPostLight; + + public Material CopyPropsMat; + + private HashSet<Camera> sceneCamsWithBuffer = new HashSet<Camera>(); + + public void OnEnable() + { + if (NotifyDecals()) + { + return; + } + if (mycam == null) + { + mycam = GetComponent<Camera>(); + if (mycam == null) + { + return; + } + } + Initialize(); + Camera.onPreRender = (Camera.CameraCallback)Delegate.Combine(Camera.onPreRender, new Camera.CameraCallback(SetupCam)); + } + + public void OnDisable() + { + NotifyDecals(); + Cleanup(); + } + + public void OnDestroy() + { + NotifyDecals(); + Cleanup(); + } + + private bool NotifyDecals() + { + Type type = Type.GetType("UBERDecalSystem.DecalManager"); + if (type != null) + { + bool flag = false; + if (UnityEngine.Object.FindObjectOfType(type) != null && UnityEngine.Object.FindObjectOfType(type) is MonoBehaviour && (UnityEngine.Object.FindObjectOfType(type) as MonoBehaviour).enabled) + { + (UnityEngine.Object.FindObjectOfType(type) as MonoBehaviour).Invoke("OnDisable", 0f); + (UnityEngine.Object.FindObjectOfType(type) as MonoBehaviour).Invoke("OnEnable", 0f); + return true; + } + } + return false; + } + + private void Cleanup() + { + if (combufPreLight != null) + { + if ((bool)mycam) + { + mycam.RemoveCommandBuffer(CameraEvent.BeforeReflections, combufPreLight); + mycam.RemoveCommandBuffer(CameraEvent.AfterLighting, combufPostLight); + } + foreach (Camera item in sceneCamsWithBuffer) + { + if ((bool)item) + { + item.RemoveCommandBuffer(CameraEvent.BeforeReflections, combufPreLight); + item.RemoveCommandBuffer(CameraEvent.AfterLighting, combufPostLight); + } + } + } + sceneCamsWithBuffer.Clear(); + Camera.onPreRender = (Camera.CameraCallback)Delegate.Remove(Camera.onPreRender, new Camera.CameraCallback(SetupCam)); + } + + private void SetupCam(Camera cam) + { + bool flag = false; + if (cam == mycam || flag) + { + RefreshComBufs(cam, flag); + } + } + + public void RefreshComBufs(Camera cam, bool isSceneCam) + { + if (!cam || combufPreLight == null || combufPostLight == null) + { + return; + } + CommandBuffer[] commandBuffers = cam.GetCommandBuffers(CameraEvent.BeforeReflections); + bool flag = false; + CommandBuffer[] array = commandBuffers; + foreach (CommandBuffer commandBuffer in array) + { + if (commandBuffer.name == combufPreLight.name) + { + flag = true; + break; + } + } + if (!flag) + { + cam.AddCommandBuffer(CameraEvent.BeforeReflections, combufPreLight); + cam.AddCommandBuffer(CameraEvent.AfterLighting, combufPostLight); + if (isSceneCam) + { + sceneCamsWithBuffer.Add(cam); + } + } + } + + public void Initialize() + { + if (combufPreLight != null) + { + return; + } + int num = Shader.PropertyToID("_UBERPropsBuffer"); + if (CopyPropsMat == null) + { + if (CopyPropsMat != null) + { + UnityEngine.Object.DestroyImmediate(CopyPropsMat); + } + CopyPropsMat = new Material(Shader.Find("Hidden/UBER_CopyPropsTexture")); + CopyPropsMat.hideFlags = HideFlags.DontSave; + } + combufPreLight = new CommandBuffer(); + combufPreLight.name = "UBERPropsPrelight"; + combufPreLight.GetTemporaryRT(num, -1, -1, 0, FilterMode.Point, RenderTextureFormat.RHalf); + combufPreLight.Blit(BuiltinRenderTextureType.CameraTarget, num, CopyPropsMat); + combufPostLight = new CommandBuffer(); + combufPostLight.name = "UBERPropsPostlight"; + combufPostLight.ReleaseTemporaryRT(num); + } +} |