BFX_BloodDecalLayers.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class BFX_BloodDecalLayers : MonoBehaviour
  5. {
  6. public LayerMask DecalLayers = 1;
  7. public DecalLayersProperty DecalRenderingMode = DecalLayersProperty.DrawToSelectedLayers;
  8. public DepthMode LayerDepthResoulution = DepthMode.FullScreen;
  9. DepthTextureMode defaultMode;
  10. RenderTexture rt;
  11. Camera depthCamera;
  12. void OnEnable()
  13. {
  14. var currentCam = GetComponent<Camera>();
  15. defaultMode = currentCam.depthTextureMode;
  16. if (currentCam.renderingPath == RenderingPath.Forward)
  17. {
  18. currentCam.depthTextureMode |= DepthTextureMode.Depth;
  19. }
  20. var go = new GameObject("DecalLayersCamera");
  21. go.transform.parent = currentCam.transform;
  22. go.transform.localPosition = Vector3.zero;
  23. go.transform.localRotation = Quaternion.identity;
  24. depthCamera = go.AddComponent<Camera>();
  25. depthCamera.CopyFrom(currentCam);
  26. depthCamera.renderingPath = RenderingPath.Forward;
  27. depthCamera.depth = currentCam.depth - 1;
  28. depthCamera.cullingMask = DecalLayers;
  29. CreateDepthTexture();
  30. depthCamera.targetTexture = rt;
  31. Shader.SetGlobalTexture("_LayerDecalDepthTexture", rt);
  32. Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS");
  33. if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
  34. }
  35. void OnDisable()
  36. {
  37. GetComponent<Camera>().depthTextureMode = defaultMode;
  38. RenderTexture.ReleaseTemporary(rt);
  39. Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS");
  40. if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");
  41. }
  42. void CreateDepthTexture()
  43. {
  44. switch (LayerDepthResoulution)
  45. {
  46. case DepthMode.FullScreen:
  47. rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Depth);
  48. break;
  49. case DepthMode.HalfScreen:
  50. rt = RenderTexture.GetTemporary((int)(Screen.width * 0.5f), (int)(Screen.height * 0.5f), 24, RenderTextureFormat.Depth);
  51. break;
  52. case DepthMode.QuarterScreen:
  53. rt = RenderTexture.GetTemporary((int)(Screen.width * 0.25f), (int)(Screen.height * 0.25f), 24, RenderTextureFormat.Depth);
  54. break;
  55. default:
  56. break;
  57. };
  58. }
  59. public enum DecalLayersProperty
  60. {
  61. DrawToSelectedLayers,
  62. IgnoreSelectedLayers
  63. }
  64. public enum DepthMode
  65. {
  66. FullScreen,
  67. HalfScreen,
  68. QuarterScreen
  69. }
  70. }