using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using static PotaToon.Editor.PotaToonShaderGUISearchHelper; namespace PotaToon.Editor { public class PotaToonShaderGUI : PotaToonShaderGUIBase { private static bool[] s_FoldoutMatcaps = new bool[8]; private static class GUIContents { public static readonly GUIContent matCapMode = new GUIContent("Mode"); public static readonly GUIContent matCapMap = new GUIContent("MatCap Map"); public static readonly GUIContent matCapMask = new GUIContent("MatCap Mask"); public static readonly GUIContent matCapUV = new GUIContent("UV"); public static readonly GUIContent matCapWeight = new GUIContent("Weight", "Controls the weight of the MatCap."); public static readonly GUIContent matCapLightingDimmer = new GUIContent("Lighting Dimmer", "Controls the lighting contribution to the MatCap if 'Add' mode. If this value is 0, the MatCap result will always be constant because it ignores lighting."); } public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) { if (!m_PrestIconInitialized) { m_PrestIconInitialized = true; InitializePresetsAndIcons(); } GUIStyle advancedSettingsStyle = new GUIStyle(EditorStyles.boldLabel) { alignment = TextAnchor.MiddleCenter, fontSize = 12 }; EditorGUIUtility.labelWidth = 0f; EditorGUIUtility.fieldWidth = 0f; MaterialProperty _SurfaceType = FindProperty("_SurfaceType", properties); MaterialProperty _Cull = FindProperty("_Cull", properties); MaterialProperty _Cutoff = FindProperty("_Cutoff", properties); MaterialProperty _Blend = FindProperty("_Blend", properties); MaterialProperty _SrcBlend = FindProperty("_SrcBlend", properties); MaterialProperty _DstBlend = FindProperty("_DstBlend", properties); MaterialProperty _SrcBlendAlpha = FindProperty("_SrcBlendAlpha", properties); MaterialProperty _DstBlendAlpha = FindProperty("_DstBlendAlpha", properties); MaterialProperty _ClippingMask = FindProperty("_ClippingMask", properties); MaterialProperty _MainTex = FindProperty("_MainTex", properties); MaterialProperty _ShadeMap = FindProperty("_ShadeMap", properties); MaterialProperty _ShadowBorderMask = FindProperty("_ShadowBorderMask", properties); MaterialProperty _BaseColor = FindProperty("_BaseColor", properties); MaterialProperty _ShadeColor = FindProperty("_ShadeColor", properties); MaterialProperty _BaseStep = FindProperty("_BaseStep", properties); MaterialProperty _StepSmoothness = FindProperty("_StepSmoothness", properties); MaterialProperty _ReceiveLightShadow = FindProperty("_ReceiveLightShadow", properties); MaterialProperty _UseVertexColor = FindProperty("_UseVertexColor", properties); MaterialProperty _UseMidTone = FindProperty("_UseMidTone", properties); MaterialProperty _MidColor = FindProperty("_MidColor", properties); MaterialProperty _MidWidth = FindProperty("_MidWidth", properties); MaterialProperty _UseDarknessMode = FindProperty("_UseDarknessMode", properties); MaterialProperty _IndirectDimmer = FindProperty("_IndirectDimmer", properties); MaterialProperty _NormalMap = FindProperty("_NormalMap", properties); MaterialProperty _BumpScale = FindProperty("_BumpScale", properties); MaterialProperty _UseNormalMap = FindProperty("_UseNormalMap", properties); MaterialProperty _SpecularColor = FindProperty("_SpecularColor", properties); MaterialProperty _SpecularMap = FindProperty("_SpecularMap", properties); MaterialProperty _SpecularMask = FindProperty("_SpecularMask", properties); MaterialProperty _SpecularPower = FindProperty("_SpecularPower", properties); MaterialProperty _SpecularSmoothness = FindProperty("_SpecularSmoothness", properties); MaterialProperty _RimColor = FindProperty("_RimColor", properties); MaterialProperty _RimMask = FindProperty("_RimMask", properties); MaterialProperty _RimPower = FindProperty("_RimPower", properties); MaterialProperty _RimSmoothness = FindProperty("_RimSmoothness", properties); MaterialProperty _ScreenRimTint = FindProperty("_ScreenRimTint", properties); MaterialProperty _ScreenRimTintMode = FindProperty("_ScreenRimTintMode", properties); MaterialProperty _ScreenRimWidthMultiplier = FindProperty("_ScreenRimWidthMultiplier", properties); MaterialProperty _ScreenRimShadowFade = FindProperty("_ScreenRimShadowFade", properties); MaterialProperty _EmissionColor = FindProperty("_EmissionColor", properties); MaterialProperty _EmissionMap = FindProperty("_EmissionMap", properties); MaterialProperty _EmissionMask = FindProperty("_EmissionMask", properties); MaterialProperty _UseGlitter = FindProperty("_UseGlitter", properties); MaterialProperty _GlitterMainStrength = FindProperty("_GlitterMainStrength", properties); MaterialProperty _GlitterEnableLighting = FindProperty("_GlitterEnableLighting", properties); MaterialProperty _GlitterBackfaceMask = FindProperty("_GlitterBackfaceMask", properties); MaterialProperty _GlitterApplyTransparency = FindProperty("_GlitterApplyTransparency", properties); MaterialProperty _GlitterShadowMask = FindProperty("_GlitterShadowMask", properties); MaterialProperty _GlitterParticleSize = FindProperty("_GlitterParticleSize", properties); MaterialProperty _GlitterScaleRandomize = FindProperty("_GlitterScaleRandomize", properties); MaterialProperty _GlitterContrast = FindProperty("_GlitterContrast", properties); MaterialProperty _GlitterSensitivity = FindProperty("_GlitterSensitivity", properties); MaterialProperty _GlitterBlinkSpeed = FindProperty("_GlitterBlinkSpeed", properties); MaterialProperty _GlitterAngleLimit = FindProperty("_GlitterAngleLimit", properties); MaterialProperty _GlitterLightDirection = FindProperty("_GlitterLightDirection", properties); MaterialProperty _GlitterColorRandomness = FindProperty("_GlitterColorRandomness", properties); MaterialProperty _GlitterNormalStrength = FindProperty("_GlitterNormalStrength", properties); MaterialProperty _GlitterPostContrast = FindProperty("_GlitterPostContrast", properties); MaterialProperty _GlitterColor = FindProperty("_GlitterColor", properties); MaterialProperty _GlitterColorTex = FindProperty("_GlitterColorTex", properties); MaterialProperty _BlendOutlineMainTex = FindProperty("_BlendOutlineMainTex", properties); MaterialProperty _OutlineMode = FindProperty("_OutlineMode", properties); MaterialProperty _UseOutlineNormalMap = FindProperty("_UseOutlineNormalMap", properties); MaterialProperty _OutlineNormalMap = FindProperty("_OutlineNormalMap", properties); MaterialProperty _OutlineColor = FindProperty("_OutlineColor", properties); MaterialProperty _OutlineWidthMask = FindProperty("_OutlineWidthMask", properties); MaterialProperty _OutlineWidth = FindProperty("_OutlineWidth", properties); MaterialProperty _OutlineOffsetZ = FindProperty("_OutlineOffsetZ", properties); MaterialProperty _OutlineLightingDimmer = FindProperty("_OutlineLightingDimmer", properties); MaterialProperty _RefractionWeight = FindProperty("_RefractionWeight", properties); MaterialProperty _RefractionBlurStep = FindProperty("_RefractionBlurStep", properties); MaterialProperty _DisableCharShadow = FindProperty("_DisableCharShadow", properties); MaterialProperty _CharShadowType = FindProperty("_CharShadowType", properties); MaterialProperty _DepthBias = FindProperty("_DepthBias", properties); MaterialProperty _NormalBias = FindProperty("_NormalBias", properties); MaterialProperty _CharShadowSmoothnessOffset = FindProperty("_CharShadowSmoothnessOffset", properties); MaterialProperty _2DFaceShadowWidth = FindProperty("_2DFaceShadowWidth", properties); MaterialProperty _UseFaceSDFShadow = FindProperty("_UseFaceSDFShadow", properties); MaterialProperty _FaceSDFTex = FindProperty("_FaceSDFTex", properties); MaterialProperty _SDFReverse = FindProperty("_SDFReverse", properties); MaterialProperty _SDFOffset = FindProperty("_SDFOffset", properties); MaterialProperty _SDFBlur = FindProperty("_SDFBlur", properties); MaterialProperty _DebugFaceSDF = FindProperty("_DebugFaceSDF", properties); MaterialProperty _UseHairHighLight = FindProperty("_UseHairHighLight", properties); MaterialProperty _HairHighLightTex = FindProperty("_HairHighLightTex", properties); MaterialProperty _ReverseHairHighLightTex = FindProperty("_ReverseHairHighLightTex", properties); MaterialProperty _HairHiStrength = FindProperty("_HairHiStrength", properties); MaterialProperty _HairHiUVOffset = FindProperty("_HairHiUVOffset", properties); // Stencil MaterialProperty _StencilComp = FindProperty("_StencilComp", properties); MaterialProperty _StencilRef = FindProperty("_StencilRef", properties); MaterialProperty _StencilPass = FindProperty("_StencilPass", properties); MaterialProperty _StencilFail = FindProperty("_StencilFail", properties); MaterialProperty _StencilZFail = FindProperty("_StencilZFail", properties); // UV Channels MaterialProperty _BaseMapUV = FindProperty("_BaseMapUV", properties); MaterialProperty _NormalMapUV = FindProperty("_NormalMapUV", properties); MaterialProperty _ClippingMaskUV = FindProperty("_ClippingMaskUV", properties); MaterialProperty _FaceSDFUV = FindProperty("_FaceSDFUV", properties); MaterialProperty _SpecularMapUV = FindProperty("_SpecularMapUV", properties); MaterialProperty _RimMaskUV = FindProperty("_RimMaskUV", properties); MaterialProperty _HairHiMapUV = FindProperty("_HairHiMapUV", properties); MaterialProperty _GlitterMapUV = FindProperty("_GlitterMapUV", properties); MaterialProperty _EmissionMapUV = FindProperty("_EmissionMapUV", properties); MaterialProperty _OutlineMaskUV = FindProperty("_OutlineMaskUV", properties); // MatCaps MaterialProperty _MatCapMode = FindProperty("_MatCapMode", properties); MaterialProperty _MatCapColor = FindProperty("_MatCapColor", properties); MaterialProperty _MatCapTex = FindProperty("_MatCapTex", properties); MaterialProperty _MatCapMask = FindProperty("_MatCapMask", properties); MaterialProperty _MatCapWeight = FindProperty("_MatCapWeight", properties); MaterialProperty _MatCapLightingDimmer = FindProperty("_MatCapLightingDimmer", properties); MaterialProperty _MatCapMode2 = FindProperty("_MatCapMode2", properties); MaterialProperty _MatCapColor2 = FindProperty("_MatCapColor2", properties); MaterialProperty _MatCapTex2 = FindProperty("_MatCapTex2", properties); MaterialProperty _MatCapMask2 = FindProperty("_MatCapMask2", properties); MaterialProperty _MatCapWeight2 = FindProperty("_MatCapWeight2", properties); MaterialProperty _MatCapLightingDimmer2 = FindProperty("_MatCapLightingDimmer2", properties); MaterialProperty _MatCapMode3 = FindProperty("_MatCapMode3", properties); MaterialProperty _MatCapColor3 = FindProperty("_MatCapColor3", properties); MaterialProperty _MatCapTex3 = FindProperty("_MatCapTex3", properties); MaterialProperty _MatCapMask3 = FindProperty("_MatCapMask3", properties); MaterialProperty _MatCapWeight3 = FindProperty("_MatCapWeight3", properties); MaterialProperty _MatCapLightingDimmer3 = FindProperty("_MatCapLightingDimmer3", properties); MaterialProperty _MatCapMode4 = FindProperty("_MatCapMode4", properties); MaterialProperty _MatCapColor4 = FindProperty("_MatCapColor4", properties); MaterialProperty _MatCapTex4 = FindProperty("_MatCapTex4", properties); MaterialProperty _MatCapMask4 = FindProperty("_MatCapMask4", properties); MaterialProperty _MatCapWeight4 = FindProperty("_MatCapWeight4", properties); MaterialProperty _MatCapLightingDimmer4 = FindProperty("_MatCapLightingDimmer4", properties); MaterialProperty _MatCapMode5 = FindProperty("_MatCapMode5", properties); MaterialProperty _MatCapColor5 = FindProperty("_MatCapColor5", properties); MaterialProperty _MatCapTex5 = FindProperty("_MatCapTex5", properties); MaterialProperty _MatCapMask5 = FindProperty("_MatCapMask5", properties); MaterialProperty _MatCapWeight5 = FindProperty("_MatCapWeight5", properties); MaterialProperty _MatCapLightingDimmer5 = FindProperty("_MatCapLightingDimmer5", properties); MaterialProperty _MatCapMode6 = FindProperty("_MatCapMode6", properties); MaterialProperty _MatCapColor6 = FindProperty("_MatCapColor6", properties); MaterialProperty _MatCapTex6 = FindProperty("_MatCapTex6", properties); MaterialProperty _MatCapMask6 = FindProperty("_MatCapMask6", properties); MaterialProperty _MatCapWeight6 = FindProperty("_MatCapWeight6", properties); MaterialProperty _MatCapLightingDimmer6 = FindProperty("_MatCapLightingDimmer6", properties); MaterialProperty _MatCapMode7 = FindProperty("_MatCapMode7", properties); MaterialProperty _MatCapColor7 = FindProperty("_MatCapColor7", properties); MaterialProperty _MatCapTex7 = FindProperty("_MatCapTex7", properties); MaterialProperty _MatCapMask7 = FindProperty("_MatCapMask7", properties); MaterialProperty _MatCapWeight7 = FindProperty("_MatCapWeight7", properties); MaterialProperty _MatCapLightingDimmer7 = FindProperty("_MatCapLightingDimmer7", properties); MaterialProperty _MatCapMode8 = FindProperty("_MatCapMode8", properties); MaterialProperty _MatCapColor8 = FindProperty("_MatCapColor8", properties); MaterialProperty _MatCapTex8 = FindProperty("_MatCapTex8", properties); MaterialProperty _MatCapMask8 = FindProperty("_MatCapMask8", properties); MaterialProperty _MatCapWeight8 = FindProperty("_MatCapWeight8", properties); MaterialProperty _MatCapLightingDimmer8 = FindProperty("_MatCapLightingDimmer8", properties); MaterialProperty _MatCapUV1 = FindProperty("_MatCapUV1", properties); MaterialProperty _MatCapUV2 = FindProperty("_MatCapUV2", properties); MaterialProperty _MatCapUV3 = FindProperty("_MatCapUV3", properties); MaterialProperty _MatCapUV4 = FindProperty("_MatCapUV4", properties); MaterialProperty _MatCapUV5 = FindProperty("_MatCapUV5", properties); MaterialProperty _MatCapUV6 = FindProperty("_MatCapUV6", properties); MaterialProperty _MatCapUV7 = FindProperty("_MatCapUV7", properties); MaterialProperty _MatCapUV8 = FindProperty("_MatCapUV8", properties); MaterialProperty _ClippingMaskCH = FindProperty("_ClippingMaskCH", properties); MaterialProperty _SpecularMaskCH = FindProperty("_SpecularMaskCH", properties); MaterialProperty _RimMaskCH = FindProperty("_RimMaskCH", properties); MaterialProperty _EmissionMaskCH = FindProperty("_EmissionMaskCH", properties); MaterialProperty _OutlineMaskCH = FindProperty("_OutlineMaskCH", properties); MaterialProperty _MatCapMaskCH1 = FindProperty("_MatCapMaskCH1", properties); MaterialProperty _MatCapMaskCH2 = FindProperty("_MatCapMaskCH2", properties); MaterialProperty _MatCapMaskCH3 = FindProperty("_MatCapMaskCH3", properties); MaterialProperty _MatCapMaskCH4 = FindProperty("_MatCapMaskCH4", properties); MaterialProperty _MatCapMaskCH5 = FindProperty("_MatCapMaskCH5", properties); MaterialProperty _MatCapMaskCH6 = FindProperty("_MatCapMaskCH6", properties); MaterialProperty _MatCapMaskCH7 = FindProperty("_MatCapMaskCH7", properties); MaterialProperty _MatCapMaskCH8 = FindProperty("_MatCapMaskCH8", properties); MaterialProperty _AOMapCH = FindProperty("_AOMapCH", properties); MaterialProperty _FaceSDFTexCH = FindProperty("_FaceSDFTexCH", properties); Material material = materialEditor.target as Material; var materials = System.Array.ConvertAll(materialEditor.targets, t => t as Material); if (materials == null || materials.Length == 0) return; // Title DrawTitle(m_ShaderType, false, material, materials); // Toon type selection m_ShaderType = material.GetInt("_ToonType"); EditorGUI.BeginChangeCheck(); EditorGUILayout.BeginHorizontal(); m_ShaderType = GUILayout.Toolbar(m_ShaderType, GetToonTypeContents(), GUILayout.Width(EditorGUIUtility.currentViewWidth - 80f), GUILayout.Height(20f)); if (GUILayout.Button(EditorGUIUtility.IconContent("_Help"), GUILayout.Width(25f))) { s_ShowMaininfo = !s_ShowMaininfo; } EditorGUILayout.EndHorizontal(); if (EditorGUI.EndChangeCheck()) { bool changedAny = false; foreach (var mat in materials) { if (mat == null) continue; Undo.RecordObject(mat, "Change Shader"); changedAny |= PotaToonGUIUtility.ChangeShader(mat, m_ShaderType, m_RenderQueue); EditorUtility.SetDirty(mat); } if (changedAny) return; } DrawPresetField(material, materials); if (s_ShowMaininfo) { DrawInfoBox("1. General: The default type, used for most parts of the character such as the body, clothing, and hair.\n2. Face: Recommended for facial surfaces and eyeballs.\n3. Eye: Designed specifically for pupil-only meshes. If the eyeball and pupil are not separated into different submeshes or materials, use the Face type instead."); PotaToonGUIUtility.DrawOpenDocsButton("https://potatoon.dev/features/material-settings"); } var surfaceType = material.GetInt("_SurfaceType"); // Base Settings PropertyGroup("Global Settings", (Property, shouldRender) => { Property("Cull Mode", (s) => materialEditor.ShaderProperty(_Cull, new GUIContent(s))); Property("Surface Type", (s) => materialEditor.ShaderProperty(_SurfaceType, new GUIContent(s))); if (surfaceType >= (int)SurfaceType.Refraction) Property("Blending Mode", (s) => materialEditor.ShaderProperty(_Blend, new GUIContent(s))); if (material.GetInt(PotaToonShaderGUI.Property.BlendMode) == (int)AlphaMode.Custom) { EditorGUI.indentLevel++; Property("Src Color", (s) => materialEditor.ShaderProperty(_SrcBlend, new GUIContent(s))); Property("Dst Color", (s) => materialEditor.ShaderProperty(_DstBlend, new GUIContent(s))); Property("Src Alpha", (s) => materialEditor.ShaderProperty(_SrcBlendAlpha, new GUIContent(s))); Property("Dst Alpha", (s) => materialEditor.ShaderProperty(_DstBlendAlpha, new GUIContent(s))); EditorGUI.indentLevel--; } SetBlendingMode(materials); if (shouldRender) EditorGUI.BeginDisabledGroup(surfaceType != (int)SurfaceType.Cutout); Property("Cut Off", (s) => materialEditor.RangeProperty(_Cutoff, s)); if (shouldRender) EditorGUI.EndDisabledGroup(); // Snapshot values to detect changes var prevAuto = material.GetInt("_AutoRenderQueue") > 0; var prevRQ = material.renderQueue; var prevSurface = surfaceType; m_AutoRenderQueue = prevAuto; Property("Auto Render Queue", (s) => { m_AutoRenderQueue = EditorGUILayout.Toggle(s, m_AutoRenderQueue); }); if (shouldRender) { EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(m_AutoRenderQueue); } m_RenderQueue = material.renderQueue; Property("Render Queue", (s) => { m_RenderQueue = EditorGUILayout.IntField(s, m_RenderQueue); }); if (shouldRender) { EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; } // Compute changes and apply only when modified var newSurface = material.GetInt("_SurfaceType"); bool autoChanged = m_AutoRenderQueue != prevAuto; bool rqChanged = !m_AutoRenderQueue && (m_RenderQueue != prevRQ); bool surfaceChanged = newSurface != prevSurface; if (surfaceChanged || autoChanged || rqChanged) { SetRenderQueueAndKeywords(materials, rqChanged, m_AutoRenderQueue, m_RenderQueue); } }); PropertyGroupBox("Main Settings", (Property) => { Property("Main Tex", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _MainTex, _BaseColor, _BaseMapUV)); Property("Shade Tex", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _ShadeMap, _ShadeColor)); Property("AO Map", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _ShadowBorderMask, _AOMapCH)); Property("Clipping Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _ClippingMask, _ClippingMaskUV, _ClippingMaskCH)); Property("Base Step", (s) => materialEditor.RangeProperty(_BaseStep, s)); Property("Step Smoothness", (s) => materialEditor.RangeProperty(_StepSmoothness, s)); Property("Receive Light Shadow", (s) => materialEditor.ShaderProperty(_ReceiveLightShadow, new GUIContent(s, "If enabled, the material receives the default light shadow from the brightest light in the scene(MainLight or SpotLight). This does not affect the other shadows(base step + self character shadow)."))); Property("$_MainSettings_HSlider", (s) => EditorGUILayout.LabelField("", GUI.skin.horizontalSlider)); Property("MidTone", (s) => materialEditor.ShaderProperty(_UseMidTone, new GUIContent(s, "MidTone is computed by main directional light. (Disappears if lit by additional lights.)"))); EditorGUI.BeginDisabledGroup(material.GetInt("_UseMidTone") == 0); EditorGUI.indentLevel++; Property("MidTone Color", (s) => materialEditor.ColorProperty(_MidColor, s)); Property("MidTone Thickness", (s) => materialEditor.RangeProperty(_MidWidth, s)); EditorGUI.indentLevel--; EditorGUI.EndDisabledGroup(); Property("Indirect Dimmer", (s) => materialEditor.ShaderProperty(_IndirectDimmer, new GUIContent(s, "Controls the intensity of indirect lighting. (LightMap, Light Probe, Adaptive Probe Volume, Reflection Probe, Skybox)"))); Property("Vertex Color", (s) => materialEditor.ShaderProperty(_UseVertexColor, new GUIContent(s, "If enabled, the vertex color will be used for both base/shade colors."))); Property("Backlight Mode", (s) => materialEditor.ShaderProperty(_UseDarknessMode, new GUIContent(s, "If enabled, force to make shade color black."))); }); foreach (var mat in materials) { if (mat == null) continue; mat.SetInt("_UseShadeMap", mat.GetTexture("_ShadeMap") != null ? 1 : 0); } PropertyGroupBox("Normal Map", (Property) => { Property("Use Normal Map", (s) => materialEditor.ShaderProperty(_UseNormalMap, new GUIContent(s))); EditorGUI.BeginDisabledGroup(material.GetInt("_UseNormalMap") == 0); Property("Normal Map", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _NormalMap, _NormalMapUV)); EditorGUI.indentLevel++; Property("Normal Map", (s) => materialEditor.TextureScaleOffsetProperty(_NormalMap)); EditorGUI.indentLevel--; Property("Bump Scale", (s) => materialEditor.RangeProperty(_BumpScale, s)); EditorGUI.EndDisabledGroup(); }); PropertyGroupBox("Rim Light", (Property) => { Property("Fresnel Rim", (s) => EditorGUILayout.LabelField(s, new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter, fontStyle = FontStyle.Bold, fontSize = 13 })); Property("Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _RimMask, _RimMaskUV, _RimMaskCH)); Property("Color", (s) => materialEditor.ColorProperty(_RimColor, s)); Property("Power", (s) => materialEditor.RangeProperty(_RimPower, s)); Property("Smoothness", (s) => materialEditor.RangeProperty(_RimSmoothness, s)); Property("$_RimLightSettings_HSlider", (s) => EditorGUILayout.LabelField("", GUI.skin.horizontalSlider)); Property("Screen Rim", (s) => EditorGUILayout.LabelField(s, new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter, fontStyle = FontStyle.Bold, fontSize = 13 })); Property("$_RimLightSettings_Space", (s) => EditorGUILayout.Space(5)); Property("Tint", (s) => materialEditor.ColorProperty(_ScreenRimTint, s)); EditorGUI.indentLevel++; Property("Tint Mode", (s) => materialEditor.ShaderProperty(_ScreenRimTintMode, new GUIContent(s, "Determines whether to multiply by or override the Screen Rim Color from the Volume settings."))); EditorGUI.indentLevel--; Property("Width Multiplier", (s) => materialEditor.RangeProperty(_ScreenRimWidthMultiplier, s)); Property("Shadow Fade", (s) => materialEditor.ShaderProperty(_ScreenRimShadowFade, new GUIContent(s, "If enabled, the screen rim is attenuated by a shadow."))); }); PropertyGroupBox("MatCap", (Property) => { Property("MatCap 1", (s) => CustomFoldout(ref s_FoldoutMatcaps[0], "MatCap 1", () => { materialEditor.ShaderProperty(_MatCapMode, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV1, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex, _MatCapColor); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask, _MatCapMaskCH1); })); Property("MatCap 2", (s) => CustomFoldout(ref s_FoldoutMatcaps[1], "MatCap 2", () => { materialEditor.ShaderProperty(_MatCapMode2, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV2, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight2, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer2, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex2, _MatCapColor2); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask2, _MatCapMaskCH2); })); Property("MatCap 3", (s) => CustomFoldout(ref s_FoldoutMatcaps[2], "MatCap 3", () => { materialEditor.ShaderProperty(_MatCapMode3, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV3, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight3, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer3, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex3, _MatCapColor3); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask3, _MatCapMaskCH3); })); Property("MatCap 4", (s) => CustomFoldout(ref s_FoldoutMatcaps[3], "MatCap 4", () => { materialEditor.ShaderProperty(_MatCapMode4, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV4, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight4, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer4, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex4, _MatCapColor4); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask4, _MatCapMaskCH4); })); Property("MatCap 5", (s) => CustomFoldout(ref s_FoldoutMatcaps[4], "MatCap 5", () => { materialEditor.ShaderProperty(_MatCapMode5, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV5, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight5, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer5, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex5, _MatCapColor5); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask5, _MatCapMaskCH5); })); Property("MatCap 6", (s) => CustomFoldout(ref s_FoldoutMatcaps[5], "MatCap 6", () => { materialEditor.ShaderProperty(_MatCapMode6, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV6, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight6, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer6, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex6, _MatCapColor6); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask6, _MatCapMaskCH6); })); Property("MatCap 7", (s) => CustomFoldout(ref s_FoldoutMatcaps[6], "MatCap 7", () => { materialEditor.ShaderProperty(_MatCapMode7, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV7, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight7, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer7, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex7, _MatCapColor7); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask7, _MatCapMaskCH7); })); Property("MatCap 8", (s) => CustomFoldout(ref s_FoldoutMatcaps[7], "MatCap 8", () => { materialEditor.ShaderProperty(_MatCapMode8, GUIContents.matCapMode); materialEditor.ShaderProperty(_MatCapUV8, GUIContents.matCapUV); materialEditor.ShaderProperty(_MatCapWeight8, GUIContents.matCapWeight); EditorGUI.BeginDisabledGroup(material.GetInt("_MatCapMode") != 1); materialEditor.ShaderProperty(_MatCapLightingDimmer8, GUIContents.matCapLightingDimmer); EditorGUI.EndDisabledGroup(); materialEditor.TexturePropertySingleLine(GUIContents.matCapMap, _MatCapTex8, _MatCapColor8); materialEditor.TexturePropertySingleLine(GUIContents.matCapMask, _MatCapMask8, _MatCapMaskCH8); })); }); PropertyGroupBox("Outline", (Property, shouldRender) => { if (shouldRender) DrawInfoBox("Note that the outline is not rendered for the Refraction/Transparent type unless OIT is enabled."); Property("Mode", (s) => materialEditor.ShaderProperty(_OutlineMode, new GUIContent(s, "Select how the outline is calculated by normal or by object position."))); if (shouldRender) { var outlineMode = material.GetInt("_OutlineMode"); EditorGUI.BeginDisabledGroup(outlineMode > 0); EditorGUI.indentLevel++; } Property("Use Normal Map", (s) => materialEditor.ShaderProperty(_UseOutlineNormalMap, new GUIContent(s))); Property("Normal Map", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s, "Normal Map for Outline"), _OutlineNormalMap)); if (shouldRender) { EditorGUI.indentLevel--; EditorGUI.EndDisabledGroup(); } Property("Width Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _OutlineWidthMask, _OutlineMaskUV, _OutlineMaskCH)); Property("Blend Main Tex", (s) => materialEditor.ShaderProperty(_BlendOutlineMainTex, new GUIContent(s))); Property("Outline Color", (s) => materialEditor.ColorProperty(_OutlineColor, s)); Property("Outline Width", (s) => materialEditor.RangeProperty(_OutlineWidth, s)); Property("Depth Offset", (s) => materialEditor.FloatProperty(_OutlineOffsetZ, s)); Property("Lighting Dimmer", (s) => materialEditor.RangeProperty(_OutlineLightingDimmer, s)); }); // Refraction if (surfaceType == (int)SurfaceType.Refraction) { PropertyGroupBox("Refraction", (Property) => { Property("Refraction Weight", (s) => materialEditor.RangeProperty(_RefractionWeight, s)); Property("Blur Step", (s) => materialEditor.RangeProperty(_RefractionBlurStep, s)); }); } // Advanced Settings var originalAdvancedSettingsUnlocked = PotaToonGUIUtility.advancedSettingsUnlocked; if (IsAdvancedSettingsMatched()) { EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); EditorGUILayout.LabelField("Advanced Settings", advancedSettingsStyle); PotaToonGUIUtility.DrawAdvancedSettingsButton(); EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); } EditorGUI.BeginDisabledGroup(!PotaToonGUIUtility.advancedSettingsUnlocked); // Character Shadow PropertyGroupBox("Character Shadow", (Property, shouldRender) => { Property("Disable Char Shadow", (s) => materialEditor.ShaderProperty(_DisableCharShadow, new GUIContent(s, "Toggles character self-shadowing. In some cases (e.g., bangs), disabling self-shadow can create a cleaner look."))); if (shouldRender) EditorGUI.BeginDisabledGroup(material.GetInt("_DisableCharShadow") == 1); Property("Shadow Type", (s) => materialEditor.ShaderProperty(_CharShadowType, new GUIContent(s, "We recommend using the 2D face shadow mode if face type material. However, if you prefer a more realistic shadow (i.e. physically correct), 3D shadow mode is also available."))); if (material.GetInt("_CharShadowType") == 0) { Property("Depth Bias", (s) => materialEditor.RangeProperty(_DepthBias, s)); Property("Normal Bias", (s) => materialEditor.RangeProperty(_NormalBias, s)); Property("Smoothness", (s) => materialEditor.RangeProperty(_CharShadowSmoothnessOffset, s)); } else { Property("2D Shadow Width", (s) => materialEditor.RangeProperty(_2DFaceShadowWidth, s)); } if (shouldRender) EditorGUI.EndDisabledGroup(); }); foreach (var mat in materials) { if (mat == null) continue; mat.SetKeyword(new LocalKeyword(mat.shader, "_USE_2D_FACE_SHADOW"), mat.GetInt("_CharShadowType") > 0); } // Face SDF PropertyGroupBox("Face SDF", (Property, shouldRender) => { Property("Use Face SDF", (s) => materialEditor.ShaderProperty(_UseFaceSDFShadow, new GUIContent(s))); if (shouldRender) { EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(material.GetInt("_UseFaceSDFShadow") == 0); } Property("Debug Face SDF", (s) => materialEditor.ShaderProperty(_DebugFaceSDF, new GUIContent(s))); Property("Reverse", (s) => materialEditor.ShaderProperty(_SDFReverse, new GUIContent(s))); Property("Face SDF Tex", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _FaceSDFTex, _FaceSDFUV, _FaceSDFTexCH)); EditorGUI.indentLevel++; Property("Face SDF Tex", (s) => materialEditor.TextureScaleOffsetProperty(_FaceSDFTex)); EditorGUI.indentLevel--; Property("Post Offset", (s) => materialEditor.RangeProperty(_SDFOffset, s)); Property("Blur Step", (s) => materialEditor.RangeProperty(_SDFBlur, s)); if (shouldRender) { EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; } }); foreach (var mat in materials) { if (mat == null) continue; mat.SetKeyword(new LocalKeyword(mat.shader, "_USE_FACE_SDF"), mat.GetInt("_UseFaceSDFShadow") > 0); } // Specular PropertyGroupBox("High Light", (Property, shouldRender) => { Property("HighLight Tex UV", (s) => materialEditor.ShaderProperty(_SpecularMapUV, new GUIContent(s))); Property("HighLight Map", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _SpecularMap, _SpecularColor)); Property("HighLight Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _SpecularMask, _SpecularMaskCH)); Property("Power", (s) => materialEditor.RangeProperty(_SpecularPower, s)); Property("Smoothness", (s) => materialEditor.RangeProperty(_SpecularSmoothness, s)); }); PropertyGroupBox("Emission", (Property) => { Property("Emission Tex UV", (s) => materialEditor.ShaderProperty(_EmissionMapUV, new GUIContent(s))); Property("Emission Map", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _EmissionMap, _EmissionColor)); Property("Emission Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _EmissionMask, _EmissionMaskCH)); }); PropertyGroupBox("Glitter", (Property, shouldRender) => { Property("Use Glitter", (s) => materialEditor.ShaderProperty(_UseGlitter, new GUIContent(s))); if (shouldRender) { EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(material.GetInt("_UseGlitter") == 0); } Property("Color / Mask", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _GlitterColorTex, _GlitterColor, _GlitterMapUV)); Property("Main Color Power", (s) => materialEditor.RangeProperty(_GlitterMainStrength, s)); Property("Enable Lighting", (s) => materialEditor.RangeProperty(_GlitterEnableLighting, s)); Property("Backface Mask", (s) => materialEditor.ShaderProperty(_GlitterBackfaceMask, new GUIContent(s))); Property("Apply Transparency", (s) => materialEditor.ShaderProperty(_GlitterApplyTransparency, new GUIContent(s))); Property("Shadow Mask", (s) => materialEditor.RangeProperty(_GlitterShadowMask, s)); Property("Particle Size", (s) => materialEditor.FloatProperty(_GlitterParticleSize, s)); Property("Scale Randomize", (s) => materialEditor.RangeProperty(_GlitterScaleRandomize, s)); Property("Contrast", (s) => materialEditor.FloatProperty(_GlitterContrast, s)); Property("Sensitivity", (s) => materialEditor.FloatProperty(_GlitterSensitivity, s)); Property("Blink Speed", (s) => materialEditor.FloatProperty(_GlitterBlinkSpeed, s)); Property("Angle Limit", (s) => materialEditor.FloatProperty(_GlitterAngleLimit, s)); Property("Light Direction Strength", (s) => materialEditor.FloatProperty(_GlitterLightDirection, s)); Property("Color Randomness", (s) => materialEditor.RangeProperty(_GlitterColorRandomness, s)); Property("Normal Strength", (s) => materialEditor.RangeProperty(_GlitterNormalStrength, s)); Property("Post Contrast", (s) => materialEditor.FloatProperty(_GlitterPostContrast, s)); if (shouldRender) { EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; } }); foreach (var mat in materials) { if (mat == null) continue; mat.SetKeyword(new LocalKeyword(mat.shader, "_USE_GLITTER"), mat.GetInt("_UseGlitter") > 0); } PropertyGroupBox("Hair High Light", (Property, shouldRender) => { Property("Use Hair High Light", (s) => materialEditor.ShaderProperty(_UseHairHighLight, new GUIContent(s))); if (shouldRender) { EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(material.GetInt("_UseHairHighLight") == 0); } Property("High Light Tex", (s) => materialEditor.TexturePropertySingleLine(new GUIContent(s), _HairHighLightTex, _HairHiMapUV)); Property("Reverse Tex", (s) => materialEditor.ShaderProperty(_ReverseHairHighLightTex, new GUIContent(s))); Property("Strength", (s) => materialEditor.RangeProperty(_HairHiStrength, s)); Property("UV Offset", (s) => materialEditor.RangeProperty(_HairHiUVOffset, s)); if (shouldRender) { EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; } }); PropertyGroupBox("Stencil", (Property) => { Property("Comp", (s) => materialEditor.ShaderProperty(_StencilComp, s)); Property("Ref", (s) => materialEditor.RangeProperty(_StencilRef, s)); Property("Pass", (s) => materialEditor.ShaderProperty(_StencilPass, s)); Property("Fail", (s) => materialEditor.ShaderProperty(_StencilFail, s)); Property("ZFail", (s) => materialEditor.ShaderProperty(_StencilZFail, s)); }); EditorGUI.EndDisabledGroup(); if (PotaToonGUIUtility.advancedSettingsUnlocked != originalAdvancedSettingsUnlocked) PotaToonGUIUtility.SaveAdvancedSettingUnlocked(); } } }