237 lines
10 KiB
C#
237 lines
10 KiB
C#
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
|
|||
|
using UnityEngine;
|
|||
|
using UnityEditor;
|
|||
|
|
|||
|
|
|||
|
namespace AmazingAssets.CurvedWorldEditor
|
|||
|
{
|
|||
|
[CanEditMultipleObjects]
|
|||
|
public class CurvedWorldBendSettingsDrawer : MaterialPropertyDrawer
|
|||
|
{
|
|||
|
static CurvedWorld.BEND_TYPE[] shaderSupportedBendTypes;
|
|||
|
static int[] shaderSupportedBendIDs;
|
|||
|
static bool hasNormalTransform;
|
|||
|
|
|||
|
|
|||
|
CurvedWorld.BEND_TYPE updateBendType;
|
|||
|
int updateBendID;
|
|||
|
bool updateNormalTransform;
|
|||
|
Material updateMaterial;
|
|||
|
MaterialEditor updateMaterialEditor;
|
|||
|
|
|||
|
|
|||
|
public void Init(string label)
|
|||
|
{
|
|||
|
EditorUtilities.StringToBendSettings(label, out shaderSupportedBendTypes, out shaderSupportedBendIDs, out hasNormalTransform);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override void OnGUI(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor)
|
|||
|
{
|
|||
|
Material material = (Material)editor.target;
|
|||
|
Init(prop.displayName);
|
|||
|
|
|||
|
|
|||
|
//Read settings
|
|||
|
CurvedWorld.BEND_TYPE bendType;
|
|||
|
int bendID;
|
|||
|
bool normalTransform;
|
|||
|
|
|||
|
EditorUtilities.GetBendSettingsFromVector(prop.vectorValue, out bendType, out bendID, out normalTransform);
|
|||
|
|
|||
|
//Make sure keywords are assinged correctly
|
|||
|
if ((material.IsKeywordEnabled(EditorUtilities.GetKeywordName(bendType)) == false || material.IsKeywordEnabled(EditorUtilities.GetKeywordName(bendID)) == false) &&
|
|||
|
File.Exists(EditorUtilities.GetBendFileLocation(bendType, bendID, EditorUtilities.EXTENSTION.cginc)))
|
|||
|
{
|
|||
|
EditorUtilities.UpdateMaterialKeyWords(material, bendType, bendID, normalTransform);
|
|||
|
|
|||
|
if (CurvedWorldEditorWindow.activeWindow != null && CurvedWorldEditorWindow.activeWindow.gTab == CurvedWorldEditorWindow.TAB.RenderersOverview)
|
|||
|
{
|
|||
|
CurvedWorldEditorWindow.activeWindow.RebuildSceneShadersOverview();
|
|||
|
CurvedWorldEditorWindow.activeWindow.Repaint();
|
|||
|
}
|
|||
|
}
|
|||
|
if (normalTransform != material.IsKeywordEnabled(EditorUtilities.shaderKeywordName_BendTransformNormal))
|
|||
|
{
|
|||
|
if (material.IsKeywordEnabled(EditorUtilities.shaderKeywordName_BendTransformNormal))
|
|||
|
normalTransform = true;
|
|||
|
else
|
|||
|
normalTransform = false;
|
|||
|
|
|||
|
prop.vectorValue = new Vector4((int)bendType, bendID, (hasNormalTransform ? (normalTransform ? 1 : 0) : 0), 0);
|
|||
|
|
|||
|
if (CurvedWorldEditorWindow.activeWindow != null && CurvedWorldEditorWindow.activeWindow.gTab == CurvedWorldEditorWindow.TAB.RenderersOverview)
|
|||
|
{
|
|||
|
CurvedWorldEditorWindow.activeWindow.RebuildSceneShadersOverview();
|
|||
|
CurvedWorldEditorWindow.activeWindow.Repaint();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
EditorGUI.BeginChangeCheck();
|
|||
|
EditorGUI.showMixedValue = prop.hasMixedValue;
|
|||
|
|
|||
|
position.height = 18;
|
|||
|
using (new EditorGUIHelper.EditorGUIUtilityLabelWidth(0))
|
|||
|
{
|
|||
|
position.height = 18;
|
|||
|
|
|||
|
bendType = (CurvedWorld.BEND_TYPE)EditorGUI.Popup(new Rect(position.xMin, position.yMin, position.width - 20, position.height), " ", (int)bendType, EditorUtilities.bendTypesNamesForMenu);
|
|||
|
EditorGUI.LabelField(new Rect(position.xMin, position.yMin, position.width - 20, position.height), "Bend Type", EditorUtilities.GetBendTypeNameInfo(bendType).forLable, EditorStyles.popup);
|
|||
|
|
|||
|
|
|||
|
if (GUI.Button(new Rect(position.xMax - 20, position.yMin, 20, position.height), "≡"))
|
|||
|
{
|
|||
|
GenericMenu menu = new GenericMenu();
|
|||
|
|
|||
|
menu.AddItem(new GUIContent("Find Controller"), false, EditorUtilities.CallbackFindController, (int)bendType + "_" + bendID);
|
|||
|
menu.AddItem(new GUIContent("Editor Window"), false, EditorUtilities.CallbackOpenCurvedWorldSettingsWindow, (int)bendType + "_" + bendID);
|
|||
|
menu.AddItem(new GUIContent("Curved World Keywords"), false, EditorUtilities.CallbackAnalyzeShaderCurvedWorldKeywords, material.shader);
|
|||
|
|
|||
|
menu.AddItem(new GUIContent("Reimport Shader"), false, EditorUtilities.CallbackReimportShader, material.shader);
|
|||
|
|
|||
|
|
|||
|
menu.ShowAsContext();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
position.yMin += 20;
|
|||
|
position.height = 18;
|
|||
|
bendID = EditorGUI.IntSlider(position, "Bend ID", bendID, 1, EditorUtilities.MAX_SUPPORTED_BEND_IDS);
|
|||
|
|
|||
|
if (hasNormalTransform)
|
|||
|
{
|
|||
|
position.yMin += 20;
|
|||
|
position.height = 18;
|
|||
|
normalTransform = EditorGUI.Toggle(position, "Normal Transform", normalTransform);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
EditorGUI.showMixedValue = false;
|
|||
|
if (EditorGUI.EndChangeCheck())
|
|||
|
{
|
|||
|
if (bendID < 1)
|
|||
|
bendID = 1;
|
|||
|
|
|||
|
// Set the new value if it has changed
|
|||
|
prop.vectorValue = new Vector4((int)bendType, bendID, (hasNormalTransform ? (normalTransform ? 1 : 0) : 0), 0);
|
|||
|
|
|||
|
if (File.Exists(EditorUtilities.GetBendFileLocation(bendType, bendID, EditorUtilities.EXTENSTION.cginc)))
|
|||
|
{
|
|||
|
Undo.RecordObjects(editor.targets, "Change Keywords");
|
|||
|
|
|||
|
foreach (Material mat in editor.targets)
|
|||
|
{
|
|||
|
EditorUtilities.UpdateMaterialKeyWords(mat, bendType, bendID, normalTransform);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//If file does not exist still adjust keyword for normal transformation
|
|||
|
foreach (Material mat in editor.targets)
|
|||
|
{
|
|||
|
if (normalTransform)
|
|||
|
mat.EnableKeyword(EditorUtilities.shaderKeywordName_BendTransformNormal);
|
|||
|
else
|
|||
|
mat.DisableKeyword(EditorUtilities.shaderKeywordName_BendTransformNormal);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (CurvedWorldEditorWindow.activeWindow != null && CurvedWorldEditorWindow.activeWindow.gTab == CurvedWorldEditorWindow.TAB.RenderersOverview)
|
|||
|
{
|
|||
|
CurvedWorldEditorWindow.activeWindow.RebuildSceneShadersOverview();
|
|||
|
CurvedWorldEditorWindow.activeWindow.Repaint();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (shaderSupportedBendTypes.Contains(bendType) == false || shaderSupportedBendIDs.Contains(bendID) == false ||
|
|||
|
File.Exists(EditorUtilities.GetBendFileLocation(bendType, bendID, EditorUtilities.EXTENSTION.cginc)) == false)
|
|||
|
{
|
|||
|
position.yMin += 20;
|
|||
|
position.height = 36;
|
|||
|
EditorGUI.HelpBox(position, "Missing Keywords!", MessageType.Error);
|
|||
|
|
|||
|
if (GUI.Button(new Rect(position.xMax - 64 - 5, position.yMin + 9, 64, 18), "Actions"))
|
|||
|
{
|
|||
|
updateBendType = bendType;
|
|||
|
updateBendID = bendID;
|
|||
|
updateNormalTransform = normalTransform;
|
|||
|
updateMaterial = material;
|
|||
|
updateMaterialEditor = editor;
|
|||
|
|
|||
|
GenericMenu menu = new GenericMenu();
|
|||
|
menu.AddItem(new GUIContent("Update Shader"), false, CallBackUpdateShader);
|
|||
|
menu.ShowAsContext();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override float GetPropertyHeight(MaterialProperty prop, string label, MaterialEditor editor)
|
|||
|
{
|
|||
|
Material material = (Material)editor.target;
|
|||
|
Init(prop.displayName);
|
|||
|
|
|||
|
//Read settings
|
|||
|
CurvedWorld.BEND_TYPE bendType;
|
|||
|
int bendID;
|
|||
|
bool enabledNormalTransform;
|
|||
|
|
|||
|
EditorUtilities.GetBendSettingsFromVector(prop.vectorValue, out bendType, out bendID, out enabledNormalTransform);
|
|||
|
|
|||
|
|
|||
|
float height = base.GetPropertyHeight(prop, label, editor) * (2 + (hasNormalTransform ? 1 : 0)) + 2;
|
|||
|
|
|||
|
|
|||
|
if (shaderSupportedBendTypes.Contains(bendType) == false || shaderSupportedBendIDs.Contains(bendID) == false ||
|
|||
|
File.Exists(EditorUtilities.GetBendFileLocation(bendType, bendID, EditorUtilities.EXTENSTION.cginc)) == false)
|
|||
|
{
|
|||
|
height += 40;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return height;
|
|||
|
}
|
|||
|
|
|||
|
void CallBackUpdateShader()
|
|||
|
{
|
|||
|
if (File.Exists(EditorUtilities.GetBendFileLocation(updateBendType, updateBendID, EditorUtilities.EXTENSTION.cginc)) == false)
|
|||
|
{
|
|||
|
EditorUtilities.CreateCGINCFile(updateBendType, updateBendID);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (EditorUtilities.AddShaderBendSettings(updateMaterial.shader, updateBendType, updateBendID, EditorUtilities.KEYWORDS_COMPILE.Default, false))
|
|||
|
{
|
|||
|
EditorUtilities.CallbackReimportShader(updateMaterial.shader);
|
|||
|
|
|||
|
foreach (Material mat in updateMaterialEditor.targets)
|
|||
|
{
|
|||
|
EditorUtilities.UpdateMaterialKeyWords(mat, updateBendType, updateBendID, updateNormalTransform);
|
|||
|
}
|
|||
|
|
|||
|
if (CurvedWorldEditorWindow.activeWindow != null &&
|
|||
|
CurvedWorldEditorWindow.activeWindow.gTab == CurvedWorldEditorWindow.TAB.CurvedWorldKeywords &&
|
|||
|
CurvedWorldEditorWindow.activeWindow.gCurvedWorldKeywordsShader == updateMaterial.shader)
|
|||
|
{
|
|||
|
CurvedWorldEditorWindow.gCurvedWorldKeywordsShaderInfo = null;
|
|||
|
CurvedWorldEditorWindow.activeWindow.Repaint();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
AssetDatabase.Refresh();
|
|||
|
|
|||
|
if (CurvedWorldEditorWindow.activeWindow != null && CurvedWorldEditorWindow.activeWindow.gTab == CurvedWorldEditorWindow.TAB.RenderersOverview)
|
|||
|
{
|
|||
|
CurvedWorldEditorWindow.activeWindow.RebuildSceneShadersOverview();
|
|||
|
CurvedWorldEditorWindow.activeWindow.Repaint();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|