summaryrefslogtreecommitdiff
path: root/GameCode/AmplifyColorRenderMaskBase.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-10-27 11:05:14 +0800
committerchai <215380520@qq.com>2023-10-27 11:05:14 +0800
commit766cdff5ffa72b65d7f106658d1603f47739b2ba (patch)
tree34d7799a94dfa9be182825577583c0fa6dc935f7 /GameCode/AmplifyColorRenderMaskBase.cs
+ init
Diffstat (limited to 'GameCode/AmplifyColorRenderMaskBase.cs')
-rw-r--r--GameCode/AmplifyColorRenderMaskBase.cs174
1 files changed, 174 insertions, 0 deletions
diff --git a/GameCode/AmplifyColorRenderMaskBase.cs b/GameCode/AmplifyColorRenderMaskBase.cs
new file mode 100644
index 0000000..589c64a
--- /dev/null
+++ b/GameCode/AmplifyColorRenderMaskBase.cs
@@ -0,0 +1,174 @@
+using AmplifyColor;
+using UnityEngine;
+using UnityEngine.Serialization;
+using UnityEngine.XR;
+
+[ExecuteInEditMode]
+[RequireComponent(typeof(Camera))]
+[AddComponentMenu("")]
+public class AmplifyColorRenderMaskBase : MonoBehaviour
+{
+ [FormerlySerializedAs("clearColor")]
+ public Color ClearColor = Color.black;
+
+ [FormerlySerializedAs("renderLayers")]
+ public RenderLayer[] RenderLayers = new RenderLayer[0];
+
+ [FormerlySerializedAs("debug")]
+ public bool DebugMask;
+
+ private Camera referenceCamera;
+
+ private Camera maskCamera;
+
+ private AmplifyColorBase colorEffect;
+
+ private int width;
+
+ private int height;
+
+ private RenderTexture maskTexture;
+
+ private Shader colorMaskShader;
+
+ private bool singlePassStereo;
+
+ private void OnEnable()
+ {
+ if (maskCamera == null)
+ {
+ GameObject gameObject = new GameObject("Mask Camera", typeof(Camera))
+ {
+ hideFlags = HideFlags.HideAndDontSave
+ };
+ gameObject.transform.parent = base.gameObject.transform;
+ maskCamera = gameObject.GetComponent<Camera>();
+ }
+ referenceCamera = GetComponent<Camera>();
+ colorEffect = GetComponent<AmplifyColorBase>();
+ colorMaskShader = Shader.Find("Hidden/RenderMask");
+ }
+
+ private void OnDisable()
+ {
+ DestroyCamera();
+ DestroyRenderTextures();
+ }
+
+ private void DestroyCamera()
+ {
+ if (maskCamera != null)
+ {
+ Object.DestroyImmediate(maskCamera.gameObject);
+ maskCamera = null;
+ }
+ }
+
+ private void DestroyRenderTextures()
+ {
+ if (maskTexture != null)
+ {
+ RenderTexture.active = null;
+ Object.DestroyImmediate(maskTexture);
+ maskTexture = null;
+ }
+ }
+
+ private void UpdateRenderTextures(bool singlePassStereo)
+ {
+ int num = referenceCamera.pixelWidth;
+ int num2 = referenceCamera.pixelHeight;
+ if (maskTexture == null || width != num || height != num2 || !maskTexture.IsCreated() || this.singlePassStereo != singlePassStereo)
+ {
+ width = num;
+ height = num2;
+ DestroyRenderTextures();
+ if (XRSettings.enabled)
+ {
+ num = XRSettings.eyeTextureWidth * ((!singlePassStereo) ? 1 : 2);
+ num2 = XRSettings.eyeTextureHeight;
+ }
+ if (maskTexture == null)
+ {
+ maskTexture = new RenderTexture(num, num2, 24, RenderTextureFormat.Default, RenderTextureReadWrite.sRGB)
+ {
+ hideFlags = HideFlags.HideAndDontSave,
+ name = "MaskTexture"
+ };
+ maskTexture.name = "AmplifyColorMaskTexture";
+ bool allowMSAA = maskCamera.allowMSAA;
+ maskTexture.antiAliasing = ((!allowMSAA || QualitySettings.antiAliasing <= 0) ? 1 : QualitySettings.antiAliasing);
+ }
+ maskTexture.Create();
+ this.singlePassStereo = singlePassStereo;
+ }
+ if (colorEffect != null)
+ {
+ colorEffect.MaskTexture = maskTexture;
+ }
+ }
+
+ private void UpdateCameraProperties()
+ {
+ maskCamera.CopyFrom(referenceCamera);
+ maskCamera.targetTexture = maskTexture;
+ maskCamera.clearFlags = CameraClearFlags.Nothing;
+ maskCamera.renderingPath = RenderingPath.VertexLit;
+ maskCamera.pixelRect = new Rect(0f, 0f, width, height);
+ maskCamera.depthTextureMode = DepthTextureMode.None;
+ maskCamera.allowHDR = false;
+ maskCamera.enabled = false;
+ }
+
+ private void OnPreRender()
+ {
+ if (!(maskCamera != null))
+ {
+ return;
+ }
+ RenderBuffer activeColorBuffer = Graphics.activeColorBuffer;
+ RenderBuffer activeDepthBuffer = Graphics.activeDepthBuffer;
+ bool flag = false;
+ if (referenceCamera.stereoEnabled)
+ {
+ flag = XRSettings.eyeTextureDesc.vrUsage == VRTextureUsage.TwoEyes;
+ maskCamera.SetStereoViewMatrix(Camera.StereoscopicEye.Left, referenceCamera.GetStereoViewMatrix(Camera.StereoscopicEye.Left));
+ maskCamera.SetStereoViewMatrix(Camera.StereoscopicEye.Right, referenceCamera.GetStereoViewMatrix(Camera.StereoscopicEye.Right));
+ maskCamera.SetStereoProjectionMatrix(Camera.StereoscopicEye.Left, referenceCamera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left));
+ maskCamera.SetStereoProjectionMatrix(Camera.StereoscopicEye.Right, referenceCamera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right));
+ }
+ UpdateRenderTextures(flag);
+ UpdateCameraProperties();
+ Graphics.SetRenderTarget(maskTexture);
+ GL.Clear(clearDepth: true, clearColor: true, ClearColor);
+ if (flag)
+ {
+ maskCamera.worldToCameraMatrix = referenceCamera.GetStereoViewMatrix(Camera.StereoscopicEye.Left);
+ maskCamera.projectionMatrix = referenceCamera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);
+ maskCamera.rect = new Rect(0f, 0f, 0.5f, 1f);
+ }
+ RenderLayer[] renderLayers = RenderLayers;
+ for (int i = 0; i < renderLayers.Length; i++)
+ {
+ RenderLayer renderLayer = renderLayers[i];
+ Shader.SetGlobalColor("_COLORMASK_Color", renderLayer.color);
+ maskCamera.cullingMask = renderLayer.mask;
+ maskCamera.RenderWithShader(colorMaskShader, "RenderType");
+ }
+ if (flag)
+ {
+ maskCamera.worldToCameraMatrix = referenceCamera.GetStereoViewMatrix(Camera.StereoscopicEye.Right);
+ maskCamera.projectionMatrix = referenceCamera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);
+ maskCamera.rect = new Rect(0.5f, 0f, 0.5f, 1f);
+ renderLayers = RenderLayers;
+ for (int i = 0; i < renderLayers.Length; i++)
+ {
+ RenderLayer renderLayer2 = renderLayers[i];
+ Shader.SetGlobalColor("_COLORMASK_Color", renderLayer2.color);
+ maskCamera.cullingMask = renderLayer2.mask;
+ maskCamera.RenderWithShader(colorMaskShader, "RenderType");
+ }
+ }
+ Graphics.SetRenderTarget(activeColorBuffer, activeDepthBuffer);
+ }
+}