MegaBezPatchEditor.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. using UnityEngine;
  2. using UnityEditor;
  3. [CanEditMultipleObjects, CustomEditor(typeof(MegaBezPatch))]
  4. public class MegaBezPatchEditor : Editor
  5. {
  6. [MenuItem("GameObject/Create Other/MegaShape/Bez Patch")]
  7. static void CreateBezPatch()
  8. {
  9. Vector3 pos = Vector3.zero;
  10. if ( UnityEditor.SceneView.lastActiveSceneView != null )
  11. pos = UnityEditor.SceneView.lastActiveSceneView.pivot;
  12. GameObject go = new GameObject("Bez Patch");
  13. MeshFilter mf = go.AddComponent<MeshFilter>();
  14. mf.sharedMesh = new Mesh();
  15. MeshRenderer mr = go.AddComponent<MeshRenderer>();
  16. Material[] mats = new Material[1];
  17. mr.sharedMaterials = mats;
  18. MegaBezPatch pm = go.AddComponent<MegaBezPatch>();
  19. pm.mesh = mf.sharedMesh;
  20. go.transform.position = pos;
  21. Selection.activeObject = go;
  22. pm.Rebuild();
  23. // Add the first warp
  24. }
  25. public override void OnInspectorGUI()
  26. {
  27. MegaBezPatch mod = (MegaBezPatch)target;
  28. #if !UNITY_5 && !UNITY_2017 && !UNITY_2018 && !UNITY_2019 && !UNITY_2020
  29. EditorGUIUtility.LookLikeControls();
  30. #endif
  31. float Width = EditorGUILayout.FloatField("Width", mod.Width);
  32. if ( Width != mod.Width )
  33. {
  34. mod.AdjustLattice(Width, mod.Height);
  35. }
  36. float Height = EditorGUILayout.FloatField("Height", mod.Height);
  37. if ( Height != mod.Height )
  38. {
  39. mod.AdjustLattice(mod.Width, Height);
  40. }
  41. mod.WidthSegs = EditorGUILayout.IntField("Width Segs", mod.WidthSegs);
  42. mod.HeightSegs = EditorGUILayout.IntField("Height Segs", mod.HeightSegs);
  43. mod.recalcBounds = EditorGUILayout.Toggle("Recalc Bounds", mod.recalcBounds);
  44. //mod.recalcNormals = EditorGUILayout.Toggle("Recalc Normals", mod.recalcNormals);
  45. mod.recalcTangents = EditorGUILayout.Toggle("Recalc Tangents", mod.recalcTangents);
  46. mod.GenUVs = EditorGUILayout.BeginToggleGroup("Gen UVs", mod.GenUVs);
  47. mod.UVOffset = EditorGUILayout.Vector2Field("UV Offset", mod.UVOffset);
  48. mod.UVScale = EditorGUILayout.Vector2Field("UV Scale", mod.UVScale);
  49. EditorGUILayout.EndToggleGroup();
  50. mod.showgizmos = EditorGUILayout.Toggle("Show Gizmos", mod.showgizmos);
  51. mod.showlabels = EditorGUILayout.Toggle("Show Labels", mod.showlabels);
  52. mod.latticecol = EditorGUILayout.ColorField("Lattice Color", mod.latticecol);
  53. mod.positionhandles = EditorGUILayout.Toggle("Position Handles", mod.positionhandles);
  54. mod.handlesize = EditorGUILayout.FloatField("Handle Size", mod.handlesize);
  55. mod.snap = EditorGUILayout.Vector2Field("Snap", mod.snap);
  56. mod.align = EditorGUILayout.Toggle("Align", mod.align);
  57. //mod.scale = EditorGUILayout.FloatField("Scale", mod.scale);
  58. mod.showlatticepoints = EditorGUILayout.Foldout(mod.showlatticepoints, "Lattice Points");
  59. mod.switchtime = EditorGUILayout.FloatField("Switch Time", mod.switchtime);
  60. mod.animateWarps = EditorGUILayout.Toggle("Animate Warps", mod.animateWarps);
  61. if ( mod.showlatticepoints )
  62. {
  63. mod.p11 = EditorGUILayout.Vector2Field("p11", mod.p11);
  64. mod.p12 = EditorGUILayout.Vector2Field("p12", mod.p12);
  65. mod.p13 = EditorGUILayout.Vector2Field("p13", mod.p13);
  66. mod.p14 = EditorGUILayout.Vector2Field("p14", mod.p14);
  67. mod.p21 = EditorGUILayout.Vector2Field("p21", mod.p21);
  68. mod.p22 = EditorGUILayout.Vector2Field("p22", mod.p22);
  69. mod.p23 = EditorGUILayout.Vector2Field("p23", mod.p23);
  70. mod.p24 = EditorGUILayout.Vector2Field("p24", mod.p24);
  71. mod.p31 = EditorGUILayout.Vector2Field("p31", mod.p31);
  72. mod.p32 = EditorGUILayout.Vector2Field("p32", mod.p32);
  73. mod.p33 = EditorGUILayout.Vector2Field("p33", mod.p33);
  74. mod.p34 = EditorGUILayout.Vector2Field("p34", mod.p34);
  75. mod.p41 = EditorGUILayout.Vector2Field("p41", mod.p41);
  76. mod.p42 = EditorGUILayout.Vector2Field("p42", mod.p42);
  77. mod.p43 = EditorGUILayout.Vector2Field("p43", mod.p43);
  78. mod.p44 = EditorGUILayout.Vector2Field("p44", mod.p44);
  79. }
  80. mod.destwarp = EditorGUILayout.IntField("Dest Warp", mod.destwarp);
  81. int currentwarp = EditorGUILayout.IntSlider("Warp", mod.currentwarp, 0, mod.warps.Count - 1);
  82. if ( currentwarp != mod.currentwarp )
  83. {
  84. mod.SetWarp(currentwarp);
  85. }
  86. //mod.useWarpValue = EditorGUILayout.BeginToggleGroup("Use Warp Value", mod.useWarpValue);
  87. //mod.warpValue = EditorGUILayout.Slider("Warp Value", mod.warpValue, 0.0f, (float)(mod.warps.Count - 1));
  88. //EditorGUILayout.EndToggleGroup();
  89. EditorGUILayout.BeginHorizontal();
  90. if ( GUILayout.Button("Add Warp") )
  91. {
  92. mod.AddWarp();
  93. }
  94. if ( GUILayout.Button("Reset") )
  95. {
  96. mod.Reset();
  97. }
  98. EditorGUILayout.EndHorizontal();
  99. for ( int i = 0; i < mod.warps.Count; i++ )
  100. {
  101. EditorGUILayout.BeginHorizontal();
  102. mod.warps[i].name = EditorGUILayout.TextField("", mod.warps[i].name);
  103. //mod.meshes[i].Enabled = EditorGUILayout.Toggle("", mod.meshes[i].Enabled, GUILayout.MaxWidth(20));
  104. if ( GUILayout.Button("Set", GUILayout.MaxWidth(50)) )
  105. {
  106. mod.SetWarp(i);
  107. EditorUtility.SetDirty(mod);
  108. }
  109. if ( GUILayout.Button("Update", GUILayout.MaxWidth(50)) )
  110. {
  111. mod.UpdateWarp(i);
  112. }
  113. if ( GUILayout.Button("Delete", GUILayout.MaxWidth(50)) )
  114. mod.warps.RemoveAt(i);
  115. EditorGUILayout.EndHorizontal();
  116. }
  117. if ( GUI.changed ) //rebuild )
  118. {
  119. mod.Rebuild();
  120. EditorUtility.SetDirty(target);
  121. }
  122. }
  123. public void OnSceneGUI()
  124. {
  125. MegaBezPatch mod = (MegaBezPatch)target;
  126. if ( mod.showgizmos )
  127. {
  128. Handles.matrix = mod.transform.localToWorldMatrix;
  129. Handles.color = mod.latticecol;
  130. Handles.DrawLine(mod.p11, mod.p12);
  131. Handles.DrawLine(mod.p12, mod.p13);
  132. Handles.DrawLine(mod.p13, mod.p14);
  133. if ( !mod.align )
  134. {
  135. Handles.DrawLine(mod.p21, mod.p22);
  136. Handles.DrawLine(mod.p22, mod.p23);
  137. Handles.DrawLine(mod.p23, mod.p24);
  138. Handles.DrawLine(mod.p31, mod.p32);
  139. Handles.DrawLine(mod.p32, mod.p33);
  140. Handles.DrawLine(mod.p33, mod.p34);
  141. }
  142. Handles.DrawLine(mod.p41, mod.p42);
  143. Handles.DrawLine(mod.p42, mod.p43);
  144. Handles.DrawLine(mod.p43, mod.p44);
  145. Handles.DrawLine(mod.p11, mod.p21);
  146. Handles.DrawLine(mod.p21, mod.p31);
  147. Handles.DrawLine(mod.p31, mod.p41);
  148. if ( !mod.align )
  149. {
  150. Handles.DrawLine(mod.p12, mod.p22);
  151. Handles.DrawLine(mod.p22, mod.p32);
  152. Handles.DrawLine(mod.p32, mod.p42);
  153. Handles.DrawLine(mod.p13, mod.p23);
  154. Handles.DrawLine(mod.p23, mod.p33);
  155. Handles.DrawLine(mod.p33, mod.p43);
  156. }
  157. Handles.DrawLine(mod.p14, mod.p24);
  158. Handles.DrawLine(mod.p24, mod.p34);
  159. Handles.DrawLine(mod.p34, mod.p44);
  160. Quaternion rot = Quaternion.identity;
  161. if ( mod.showlabels )
  162. {
  163. Handles.Label(mod.p11, "11 " + mod.p11.ToString("0.00"));
  164. Handles.Label(mod.p14, "14 " + mod.p14.ToString("0.00"));
  165. Handles.Label(mod.p41, "41 " + mod.p41.ToString("0.00"));
  166. Handles.Label(mod.p44, "44 " + mod.p44.ToString("0.00"));
  167. if ( !mod.align )
  168. {
  169. Handles.Label(mod.p12, "12 " + mod.p12.ToString("0.00"));
  170. Handles.Label(mod.p13, "13 " + mod.p13.ToString("0.00"));
  171. Handles.Label(mod.p21, "21 " + mod.p21.ToString("0.00"));
  172. Handles.Label(mod.p22, "22 " + mod.p22.ToString("0.00"));
  173. Handles.Label(mod.p23, "23 " + mod.p23.ToString("0.00"));
  174. Handles.Label(mod.p24, "24 " + mod.p24.ToString("0.00"));
  175. Handles.Label(mod.p31, "31 " + mod.p31.ToString("0.00"));
  176. Handles.Label(mod.p32, "32 " + mod.p32.ToString("0.00"));
  177. Handles.Label(mod.p33, "33 " + mod.p33.ToString("0.00"));
  178. Handles.Label(mod.p34, "34 " + mod.p34.ToString("0.00"));
  179. Handles.Label(mod.p42, "42 " + mod.p42.ToString("0.00"));
  180. Handles.Label(mod.p43, "43 " + mod.p43.ToString("0.00"));
  181. }
  182. }
  183. Vector3 p11 = mod.p11;
  184. Vector3 p12 = mod.p12;
  185. Vector3 p13 = mod.p13;
  186. Vector3 p14 = mod.p14;
  187. Vector3 p21 = mod.p21;
  188. Vector3 p22 = mod.p22;
  189. Vector3 p23 = mod.p23;
  190. Vector3 p24 = mod.p24;
  191. Vector3 p31 = mod.p31;
  192. Vector3 p32 = mod.p32;
  193. Vector3 p33 = mod.p33;
  194. Vector3 p34 = mod.p34;
  195. Vector3 p41 = mod.p41;
  196. Vector3 p42 = mod.p42;
  197. Vector3 p43 = mod.p43;
  198. Vector3 p44 = mod.p44;
  199. if ( mod.positionhandles )
  200. {
  201. mod.p11 = Handles.PositionHandle(p11, rot);
  202. mod.p14 = Handles.PositionHandle(p14, rot);
  203. mod.p41 = Handles.PositionHandle(p41, rot);
  204. mod.p44 = Handles.PositionHandle(p44, rot);
  205. if ( !mod.align )
  206. {
  207. mod.p12 = Handles.PositionHandle(p12, rot);
  208. mod.p13 = Handles.PositionHandle(p13, rot);
  209. mod.p21 = Handles.PositionHandle(p21, rot);
  210. mod.p22 = Handles.PositionHandle(p22, rot);
  211. mod.p23 = Handles.PositionHandle(p23, rot);
  212. mod.p24 = Handles.PositionHandle(p24, rot);
  213. mod.p31 = Handles.PositionHandle(p31, rot);
  214. mod.p32 = Handles.PositionHandle(p32, rot);
  215. mod.p33 = Handles.PositionHandle(p33, rot);
  216. mod.p34 = Handles.PositionHandle(p34, rot);
  217. mod.p42 = Handles.PositionHandle(p42, rot);
  218. mod.p43 = Handles.PositionHandle(p43, rot);
  219. }
  220. }
  221. else
  222. {
  223. Handles.color = Color.green;
  224. #if UNITY_5_6 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  225. mod.p11 = Handles.FreeMoveHandle(p11, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  226. mod.p14 = Handles.FreeMoveHandle(p14, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  227. mod.p41 = Handles.FreeMoveHandle(p41, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  228. mod.p44 = Handles.FreeMoveHandle(p44, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  229. if ( !mod.align )
  230. {
  231. mod.p12 = Handles.FreeMoveHandle(p12, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  232. mod.p13 = Handles.FreeMoveHandle(p13, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  233. mod.p21 = Handles.FreeMoveHandle(p21, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  234. mod.p22 = Handles.FreeMoveHandle(p22, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  235. mod.p23 = Handles.FreeMoveHandle(p23, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  236. mod.p24 = Handles.FreeMoveHandle(p24, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  237. mod.p31 = Handles.FreeMoveHandle(p31, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  238. mod.p32 = Handles.FreeMoveHandle(p32, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  239. mod.p33 = Handles.FreeMoveHandle(p33, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  240. mod.p34 = Handles.FreeMoveHandle(p34, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  241. mod.p42 = Handles.FreeMoveHandle(p42, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  242. mod.p43 = Handles.FreeMoveHandle(p43, rot, mod.handlesize, mod.snap, Handles.SphereHandleCap);
  243. }
  244. #else
  245. mod.p11 = Handles.FreeMoveHandle(p11 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  246. mod.p14 = Handles.FreeMoveHandle(p14 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  247. mod.p41 = Handles.FreeMoveHandle(p41 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  248. mod.p44 = Handles.FreeMoveHandle(p44 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  249. if ( !mod.align )
  250. {
  251. mod.p12 = Handles.FreeMoveHandle(p12 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  252. mod.p13 = Handles.FreeMoveHandle(p13 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  253. mod.p21 = Handles.FreeMoveHandle(p21 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  254. mod.p22 = Handles.FreeMoveHandle(p22 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  255. mod.p23 = Handles.FreeMoveHandle(p23 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  256. mod.p24 = Handles.FreeMoveHandle(p24 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  257. mod.p31 = Handles.FreeMoveHandle(p31 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  258. mod.p32 = Handles.FreeMoveHandle(p32 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  259. mod.p33 = Handles.FreeMoveHandle(p33 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  260. mod.p34 = Handles.FreeMoveHandle(p34 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  261. mod.p42 = Handles.FreeMoveHandle(p42 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  262. mod.p43 = Handles.FreeMoveHandle(p43 * mod.scale, rot, mod.handlesize, mod.snap, Handles.SphereCap) / mod.scale;
  263. }
  264. #endif
  265. }
  266. bool dirty = false;
  267. if ( p11 != mod.p11 ) dirty = true;
  268. if ( p12 != mod.p12 ) dirty = true;
  269. if ( p13 != mod.p13 ) dirty = true;
  270. if ( p14 != mod.p14 ) dirty = true;
  271. if ( p21 != mod.p21 ) dirty = true;
  272. if ( p22 != mod.p22 ) dirty = true;
  273. if ( p23 != mod.p23 ) dirty = true;
  274. if ( p24 != mod.p24 ) dirty = true;
  275. if ( p31 != mod.p31 ) dirty = true;
  276. if ( p32 != mod.p32 ) dirty = true;
  277. if ( p33 != mod.p33 ) dirty = true;
  278. if ( p34 != mod.p34 ) dirty = true;
  279. if ( p41 != mod.p41 ) dirty = true;
  280. if ( p42 != mod.p42 ) dirty = true;
  281. if ( p43 != mod.p43 ) dirty = true;
  282. if ( p44 != mod.p44 ) dirty = true;
  283. if ( dirty )
  284. EditorUtility.SetDirty(target);
  285. #if false
  286. Handles.Label(mod.p11, "11");
  287. mod.p11 = Handles.PositionHandle(mod.p11, rot);
  288. Handles.Label(mod.p12, "12");
  289. mod.p12 = Handles.PositionHandle(mod.p12, rot);
  290. Handles.Label(mod.p13, "13");
  291. mod.p13 = Handles.PositionHandle(mod.p13, rot);
  292. Handles.Label(mod.p14, "14");
  293. mod.p14 = Handles.PositionHandle(mod.p14, rot);
  294. Handles.Label(mod.p21, "21");
  295. mod.p21 = Handles.PositionHandle(mod.p21, rot);
  296. Handles.Label(mod.p22, "22");
  297. mod.p22 = Handles.PositionHandle(mod.p22, rot);
  298. Handles.Label(mod.p23, "23");
  299. mod.p23 = Handles.PositionHandle(mod.p23, rot);
  300. Handles.Label(mod.p24, "24");
  301. mod.p24 = Handles.PositionHandle(mod.p24, rot);
  302. Handles.Label(mod.p31, "31");
  303. mod.p31 = Handles.PositionHandle(mod.p31, rot);
  304. Handles.Label(mod.p32, "32");
  305. mod.p32 = Handles.PositionHandle(mod.p32, rot);
  306. Handles.Label(mod.p33, "33");
  307. mod.p33 = Handles.PositionHandle(mod.p33, rot);
  308. Handles.Label(mod.p34, "34");
  309. mod.p34 = Handles.PositionHandle(mod.p34, rot);
  310. Handles.Label(mod.p41, "41");
  311. mod.p41 = Handles.PositionHandle(mod.p41, rot);
  312. Handles.Label(mod.p42, "42");
  313. mod.p42 = Handles.PositionHandle(mod.p42, rot);
  314. Handles.Label(mod.p43, "43");
  315. mod.p43 = Handles.PositionHandle(mod.p43, rot);
  316. Handles.Label(mod.p44, "44");
  317. mod.p44 = Handles.PositionHandle(mod.p44, rot);
  318. #endif
  319. }
  320. mod.p11.z = 0.0f;
  321. mod.p12.z = 0.0f;
  322. mod.p13.z = 0.0f;
  323. mod.p14.z = 0.0f;
  324. mod.p21.z = 0.0f;
  325. mod.p22.z = 0.0f;
  326. mod.p23.z = 0.0f;
  327. mod.p24.z = 0.0f;
  328. mod.p31.z = 0.0f;
  329. mod.p32.z = 0.0f;
  330. mod.p33.z = 0.0f;
  331. mod.p34.z = 0.0f;
  332. mod.p41.z = 0.0f;
  333. mod.p42.z = 0.0f;
  334. mod.p43.z = 0.0f;
  335. mod.p44.z = 0.0f;
  336. }
  337. }