VoxelSkinnedAnimationObjectBoneCore.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. using UnityEngine;
  2. using UnityEngine.Assertions;
  3. using UnityEditor;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. namespace VoxelImporter
  8. {
  9. public class VoxelSkinnedAnimationObjectBoneCore
  10. {
  11. public VoxelSkinnedAnimationObjectBone voxelBone { get; protected set; }
  12. public VoxelSkinnedAnimationObjectCore objectCore { get; protected set; }
  13. private VoxelSkinnedAnimationObjectBoneCore _mirrorBoneCore;
  14. public VoxelSkinnedAnimationObjectBoneCore mirrorBoneCore
  15. {
  16. get
  17. {
  18. if(_mirrorBoneCore == null)
  19. _mirrorBoneCore = new VoxelSkinnedAnimationObjectBoneCore(voxelBone.mirrorBone, objectCore);
  20. return _mirrorBoneCore;
  21. }
  22. }
  23. public VoxelSkinnedAnimationObjectBoneCore(VoxelSkinnedAnimationObjectBone target, VoxelSkinnedAnimationObjectCore objCore)
  24. {
  25. voxelBone = target;
  26. objectCore = objCore;
  27. }
  28. public void Initialize()
  29. {
  30. voxelBone.EditorInitialize();
  31. }
  32. public void UpdateBoneWeight(int boneIndex = -1)
  33. {
  34. Undo.RecordObject(voxelBone, "Update Bone Weight");
  35. if (boneIndex >= 0)
  36. voxelBone.boneIndex = boneIndex;
  37. if (voxelBone.weightData == null)
  38. {
  39. voxelBone.weightData = new WeightData();
  40. }
  41. #region Erase
  42. {
  43. List<IntVector3> removeList = new List<IntVector3>();
  44. voxelBone.weightData.AllAction((pos, weights) =>
  45. {
  46. if (voxelBone.voxelObject.voxelData.VoxelTableContains(pos) < 0 ||
  47. !weights.HasValue())
  48. {
  49. removeList.Add(pos);
  50. }
  51. });
  52. for (int i = 0; i < removeList.Count; i++)
  53. {
  54. voxelBone.weightData.RemoveWeight(removeList[i]);
  55. }
  56. }
  57. #endregion
  58. }
  59. public bool IsHaveEraseDisablePositionAnimation()
  60. {
  61. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  62. if (animator != null && animator.runtimeAnimatorController != null)
  63. {
  64. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  65. {
  66. var bindings = AnimationUtility.GetCurveBindings(clip);
  67. for (int i = 0; i < bindings.Length; i++)
  68. {
  69. if (bindings[i].path != fullPathBoneName)
  70. continue;
  71. if (bindings[i].propertyName.StartsWith("m_LocalPosition."))
  72. {
  73. return true;
  74. }
  75. }
  76. }
  77. }
  78. return false;
  79. }
  80. public bool IsHaveEraseDisableRotationAnimation()
  81. {
  82. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  83. if (animator != null && animator.runtimeAnimatorController != null)
  84. {
  85. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  86. {
  87. var bindings = AnimationUtility.GetCurveBindings(clip);
  88. for (int i = 0; i < bindings.Length; i++)
  89. {
  90. if (bindings[i].path != fullPathBoneName)
  91. continue;
  92. if (bindings[i].propertyName.StartsWith("localEulerAnglesRaw."))
  93. {
  94. return true;
  95. }
  96. }
  97. }
  98. }
  99. return false;
  100. }
  101. public bool IsHaveEraseDisableScaleAnimation()
  102. {
  103. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  104. if (animator != null && animator.runtimeAnimatorController != null)
  105. {
  106. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  107. {
  108. var bindings = AnimationUtility.GetCurveBindings(clip);
  109. for (int i = 0; i < bindings.Length; i++)
  110. {
  111. if (bindings[i].path != fullPathBoneName)
  112. continue;
  113. if (bindings[i].propertyName.StartsWith("m_LocalScale."))
  114. {
  115. return true;
  116. }
  117. }
  118. }
  119. }
  120. return false;
  121. }
  122. public void EraseDisableAnimation()
  123. {
  124. if (voxelBone.edit_disablePositionAnimation || voxelBone.edit_disableRotationAnimation || voxelBone.edit_disableScaleAnimation)
  125. {
  126. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  127. if (animator != null && animator.runtimeAnimatorController != null)
  128. {
  129. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  130. {
  131. var bindings = AnimationUtility.GetCurveBindings(clip);
  132. if (bindings.IsReadOnly) continue;
  133. for (int i = 0; i < bindings.Length; i++)
  134. {
  135. if (bindings[i].path != fullPathBoneName)
  136. continue;
  137. if ((voxelBone.edit_disablePositionAnimation && bindings[i].propertyName.StartsWith("m_LocalPosition.")) ||
  138. (voxelBone.edit_disableRotationAnimation && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.")) ||
  139. (voxelBone.edit_disableScaleAnimation && bindings[i].propertyName.StartsWith("m_LocalScale.")))
  140. {
  141. AnimationUtility.SetEditorCurve(clip, bindings[i], null);
  142. }
  143. }
  144. }
  145. }
  146. }
  147. }
  148. public void MirroringAnimation()
  149. {
  150. if (voxelBone.edit_mirrorSetBoneAnimation && voxelBone.mirrorBone != null)
  151. {
  152. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  153. if (animator != null && animator.runtimeAnimatorController != null)
  154. {
  155. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  156. {
  157. var bindings = AnimationUtility.GetCurveBindings(clip);
  158. if (bindings.IsReadOnly) continue;
  159. for (int i = 0; i < bindings.Length; i++)
  160. {
  161. if (bindings[i].path != fullPathBoneName)
  162. continue;
  163. var curve = AnimationUtility.GetEditorCurve(clip, bindings[i]);
  164. if ((!voxelBone.edit_disablePositionAnimation &&
  165. ((voxelBone.voxelObject.edit_mirrorPosition[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.x")) ||
  166. (voxelBone.voxelObject.edit_mirrorPosition[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.y")) ||
  167. (voxelBone.voxelObject.edit_mirrorPosition[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.z")))) ||
  168. (!voxelBone.edit_disableRotationAnimation &&
  169. ((voxelBone.voxelObject.edit_mirrorRotation[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.x")) ||
  170. (voxelBone.voxelObject.edit_mirrorRotation[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.y")) ||
  171. (voxelBone.voxelObject.edit_mirrorRotation[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.z")))) ||
  172. (!voxelBone.edit_disableScaleAnimation &&
  173. ((voxelBone.voxelObject.edit_mirrorScale[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.x")) ||
  174. (voxelBone.voxelObject.edit_mirrorScale[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.y")) ||
  175. (voxelBone.voxelObject.edit_mirrorScale[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.z")))))
  176. {
  177. EditorCurveBinding? mirrorBinding = null;
  178. AnimationCurve mirrorCurve = null;
  179. for (int j = 0; j < bindings.Length; j++)
  180. {
  181. if (bindings[j].path == mirrorBoneCore.fullPathBoneName && bindings[j].propertyName == bindings[i].propertyName)
  182. {
  183. mirrorBinding = bindings[j];
  184. mirrorCurve = AnimationUtility.GetEditorCurve(clip, bindings[j]);
  185. break;
  186. }
  187. }
  188. Func<Keyframe[], Keyframe[]> Mirroring = (keys) =>
  189. {
  190. if ((voxelBone.voxelObject.edit_mirrorPosition[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.x")) ||
  191. (voxelBone.voxelObject.edit_mirrorPosition[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.y")) ||
  192. (voxelBone.voxelObject.edit_mirrorPosition[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.z")) ||
  193. (voxelBone.voxelObject.edit_mirrorRotation[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.x")) ||
  194. (voxelBone.voxelObject.edit_mirrorRotation[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.y")) ||
  195. (voxelBone.voxelObject.edit_mirrorRotation[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.z")) ||
  196. (voxelBone.voxelObject.edit_mirrorScale[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.x")) ||
  197. (voxelBone.voxelObject.edit_mirrorScale[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.y")) ||
  198. (voxelBone.voxelObject.edit_mirrorScale[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.z")))
  199. {
  200. for (int k = 0; k < keys.Length; k++)
  201. {
  202. keys[k].inTangent = -keys[k].inTangent;
  203. keys[k].outTangent = -keys[k].outTangent;
  204. keys[k].value = -keys[k].value;
  205. }
  206. }
  207. return keys;
  208. };
  209. bool updateCurve = false;
  210. if (!mirrorBinding.HasValue)
  211. {
  212. EditorCurveBinding newBinding = new EditorCurveBinding();
  213. newBinding.path = mirrorBoneCore.fullPathBoneName;
  214. newBinding.type = bindings[i].type;
  215. newBinding.propertyName = bindings[i].propertyName;
  216. mirrorBinding = newBinding;
  217. mirrorCurve = new AnimationCurve(Mirroring(curve.keys));
  218. updateCurve = true;
  219. }
  220. else
  221. {
  222. mirrorCurve = AnimationUtility.GetEditorCurve(clip, mirrorBinding.Value);
  223. if (curve.length != mirrorCurve.length)
  224. {
  225. mirrorCurve = new AnimationCurve(Mirroring(curve.keys));
  226. updateCurve = true;
  227. }
  228. else
  229. {
  230. var mirrorKeys = Mirroring(curve.keys);
  231. for (int k = 0; k < mirrorCurve.length; k++)
  232. {
  233. if (mirrorCurve[k].inTangent != mirrorKeys[k].inTangent ||
  234. mirrorCurve[k].outTangent != mirrorKeys[k].outTangent ||
  235. mirrorCurve[k].time != mirrorKeys[k].time ||
  236. mirrorCurve[k].value != mirrorKeys[k].value)
  237. {
  238. mirrorCurve = new AnimationCurve(mirrorKeys);
  239. updateCurve = true;
  240. break;
  241. }
  242. }
  243. }
  244. }
  245. if (updateCurve)
  246. {
  247. AnimationUtility.SetEditorCurve(clip, mirrorBinding.Value, mirrorCurve);
  248. }
  249. }
  250. }
  251. }
  252. }
  253. }
  254. }
  255. public void FixMissingAnimation()
  256. {
  257. var animator = voxelBone.voxelObject.GetComponent<Animator>();
  258. if (animator != null && animator.runtimeAnimatorController != null)
  259. {
  260. string[] bonePaths = new string[objectCore.animationObject.bones.Length];
  261. for (int i = 0; i < objectCore.animationObject.bones.Length; i++)
  262. {
  263. if (objectCore.animationObject.bones[i] == null) continue;
  264. bonePaths[i] = AnimationUtility.CalculateTransformPath(objectCore.animationObject.bones[i].transform, voxelBone.voxelObject.transform);
  265. }
  266. foreach (var clip in animator.runtimeAnimatorController.animationClips)
  267. {
  268. var bindings = AnimationUtility.GetCurveBindings(clip);
  269. if (bindings.IsReadOnly) continue;
  270. for (int i = 0; i < bindings.Length; i++)
  271. {
  272. bool missing = true;
  273. for (int j = 0; j < bonePaths.Length; j++)
  274. {
  275. if(bindings[i].path == bonePaths[j])
  276. {
  277. missing = false;
  278. break;
  279. }
  280. }
  281. if (!missing) continue;
  282. var curve = AnimationUtility.GetEditorCurve(clip, bindings[i]);
  283. {
  284. var index = bindings[i].path.IndexOf(fullPathBoneName);
  285. if (index >= 0 && bindings[i].path.Length == index + fullPathBoneName.Length)
  286. {
  287. AnimationUtility.SetEditorCurve(clip, bindings[i], null);
  288. bindings[i].path = fullPathBoneName;
  289. AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
  290. continue;
  291. }
  292. }
  293. {
  294. var index = fullPathBoneName.IndexOf(bindings[i].path);
  295. if (index >= 0 && fullPathBoneName.Length == index + bindings[i].path.Length)
  296. {
  297. AnimationUtility.SetEditorCurve(clip, bindings[i], null);
  298. bindings[i].path = fullPathBoneName;
  299. AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
  300. continue;
  301. }
  302. }
  303. {
  304. var index = bindings[i].path.LastIndexOf(voxelBone.name);
  305. if (index >= 0 && bindings[i].path.Length == index + voxelBone.name.Length)
  306. {
  307. AnimationUtility.SetEditorCurve(clip, bindings[i], null);
  308. bindings[i].path = fullPathBoneName;
  309. AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
  310. continue;
  311. }
  312. }
  313. }
  314. }
  315. }
  316. }
  317. public void MirrorBoneAnimation()
  318. {
  319. if (voxelBone.mirrorBone == null) return;
  320. if (!voxelBone.edit_mirrorSetBoneAnimation) return;
  321. #region Position
  322. {
  323. var tmp = voxelBone.transform.localPosition;
  324. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[0])
  325. {
  326. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localPosition.x; break;
  327. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localPosition.x; break;
  328. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localPosition.x; break;
  329. }
  330. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[1])
  331. {
  332. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localPosition.y; break;
  333. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localPosition.y; break;
  334. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localPosition.y; break;
  335. }
  336. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[2])
  337. {
  338. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localPosition.z; break;
  339. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localPosition.z; break;
  340. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localPosition.z; break;
  341. }
  342. if (voxelBone.mirrorBone.transform.localPosition != tmp)
  343. voxelBone.mirrorBone.transform.localPosition = tmp;
  344. }
  345. #endregion
  346. #region Rotation
  347. {
  348. var tmp = voxelBone.transform.localEulerAngles;
  349. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[0])
  350. {
  351. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localEulerAngles.x; break;
  352. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localEulerAngles.x; break;
  353. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localEulerAngles.x; break;
  354. }
  355. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[1])
  356. {
  357. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localEulerAngles.y; break;
  358. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localEulerAngles.y; break;
  359. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localEulerAngles.y; break;
  360. }
  361. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[2])
  362. {
  363. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localEulerAngles.z; break;
  364. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localEulerAngles.z; break;
  365. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localEulerAngles.z; break;
  366. }
  367. if (voxelBone.mirrorBone.transform.localEulerAngles != tmp)
  368. voxelBone.mirrorBone.transform.localEulerAngles = tmp;
  369. }
  370. #endregion
  371. #region Scale
  372. {
  373. var tmp = voxelBone.transform.localScale;
  374. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[0])
  375. {
  376. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localScale.x; break;
  377. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localScale.x; break;
  378. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localScale.x; break;
  379. }
  380. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[1])
  381. {
  382. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localScale.y; break;
  383. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localScale.y; break;
  384. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localScale.y; break;
  385. }
  386. switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[2])
  387. {
  388. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localScale.z; break;
  389. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localScale.z; break;
  390. case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localScale.z; break;
  391. }
  392. if (voxelBone.mirrorBone.transform.localScale != tmp)
  393. voxelBone.mirrorBone.transform.localScale = tmp;
  394. }
  395. #endregion
  396. }
  397. public void MirrorBonePosition()
  398. {
  399. if (voxelBone.mirrorBone == null) return;
  400. if (!voxelBone.edit_mirrorSetBonePosition) return;
  401. var tmp = voxelBone.transform.localPosition;
  402. tmp.x = -voxelBone.transform.localPosition.x;
  403. voxelBone.mirrorBone.transform.localPosition = tmp;
  404. }
  405. public void MirrorBoneWeight()
  406. {
  407. if (voxelBone.mirrorBone == null) return;
  408. if (!voxelBone.edit_mirrorSetBoneWeight) return;
  409. voxelBone.mirrorBone.transform.localPosition = new Vector3(-voxelBone.transform.localPosition.x, voxelBone.transform.localPosition.y, voxelBone.transform.localPosition.z);
  410. #region Weight
  411. {
  412. voxelBone.mirrorBone.weightData.ClearWeight();
  413. voxelBone.weightData.AllAction((pos, weights) =>
  414. {
  415. var newPos = GetMirrorVoxelPosition(pos);
  416. var newWeights = new WeightData.VoxelWeight();
  417. newWeights.weightXYZ = weights.weight_XYZ;
  418. newWeights.weight_XYZ = weights.weightXYZ;
  419. newWeights.weightX_YZ = weights.weight_X_YZ;
  420. newWeights.weightXY_Z = weights.weight_XY_Z;
  421. newWeights.weight_X_YZ = weights.weightX_YZ;
  422. newWeights.weight_XY_Z = weights.weightXY_Z;
  423. newWeights.weightX_Y_Z = weights.weight_X_Y_Z;
  424. newWeights.weight_X_Y_Z = weights.weightX_Y_Z;
  425. voxelBone.mirrorBone.weightData.SetWeight(newPos, newWeights);
  426. });
  427. }
  428. #endregion
  429. }
  430. public IntVector3 GetMirrorVoxelPosition(IntVector3 pos)
  431. {
  432. Assert.IsNotNull(voxelBone.mirrorBone);
  433. var srcVoxelPosition = objectCore.GetVoxelPosition(voxelBone.voxelObject.bindposes[voxelBone.boneIndex].inverse.GetColumn(3));
  434. var voxelPosition = objectCore.GetVoxelPosition(voxelBone.mirrorBone.voxelObject.bindposes[voxelBone.mirrorBone.boneIndex].inverse.GetColumn(3));
  435. IntVector3 newPos;
  436. {
  437. var offset = new Vector3(pos.x, pos.y, pos.z) - srcVoxelPosition;
  438. var mirror = voxelPosition + new Vector3(-offset.x - 1, offset.y, offset.z);
  439. newPos = new IntVector3(Mathf.RoundToInt(mirror.x), Mathf.RoundToInt(mirror.y), Mathf.RoundToInt(mirror.z));
  440. }
  441. return newPos;
  442. }
  443. private string _fullPathBoneName;
  444. public string fullPathBoneName
  445. {
  446. get
  447. {
  448. if (string.IsNullOrEmpty(_fullPathBoneName))
  449. _fullPathBoneName = AnimationUtility.CalculateTransformPath(voxelBone.transform, voxelBone.voxelObject.transform);
  450. return _fullPathBoneName;
  451. }
  452. }
  453. }
  454. }