LuxURPUniversalCustomShaderGUI.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using UnityEngine;
  2. using UnityEditor;
  3. using UnityEngine.Rendering;
  4. using UnityEditor.Rendering.Universal;
  5. public class LuxURPUniversalCustomShaderGUI : ShaderGUI
  6. {
  7. public enum SurfaceType {
  8. Opaque,
  9. Transparent
  10. }
  11. public enum BlendMode {
  12. Alpha, // Old school alpha-blending mode, fresnel does not affect amount of transparency
  13. Premultiply, // Physically plausible transparency mode, implemented as alpha pre-multiply
  14. Additive,
  15. Multiply
  16. }
  17. public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
  18. {
  19. Material material = materialEditor.target as Material;
  20. float surface = 0.0f;
  21. float surfaceOld = 0.0f;
  22. if (material.HasProperty("_LuxSurface")) {
  23. surface = surfaceOld = material.GetFloat("_LuxSurface");
  24. //surface = (SurfaceType)EditorGUILayout.EnumPopup("Surface Type", surface);
  25. }
  26. base.OnGUI(materialEditor, properties);
  27. // Double sided
  28. if (material.HasProperty("_Cull")) {
  29. var _Culling = ShaderGUI.FindProperty("_Cull", properties);
  30. if(_Culling.floatValue == 0.0f) {
  31. if (material.doubleSidedGI == false) {
  32. Debug.Log ("Material " + material.name + ": Double Sided Global Illumination enabled.", (Object)material);
  33. }
  34. material.doubleSidedGI = true;
  35. }
  36. else {
  37. if (material.doubleSidedGI == true) {
  38. Debug.Log ("Material " + material.name + ": Double Sided Global Illumination disabled.", (Object)material);
  39. }
  40. material.doubleSidedGI = false;
  41. }
  42. }
  43. // Emission
  44. if ( material.HasProperty("_Emission")) {
  45. if ( material.GetFloat("_Emission") == 1.0f) {
  46. material.globalIlluminationFlags = MaterialGlobalIlluminationFlags.BakedEmissive;
  47. }
  48. else {
  49. material.globalIlluminationFlags = MaterialGlobalIlluminationFlags.BakedEmissive;
  50. material.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
  51. }
  52. }
  53. // Get RenderQueue Offset - if any
  54. int QueueOffset = 0;
  55. if ( material.HasProperty("_QueueOffset") ) {
  56. QueueOffset = material.GetInt("_QueueOffset");
  57. }
  58. // Alpha Testing
  59. bool enableAlphaTesting = false;
  60. // Check old custom property
  61. if ( material.HasProperty("_EnableAlphaTesting")) {
  62. if ( material.GetFloat("_EnableAlphaTesting") == 1.0f ) {
  63. if( material.HasProperty("_AlphaFromMaskMap") && material.HasProperty("_MaskMap") ) {
  64. if (material.GetFloat("_AlphaFromMaskMap") == 1.0f && material.GetFloat("_EnableMaskMap") == 1.0f) {
  65. enableAlphaTesting = true;
  66. }
  67. }
  68. else {
  69. enableAlphaTesting = true;
  70. }
  71. }
  72. if(enableAlphaTesting) {
  73. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest + QueueOffset;
  74. material.SetOverrideTag("RenderType", "TransparentCutout");
  75. }
  76. else {
  77. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry + QueueOffset;
  78. material.SetOverrideTag("RenderType", "Opaque");
  79. }
  80. }
  81. // We also check for the "standard" property
  82. if ( material.HasProperty("_AlphaClip")) {
  83. bool isTransparent = false;
  84. if (material.HasProperty("_LuxSurface")) {
  85. if (material.GetFloat("_LuxSurface") == 1.0f) {
  86. isTransparent = true;
  87. }
  88. }
  89. if ( material.GetFloat("_AlphaClip") == 1.0f ) {
  90. if( material.HasProperty("_AlphaFromMaskMap") && material.HasProperty("_MaskMap") ) {
  91. if (material.GetFloat("_AlphaFromMaskMap") == 1.0f && material.GetFloat("_EnableMaskMap") == 1.0f) {
  92. enableAlphaTesting = true;
  93. }
  94. }
  95. else {
  96. enableAlphaTesting = true;
  97. }
  98. }
  99. if(enableAlphaTesting) {
  100. if (isTransparent) {
  101. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent + QueueOffset;
  102. material.SetOverrideTag("RenderType", "Transparent");
  103. }
  104. else {
  105. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest + QueueOffset;
  106. material.SetOverrideTag("RenderType", "TransparentCutout");
  107. }
  108. }
  109. else {
  110. if (isTransparent) {
  111. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent + QueueOffset;
  112. material.SetOverrideTag("RenderType", "Transparent");
  113. }
  114. else {
  115. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry + QueueOffset;
  116. material.SetOverrideTag("RenderType", "Opaque");
  117. }
  118. }
  119. }
  120. // Surface
  121. if (material.HasProperty("_LuxSurface")) {
  122. surface = material.GetFloat("_LuxSurface");
  123. if(surface != surfaceOld) {
  124. if (surface == 0) {
  125. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  126. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
  127. material.SetInt("_ZWrite", 1);
  128. if ( !material.HasProperty("_AlphaClip")) {
  129. material.SetOverrideTag("RenderType", "Opaque");
  130. material.renderQueue = (int)RenderQueue.Geometry + QueueOffset;
  131. }
  132. material.SetShaderPassEnabled("ShadowCaster", true);
  133. }
  134. else {
  135. //else {
  136. // material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.SrcAlpha);
  137. // material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  138. //}
  139. material.SetInt("_ZWrite", 0);
  140. if ( !material.HasProperty("_AlphaClip")) {
  141. material.SetOverrideTag("RenderType", "Transparent");
  142. material.renderQueue = (int)RenderQueue.Transparent + QueueOffset;
  143. }
  144. material.SetShaderPassEnabled("ShadowCaster", false);
  145. }
  146. }
  147. if (surface == 1.0) {
  148. if(material.HasProperty("_LuxBlend")){
  149. var blendMode = (BlendMode) material.GetFloat("_LuxBlend");
  150. switch (blendMode)
  151. {
  152. case BlendMode.Alpha:
  153. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.SrcAlpha);
  154. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  155. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  156. break;
  157. case BlendMode.Premultiply:
  158. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.One);
  159. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  160. material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
  161. break;
  162. case BlendMode.Additive:
  163. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.SrcAlpha);
  164. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.One);
  165. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  166. break;
  167. case BlendMode.Multiply:
  168. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.DstColor);
  169. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.Zero);
  170. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  171. material.EnableKeyword("_ALPHAMODULATE_ON");
  172. break;
  173. }
  174. }
  175. }
  176. }
  177. else if(material.renderQueue == (int)RenderQueue.Geometry + QueueOffset) {
  178. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  179. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
  180. material.SetInt("_ZWrite", 1);
  181. }
  182. // ColorMask - this is currently only used by the toon & outline shader
  183. // So if detected base geometry only writes to depth. In order to prevent it from occluding the skybox
  184. // we set the render queue to Transparent +
  185. if ( material.HasProperty("_ColorMask") ) {
  186. if (material.GetFloat("_ColorMask") == 0) {
  187. material.renderQueue = (int)RenderQueue.Transparent + QueueOffset;
  188. }
  189. }
  190. // Get rid of the normal map issue
  191. if ( material.HasProperty("_BumpMap") ) {
  192. if (material.HasProperty("_ApplyNormal") ) {
  193. if ( material.GetFloat("_ApplyNormal") == 0.0f && material.GetTexture("_BumpMap") == null ) {
  194. //material.SetTexture("_BumpMap", Texture2D.normalTexture); // Is not linear?!
  195. material.SetTexture("_BumpMap", Resources.Load("LuxURPdefaultBump") as Texture2D );
  196. }
  197. }
  198. }
  199. // Needed to make the Selection Outline work
  200. if (material.HasProperty("_MainTex") && material.HasProperty("_BaseMap") ) {
  201. // Alpha might be stored in the Mask Map
  202. bool copyMaskMap = false;
  203. if(material.HasProperty("_AlphaFromMaskMap") && material.HasProperty("_MaskMap")) {
  204. if (material.GetFloat("_AlphaFromMaskMap") == 1.0) {
  205. copyMaskMap = true;
  206. }
  207. }
  208. if (copyMaskMap) {
  209. if (material.GetTexture("_MaskMap") != null) {
  210. material.SetTexture("_MainTex", material.GetTexture("_MaskMap"));
  211. }
  212. }
  213. else {
  214. if (material.GetTexture("_BaseMap") != null) {
  215. material.SetTexture("_MainTex", material.GetTexture("_BaseMap"));
  216. }
  217. }
  218. }
  219. }
  220. }