VoxelHumanoidConfigreAvatar.cs 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396
  1. using UnityEngine;
  2. using UnityEngine.Assertions;
  3. using UnityEditor;
  4. using UnityEditorInternal;
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. namespace VoxelImporter
  9. {
  10. public class VoxelHumanoidConfigreAvatar : EditorWindow
  11. {
  12. public static VoxelHumanoidConfigreAvatar instance;
  13. public VoxelSkinnedAnimationObject animationObject { get; private set; }
  14. public VoxelSkinnedAnimationObjectCore animationCore { get; private set; }
  15. #region Textures
  16. private Texture2D avatarIcon;
  17. private Texture2D avatarHead;
  18. private Texture2D avatarTorso;
  19. private Texture2D avatarLeftArm;
  20. private Texture2D avatarLeftFingers;
  21. private Texture2D avatarLeftLeg;
  22. private Texture2D avatarRightArm;
  23. private Texture2D avatarRightFingers;
  24. private Texture2D avatarRightLeg;
  25. private Texture2D avatarHeadZoom;
  26. private Texture2D avatarLeftHandZoom;
  27. private Texture2D avatarRightHandZoom;
  28. private Texture2D avatarBodysilhouette;
  29. private Texture2D avatarHeadzoomsilhouette;
  30. private Texture2D avatarLefthandzoomsilhouette;
  31. private Texture2D avatarRighthandzoomsilhouette;
  32. private Texture2D dotfill;
  33. private Texture2D dotframe;
  34. private Texture2D dotframedotted;
  35. private Texture2D dotselection;
  36. #endregion
  37. #region GUIStyles
  38. private GUIStyle guiStyleBackgroundBox;
  39. private GUIStyle guiStyleVerticalToolbar;
  40. private GUIStyle guiStyleBoneButton;
  41. private GUIStyle guiStyleOLTitle;
  42. private GUIStyle guiStyleGVToolbar;
  43. private GUIStyle guiStyleGVGizmoDropDown;
  44. #endregion
  45. #region Strings
  46. private readonly string[] HumanoidAvatarConfigreModeStrings =
  47. {
  48. "Mapping",
  49. "Muscles & Settings",
  50. };
  51. private readonly string[] HumanoidAvatarMappingModeStrings =
  52. {
  53. "Body",
  54. "Head",
  55. "Left Hand",
  56. "Right Hand",
  57. };
  58. #endregion
  59. #region Editor
  60. public enum HumanoidAvatarConfigreMode
  61. {
  62. Mapping,
  63. MusclesAndSettings,
  64. }
  65. public HumanoidAvatarConfigreMode humanoidAvatarConfigreMode { get; private set; }
  66. public enum HumanoidAvatarMappingMode
  67. {
  68. Body,
  69. Head,
  70. LeftHand,
  71. RightHand,
  72. }
  73. public HumanoidAvatarMappingMode humanoidAvatarMappingMode { get; private set; }
  74. private bool mappingBodyBodyFoldout = true;
  75. private bool mappingBodyLeftArmFoldout = true;
  76. private bool mappingBodyRightArmFoldout = true;
  77. private bool mappingBodyLeftLegFoldout = true;
  78. private bool mappingBodyRightLegFoldout = true;
  79. private bool mappingHeadFoldout = true;
  80. private bool mappingLeftFingersFoldout = true;
  81. private bool mappingRightFingersFoldout = true;
  82. private VoxelSkinnedAnimationObject.HumanoidBone selectBone = (VoxelSkinnedAnimationObject.HumanoidBone)(-1);
  83. private VoxelSkinnedAnimationObject.VoxelImporterHumanDescription saveHumanDescription;
  84. private int undoGroupID = -1;
  85. private Vector2 scrollPosition;
  86. #endregion
  87. public static void Create(VoxelSkinnedAnimationObject animationObject)
  88. {
  89. if (instance == null)
  90. {
  91. instance = CreateInstance<VoxelHumanoidConfigreAvatar>();
  92. }
  93. instance.Initialize(animationObject);
  94. instance.minSize = new Vector2(256, instance.minSize.y);
  95. instance.ShowUtility();
  96. }
  97. public static void Destroy()
  98. {
  99. if (instance != null)
  100. {
  101. instance.Close();
  102. }
  103. }
  104. void OnEnable()
  105. {
  106. undoGroupID = Undo.GetCurrentGroup();
  107. Undo.undoRedoPerformed -= EditorUndoRedoPerformed;
  108. Undo.undoRedoPerformed += EditorUndoRedoPerformed;
  109. InternalEditorUtility.RepaintAllViews();
  110. }
  111. void OnDisable()
  112. {
  113. if (animationObject != null)
  114. {
  115. if (animationObject.humanDescription.IsChanged(ref saveHumanDescription))
  116. {
  117. if (EditorUtility.DisplayDialog("Unapplied settings", "Unapplied 'HumanDescription' settings for Avatar.", "Apply", "Revert"))
  118. {
  119. saveHumanDescription = new VoxelSkinnedAnimationObject.VoxelImporterHumanDescription(ref animationObject.humanDescription);
  120. animationCore.UpdateBoneWeight();
  121. }
  122. else
  123. {
  124. animationObject.humanDescription = new VoxelSkinnedAnimationObject.VoxelImporterHumanDescription(ref saveHumanDescription);
  125. }
  126. }
  127. }
  128. if (undoGroupID >= 0)
  129. {
  130. Undo.CollapseUndoOperations(undoGroupID);
  131. undoGroupID = -1;
  132. }
  133. Undo.undoRedoPerformed -= EditorUndoRedoPerformed;
  134. instance = null;
  135. InternalEditorUtility.RepaintAllViews();
  136. }
  137. void OnDestroy()
  138. {
  139. OnDisable();
  140. }
  141. private void EditorUndoRedoPerformed()
  142. {
  143. Repaint();
  144. }
  145. void OnSelectionChange()
  146. {
  147. var go = Selection.activeGameObject;
  148. if (go == null || go.GetComponentInParent<VoxelSkinnedAnimationObject>() != animationObject)
  149. {
  150. Close();
  151. }
  152. }
  153. private void Initialize(VoxelSkinnedAnimationObject animationObject)
  154. {
  155. this.animationObject = animationObject;
  156. animationCore = new VoxelSkinnedAnimationObjectCore(this.animationObject);
  157. animationCore.ResetBoneTransform();
  158. saveHumanDescription = new VoxelSkinnedAnimationObject.VoxelImporterHumanDescription(ref animationObject.humanDescription);
  159. titleContent = new GUIContent("Configure Avatar");
  160. avatarIcon = EditorCommon.EditorGUIUtilityLoadIcon("avatar icon");
  161. avatarHead = EditorGUIUtility.IconContent("AvatarInspector/head").image as Texture2D;
  162. avatarTorso = EditorGUIUtility.IconContent("AvatarInspector/torso").image as Texture2D;
  163. avatarLeftArm = EditorGUIUtility.IconContent("AvatarInspector/leftarm").image as Texture2D;
  164. avatarLeftFingers = EditorGUIUtility.IconContent("AvatarInspector/leftfingers").image as Texture2D;
  165. avatarLeftLeg = EditorGUIUtility.IconContent("AvatarInspector/leftleg").image as Texture2D;
  166. avatarRightArm = EditorGUIUtility.IconContent("AvatarInspector/rightarm").image as Texture2D;
  167. avatarRightFingers = EditorGUIUtility.IconContent("AvatarInspector/rightfingers").image as Texture2D;
  168. avatarRightLeg = EditorGUIUtility.IconContent("AvatarInspector/rightleg").image as Texture2D;
  169. avatarHeadZoom = EditorGUIUtility.IconContent("AvatarInspector/headzoom").image as Texture2D;
  170. avatarLeftHandZoom = EditorGUIUtility.IconContent("AvatarInspector/lefthandzoom").image as Texture2D;
  171. avatarRightHandZoom = EditorGUIUtility.IconContent("AvatarInspector/righthandzoom").image as Texture2D;
  172. avatarBodysilhouette = EditorGUIUtility.IconContent("AvatarInspector/bodysilhouette").image as Texture2D;
  173. avatarHeadzoomsilhouette = EditorGUIUtility.IconContent("AvatarInspector/headzoomsilhouette").image as Texture2D;
  174. avatarLefthandzoomsilhouette = EditorGUIUtility.IconContent("AvatarInspector/lefthandzoomsilhouette").image as Texture2D;
  175. avatarRighthandzoomsilhouette = EditorGUIUtility.IconContent("AvatarInspector/righthandzoomsilhouette").image as Texture2D;
  176. dotfill = EditorGUIUtility.IconContent("AvatarInspector/dotfill").image as Texture2D;
  177. dotframe = EditorGUIUtility.IconContent("AvatarInspector/dotframe").image as Texture2D;
  178. dotframedotted = EditorGUIUtility.IconContent("AvatarInspector/dotframedotted").image as Texture2D;
  179. dotselection = EditorGUIUtility.IconContent("AvatarInspector/dotselection").image as Texture2D;
  180. }
  181. void Update()
  182. {
  183. if (instance == null)
  184. {
  185. Close();
  186. }
  187. }
  188. void OnGUI()
  189. {
  190. #region GUIStyle
  191. if (guiStyleBackgroundBox == null)
  192. {
  193. guiStyleBackgroundBox = new GUIStyle("CurveEditorBackground");
  194. }
  195. if (guiStyleVerticalToolbar == null)
  196. guiStyleVerticalToolbar = new GUIStyle(GUI.skin.button);
  197. guiStyleVerticalToolbar.margin = new RectOffset(0, 0, 0, 0);
  198. guiStyleVerticalToolbar.fontSize = 9;
  199. if (guiStyleBoneButton == null)
  200. guiStyleBoneButton = new GUIStyle(GUI.skin.button);
  201. guiStyleBoneButton.margin = new RectOffset(0, 0, 0, 0);
  202. guiStyleBoneButton.padding = new RectOffset(0, 0, 0, 0);
  203. guiStyleBoneButton.border = new RectOffset(0, 0, 0, 0);
  204. guiStyleBoneButton.active = guiStyleBoneButton.normal;
  205. if (guiStyleOLTitle == null)
  206. guiStyleOLTitle = new GUIStyle("OL Title");
  207. guiStyleOLTitle.fixedHeight = 18;
  208. if (guiStyleGVToolbar == null)
  209. guiStyleGVToolbar = new GUIStyle("TE Toolbar");
  210. if (guiStyleGVGizmoDropDown == null)
  211. guiStyleGVGizmoDropDown = new GUIStyle("TE ToolbarDropDown");
  212. #endregion
  213. #region Avatar Icon
  214. {
  215. EditorGUILayout.BeginHorizontal();
  216. {
  217. var rect = EditorGUILayout.GetControlRect();
  218. rect.width = avatarIcon.width * 0.5f;
  219. rect.height = avatarIcon.height * 0.5f;
  220. GUI.DrawTexture(rect, avatarIcon);
  221. rect.position = new Vector2(rect.position.x + rect.width, rect.position.y);
  222. rect.width = EditorGUILayout.GetControlRect().width + rect.width;
  223. EditorGUI.LabelField(rect, animationObject.avatar != null ? animationObject.avatar.name : "");
  224. }
  225. EditorGUILayout.EndHorizontal();
  226. EditorGUILayout.Space();
  227. }
  228. #endregion
  229. #region HumanoidAvatarConfigreMode
  230. {
  231. EditorGUILayout.BeginHorizontal();
  232. GUILayout.FlexibleSpace();
  233. {
  234. EditorGUI.BeginChangeCheck();
  235. humanoidAvatarConfigreMode = (HumanoidAvatarConfigreMode)GUILayout.Toolbar((int)humanoidAvatarConfigreMode, HumanoidAvatarConfigreModeStrings, "LargeButton");
  236. if (EditorGUI.EndChangeCheck())
  237. {
  238. InternalEditorUtility.RepaintAllViews();
  239. }
  240. }
  241. GUILayout.FlexibleSpace();
  242. EditorGUILayout.EndHorizontal();
  243. }
  244. #endregion
  245. if (humanoidAvatarConfigreMode == HumanoidAvatarConfigreMode.Mapping)
  246. {
  247. #region Avatar Preview
  248. {
  249. Rect backgroundRect;
  250. {
  251. backgroundRect = EditorGUILayout.GetControlRect();
  252. backgroundRect.height = 379f;
  253. GUI.Box(backgroundRect, "", guiStyleBackgroundBox);
  254. }
  255. GUILayout.Space(backgroundRect.height - 16);
  256. var saveGUIColor = GUI.color;
  257. Action<bool> SetGUIColor = (enable) =>
  258. {
  259. if (enable) GUI.color = new Color(0.2f, 0.8f, 0.2f);
  260. else GUI.color = new Color(0.8f, 0.2f, 0.2f);
  261. };
  262. Action<bool> SetGUIColorLeftFingers = (enable) =>
  263. {
  264. if (IsLeftFingersHave())
  265. {
  266. if (enable) GUI.color = new Color(0.2f, 0.8f, 0.2f);
  267. else GUI.color = new Color(0.8f, 0.2f, 0.2f);
  268. }
  269. else
  270. {
  271. GUI.color = Color.gray;
  272. }
  273. };
  274. Action<bool> SetGUIColorRightFingers = (enable) =>
  275. {
  276. if (IsRightFingersHave())
  277. {
  278. if (enable) GUI.color = new Color(0.2f, 0.8f, 0.2f);
  279. else GUI.color = new Color(0.8f, 0.2f, 0.2f);
  280. }
  281. else
  282. {
  283. GUI.color = Color.gray;
  284. }
  285. };
  286. if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.Body)
  287. {
  288. #region Body
  289. #region BackGround
  290. //base
  291. GUI.color = new Color(0.2f, 0.2f, 0.2f);
  292. GUI.DrawTexture(backgroundRect, avatarBodysilhouette, ScaleMode.ScaleToFit);
  293. {//Head
  294. SetGUIColor(IsHeadEnable());
  295. GUI.DrawTexture(backgroundRect, avatarHead, ScaleMode.ScaleToFit);
  296. }
  297. {//Torso
  298. SetGUIColor(IsTorsoEnable());
  299. GUI.DrawTexture(backgroundRect, avatarTorso, ScaleMode.ScaleToFit);
  300. }
  301. {//LeftArm
  302. SetGUIColor(IsLeftArmEnable());
  303. GUI.DrawTexture(backgroundRect, avatarLeftArm, ScaleMode.ScaleToFit);
  304. }
  305. {//LeftFingers
  306. SetGUIColorLeftFingers(IsLeftFingersEnable());
  307. GUI.DrawTexture(backgroundRect, avatarLeftFingers, ScaleMode.ScaleToFit);
  308. }
  309. {//LeftLeg
  310. SetGUIColor(IsLeftLegEnable());
  311. GUI.DrawTexture(backgroundRect, avatarLeftLeg, ScaleMode.ScaleToFit);
  312. }
  313. {//RightArm
  314. SetGUIColor(IsRightArmEnable());
  315. GUI.DrawTexture(backgroundRect, avatarRightArm, ScaleMode.ScaleToFit);
  316. }
  317. {//RightFingers
  318. SetGUIColorRightFingers(IsRightFingersEnable());
  319. GUI.DrawTexture(backgroundRect, avatarRightFingers, ScaleMode.ScaleToFit);
  320. }
  321. {//RightLeg
  322. SetGUIColor(IsRightLegEnable());
  323. GUI.DrawTexture(backgroundRect, avatarRightLeg, ScaleMode.ScaleToFit);
  324. }
  325. #endregion
  326. #region Bone
  327. {
  328. var position = backgroundRect.center;
  329. GUI_PreviewBone(new Vector2(position.x, 227), true, VoxelSkinnedAnimationObject.HumanoidBone.Hips);
  330. GUI_PreviewBone(new Vector2(position.x, 205), true, VoxelSkinnedAnimationObject.HumanoidBone.Spine);
  331. GUI_PreviewBone(new Vector2(position.x, 175), false, VoxelSkinnedAnimationObject.HumanoidBone.Chest);
  332. GUI_PreviewBone(new Vector2(position.x, 148), false, VoxelSkinnedAnimationObject.HumanoidBone.UpperChest);
  333. GUI_PreviewBone(new Vector2(position.x, 118), false, VoxelSkinnedAnimationObject.HumanoidBone.Neck);
  334. GUI_PreviewBone(new Vector2(position.x, 99), true, VoxelSkinnedAnimationObject.HumanoidBone.Head);
  335. GUI_PreviewBone(new Vector2(position.x + 12, 129), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftShoulder);
  336. GUI_PreviewBone(new Vector2(position.x - 12, 129), false, VoxelSkinnedAnimationObject.HumanoidBone.RightShoulder);
  337. GUI_PreviewBone(new Vector2(position.x + 27, 135), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperArm);
  338. GUI_PreviewBone(new Vector2(position.x - 27, 135), true, VoxelSkinnedAnimationObject.HumanoidBone.RightUpperArm);
  339. GUI_PreviewBone(new Vector2(position.x + 43, 186), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerArm);
  340. GUI_PreviewBone(new Vector2(position.x - 43, 186), true, VoxelSkinnedAnimationObject.HumanoidBone.RightLowerArm);
  341. GUI_PreviewBone(new Vector2(position.x + 59, 237), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  342. GUI_PreviewBone(new Vector2(position.x - 59, 237), true, VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  343. GUI_PreviewBone(new Vector2(position.x + 14, 241), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg);
  344. GUI_PreviewBone(new Vector2(position.x - 14, 241), true, VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg);
  345. GUI_PreviewBone(new Vector2(position.x + 18, 318), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerLeg);
  346. GUI_PreviewBone(new Vector2(position.x - 18, 318), true, VoxelSkinnedAnimationObject.HumanoidBone.RightLowerLeg);
  347. GUI_PreviewBone(new Vector2(position.x + 20, 394), true, VoxelSkinnedAnimationObject.HumanoidBone.LeftFoot);
  348. GUI_PreviewBone(new Vector2(position.x - 20, 394), true, VoxelSkinnedAnimationObject.HumanoidBone.RightFoot);
  349. GUI_PreviewBone(new Vector2(position.x + 23, 411), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftToes);
  350. GUI_PreviewBone(new Vector2(position.x - 23, 411), false, VoxelSkinnedAnimationObject.HumanoidBone.RightToes);
  351. }
  352. #endregion
  353. #endregion
  354. }
  355. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.Head)
  356. {
  357. #region Head
  358. #region BackGround
  359. GUI.color = new Color(0.2f, 0.2f, 0.2f);
  360. GUI.DrawTexture(backgroundRect, avatarHeadzoomsilhouette, ScaleMode.ScaleToFit);
  361. //base
  362. {
  363. SetGUIColor(IsHeadEnable());
  364. GUI.DrawTexture(backgroundRect, avatarHeadZoom, ScaleMode.ScaleToFit);
  365. }
  366. #endregion
  367. #region Bone
  368. {
  369. var position = backgroundRect.center;
  370. GUI_PreviewBone(new Vector2(position.x - 14, 299), true, VoxelSkinnedAnimationObject.HumanoidBone.Head);
  371. GUI_PreviewBone(new Vector2(position.x - 18, 360), false, VoxelSkinnedAnimationObject.HumanoidBone.Neck);
  372. GUI_PreviewBone(new Vector2(position.x + 56, 212), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftEye);
  373. GUI_PreviewBone(new Vector2(position.x + 13, 212), false, VoxelSkinnedAnimationObject.HumanoidBone.RightEye);
  374. GUI_PreviewBone(new Vector2(position.x + 40, 318), false, VoxelSkinnedAnimationObject.HumanoidBone.Jaw);
  375. }
  376. #endregion
  377. #endregion
  378. }
  379. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.LeftHand)
  380. {
  381. #region LeftHand
  382. #region BackGround
  383. GUI.color = new Color(0.2f, 0.2f, 0.2f);
  384. GUI.DrawTexture(backgroundRect, avatarLefthandzoomsilhouette, ScaleMode.ScaleToFit);
  385. //base
  386. SetGUIColorLeftFingers(IsLeftFingersEnable());
  387. GUI.DrawTexture(backgroundRect, avatarLeftHandZoom, ScaleMode.ScaleToFit);
  388. #endregion
  389. #region Bone
  390. {
  391. var position = backgroundRect.center;
  392. GUI_PreviewBone(new Vector2(position.x - 42, 222), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal);
  393. GUI_PreviewBone(new Vector2(position.x - 20, 198), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbIntermediate);
  394. GUI_PreviewBone(new Vector2(position.x - 4, 180), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbDistal);
  395. GUI_PreviewBone(new Vector2(position.x + 22, 222), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexProximal);
  396. GUI_PreviewBone(new Vector2(position.x + 54, 215), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexIntermediate);
  397. GUI_PreviewBone(new Vector2(position.x + 78, 211), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexDistal);
  398. GUI_PreviewBone(new Vector2(position.x + 26, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleProximal);
  399. GUI_PreviewBone(new Vector2(position.x + 62, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleIntermediate);
  400. GUI_PreviewBone(new Vector2(position.x + 88, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleDistal);
  401. GUI_PreviewBone(new Vector2(position.x + 19, 265), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingProximal);
  402. GUI_PreviewBone(new Vector2(position.x + 54, 266), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingIntermediate);
  403. GUI_PreviewBone(new Vector2(position.x + 79, 268), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingDistal);
  404. GUI_PreviewBone(new Vector2(position.x + 10, 286), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleProximal);
  405. GUI_PreviewBone(new Vector2(position.x + 35, 287), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleIntermediate);
  406. GUI_PreviewBone(new Vector2(position.x + 54, 289), false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleDistal);
  407. }
  408. #endregion
  409. #endregion
  410. }
  411. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.RightHand)
  412. {
  413. #region RightHand
  414. #region BackGround
  415. GUI.color = new Color(0.2f, 0.2f, 0.2f);
  416. GUI.DrawTexture(backgroundRect, avatarRighthandzoomsilhouette, ScaleMode.ScaleToFit);
  417. //base
  418. SetGUIColorRightFingers(IsRightFingersEnable());
  419. GUI.DrawTexture(backgroundRect, avatarRightHandZoom, ScaleMode.ScaleToFit);
  420. #endregion
  421. #region Bone
  422. {
  423. var position = backgroundRect.center;
  424. GUI_PreviewBone(new Vector2(position.x + 42, 222), false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal);
  425. GUI_PreviewBone(new Vector2(position.x + 20, 198), false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbIntermediate);
  426. GUI_PreviewBone(new Vector2(position.x + 4, 180), false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbDistal);
  427. GUI_PreviewBone(new Vector2(position.x - 22, 222), false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexProximal);
  428. GUI_PreviewBone(new Vector2(position.x - 54, 215), false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexIntermediate);
  429. GUI_PreviewBone(new Vector2(position.x - 78, 211), false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexDistal);
  430. GUI_PreviewBone(new Vector2(position.x - 26, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleProximal);
  431. GUI_PreviewBone(new Vector2(position.x - 62, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleIntermediate);
  432. GUI_PreviewBone(new Vector2(position.x - 88, 243), false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleDistal);
  433. GUI_PreviewBone(new Vector2(position.x - 19, 265), false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingProximal);
  434. GUI_PreviewBone(new Vector2(position.x - 54, 266), false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingIntermediate);
  435. GUI_PreviewBone(new Vector2(position.x - 79, 268), false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingDistal);
  436. GUI_PreviewBone(new Vector2(position.x - 10, 286), false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleProximal);
  437. GUI_PreviewBone(new Vector2(position.x - 35, 287), false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleIntermediate);
  438. GUI_PreviewBone(new Vector2(position.x - 54, 289), false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleDistal);
  439. }
  440. #endregion
  441. #endregion
  442. }
  443. GUI.color = saveGUIColor;
  444. #region Toolbar
  445. {
  446. Rect rect = backgroundRect;
  447. {
  448. rect.position = new Vector2(backgroundRect.position.x + 5, backgroundRect.position.y + 308);
  449. rect.width = 70;
  450. rect.height = 64;
  451. }
  452. humanoidAvatarMappingMode = (HumanoidAvatarMappingMode)GUI.SelectionGrid(rect, (int)humanoidAvatarMappingMode, HumanoidAvatarMappingModeStrings, 1, guiStyleVerticalToolbar);
  453. }
  454. #endregion
  455. }
  456. #endregion
  457. EditorGUILayout.BeginVertical(GUI.skin.box);
  458. scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
  459. #region Optional Bone
  460. {
  461. EditorGUILayout.BeginHorizontal();
  462. {
  463. var rect = EditorGUILayout.GetControlRect();
  464. rect.position = new Vector2(rect.position.x + 6, rect.position.y);
  465. rect.width = dotframedotted.width;
  466. rect.height = dotframedotted.height;
  467. var saveGUIColor = GUI.color;
  468. GUI.color = Color.gray;
  469. GUI.DrawTexture(rect, dotframedotted, ScaleMode.ScaleToFit);
  470. GUI.color = saveGUIColor;
  471. rect.position = new Vector2(rect.position.x + rect.width + 8, rect.position.y);
  472. rect.width = EditorGUILayout.GetControlRect().width + rect.width;
  473. EditorGUI.LabelField(rect, "Optional Bone");
  474. }
  475. EditorGUILayout.EndHorizontal();
  476. GUILayout.Space(EditorGUILayout.GetControlRect().height - 12);
  477. }
  478. #endregion
  479. #region Inspector
  480. if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.Body)
  481. {
  482. #region Body
  483. mappingBodyBodyFoldout = EditorGUILayout.Foldout(mappingBodyBodyFoldout, "Body");
  484. if (mappingBodyBodyFoldout)
  485. {
  486. GUI_InspectorBone("Hips", true, VoxelSkinnedAnimationObject.HumanoidBone.Hips);
  487. GUI_InspectorBone("Spine", true, VoxelSkinnedAnimationObject.HumanoidBone.Spine);
  488. GUI_InspectorBone("Chest", false, VoxelSkinnedAnimationObject.HumanoidBone.Chest);
  489. GUI_InspectorBone("Upper Chest", false, VoxelSkinnedAnimationObject.HumanoidBone.UpperChest);
  490. }
  491. #endregion
  492. #region Left Arm
  493. mappingBodyLeftArmFoldout = EditorGUILayout.Foldout(mappingBodyLeftArmFoldout, "Left Arm");
  494. if (mappingBodyLeftArmFoldout)
  495. {
  496. GUI_InspectorBone("Shoulder", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftShoulder);
  497. GUI_InspectorBone("Upper Arm", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperArm);
  498. GUI_InspectorBone("Lower Arm", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerArm);
  499. GUI_InspectorBone("Hand", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  500. }
  501. #endregion
  502. #region Right Arm
  503. mappingBodyRightArmFoldout = EditorGUILayout.Foldout(mappingBodyRightArmFoldout, "Right Arm");
  504. if (mappingBodyRightArmFoldout)
  505. {
  506. GUI_InspectorBone("Shoulder", false, VoxelSkinnedAnimationObject.HumanoidBone.RightShoulder);
  507. GUI_InspectorBone("Upper Arm", true, VoxelSkinnedAnimationObject.HumanoidBone.RightUpperArm);
  508. GUI_InspectorBone("Lower Arm", true, VoxelSkinnedAnimationObject.HumanoidBone.RightLowerArm);
  509. GUI_InspectorBone("Hand", true, VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  510. }
  511. #endregion
  512. #region Left Leg
  513. mappingBodyLeftLegFoldout = EditorGUILayout.Foldout(mappingBodyLeftLegFoldout, "Left Leg");
  514. if (mappingBodyLeftLegFoldout)
  515. {
  516. GUI_InspectorBone("Upper Leg", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg);
  517. GUI_InspectorBone("Lower Leg", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerLeg);
  518. GUI_InspectorBone("Foot", true, VoxelSkinnedAnimationObject.HumanoidBone.LeftFoot);
  519. GUI_InspectorBone("Toes", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftToes);
  520. }
  521. #endregion
  522. #region Right Leg
  523. mappingBodyRightLegFoldout = EditorGUILayout.Foldout(mappingBodyRightLegFoldout, "Right Leg");
  524. if (mappingBodyRightLegFoldout)
  525. {
  526. GUI_InspectorBone("Upper Leg", true, VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg);
  527. GUI_InspectorBone("Lower Leg", true, VoxelSkinnedAnimationObject.HumanoidBone.RightLowerLeg);
  528. GUI_InspectorBone("Foot", true, VoxelSkinnedAnimationObject.HumanoidBone.RightFoot);
  529. GUI_InspectorBone("Toes", false, VoxelSkinnedAnimationObject.HumanoidBone.RightToes);
  530. }
  531. #endregion
  532. }
  533. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.Head)
  534. {
  535. #region Head
  536. mappingHeadFoldout = EditorGUILayout.Foldout(mappingHeadFoldout, "Head");
  537. if (mappingHeadFoldout)
  538. {
  539. GUI_InspectorBone("Neck", false, VoxelSkinnedAnimationObject.HumanoidBone.Neck);
  540. GUI_InspectorBone("Head", true, VoxelSkinnedAnimationObject.HumanoidBone.Head);
  541. GUI_InspectorBone("Left Eye", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftEye);
  542. GUI_InspectorBone("Right Eye", false, VoxelSkinnedAnimationObject.HumanoidBone.RightEye);
  543. GUI_InspectorBone("Jaw", false, VoxelSkinnedAnimationObject.HumanoidBone.Jaw);
  544. }
  545. #endregion
  546. }
  547. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.LeftHand)
  548. {
  549. #region Left Fingers
  550. mappingLeftFingersFoldout = EditorGUILayout.Foldout(mappingLeftFingersFoldout, "Left Fingers");
  551. if (mappingLeftFingersFoldout)
  552. {
  553. GUI_InspectorBone("Thumb Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal);
  554. GUI_InspectorBone("Thumb Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbIntermediate);
  555. GUI_InspectorBone("Thumb Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbDistal);
  556. GUI_InspectorBone("Index Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexProximal);
  557. GUI_InspectorBone("Index Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexIntermediate);
  558. GUI_InspectorBone("Index Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexDistal);
  559. GUI_InspectorBone("Middle Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleProximal);
  560. GUI_InspectorBone("Middle Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleIntermediate);
  561. GUI_InspectorBone("Middle Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleDistal);
  562. GUI_InspectorBone("Ring Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingProximal);
  563. GUI_InspectorBone("Ring Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingIntermediate);
  564. GUI_InspectorBone("Ring Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftRingDistal);
  565. GUI_InspectorBone("Little Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleProximal);
  566. GUI_InspectorBone("Little Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleIntermediate);
  567. GUI_InspectorBone("Little Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleDistal);
  568. }
  569. #endregion
  570. }
  571. else if (humanoidAvatarMappingMode == HumanoidAvatarMappingMode.RightHand)
  572. {
  573. #region Right Fingers
  574. mappingRightFingersFoldout = EditorGUILayout.Foldout(mappingRightFingersFoldout, "Right Fingers");
  575. if (mappingRightFingersFoldout)
  576. {
  577. GUI_InspectorBone("Thumb Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal);
  578. GUI_InspectorBone("Thumb Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbIntermediate);
  579. GUI_InspectorBone("Thumb Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightThumbDistal);
  580. GUI_InspectorBone("Index Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexProximal);
  581. GUI_InspectorBone("Index Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexIntermediate);
  582. GUI_InspectorBone("Index Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightIndexDistal);
  583. GUI_InspectorBone("Middle Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleProximal);
  584. GUI_InspectorBone("Middle Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleIntermediate);
  585. GUI_InspectorBone("Middle Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleDistal);
  586. GUI_InspectorBone("Ring Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingProximal);
  587. GUI_InspectorBone("Ring Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingIntermediate);
  588. GUI_InspectorBone("Ring Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightRingDistal);
  589. GUI_InspectorBone("Little Proximal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleProximal);
  590. GUI_InspectorBone("Little Intermediate", false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleIntermediate);
  591. GUI_InspectorBone("Little Distal", false, VoxelSkinnedAnimationObject.HumanoidBone.RightLittleDistal);
  592. }
  593. #endregion
  594. }
  595. #endregion
  596. EditorGUILayout.EndScrollView();
  597. EditorGUILayout.EndVertical();
  598. #region Common Menu
  599. {
  600. GUILayout.BeginHorizontal("", guiStyleGVToolbar, GUILayout.ExpandWidth(true));
  601. #region Mapping
  602. {
  603. var mappingContent = new GUIContent("Mapping");
  604. var rect = GUILayoutUtility.GetRect(mappingContent, guiStyleGVGizmoDropDown);
  605. if (GUI.Button(rect, mappingContent, guiStyleGVGizmoDropDown))
  606. {
  607. GenericMenu menu = new GenericMenu();
  608. menu.AddItem(new GUIContent("Clear"), false, () => { animationCore.ResetHumanDescriptionHuman(); });
  609. menu.AddItem(new GUIContent("Automap"), false, () => { animationCore.AutomapHumanDescriptionHuman(); });
  610. menu.ShowAsContext();
  611. }
  612. }
  613. #endregion
  614. #region Pose
  615. {
  616. var posecontent = new GUIContent("Pose");
  617. var rect = GUILayoutUtility.GetRect(posecontent, guiStyleGVGizmoDropDown);
  618. if (GUI.Button(rect, posecontent, guiStyleGVGizmoDropDown))
  619. {
  620. GenericMenu menu = new GenericMenu();
  621. menu.AddItem(new GUIContent("Reset"), false, () => { animationCore.ResetBoneTransform(); });
  622. menu.ShowAsContext();
  623. }
  624. }
  625. #endregion
  626. GUILayout.FlexibleSpace();
  627. GUILayout.EndHorizontal();
  628. }
  629. #endregion
  630. }
  631. else if (humanoidAvatarConfigreMode == HumanoidAvatarConfigreMode.MusclesAndSettings)
  632. {
  633. #region Additional Settings
  634. {
  635. #region BackGround
  636. {
  637. var rect = EditorGUILayout.GetControlRect();
  638. rect.position = new Vector2(rect.position.x, rect.position.y + 7);
  639. rect.width -= 1;
  640. var width = rect.width;
  641. rect.width = 80f;
  642. GUI.Box(rect, "", guiStyleOLTitle);
  643. rect.position = new Vector2(rect.position.x + rect.width, rect.position.y);
  644. rect.width = width - rect.width;
  645. GUI.Box(rect, "Additional Settings", guiStyleOLTitle);
  646. GUILayout.Space(rect.height + 10);
  647. }
  648. #endregion
  649. #region Params
  650. {
  651. EditorGUILayout.BeginVertical(GUI.skin.box);
  652. GUI_AddsionalSettingsSlider("Upper Arm Twist", ref animationObject.humanDescription.upperArmTwist);
  653. GUI_AddsionalSettingsSlider("Lower Arm Twist", ref animationObject.humanDescription.lowerArmTwist);
  654. GUI_AddsionalSettingsSlider("Upper Leg Twist", ref animationObject.humanDescription.upperLegTwist);
  655. GUI_AddsionalSettingsSlider("Lower Leg Twist", ref animationObject.humanDescription.lowerLegTwist);
  656. GUI_AddsionalSettingsSlider("Arm Stretch", ref animationObject.humanDescription.armStretch);
  657. GUI_AddsionalSettingsSlider("Leg Stretch", ref animationObject.humanDescription.legStretch);
  658. GUI_AddsionalSettingsSlider("Feet Spacing", ref animationObject.humanDescription.feetSpacing);
  659. {
  660. EditorGUILayout.BeginHorizontal();
  661. GUILayout.Space(88);
  662. EditorGUILayout.LabelField("Translation DoF", GUILayout.Width(105));
  663. EditorGUI.BeginChangeCheck();
  664. var tmp = EditorGUILayout.Toggle(animationObject.humanDescription.hasTranslationDoF);
  665. if (EditorGUI.EndChangeCheck())
  666. {
  667. Undo.RecordObject(animationObject, "Additional Settings");
  668. animationObject.humanDescription.hasTranslationDoF = tmp;
  669. }
  670. EditorGUILayout.EndHorizontal();
  671. }
  672. EditorGUILayout.EndVertical();
  673. }
  674. #endregion
  675. }
  676. #endregion
  677. #region Common Menu
  678. {
  679. GUILayout.BeginHorizontal("", guiStyleGVToolbar, GUILayout.ExpandWidth(true));
  680. #region Muscles
  681. {
  682. var musclesContent = new GUIContent("Muscles");
  683. var rect = GUILayoutUtility.GetRect(musclesContent, guiStyleGVGizmoDropDown);
  684. if (GUI.Button(rect, musclesContent, guiStyleGVGizmoDropDown))
  685. {
  686. GenericMenu menu = new GenericMenu();
  687. menu.AddItem(new GUIContent("Reset"), false, () => { animationObject.humanDescription.ResetAdditionalSettings(); });
  688. menu.ShowAsContext();
  689. }
  690. }
  691. #endregion
  692. GUILayout.FlexibleSpace();
  693. GUILayout.EndHorizontal();
  694. }
  695. #endregion
  696. }
  697. #region Button
  698. {
  699. EditorGUILayout.BeginHorizontal();
  700. {
  701. GUILayout.FlexibleSpace();
  702. EditorGUI.BeginDisabledGroup(!animationObject.humanDescription.IsChanged(ref saveHumanDescription));
  703. #region Revert
  704. if (GUILayout.Button("Revert"))
  705. {
  706. Undo.RecordObject(animationObject, "Configure Avatar Revert");
  707. animationObject.humanDescription = new VoxelSkinnedAnimationObject.VoxelImporterHumanDescription(ref saveHumanDescription);
  708. }
  709. #endregion
  710. #region Apply
  711. if (GUILayout.Button("Apply"))
  712. {
  713. Undo.RecordObject(animationObject, "Configure Avatar Apply");
  714. saveHumanDescription = new VoxelSkinnedAnimationObject.VoxelImporterHumanDescription(ref animationObject.humanDescription);
  715. animationCore.UpdateBoneWeight();
  716. }
  717. #endregion
  718. EditorGUI.EndDisabledGroup();
  719. #region Done
  720. if (GUILayout.Button("Done"))
  721. {
  722. Close();
  723. }
  724. #endregion
  725. }
  726. EditorGUILayout.EndHorizontal();
  727. }
  728. #endregion
  729. }
  730. private void GUI_InspectorBone(string name, bool required, VoxelSkinnedAnimationObject.HumanoidBone select)
  731. {
  732. string errorMessage = "";
  733. var bone = GetHumanDescriptionBone(select);
  734. EditorGUILayout.BeginHorizontal();
  735. GUILayout.Space(19);
  736. {
  737. var saveGUIColor = GUI.color;
  738. Texture2D frameTex = required ? dotframe : dotframedotted;
  739. if (bone != null)
  740. {
  741. if (IsBoneError(select, ref errorMessage))
  742. {
  743. GUI.color = new Color(0.8f, 0.2f, 0.2f);
  744. }
  745. else
  746. {
  747. GUI.color = new Color(0.2f, 0.8f, 0.2f);
  748. }
  749. }
  750. else
  751. {
  752. GUI.color = Color.gray;
  753. }
  754. guiStyleBoneButton.normal.background = frameTex;
  755. guiStyleBoneButton.active.background = frameTex;
  756. if (GUILayout.Button(bone != null ? dotfill : null, guiStyleBoneButton, GUILayout.Width(frameTex.width), GUILayout.Height(frameTex.height)))
  757. {
  758. selectBone = select;
  759. if (bone != null)
  760. {
  761. Selection.activeGameObject = bone.gameObject;
  762. EditorGUIUtility.PingObject(Selection.activeGameObject);
  763. }
  764. }
  765. if (selectBone == select)
  766. {
  767. GUILayout.Space(-frameTex.width);
  768. guiStyleBoneButton.normal.background = null;
  769. guiStyleBoneButton.active.background = null;
  770. GUI.color = new Color32(102, 178, 255, 255);
  771. GUILayout.Button(dotselection, guiStyleBoneButton, GUILayout.Width(dotselection.width), GUILayout.Height(dotselection.height));
  772. }
  773. GUI.color = saveGUIColor;
  774. GUILayout.Space(-4);
  775. }
  776. {
  777. EditorGUI.BeginChangeCheck();
  778. var boneTmp = (VoxelSkinnedAnimationObjectBone)EditorGUILayout.ObjectField(name, bone, typeof(VoxelSkinnedAnimationObjectBone), true);
  779. if (EditorGUI.EndChangeCheck())
  780. {
  781. if (boneTmp == null || boneTmp.voxelObject == animationObject)
  782. {
  783. Undo.RecordObject(animationObject, "Inspector");
  784. SetHumanDescriptionBone(select, boneTmp);
  785. }
  786. }
  787. }
  788. EditorGUILayout.EndHorizontal();
  789. if (!string.IsNullOrEmpty(errorMessage))
  790. {
  791. EditorGUI.indentLevel += 2;
  792. EditorGUILayout.HelpBox(errorMessage, MessageType.Error);
  793. EditorGUI.indentLevel -= 2;
  794. }
  795. }
  796. private void GUI_PreviewBone(Vector2 position, bool required, VoxelSkinnedAnimationObject.HumanoidBone select)
  797. {
  798. var bone = GetHumanDescriptionBone(select);
  799. var saveGUIColor = GUI.color;
  800. Texture2D frameTex = required ? dotframe : dotframedotted;
  801. if (bone != null)
  802. {
  803. string errorMessage = "";
  804. if (IsBoneError(select, ref errorMessage))
  805. {
  806. GUI.color = new Color(0.8f, 0.2f, 0.2f);
  807. }
  808. else
  809. {
  810. GUI.color = new Color(0.2f, 0.8f, 0.2f);
  811. }
  812. }
  813. else
  814. {
  815. GUI.color = Color.gray;
  816. }
  817. Rect rect = new Rect(new Vector2(position.x - frameTex.width / 2f, position.y - frameTex.height / 2f), new Vector2(frameTex.width, frameTex.height));
  818. guiStyleBoneButton.normal.background = frameTex;
  819. guiStyleBoneButton.active.background = frameTex;
  820. if (GUI.Button(rect, bone != null ? dotfill : null, guiStyleBoneButton))
  821. {
  822. selectBone = select;
  823. if (bone != null)
  824. {
  825. Selection.activeGameObject = bone.gameObject;
  826. EditorGUIUtility.PingObject(Selection.activeGameObject);
  827. }
  828. }
  829. if (selectBone == select)
  830. {
  831. guiStyleBoneButton.normal.background = null;
  832. guiStyleBoneButton.active.background = null;
  833. GUI.color = new Color32(102, 178, 255, 255);
  834. GUI.Button(rect, dotselection, guiStyleBoneButton);
  835. }
  836. GUI.color = saveGUIColor;
  837. }
  838. private void GUI_AddsionalSettingsSlider(string label, ref float param)
  839. {
  840. EditorGUILayout.BeginHorizontal();
  841. GUILayout.Space(88);
  842. EditorGUILayout.LabelField(label, GUILayout.Width(105));
  843. EditorGUI.BeginChangeCheck();
  844. var tmp = EditorGUILayout.Slider(param, 0f, 1f);
  845. if (EditorGUI.EndChangeCheck())
  846. {
  847. Undo.RecordObject(animationObject, "Additional Settings");
  848. param = tmp;
  849. }
  850. EditorGUILayout.EndHorizontal();
  851. }
  852. private bool IsChildTransformCheck(VoxelSkinnedAnimationObjectBone parentBone, VoxelSkinnedAnimationObjectBone childBone)
  853. {
  854. var bone = childBone.transform.parent;
  855. while (bone.parent != null)
  856. {
  857. if (bone == parentBone.transform)
  858. return true;
  859. bone = bone.parent;
  860. }
  861. return false;
  862. }
  863. private bool IsHeadEnable()
  864. {
  865. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.Head) == null) return false;
  866. string errorMessage = "";
  867. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.Neck; i <= VoxelSkinnedAnimationObject.HumanoidBone.Jaw; i++)
  868. {
  869. if (IsBoneError(i, ref errorMessage))
  870. return false;
  871. }
  872. return true;
  873. }
  874. private bool IsTorsoEnable()
  875. {
  876. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.Hips) == null ||
  877. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.Spine) == null) return false;
  878. string errorMessage = "";
  879. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.Hips; i <= VoxelSkinnedAnimationObject.HumanoidBone.Chest; i++)
  880. {
  881. if (IsBoneError(i, ref errorMessage))
  882. return false;
  883. }
  884. return true;
  885. }
  886. private bool IsLeftArmEnable()
  887. {
  888. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperArm) == null ||
  889. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerArm) == null ||
  890. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand) == null) return false;
  891. string errorMessage = "";
  892. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.LeftShoulder; i <= VoxelSkinnedAnimationObject.HumanoidBone.LeftHand; i++)
  893. {
  894. if (IsBoneError(i, ref errorMessage))
  895. return false;
  896. }
  897. return true;
  898. }
  899. private bool IsLeftFingersHave()
  900. {
  901. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal; i <= VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleDistal; i++)
  902. {
  903. if (GetHumanDescriptionBone(i) != null)
  904. return true;
  905. }
  906. return false;
  907. }
  908. private bool IsLeftFingersEnable()
  909. {
  910. string errorMessage = "";
  911. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal; i <= VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleDistal; i++)
  912. {
  913. if (IsBoneError(i, ref errorMessage))
  914. return false;
  915. }
  916. return true;
  917. }
  918. private bool IsLeftLegEnable()
  919. {
  920. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg) == null ||
  921. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerLeg) == null ||
  922. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.LeftFoot) == null) return false;
  923. string errorMessage = "";
  924. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg; i <= VoxelSkinnedAnimationObject.HumanoidBone.LeftToes; i++)
  925. {
  926. if (IsBoneError(i, ref errorMessage))
  927. return false;
  928. }
  929. return true;
  930. }
  931. private bool IsRightArmEnable()
  932. {
  933. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightUpperArm) == null ||
  934. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightLowerArm) == null ||
  935. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightHand) == null) return false;
  936. string errorMessage = "";
  937. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.RightShoulder; i <= VoxelSkinnedAnimationObject.HumanoidBone.RightHand; i++)
  938. {
  939. if (IsBoneError(i, ref errorMessage))
  940. return false;
  941. }
  942. return true;
  943. }
  944. private bool IsRightFingersHave()
  945. {
  946. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal; i <= VoxelSkinnedAnimationObject.HumanoidBone.RightLittleDistal; i++)
  947. {
  948. if (GetHumanDescriptionBone(i) != null)
  949. return true;
  950. }
  951. return false;
  952. }
  953. private bool IsRightFingersEnable()
  954. {
  955. string errorMessage = "";
  956. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal; i <= VoxelSkinnedAnimationObject.HumanoidBone.RightLittleDistal; i++)
  957. {
  958. if (IsBoneError(i, ref errorMessage))
  959. return false;
  960. }
  961. return true;
  962. }
  963. private bool IsRightLegEnable()
  964. {
  965. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg) == null ||
  966. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightLowerLeg) == null ||
  967. GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.RightFoot) == null) return false;
  968. string errorMessage = "";
  969. for (var i = VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg; i <= VoxelSkinnedAnimationObject.HumanoidBone.RightToes; i++)
  970. {
  971. if (IsBoneError(i, ref errorMessage))
  972. return false;
  973. }
  974. return true;
  975. }
  976. private bool IsBoneError(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, ref string errorMessage)
  977. {
  978. if (IsBoneUniqueCheck(boneIndex, ref errorMessage)) return true;
  979. if (IsBoneConflict(boneIndex, ref errorMessage)) return true;
  980. if (IsBoneTransformParentError(boneIndex, ref errorMessage)) return true;
  981. if (IsBoneLengthZero(boneIndex, ref errorMessage)) return true;
  982. return false;
  983. }
  984. private bool IsBoneUniqueCheck(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, ref string errorMessage)
  985. {
  986. var bone = GetHumanDescriptionBone(boneIndex);
  987. if (bone == null) return false;
  988. switch (boneIndex)
  989. {
  990. case VoxelSkinnedAnimationObject.HumanoidBone.Hips:
  991. if (bone.transform.parent == null)
  992. {
  993. errorMessage = bone.name + " cannot be the root transform";
  994. return true;
  995. }
  996. break;
  997. case VoxelSkinnedAnimationObject.HumanoidBone.UpperChest:
  998. if (GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone.Chest) == null)
  999. {
  1000. errorMessage = "Chest must be assigned before assigning UpperChest.";
  1001. return true;
  1002. }
  1003. break;
  1004. }
  1005. return false;
  1006. }
  1007. private bool IsBoneConflict(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, ref string errorMessage)
  1008. {
  1009. var bone = GetHumanDescriptionBone(boneIndex);
  1010. if (bone == null) return false;
  1011. int count = 0;
  1012. for (int i = 0; i < animationObject.humanDescription.bones.Length; i++)
  1013. {
  1014. if (animationObject.humanDescription.bones[i] == bone) count++;
  1015. }
  1016. if (count != 1 && errorMessage != null)
  1017. {
  1018. string names = "";
  1019. for (int i = 0; i < animationObject.humanDescription.bones.Length; i++)
  1020. {
  1021. if ((VoxelSkinnedAnimationObject.HumanoidBone)i != boneIndex && animationObject.humanDescription.bones[i] == bone)
  1022. {
  1023. if (string.IsNullOrEmpty(names)) names = ((VoxelSkinnedAnimationObject.HumanoidBone)i).ToString();
  1024. else names += ", " + ((VoxelSkinnedAnimationObject.HumanoidBone)i).ToString();
  1025. }
  1026. }
  1027. errorMessage = string.Format("{0} Transform '{1}' is also assigned to {2}.", boneIndex.ToString(), bone.name, names);
  1028. }
  1029. return count != 1;
  1030. }
  1031. private bool IsBoneTransformParentError(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, ref string errorMessage)
  1032. {
  1033. var bone = GetHumanDescriptionBone(boneIndex);
  1034. if (bone == null) return false;
  1035. var boneParent = bone.transform.parent;
  1036. VoxelSkinnedAnimationObject.HumanoidBone errorParent = (VoxelSkinnedAnimationObject.HumanoidBone)(-1);
  1037. Func<VoxelSkinnedAnimationObject.HumanoidBone, bool> CheckTransform = (checkIndex) =>
  1038. {
  1039. Transform checkTransform = null;
  1040. {
  1041. var checkBone = GetHumanDescriptionBone(checkIndex);
  1042. if (checkBone == null)
  1043. {
  1044. errorParent = checkIndex;
  1045. return false;
  1046. }
  1047. checkTransform = checkBone.transform;
  1048. }
  1049. if (!boneParent.IsChildOf(checkTransform))
  1050. {
  1051. errorParent = checkIndex;
  1052. return false;
  1053. }
  1054. return true;
  1055. };
  1056. bool result = true;
  1057. switch (boneIndex)
  1058. {
  1059. case VoxelSkinnedAnimationObject.HumanoidBone.Hips:
  1060. break;
  1061. case VoxelSkinnedAnimationObject.HumanoidBone.Spine:
  1062. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Hips);
  1063. break;
  1064. case VoxelSkinnedAnimationObject.HumanoidBone.Chest:
  1065. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine);
  1066. break;
  1067. case VoxelSkinnedAnimationObject.HumanoidBone.LeftShoulder:
  1068. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1069. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1070. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1071. result = false;
  1072. break;
  1073. case VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperArm:
  1074. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftShoulder) &&
  1075. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1076. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1077. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1078. result = false;
  1079. break;
  1080. case VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerArm:
  1081. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperArm);
  1082. break;
  1083. case VoxelSkinnedAnimationObject.HumanoidBone.LeftHand:
  1084. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerArm);
  1085. break;
  1086. case VoxelSkinnedAnimationObject.HumanoidBone.RightShoulder:
  1087. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1088. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1089. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1090. result = false;
  1091. break;
  1092. case VoxelSkinnedAnimationObject.HumanoidBone.RightUpperArm:
  1093. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightShoulder) &&
  1094. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1095. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1096. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1097. result = false;
  1098. break;
  1099. case VoxelSkinnedAnimationObject.HumanoidBone.RightLowerArm:
  1100. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightUpperArm);
  1101. break;
  1102. case VoxelSkinnedAnimationObject.HumanoidBone.RightHand:
  1103. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightLowerArm);
  1104. break;
  1105. case VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg:
  1106. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Hips);
  1107. break;
  1108. case VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerLeg:
  1109. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftUpperLeg);
  1110. break;
  1111. case VoxelSkinnedAnimationObject.HumanoidBone.LeftFoot:
  1112. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftLowerLeg);
  1113. break;
  1114. case VoxelSkinnedAnimationObject.HumanoidBone.LeftToes:
  1115. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftFoot);
  1116. break;
  1117. case VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg:
  1118. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Hips);
  1119. break;
  1120. case VoxelSkinnedAnimationObject.HumanoidBone.RightLowerLeg:
  1121. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightUpperLeg);
  1122. break;
  1123. case VoxelSkinnedAnimationObject.HumanoidBone.RightFoot:
  1124. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightLowerLeg);
  1125. break;
  1126. case VoxelSkinnedAnimationObject.HumanoidBone.RightToes:
  1127. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightFoot);
  1128. break;
  1129. case VoxelSkinnedAnimationObject.HumanoidBone.Neck:
  1130. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1131. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1132. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1133. result = false;
  1134. break;
  1135. case VoxelSkinnedAnimationObject.HumanoidBone.Head:
  1136. if (!CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Neck) &&
  1137. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.UpperChest) &&
  1138. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest) &&
  1139. !CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Spine))
  1140. result = false;
  1141. break;
  1142. case VoxelSkinnedAnimationObject.HumanoidBone.LeftEye:
  1143. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Head);
  1144. break;
  1145. case VoxelSkinnedAnimationObject.HumanoidBone.RightEye:
  1146. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Head);
  1147. break;
  1148. case VoxelSkinnedAnimationObject.HumanoidBone.Jaw:
  1149. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Head);
  1150. break;
  1151. case VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal:
  1152. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  1153. break;
  1154. case VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbIntermediate:
  1155. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbProximal);
  1156. break;
  1157. case VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbDistal:
  1158. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftThumbIntermediate);
  1159. break;
  1160. case VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexProximal:
  1161. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  1162. break;
  1163. case VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexIntermediate:
  1164. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexProximal);
  1165. break;
  1166. case VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexDistal:
  1167. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftIndexIntermediate);
  1168. break;
  1169. case VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleProximal:
  1170. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  1171. break;
  1172. case VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleIntermediate:
  1173. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleProximal);
  1174. break;
  1175. case VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleDistal:
  1176. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftMiddleIntermediate);
  1177. break;
  1178. case VoxelSkinnedAnimationObject.HumanoidBone.LeftRingProximal:
  1179. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  1180. break;
  1181. case VoxelSkinnedAnimationObject.HumanoidBone.LeftRingIntermediate:
  1182. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftRingProximal);
  1183. break;
  1184. case VoxelSkinnedAnimationObject.HumanoidBone.LeftRingDistal:
  1185. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftRingIntermediate);
  1186. break;
  1187. case VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleProximal:
  1188. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftHand);
  1189. break;
  1190. case VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleIntermediate:
  1191. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleProximal);
  1192. break;
  1193. case VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleDistal:
  1194. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.LeftLittleIntermediate);
  1195. break;
  1196. case VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal:
  1197. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  1198. break;
  1199. case VoxelSkinnedAnimationObject.HumanoidBone.RightThumbIntermediate:
  1200. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightThumbProximal);
  1201. break;
  1202. case VoxelSkinnedAnimationObject.HumanoidBone.RightThumbDistal:
  1203. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightThumbIntermediate);
  1204. break;
  1205. case VoxelSkinnedAnimationObject.HumanoidBone.RightIndexProximal:
  1206. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  1207. break;
  1208. case VoxelSkinnedAnimationObject.HumanoidBone.RightIndexIntermediate:
  1209. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightIndexProximal);
  1210. break;
  1211. case VoxelSkinnedAnimationObject.HumanoidBone.RightIndexDistal:
  1212. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightIndexIntermediate);
  1213. break;
  1214. case VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleProximal:
  1215. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  1216. break;
  1217. case VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleIntermediate:
  1218. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleProximal);
  1219. break;
  1220. case VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleDistal:
  1221. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightMiddleIntermediate);
  1222. break;
  1223. case VoxelSkinnedAnimationObject.HumanoidBone.RightRingProximal:
  1224. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  1225. break;
  1226. case VoxelSkinnedAnimationObject.HumanoidBone.RightRingIntermediate:
  1227. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightRingProximal);
  1228. break;
  1229. case VoxelSkinnedAnimationObject.HumanoidBone.RightRingDistal:
  1230. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightRingIntermediate);
  1231. break;
  1232. case VoxelSkinnedAnimationObject.HumanoidBone.RightLittleProximal:
  1233. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightHand);
  1234. break;
  1235. case VoxelSkinnedAnimationObject.HumanoidBone.RightLittleIntermediate:
  1236. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightLittleProximal);
  1237. break;
  1238. case VoxelSkinnedAnimationObject.HumanoidBone.RightLittleDistal:
  1239. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.RightLittleIntermediate);
  1240. break;
  1241. case VoxelSkinnedAnimationObject.HumanoidBone.UpperChest:
  1242. result = CheckTransform(VoxelSkinnedAnimationObject.HumanoidBone.Chest);
  1243. break;
  1244. }
  1245. if (!result)
  1246. {
  1247. var boneError = GetHumanDescriptionBone(errorParent);
  1248. if (boneError != null)
  1249. errorMessage = string.Format("{0} Transform '{1}' is not a child of {2} Transform '{3}'.", boneIndex.ToString(), bone.name, errorParent.ToString(), boneError.name);
  1250. else
  1251. errorMessage = string.Format("{0} Transform '{1}' parent {2} Transform is null.", boneIndex.ToString(), bone.name, errorParent.ToString());
  1252. }
  1253. return !result;
  1254. }
  1255. private bool IsBoneLengthZero(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, ref string errorMessage)
  1256. {
  1257. var bone = GetHumanDescriptionBone(boneIndex);
  1258. if (bone == null) return false;
  1259. var result = bone.transform.localPosition.sqrMagnitude == 0f;
  1260. if (result)
  1261. {
  1262. errorMessage = string.Format("{0} Transform '{1}' has bone length of zero.", boneIndex.ToString(), bone.name);
  1263. }
  1264. return result;
  1265. }
  1266. private VoxelSkinnedAnimationObjectBone GetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone boneIndex)
  1267. {
  1268. if (animationObject.humanDescription.bones != null && (int)boneIndex >= 0 && (int)boneIndex < animationObject.humanDescription.bones.Length)
  1269. return animationObject.humanDescription.bones[(int)boneIndex];
  1270. else
  1271. return null;
  1272. }
  1273. private void SetHumanDescriptionBone(VoxelSkinnedAnimationObject.HumanoidBone boneIndex, VoxelSkinnedAnimationObjectBone bone)
  1274. {
  1275. if (animationObject.humanDescription.bones == null)
  1276. animationObject.humanDescription.ResetMapping();
  1277. if ((int)boneIndex >= 0 && animationObject.humanDescription.bones.Length <= (int)boneIndex)
  1278. ArrayUtility.AddRange(ref animationObject.humanDescription.bones, new VoxelSkinnedAnimationObjectBone[(int)boneIndex - animationObject.humanDescription.bones.Length + 1]);
  1279. animationObject.humanDescription.bones[(int)boneIndex] = bone;
  1280. }
  1281. }
  1282. }