123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- //#if UNITY_EDITOR
- using System;
- using UnityEngine;
- using UnityEditor;
- class LayaShaderGUI : ShaderGUI
- {
- public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
- {
- material.shader = newShader;
- material.EnableKeyword("EnableLighting");
- onChangeRender(material, (RenderMode)material.GetFloat("_Mode"));
- }
- public enum RenderMode
- {
- /**渲染状态_不透明。*/
- Opaque = 0,
- /**渲染状态_透明测试。*/
- Cutout = 1,
- /**渲染状态_透明混合。*/
- Transparent = 2,
- /**渲染状态_自定义。*/
- Custom = 3
- }
- public enum SrcBlendMode
- {
- //Blend factor is (0, 0, 0, 0).
- Zero = 0,
- //Blend factor is (1, 1, 1, 1).
- One = 1,
- //Blend factor is (Rd, Gd, Bd, Ad).
- DstColor = 2,
- //Blend factor is (Rs, Gs, Bs, As).
- SrcColor = 3,
- //Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).
- OneMinusDstColor = 4,
- //Blend factor is (As, As, As, As).
- SrcAlpha = 5,
- //Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).
- OneMinusSrcColor = 6,
- //Blend factor is (Ad, Ad, Ad, Ad).
- DstAlpha = 7,
- //Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad).
- OneMinusDstAlpha = 8,
- //Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad).
- SrcAlphaSaturate = 9,
- //Blend factor is (1 - As, 1 - As, 1 - As, 1 - As).
- OneMinusSrcAlpha = 10
- }
- public enum DstBlendMode
- {
- //Blend factor is (0, 0, 0, 0).
- Zero = 0,
- //Blend factor is (1, 1, 1, 1).
- One = 1,
- //Blend factor is (Rd, Gd, Bd, Ad).
- DstColor = 2,
- //Blend factor is (Rs, Gs, Bs, As).
- SrcColor = 3,
- //Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).
- OneMinusDstColor = 4,
- //Blend factor is (As, As, As, As).
- SrcAlpha = 5,
- //Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).
- OneMinusSrcColor = 6,
- //Blend factor is (Ad, Ad, Ad, Ad).
- DstAlpha = 7,
- //Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad).
- OneMinusDstAlpha = 8,
- //Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad).
- SrcAlphaSaturate = 9,
- //Blend factor is (1 - As, 1 - As, 1 - As, 1 - As).
- OneMinusSrcAlpha = 10
- }
- public enum CullMode
- {
- CULL_NONE = 0,
- CULL_FRONT = 1,
- CULL_BACK = 2,
- }
- public enum DepthWrite
- {
- OFF = 0,
- ON = 1
- }
- public enum DepthTest
- {
- OFF = 0,
- Never = 1,
- LESS = 2,
- EQUAL = 3,
- LEQUAL = 4,
- GREATER = 5,
- NOTEQUAL = 6,
- GEQUAL = 7,
- ALWAYS = 8
- }
- public enum LightingMode
- {
- ON = 0,
- OFF = 1,
- }
- MaterialProperty lighting = null;
- MaterialProperty albedoTexture = null;
- MaterialProperty albedoColor = null;
- MaterialProperty albedoIntensity = null;
- MaterialProperty specularTexture = null;
- MaterialProperty specularColor = null;
- MaterialProperty specularShininess = null;
- MaterialProperty normalTexture = null;
- MaterialProperty cullMode = null;
- MaterialProperty renderMode = null;
- MaterialProperty alphaTest = null;
- MaterialProperty alphaCutoff = null;
- MaterialProperty alphaBlend = null;
- MaterialProperty srcBlendMode = null;
- MaterialProperty dstBlendMode = null;
- MaterialProperty depthWrite = null;
- MaterialProperty depthTest = null;
- MaterialEditor m_MaterialEditor;
- MaterialProperty isVertexColor = null;
- bool m_FirstTimeApply = true;
- public void FindProperties(MaterialProperty[] props)
- {
- lighting = FindProperty("_Lighting", props);
- albedoTexture = FindProperty("_MainTex", props);
- albedoColor = FindProperty("_Color", props);
- albedoIntensity = FindProperty("_AlbedoIntensity", props);
- specularTexture = FindProperty("_SpecGlossMap", props);
- specularColor = FindProperty("_SpecColor", props);
- specularShininess = FindProperty("_Shininess", props);
- normalTexture = FindProperty("_BumpMap", props);
- renderMode = FindProperty("_Mode", props);
- cullMode = FindProperty("_Cull", props);
- alphaTest = FindProperty("_AlphaTest", props, false);
- alphaCutoff = FindProperty("_Cutoff", props, false);
- alphaBlend = FindProperty("_AlphaBlend", props, false);
- srcBlendMode = FindProperty("_SrcBlend", props);
- dstBlendMode = FindProperty("_DstBlend", props);
- depthWrite = FindProperty("_ZWrite", props);
- depthTest = FindProperty("_ZTest", props);
- isVertexColor = FindProperty("_IsVertexColor", props);
- }
- public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
- {
- // render the default gui
- FindProperties(props);
- m_MaterialEditor = materialEditor;
- Material material = materialEditor.target as Material;
- ShaderPropertiesGUI(material);
- }
- public void ShaderPropertiesGUI(Material material)
- {
- // Use default labelWidth
- EditorGUIUtility.labelWidth = 0f;
- // Detect any changes to the material
- EditorGUI.BeginChangeCheck();
- {
- //renderMode
- GUILayout.BeginHorizontal();
- GUILayout.Label(Styles.renderModeText, GUILayout.Width(120));
- var mode = (RenderMode)renderMode.floatValue;
- mode = (RenderMode)EditorGUILayout.Popup((int)mode, Styles.renderModeNames);
- GUILayout.EndHorizontal();
- //lightingMode
- GUILayout.BeginHorizontal();
- GUILayout.Label(Styles.lightModeText, GUILayout.Width(120));
- var light = (LightingMode)lighting.floatValue;
- light = (LightingMode)EditorGUILayout.Popup((int)light, Styles.lightingNames);
- GUILayout.EndHorizontal();
- //IsVertexColor
- m_MaterialEditor.ShaderProperty(isVertexColor, Styles.enableVertexColor);
- //Primary properties
- GUILayout.Label(Styles.PrimaryText, EditorStyles.boldLabel);
- //albedo
- m_MaterialEditor.TexturePropertySingleLine(Styles.albedoText, albedoTexture, albedoColor);
- //albedo Intensity
- m_MaterialEditor.ShaderProperty(albedoIntensity, Styles.albedoIntensityText, MaterialEditor.kMiniTextureFieldLabelIndentLevel);
- if (lighting.floatValue == 0)
- {
- //specular
- m_MaterialEditor.TexturePropertySingleLine(Styles.specularText, specularTexture, specularColor);
- //specular Shininess
- m_MaterialEditor.ShaderProperty(specularShininess, Styles.specularShininessText, MaterialEditor.kMiniTextureFieldLabelIndentLevel);
- //mormal
- m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, normalTexture);
- }
- //scaleAndOffset
- m_MaterialEditor.TextureScaleOffsetProperty(albedoTexture);
- GUILayout.Box("", GUILayout.Height(1), GUILayout.ExpandWidth(true));
- //Advanced properties
- GUILayout.Label(Styles.AdvancedText, EditorStyles.boldLabel);
- //alphaTest
- m_MaterialEditor.ShaderProperty(alphaTest, Styles.alphaTestText);
- if (alphaTest.floatValue == 1)
- {
- m_MaterialEditor.ShaderProperty(alphaCutoff, Styles.alphaCutoffText, MaterialEditor.kMiniTextureFieldLabelIndentLevel + 1);
- }
- //alphaBlend
- m_MaterialEditor.ShaderProperty(alphaBlend, Styles.alphaBlendText);
- var dstMode = (DstBlendMode)dstBlendMode.floatValue;
- var srcMode = (SrcBlendMode)srcBlendMode.floatValue;
- if (alphaBlend.floatValue == 1)
- {
- GUILayout.BeginHorizontal();
- GUILayout.Label("", GUILayout.Width(20));
- srcMode = (SrcBlendMode)EditorGUILayout.Popup((int)srcMode, Styles.srcBlendNames);
- dstMode = (DstBlendMode)EditorGUILayout.Popup((int)dstMode, Styles.dstBlendNames);
- GUILayout.EndHorizontal();
- }
- //depthWrite
- GUILayout.BeginHorizontal();
- GUILayout.Label(Styles.depthWriteText, GUILayout.Width(120));
- var depthW = (DepthWrite)depthWrite.floatValue;
- depthW = (DepthWrite)EditorGUILayout.Popup((int)depthW, Styles.depthWriteNames);
- GUILayout.EndHorizontal();
- //depthTest
- GUILayout.BeginHorizontal();
- GUILayout.Label(Styles.depthTestText, GUILayout.Width(120));
- var depthT = (DepthTest)depthTest.floatValue;
- depthT = (DepthTest)EditorGUILayout.Popup((int)depthT, Styles.depthTestNames);
- GUILayout.EndHorizontal();
- //cullMode
- GUILayout.BeginHorizontal();
- GUILayout.Label(Styles.cullModeText, GUILayout.Width(120));
- var cull = (CullMode)cullMode.floatValue;
- cull = (CullMode)EditorGUILayout.Popup((int)cull, Styles.cullModeNames);
- GUILayout.EndHorizontal();
- if (EditorGUI.EndChangeCheck())
- {
- m_MaterialEditor.RegisterPropertyChangeUndo("Rendering Mode");
- //renderMode
- renderMode.floatValue = (float)mode;
-
- //lightMode
- lighting.floatValue = (float)light;
- material.SetInt("_Lighting", (int)light);
- if (lighting.floatValue == 0)
- {
- material.EnableKeyword("EnableLighting");
- }
- else
- {
- material.DisableKeyword("EnableLighting");
- }
- //cullMode
- cullMode.floatValue = (float)cull;
- material.SetInt("_Cull", (int)cull);
- if ((RenderMode)material.GetFloat("_Mode") == RenderMode.Custom)
- {
- //alphaTest
- if (alphaTest.floatValue == 1)
- {
- material.EnableKeyword("EnableAlphaCutoff");
- material.EnableKeyword("_ALPHATEST_ON");
- }
- else
- {
- material.DisableKeyword("EnableAlphaCutoff");
- material.DisableKeyword("_ALPHATEST_ON");
- }
- //alphaBlend
- if (alphaBlend.floatValue == 1)
- {
- srcBlendMode.floatValue = (float)srcMode;
- dstBlendMode.floatValue = (float)dstMode;
- material.SetInt("_SrcBlend", (int)srcMode);
- material.SetInt("_DstBlend", (int)dstMode);
- material.EnableKeyword("_ALPHABLEND_ON");
- material.SetInt("_AlphaBlend", 1);
- }
- else
- {
- material.DisableKeyword("_ALPHABLEND_ON");
- material.SetInt("_AlphaBlend", 0);
- material.SetInt("_SrcBlend", (int)1);
- material.SetInt("_DstBlend", (int)0);
- }
- //depthWrite
- depthWrite.floatValue = (float)depthW;
- material.SetInt("_ZWrite", (int)depthW);
- //depthTest
- depthTest.floatValue = (float)depthT;
- material.SetInt("_ZTest", (int)depthT);
- }
- if (specularTexture.textureValue != null)
- {
- material.EnableKeyword("SpecularTexture");
- }
- else
- {
- material.DisableKeyword("SpecularTexture");
- }
- if (normalTexture.textureValue != null)
- {
- material.EnableKeyword("NormalTexture");
- }
- else
- {
- material.DisableKeyword("NormalTexture");
- }
- if (isVertexColor.floatValue == 1)
- {
- material.EnableKeyword("ENABLEVERTEXCOLOR");
- }
- else
- {
- material.DisableKeyword("ENABLEVERTEXCOLOR");
- }
- onChangeRender(material, (RenderMode)material.GetFloat("_Mode"));
- }
- }
- m_MaterialEditor.RenderQueueField();
- }
- public void onChangeRender(Material material, RenderMode mode)
- {
-
- switch (mode)
- {
- case RenderMode.Opaque:
- material.SetInt("_Mode", 0);
- material.SetInt("_AlphaTest", 0);
- material.SetInt("_AlphaBlend", 0);
- material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
- material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
- material.SetInt("_ZWrite", 1);
- material.SetInt("_ZTest", 4);
- material.DisableKeyword("_ALPHATEST_ON");
- material.DisableKeyword("_ALPHABLEND_ON");
- material.DisableKeyword("EnableAlphaCutoff");
- material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry;
- break;
- case RenderMode.Cutout:
- material.SetInt("_Mode", 1);
- material.SetInt("_AlphaTest", 1);
- material.SetInt("_AlphaBlend", 0);
- material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
- material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
- material.SetInt("_ZWrite", 1);
- material.SetInt("_ZTest", 4);
- material.EnableKeyword("_ALPHATEST_ON");
- material.DisableKeyword("_ALPHABLEND_ON");
- material.EnableKeyword("EnableAlphaCutoff");
- material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
- break;
- case RenderMode.Transparent:
- material.SetInt("_Mode", 2);
- material.SetInt("_AlphaTest", 0);
- material.SetInt("_AlphaBlend", 1);
- material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
- material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
- material.SetInt("_ZWrite", 0);
- material.SetInt("_ZTest", 4);
- material.DisableKeyword("_ALPHATEST_ON");
- material.EnableKeyword("_ALPHABLEND_ON");
- material.DisableKeyword("EnableAlphaCutoff");
- material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
- break;
- case RenderMode.Custom:
- material.SetInt("_Mode", 3);
- break;
- default:
- material.SetInt("_Mode", 0);
- material.SetInt("_AlphaTest", 0);
- material.SetInt("_AlphaBlend", 0);
- material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
- material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
- material.SetInt("_ZWrite", 1);
- material.SetInt("_ZTest", 4);
- material.DisableKeyword("_ALPHATEST_ON");
- material.DisableKeyword("_ALPHABLEND_ON");
- material.DisableKeyword("EnableAlphaCutoff");
- material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry;
- break;
- }
- if (lighting != null)
- {
- if (lighting.floatValue == 0)
- {
- material.EnableKeyword("EnableLighting");
- }
- else
- {
- material.DisableKeyword("EnableLighting");
- }
- }
- }
- public static class Styles
- {
- public static GUIStyle optionsButton = "PaneOptions";
- public static GUIContent uvSetLabel = new GUIContent("UV Set");
- public static GUIContent[] uvSetOptions = new GUIContent[] { new GUIContent("UV channel 0"), new GUIContent("UV channel 1") };
- public static string emptyTootip = "";
- public static GUIContent albedoText = new GUIContent("Albedo", "Albedo (RGB) and Transparency (A)");
- public static GUIContent albedoIntensityText = new GUIContent("Intensity", "Albedo Intensity");
- public static GUIContent specularText = new GUIContent("Specular", "Specular (RGB) and Transparency (A)");
- public static GUIContent specularShininessText = new GUIContent("Shininess", "Specular Range");
- public static GUIContent normalMapText = new GUIContent("Normal Map", "Normal Map");
- public static GUIContent lightModeText = new GUIContent("Lighting", "Lighting");
- public static GUIContent cullModeText = new GUIContent("Cull", "CullMode");
- public static GUIContent renderModeText = new GUIContent("RenderMode", "RenderMode");
- public static GUIContent alphaTestText = new GUIContent("AlphaTest", "AlphaTest");
- public static GUIContent alphaCutoffText = new GUIContent("Alpha Cutoff", "Threshold for alpha cutoff");
- public static GUIContent alphaBlendText = new GUIContent("AlphaBlend", "AlphaBlend");
- public static GUIContent depthWriteText = new GUIContent("DepthWrite", "DepthWrite");
- public static GUIContent depthTestText = new GUIContent("DepthTest", "DepthTest");
- public static string whiteSpaceString = " ";
- public static string PrimaryText = "Primary Properties";
- public static string AdvancedText = "Advanced Properties";
- public static GUIContent enableVertexColor = new GUIContent("Enable VertexColor", "Enable VertexColor");
- public static readonly string[] srcBlendNames = Enum.GetNames(typeof(SrcBlendMode));
- public static readonly string[] dstBlendNames = Enum.GetNames(typeof(DstBlendMode));
- public static readonly string[] renderModeNames = Enum.GetNames(typeof(RenderMode));
- public static readonly string[] cullModeNames = Enum.GetNames(typeof(CullMode));
- public static readonly string[] depthWriteNames = Enum.GetNames(typeof(DepthWrite));
- public static readonly string[] depthTestNames = Enum.GetNames(typeof(DepthTest));
- public static readonly string[] lightingNames = Enum.GetNames(typeof(LightingMode));
- }
- }
- //#endif
|