using Misaki.ShaderGUI; using System.Linq; using UnityEditor; using UnityEngine; using static Misaki.HdrpToon.UTSPropertyName.RimLight; namespace Misaki.HdrpToon.Editor { public class RimLightScope : MaterialUIScope { private static class Properties { public static MaterialProperty rimLightColor; public static MaterialProperty rimLightIntensity; public static MaterialProperty albedoAffectRimLight; public static MaterialProperty screenSpaceRimLight; public static MaterialProperty rimLightLevel; public static MaterialProperty rimLightClipping; public static MaterialProperty rimLightClippingLevel; public static MaterialProperty lightBaseRimLight; public static MaterialProperty lightDirectionRimLightLevel; } private static class Styles { public static readonly GUIContent rimLightColorText = new("Rim Light Color", "Specifies the color of rim light."); public static readonly GUIContent rimLightIntensityText = new("Rim Light Strength", "Specifies Rim Light strength."); public static readonly GUIContent albedoAffectRimLightText = new("Albedo Affect Rim Light", "Enable to let the albedo color affect the rim light color. The alpha channel of rim light color will be the blending weight."); public static readonly GUIContent screenSpaceRimLightText = new("Screen Space Rim Light", "Enable to make the rim light width constant in screen space."); public static readonly GUIContent rimLightLevelText = new("Rim Light Level", "Specifies Rim Light power intensity."); public static readonly GUIContent rimLightClippingText = new("Rim Light Clipping", "Enable to Clip the rim light at specific level"); public static readonly GUIContent rimLightClippingLevelText = new("Clipping Level", "The Clipping value of the rim light."); public static readonly GUIContent lightBaseRimLightText = new("Light Base Rim Light", "Enable to let rim light calculate per light."); public static readonly GUIContent lightDirectionRimLightLevelText = new("Light Direction Level", "Specifies intensity of Rim Light in the light source direction,"); } protected override ShaderGUIExpandable ExpandableBit => ShaderGUIExpandable.Rimlight; protected override GUIContent Header => EditorGUIUtility.TrTextContent("Rim Light Settings"); protected override bool ShowSection => materials.All(mat => mat.HasFeature(SurfaceFeature.RimLight)); public override void LoadMaterialProperties() { Properties.rimLightColor = FindProperty(RIM_LIGHT_COLOR); Properties.rimLightIntensity = FindProperty(RIM_LIGHT_INTENSITY); Properties.albedoAffectRimLight = FindProperty(ALBEDO_AFFECT_RIM_LIGHT); Properties.screenSpaceRimLight = FindProperty(SCREEN_SPACE_RIM_LIGHT); Properties.rimLightLevel = FindProperty(RIM_LIGHT_LEVEL); Properties.rimLightClipping = FindProperty(RIM_LIGHT_CLIPPING); Properties.rimLightClippingLevel = FindProperty(RIM_LIGHT_CLIPPING_LEVEL); Properties.lightBaseRimLight = FindProperty(LIGHT_BASE_RIM_LIGHT); Properties.lightDirectionRimLightLevel = FindProperty(LIGHT_DIRECTION_RIM_LIGHT_LEVEL); } protected override void DrawContent() { editor.ShaderProperty(Properties.rimLightColor, Styles.rimLightColorText); editor.ShaderProperty(Properties.rimLightIntensity, Styles.rimLightIntensityText); editor.ShaderProperty(Properties.albedoAffectRimLight, Styles.albedoAffectRimLightText); editor.ShaderProperty(Properties.screenSpaceRimLight, Styles.screenSpaceRimLightText); editor.ShaderProperty(Properties.rimLightLevel, Styles.rimLightLevelText); if (!Properties.screenSpaceRimLight.GetBooleanValue()) { editor.ShaderProperty(Properties.rimLightClipping, Styles.rimLightClippingText); if (Properties.rimLightClipping.GetBooleanValue()) { using var clippingLevelIndentLevelScope = new EditorGUI.IndentLevelScope(); editor.ShaderProperty(Properties.rimLightClippingLevel, Styles.rimLightClippingLevelText); } } EditorGUILayout.Space(); editor.ShaderProperty(Properties.lightBaseRimLight, Styles.lightBaseRimLightText); if (Properties.lightBaseRimLight.GetBooleanValue()) { editor.ShaderProperty(Properties.lightDirectionRimLightLevel, Styles.lightDirectionRimLightLevelText); } } } }