Fix parsing of legacy Tuanjie AnimationClip assets

This commit is contained in:
VaDiM
2025-05-18 02:16:37 +03:00
parent c11e085e2e
commit 92a89db4e8

View File

@ -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<AnimationClip>
{
public bool Equals(AnimationClip clipA, AnimationClip clipB)