200 lines
8.1 KiB
C#
200 lines
8.1 KiB
C#
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|