MegaModifierEditor.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. using UnityEngine;
  2. using UnityEditor;
  3. [CanEditMultipleObjects, CustomEditor(typeof(MegaModifier))]
  4. public class MegaModifierEditor : Editor
  5. {
  6. public Texture image;
  7. public bool showhelp = false;
  8. public virtual Texture LoadImage() { return null; }
  9. public virtual string GetHelpString() { return "Modifier by Chris West"; }
  10. public virtual bool Inspector() { return true; }
  11. public virtual bool DisplayCommon() { return true; }
  12. //public bool useUndo = true;
  13. private MegaModifier src;
  14. private MegaUndo undoManager;
  15. #if false
  16. SerializedProperty labelProp;
  17. SerializedProperty maxlodProp;
  18. SerializedProperty modenabledProp;
  19. SerializedProperty displaygizmoProp;
  20. SerializedProperty orderProp;
  21. SerializedProperty gizcol2Prop;
  22. SerializedProperty gizcol1Prop;
  23. SerializedProperty gizmodetailProp;
  24. SerializedProperty offsetProp;
  25. SerializedProperty gizmoposProp;
  26. SerializedProperty gizmorotProp;
  27. SerializedProperty gizmoscaleProp;
  28. #endif
  29. public virtual void Enable()
  30. {
  31. }
  32. private void OnEnable()
  33. {
  34. src = target as MegaModifier;
  35. // Instantiate undoManager
  36. if ( src != null )
  37. undoManager = new MegaUndo(src, src.ModName() + " change");
  38. #if false
  39. labelProp = serializedObject.FindProperty("Label");
  40. maxlodProp = serializedObject.FindProperty("MaxLOD");
  41. modenabledProp = serializedObject.FindProperty("ModEnabled");
  42. displaygizmoProp = serializedObject.FindProperty("DisplayGizmo");
  43. orderProp = serializedObject.FindProperty("Order");
  44. gizcol2Prop = serializedObject.FindProperty("gizCol2");
  45. gizcol1Prop = serializedObject.FindProperty("gizCol1");
  46. gizmodetailProp = serializedObject.FindProperty("steps");
  47. offsetProp = serializedObject.FindProperty("Offset");
  48. gizmoposProp = serializedObject.FindProperty("gizmoPos");
  49. gizmorotProp = serializedObject.FindProperty("gizmoRot");
  50. gizmoscaleProp = serializedObject.FindProperty("gizmoScale");
  51. #endif
  52. Enable();
  53. }
  54. void OnDestroy()
  55. {
  56. #if UNITY_3_5
  57. MegaModifiers[] con = (MegaModifiers[])FindSceneObjectsOfType(typeof(MegaModifiers));
  58. #else
  59. MegaModifiers[] con = (MegaModifiers[])FindObjectsOfType(typeof(MegaModifiers));
  60. #endif
  61. for ( int i = 0; i < con.Length; i++ )
  62. {
  63. con[i].BuildList();
  64. }
  65. }
  66. public bool showmodparams = true;
  67. //bool showweight = true;
  68. //private static GUILayoutOption colWidth = GUILayout.MaxWidth(75.0f);
  69. #if true
  70. public void CommonModParamsBasic(MegaModifier mod)
  71. {
  72. // Basic mod stuff
  73. //showmodparams = EditorGUILayout.Foldout(showmodparams, "Modifier Common Params");
  74. //if ( showmodparams )
  75. //{
  76. mod.Label = EditorGUILayout.TextField("Label", mod.Label);
  77. mod.MaxLOD = EditorGUILayout.IntField("MaxLOD", mod.MaxLOD);
  78. mod.ModEnabled = EditorGUILayout.Toggle("Mod Enabled", mod.ModEnabled);
  79. mod.useUndo = EditorGUILayout.Toggle("Use Undo", mod.useUndo);
  80. mod.DisplayGizmo = EditorGUILayout.Toggle("Display Gizmo", mod.DisplayGizmo);
  81. int order = EditorGUILayout.IntField("Order", mod.Order);
  82. if ( order != mod.Order )
  83. {
  84. mod.Order = order;
  85. MegaModifiers context = mod.GetComponent<MegaModifiers>();
  86. if ( context != null )
  87. context.BuildList();
  88. }
  89. EditorGUILayout.BeginHorizontal();
  90. EditorGUILayout.LabelField("Gizmo Col");
  91. //mod.gizCol1 = EditorGUILayout.ColorField("Giz Col 1", mod.gizCol1, colWidth);
  92. //mod.gizCol2 = EditorGUILayout.ColorField("Giz Col 2", mod.gizCol2, colWidth);
  93. mod.gizCol1 = EditorGUILayout.ColorField(mod.gizCol1); //, colWidth);
  94. mod.gizCol2 = EditorGUILayout.ColorField(mod.gizCol2); //, colWidth);
  95. EditorGUILayout.EndHorizontal();
  96. mod.steps = EditorGUILayout.IntField("Gizmo Detail", mod.steps);
  97. if ( mod.steps < 1 )
  98. mod.steps = 1;
  99. //}
  100. //mod.useWeights = EditorGUILayout.Toggle("Use Weights", mod.useWeights);
  101. //if ( mod.useWeights )
  102. // mod.weightChannel = (MegaWeightChannel)EditorGUILayout.EnumPopup("Weight Channel", mod.weightChannel);
  103. }
  104. #else
  105. public void CommonModParamsBasic(MegaModifier mod)
  106. {
  107. EditorGUILayout.PropertyField(labelProp, new GUIContent("Label"));
  108. EditorGUILayout.PropertyField(maxlodProp, new GUIContent("MaxLOD"));
  109. EditorGUILayout.PropertyField(modenabledProp, new GUIContent("Mod Enabled"));
  110. EditorGUILayout.PropertyField(displaygizmoProp, new GUIContent("Display Gizmo"));
  111. int order = mod.Order;
  112. EditorGUILayout.PropertyField(orderProp, new GUIContent("Order"));
  113. if ( order != mod.Order )
  114. {
  115. mod.Order = order;
  116. MegaModifiers context = mod.GetComponent<MegaModifiers>();
  117. if ( context != null )
  118. context.BuildList();
  119. }
  120. EditorGUILayout.BeginHorizontal();
  121. EditorGUILayout.LabelField("Gizmo Col");
  122. EditorGUILayout.PropertyField(gizcol1Prop, GUIContent.none, true); //, new GUIContent("Display Gizmo"));
  123. EditorGUILayout.PropertyField(gizcol2Prop, GUIContent.none, true); //, new GUIContent("Display Gizmo"));
  124. EditorGUILayout.EndHorizontal();
  125. EditorGUILayout.PropertyField(gizmodetailProp, new GUIContent("Gizmo Detail")); //, new GUIContent("Display Gizmo"));
  126. }
  127. #endif
  128. #if true
  129. public void CommonModParams(MegaModifier mod)
  130. {
  131. showmodparams = EditorGUILayout.Foldout(showmodparams, "Modifier Common Params");
  132. if ( showmodparams )
  133. {
  134. EditorGUILayout.BeginHorizontal();
  135. if ( GUILayout.Button("Rst Off") )
  136. {
  137. mod.Offset = Vector3.zero;
  138. EditorUtility.SetDirty(target);
  139. }
  140. if ( GUILayout.Button("Rst Pos") )
  141. {
  142. mod.gizmoPos = Vector3.zero;
  143. EditorUtility.SetDirty(target);
  144. }
  145. if ( GUILayout.Button("Rst Rot") )
  146. {
  147. mod.gizmoRot = Vector3.zero;
  148. EditorUtility.SetDirty(target);
  149. }
  150. if ( GUILayout.Button("Rst Scl") )
  151. {
  152. mod.gizmoScale = Vector3.one;
  153. EditorUtility.SetDirty(target);
  154. }
  155. EditorGUILayout.EndHorizontal();
  156. mod.Offset = EditorGUILayout.Vector3Field("Offset", mod.Offset);
  157. mod.gizmoPos = EditorGUILayout.Vector3Field("Gizmo Pos", mod.gizmoPos);
  158. mod.gizmoRot = EditorGUILayout.Vector3Field("Gizmo Rot", mod.gizmoRot);
  159. mod.gizmoScale = EditorGUILayout.Vector3Field("Gizmo Scale", mod.gizmoScale);
  160. CommonModParamsBasic(mod);
  161. }
  162. }
  163. #else
  164. public void CommonModParams(MegaModifier mod)
  165. {
  166. showmodparams = EditorGUILayout.Foldout(showmodparams, "Modifier Common Params");
  167. if ( showmodparams )
  168. {
  169. EditorGUILayout.BeginHorizontal();
  170. if ( GUILayout.Button("Rst Off") )
  171. {
  172. mod.Offset = Vector3.zero;
  173. EditorUtility.SetDirty(target);
  174. }
  175. if ( GUILayout.Button("Rst Pos") )
  176. {
  177. mod.gizmoPos = Vector3.zero;
  178. EditorUtility.SetDirty(target);
  179. }
  180. if ( GUILayout.Button("Rst Rot") )
  181. {
  182. mod.gizmoRot = Vector3.zero;
  183. EditorUtility.SetDirty(target);
  184. }
  185. if ( GUILayout.Button("Rst Scl") )
  186. {
  187. mod.gizmoScale = Vector3.one;
  188. EditorUtility.SetDirty(target);
  189. }
  190. EditorGUILayout.EndHorizontal();
  191. EditorGUILayout.PropertyField(offsetProp, new GUIContent("Offset"), true);
  192. EditorGUILayout.PropertyField(gizmoposProp, new GUIContent("Gizmo Pos"), true);
  193. EditorGUILayout.PropertyField(gizmorotProp, new GUIContent("Gizmo Rot"), true);
  194. EditorGUILayout.PropertyField(gizmoscaleProp, new GUIContent("Gizmo Scale"), true);
  195. CommonModParamsBasic(mod);
  196. }
  197. }
  198. #endif
  199. public virtual void DrawGUI()
  200. {
  201. MegaModifier mod = (MegaModifier)target;
  202. MegaModifiers context = mod.GetComponent<MegaModifiers>();
  203. if ( context == null )
  204. {
  205. EditorGUILayout.LabelField("You need to Add a Mega Modify Object Component");
  206. return;
  207. }
  208. //showhelp = EditorGUILayout.Foldout(showhelp, "Help");
  209. //if ( showhelp )
  210. //{
  211. //if ( image == null )
  212. //image = LoadImage();
  213. //if ( image != null )
  214. //{
  215. //float w = Screen.width - 12.0f;
  216. //float h = (w / image.width) * image.height;
  217. //if ( h > image.height )
  218. //h = image.height;
  219. //GUILayout.Label((Texture)image, GUIStyle.none, GUILayout.Width(w), GUILayout.Height(h));
  220. //}
  221. //}
  222. if ( DisplayCommon() )
  223. CommonModParams((MegaModifier)target);
  224. if ( GUI.changed )
  225. EditorUtility.SetDirty(target);
  226. if ( Inspector() )
  227. DrawDefaultInspector();
  228. //if ( showhelp )
  229. //GUILayout.TextArea(GetHelpString());
  230. }
  231. void ArrowCap(int id, Vector3 pos, Quaternion rot, float size)
  232. {
  233. #if UNITY_5_6 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  234. Handles.ArrowHandleCap(id, pos, rot, size, EventType.Repaint);
  235. #else
  236. Handles.ArrowCap(id, pos, rot, size);
  237. #endif
  238. }
  239. public virtual void DrawSceneGUI()
  240. {
  241. MegaModifier mod = (MegaModifier)target;
  242. if ( mod.ModEnabled && mod.DisplayGizmo && MegaModifiers.GlobalDisplay && showmodparams )
  243. {
  244. MegaModifiers context = mod.GetComponent<MegaModifiers>();
  245. if ( context != null && context.Enabled && context.DrawGizmos )
  246. {
  247. //mod.Offset = -Handles.PositionHandle(-mod.Offset, Quaternion.identity);
  248. float a = mod.gizCol1.a;
  249. Color col = Color.white;
  250. Quaternion rot = mod.transform.localRotation;
  251. #if false
  252. Handles.matrix = Matrix4x4.identity;
  253. if ( mod.Offset != Vector3.zero )
  254. {
  255. Vector3 pos = mod.transform.localToWorldMatrix.MultiplyPoint(-mod.Offset);
  256. Handles.Label(pos, mod.ModName() + " Offset\n" + mod.Offset.ToString("0.000"));
  257. col = Color.blue;
  258. col.a = a;
  259. Handles.color = col;
  260. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(180.0f, 0.0f, 0.0f), mod.GizmoSize());
  261. col = Color.green;
  262. col.a = a;
  263. Handles.color = col;
  264. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(90.0f, 0.0f, 0.0f), mod.GizmoSize());
  265. col = Color.red;
  266. col.a = a;
  267. Handles.color = col;
  268. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(0.0f, -90.0f, 0.0f), mod.GizmoSize());
  269. }
  270. // gizmopos
  271. if ( mod.gizmoPos != Vector3.zero )
  272. {
  273. Vector3 pos = mod.transform.localToWorldMatrix.MultiplyPoint(-mod.gizmoPos);
  274. Handles.Label(pos, mod.ModName() + " Pos\n" + mod.gizmoPos.ToString("0.000"));
  275. col = Color.blue;
  276. col.a = a;
  277. Handles.color = col;
  278. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(180.0f, 0.0f, 0.0f), mod.GizmoSize());
  279. col = Color.green;
  280. col.a = a;
  281. Handles.color = col;
  282. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(90.0f, 0.0f, 0.0f), mod.GizmoSize());
  283. col = Color.red;
  284. col.a = a;
  285. Handles.color = col;
  286. Handles.ArrowCap(0, pos, rot * Quaternion.Euler(0.0f, -90.0f, 0.0f), mod.GizmoSize());
  287. }
  288. #else
  289. Handles.matrix = mod.transform.localToWorldMatrix; //Matrix4x4.identity;
  290. if ( mod.Offset != Vector3.zero )
  291. {
  292. Vector3 pos = -mod.Offset; //mod.transform.localToWorldMatrix.MultiplyPoint(-mod.Offset);
  293. Handles.Label(pos, mod.ModName() + " Offset\n" + mod.Offset.ToString("0.000"));
  294. col = Color.blue;
  295. col.a = a;
  296. Handles.color = col;
  297. ArrowCap(0, pos, rot * Quaternion.Euler(180.0f, 0.0f, 0.0f), mod.GizmoSize());
  298. col = Color.green;
  299. col.a = a;
  300. Handles.color = col;
  301. ArrowCap(0, pos, rot * Quaternion.Euler(90.0f, 0.0f, 0.0f), mod.GizmoSize());
  302. col = Color.red;
  303. col.a = a;
  304. Handles.color = col;
  305. ArrowCap(0, pos, rot * Quaternion.Euler(0.0f, -90.0f, 0.0f), mod.GizmoSize());
  306. }
  307. // gizmopos
  308. if ( mod.gizmoPos != Vector3.zero )
  309. {
  310. Vector3 pos = -mod.gizmoPos; //mod.transform.localToWorldMatrix.MultiplyPoint(-mod.gizmoPos);
  311. Handles.Label(pos, mod.ModName() + " Pos\n" + mod.gizmoPos.ToString("0.000"));
  312. col = Color.blue;
  313. col.a = a;
  314. Handles.color = col;
  315. ArrowCap(0, pos, rot * Quaternion.Euler(180.0f, 0.0f, 0.0f), mod.GizmoSize());
  316. col = Color.green;
  317. col.a = a;
  318. Handles.color = col;
  319. ArrowCap(0, pos, rot * Quaternion.Euler(90.0f, 0.0f, 0.0f), mod.GizmoSize());
  320. col = Color.red;
  321. col.a = a;
  322. Handles.color = col;
  323. ArrowCap(0, pos, rot * Quaternion.Euler(0.0f, -90.0f, 0.0f), mod.GizmoSize());
  324. }
  325. #endif
  326. Handles.matrix = Matrix4x4.identity;
  327. }
  328. }
  329. }
  330. public override void OnInspectorGUI()
  331. {
  332. MegaModifier mod = (MegaModifier)target;
  333. serializedObject.Update();
  334. if ( mod.useUndo )
  335. undoManager.CheckUndo();
  336. DrawGUI();
  337. serializedObject.ApplyModifiedProperties();
  338. if ( GUI.changed )
  339. EditorUtility.SetDirty(target);
  340. if ( mod.useUndo )
  341. undoManager.CheckDirty();
  342. }
  343. public void OnSceneGUI()
  344. {
  345. DrawSceneGUI();
  346. }
  347. }