EnviroVolumetricFogLight.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Rendering;
  5. namespace Enviro
  6. {
  7. [ExecuteInEditMode]
  8. [AddComponentMenu("Enviro 3/Volumetric Light")]
  9. public class EnviroVolumetricFogLight : MonoBehaviour
  10. {
  11. [Range(0f,2f)]
  12. public float intensity = 1.0f;
  13. [Range(0f,2f)]
  14. public float range = 1.0f;
  15. private Light myLight;
  16. private bool addedToMgr = false;
  17. private bool initialized = false;
  18. private CommandBuffer cascadeShadowCB;
  19. public bool isOn
  20. {
  21. get
  22. {
  23. if (!isActiveAndEnabled)
  24. return false;
  25. Init();
  26. return myLight.enabled;
  27. }
  28. private set{}
  29. }
  30. new public Light light {get{Init(); return myLight;} private set{}}
  31. void OnEnable()
  32. {
  33. Init();
  34. AddToLightManager();
  35. }
  36. void OnDisable()
  37. {
  38. if(cascadeShadowCB != null && myLight != null && myLight.type == LightType.Directional)
  39. myLight.RemoveCommandBuffer(LightEvent.AfterShadowMap, cascadeShadowCB);
  40. RemoveFromLightManager();
  41. initialized = false;
  42. }
  43. void AddToLightManager()
  44. {
  45. if (!addedToMgr && EnviroManager.instance.Fog != null)
  46. addedToMgr = EnviroManager.instance.Fog.AddLight(this);
  47. }
  48. void RemoveFromLightManager()
  49. {
  50. if (addedToMgr && EnviroManager.instance.Fog != null)
  51. EnviroManager.instance.Fog.RemoveLight(this);
  52. addedToMgr = false;
  53. }
  54. private void Init()
  55. {
  56. if (initialized)
  57. return;
  58. myLight = GetComponent<Light>();
  59. if(myLight.type == LightType.Directional)
  60. {
  61. cascadeShadowCB = new CommandBuffer();
  62. cascadeShadowCB.name = "Dir Light Command Buffer";
  63. cascadeShadowCB.SetGlobalTexture("_CascadeShadowMapTexture", new UnityEngine.Rendering.RenderTargetIdentifier(UnityEngine.Rendering.BuiltinRenderTextureType.CurrentActive));
  64. myLight.AddCommandBuffer(LightEvent.AfterShadowMap, cascadeShadowCB);
  65. }
  66. initialized = true;
  67. }
  68. }
  69. }