238 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C#
		
	
	
	
// Curved World <http://u3d.as/1W8h>
 | 
						|
// Copyright (c) Amazing Assets <https://amazingassets.world>
 | 
						|
 
 | 
						|
using System;
 | 
						|
 | 
						|
using UnityEngine;
 | 
						|
using UnityEditor;
 | 
						|
 | 
						|
 | 
						|
namespace AmazingAssets.CurvedWorld.Editor
 | 
						|
{
 | 
						|
    static public class MaterialProperties
 | 
						|
    {
 | 
						|
        public enum Style { None, Standard, HelpBox, Foldout }
 | 
						|
		[Flags]
 | 
						|
        public enum Expandable
 | 
						|
        {
 | 
						|
            CurvedWorld = 1 << 4,
 | 
						|
        }
 | 
						|
        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
 | 
						|
        }
 | 
						|
        private static class Label
 | 
						|
        {
 | 
						|
            public static string mainGroupName = "Curved World";
 | 
						|
 | 
						|
            public static string bendType = "Bend Type";
 | 
						|
            public static string bendID = "Bend ID";
 | 
						|
            public static string bendTransformNormal = "Transform Normal";
 | 
						|
 | 
						|
            public static string renderingMode = "Rendering Mode";
 | 
						|
            public static string renderFace = "Render Face";
 | 
						|
 | 
						|
            public static readonly string[] blendNames = System.Enum.GetNames(typeof(BlendMode));
 | 
						|
        }
 | 
						|
 | 
						|
        static MaterialProperty _CurvedWorldBendSettings = null;
 | 
						|
 | 
						|
        static MaterialProperty _BlendMode = null;
 | 
						|
        static MaterialProperty _Cull = null;
 | 
						|
 | 
						|
        static Material material;
 | 
						|
 | 
						|
        static bool foldout = true;
 | 
						|
 | 
						|
 | 
						|
        static public void InitCurvedWorldMaterialProperties(MaterialProperty[] props)
 | 
						|
        {
 | 
						|
            _CurvedWorldBendSettings = FindProperty(Constants.shaderProprtyName_BendSettings, props, false);
 | 
						|
 | 
						|
            _BlendMode = FindProperty("_Mode", props, false);
 | 
						|
            _Cull = FindProperty("_Cull", props, false);
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        static public void DrawCurvedWorldMaterialProperties(MaterialEditor materialEditor, Style style, bool drawRenderingOptions, bool drawCull)
 | 
						|
        {
 | 
						|
            if (drawRenderingOptions && _BlendMode != null)
 | 
						|
            {
 | 
						|
                //Make sure that needed setup(ie keywords / renderqueue) are set up if we're switching some existing
 | 
						|
                Material material = materialEditor.target as Material;
 | 
						|
                SetupMaterialWithBlendMode(material, (BlendMode)material.GetFloat("_Mode"));  //If blend modes are not available - use default blend mode
 | 
						|
            }
 | 
						|
 | 
						|
            switch (style)
 | 
						|
            {
 | 
						|
                case Style.HelpBox:
 | 
						|
                    {
 | 
						|
                        using (new EditorGUIHelper.EditorGUILayoutBeginVertical(EditorStyles.helpBox))
 | 
						|
                        {
 | 
						|
                            EditorGUILayout.LabelField(Label.mainGroupName, EditorStyles.boldLabel);
 | 
						|
 | 
						|
                            if (_CurvedWorldBendSettings != null)
 | 
						|
                                materialEditor.ShaderProperty(_CurvedWorldBendSettings, Label.bendType);
 | 
						|
                        }
 | 
						|
 | 
						|
                        GUILayout.Space(5);
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
 | 
						|
                case Style.Standard:
 | 
						|
                    {
 | 
						|
                        EditorGUILayout.LabelField(Label.mainGroupName, EditorStyles.boldLabel);
 | 
						|
 | 
						|
                        if (_CurvedWorldBendSettings != null)
 | 
						|
                            materialEditor.ShaderProperty(_CurvedWorldBendSettings, Label.bendType);
 | 
						|
 | 
						|
                        GUILayout.Space(5);
 | 
						|
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
 | 
						|
                case Style.Foldout:
 | 
						|
                    {
 | 
						|
                        foldout = EditorGUILayout.BeginFoldoutHeaderGroup(foldout, Label.mainGroupName);
 | 
						|
 | 
						|
                        if (foldout)
 | 
						|
                        {
 | 
						|
                            if (_CurvedWorldBendSettings != null)
 | 
						|
                                materialEditor.ShaderProperty(_CurvedWorldBendSettings, Label.bendType);
 | 
						|
 | 
						|
                            GUILayout.Space(5);
 | 
						|
                        }
 | 
						|
 | 
						|
                        EditorGUILayout.EndFoldoutHeaderGroup();
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
 | 
						|
                case Style.None:
 | 
						|
                default:
 | 
						|
                    {
 | 
						|
                        if (_CurvedWorldBendSettings != null)
 | 
						|
                            materialEditor.ShaderProperty(_CurvedWorldBendSettings, Label.bendType);
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            if (drawRenderingOptions && _BlendMode != null)
 | 
						|
            {
 | 
						|
                EditorGUI.BeginChangeCheck();
 | 
						|
                {
 | 
						|
                    BlendModePopup(materialEditor);
 | 
						|
                }
 | 
						|
                if (EditorGUI.EndChangeCheck())
 | 
						|
                {
 | 
						|
                    foreach (var obj in _BlendMode.targets)
 | 
						|
                    {
 | 
						|
                        Material mat = (Material)obj;
 | 
						|
                        SetupMaterialWithBlendMode(mat, (BlendMode)mat.GetFloat("_Mode"));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (drawCull && _Cull != null)
 | 
						|
            {
 | 
						|
                materialEditor.ShaderProperty(_Cull, Label.renderFace);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static public void SetKeyWords(Material material)
 | 
						|
        {
 | 
						|
            if (material.HasProperty(Constants.shaderProprtyName_BendSettings))
 | 
						|
            {
 | 
						|
                CurvedWorld.BendType bendType;
 | 
						|
                int bendID;
 | 
						|
                bool normalTransform;
 | 
						|
 | 
						|
                EditorUtilities.GetBendSettingsFromVector(material.GetVector(Constants.shaderProprtyName_BendSettings), out bendType, out bendID, out normalTransform);
 | 
						|
 | 
						|
                EditorUtilities.UpdateMaterialKeyWords(material, bendType, bendID, normalTransform);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static public MaterialProperty FindProperty(string propertyName, MaterialProperty[] properties, bool mandatory = true)
 | 
						|
        {
 | 
						|
            for (int index = 0; index < properties.Length; ++index)
 | 
						|
            {
 | 
						|
                if (properties[index] != null && properties[index].name == propertyName)
 | 
						|
                    return properties[index];
 | 
						|
            }
 | 
						|
 | 
						|
            if (mandatory)
 | 
						|
                throw new System.ArgumentException("Could not find MaterialProperty: '" + propertyName + "', Num properties: " + (object)properties.Length);
 | 
						|
            else
 | 
						|
                return null;
 | 
						|
        }
 | 
						|
 | 
						|
        static void BlendModePopup(MaterialEditor materialEditor)
 | 
						|
        {
 | 
						|
            EditorGUI.showMixedValue = _BlendMode.hasMixedValue;
 | 
						|
            var mode = (BlendMode)_BlendMode.floatValue;
 | 
						|
 | 
						|
            EditorGUI.BeginChangeCheck();
 | 
						|
            mode = (BlendMode)EditorGUILayout.Popup(Label.renderingMode, (int)mode, Label.blendNames);
 | 
						|
            if (EditorGUI.EndChangeCheck())
 | 
						|
            {
 | 
						|
                materialEditor.RegisterPropertyChangeUndo("Rendering Mode");
 | 
						|
                _BlendMode.floatValue = (float)mode;
 | 
						|
            }
 | 
						|
 | 
						|
            EditorGUI.showMixedValue = false;
 | 
						|
        }
 | 
						|
 | 
						|
        static void SetupMaterialWithBlendMode(Material material, BlendMode blendMode)
 | 
						|
        {
 | 
						|
            switch (blendMode)
 | 
						|
            {
 | 
						|
                case BlendMode.Opaque:
 | 
						|
                    material.SetOverrideTag("RenderType", "CurvedWorld_Opaque");
 | 
						|
                    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", "CurvedWorld_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;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |