- [Core] Fix bug with assets parsing.

This commit is contained in:
Razmoth
2023-11-24 21:17:13 +04:00
parent 2568e4be08
commit 4c0f1ec44b
45 changed files with 725 additions and 672 deletions

View File

@@ -91,7 +91,7 @@ namespace AssetStudio
{
var version = reader.version;
int numCurves = reader.ReadInt32();
m_Curve = new List<Keyframe<T>>(numCurves);
m_Curve = new List<Keyframe<T>>();
for (int i = 0; i < numCurves; i++)
{
m_Curve.Add(new Keyframe<T>(reader, readerFunc));
@@ -568,7 +568,7 @@ namespace AssetStudio
public PPtrCurve(ObjectReader reader)
{
int numCurves = reader.ReadInt32();
curve = new List<PPtrKeyframe>(numCurves);
curve = new List<PPtrKeyframe>();
for (int i = 0; i < numCurves; i++)
{
curve.Add(new PPtrKeyframe(reader));
@@ -646,7 +646,7 @@ namespace AssetStudio
public HandPose(ObjectReader reader)
{
m_GrabX = reader.ReadXForm(reader.version);
m_GrabX = reader.ReadXForm();
m_DoFArray = reader.ReadSingleArray();
m_Override = reader.ReadSingle();
m_CloseOpen = reader.ReadSingle();
@@ -658,7 +658,7 @@ namespace AssetStudio
{
var handPose = new HandPose();
handPose.m_GrabX = reader.ReadXForm(reader.version, true);
handPose.m_GrabX = reader.ReadXForm4();
handPose.m_DoFArray = reader.ReadSingleArray(20);
handPose.m_Override = reader.ReadSingle();
handPose.m_CloseOpen = reader.ReadSingle();
@@ -681,7 +681,7 @@ namespace AssetStudio
public HumanGoal(ObjectReader reader)
{
var version = reader.version;
m_X = reader.ReadXForm(reader.version);
m_X = reader.ReadXForm();
m_WeightT = reader.ReadSingle();
m_WeightR = reader.ReadSingle();
if (version[0] >= 5)//5.0 and up
@@ -695,7 +695,7 @@ namespace AssetStudio
{
var humanGoal = new HumanGoal();
humanGoal.m_X = reader.ReadXForm(reader.version, true);
humanGoal.m_X = reader.ReadXForm4();
humanGoal.m_WeightT = reader.ReadSingle();
humanGoal.m_WeightR = reader.ReadSingle();
@@ -714,7 +714,7 @@ namespace AssetStudio
public XForm m_RootX;
public Vector3 m_LookAtPosition;
public Vector4 m_LookAtWeight;
public HumanGoal[] m_GoalArray;
public List<HumanGoal> m_GoalArray;
public HandPose m_LeftHandPose;
public HandPose m_RightHandPose;
public float[] m_DoFArray;
@@ -724,15 +724,15 @@ namespace AssetStudio
public HumanPose(ObjectReader reader)
{
var version = reader.version;
m_RootX = reader.ReadXForm(reader.version);
m_RootX = reader.ReadXForm();
m_LookAtPosition = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up
m_LookAtWeight = reader.ReadVector4();
int numGoals = reader.ReadInt32();
m_GoalArray = new HumanGoal[numGoals];
m_GoalArray = new List<HumanGoal>();
for (int i = 0; i < numGoals; i++)
{
m_GoalArray[i] = new HumanGoal(reader);
m_GoalArray.Add(new HumanGoal(reader));
}
m_LeftHandPose = new HandPose(reader);
@@ -742,28 +742,23 @@ namespace AssetStudio
if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up
{
int numTDof = reader.ReadInt32();
m_TDoFArray = new Vector3[numTDof];
for (int i = 0; i < numTDof; i++)
{
m_TDoFArray[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up
m_TDoFArray = reader.ReadVector3Array();
}
}
}
public static HumanPose ParseGI(ObjectReader reader)
{
var version = reader.version;
var humanPose = new HumanPose();
humanPose.m_RootX = reader.ReadXForm(version, true);
humanPose.m_RootX = reader.ReadXForm4();
humanPose.m_LookAtPosition = (Vector3)reader.ReadVector4();
humanPose.m_LookAtWeight = reader.ReadVector4();
humanPose.m_GoalArray = new HumanGoal[4];
humanPose.m_GoalArray = new List<HumanGoal>();
for (int i = 0; i < 4; i++)
{
humanPose.m_GoalArray[i] = HumanGoal.ParseGI(reader);
humanPose.m_GoalArray.Add(HumanGoal.ParseGI(reader));
}
humanPose.m_LeftHandPose = HandPose.ParseGI(reader);
@@ -771,11 +766,7 @@ namespace AssetStudio
humanPose.m_DoFArray = reader.ReadSingleArray(0x37);
humanPose.m_TDoFArray = new Vector3[0x15];
for (int i = 0; i < 0x15; i++)
{
humanPose.m_TDoFArray[i] = (Vector3)reader.ReadVector4();
}
humanPose.m_TDoFArray = reader.ReadVector4Array(0x15).Select(x => (Vector3)x).ToArray();
reader.Position += 4;
@@ -973,17 +964,17 @@ namespace AssetStudio
public class StreamedFrame
{
public float time;
public StreamedCurveKey[] keyList;
public List<StreamedCurveKey> keyList;
public StreamedFrame(EndianBinaryReader reader)
{
time = reader.ReadSingle();
int numKeys = reader.ReadInt32();
keyList = new StreamedCurveKey[numKeys];
keyList = new List<StreamedCurveKey>();
for (int i = 0; i < numKeys; i++)
{
keyList[i] = new StreamedCurveKey(reader);
keyList.Add(new StreamedCurveKey(reader));
}
}
}
@@ -1220,15 +1211,15 @@ namespace AssetStudio
public class ValueArrayConstant
{
public ValueConstant[] m_ValueArray;
public List<ValueConstant> m_ValueArray;
public ValueArrayConstant(ObjectReader reader)
{
int numVals = reader.ReadInt32();
m_ValueArray = new ValueConstant[numVals];
m_ValueArray = new List<ValueConstant>();
for (int i = 0; i < numVals; i++)
{
m_ValueArray[i] = new ValueConstant(reader);
m_ValueArray.Add(new ValueConstant(reader));
}
}
}
@@ -1301,7 +1292,7 @@ namespace AssetStudio
var bindings = new AnimationClipBindingConstant();
var genericBindings = new List<GenericBinding>();
var values = m_Binding;
for (int i = 0; i < values.m_ValueArray.Length;)
for (int i = 0; i < values.m_ValueArray.Count;)
{
var curveID = values.m_ValueArray[i].m_ID;
var curveTypeID = values.m_ValueArray[i].m_TypeID;
@@ -1336,7 +1327,7 @@ namespace AssetStudio
i++;
}
}
bindings.genericBindings = genericBindings.ToArray();
bindings.genericBindings = genericBindings;
return bindings;
}
}
@@ -1371,7 +1362,7 @@ namespace AssetStudio
public float m_CycleOffset;
public float m_AverageAngularSpeed;
public int[] m_IndexArray;
public ValueDelta[] m_ValueArrayDelta;
public List<ValueDelta> m_ValueArrayDelta;
public float[] m_ValueArrayReferencePose;
public bool m_Mirror;
public bool m_LoopTime;
@@ -1391,17 +1382,17 @@ namespace AssetStudio
{
var version = reader.version;
m_DeltaPose = new HumanPose(reader);
m_StartX = reader.ReadXForm(reader.version);
m_StartX = reader.ReadXForm();
if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up
{
m_StopX = reader.ReadXForm(reader.version);
m_StopX = reader.ReadXForm();
}
m_LeftFootStartX = reader.ReadXForm(reader.version);
m_RightFootStartX = reader.ReadXForm(reader.version);
m_LeftFootStartX = reader.ReadXForm();
m_RightFootStartX = reader.ReadXForm();
if (version[0] < 5)//5.0 down
{
m_MotionStartX = reader.ReadXForm(reader.version);
m_MotionStopX = reader.ReadXForm(reader.version);
m_MotionStartX = reader.ReadXForm();
m_MotionStopX = reader.ReadXForm();
}
m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up
m_Clip = new Clip(reader);
@@ -1425,10 +1416,10 @@ namespace AssetStudio
var m_AdditionalCurveIndexArray = reader.ReadInt32Array();
}
int numDeltas = reader.ReadInt32();
m_ValueArrayDelta = new ValueDelta[numDeltas];
m_ValueArrayDelta = new List<ValueDelta>();
for (int i = 0; i < numDeltas; i++)
{
m_ValueArrayDelta[i] = new ValueDelta(reader);
m_ValueArrayDelta.Add(new ValueDelta(reader));
}
if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
{
@@ -1460,10 +1451,10 @@ namespace AssetStudio
var clipMuscleConstant = new ClipMuscleConstant();
clipMuscleConstant.m_DeltaPose = HumanPose.ParseGI(reader);
clipMuscleConstant.m_StartX = reader.ReadXForm(version, true);
clipMuscleConstant.m_StopX = reader.ReadXForm(version, true);
clipMuscleConstant.m_LeftFootStartX = reader.ReadXForm(version, true);
clipMuscleConstant.m_RightFootStartX = reader.ReadXForm(version, true);
clipMuscleConstant.m_StartX = reader.ReadXForm4();
clipMuscleConstant.m_StopX = reader.ReadXForm4();
clipMuscleConstant.m_LeftFootStartX = reader.ReadXForm4();
clipMuscleConstant.m_RightFootStartX = reader.ReadXForm4();
clipMuscleConstant.m_AverageSpeed = (Vector3)reader.ReadVector4();
@@ -1510,10 +1501,10 @@ namespace AssetStudio
if (valueArrayDeltaCount > 0)
{
reader.Position = valueArrayDeltaOffset;
clipMuscleConstant.m_ValueArrayDelta = new ValueDelta[valueArrayDeltaCount];
clipMuscleConstant.m_ValueArrayDelta = new List<ValueDelta>();
for (int i = 0; i < valueArrayDeltaCount; i++)
{
clipMuscleConstant.m_ValueArrayDelta[i] = new ValueDelta(reader);
clipMuscleConstant.m_ValueArrayDelta.Add(new ValueDelta(reader));
}
}
@@ -1611,25 +1602,25 @@ namespace AssetStudio
public class AnimationClipBindingConstant : IYAMLExportable
{
public GenericBinding[] genericBindings;
public PPtr<Object>[] pptrCurveMapping;
public List<GenericBinding> genericBindings;
public List<PPtr<Object>> pptrCurveMapping;
public AnimationClipBindingConstant() { }
public AnimationClipBindingConstant(ObjectReader reader)
{
int numBindings = reader.ReadInt32();
genericBindings = new GenericBinding[numBindings];
genericBindings = new List<GenericBinding>();
for (int i = 0; i < numBindings; i++)
{
genericBindings[i] = new GenericBinding(reader);
genericBindings.Add(new GenericBinding(reader));
}
int numMappings = reader.ReadInt32();
pptrCurveMapping = new PPtr<Object>[numMappings];
pptrCurveMapping = new List<PPtr<Object>>();
for (int i = 0; i < numMappings; i++)
{
pptrCurveMapping[i] = new PPtr<Object>(reader);
pptrCurveMapping.Add(new PPtr<Object>(reader));
}
}
@@ -1732,20 +1723,20 @@ namespace AssetStudio
public bool m_Legacy;
public bool m_Compressed;
public bool m_UseHighQualityCurve;
public QuaternionCurve[] m_RotationCurves;
public CompressedAnimationCurve[] m_CompressedRotationCurves;
public Vector3Curve[] m_EulerCurves;
public Vector3Curve[] m_PositionCurves;
public Vector3Curve[] m_ScaleCurves;
public FloatCurve[] m_FloatCurves;
public PPtrCurve[] m_PPtrCurves;
public List<QuaternionCurve> m_RotationCurves;
public List<CompressedAnimationCurve> m_CompressedRotationCurves;
public List<Vector3Curve> m_EulerCurves;
public List<Vector3Curve> m_PositionCurves;
public List<Vector3Curve> m_ScaleCurves;
public List<FloatCurve> m_FloatCurves;
public List<PPtrCurve> m_PPtrCurves;
public float m_SampleRate;
public int m_WrapMode;
public AABB m_Bounds;
public uint m_MuscleClipSize;
public ClipMuscleConstant m_MuscleClip;
public AnimationClipBindingConstant m_ClipBindingConstant;
public AnimationEvent[] m_Events;
public List<AnimationEvent> m_Events;
public StreamingInfo m_StreamData;
private bool hasStreamingInfo = false;
@@ -1773,57 +1764,57 @@ namespace AssetStudio
}
reader.AlignStream();
int numRCurves = reader.ReadInt32();
m_RotationCurves = new QuaternionCurve[numRCurves];
m_RotationCurves = new List<QuaternionCurve>();
for (int i = 0; i < numRCurves; i++)
{
m_RotationCurves[i] = new QuaternionCurve(reader);
m_RotationCurves.Add(new QuaternionCurve(reader));
}
int numCRCurves = reader.ReadInt32();
m_CompressedRotationCurves = new CompressedAnimationCurve[numCRCurves];
m_CompressedRotationCurves = new List<CompressedAnimationCurve>();
for (int i = 0; i < numCRCurves; i++)
{
m_CompressedRotationCurves[i] = new CompressedAnimationCurve(reader);
m_CompressedRotationCurves.Add(new CompressedAnimationCurve(reader));
}
if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
{
int numEulerCurves = reader.ReadInt32();
m_EulerCurves = new Vector3Curve[numEulerCurves];
m_EulerCurves = new List<Vector3Curve>();
for (int i = 0; i < numEulerCurves; i++)
{
m_EulerCurves[i] = new Vector3Curve(reader);
m_EulerCurves.Add(new Vector3Curve(reader));
}
}
int numPCurves = reader.ReadInt32();
m_PositionCurves = new Vector3Curve[numPCurves];
m_PositionCurves = new List<Vector3Curve>();
for (int i = 0; i < numPCurves; i++)
{
m_PositionCurves[i] = new Vector3Curve(reader);
m_PositionCurves.Add(new Vector3Curve(reader));
}
int numSCurves = reader.ReadInt32();
m_ScaleCurves = new Vector3Curve[numSCurves];
m_ScaleCurves = new List<Vector3Curve>();
for (int i = 0; i < numSCurves; i++)
{
m_ScaleCurves[i] = new Vector3Curve(reader);
m_ScaleCurves.Add(new Vector3Curve(reader));
}
int numFCurves = reader.ReadInt32();
m_FloatCurves = new FloatCurve[numFCurves];
m_FloatCurves = new List<FloatCurve>();
for (int i = 0; i < numFCurves; i++)
{
m_FloatCurves[i] = new FloatCurve(reader);
m_FloatCurves.Add(new FloatCurve(reader));
}
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
int numPtrCurves = reader.ReadInt32();
m_PPtrCurves = new PPtrCurve[numPtrCurves];
m_PPtrCurves = new List<PPtrCurve>();
for (int i = 0; i < numPtrCurves; i++)
{
m_PPtrCurves[i] = new PPtrCurve(reader);
m_PPtrCurves.Add(new PPtrCurve(reader));
}
}
@@ -1864,10 +1855,10 @@ namespace AssetStudio
{
var m_AclClipData = reader.ReadUInt8Array();
var aclBindingsCount = reader.ReadInt32();
var m_AclBindings = new GenericBinding[aclBindingsCount];
var m_AclBindings = new List<GenericBinding>();
for (int i = 0; i < aclBindingsCount; i++)
{
m_AclBindings[i] = new GenericBinding(reader);
m_AclBindings.Add(new GenericBinding(reader));
}
var m_AclRange = new KeyValuePair<float, float>(reader.ReadSingle(), reader.ReadSingle());
}
@@ -1882,10 +1873,10 @@ namespace AssetStudio
reader.AlignStream();
}
int numEvents = reader.ReadInt32();
m_Events = new AnimationEvent[numEvents];
m_Events = new List<AnimationEvent>();
for (int i = 0; i < numEvents; i++)
{
m_Events[i] = new AnimationEvent(reader);
m_Events.Add(new AnimationEvent(reader));
}
if (version[0] >= 2017) //2017 and up
{