LitExtendedShader.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. using UnityEditor.Rendering.Universal;
  5. namespace UnityEditor.Rendering.URP.ShaderGUI
  6. {
  7. internal class LitExtendedShader : BaseShaderGUI
  8. {
  9. // Properties
  10. private UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.LitProperties litProperties;
  11. // collect properties from the material properties
  12. public override void FindProperties(MaterialProperty[] properties)
  13. {
  14. base.FindProperties(properties);
  15. litProperties = new UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.LitProperties(properties);
  16. }
  17. // material changed check
  18. public override void MaterialChanged(Material material)
  19. {
  20. if (material == null)
  21. throw new ArgumentNullException("material");
  22. SetMaterialKeywords(material, UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.SetMaterialKeywords);
  23. }
  24. // material main surface options
  25. public override void DrawSurfaceOptions(Material material)
  26. {
  27. if (material == null)
  28. throw new ArgumentNullException("material");
  29. // Use default labelWidth
  30. EditorGUIUtility.labelWidth = 0f;
  31. // Detect any changes to the material
  32. EditorGUI.BeginChangeCheck();
  33. if (litProperties.workflowMode != null)
  34. {
  35. DoPopup(UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.Styles.workflowModeText, litProperties.workflowMode, Enum.GetNames(typeof(UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.WorkflowMode)));
  36. }
  37. if (EditorGUI.EndChangeCheck())
  38. {
  39. foreach (var obj in blendModeProp.targets)
  40. MaterialChanged((Material)obj);
  41. }
  42. // The missing piece here
  43. EditorGUI.BeginChangeCheck();
  44. base.DrawSurfaceOptions(material);
  45. // The missing piece here... otherwise changes made above would not be applied?!
  46. if (EditorGUI.EndChangeCheck()) {
  47. MaterialChanged(material);
  48. }
  49. // Lux URP Essentials add ons
  50. GUILayout.Space(10);
  51. EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
  52. EditorGUI.BeginChangeCheck();
  53. var zTest = (CompareFunction)material.GetInt("_ZTest");
  54. zTest = (UnityEngine.Rendering.CompareFunction) EditorGUILayout.EnumPopup("ZTest", zTest);
  55. var stencil = material.GetInt("_Stencil");
  56. stencil = EditorGUILayout.IntSlider("Stencil Reference", stencil, 0, 255);
  57. var readMask = material.GetInt("_ReadMask");
  58. readMask = EditorGUILayout.IntSlider(" Read Mask", readMask, 0, 255);
  59. var writeMask = material.GetInt("_WriteMask");
  60. writeMask = EditorGUILayout.IntSlider(" Write Mask", writeMask, 0, 255);
  61. UnityEngine.Rendering.CompareFunction stencilComp = (CompareFunction)material.GetFloat("_StencilComp");
  62. stencilComp = (UnityEngine.Rendering.CompareFunction) EditorGUILayout.EnumPopup("Stencil Comparison", stencilComp);
  63. UnityEngine.Rendering.StencilOp stencilOp = (UnityEngine.Rendering.StencilOp)material.GetFloat("_StencilOp");
  64. stencilOp = (UnityEngine.Rendering.StencilOp)EditorGUILayout.EnumPopup("Stencil Pass Op", stencilOp);
  65. UnityEngine.Rendering.StencilOp stencilFail = (UnityEngine.Rendering.StencilOp)material.GetFloat("_StencilFail");
  66. stencilFail = (UnityEngine.Rendering.StencilOp)EditorGUILayout.EnumPopup("Stencil Fail Op", stencilFail);
  67. UnityEngine.Rendering.StencilOp stencilZFail = (UnityEngine.Rendering.StencilOp)material.GetFloat("_StencilZFail");
  68. stencilZFail = (UnityEngine.Rendering.StencilOp)EditorGUILayout.EnumPopup("Stencil Z Fail Op", stencilZFail);
  69. if (EditorGUI.EndChangeCheck()) {
  70. material.SetInt("_ZTest", (int)zTest);
  71. material.SetInt("_Stencil", stencil);
  72. material.SetInt("_ReadMask", readMask);
  73. material.SetInt("_WriteMask", writeMask);
  74. material.SetInt("_StencilComp", (int)stencilComp);
  75. material.SetInt("_StencilOp", (int)stencilOp);
  76. material.SetInt("_StencilFail", (int)stencilFail);
  77. material.SetInt("_StencilZFail", (int)stencilZFail);
  78. }
  79. }
  80. // material main surface inputs
  81. public override void DrawSurfaceInputs(Material material)
  82. {
  83. base.DrawSurfaceInputs(material);
  84. UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.Inputs(litProperties, materialEditor, material);
  85. DrawEmissionProperties(material, true);
  86. DrawTileOffset(materialEditor, baseMapProp);
  87. // Lux URP Add Ons
  88. GUILayout.Space(10);
  89. EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
  90. EditorGUI.BeginChangeCheck();
  91. var enableRim = material.GetFloat("_Rim");
  92. var b_enableRim = (enableRim == 0.0) ? false : true;
  93. b_enableRim = EditorGUILayout.Toggle("Enable Rim Lighting", b_enableRim);
  94. var rimColor = material.GetColor("_RimColor");
  95. rimColor = EditorGUILayout.ColorField("Rim Color", rimColor);
  96. var rimPower = material.GetFloat("_RimPower");
  97. rimPower = EditorGUILayout.FloatField("Rim Power", rimPower);
  98. var rimFrequency = material.GetFloat("_RimFrequency");
  99. rimFrequency = EditorGUILayout.Slider("Rim Frequency", rimFrequency, 0.0f, 20.0f);
  100. var rimMinPower = material.GetFloat("_RimMinPower");
  101. rimMinPower = EditorGUILayout.FloatField(" Rim Min Power", rimMinPower);
  102. var rimPerPositionFrequency = material.GetFloat("_RimPerPositionFrequency");
  103. rimPerPositionFrequency = EditorGUILayout.Slider(" Rim Per Position Frequency", rimPerPositionFrequency, 0.0f, 1.0f);
  104. if (EditorGUI.EndChangeCheck()) {
  105. if(b_enableRim) {
  106. material.SetFloat("_Rim", 1.0f);
  107. }
  108. else {
  109. material.SetFloat("_Rim", 0.0f);
  110. }
  111. material.SetColor("_RimColor", rimColor);
  112. material.SetFloat("_RimPower", rimPower);
  113. material.SetFloat("_RimMinPower", rimMinPower);
  114. material.SetFloat("_RimFrequency", rimFrequency);
  115. material.SetFloat("_RimPerPositionFrequency", rimPerPositionFrequency);
  116. }
  117. CoreUtils.SetKeyword(material, "_RIMLIGHTING", b_enableRim);
  118. }
  119. // material main advanced options
  120. public override void DrawAdvancedOptions(Material material)
  121. {
  122. if (litProperties.reflections != null && litProperties.highlights != null)
  123. {
  124. EditorGUI.BeginChangeCheck();
  125. {
  126. materialEditor.ShaderProperty(litProperties.highlights, UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.Styles.highlightsText);
  127. materialEditor.ShaderProperty(litProperties.reflections, UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.Styles.reflectionsText);
  128. EditorGUI.BeginChangeCheck();
  129. }
  130. }
  131. base.DrawAdvancedOptions(material);
  132. }
  133. public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
  134. {
  135. if (material == null)
  136. throw new ArgumentNullException("material");
  137. // _Emission property is lost after assigning Standard shader to the material
  138. // thus transfer it before assigning the new shader
  139. if (material.HasProperty("_Emission"))
  140. {
  141. material.SetColor("_EmissionColor", material.GetColor("_Emission"));
  142. }
  143. base.AssignNewShaderToMaterial(material, oldShader, newShader);
  144. if (oldShader == null || !oldShader.name.Contains("Legacy Shaders/"))
  145. {
  146. SetupMaterialBlendMode(material);
  147. return;
  148. }
  149. SurfaceType surfaceType = SurfaceType.Opaque;
  150. BlendMode blendMode = BlendMode.Alpha;
  151. if (oldShader.name.Contains("/Transparent/Cutout/"))
  152. {
  153. surfaceType = SurfaceType.Opaque;
  154. material.SetFloat("_AlphaClip", 1);
  155. }
  156. else if (oldShader.name.Contains("/Transparent/"))
  157. {
  158. // NOTE: legacy shaders did not provide physically based transparency
  159. // therefore Fade mode
  160. surfaceType = SurfaceType.Transparent;
  161. blendMode = BlendMode.Alpha;
  162. }
  163. material.SetFloat("_Surface", (float)surfaceType);
  164. material.SetFloat("_Blend", (float)blendMode);
  165. if (oldShader.name.Equals("Standard (Specular setup)"))
  166. {
  167. material.SetFloat("_WorkflowMode", (float)UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.WorkflowMode.Specular);
  168. Texture texture = material.GetTexture("_SpecGlossMap");
  169. if (texture != null)
  170. material.SetTexture("_MetallicSpecGlossMap", texture);
  171. }
  172. else
  173. {
  174. material.SetFloat("_WorkflowMode", (float)UnityEditor.Rendering.Universal.ShaderGUI.LitGUI.WorkflowMode.Metallic);
  175. Texture texture = material.GetTexture("_MetallicGlossMap");
  176. if (texture != null)
  177. material.SetTexture("_MetallicSpecGlossMap", texture);
  178. }
  179. MaterialChanged(material);
  180. }
  181. }
  182. }