Add support for Tuanjie AnimationClip assets

This commit is contained in:
VaDiM 2024-12-27 18:19:44 +03:00
parent d7b4d415ca
commit b7d21e5bd8
2 changed files with 52 additions and 20 deletions

View File

@ -544,7 +544,7 @@ namespace AssetStudio
break;
case ClassIDType.AnimationClip:
obj = objectReader.serializedType?.m_Type != null && LoadingViaTypeTreeEnabled
? new AnimationClip(objectReader, TypeTreeHelper.ReadTypeByteArray(objectReader.serializedType.m_Type, objectReader), jsonOptions)
? new AnimationClip(objectReader, TypeTreeHelper.ReadTypeByteArray(objectReader.serializedType.m_Type, objectReader), jsonOptions, objectInfo)
: new AnimationClip(objectReader);
break;
case ClassIDType.Animator:

View File

@ -1027,10 +1027,12 @@ namespace AssetStudio
public ClipMuscleConstant m_MuscleClip;
public AnimationClipBindingConstant m_ClipBindingConstant;
public AnimationEvent[] m_Events;
public byte[] m_AnimData;
public StreamingInfo m_StreamingInfo;
public AnimationClip() { }
public AnimationClip(ObjectReader reader, byte[] type, JsonSerializerOptions jsonOptions) : base(reader)
public AnimationClip(ObjectReader reader, byte[] type, JsonSerializerOptions jsonOptions, ObjectInfo objInfo) : base(reader)
{
var parsedAnimClip = JsonSerializer.Deserialize<AnimationClip>(type, jsonOptions);
m_AnimationType = parsedAnimClip.m_AnimationType;
@ -1051,6 +1053,22 @@ namespace AssetStudio
m_MuscleClip = parsedAnimClip.m_MuscleClip;
m_ClipBindingConstant = parsedAnimClip.m_ClipBindingConstant;
m_Events = parsedAnimClip.m_Events;
if (!reader.version.IsTuanjie)
return;
m_AnimData = parsedAnimClip.m_AnimData;
m_StreamingInfo = parsedAnimClip.m_StreamingInfo;
if (!(m_AnimData?.Length > 0))
return;
m_MuscleClipSize = (uint)m_AnimData.Length;
using (var muscleStream = new MemoryStream(m_AnimData))
{
using (var muscleReader = new EndianBinaryReader(muscleStream, EndianType.LittleEndian))
{
_ = muscleReader.ReadUInt32();
var objReader = new ObjectReader(muscleReader, assetsFile, objInfo);
m_MuscleClip = new ClipMuscleConstant(objReader);
}
}
}
public AnimationClip(ObjectReader reader) : base(reader)
@ -1094,28 +1112,31 @@ namespace AssetStudio
}
}
if (version >= (5, 3))//5.3 and up
if (!version.IsTuanjie)
{
int numEulerCurves = reader.ReadInt32();
m_EulerCurves = new Vector3Curve[numEulerCurves];
for (int i = 0; i < numEulerCurves; i++)
if (version >= (5, 3)) //5.3 and up
{
m_EulerCurves[i] = new Vector3Curve(reader);
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 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);
int numSCurves = reader.ReadInt32();
m_ScaleCurves = new Vector3Curve[numSCurves];
for (int i = 0; i < numSCurves; i++)
{
m_ScaleCurves[i] = new Vector3Curve(reader);
}
}
int numFCurves = reader.ReadInt32();
@ -1147,7 +1168,18 @@ namespace AssetStudio
if (version >= 4)//4.0 and up
{
m_MuscleClipSize = reader.ReadUInt32();
m_MuscleClip = new ClipMuscleConstant(reader);
if (m_MuscleClipSize > 0)
{
if (version.IsTuanjie)
{
_ = reader.ReadUInt32();
}
m_MuscleClip = new ClipMuscleConstant(reader); //m_AnimData (Tuanjie)
if (version.IsTuanjie)
{
m_StreamingInfo = new StreamingInfo(reader);
}
}
}
if (version >= (4, 3)) //4.3 and up
{