diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 3a3208e..1f84e44 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -1075,9 +1075,18 @@ namespace AssetStudio { using (var muscleReader = new EndianBinaryReader(muscleStream, EndianType.LittleEndian)) { - _ = muscleReader.ReadUInt32(); var objReader = new ObjectReader(muscleReader, assetsFile, objInfo); - m_MuscleClip = new ClipMuscleConstant(objReader); + if (!m_Legacy) + { + _ = objReader.ReadUInt32(); + m_MuscleClip = new ClipMuscleConstant(objReader); + } + else + { + m_EulerCurves = Vector3CurveArray(objReader); + m_PositionCurves = Vector3CurveArray(objReader); + m_ScaleCurves = Vector3CurveArray(objReader); + } } } } @@ -1127,27 +1136,10 @@ namespace AssetStudio { if (version >= (5, 3)) //5.3 and up { - int numEulerCurves = reader.ReadInt32(); - m_EulerCurves = new Vector3Curve[numEulerCurves]; - for (int i = 0; i < numEulerCurves; i++) - { - m_EulerCurves[i] = new Vector3Curve(reader); - } - } - - int numPCurves = reader.ReadInt32(); - m_PositionCurves = new Vector3Curve[numPCurves]; - for (int i = 0; i < numPCurves; i++) - { - m_PositionCurves[i] = new Vector3Curve(reader); - } - - int numSCurves = reader.ReadInt32(); - m_ScaleCurves = new Vector3Curve[numSCurves]; - for (int i = 0; i < numSCurves; i++) - { - m_ScaleCurves[i] = new Vector3Curve(reader); + m_EulerCurves = Vector3CurveArray(reader); } + m_PositionCurves = Vector3CurveArray(reader); + m_ScaleCurves = Vector3CurveArray(reader); } int numFCurves = reader.ReadInt32(); @@ -1178,16 +1170,25 @@ namespace AssetStudio } if (version >= 4)//4.0 and up { - m_MuscleClipSize = reader.ReadUInt32(); + m_MuscleClipSize = reader.ReadUInt32(); //m_AnimDataSize (Tuanjie) if (!version.IsTuanjie) { m_MuscleClip = new ClipMuscleConstant(reader); } else if (m_MuscleClipSize > 0) { - _ = reader.ReadInt32(); - m_MuscleClip = new ClipMuscleConstant(reader); //m_AnimData (Tuanjie) - m_StreamingInfo = new StreamingInfo(reader); + if (!m_Legacy) + { + _ = reader.ReadInt32(); + m_MuscleClip = new ClipMuscleConstant(reader); //m_AnimData (Tuanjie) + m_StreamingInfo = new StreamingInfo(reader); + } + else + { + m_EulerCurves = Vector3CurveArray(reader); + m_PositionCurves = Vector3CurveArray(reader); + m_ScaleCurves = Vector3CurveArray(reader); + } } } if (version >= (4, 3)) //4.3 and up @@ -1212,6 +1213,17 @@ namespace AssetStudio } } + private static Vector3Curve[] Vector3CurveArray(ObjectReader reader) + { + var curveNum = reader.ReadInt32(); + var vector3Curve = new Vector3Curve[curveNum]; + for (var i = 0; i < curveNum; i++) + { + vector3Curve[i] = new Vector3Curve(reader); + } + return vector3Curve; + } + public class EqComparer : IEqualityComparer { public bool Equals(AnimationClip clipA, AnimationClip clipB)