No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LitShader.cs 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace UnityEditor.Rendering.Universal.ShaderGUI
  5. {
  6. internal class LitShader : BaseShaderGUI
  7. {
  8. static readonly string[] workflowModeNames = Enum.GetNames(typeof(LitGUI.WorkflowMode));
  9. private LitGUI.LitProperties litProperties;
  10. private LitDetailGUI.LitProperties litDetailProperties;
  11. public override void FillAdditionalFoldouts(MaterialHeaderScopeList materialScopesList)
  12. {
  13. materialScopesList.RegisterHeaderScope(LitDetailGUI.Styles.detailInputs, Expandable.Details, _ => LitDetailGUI.DoDetailArea(litDetailProperties, materialEditor));
  14. }
  15. // collect properties from the material properties
  16. public override void FindProperties(MaterialProperty[] properties)
  17. {
  18. base.FindProperties(properties);
  19. litProperties = new LitGUI.LitProperties(properties);
  20. litDetailProperties = new LitDetailGUI.LitProperties(properties);
  21. }
  22. // material changed check
  23. public override void ValidateMaterial(Material material)
  24. {
  25. SetMaterialKeywords(material, LitGUI.SetMaterialKeywords, LitDetailGUI.SetMaterialKeywords);
  26. }
  27. // material main surface options
  28. public override void DrawSurfaceOptions(Material material)
  29. {
  30. // Use default labelWidth
  31. EditorGUIUtility.labelWidth = 0f;
  32. if (litProperties.workflowMode != null)
  33. DoPopup(LitGUI.Styles.workflowModeText, litProperties.workflowMode, workflowModeNames);
  34. base.DrawSurfaceOptions(material);
  35. }
  36. // material main surface inputs
  37. public override void DrawSurfaceInputs(Material material)
  38. {
  39. base.DrawSurfaceInputs(material);
  40. LitGUI.Inputs(litProperties, materialEditor, material);
  41. DrawEmissionProperties(material, true);
  42. DrawTileOffset(materialEditor, baseMapProp);
  43. }
  44. // material main advanced options
  45. public override void DrawAdvancedOptions(Material material)
  46. {
  47. if (litProperties.reflections != null && litProperties.highlights != null)
  48. {
  49. materialEditor.ShaderProperty(litProperties.highlights, LitGUI.Styles.highlightsText);
  50. materialEditor.ShaderProperty(litProperties.reflections, LitGUI.Styles.reflectionsText);
  51. }
  52. base.DrawAdvancedOptions(material);
  53. }
  54. public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
  55. {
  56. if (material == null)
  57. throw new ArgumentNullException("material");
  58. // _Emission property is lost after assigning Standard shader to the material
  59. // thus transfer it before assigning the new shader
  60. if (material.HasProperty("_Emission"))
  61. {
  62. material.SetColor("_EmissionColor", material.GetColor("_Emission"));
  63. }
  64. base.AssignNewShaderToMaterial(material, oldShader, newShader);
  65. if (oldShader == null || !oldShader.name.Contains("Legacy Shaders/"))
  66. {
  67. SetupMaterialBlendMode(material);
  68. return;
  69. }
  70. SurfaceType surfaceType = SurfaceType.Opaque;
  71. BlendMode blendMode = BlendMode.Alpha;
  72. if (oldShader.name.Contains("/Transparent/Cutout/"))
  73. {
  74. surfaceType = SurfaceType.Opaque;
  75. material.SetFloat("_AlphaClip", 1);
  76. }
  77. else if (oldShader.name.Contains("/Transparent/"))
  78. {
  79. // NOTE: legacy shaders did not provide physically based transparency
  80. // therefore Fade mode
  81. surfaceType = SurfaceType.Transparent;
  82. blendMode = BlendMode.Alpha;
  83. }
  84. material.SetFloat("_Blend", (float)blendMode);
  85. material.SetFloat("_Surface", (float)surfaceType);
  86. if (surfaceType == SurfaceType.Opaque)
  87. {
  88. material.DisableKeyword("_SURFACE_TYPE_TRANSPARENT");
  89. }
  90. else
  91. {
  92. material.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
  93. }
  94. if (oldShader.name.Equals("Standard (Specular setup)"))
  95. {
  96. material.SetFloat("_WorkflowMode", (float)LitGUI.WorkflowMode.Specular);
  97. Texture texture = material.GetTexture("_SpecGlossMap");
  98. if (texture != null)
  99. material.SetTexture("_MetallicSpecGlossMap", texture);
  100. }
  101. else
  102. {
  103. material.SetFloat("_WorkflowMode", (float)LitGUI.WorkflowMode.Metallic);
  104. Texture texture = material.GetTexture("_MetallicGlossMap");
  105. if (texture != null)
  106. material.SetTexture("_MetallicSpecGlossMap", texture);
  107. }
  108. }
  109. }
  110. }