using Misaki.ShaderGUI; using UnityEditor; using UnityEngine; namespace Misaki.HdrpToon.Editor { internal class SurfaceOptionsScope : MaterialUIScope { private static class Properties { public static MaterialProperty transparentMode; public static MaterialProperty alphaClipEnable; public static MaterialProperty alphaClip; public static MaterialProperty cullMode; public static MaterialProperty shadingMode; public static MaterialProperty materialType; public static MaterialProperty pbrMode; public static MaterialProperty hairBlendingTarget; public static MaterialProperty surfaceFeatures; } private static class Styles { public static readonly GUIContent transparentModeText = new("Transparent Mode", "Enable different modes that allow the simulation of a variety of transparent objects."); public static readonly GUIContent alphaClipEnableText = new("Alpha Clipping", "Enable alpha clipping."); public static readonly GUIContent alphaClipText = new("Alpha Clipping Threshold", "Threshold for alpha clipping."); public static readonly GUIContent cullingModeText = new("Culling Mode", "Controls the sides of polygons that should not be drawn (culled)."); public static readonly GUIContent shadingModeText = new("Shading Color Mode", "Specifies the shading grade mode."); public static readonly GUIContent materialTypeText = new("Material Type", "Specifies the material type."); public static readonly GUIContent pbrModeText = new("PBR Mode", "Specifies PBR model mode."); public static readonly GUIContent hairBlendingTargetText = new("Hair Blending Target", "Enable to be blended with hair"); public static readonly GUIContent surfaceFeaturesText = new("Surface Features", "Specifies the surface features."); } protected override ShaderGUIExpandable ExpandableBit => ShaderGUIExpandable.SurfaceOptions; protected override GUIContent Header => EditorGUIUtility.TrTextContent("Surface Options"); public override void LoadMaterialProperties() { Properties.transparentMode = FindProperty("_TransparentEnabled"); Properties.alphaClipEnable = FindProperty("_AlphaCutoffEnable"); Properties.alphaClip = FindProperty("_AlphaCutoff"); Properties.cullMode = FindProperty("_CullMode"); Properties.shadingMode = FindProperty("_Shading_Mode"); Properties.materialType = FindProperty("_Material_Type"); Properties.pbrMode = FindProperty("_PBR_Mode"); Properties.hairBlendingTarget = FindProperty("_HairBlendingTarget"); Properties.surfaceFeatures = FindProperty("_SurfaceFeatures"); } protected override void DrawContent() { editor.ShaderProperty(Properties.transparentMode, Styles.transparentModeText); editor.ShaderProperty(Properties.alphaClipEnable, Styles.alphaClipEnableText); if (Properties.alphaClipEnable.GetBooleanValue()) { EditorGUI.indentLevel++; editor.ShaderProperty(Properties.alphaClip, Styles.alphaClipText); EditorGUI.indentLevel--; } editor.ShaderProperty(Properties.cullMode, Styles.cullingModeText); editor.ShaderProperty(Properties.shadingMode, Styles.shadingModeText); EditorGUI.BeginChangeCheck(); editor.ShaderProperty(Properties.materialType, Styles.materialTypeText); if (EditorGUI.EndChangeCheck()) { foreach (var material in materials) { material.SetShaderPassEnabled(UtsShaderPassName.HAIR_SHADOW_CASTER_PASS_NAME, Properties.materialType.GetEnumValue() == MaterialType.FrontHair); } } editor.ShaderProperty(Properties.pbrMode, Styles.pbrModeText); EditorGUI.BeginChangeCheck(); editor.ShaderProperty(Properties.hairBlendingTarget, Styles.hairBlendingTargetText); if (EditorGUI.EndChangeCheck()) { foreach (var material in materials) { material.SetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME, Properties.hairBlendingTarget.GetBooleanValue()); } } editor.ShaderProperty(Properties.surfaceFeatures, Styles.surfaceFeaturesText); } } }