123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- using UnityEngine;
- using UnityEngine.Assertions;
- using UnityEditor;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- namespace VoxelImporter
- {
- public class VoxelSkinnedAnimationObjectBoneCore
- {
- public VoxelSkinnedAnimationObjectBone voxelBone { get; protected set; }
- public VoxelSkinnedAnimationObjectCore objectCore { get; protected set; }
- private VoxelSkinnedAnimationObjectBoneCore _mirrorBoneCore;
- public VoxelSkinnedAnimationObjectBoneCore mirrorBoneCore
- {
- get
- {
- if(_mirrorBoneCore == null)
- _mirrorBoneCore = new VoxelSkinnedAnimationObjectBoneCore(voxelBone.mirrorBone, objectCore);
- return _mirrorBoneCore;
- }
- }
- public VoxelSkinnedAnimationObjectBoneCore(VoxelSkinnedAnimationObjectBone target, VoxelSkinnedAnimationObjectCore objCore)
- {
- voxelBone = target;
- objectCore = objCore;
- }
- public void Initialize()
- {
- voxelBone.EditorInitialize();
- }
- public void UpdateBoneWeight(int boneIndex = -1)
- {
- Undo.RecordObject(voxelBone, "Update Bone Weight");
- if (boneIndex >= 0)
- voxelBone.boneIndex = boneIndex;
- if (voxelBone.weightData == null)
- {
- voxelBone.weightData = new WeightData();
- }
- #region Erase
- {
- List<IntVector3> removeList = new List<IntVector3>();
- voxelBone.weightData.AllAction((pos, weights) =>
- {
- if (voxelBone.voxelObject.voxelData.VoxelTableContains(pos) < 0 ||
- !weights.HasValue())
- {
- removeList.Add(pos);
- }
- });
- for (int i = 0; i < removeList.Count; i++)
- {
- voxelBone.weightData.RemoveWeight(removeList[i]);
- }
- }
- #endregion
- }
- public bool IsHaveEraseDisablePositionAnimation()
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- for (int i = 0; i < bindings.Length; i++)
- {
- if (bindings[i].path != fullPathBoneName)
- continue;
- if (bindings[i].propertyName.StartsWith("m_LocalPosition."))
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- public bool IsHaveEraseDisableRotationAnimation()
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- for (int i = 0; i < bindings.Length; i++)
- {
- if (bindings[i].path != fullPathBoneName)
- continue;
- if (bindings[i].propertyName.StartsWith("localEulerAnglesRaw."))
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- public bool IsHaveEraseDisableScaleAnimation()
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- for (int i = 0; i < bindings.Length; i++)
- {
- if (bindings[i].path != fullPathBoneName)
- continue;
- if (bindings[i].propertyName.StartsWith("m_LocalScale."))
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- public void EraseDisableAnimation()
- {
- if (voxelBone.edit_disablePositionAnimation || voxelBone.edit_disableRotationAnimation || voxelBone.edit_disableScaleAnimation)
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- if (bindings.IsReadOnly) continue;
- for (int i = 0; i < bindings.Length; i++)
- {
- if (bindings[i].path != fullPathBoneName)
- continue;
- if ((voxelBone.edit_disablePositionAnimation && bindings[i].propertyName.StartsWith("m_LocalPosition.")) ||
- (voxelBone.edit_disableRotationAnimation && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.")) ||
- (voxelBone.edit_disableScaleAnimation && bindings[i].propertyName.StartsWith("m_LocalScale.")))
- {
- AnimationUtility.SetEditorCurve(clip, bindings[i], null);
- }
- }
- }
- }
- }
- }
- public void MirroringAnimation()
- {
- if (voxelBone.edit_mirrorSetBoneAnimation && voxelBone.mirrorBone != null)
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- if (bindings.IsReadOnly) continue;
- for (int i = 0; i < bindings.Length; i++)
- {
- if (bindings[i].path != fullPathBoneName)
- continue;
- var curve = AnimationUtility.GetEditorCurve(clip, bindings[i]);
- if ((!voxelBone.edit_disablePositionAnimation &&
- ((voxelBone.voxelObject.edit_mirrorPosition[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.x")) ||
- (voxelBone.voxelObject.edit_mirrorPosition[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.y")) ||
- (voxelBone.voxelObject.edit_mirrorPosition[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalPosition.z")))) ||
- (!voxelBone.edit_disableRotationAnimation &&
- ((voxelBone.voxelObject.edit_mirrorRotation[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.x")) ||
- (voxelBone.voxelObject.edit_mirrorRotation[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.y")) ||
- (voxelBone.voxelObject.edit_mirrorRotation[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.z")))) ||
- (!voxelBone.edit_disableScaleAnimation &&
- ((voxelBone.voxelObject.edit_mirrorScale[0] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.x")) ||
- (voxelBone.voxelObject.edit_mirrorScale[1] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.y")) ||
- (voxelBone.voxelObject.edit_mirrorScale[2] != VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None && bindings[i].propertyName.StartsWith("m_LocalScale.z")))))
- {
- EditorCurveBinding? mirrorBinding = null;
- AnimationCurve mirrorCurve = null;
- for (int j = 0; j < bindings.Length; j++)
- {
- if (bindings[j].path == mirrorBoneCore.fullPathBoneName && bindings[j].propertyName == bindings[i].propertyName)
- {
- mirrorBinding = bindings[j];
- mirrorCurve = AnimationUtility.GetEditorCurve(clip, bindings[j]);
- break;
- }
- }
- Func<Keyframe[], Keyframe[]> Mirroring = (keys) =>
- {
- if ((voxelBone.voxelObject.edit_mirrorPosition[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.x")) ||
- (voxelBone.voxelObject.edit_mirrorPosition[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.y")) ||
- (voxelBone.voxelObject.edit_mirrorPosition[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalPosition.z")) ||
- (voxelBone.voxelObject.edit_mirrorRotation[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.x")) ||
- (voxelBone.voxelObject.edit_mirrorRotation[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.y")) ||
- (voxelBone.voxelObject.edit_mirrorRotation[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("localEulerAnglesRaw.z")) ||
- (voxelBone.voxelObject.edit_mirrorScale[0] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.x")) ||
- (voxelBone.voxelObject.edit_mirrorScale[1] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.y")) ||
- (voxelBone.voxelObject.edit_mirrorScale[2] == VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative && bindings[i].propertyName.StartsWith("m_LocalScale.z")))
- {
- for (int k = 0; k < keys.Length; k++)
- {
- keys[k].inTangent = -keys[k].inTangent;
- keys[k].outTangent = -keys[k].outTangent;
- keys[k].value = -keys[k].value;
- }
- }
- return keys;
- };
- bool updateCurve = false;
- if (!mirrorBinding.HasValue)
- {
- EditorCurveBinding newBinding = new EditorCurveBinding();
- newBinding.path = mirrorBoneCore.fullPathBoneName;
- newBinding.type = bindings[i].type;
- newBinding.propertyName = bindings[i].propertyName;
- mirrorBinding = newBinding;
- mirrorCurve = new AnimationCurve(Mirroring(curve.keys));
- updateCurve = true;
- }
- else
- {
- mirrorCurve = AnimationUtility.GetEditorCurve(clip, mirrorBinding.Value);
- if (curve.length != mirrorCurve.length)
- {
- mirrorCurve = new AnimationCurve(Mirroring(curve.keys));
- updateCurve = true;
- }
- else
- {
- var mirrorKeys = Mirroring(curve.keys);
- for (int k = 0; k < mirrorCurve.length; k++)
- {
- if (mirrorCurve[k].inTangent != mirrorKeys[k].inTangent ||
- mirrorCurve[k].outTangent != mirrorKeys[k].outTangent ||
- mirrorCurve[k].time != mirrorKeys[k].time ||
- mirrorCurve[k].value != mirrorKeys[k].value)
- {
- mirrorCurve = new AnimationCurve(mirrorKeys);
- updateCurve = true;
- break;
- }
- }
- }
- }
- if (updateCurve)
- {
- AnimationUtility.SetEditorCurve(clip, mirrorBinding.Value, mirrorCurve);
- }
- }
- }
- }
- }
- }
- }
- public void FixMissingAnimation()
- {
- var animator = voxelBone.voxelObject.GetComponent<Animator>();
- if (animator != null && animator.runtimeAnimatorController != null)
- {
- string[] bonePaths = new string[objectCore.animationObject.bones.Length];
- for (int i = 0; i < objectCore.animationObject.bones.Length; i++)
- {
- if (objectCore.animationObject.bones[i] == null) continue;
- bonePaths[i] = AnimationUtility.CalculateTransformPath(objectCore.animationObject.bones[i].transform, voxelBone.voxelObject.transform);
- }
- foreach (var clip in animator.runtimeAnimatorController.animationClips)
- {
- var bindings = AnimationUtility.GetCurveBindings(clip);
- if (bindings.IsReadOnly) continue;
- for (int i = 0; i < bindings.Length; i++)
- {
- bool missing = true;
- for (int j = 0; j < bonePaths.Length; j++)
- {
- if(bindings[i].path == bonePaths[j])
- {
- missing = false;
- break;
- }
- }
- if (!missing) continue;
- var curve = AnimationUtility.GetEditorCurve(clip, bindings[i]);
- {
- var index = bindings[i].path.IndexOf(fullPathBoneName);
- if (index >= 0 && bindings[i].path.Length == index + fullPathBoneName.Length)
- {
- AnimationUtility.SetEditorCurve(clip, bindings[i], null);
- bindings[i].path = fullPathBoneName;
- AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
- continue;
- }
- }
- {
- var index = fullPathBoneName.IndexOf(bindings[i].path);
- if (index >= 0 && fullPathBoneName.Length == index + bindings[i].path.Length)
- {
- AnimationUtility.SetEditorCurve(clip, bindings[i], null);
- bindings[i].path = fullPathBoneName;
- AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
- continue;
- }
- }
- {
- var index = bindings[i].path.LastIndexOf(voxelBone.name);
- if (index >= 0 && bindings[i].path.Length == index + voxelBone.name.Length)
- {
- AnimationUtility.SetEditorCurve(clip, bindings[i], null);
- bindings[i].path = fullPathBoneName;
- AnimationUtility.SetEditorCurve(clip, bindings[i], curve);
- continue;
- }
- }
- }
- }
- }
- }
- public void MirrorBoneAnimation()
- {
- if (voxelBone.mirrorBone == null) return;
- if (!voxelBone.edit_mirrorSetBoneAnimation) return;
- #region Position
- {
- var tmp = voxelBone.transform.localPosition;
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[0])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localPosition.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localPosition.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localPosition.x; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[1])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localPosition.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localPosition.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localPosition.y; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorPosition[2])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localPosition.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localPosition.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localPosition.z; break;
- }
- if (voxelBone.mirrorBone.transform.localPosition != tmp)
- voxelBone.mirrorBone.transform.localPosition = tmp;
- }
- #endregion
- #region Rotation
- {
- var tmp = voxelBone.transform.localEulerAngles;
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[0])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localEulerAngles.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localEulerAngles.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localEulerAngles.x; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[1])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localEulerAngles.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localEulerAngles.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localEulerAngles.y; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorRotation[2])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localEulerAngles.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localEulerAngles.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localEulerAngles.z; break;
- }
- if (voxelBone.mirrorBone.transform.localEulerAngles != tmp)
- voxelBone.mirrorBone.transform.localEulerAngles = tmp;
- }
- #endregion
- #region Scale
- {
- var tmp = voxelBone.transform.localScale;
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[0])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.x = voxelBone.mirrorBone.transform.localScale.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.x = voxelBone.transform.localScale.x; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.x = -voxelBone.transform.localScale.x; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[1])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.y = voxelBone.mirrorBone.transform.localScale.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.y = voxelBone.transform.localScale.y; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.y = -voxelBone.transform.localScale.y; break;
- }
- switch (voxelBone.mirrorBone.voxelObject.edit_mirrorScale[2])
- {
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.None: tmp.z = voxelBone.mirrorBone.transform.localScale.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Positive: tmp.z = voxelBone.transform.localScale.z; break;
- case VoxelSkinnedAnimationObject.Edit_MirrorSetMode.Negative: tmp.z = -voxelBone.transform.localScale.z; break;
- }
- if (voxelBone.mirrorBone.transform.localScale != tmp)
- voxelBone.mirrorBone.transform.localScale = tmp;
- }
- #endregion
- }
- public void MirrorBonePosition()
- {
- if (voxelBone.mirrorBone == null) return;
- if (!voxelBone.edit_mirrorSetBonePosition) return;
- var tmp = voxelBone.transform.localPosition;
- tmp.x = -voxelBone.transform.localPosition.x;
- voxelBone.mirrorBone.transform.localPosition = tmp;
- }
- public void MirrorBoneWeight()
- {
- if (voxelBone.mirrorBone == null) return;
- if (!voxelBone.edit_mirrorSetBoneWeight) return;
- voxelBone.mirrorBone.transform.localPosition = new Vector3(-voxelBone.transform.localPosition.x, voxelBone.transform.localPosition.y, voxelBone.transform.localPosition.z);
- #region Weight
- {
- voxelBone.mirrorBone.weightData.ClearWeight();
- voxelBone.weightData.AllAction((pos, weights) =>
- {
- var newPos = GetMirrorVoxelPosition(pos);
- var newWeights = new WeightData.VoxelWeight();
- newWeights.weightXYZ = weights.weight_XYZ;
- newWeights.weight_XYZ = weights.weightXYZ;
- newWeights.weightX_YZ = weights.weight_X_YZ;
- newWeights.weightXY_Z = weights.weight_XY_Z;
- newWeights.weight_X_YZ = weights.weightX_YZ;
- newWeights.weight_XY_Z = weights.weightXY_Z;
- newWeights.weightX_Y_Z = weights.weight_X_Y_Z;
- newWeights.weight_X_Y_Z = weights.weightX_Y_Z;
- voxelBone.mirrorBone.weightData.SetWeight(newPos, newWeights);
- });
- }
- #endregion
- }
- public IntVector3 GetMirrorVoxelPosition(IntVector3 pos)
- {
- Assert.IsNotNull(voxelBone.mirrorBone);
- var srcVoxelPosition = objectCore.GetVoxelPosition(voxelBone.voxelObject.bindposes[voxelBone.boneIndex].inverse.GetColumn(3));
- var voxelPosition = objectCore.GetVoxelPosition(voxelBone.mirrorBone.voxelObject.bindposes[voxelBone.mirrorBone.boneIndex].inverse.GetColumn(3));
- IntVector3 newPos;
- {
- var offset = new Vector3(pos.x, pos.y, pos.z) - srcVoxelPosition;
- var mirror = voxelPosition + new Vector3(-offset.x - 1, offset.y, offset.z);
- newPos = new IntVector3(Mathf.RoundToInt(mirror.x), Mathf.RoundToInt(mirror.y), Mathf.RoundToInt(mirror.z));
- }
- return newPos;
- }
- private string _fullPathBoneName;
- public string fullPathBoneName
- {
- get
- {
- if (string.IsNullOrEmpty(_fullPathBoneName))
- _fullPathBoneName = AnimationUtility.CalculateTransformPath(voxelBone.transform, voxelBone.voxelObject.transform);
- return _fullPathBoneName;
- }
- }
- }
- }
|