From 53720e37abc72729057be761f507ea5230df0945 Mon Sep 17 00:00:00 2001 From: Perfare Date: Wed, 30 Jun 2021 06:31:05 +0800 Subject: [PATCH] Fixed #435 --- AssetStudioUtility/ModelConverter.cs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index 731b19c..e610a81 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -17,6 +17,7 @@ namespace AssetStudio private ImageFormat imageFormat; private Avatar avatar; private HashSet animationClipHashSet = new HashSet(); + private Dictionary boundAnimationPathDic = new Dictionary(); private Dictionary bonePathHash = new Dictionary(); private Dictionary textureNameDictionary = new Dictionary(); private Dictionary transformDictionary = new Dictionary(); @@ -163,6 +164,7 @@ namespace AssetStudio { if (animation.TryGet(out var animationClip)) { + boundAnimationPathDic.Add(animationClip, GetTransformPath(m_Transform)); animationClipHashSet.Add(animationClip); } } @@ -600,6 +602,15 @@ namespace AssetStudio return null; } + private string FixBonePath(AnimationClip m_AnimationClip, string path) + { + if (boundAnimationPathDic.TryGetValue(m_AnimationClip, out var basePath)) + { + path = basePath + "/" + path; + } + return FixBonePath(path); + } + private string FixBonePath(string path) { var frame = RootFrame.FindFrameByPath(path); @@ -779,7 +790,7 @@ namespace AssetStudio { foreach (var m_CompressedRotationCurve in animationClip.m_CompressedRotationCurves) { - var track = iAnim.FindTrack(FixBonePath(m_CompressedRotationCurve.m_Path)); + var track = iAnim.FindTrack(FixBonePath(animationClip, m_CompressedRotationCurve.m_Path)); var numKeys = m_CompressedRotationCurve.m_Times.m_NumItems; var data = m_CompressedRotationCurve.m_Times.UnpackInts(); @@ -801,7 +812,7 @@ namespace AssetStudio } foreach (var m_RotationCurve in animationClip.m_RotationCurves) { - var track = iAnim.FindTrack(FixBonePath(m_RotationCurve.path)); + var track = iAnim.FindTrack(FixBonePath(animationClip, m_RotationCurve.path)); foreach (var m_Curve in m_RotationCurve.curve.m_Curve) { var value = Fbx.QuaternionToEuler(new Quaternion(m_Curve.value.X, -m_Curve.value.Y, -m_Curve.value.Z, m_Curve.value.W)); @@ -810,7 +821,7 @@ namespace AssetStudio } foreach (var m_PositionCurve in animationClip.m_PositionCurves) { - var track = iAnim.FindTrack(FixBonePath(m_PositionCurve.path)); + var track = iAnim.FindTrack(FixBonePath(animationClip, m_PositionCurve.path)); foreach (var m_Curve in m_PositionCurve.curve.m_Curve) { track.Translations.Add(new ImportedKeyframe(m_Curve.time, new Vector3(-m_Curve.value.X, m_Curve.value.Y, m_Curve.value.Z))); @@ -818,7 +829,7 @@ namespace AssetStudio } foreach (var m_ScaleCurve in animationClip.m_ScaleCurves) { - var track = iAnim.FindTrack(FixBonePath(m_ScaleCurve.path)); + var track = iAnim.FindTrack(FixBonePath(animationClip, m_ScaleCurve.path)); foreach (var m_Curve in m_ScaleCurve.curve.m_Curve) { track.Scalings.Add(new ImportedKeyframe(m_Curve.time, new Vector3(m_Curve.value.X, m_Curve.value.Y, m_Curve.value.Z))); @@ -828,7 +839,7 @@ namespace AssetStudio { foreach (var m_EulerCurve in animationClip.m_EulerCurves) { - var track = iAnim.FindTrack(FixBonePath(m_EulerCurve.path)); + var track = iAnim.FindTrack(FixBonePath(animationClip, m_EulerCurve.path)); foreach (var m_Curve in m_EulerCurve.curve.m_Curve) { track.Rotations.Add(new ImportedKeyframe(m_Curve.time, new Vector3(m_Curve.value.X, -m_Curve.value.Y, -m_Curve.value.Z))); @@ -846,7 +857,7 @@ namespace AssetStudio channelName = channelName.Substring(dotPos + 1); } - var path = FixBonePath(m_FloatCurve.path); + var path = FixBonePath(animationClip, m_FloatCurve.path); if (string.IsNullOrEmpty(path)) { path = GetPathByChannelName(channelName);