diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 0de6598..55df833 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -1200,5 +1200,21 @@ namespace AssetStudio reader.AlignStream(); } } + + public class EqComparer : IEqualityComparer + { + public bool Equals(AnimationClip clipA, AnimationClip clipB) + { + return clipA?.m_PathID == clipB?.m_PathID + && clipA?.byteSize == clipB?.byteSize; + } + + public int GetHashCode(AnimationClip obj) + { + var result = obj.m_PathID * 31; + result = result * 31 + obj.byteSize; + return result.GetHashCode(); + } + } } } diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index d2c1628..a4b630b 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -16,12 +16,13 @@ namespace AssetStudio private ImageFormat imageFormat; private Avatar avatar; - private AnimationClip[] animationClipUniqArray = Array.Empty(); //TODO: a proper AnimationClip equality comparer + private AnimationClip[] animationClipUniqArray = Array.Empty(); private Dictionary boundAnimationPathDic = new Dictionary(); private Dictionary bonePathHash = new Dictionary(); private Dictionary textureNameDictionary = new Dictionary(); private Dictionary transformDictionary = new Dictionary(); Dictionary morphChannelNames = new Dictionary(); + private IEqualityComparer animationClipEqComparer = new AnimationClip.EqComparer(); public ModelConverter(GameObject m_GameObject, ImageFormat imageFormat, AnimationClip[] animationList = null) { @@ -40,7 +41,7 @@ namespace AssetStudio } if (animationList != null) { - animationClipUniqArray = animationList.Distinct().ToArray(); + animationClipUniqArray = animationList.Distinct(animationClipEqComparer).ToArray(); } ConvertAnimations(); } @@ -67,7 +68,7 @@ namespace AssetStudio } if (animationList != null) { - animationClipUniqArray = animationList.Distinct().ToArray(); + animationClipUniqArray = animationList.Distinct(animationClipEqComparer).ToArray(); } ConvertAnimations(); } @@ -82,7 +83,7 @@ namespace AssetStudio } else { - animationClipUniqArray = animationList.Distinct().ToArray(); + animationClipUniqArray = animationList.Distinct(animationClipEqComparer).ToArray(); } ConvertAnimations(); } @@ -163,7 +164,7 @@ namespace AssetStudio animationList.Add(animationClip); } } - animationClipUniqArray = animationList.Distinct().ToArray(); + animationClipUniqArray = animationList.Distinct(animationClipEqComparer).ToArray(); } foreach (var pptr in m_Transform.m_Children) @@ -207,7 +208,7 @@ namespace AssetStudio break; } } - animationClipUniqArray = animationList.Distinct().ToArray(); + animationClipUniqArray = animationList.Distinct(animationClipEqComparer).ToArray(); } }