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; break;
case ClassIDType.AnimationClip: case ClassIDType.AnimationClip:
obj = objectReader.serializedType?.m_Type != null && LoadingViaTypeTreeEnabled 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); : new AnimationClip(objectReader);
break; break;
case ClassIDType.Animator: case ClassIDType.Animator:

View File

@ -1027,10 +1027,12 @@ namespace AssetStudio
public ClipMuscleConstant m_MuscleClip; public ClipMuscleConstant m_MuscleClip;
public AnimationClipBindingConstant m_ClipBindingConstant; public AnimationClipBindingConstant m_ClipBindingConstant;
public AnimationEvent[] m_Events; public AnimationEvent[] m_Events;
public byte[] m_AnimData;
public StreamingInfo m_StreamingInfo;
public AnimationClip() { } 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); var parsedAnimClip = JsonSerializer.Deserialize<AnimationClip>(type, jsonOptions);
m_AnimationType = parsedAnimClip.m_AnimationType; m_AnimationType = parsedAnimClip.m_AnimationType;
@ -1051,6 +1053,22 @@ namespace AssetStudio
m_MuscleClip = parsedAnimClip.m_MuscleClip; m_MuscleClip = parsedAnimClip.m_MuscleClip;
m_ClipBindingConstant = parsedAnimClip.m_ClipBindingConstant; m_ClipBindingConstant = parsedAnimClip.m_ClipBindingConstant;
m_Events = parsedAnimClip.m_Events; 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) public AnimationClip(ObjectReader reader) : base(reader)
@ -1094,7 +1112,9 @@ namespace AssetStudio
} }
} }
if (version >= (5, 3))//5.3 and up if (!version.IsTuanjie)
{
if (version >= (5, 3)) //5.3 and up
{ {
int numEulerCurves = reader.ReadInt32(); int numEulerCurves = reader.ReadInt32();
m_EulerCurves = new Vector3Curve[numEulerCurves]; m_EulerCurves = new Vector3Curve[numEulerCurves];
@ -1117,6 +1137,7 @@ namespace AssetStudio
{ {
m_ScaleCurves[i] = new Vector3Curve(reader); m_ScaleCurves[i] = new Vector3Curve(reader);
} }
}
int numFCurves = reader.ReadInt32(); int numFCurves = reader.ReadInt32();
m_FloatCurves = new FloatCurve[numFCurves]; m_FloatCurves = new FloatCurve[numFCurves];
@ -1147,7 +1168,18 @@ namespace AssetStudio
if (version >= 4)//4.0 and up if (version >= 4)//4.0 and up
{ {
m_MuscleClipSize = reader.ReadUInt32(); 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 if (version >= (4, 3)) //4.3 and up
{ {