123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class BFX_BloodDecalLayers : MonoBehaviour
- {
- public LayerMask DecalLayers = 1;
- public DecalLayersProperty DecalRenderingMode = DecalLayersProperty.DrawToSelectedLayers;
- public DepthMode LayerDepthResoulution = DepthMode.FullScreen;
- DepthTextureMode defaultMode;
- RenderTexture rt;
- Camera depthCamera;
- void OnEnable()
- {
- var currentCam = GetComponent<Camera>();
- defaultMode = currentCam.depthTextureMode;
- if (currentCam.renderingPath == RenderingPath.Forward)
- {
- currentCam.depthTextureMode |= DepthTextureMode.Depth;
- }
- var go = new GameObject("DecalLayersCamera");
- go.transform.parent = currentCam.transform;
- go.transform.localPosition = Vector3.zero;
- go.transform.localRotation = Quaternion.identity;
- depthCamera = go.AddComponent<Camera>();
- depthCamera.CopyFrom(currentCam);
- depthCamera.renderingPath = RenderingPath.Forward;
- depthCamera.depth = currentCam.depth - 1;
- depthCamera.cullingMask = DecalLayers;
- CreateDepthTexture();
- depthCamera.targetTexture = rt;
- Shader.SetGlobalTexture("_LayerDecalDepthTexture", rt);
- Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS");
- if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
- }
- void OnDisable()
- {
- GetComponent<Camera>().depthTextureMode = defaultMode;
- RenderTexture.ReleaseTemporary(rt);
- Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS");
- if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
- }
- void CreateDepthTexture()
- {
- switch (LayerDepthResoulution)
- {
- case DepthMode.FullScreen:
- rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Depth);
- break;
- case DepthMode.HalfScreen:
- rt = RenderTexture.GetTemporary((int)(Screen.width * 0.5f), (int)(Screen.height * 0.5f), 24, RenderTextureFormat.Depth);
- break;
- case DepthMode.QuarterScreen:
- rt = RenderTexture.GetTemporary((int)(Screen.width * 0.25f), (int)(Screen.height * 0.25f), 24, RenderTextureFormat.Depth);
- break;
- default:
- break;
- };
- }
- public enum DecalLayersProperty
- {
- DrawToSelectedLayers,
- IgnoreSelectedLayers
- }
- public enum DepthMode
- {
- FullScreen,
- HalfScreen,
- QuarterScreen
- }
- }
|