123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- using System;
- using UnityEngine;
- using UnityEngine.Rendering;
- using UnityEngine.Scripting.APIUpdating;
-
- namespace UnityEditor.Rendering.Universal.ShaderGUI
- {
- /// <summary>
- /// Editor script for the SimpleLit material inspector.
- /// </summary>
- public static class SimpleLitGUI
- {
- /// <summary>
- /// Options for specular source.
- /// </summary>
- public enum SpecularSource
- {
- /// <summary>
- /// Use this to use specular texture and color.
- /// </summary>
- SpecularTextureAndColor,
-
- /// <summary>
- /// Use this when not using specular.
- /// </summary>
- NoSpecular
- }
-
- /// <summary>
- /// Options to select the texture channel where the smoothness value is stored.
- /// </summary>
- public enum SmoothnessMapChannel
- {
- /// <summary>
- /// Use this when smoothness is stored in the alpha channel of the Specular Map.
- /// </summary>
- SpecularAlpha,
-
- /// <summary>
- /// Use this when smoothness is stored in the alpha channel of the Albedo Map.
- /// </summary>
- AlbedoAlpha,
- }
-
- /// <summary>
- /// Container for the text and tooltips used to display the shader.
- /// </summary>
- public static class Styles
- {
- /// <summary>
- /// The text and tooltip for the specular map GUI.
- /// </summary>
- public static GUIContent specularMapText =
- EditorGUIUtility.TrTextContent("Specular Map", "Designates a Specular Map and specular color determining the apperance of reflections on this Material's surface.");
- }
-
- /// <summary>
- /// Container for the properties used in the <c>SimpleLitGUI</c> editor script.
- /// </summary>
- public struct SimpleLitProperties
- {
- // Surface Input Props
-
- /// <summary>
- /// The MaterialProperty for specular color.
- /// </summary>
- public MaterialProperty specColor;
-
- /// <summary>
- /// The MaterialProperty for specular smoothness map.
- /// </summary>
- public MaterialProperty specGlossMap;
-
- /// <summary>
- /// The MaterialProperty for specular highlights.
- /// </summary>
- public MaterialProperty specHighlights;
-
- /// <summary>
- /// The MaterialProperty for smoothness alpha channel.
- /// </summary>
- public MaterialProperty smoothnessMapChannel;
-
- /// <summary>
- /// The MaterialProperty for smoothness value.
- /// </summary>
- public MaterialProperty smoothness;
-
- /// <summary>
- /// The MaterialProperty for normal map.
- /// </summary>
- public MaterialProperty bumpMapProp;
-
- /// <summary>
- /// Constructor for the <c>SimpleLitProperties</c> container struct.
- /// </summary>
- /// <param name="properties"></param>
- public SimpleLitProperties(MaterialProperty[] properties)
- {
- // Surface Input Props
- specColor = BaseShaderGUI.FindProperty("_SpecColor", properties);
- specGlossMap = BaseShaderGUI.FindProperty("_SpecGlossMap", properties, false);
- specHighlights = BaseShaderGUI.FindProperty("_SpecularHighlights", properties, false);
- smoothnessMapChannel = BaseShaderGUI.FindProperty("_SmoothnessSource", properties, false);
- smoothness = BaseShaderGUI.FindProperty("_Smoothness", properties, false);
- bumpMapProp = BaseShaderGUI.FindProperty("_BumpMap", properties, false);
- }
- }
-
- /// <summary>
- /// Draws the surface inputs GUI.
- /// </summary>
- /// <param name="properties"></param>
- /// <param name="materialEditor"></param>
- /// <param name="material">The material to use.</param>
- public static void Inputs(SimpleLitProperties properties, MaterialEditor materialEditor, Material material)
- {
- DoSpecularArea(properties, materialEditor, material);
- BaseShaderGUI.DrawNormalArea(materialEditor, properties.bumpMapProp);
- }
-
- /// <summary>
- /// Draws the advanced GUI.
- /// </summary>
- /// <param name="properties"></param>
- public static void Advanced(SimpleLitProperties properties)
- {
- SpecularSource specularSource = (SpecularSource)properties.specHighlights.floatValue;
- EditorGUI.BeginChangeCheck();
- EditorGUI.showMixedValue = properties.specHighlights.hasMixedValue;
- bool enabled = EditorGUILayout.Toggle(LitGUI.Styles.highlightsText, specularSource == SpecularSource.SpecularTextureAndColor);
- if (EditorGUI.EndChangeCheck())
- properties.specHighlights.floatValue = enabled ? (float)SpecularSource.SpecularTextureAndColor : (float)SpecularSource.NoSpecular;
- EditorGUI.showMixedValue = false;
- }
-
- /// <summary>
- /// Draws the specular area GUI.
- /// </summary>
- /// <param name="properties"></param>
- /// <param name="materialEditor"></param>
- /// <param name="material">The material to use.</param>
- public static void DoSpecularArea(SimpleLitProperties properties, MaterialEditor materialEditor, Material material)
- {
- SpecularSource specSource = (SpecularSource)properties.specHighlights.floatValue;
- EditorGUI.BeginDisabledGroup(specSource == SpecularSource.NoSpecular);
- BaseShaderGUI.TextureColorProps(materialEditor, Styles.specularMapText, properties.specGlossMap, properties.specColor, true);
- LitGUI.DoSmoothness(materialEditor, material, properties.smoothness, properties.smoothnessMapChannel, LitGUI.Styles.specularSmoothnessChannelNames);
- EditorGUI.EndDisabledGroup();
- }
-
- /// <summary>
- /// Sets up the keywords for the material and shader.
- /// </summary>
- /// <param name="material">The material to use.</param>
- public static void SetMaterialKeywords(Material material)
- {
- UpdateMaterialSpecularSource(material);
- }
-
- private static void UpdateMaterialSpecularSource(Material material)
- {
- var opaque = ((BaseShaderGUI.SurfaceType)material.GetFloat("_Surface") ==
- BaseShaderGUI.SurfaceType.Opaque);
- SpecularSource specSource = (SpecularSource)material.GetFloat("_SpecularHighlights");
- if (specSource == SpecularSource.NoSpecular)
- {
- CoreUtils.SetKeyword(material, "_SPECGLOSSMAP", false);
- CoreUtils.SetKeyword(material, "_SPECULAR_COLOR", false);
- CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", false);
- }
- else
- {
- var smoothnessSource = (SmoothnessMapChannel)material.GetFloat("_SmoothnessSource");
- bool hasMap = material.GetTexture("_SpecGlossMap");
- CoreUtils.SetKeyword(material, "_SPECGLOSSMAP", hasMap);
- CoreUtils.SetKeyword(material, "_SPECULAR_COLOR", !hasMap);
- if (opaque)
- CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", smoothnessSource == SmoothnessMapChannel.AlbedoAlpha);
- else
- CoreUtils.SetKeyword(material, "_GLOSSINESS_FROM_BASE_ALPHA", false);
-
- string color;
- if (smoothnessSource != SmoothnessMapChannel.AlbedoAlpha || !opaque)
- color = "_SpecColor";
- else
- color = "_BaseColor";
-
- var col = material.GetColor(color);
- float smoothness = material.GetFloat("_Smoothness");
- if (smoothness != col.a)
- {
- col.a = smoothness;
- material.SetColor(color, col);
- }
- }
- }
- }
- }
|