EditorInspectorUtility.cs 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace MagicaCloth
  7. {
  8. /// <summary>
  9. /// Editorインスペクタ表示に関するユーティリティ
  10. /// </summary>
  11. public static class EditorInspectorUtility
  12. {
  13. /// <summary>
  14. /// 現在のデータ状態をインスペクタにヘルプボックスで表示する
  15. /// </summary>
  16. /// <param name="istatus"></param>
  17. public static void DispDataStatus(IDataVerify verify)
  18. {
  19. if (verify == null)
  20. return;
  21. var code = verify.VerifyData();
  22. //bool valid = verify.VerifyData() == Define.Error.None;
  23. //var mestype = valid ? MessageType.Info : MessageType.Error;
  24. var mestype = MessageType.Info;
  25. if (Define.IsWarning(code))
  26. mestype = MessageType.Warning;
  27. if (Define.IsError(code))
  28. mestype = MessageType.Error;
  29. EditorGUILayout.HelpBox(verify.GetInformation(), mestype);
  30. }
  31. /// <summary>
  32. /// 現在のデータバージョン状態をインスペクタにヘルプボックスで表示する
  33. /// </summary>
  34. /// <param name="core"></param>
  35. public static void DispVersionStatus(CoreComponent core)
  36. {
  37. // Data Version
  38. var code = core.VerifyDataVersion();
  39. if (Define.IsNormal(code) == false)
  40. EditorGUILayout.HelpBox(Define.GetErrorMessage(code), MessageType.Warning);
  41. // Algorithm Version
  42. var cloth = core as BaseCloth;
  43. if (cloth != null)
  44. {
  45. code = cloth.VerifyAlgorithmVersion();
  46. if (Define.IsNormal(code) == false)
  47. EditorGUILayout.HelpBox(Define.GetErrorMessage(code), MessageType.Warning);
  48. }
  49. }
  50. //===============================================================================
  51. /// <summary>
  52. /// ベジェ曲線パラメータのインスペクタ描画と変更操作
  53. /// </summary>
  54. /// <param name="title">パラメータ名</param>
  55. /// <param name="bval">ベジェ曲線パラメータクラス</param>
  56. /// <param name="minVal">ベジェ曲線の最小値</param>
  57. /// <param name="maxVal">ベジェ曲線の最大値</param>
  58. /// <param name="valFmt">パラメータ表示浮動小数点数フォーマット</param>
  59. /// <returns></returns>
  60. public static void BezierInspector(
  61. string title,
  62. SerializedProperty bval,
  63. float minVal,
  64. float maxVal,
  65. string valFmt = "F2"
  66. )
  67. {
  68. var startValue = bval.FindPropertyRelative("startValue");
  69. var endValue = bval.FindPropertyRelative("endValue");
  70. var curveValue = bval.FindPropertyRelative("curveValue");
  71. var useEndValue = bval.FindPropertyRelative("useEndValue");
  72. var useCurveValue = bval.FindPropertyRelative("useCurveValue");
  73. // グラフ描画
  74. float sv, ev, cv;
  75. GetBezierValue(bval, out sv, out ev, out cv);
  76. DrawGraph(sv, ev, cv, minVal, maxVal, valFmt);
  77. // パラメータ
  78. EditorGUILayout.BeginHorizontal();
  79. EditorGUILayout.LabelField("", GUILayout.Width(32));
  80. EditorGUILayout.Slider(startValue, minVal, maxVal, "start");
  81. EditorGUILayout.EndHorizontal();
  82. EditorGUILayout.BeginHorizontal();
  83. useEndValue.boolValue = EditorGUILayout.Toggle(useEndValue.boolValue, GUILayout.Width(32));
  84. EditorGUI.BeginDisabledGroup(!useEndValue.boolValue);
  85. EditorGUILayout.Slider(endValue, minVal, maxVal, "end");
  86. EditorGUI.EndDisabledGroup();
  87. EditorGUILayout.EndHorizontal();
  88. EditorGUILayout.BeginHorizontal();
  89. useCurveValue.boolValue = EditorGUILayout.Toggle(useCurveValue.boolValue, GUILayout.Width(32));
  90. EditorGUI.BeginDisabledGroup(!useCurveValue.boolValue || !useEndValue.boolValue);
  91. EditorGUILayout.Slider(curveValue, -1.0f, 1.0f, "curve");
  92. EditorGUI.EndDisabledGroup();
  93. EditorGUILayout.EndHorizontal();
  94. EditorGUILayout.Space();
  95. }
  96. static void GetBezierValue(SerializedProperty bval, out float start, out float end, out float curve)
  97. {
  98. var startValue = bval.FindPropertyRelative("startValue");
  99. var endValue = bval.FindPropertyRelative("endValue");
  100. var curveValue = bval.FindPropertyRelative("curveValue");
  101. var useEndValue = bval.FindPropertyRelative("useEndValue");
  102. var useCurveValue = bval.FindPropertyRelative("useCurveValue");
  103. start = startValue.floatValue;
  104. end = useEndValue.boolValue ? endValue.floatValue : start;
  105. curve = useCurveValue.boolValue && useEndValue.boolValue ? curveValue.floatValue : 0.0f;
  106. }
  107. // ベジェ曲線グラフ描画
  108. static void DrawGraph(float startVal, float endVal, float curveVal, float minVal, float maxVal, string valFmt)
  109. {
  110. EditorGUILayout.Space();
  111. // 表示領域
  112. const float headOffsetX = 40;
  113. const float tailOffsetX = 10;
  114. float w = GUILayoutUtility.GetLastRect().width;
  115. //Rect drect = GUILayoutUtility.GetRect(w, 100f);
  116. Rect drect = GUILayoutUtility.GetRect(w, 120f);
  117. //float indentWidth = EditorGUI.indentLevel * 16;
  118. //drect.x += indentWidth;
  119. //drect.width -= indentWidth;
  120. Rect area = new Rect(drect.x + headOffsetX, drect.y, drect.width - headOffsetX - tailOffsetX, drect.height);
  121. // grid
  122. Handles.color = new Color(1f, 1f, 1f, 0.5f);
  123. Handles.DrawLine(new Vector2(area.xMin, area.yMin), new Vector2(area.xMax, area.yMin));
  124. Handles.DrawLine(new Vector2(area.xMin, area.yMax), new Vector2(area.xMax, area.yMax));
  125. Handles.DrawLine(new Vector2(area.xMin, area.yMin), new Vector2(area.xMin, area.yMax));
  126. Handles.DrawLine(new Vector2(area.xMax, area.yMin), new Vector2(area.xMax, area.yMax));
  127. Handles.color = new Color(0.5f, 0.5f, 0.5f, 0.5f);
  128. Handles.DrawLine(new Vector2(area.xMin, (area.yMin + area.yMax) * 0.5f), new Vector2(area.xMax, (area.yMin + area.yMax) * 0.5f));
  129. Handles.DrawLine(new Vector2((area.xMin + area.xMax) * 0.5f, area.yMin), new Vector2((area.xMin + area.xMax) * 0.5f, area.yMax));
  130. // grid数値
  131. Handles.Label(new Vector3(drect.xMin, drect.yMin - 4), maxVal.ToString("F1"));
  132. Handles.Label(new Vector3(drect.xMin, drect.yMax - 12), minVal.ToString("F1"));
  133. // データ領域
  134. Rect vrect = new Rect(0.0f, minVal, 1.0f, maxVal - minVal);
  135. // データ領域での位置
  136. Vector3 svpos = Rect.PointToNormalized(vrect, new Vector2(0.0f, startVal));
  137. Vector3 evpos = Rect.PointToNormalized(vrect, new Vector2(1.0f, endVal));
  138. // 表示のためyを逆転
  139. svpos.y = 1.0f - svpos.y;
  140. evpos.y = 1.0f - evpos.y;
  141. // グラフ上の座標
  142. Vector3 spos = Rect.NormalizedToPoint(area, svpos);
  143. Vector3 epos = Rect.NormalizedToPoint(area, evpos);
  144. // 対角線計算用
  145. Vector3 spos0 = Rect.NormalizedToPoint(area, new Vector2(0.0f, evpos.y));
  146. Vector3 epos0 = Rect.NormalizedToPoint(area, new Vector2(1.0f, svpos.y));
  147. // ベジェ制御点(対角線を補間)
  148. Vector3 stan = Vector3.Lerp(spos0, epos0, curveVal * 0.5f + 0.5f);
  149. Vector3 etan = stan;
  150. // ベジェ描画
  151. Color bcol = GUI.enabled ? Color.green : new Color(0.0f, 0.5f, 0.0f, 1.0f);
  152. Handles.DrawBezier(spos, epos, stan, etan, bcol, null, 2.0f);
  153. // 両端値
  154. Handles.Label(spos, startVal.ToString(valFmt));
  155. Handles.Label(epos + new Vector3(-38, 0, 0), endVal.ToString(valFmt));
  156. #if false
  157. // 制御点描画
  158. Handles.color = Color.red;
  159. Handles.DrawWireCube(stan, Vector3.one * 2);
  160. #endif
  161. EditorGUILayout.Space();
  162. EditorGUILayout.Space();
  163. }
  164. //===============================================================================
  165. /// <summary>
  166. /// 折りたたみ制御
  167. /// </summary>
  168. /// <param name="foldKey">折りたたみ保存キー</param>
  169. /// <param name="title"></param>
  170. /// <param name="drawAct">内容描画アクション</param>
  171. /// <param name="enableAct">有効フラグアクション(null=無効)</param>
  172. /// <param name="enable">現在の有効フラグ</param>
  173. public static void Foldout(
  174. string foldKey,
  175. string title = null,
  176. System.Action drawAct = null,
  177. System.Action<bool> enableAct = null,
  178. bool enable = false,
  179. bool warning = false
  180. )
  181. {
  182. var style = new GUIStyle("ShurikenModuleTitle");
  183. style.font = new GUIStyle(EditorStyles.label).font;
  184. style.border = new RectOffset(15, 7, 4, 4);
  185. style.fixedHeight = 22;
  186. style.contentOffset = new Vector2(20f, -2f);
  187. var rect = GUILayoutUtility.GetRect(16f, 22f, style);
  188. GUI.backgroundColor = warning ? Color.yellow : Color.white;
  189. GUI.Box(rect, title, style);
  190. GUI.backgroundColor = Color.white;
  191. var e = Event.current;
  192. bool foldOut = EditorPrefs.GetBool(foldKey);
  193. if (enableAct == null)
  194. {
  195. if (e.type == EventType.Repaint)
  196. {
  197. var toggleRect = new Rect(rect.x + 4f, rect.y + 2f, 13f, 13f);
  198. EditorStyles.foldout.Draw(toggleRect, false, false, foldOut, false);
  199. }
  200. }
  201. else
  202. {
  203. // 有効チェック
  204. var toggleRect = new Rect(rect.x + 4f, rect.y + 4f, 13f, 13f);
  205. bool sw = GUI.Toggle(toggleRect, enable, string.Empty, new GUIStyle("ShurikenCheckMark"));
  206. if (sw != enable)
  207. {
  208. enableAct(sw);
  209. }
  210. }
  211. if (e.type == EventType.MouseDown && rect.Contains(e.mousePosition))
  212. {
  213. foldOut = !foldOut;
  214. EditorPrefs.SetBool(foldKey, foldOut);
  215. e.Use();
  216. }
  217. if (foldOut && drawAct != null)
  218. {
  219. drawAct();
  220. }
  221. }
  222. /// <summary>
  223. /// タイトルバーのみ表示
  224. /// </summary>
  225. /// <param name="title"></param>
  226. /// <param name="warning"></param>
  227. public static void TitleBar(string title, bool warning)
  228. {
  229. var style = new GUIStyle("ShurikenModuleTitle");
  230. style.font = new GUIStyle(EditorStyles.label).font;
  231. style.border = new RectOffset(15, 7, 4, 4);
  232. style.fixedHeight = 22;
  233. style.contentOffset = new Vector2(20f, -2f);
  234. var rect = GUILayoutUtility.GetRect(16f, 22f, style);
  235. GUI.backgroundColor = warning ? Color.yellow : Color.white;
  236. GUI.Box(rect, title, style);
  237. GUI.backgroundColor = Color.white;
  238. }
  239. //===============================================================================
  240. static bool MinMaxCurveInspector(string title, string valueName, SerializedProperty bval, float minval, float maxval)
  241. {
  242. EditorGUI.BeginChangeCheck();
  243. float sv, ev, cv;
  244. GetBezierValue(bval, out sv, out ev, out cv);
  245. StaticStringBuilder.Clear();
  246. StaticStringBuilder.Append(title, " [", sv, "/", ev, "]");
  247. Foldout(title, StaticStringBuilder.ToString(), () =>
  248. {
  249. if (string.IsNullOrEmpty(valueName) == false)
  250. EditorGUILayout.LabelField(valueName);
  251. BezierInspector(title, bval, minval, maxval);
  252. });
  253. return EditorGUI.EndChangeCheck();
  254. }
  255. static bool UseMinMaxCurveInspector(
  256. string title,
  257. SerializedProperty use,
  258. string valueName,
  259. SerializedProperty bval, float minval, float maxval,
  260. string valFmt = "F2",
  261. bool warning = false
  262. )
  263. {
  264. EditorGUI.BeginChangeCheck();
  265. float sv, ev, cv;
  266. GetBezierValue(bval, out sv, out ev, out cv);
  267. StaticStringBuilder.Clear();
  268. StaticStringBuilder.Append(title, " [", sv, "/", ev, "]");
  269. bool wuse = use.boolValue;
  270. Foldout(title, StaticStringBuilder.ToString(),
  271. () =>
  272. {
  273. if (string.IsNullOrEmpty(valueName) == false)
  274. EditorGUILayout.LabelField(valueName);
  275. EditorGUI.BeginDisabledGroup(!wuse);
  276. BezierInspector(title, bval, minval, maxval, valFmt);
  277. EditorGUI.EndDisabledGroup();
  278. },
  279. (sw) =>
  280. {
  281. wuse = sw;
  282. },
  283. wuse,
  284. warning
  285. );
  286. use.boolValue = wuse;
  287. return EditorGUI.EndChangeCheck();
  288. }
  289. public static bool OneSliderInspector(
  290. string title,
  291. string name1, SerializedProperty property1, float min1, float max1
  292. )
  293. {
  294. EditorGUI.BeginChangeCheck();
  295. StaticStringBuilder.Clear();
  296. StaticStringBuilder.Append(title, " [", property1.floatValue, "]");
  297. Foldout(title, StaticStringBuilder.ToString(),
  298. () =>
  299. {
  300. EditorGUILayout.Slider(property1, min1, max1, name1);
  301. }
  302. );
  303. return EditorGUI.EndChangeCheck();
  304. }
  305. public static bool TwoSliderInspector(
  306. string title,
  307. string name1, SerializedProperty property1, float min1, float max1,
  308. string name2, SerializedProperty property2, float min2, float max2
  309. )
  310. {
  311. EditorGUI.BeginChangeCheck();
  312. StaticStringBuilder.Clear();
  313. StaticStringBuilder.Append(title, " [", property1.floatValue, "/", property2.floatValue, "]");
  314. Foldout(title, StaticStringBuilder.ToString(),
  315. () =>
  316. {
  317. EditorGUILayout.Slider(property1, min1, max1, name1);
  318. EditorGUILayout.Slider(property2, min2, max2, name2);
  319. }
  320. );
  321. return EditorGUI.EndChangeCheck();
  322. }
  323. public static bool UseOneSliderInspector(
  324. string title, SerializedProperty use,
  325. string name1, SerializedProperty val1, float min1, float max1
  326. )
  327. {
  328. EditorGUI.BeginChangeCheck();
  329. StaticStringBuilder.Clear();
  330. StaticStringBuilder.Append(title, " [", val1.floatValue, "]");
  331. bool workuse = use.boolValue;
  332. Foldout(title, StaticStringBuilder.ToString(),
  333. () =>
  334. {
  335. EditorGUI.BeginDisabledGroup(!workuse);
  336. EditorGUILayout.Slider(val1, min1, max1, name1);
  337. EditorGUI.EndDisabledGroup();
  338. },
  339. (sw) =>
  340. {
  341. workuse = sw;
  342. },
  343. workuse
  344. );
  345. use.boolValue = workuse;
  346. return EditorGUI.EndChangeCheck();
  347. }
  348. public static bool UseTwoSliderInspector(
  349. string title, SerializedProperty use,
  350. string name1, SerializedProperty val1, float min1, float max1,
  351. string name2, SerializedProperty val2, float min2, float max2
  352. )
  353. {
  354. EditorGUI.BeginChangeCheck();
  355. StaticStringBuilder.Clear();
  356. StaticStringBuilder.Append(title, " [", val1.floatValue, "/", val2.floatValue, "]");
  357. bool workuse = use.boolValue;
  358. Foldout(title, StaticStringBuilder.ToString(),
  359. () =>
  360. {
  361. EditorGUI.BeginDisabledGroup(!workuse);
  362. EditorGUILayout.Slider(val1, min1, max1, name1);
  363. EditorGUILayout.Slider(val2, min2, max2, name2);
  364. EditorGUI.EndDisabledGroup();
  365. },
  366. (sw) =>
  367. {
  368. workuse = sw;
  369. },
  370. workuse
  371. );
  372. use.boolValue = workuse;
  373. return EditorGUI.EndChangeCheck();
  374. }
  375. //===============================================================================
  376. public static bool AlgorithmInspector(SerializedProperty cparam, bool changed, System.Action convertAction)
  377. {
  378. EditorGUI.BeginChangeCheck();
  379. //TitleBar("Algorithm", changed);
  380. var algo = cparam.FindPropertyRelative("algorithm");
  381. var algoType = (ClothParams.Algorithm)algo.enumValueIndex;
  382. bool isPlaying = EditorApplication.isPlaying;
  383. const string title = "Algorithm";
  384. StaticStringBuilder.Clear();
  385. StaticStringBuilder.Append(title, " [", algoType, "]");
  386. Foldout(title, StaticStringBuilder.ToString(),
  387. () =>
  388. {
  389. EditorGUI.BeginDisabledGroup(isPlaying);
  390. EditorGUILayout.PropertyField(algo, new GUIContent("Algorithm"));
  391. EditorGUI.EndDisabledGroup();
  392. switch (algoType)
  393. {
  394. case ClothParams.Algorithm.Algorithm_1:
  395. EditorGUILayout.HelpBox("This algorithm is deprecated.\nPlease use the more stable algorithm 2.\nAlgorithm 1 will be removed in the future.", MessageType.Warning);
  396. break;
  397. case ClothParams.Algorithm.Algorithm_2:
  398. EditorGUILayout.HelpBox("Algorithm 2 was introduced from v1.11.0.\nClampRotation / RestoreRotation / TriangleBend will be more stable.\nHowever, the parameters need to be readjusted.", MessageType.Info);
  399. break;
  400. }
  401. // Convert
  402. if (algoType == ClothParams.Algorithm.Algorithm_2)
  403. {
  404. EditorGUI.BeginDisabledGroup(isPlaying);
  405. EditorGUILayout.Space();
  406. using (var horizontalScope = new GUILayout.HorizontalScope())
  407. {
  408. EditorGUILayout.Space();
  409. if (GUILayout.Button("Convert To Latest Algorithm Parameters", GUILayout.Width(300)))
  410. {
  411. if (EditorUtility.DisplayDialog("Parameter conversion", "Converts the parameters of an old algorithm to the latest algorithm.", "Ok", "Cancel"))
  412. {
  413. //Debug.Log("OK!");
  414. convertAction?.Invoke();
  415. }
  416. }
  417. EditorGUILayout.Space();
  418. }
  419. EditorGUILayout.Space();
  420. EditorGUILayout.HelpBox("Parameters of old algorithms can be converted to the latest algorithms.\nNote, however, that the same parameter may work slightly differently depending on the algorithm.", MessageType.Info);
  421. EditorGUILayout.Space();
  422. EditorGUI.EndDisabledGroup();
  423. }
  424. },
  425. warning: changed
  426. );
  427. return EditorGUI.EndChangeCheck();
  428. }
  429. public static bool WorldInfluenceInspector(SerializedProperty cparam, bool changed)
  430. {
  431. EditorGUI.BeginChangeCheck();
  432. var influenceTarget = cparam.FindPropertyRelative("influenceTarget");
  433. var moveInfluence = cparam.FindPropertyRelative("worldMoveInfluence");
  434. var rotInfluence = cparam.FindPropertyRelative("worldRotationInfluence");
  435. var maxSpeed = cparam.FindPropertyRelative("maxMoveSpeed");
  436. var maxRotationSpeed = cparam.FindPropertyRelative("maxRotationSpeed");
  437. var useTeleport = cparam.FindPropertyRelative("useResetTeleport");
  438. var teleportDistance = cparam.FindPropertyRelative("teleportDistance");
  439. var teleportRotation = cparam.FindPropertyRelative("teleportRotation");
  440. var teleportMode = cparam.FindPropertyRelative("teleportMode");
  441. var stabilizationTime = cparam.FindPropertyRelative("resetStabilizationTime");
  442. float ms, me, mc;
  443. GetBezierValue(moveInfluence, out ms, out me, out mc);
  444. float rs, re, rc;
  445. GetBezierValue(rotInfluence, out rs, out re, out rc);
  446. const string title = "World Influence";
  447. StaticStringBuilder.Clear();
  448. StaticStringBuilder.Append(title, " [", ms, "/", me, "] [", rs, "/", re, "]");
  449. Foldout(title, StaticStringBuilder.ToString(),
  450. () =>
  451. {
  452. EditorGUILayout.PropertyField(influenceTarget);
  453. EditorGUILayout.Slider(maxSpeed, 0.0f, 20.0f, "Max Move Speed");
  454. EditorGUILayout.LabelField("Movement Influence");
  455. BezierInspector("Move Influence", moveInfluence, 0.0f, 1.0f);
  456. EditorGUILayout.Slider(maxRotationSpeed, 0.0f, 720.0f, "Max Rotation Speed");
  457. EditorGUILayout.LabelField("Rotation Influence");
  458. BezierInspector("Rotation Influence", rotInfluence, 0.0f, 1.0f);
  459. useTeleport.boolValue = EditorGUILayout.Toggle("Reset After Teleport", useTeleport.boolValue);
  460. EditorGUI.BeginDisabledGroup(!useTeleport.boolValue);
  461. EditorGUILayout.PropertyField(teleportMode);
  462. EditorGUILayout.Slider(teleportDistance, 0.0f, 1.0f, "Teleport Distance");
  463. EditorGUILayout.Slider(teleportRotation, 0.0f, 180.0f, "Teleport Rotation");
  464. EditorGUI.EndDisabledGroup();
  465. EditorGUILayout.Space();
  466. //EditorGUILayout.LabelField("Stabilize After Reset");
  467. //EditorGUILayout.Slider(stabilizationTime, 0.0f, 3.0f, "Stabilization Time");
  468. EditorGUILayout.Slider(stabilizationTime, 0.0f, 1.0f, "Stabilization Time After Reset");
  469. },
  470. warning: changed
  471. );
  472. return EditorGUI.EndChangeCheck();
  473. }
  474. public static bool DistanceDisableInspector(SerializedProperty cparam, bool changed)
  475. {
  476. EditorGUI.BeginChangeCheck();
  477. var use = cparam.FindPropertyRelative("useDistanceDisable");
  478. var referenceObject = cparam.FindPropertyRelative("disableReferenceObject");
  479. var disableDisance = cparam.FindPropertyRelative("disableDistance");
  480. var fadeDistance = cparam.FindPropertyRelative("disableFadeDistance");
  481. const string title = "Distance Disable";
  482. StaticStringBuilder.Clear();
  483. StaticStringBuilder.Append(title);
  484. Foldout(title, StaticStringBuilder.ToString(),
  485. () =>
  486. {
  487. EditorGUI.BeginDisabledGroup(!use.boolValue);
  488. EditorGUILayout.HelpBox("If Reference Object is [None], the main camera is referred.", MessageType.None);
  489. //EditorGUILayout.PropertyField(referenceObject);
  490. referenceObject.objectReferenceValue = EditorGUILayout.ObjectField("Reference Object", referenceObject.objectReferenceValue, typeof(Transform), true);
  491. EditorGUILayout.Slider(disableDisance, 0.0f, 100.0f, "Distance");
  492. EditorGUILayout.Slider(fadeDistance, 0.0f, 10.0f, "Fade Distance");
  493. EditorGUI.EndDisabledGroup();
  494. },
  495. (sw) =>
  496. {
  497. use.boolValue = sw;
  498. },
  499. use.boolValue,
  500. changed
  501. );
  502. return EditorGUI.EndChangeCheck();
  503. }
  504. public static bool ExternalForceInspector(SerializedProperty cparam)
  505. {
  506. EditorGUI.BeginChangeCheck();
  507. //var massInfluence = cparam.FindPropertyRelative("massInfluence");
  508. var depthInfluence = cparam.FindPropertyRelative("depthInfluence");
  509. var windInfluence = cparam.FindPropertyRelative("windInfluence");
  510. var windRandomScale = cparam.FindPropertyRelative("windRandomScale");
  511. var windSynchronization = cparam.FindPropertyRelative("windSynchronization");
  512. const string title = "External Force";
  513. StaticStringBuilder.Clear();
  514. StaticStringBuilder.Append(title);
  515. Foldout(title, StaticStringBuilder.ToString(),
  516. () =>
  517. {
  518. //EditorGUILayout.Slider(massInfluence, 0.0f, 1.0f, "Mass Influence");
  519. //EditorGUILayout.LabelField("Wind");
  520. EditorGUILayout.LabelField("Depth Influence");
  521. BezierInspector("Depth Influence", depthInfluence, 0.0f, 1.0f, "F2");
  522. EditorGUILayout.Space();
  523. EditorGUILayout.Slider(windInfluence, 0.0f, 2.0f, "Wind Influence");
  524. EditorGUILayout.Slider(windSynchronization, 0.0f, 1.0f, "Wind Synchronization");
  525. EditorGUILayout.Slider(windRandomScale, 0.0f, 1.0f, "Wind Random Scale");
  526. }
  527. );
  528. return EditorGUI.EndChangeCheck();
  529. }
  530. public static bool RadiusInspector(SerializedProperty cparam)
  531. {
  532. return MinMaxCurveInspector("Radius", "Radius", cparam.FindPropertyRelative("radius"), 0.001f, 0.3f);
  533. }
  534. public static bool MassInspector(SerializedProperty cparam)
  535. {
  536. return MinMaxCurveInspector("Mass", "Mass", cparam.FindPropertyRelative("mass"), 1.0f, 20.0f);
  537. }
  538. public static bool GravityInspector(SerializedProperty cparam)
  539. {
  540. //return UseMinMaxCurveInspector("Gravity", cparam.FindPropertyRelative("useGravity"), "Gravity Acceleration", cparam.FindPropertyRelative("gravity"), -20.0f, 0.0f);
  541. EditorGUI.BeginChangeCheck();
  542. var useGravity = cparam.FindPropertyRelative("useGravity");
  543. var gravity = cparam.FindPropertyRelative("gravity");
  544. var gravityDirection = cparam.FindPropertyRelative("gravityDirection");
  545. //var useDirectional = cparam.FindPropertyRelative("useDirectionalDamping");
  546. //var refObject = cparam.FindPropertyRelative("directionalDampingObject");
  547. //var directionaDamping = cparam.FindPropertyRelative("directionalDamping");
  548. float sv, ev, cv;
  549. GetBezierValue(gravity, out sv, out ev, out cv);
  550. StaticStringBuilder.Clear();
  551. StaticStringBuilder.Append("Gravity", " [", sv, "/", ev, "]");
  552. bool wuse = useGravity.boolValue;
  553. Foldout("Gravity", StaticStringBuilder.ToString(),
  554. () =>
  555. {
  556. EditorGUI.BeginDisabledGroup(!wuse);
  557. EditorGUILayout.LabelField("Gravity Acceleration");
  558. BezierInspector("Gravity", gravity, -10.0f, 0.0f, "F2");
  559. EditorGUILayout.PropertyField(gravityDirection, true);
  560. //useDirectional.boolValue = EditorGUILayout.Toggle("Directional Damping", useDirectional.boolValue);
  561. //refObject.objectReferenceValue = EditorGUILayout.ObjectField("Reference Object", refObject.objectReferenceValue, typeof(Transform), true);
  562. //EditorGUILayout.LabelField("Angular Damping");
  563. //EditorGUILayout.HelpBox("The horizontal axis is the angle 0-90-180.", MessageType.None);
  564. //BezierInspector("Angular Damping", directionaDamping, 0.0f, 1.0f, "F2");
  565. EditorGUI.EndDisabledGroup();
  566. },
  567. (sw) =>
  568. {
  569. wuse = sw;
  570. },
  571. wuse
  572. );
  573. useGravity.boolValue = wuse;
  574. return EditorGUI.EndChangeCheck();
  575. }
  576. public static bool DragInspector(SerializedProperty cparam)
  577. {
  578. return UseMinMaxCurveInspector("Drag", cparam.FindPropertyRelative("useDrag"), "Drag", cparam.FindPropertyRelative("drag"), 0.0f, 0.3f);
  579. }
  580. public static bool MaxVelocityInspector(SerializedProperty cparam)
  581. {
  582. return UseMinMaxCurveInspector("Max Velocity", cparam.FindPropertyRelative("useMaxVelocity"), "Max Velocity", cparam.FindPropertyRelative("maxVelocity"), 0.01f, 10.0f);
  583. }
  584. public static bool TriangleBendInspector(SerializedProperty cparam, bool changed, ClothData clothData)
  585. {
  586. EditorGUI.BeginChangeCheck();
  587. var use = cparam.FindPropertyRelative("useTriangleBend");
  588. //var useIncludeFixed = cparam.FindPropertyRelative("useTriangleBendIncludeFixed");
  589. var useTiwstCorrection = cparam.FindPropertyRelative("useTwistCorrection");
  590. var tiwstPower = cparam.FindPropertyRelative("twistRecoveryPower");
  591. var algo = cparam.FindPropertyRelative("algorithm");
  592. var algoType = EditorApplication.isPlaying ? clothData.triangleBendAlgorithm : (ClothParams.Algorithm)algo.enumValueIndex;
  593. string powerStr = string.Empty;
  594. switch (algoType)
  595. {
  596. case ClothParams.Algorithm.Algorithm_1:
  597. powerStr = "triangleBend";
  598. break;
  599. case ClothParams.Algorithm.Algorithm_2:
  600. powerStr = "triangleBend2";
  601. break;
  602. }
  603. var power = cparam.FindPropertyRelative(powerStr);
  604. const string title = "Triangle Bend";
  605. StaticStringBuilder.Clear();
  606. float sv = 0, ev = 0, cv = 0;
  607. GetBezierValue(power, out sv, out ev, out cv);
  608. StaticStringBuilder.Append("Triangle Bend", " [", sv, "/", ev, "]");
  609. StaticStringBuilder.Append(" (", algoType, ")");
  610. bool isPlaying = EditorApplication.isPlaying;
  611. Foldout(title, StaticStringBuilder.ToString(),
  612. () =>
  613. {
  614. EditorGUI.BeginDisabledGroup(!use.boolValue);
  615. //useIncludeFixed.boolValue = EditorGUILayout.Toggle("Include Fixed", useIncludeFixed.boolValue);
  616. EditorGUILayout.LabelField("Bend Power");
  617. BezierInspector("Triangle Bend", power, 0.0f, 1.0f);
  618. EditorGUI.EndDisabledGroup();
  619. // Twist
  620. if (algoType == ClothParams.Algorithm.Algorithm_2)
  621. {
  622. EditorGUI.BeginDisabledGroup(isPlaying);
  623. useTiwstCorrection.boolValue = EditorGUILayout.Toggle("Twist Correction (Experimental)", useTiwstCorrection.boolValue);
  624. EditorGUI.EndDisabledGroup();
  625. EditorGUILayout.Slider(tiwstPower, 0.0f, 1.0f, "Twist Recovery Power");
  626. }
  627. },
  628. (sw) =>
  629. {
  630. use.boolValue = sw;
  631. },
  632. use.boolValue,
  633. changed
  634. );
  635. return EditorGUI.EndChangeCheck();
  636. }
  637. public static bool DirectionMoveLimitInspector(SerializedProperty cparam)
  638. {
  639. return UseMinMaxCurveInspector("Limit Move To Hits", cparam.FindPropertyRelative("useDirectionMoveLimit"), "Move Limit", cparam.FindPropertyRelative("directionMoveLimit"), -0.2f, 0.2f);
  640. }
  641. public static bool RestoreRotationInspector(SerializedProperty cparam, bool changed, ClothData clothData)
  642. {
  643. EditorGUI.BeginChangeCheck();
  644. var use = cparam.FindPropertyRelative("useRestoreRotation");
  645. var algo = cparam.FindPropertyRelative("algorithm");
  646. var algoType = EditorApplication.isPlaying ? clothData.restoreRotationAlgorithm : (ClothParams.Algorithm)algo.enumValueIndex;
  647. string powerStr = string.Empty;
  648. string influenceStr = string.Empty;
  649. switch (algoType)
  650. {
  651. case ClothParams.Algorithm.Algorithm_1:
  652. powerStr = "restoreRotation";
  653. influenceStr = "restoreRotationVelocityInfluence";
  654. break;
  655. case ClothParams.Algorithm.Algorithm_2:
  656. powerStr = "restoreRotation2";
  657. influenceStr = "restoreRotationVelocityInfluence2";
  658. break;
  659. }
  660. var power = cparam.FindPropertyRelative(powerStr);
  661. var influence = cparam.FindPropertyRelative(influenceStr);
  662. const string title = "Restore Rotation";
  663. float sv, ev, cv;
  664. GetBezierValue(power, out sv, out ev, out cv);
  665. StaticStringBuilder.Clear();
  666. StaticStringBuilder.Append("Restore Rotation", " [", sv, "/", ev, "] (", algoType, ")");
  667. Foldout(title, StaticStringBuilder.ToString(),
  668. () =>
  669. {
  670. EditorGUI.BeginDisabledGroup(!use.boolValue);
  671. EditorGUILayout.LabelField("Restore Power");
  672. BezierInspector("Restore Power", power, 0.0f, 1.0f);
  673. EditorGUILayout.Slider(influence, 0.0f, 1.0f, "Velocity Influence");
  674. EditorGUI.EndDisabledGroup();
  675. },
  676. (sw) =>
  677. {
  678. use.boolValue = sw;
  679. },
  680. use.boolValue,
  681. changed
  682. );
  683. return EditorGUI.EndChangeCheck();
  684. }
  685. public static bool ClampRotationInspector(SerializedProperty cparam, bool changed, ClothData clothData)
  686. {
  687. EditorGUI.BeginChangeCheck();
  688. var use = cparam.FindPropertyRelative("useClampRotation");
  689. var algo = cparam.FindPropertyRelative("algorithm");
  690. var algoType = EditorApplication.isPlaying ? clothData.clampRotationAlgorithm : (ClothParams.Algorithm)algo.enumValueIndex;
  691. string angleStr = string.Empty;
  692. switch (algoType)
  693. {
  694. case ClothParams.Algorithm.Algorithm_1:
  695. angleStr = "clampRotationAngle";
  696. break;
  697. case ClothParams.Algorithm.Algorithm_2:
  698. angleStr = "clampRotationAngle2";
  699. break;
  700. }
  701. var angle = cparam.FindPropertyRelative(angleStr);
  702. var influence = cparam.FindPropertyRelative("clampRotationVelocityInfluence");
  703. var limit = cparam.FindPropertyRelative("clampRotationVelocityLimit");
  704. const string title = "Clamp Rotation";
  705. float sv, ev, cv;
  706. GetBezierValue(angle, out sv, out ev, out cv);
  707. StaticStringBuilder.Clear();
  708. StaticStringBuilder.Append("Clamp Rotation", " [", sv, "/", ev, "] (", algoType, ")");
  709. Foldout(title, StaticStringBuilder.ToString(),
  710. () =>
  711. {
  712. EditorGUI.BeginDisabledGroup(!use.boolValue);
  713. EditorGUILayout.LabelField("Clamp Angle");
  714. BezierInspector("Angle", angle, 0.0f, 180.0f);
  715. if (algoType == ClothParams.Algorithm.Algorithm_1)
  716. {
  717. EditorGUILayout.Slider(limit, 0.0f, 2.0f, "Velocity Limit");
  718. EditorGUILayout.Slider(influence, 0.0f, 1.0f, "Velocity Influence");
  719. }
  720. EditorGUI.EndDisabledGroup();
  721. },
  722. (sw) =>
  723. {
  724. use.boolValue = sw;
  725. },
  726. use.boolValue,
  727. changed
  728. );
  729. return EditorGUI.EndChangeCheck();
  730. }
  731. public static bool CollisionInspector(SerializedProperty cparam, bool changed)
  732. {
  733. EditorGUI.BeginChangeCheck();
  734. var use = cparam.FindPropertyRelative("useCollision");
  735. var dynamicFriction = cparam.FindPropertyRelative("friction");
  736. var staticFriction = cparam.FindPropertyRelative("staticFriction");
  737. const string title = "Collider Collision";
  738. StaticStringBuilder.Clear();
  739. StaticStringBuilder.Append(title, " [", dynamicFriction.floatValue, ", ", staticFriction.floatValue, "]");
  740. Foldout(title, StaticStringBuilder.ToString(),
  741. () =>
  742. {
  743. EditorGUI.BeginDisabledGroup(!use.boolValue);
  744. EditorGUILayout.Slider(dynamicFriction, 0.0f, 0.5f, "Dynamic Friction");
  745. EditorGUILayout.Slider(staticFriction, 0.0f, 0.5f, "Static Friction");
  746. EditorGUI.EndDisabledGroup();
  747. },
  748. (sw) =>
  749. {
  750. use.boolValue = sw;
  751. },
  752. use.boolValue,
  753. changed
  754. );
  755. return EditorGUI.EndChangeCheck();
  756. }
  757. public static bool PenetrationInspector(SerializedObject team, SerializedProperty cparam, bool changed)
  758. {
  759. EditorGUI.BeginChangeCheck();
  760. var use = cparam.FindPropertyRelative("usePenetration");
  761. var mode = cparam.FindPropertyRelative("penetrationMode");
  762. var axis = cparam.FindPropertyRelative("penetrationAxis");
  763. var maxDepth = cparam.FindPropertyRelative("penetrationMaxDepth");
  764. var connectDistance = cparam.FindPropertyRelative("penetrationConnectDistance");
  765. //var stiffness = cparam.FindPropertyRelative("penetrationStiffness");
  766. var radius = cparam.FindPropertyRelative("penetrationRadius");
  767. var ignoreCollider = team.FindProperty("teamData.penetrationIgnoreColliderList");
  768. var distance = cparam.FindPropertyRelative("penetrationDistance");
  769. bool isPlaying = EditorApplication.isPlaying;
  770. const string title = "Penetration";
  771. Foldout(title, title,
  772. () =>
  773. {
  774. EditorGUI.BeginDisabledGroup(!use.boolValue);
  775. EditorGUI.BeginDisabledGroup(isPlaying);
  776. EditorGUILayout.PropertyField(mode);
  777. if (mode.enumValueIndex == (int)ClothParams.PenetrationMode.SurfacePenetration)
  778. {
  779. EditorGUILayout.Slider(maxDepth, 0.0f, 1.0f, "Max Connection Depth");
  780. EditorGUILayout.PropertyField(axis);
  781. EditorGUI.EndDisabledGroup();
  782. EditorGUILayout.LabelField("Penetration Distance");
  783. BezierInspector("Penetration Distance", distance, 0.0f, 1.0f);
  784. EditorGUILayout.LabelField("Moving Radius");
  785. BezierInspector("Moving Radius", radius, 0.0f, 5.0f);
  786. }
  787. else if (mode.enumValueIndex == (int)ClothParams.PenetrationMode.ColliderPenetration)
  788. {
  789. EditorGUILayout.Slider(maxDepth, 0.0f, 1.0f, "Max Connection Depth");
  790. EditorGUILayout.LabelField("Connection Distance");
  791. BezierInspector("Connection Distance", connectDistance, 0.0f, 1.0f);
  792. EditorGUI.EndDisabledGroup();
  793. //EditorGUILayout.LabelField("Stiffness");
  794. //BezierInspector("Connection Stiffness", stiffness, 0.0f, 1.0f);
  795. EditorGUILayout.LabelField("Penetration Distance");
  796. BezierInspector("Penetration Distance", distance, 0.0f, 1.0f);
  797. EditorGUILayout.LabelField("Moving Radius");
  798. BezierInspector("Moving Radius", radius, 0.0f, 5.0f);
  799. EditorGUI.BeginDisabledGroup(isPlaying);
  800. //EditorGUILayout.LabelField("Ignore Collider List");
  801. EditorGUILayout.PropertyField(ignoreCollider, true);
  802. EditorGUI.EndDisabledGroup();
  803. }
  804. #if false // 一旦休眠
  805. else if (mode.enumValueIndex == (int)ClothParams.PenetrationMode.BonePenetration)
  806. {
  807. // help
  808. EditorGUI.EndDisabledGroup();
  809. EditorGUILayout.HelpBox("Bone Penetration controls the penetration in the direction of the bones registered in the [Skinning Bone List].\nThe particles must be skinning by[User Animation] or[Generate From Bones].", MessageType.Info);
  810. //EditorGUI.BeginDisabledGroup(isPlaying);
  811. EditorGUILayout.Slider(maxDepth, 0.0f, 1.0f, "Max Connection Depth");
  812. //EditorGUI.EndDisabledGroup();
  813. EditorGUILayout.LabelField("Penetration Distance");
  814. BezierInspector("Penetration Distance", distance, 0.0f, 1.0f);
  815. EditorGUILayout.LabelField("Moving Radius");
  816. BezierInspector("Moving Radius", radius, 0.0f, 5.0f);
  817. }
  818. #endif
  819. EditorGUI.EndDisabledGroup();
  820. },
  821. (sw) =>
  822. {
  823. use.boolValue = sw;
  824. },
  825. use.boolValue,
  826. changed
  827. );
  828. return EditorGUI.EndChangeCheck();
  829. }
  830. public static bool BaseSkinningInspector(SerializedObject team, SerializedProperty cparam)
  831. {
  832. EditorGUI.BeginChangeCheck();
  833. var use = cparam.FindPropertyRelative("useBaseSkinning");
  834. //var boneList = team.FindProperty("teamData.skinningBoneList");
  835. var ignoreCollider = team.FindProperty("teamData.skinningIgnoreColliderList");
  836. const string title = "Skinning";
  837. Foldout(title, title,
  838. () =>
  839. {
  840. EditorGUI.BeginDisabledGroup(!use.boolValue);
  841. //EditorGUILayout.PropertyField(boneList, true);
  842. EditorGUILayout.PropertyField(ignoreCollider, true);
  843. EditorGUI.EndDisabledGroup();
  844. },
  845. (sw) =>
  846. {
  847. use.boolValue = sw;
  848. },
  849. use.boolValue
  850. );
  851. return EditorGUI.EndChangeCheck();
  852. }
  853. public static bool ClampDistanceInspector(SerializedProperty cparam, bool changed)
  854. {
  855. EditorGUI.BeginChangeCheck();
  856. var use = cparam.FindPropertyRelative("useClampDistanceRatio");
  857. var minRatio = cparam.FindPropertyRelative("clampDistanceMinRatio");
  858. var maxRatio = cparam.FindPropertyRelative("clampDistanceMaxRatio");
  859. var influence = cparam.FindPropertyRelative("clampDistanceVelocityInfluence");
  860. const string title = "Clamp Distance";
  861. StaticStringBuilder.Clear();
  862. StaticStringBuilder.Append("Clamp Distance", " [", minRatio.floatValue, "/", maxRatio.floatValue, "]");
  863. Foldout(title, StaticStringBuilder.ToString(),
  864. () =>
  865. {
  866. EditorGUI.BeginDisabledGroup(!use.boolValue);
  867. EditorGUILayout.Slider(minRatio, 0.0f, 1.0f, "Min Distance Ratio");
  868. EditorGUILayout.Slider(maxRatio, 1.0f, 2.0f, "Max Distance Ratio");
  869. EditorGUILayout.Slider(influence, 0.0f, 1.0f, "Velocity Influence");
  870. EditorGUI.EndDisabledGroup();
  871. },
  872. (sw) =>
  873. {
  874. use.boolValue = sw;
  875. },
  876. use.boolValue,
  877. changed
  878. );
  879. return EditorGUI.EndChangeCheck();
  880. }
  881. public static bool RestoreDistanceInspector(SerializedProperty cparam, bool changed)
  882. {
  883. EditorGUI.BeginChangeCheck();
  884. var influence = cparam.FindPropertyRelative("restoreDistanceVelocityInfluence");
  885. var structStiffness = cparam.FindPropertyRelative("structDistanceStiffness");
  886. var useBend = cparam.FindPropertyRelative("useBendDistance");
  887. var bendMaxCount = cparam.FindPropertyRelative("bendDistanceMaxCount");
  888. var bendStiffness = cparam.FindPropertyRelative("bendDistanceStiffness");
  889. var useNear = cparam.FindPropertyRelative("useNearDistance");
  890. var nearLength = cparam.FindPropertyRelative("nearDistanceLength");
  891. var nearStiffness = cparam.FindPropertyRelative("nearDistanceStiffness");
  892. var nearMaxCount = cparam.FindPropertyRelative("nearDistanceMaxCount");
  893. var nearMaxDepth = cparam.FindPropertyRelative("nearDistanceMaxDepth");
  894. const string title = "Restore Distance";
  895. Foldout(title, title,
  896. () =>
  897. {
  898. EditorGUILayout.LabelField("Struct Point [Always ON]");
  899. EditorGUILayout.LabelField("Struct Stiffness");
  900. BezierInspector("Struct Stiffness", structStiffness, 0.0f, 1.0f);
  901. useBend.boolValue = EditorGUILayout.Toggle("Bend Point", useBend.boolValue);
  902. EditorGUILayout.IntSlider(bendMaxCount, 1, 6, "Bend Max Connection");
  903. EditorGUILayout.LabelField("Bend Stiffness");
  904. BezierInspector("Bend Stiffness", bendStiffness, 0.0f, 1.0f);
  905. useNear.boolValue = EditorGUILayout.Toggle("Near Point", useNear.boolValue);
  906. EditorGUILayout.IntSlider(nearMaxCount, 1, 6, "Near Max Connection");
  907. EditorGUILayout.Slider(nearMaxDepth, 0.0f, 1.0f, "Near Max Depth");
  908. EditorGUILayout.LabelField("Near Point Length");
  909. BezierInspector("Near Point Length", nearLength, 0.0f, 0.5f);
  910. EditorGUILayout.LabelField("Near Stiffness");
  911. BezierInspector("Near Stiffness", nearStiffness, 0.0f, 1.0f);
  912. EditorGUILayout.Slider(influence, 0.0f, 1.0f, "Velocity Influence");
  913. },
  914. warning: changed
  915. );
  916. return EditorGUI.EndChangeCheck();
  917. }
  918. public static bool FullSpringInspector(SerializedProperty cparam, bool changed)
  919. {
  920. EditorGUI.BeginChangeCheck();
  921. var springPower = cparam.FindPropertyRelative("springPower");
  922. var useSpring = cparam.FindPropertyRelative("useSpring");
  923. var springRadius = cparam.FindPropertyRelative("springRadius");
  924. var springScaleX = cparam.FindPropertyRelative("springScaleX");
  925. var springScaleY = cparam.FindPropertyRelative("springScaleY");
  926. var springScaleZ = cparam.FindPropertyRelative("springScaleZ");
  927. var springDirectionAtten = cparam.FindPropertyRelative("springDirectionAtten");
  928. var springDistanceAtten = cparam.FindPropertyRelative("springDistanceAtten");
  929. var springIntensity = cparam.FindPropertyRelative("springIntensity");
  930. const string title = "Spring";
  931. StaticStringBuilder.Clear();
  932. StaticStringBuilder.Append(title, " [", springPower.floatValue, "]");
  933. Foldout(title, StaticStringBuilder.ToString(),
  934. () =>
  935. {
  936. EditorGUI.BeginDisabledGroup(!useSpring.boolValue);
  937. EditorGUILayout.Slider(springRadius, 0.01f, 0.5f, "Spring Radius");
  938. EditorGUILayout.Slider(springScaleX, 0.01f, 1.0f, "Spring Radius Scale X");
  939. EditorGUILayout.Slider(springScaleY, 0.01f, 1.0f, "Spring Radius Scale Y");
  940. EditorGUILayout.Slider(springScaleZ, 0.01f, 1.0f, "Spring Radius Scale Z");
  941. EditorGUILayout.Slider(springPower, 0.0f, 0.1f, "Spring Power");
  942. EditorGUILayout.LabelField("Spring Direction Atten");
  943. BezierInspector("Spring Direction Atten", springDirectionAtten, 0.0f, 1.0f);
  944. EditorGUILayout.LabelField("Spring Distance Atten");
  945. BezierInspector("Spring Distance Atten", springDistanceAtten, 0.0f, 1.0f);
  946. EditorGUILayout.Slider(springIntensity, 0.1f, 3.0f, "Spring Atten Intensity");
  947. EditorGUI.EndDisabledGroup();
  948. },
  949. (sw) =>
  950. {
  951. useSpring.boolValue = sw;
  952. },
  953. useSpring.boolValue,
  954. changed
  955. );
  956. return EditorGUI.EndChangeCheck();
  957. }
  958. public static bool SimpleSpringInspector(SerializedProperty cparam, bool changed)
  959. {
  960. EditorGUI.BeginChangeCheck();
  961. var springPower = cparam.FindPropertyRelative("springPower");
  962. var useSpring = cparam.FindPropertyRelative("useSpring");
  963. const string title = "Spring";
  964. StaticStringBuilder.Clear();
  965. StaticStringBuilder.Append(title, " [", springPower.floatValue, "]");
  966. Foldout(title, StaticStringBuilder.ToString(),
  967. () =>
  968. {
  969. EditorGUI.BeginDisabledGroup(!useSpring.boolValue);
  970. EditorGUILayout.Slider(springPower, 0.0f, 0.1f, "Spring Power");
  971. EditorGUI.EndDisabledGroup();
  972. },
  973. (sw) =>
  974. {
  975. useSpring.boolValue = sw;
  976. },
  977. useSpring.boolValue,
  978. changed
  979. );
  980. return EditorGUI.EndChangeCheck();
  981. }
  982. public static bool AdjustRotationInspector(SerializedProperty cparam, bool changed)
  983. {
  984. EditorGUI.BeginChangeCheck();
  985. //var useAdjustRotation = cparam.FindPropertyRelative("useAdjustRotation");
  986. var adjustMode = cparam.FindPropertyRelative("adjustMode");
  987. var adjustRotationPower = cparam.FindPropertyRelative("adjustRotationPower");
  988. var enumName = adjustMode.enumDisplayNames[adjustMode.enumValueIndex];
  989. const string title = "Adjust Rotation";
  990. StaticStringBuilder.Clear();
  991. StaticStringBuilder.Append(title, " [", enumName, "]");
  992. Foldout(title, StaticStringBuilder.ToString(),
  993. () =>
  994. {
  995. EditorGUILayout.PropertyField(adjustMode);
  996. EditorGUI.BeginDisabledGroup(adjustMode.enumValueIndex == 0);
  997. EditorGUILayout.Slider(adjustRotationPower, -20.0f, 20.0f, "Adjust Rotation Power");
  998. EditorGUI.EndDisabledGroup();
  999. },
  1000. //(sw) =>
  1001. //{
  1002. // useAdjustRotation.boolValue = sw;
  1003. //},
  1004. //useAdjustRotation.boolValue,
  1005. warning: changed
  1006. );
  1007. return EditorGUI.EndChangeCheck();
  1008. }
  1009. public static bool ClampPositionInspector(SerializedProperty cparam, bool full, bool changed)
  1010. {
  1011. EditorGUI.BeginChangeCheck();
  1012. var clampPositionLength = cparam.FindPropertyRelative("clampPositionLength");
  1013. var useClampPositionLength = cparam.FindPropertyRelative("useClampPositionLength");
  1014. var clampPositionRatioX = cparam.FindPropertyRelative("clampPositionRatioX");
  1015. var clampPositionRatioY = cparam.FindPropertyRelative("clampPositionRatioY");
  1016. var clampPositionRatioZ = cparam.FindPropertyRelative("clampPositionRatioZ");
  1017. var influence = cparam.FindPropertyRelative("clampPositionVelocityInfluence");
  1018. float sv, ev, cv;
  1019. GetBezierValue(clampPositionLength, out sv, out ev, out cv);
  1020. const string title = "Clamp Position";
  1021. StaticStringBuilder.Clear();
  1022. StaticStringBuilder.Append(title, " [", sv, "/", ev, "]");
  1023. Foldout(title, StaticStringBuilder.ToString(),
  1024. () =>
  1025. {
  1026. EditorGUI.BeginDisabledGroup(!useClampPositionLength.boolValue);
  1027. EditorGUILayout.LabelField("Clamp Position Length");
  1028. BezierInspector("Clamp Position Length", clampPositionLength, 0.0f, 1.0f);
  1029. if (full)
  1030. {
  1031. EditorGUILayout.Slider(clampPositionRatioX, 0.0f, 1.0f, "Clamp Position Ratio X");
  1032. EditorGUILayout.Slider(clampPositionRatioY, 0.0f, 1.0f, "Clamp Position Ratio Y");
  1033. EditorGUILayout.Slider(clampPositionRatioZ, 0.0f, 1.0f, "Clamp Position Ratio Z");
  1034. }
  1035. EditorGUILayout.Slider(influence, 0.0f, 1.0f, "Velocity Influence");
  1036. EditorGUI.EndDisabledGroup();
  1037. },
  1038. (sw) =>
  1039. {
  1040. useClampPositionLength.boolValue = sw;
  1041. },
  1042. useClampPositionLength.boolValue,
  1043. changed
  1044. );
  1045. return EditorGUI.EndChangeCheck();
  1046. }
  1047. public static bool VolumeInspector(SerializedProperty cparam)
  1048. {
  1049. EditorGUI.BeginChangeCheck();
  1050. var useVolume = cparam.FindPropertyRelative("useVolume");
  1051. var maxVolumeLength = cparam.FindPropertyRelative("maxVolumeLength");
  1052. var volumeStretchStiffness = cparam.FindPropertyRelative("volumeStretchStiffness");
  1053. var volumeShearStiffness = cparam.FindPropertyRelative("volumeShearStiffness");
  1054. const string title = "Volume";
  1055. Foldout(title, title,
  1056. () =>
  1057. {
  1058. EditorGUI.BeginDisabledGroup(!useVolume.boolValue);
  1059. EditorGUILayout.Slider(maxVolumeLength, 0.0f, 0.5f, "Max Volume Length");
  1060. EditorGUILayout.LabelField("Stretch Stiffness");
  1061. BezierInspector("Stretch Stiffness", volumeStretchStiffness, 0.0f, 1.0f);
  1062. EditorGUILayout.LabelField("Shear Stiffness");
  1063. BezierInspector("Shear Stiffness", volumeShearStiffness, 0.0f, 1.0f);
  1064. EditorGUI.EndDisabledGroup();
  1065. },
  1066. (sw) =>
  1067. {
  1068. useVolume.boolValue = sw;
  1069. },
  1070. useVolume.boolValue
  1071. );
  1072. return EditorGUI.EndChangeCheck();
  1073. }
  1074. public static bool RotationInterpolationInspector(SerializedProperty cparam, bool changed)
  1075. {
  1076. EditorGUI.BeginChangeCheck();
  1077. var avarage = cparam.FindPropertyRelative("useLineAvarageRotation");
  1078. var fixnonrot = cparam.FindPropertyRelative("useFixedNonRotation");
  1079. const string title = "Rotation Interpolation";
  1080. Foldout(title, title,
  1081. () =>
  1082. {
  1083. fixnonrot.boolValue = EditorGUILayout.Toggle("Fixed Non-Rotation", fixnonrot.boolValue);
  1084. avarage.boolValue = EditorGUILayout.Toggle("Line Avarage Rotation", avarage.boolValue);
  1085. },
  1086. warning: changed
  1087. );
  1088. return EditorGUI.EndChangeCheck();
  1089. }
  1090. //===============================================================================
  1091. public static void WindComponentInspector(WindComponent wind, SerializedObject so)
  1092. {
  1093. var areaWind = wind as MagicaAreaWind;
  1094. var windType = wind.GetWindType();
  1095. var shapeType = wind.GetShapeType();
  1096. var dirType = wind.GetDirectionType();
  1097. EditorGUILayout.PropertyField(so.FindProperty("main"));
  1098. EditorGUILayout.PropertyField(so.FindProperty("turbulence"));
  1099. EditorGUILayout.PropertyField(so.FindProperty("frequency"));
  1100. if (windType == PhysicsManagerWindData.WindType.Area)
  1101. {
  1102. if (areaWind)
  1103. {
  1104. EditorGUILayout.PropertyField(so.FindProperty("shapeType"));
  1105. }
  1106. switch (shapeType)
  1107. {
  1108. case PhysicsManagerWindData.ShapeType.Box:
  1109. EditorGUILayout.PropertyField(so.FindProperty("areaSize"));
  1110. break;
  1111. case PhysicsManagerWindData.ShapeType.Sphere:
  1112. EditorGUILayout.PropertyField(so.FindProperty("areaRadius"));
  1113. break;
  1114. }
  1115. //EditorGUILayout.PropertyField(so.FindProperty("anchor"));
  1116. }
  1117. if (windType == PhysicsManagerWindData.WindType.Area && shapeType == PhysicsManagerWindData.ShapeType.Sphere)
  1118. {
  1119. EditorGUILayout.PropertyField(so.FindProperty("directionType"));
  1120. }
  1121. if (windType == PhysicsManagerWindData.WindType.Direction || dirType == PhysicsManagerWindData.DirectionType.OneDirection)
  1122. {
  1123. EditorGUILayout.PropertyField(so.FindProperty("directionAngleX"));
  1124. EditorGUILayout.PropertyField(so.FindProperty("directionAngleY"));
  1125. }
  1126. if (windType == PhysicsManagerWindData.WindType.Area && shapeType == PhysicsManagerWindData.ShapeType.Sphere && dirType == PhysicsManagerWindData.DirectionType.Radial)
  1127. {
  1128. EditorGUILayout.LabelField("Attenuation");
  1129. BezierInspector("Attenuation", so.FindProperty("attenuation"), 0.0f, 1.0f);
  1130. }
  1131. if (areaWind)
  1132. {
  1133. EditorGUILayout.PropertyField(so.FindProperty("isAddition"));
  1134. }
  1135. }
  1136. //===============================================================================
  1137. /// <summary>
  1138. /// 水平線を引く
  1139. /// </summary>
  1140. public static void DrawHorizoneLine()
  1141. {
  1142. GUILayout.Box("", new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(1) });
  1143. }
  1144. /// <summary>
  1145. /// インスペクタにオブジェクトリストと全選択ボタンを表示する
  1146. /// </summary>
  1147. /// <param name="dlist"></param>
  1148. /// <param name="obj"></param>
  1149. public static void DrawObjectList<T>(
  1150. SerializedProperty dlist, GameObject obj, bool allselect, bool allclear, System.Func<T[]> func,
  1151. string allSelectName = null, string allClearName = null
  1152. )
  1153. where T : UnityEngine.Object
  1154. {
  1155. // リスト表示
  1156. EditorGUILayout.PropertyField(dlist, true);
  1157. // 全選択/削除ボタン
  1158. if (allselect || allclear)
  1159. {
  1160. EditorGUILayout.BeginHorizontal();
  1161. GUILayout.FlexibleSpace();
  1162. if (allselect)
  1163. {
  1164. if (GUILayout.Button(allSelectName ?? "All Select", GUILayout.Width(80), GUILayout.Height(16)))
  1165. {
  1166. //var newlist = obj.transform.root.GetComponentsInChildren<T>();
  1167. var newlist = func();
  1168. int cnt = newlist == null ? 0 : newlist.Length;
  1169. dlist.arraySize = cnt;
  1170. for (int i = 0; i < cnt; i++)
  1171. {
  1172. dlist.GetArrayElementAtIndex(i).objectReferenceValue = newlist[i];
  1173. }
  1174. }
  1175. }
  1176. if (allclear)
  1177. {
  1178. if (GUILayout.Button(allClearName ?? "Clear", GUILayout.Width(70), GUILayout.Height(16)))
  1179. {
  1180. dlist.arraySize = 0;
  1181. }
  1182. }
  1183. EditorGUILayout.EndHorizontal();
  1184. }
  1185. }
  1186. //===============================================================================
  1187. /// <summary>
  1188. /// クロスモニターを開くボタン
  1189. /// </summary>
  1190. public static void MonitorButtonInspector()
  1191. {
  1192. EditorGUILayout.BeginHorizontal();
  1193. GUILayout.FlexibleSpace();
  1194. GUI.backgroundColor = Color.yellow;
  1195. if (GUILayout.Button("Open Cloth Monitor", GUILayout.Width(150)))
  1196. {
  1197. ClothMonitorMenu.InitWindow();
  1198. }
  1199. GUI.backgroundColor = Color.white;
  1200. EditorGUILayout.EndHorizontal();
  1201. }
  1202. }
  1203. }