GlowEvent.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System;
  2. using UnityEngine;
  3. namespace Xft
  4. {
  5. public class GlowEvent : CameraEffectEvent
  6. {
  7. public GlowEvent(XftEventComponent owner) : base(CameraEffectEvent.EType.Glow, owner)
  8. {
  9. this.downsampleShader = owner.GlowDownSampleShader;
  10. this.compositeShader = owner.GlowCompositeShader;
  11. this.blurShader = owner.GlowBlurShader;
  12. }
  13. protected Material compositeMaterial
  14. {
  15. get
  16. {
  17. if (this.m_CompositeMaterial == null)
  18. {
  19. this.m_CompositeMaterial = new Material(this.compositeShader);
  20. this.m_CompositeMaterial.hideFlags = HideFlags.HideAndDontSave;
  21. }
  22. return this.m_CompositeMaterial;
  23. }
  24. }
  25. protected Material blurMaterial
  26. {
  27. get
  28. {
  29. if (this.m_BlurMaterial == null)
  30. {
  31. this.m_BlurMaterial = new Material(this.blurShader);
  32. this.m_BlurMaterial.hideFlags = HideFlags.HideAndDontSave;
  33. }
  34. return this.m_BlurMaterial;
  35. }
  36. }
  37. protected Material downsampleMaterial
  38. {
  39. get
  40. {
  41. if (this.m_DownsampleMaterial == null)
  42. {
  43. this.m_DownsampleMaterial = new Material(this.downsampleShader);
  44. this.m_DownsampleMaterial.hideFlags = HideFlags.HideAndDontSave;
  45. }
  46. return this.m_DownsampleMaterial;
  47. }
  48. }
  49. private void FourTapCone(RenderTexture source, RenderTexture dest, int iteration, float spread)
  50. {
  51. float num = 0.5f + (float)iteration * spread;
  52. Graphics.BlitMultiTap(source, dest, this.blurMaterial, new Vector2[]
  53. {
  54. new Vector2(num, num),
  55. new Vector2(-num, num),
  56. new Vector2(num, -num),
  57. new Vector2(-num, -num)
  58. });
  59. }
  60. private void DownSample4x(RenderTexture source, RenderTexture dest)
  61. {
  62. this.downsampleMaterial.color = new Color(this.m_glowTint.r, this.m_glowTint.g, this.m_glowTint.b, this.m_glowTint.a / 4f);
  63. Graphics.Blit(source, dest, this.downsampleMaterial);
  64. }
  65. private void BlitGlow(RenderTexture source, RenderTexture dest, float intensity)
  66. {
  67. this.compositeMaterial.color = new Color(1f, 1f, 1f, Mathf.Clamp01(intensity));
  68. Graphics.Blit(source, dest, this.compositeMaterial);
  69. }
  70. public override bool CheckSupport()
  71. {
  72. bool result = true;
  73. if (!SystemInfo.supportsImageEffects)
  74. {
  75. result = false;
  76. }
  77. if (this.downsampleShader == null)
  78. {
  79. UnityEngine.Debug.Log("No downsample shader assigned! Disabling glow.");
  80. result = false;
  81. }
  82. else
  83. {
  84. if (!this.blurMaterial.shader.isSupported)
  85. {
  86. result = false;
  87. }
  88. if (!this.compositeMaterial.shader.isSupported)
  89. {
  90. result = false;
  91. }
  92. if (!this.downsampleMaterial.shader.isSupported)
  93. {
  94. result = false;
  95. }
  96. }
  97. return result;
  98. }
  99. public override void OnRenderImage(RenderTexture source, RenderTexture destination)
  100. {
  101. int num = this.m_owner.GlowBlurIterations;
  102. float num2 = this.m_owner.GlowBlurSpread;
  103. float num3 = this.m_owner.GlowIntensity;
  104. num3 = Mathf.Clamp(num3, 0f, 10f);
  105. num = Mathf.Clamp(num, 0, 30);
  106. num2 = Mathf.Clamp(num2, 0.5f, 1f);
  107. RenderTexture temporary = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0);
  108. RenderTexture temporary2 = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0);
  109. this.DownSample4x(source, temporary);
  110. float num4 = Mathf.Clamp01((num3 - 1f) / 4f);
  111. this.blurMaterial.color = new Color(1f, 1f, 1f, 0.25f + num4);
  112. bool flag = true;
  113. for (int i = 0; i < num; i++)
  114. {
  115. if (flag)
  116. {
  117. this.FourTapCone(temporary, temporary2, i, num2);
  118. temporary.DiscardContents();
  119. }
  120. else
  121. {
  122. this.FourTapCone(temporary2, temporary, i, num2);
  123. temporary2.DiscardContents();
  124. }
  125. flag = !flag;
  126. }
  127. Graphics.Blit(source, destination);
  128. if (flag)
  129. {
  130. this.BlitGlow(temporary, destination, num3);
  131. }
  132. else
  133. {
  134. this.BlitGlow(temporary2, destination, num3);
  135. }
  136. RenderTexture.ReleaseTemporary(temporary);
  137. RenderTexture.ReleaseTemporary(temporary2);
  138. }
  139. public override void Update(float deltaTime)
  140. {
  141. this.m_elapsedTime += deltaTime;
  142. float t = this.m_owner.ColorCurve.Evaluate(this.m_elapsedTime);
  143. this.m_glowTint = Color.Lerp(this.m_owner.GlowColorStart, this.m_owner.GlowColorEnd, t);
  144. }
  145. protected Color m_glowTint = new Color(1f, 1f, 1f, 1f);
  146. public Shader compositeShader;
  147. private Material m_CompositeMaterial;
  148. public Shader blurShader;
  149. private Material m_BlurMaterial;
  150. public Shader downsampleShader;
  151. private Material m_DownsampleMaterial;
  152. }
  153. }