203 lines
9.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |