LuxURPParticlesCustomShaderGUI1.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using UnityEngine;
  2. using UnityEditor;
  3. //using UnityEditorInternal;
  4. using System.Linq;
  5. using System.Collections.Generic;
  6. public class LuxURPParticlesCustomShaderGUI : ShaderGUI
  7. {
  8. List<ParticleSystemRenderer> m_RenderersUsingThisMaterial = new List<ParticleSystemRenderer>();
  9. //private static ReorderableList vertexStreamList;
  10. private bool showVertexSteamArea = false;
  11. public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
  12. {
  13. base.OnGUI(materialEditor, properties);
  14. Material material = materialEditor.target as Material;
  15. var blendMode = material.GetInt("_Blend");
  16. switch (blendMode) {
  17. case 0: // Alpha
  18. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
  19. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  20. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  21. material.DisableKeyword("_ALPHAMODULATE_ON");
  22. material.DisableKeyword("_ADDITIVE");
  23. break;
  24. case 1: // Premultiply
  25. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  26. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  27. material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
  28. material.DisableKeyword("_ALPHAMODULATE_ON");
  29. material.DisableKeyword("_ADDITIVE");
  30. break;
  31. case 2: // Additive:
  32. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  33. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
  34. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  35. material.DisableKeyword("_ALPHAMODULATE_ON");
  36. material.EnableKeyword("_ADDITIVE");
  37. break;
  38. case 3: // Multiply:
  39. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor);
  40. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
  41. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  42. material.EnableKeyword("_ALPHAMODULATE_ON");
  43. material.DisableKeyword("_ADDITIVE");
  44. break;
  45. }
  46. var colorMode = material.GetInt("_ColorMode");
  47. switch (colorMode)
  48. {
  49. case 0: //ColorMode.Multiply:
  50. material.DisableKeyword("_COLOROVERLAY_ON");
  51. material.DisableKeyword("_COLORCOLOR_ON");
  52. material.DisableKeyword("_COLORADDSUBDIFF_ON");
  53. break;
  54. case 1: //ColorMode.Additive:
  55. material.DisableKeyword("_COLOROVERLAY_ON");
  56. material.DisableKeyword("_COLORCOLOR_ON");
  57. material.EnableKeyword("_COLORADDSUBDIFF_ON");
  58. material.SetVector("_BaseColorAddSubDiff", new Vector4(1.0f, 0.0f, 0.0f, 0.0f));
  59. break;
  60. case 2: //ColorMode.Subtractive:
  61. material.DisableKeyword("_COLOROVERLAY_ON");
  62. material.DisableKeyword("_COLORCOLOR_ON");
  63. material.EnableKeyword("_COLORADDSUBDIFF_ON");
  64. material.SetVector("_BaseColorAddSubDiff", new Vector4(-1.0f, 0.0f, 0.0f, 0.0f));
  65. break;
  66. case 3: //ColorMode.Overlay:
  67. material.DisableKeyword("_COLORCOLOR_ON");
  68. material.DisableKeyword("_COLORADDSUBDIFF_ON");
  69. material.EnableKeyword("_COLOROVERLAY_ON");
  70. break;
  71. case 4: //ColorMode.Color:
  72. material.DisableKeyword("_COLOROVERLAY_ON");
  73. material.DisableKeyword("_COLORADDSUBDIFF_ON");
  74. material.EnableKeyword("_COLORCOLOR_ON");
  75. break;
  76. case 5: //ColorMode.Difference:
  77. material.DisableKeyword("_COLOROVERLAY_ON");
  78. material.DisableKeyword("_COLORCOLOR_ON");
  79. material.EnableKeyword("_COLORADDSUBDIFF_ON");
  80. material.SetVector("_BaseColorAddSubDiff", new Vector4(-1.0f, 1.0f, 0.0f, 0.0f));
  81. break;
  82. }
  83. // Setup Specular
  84. if(material.GetFloat("_EnableSpecGloss") == 1.0f) {
  85. material.EnableKeyword("_SPECGLOSSMAP");
  86. material.DisableKeyword("_SPECULAR_COLOR");
  87. }
  88. else {
  89. material.DisableKeyword("_SPECGLOSSMAP");
  90. material.EnableKeyword("_SPECULAR_COLOR");
  91. }
  92. // Remap Distortion Strength
  93. material.SetFloat("_DistortionStrengthScaled", material.GetFloat("_DistortionStrength") * 0.1f);
  94. // Remap Camera Fade Strength
  95. var CameraFade = material.GetVector("_CameraFadeParamsRaw");
  96. // clamp values
  97. if (CameraFade.x < 0.0f) {
  98. CameraFade.x = 0.0f;
  99. }
  100. if (CameraFade.y < 0.0f) {
  101. CameraFade.y = 0.0f;
  102. }
  103. material.SetVector("_CameraFadeParamsRaw", CameraFade);
  104. material.SetVector("_CameraFadeParams", new Vector2(CameraFade.x, 1.0f / (CameraFade.y - CameraFade.x) ));
  105. // Set _PERVERTEX_SAMPLEOFFSET Keyword if needed
  106. if( material.GetFloat("_SampleOffset") > 0.0f && material.GetFloat("_PerVertexShadows") == 1.0f ) {
  107. material.EnableKeyword("_PERVERTEX_SAMPLEOFFSET");
  108. }
  109. else {
  110. material.DisableKeyword("_PERVERTEX_SAMPLEOFFSET");
  111. }
  112. //if (GUILayout.Button("Check Vertex Streams"))
  113. //{
  114. CheckVertexStreams(material, materialEditor);
  115. //}
  116. // Needed to make the Selection Outline work
  117. if (material.HasProperty("_MainTex") && material.HasProperty("_BaseMap") ) {
  118. // Alpha might be stored in the Mask Map
  119. bool copyMaskMap = false;
  120. if(material.HasProperty("_AlphaFromMaskMap") && material.HasProperty("_MaskMap")) {
  121. if (material.GetFloat("_AlphaFromMaskMap") == 1.0) {
  122. copyMaskMap = true;
  123. }
  124. }
  125. if (copyMaskMap) {
  126. if (material.GetTexture("_MaskMap") != null) {
  127. material.SetTexture("_MainTex", material.GetTexture("_MaskMap"));
  128. }
  129. }
  130. else {
  131. if (material.GetTexture("_BaseMap") != null) {
  132. material.SetTexture("_MainTex", material.GetTexture("_BaseMap"));
  133. }
  134. }
  135. }
  136. }
  137. public void CheckVertexStreams (Material material, MaterialEditor materialEditor) {
  138. if (GUILayout.Button("Check Vertex Streams")) {
  139. showVertexSteamArea = true;
  140. }
  141. if(showVertexSteamArea) {
  142. m_RenderersUsingThisMaterial.Clear();
  143. ParticleSystemRenderer[] renderers = UnityEngine.Object.FindObjectsOfType(typeof(ParticleSystemRenderer)) as ParticleSystemRenderer[];
  144. foreach (ParticleSystemRenderer renderer in renderers) {
  145. if (renderer.sharedMaterial == material)
  146. m_RenderersUsingThisMaterial.Add(renderer);
  147. }
  148. // Build the list of expected vertex streams
  149. List<ParticleSystemVertexStream> streams = new List<ParticleSystemVertexStream>();
  150. streams.Add(ParticleSystemVertexStream.Position);
  151. // Lit shader!
  152. streams.Add(ParticleSystemVertexStream.Normal);
  153. streams.Add(ParticleSystemVertexStream.Color);
  154. streams.Add(ParticleSystemVertexStream.UV);
  155. if( material.GetFloat("_ApplyNormal") == 1.0f)
  156. streams.Add(ParticleSystemVertexStream.Tangent);
  157. if( material.GetFloat("_FlipbookBlending") == 1.0f) {
  158. streams.Add(ParticleSystemVertexStream.UV2);
  159. streams.Add(ParticleSystemVertexStream.AnimBlend);
  160. }
  161. // In case we use per vertex shadows and _SampleOffset > 0 we need velocity
  162. if( material.GetFloat("_SampleOffset") > 0.0f && material.GetFloat("_PerVertexShadows") == 1.0f ) {
  163. streams.Add(ParticleSystemVertexStream.Velocity);
  164. }
  165. // Display a warning if any renderers have incorrect vertex streams
  166. string Warnings = "";
  167. List<ParticleSystemVertexStream> rendererStreams = new List<ParticleSystemVertexStream>();
  168. foreach (ParticleSystemRenderer renderer in renderers) {
  169. renderer.GetActiveVertexStreams(rendererStreams);
  170. if (!rendererStreams.SequenceEqual(streams))
  171. Warnings += "- " + renderer.name + "\n";
  172. }
  173. if (!string.IsNullOrEmpty(Warnings)) {
  174. EditorGUILayout.HelpBox("The following Particle System Renderers are using this material with incorrect Vertex Streams:\n" + Warnings, MessageType.Error, true);
  175. // Set the streams on all systems using this material
  176. if (GUILayout.Button("Fix Vertex Streams")) {
  177. Undo.RecordObjects(renderers.Where(r => r != null).ToArray(), "Fix Vertex Streams");
  178. foreach (ParticleSystemRenderer renderer in renderers) {
  179. renderer.SetActiveVertexStreams(streams);
  180. }
  181. showVertexSteamArea = false;
  182. }
  183. }
  184. else {
  185. Debug.Log("All renderers have proper vertex streams.");
  186. showVertexSteamArea = false;
  187. }
  188. }
  189. EditorGUILayout.Space();
  190. }
  191. }