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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |