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 static ShadingMode GetShadingMode() { return (ShadingMode)Properties.shadingMode.floatValue; } public static PBRMode GetPBRMode() { return (PBRMode)Properties.pbrMode.floatValue; } public static bool HasFeature(SurfaceFeatureFlags feature) { return ((SurfaceFeatureFlags)Properties.surfaceFeatures.floatValue & feature) != 0; } 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.floatValue == 1.0f) { EditorGUI.indentLevel++; editor.ShaderProperty(Properties.alphaClip, Styles.alphaClipText); EditorGUI.indentLevel--; } editor.ShaderProperty(Properties.cullMode, Styles.cullingModeText); editor.ShaderProperty(Properties.shadingMode, Styles.shadingModeText); editor.ShaderProperty(Properties.materialType, Styles.materialTypeText); editor.ShaderProperty(Properties.pbrMode, Styles.pbrModeText); EditorGUI.BeginChangeCheck(); editor.ShaderProperty(Properties.hairBlendingTarget, Styles.hairBlendingTargetText); if (EditorGUI.EndChangeCheck()) { foreach (var material in editor.GetMaterials()) { material.SetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME, Properties.hairBlendingTarget.floatValue == 1.0f); } } var surfaceFeatures = (SurfaceFeatureFlags)Properties.surfaceFeatures.floatValue; EditorGUI.BeginChangeCheck(); surfaceFeatures = (SurfaceFeatureFlags)EditorGUILayout.EnumFlagsField(Styles.surfaceFeaturesText, surfaceFeatures); if (EditorGUI.EndChangeCheck()) { Properties.surfaceFeatures.floatValue = (float)surfaceFeatures; foreach (var material in editor.GetMaterials()) { material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, HasFeature(SurfaceFeatureFlags.Outline)); } } } } }