summaryrefslogtreecommitdiff
path: root/RTP_DeferredParams.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-03-13 11:00:58 +0800
committerchai <215380520@qq.com>2024-03-13 11:00:58 +0800
commit6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch)
treeb38119d2acf0a982cb67e381f146924b9bfc3b3f /RTP_DeferredParams.cs
+init
Diffstat (limited to 'RTP_DeferredParams.cs')
-rw-r--r--RTP_DeferredParams.cs151
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);
+ }
+}