2025-04-25 21:14:54 +09:00

203 lines
9.2 KiB
C#

using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using System;
namespace CubedsUnityShaders
{
public class FlatLitToonInspector : ShaderGUI
{
public enum OutlineMode
{
None,
Tinted,
Colored
}
public enum BlendMode
{
Opaque,
Cutout,
Fade, // Old school alpha-blending mode, fresnel does not affect amount of transparency
Transparent // Physically plausible transparency mode, implemented as alpha pre-multiply
}
MaterialProperty blendMode;
MaterialProperty mainTexture;
MaterialProperty color;
MaterialProperty colorMask;
MaterialProperty shadow;
MaterialProperty outlineMode;
MaterialProperty outlineWidth;
MaterialProperty outlineColor;
MaterialProperty emissionMap;
MaterialProperty emissionColor;
MaterialProperty normalMap;
MaterialProperty alphaCutoff;
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
{
{ //Find Properties
blendMode = FindProperty("_Mode", props);
mainTexture = FindProperty("_MainTex", props);
color = FindProperty("_Color", props);
colorMask = FindProperty("_ColorMask", props);
shadow = FindProperty("_Shadow", props);
outlineMode = FindProperty("_OutlineMode", props);
outlineWidth = FindProperty("_outline_width", props);
outlineColor = FindProperty("_outline_color", props);
emissionMap = FindProperty("_EmissionMap", props);
emissionColor = FindProperty("_EmissionColor", props);
normalMap = FindProperty("_BumpMap", props);
alphaCutoff = FindProperty("_Cutoff", props);
}
Material material = materialEditor.target as Material;
{ //Shader Properties GUI
EditorGUIUtility.labelWidth = 0f;
EditorGUI.BeginChangeCheck();
{
EditorGUI.showMixedValue = blendMode.hasMixedValue;
var bMode = (BlendMode)blendMode.floatValue;
EditorGUI.BeginChangeCheck();
bMode = (BlendMode)EditorGUILayout.Popup("Rendering Mode", (int)bMode, Enum.GetNames(typeof(BlendMode)));
if (EditorGUI.EndChangeCheck())
{
materialEditor.RegisterPropertyChangeUndo("Rendering Mode");
blendMode.floatValue = (float)bMode;
foreach (var obj in blendMode.targets)
{
SetupMaterialWithBlendMode((Material)obj, (BlendMode)material.GetFloat("_Mode"));
}
}
EditorGUI.showMixedValue = false;
materialEditor.TexturePropertySingleLine(new GUIContent("Main Texture", "Main Color Texture (RGB)"), mainTexture, color);
EditorGUI.indentLevel += 2;
if ((BlendMode)material.GetFloat("_Mode") == BlendMode.Cutout)
materialEditor.ShaderProperty(alphaCutoff, "Alpha Cutoff", 2);
materialEditor.TexturePropertySingleLine(new GUIContent("Color Mask", "Masks Color Tinting (G)"), colorMask);
EditorGUI.indentLevel -= 2;
materialEditor.TexturePropertySingleLine(new GUIContent("Normal Map", "Normal Map (RGB)"), normalMap);
materialEditor.TexturePropertySingleLine(new GUIContent("Emission", "Emission (RGB)"), emissionMap, emissionColor);
EditorGUI.BeginChangeCheck();
materialEditor.TextureScaleOffsetProperty(mainTexture);
if (EditorGUI.EndChangeCheck())
emissionMap.textureScaleAndOffset = mainTexture.textureScaleAndOffset;
EditorGUILayout.Space();
materialEditor.ShaderProperty(shadow, "Shadow");
var oMode = (OutlineMode)outlineMode.floatValue;
EditorGUI.BeginChangeCheck();
oMode = (OutlineMode)EditorGUILayout.Popup("Outline Mode", (int)oMode, Enum.GetNames(typeof(OutlineMode)));
if (EditorGUI.EndChangeCheck())
{
materialEditor.RegisterPropertyChangeUndo("Outline Mode");
outlineMode.floatValue = (float)oMode;
foreach (var obj in outlineMode.targets)
{
SetupMaterialWithOutlineMode((Material)obj, (OutlineMode)material.GetFloat("_OutlineMode"));
}
}
switch (oMode)
{
case OutlineMode.Tinted:
case OutlineMode.Colored:
materialEditor.ShaderProperty(outlineColor, "Color", 2);
materialEditor.ShaderProperty(outlineWidth, new GUIContent("Width", "Outline Width in cm"), 2);
break;
case OutlineMode.None:
default:
break;
}
}
EditorGUI.EndChangeCheck();
}
}
public static void SetupMaterialWithBlendMode(Material material, BlendMode blendMode)
{
switch ((BlendMode)material.GetFloat("_Mode"))
{
case BlendMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
break;
case BlendMode.Cutout:
material.SetOverrideTag("RenderType", "TransparentCutout");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.EnableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
break;
case BlendMode.Fade:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
break;
case BlendMode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
break;
}
}
public static void SetupMaterialWithOutlineMode(Material material, OutlineMode outlineMode)
{
switch ((OutlineMode)material.GetFloat("_OutlineMode"))
{
case OutlineMode.None:
material.EnableKeyword("NO_OUTLINE");
material.DisableKeyword("TINTED_OUTLINE");
material.DisableKeyword("COLORED_OUTLINE");
break;
case OutlineMode.Tinted:
material.DisableKeyword("NO_OUTLINE");
material.EnableKeyword("TINTED_OUTLINE");
material.DisableKeyword("COLORED_OUTLINE");
break;
case OutlineMode.Colored:
material.DisableKeyword("NO_OUTLINE");
material.DisableKeyword("TINTED_OUTLINE");
material.EnableKeyword("COLORED_OUTLINE");
break;
default:
break;
}
}
}
}