Skip to content

Commit

Permalink
allow passing null binary reader to movie scene constructors
Browse files Browse the repository at this point in the history
  • Loading branch information
atenfyr committed Jan 15, 2025
1 parent 1d0026d commit 0eeb768
Show file tree
Hide file tree
Showing 8 changed files with 286 additions and 230 deletions.
57 changes: 36 additions & 21 deletions UAssetAPI/PropertyTypes/Structs/Movies/MovieScene.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,12 @@ public FMovieSceneEvaluationKey(uint _SequenceID, uint _TrackIdentifier, uint _S

public FMovieSceneEvaluationKey(AssetBinaryReader reader)
{
SequenceID = reader.ReadUInt32();
TrackIdentifier = reader.ReadUInt32();
SectionIndex = reader.ReadUInt32();
if (reader != null)
{
SequenceID = reader.ReadUInt32();
TrackIdentifier = reader.ReadUInt32();
SectionIndex = reader.ReadUInt32();
}
}

public int Write(AssetBinaryWriter writer)
Expand Down Expand Up @@ -69,9 +72,12 @@ public FMovieSceneSubSectionData(FPackageIndex section, Guid objectBindingId, ES

public FMovieSceneSubSectionData(AssetBinaryReader reader)
{
Section = new FPackageIndex(reader);
ObjectBindingId = new Guid(reader.ReadBytes(16));
Flags = (ESectionEvaluationFlags)reader.ReadByte();
if (reader != null)
{
Section = new FPackageIndex(reader);
ObjectBindingId = new Guid(reader.ReadBytes(16));
Flags = (ESectionEvaluationFlags)reader.ReadByte();
}
}

public int Write(AssetBinaryWriter writer)
Expand All @@ -96,8 +102,11 @@ public FEntityAndMetaDataIndex(int entityIndex, int metaDataIndex)

public FEntityAndMetaDataIndex(AssetBinaryReader reader)
{
EntityIndex = reader.ReadInt32();
MetaDataIndex = reader.ReadInt32();
if (reader != null)
{
EntityIndex = reader.ReadInt32();
MetaDataIndex = reader.ReadInt32();
}
}

public void Write(AssetBinaryWriter writer)
Expand All @@ -122,14 +131,17 @@ public FMovieSceneSubSequenceTreeEntry(uint sequenceID, byte flags, StructProper

public FMovieSceneSubSequenceTreeEntry(AssetBinaryReader reader)
{
SequenceID = reader.ReadUInt32();
Flags = (ESectionEvaluationFlags)reader.ReadByte();
if (reader.Asset.GetCustomVersion<FReleaseObjectVersion>() >= FReleaseObjectVersion.AddedSubSequenceEntryWarpCounter ||
reader.Asset.GetCustomVersion<FFortniteMainBranchObjectVersion>() >= FFortniteMainBranchObjectVersion.AddedSubSequenceEntryWarpCounter)
if (reader != null)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "RootToSequenceWarpCounter"), FName.DefineDummy(reader.Asset, "MovieSceneWarpCounter"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
RootToSequenceWarpCounter = data;
SequenceID = reader.ReadUInt32();
Flags = (ESectionEvaluationFlags)reader.ReadByte();
if (reader.Asset.GetCustomVersion<FReleaseObjectVersion>() >= FReleaseObjectVersion.AddedSubSequenceEntryWarpCounter ||
reader.Asset.GetCustomVersion<FFortniteMainBranchObjectVersion>() >= FFortniteMainBranchObjectVersion.AddedSubSequenceEntryWarpCounter)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "RootToSequenceWarpCounter"), FName.DefineDummy(reader.Asset, "MovieSceneWarpCounter"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
RootToSequenceWarpCounter = data;
}
}
}

Expand Down Expand Up @@ -193,13 +205,16 @@ public struct FSectionEvaluationDataTree

public FSectionEvaluationDataTree(AssetBinaryReader reader)
{
Tree = new(reader, () => ReadTree(reader));

static StructPropertyData ReadTree(AssetBinaryReader reader)
if (reader != null)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "Tree"), FName.DefineDummy(reader.Asset, "SectionEvaluationDataTree"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
return data;
Tree = new(reader, () => ReadTree(reader));

static StructPropertyData ReadTree(AssetBinaryReader reader)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "Tree"), FName.DefineDummy(reader.Asset, "SectionEvaluationDataTree"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
return data;
}
}
}

Expand Down
38 changes: 22 additions & 16 deletions UAssetAPI/PropertyTypes/Structs/Movies/MovieSceneEvaluationTree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ public FEntry(int startIndex, int size, int capacity)

public FEntry(AssetBinaryReader reader)
{
StartIndex = reader.ReadInt32();
Size = reader.ReadInt32();
Capacity = reader.ReadInt32();
if (reader != null)
{
StartIndex = reader.ReadInt32();
Size = reader.ReadInt32();
Capacity = reader.ReadInt32();
}
}

public void Write(AssetBinaryWriter writer)
Expand Down Expand Up @@ -58,18 +61,21 @@ public TEvaluationTreeEntryContainer(FEntry[] entries, T[] items)

public TEvaluationTreeEntryContainer(AssetBinaryReader reader, Func<T> valueReader)
{
var entriesamount = reader.ReadInt32();
Entries = new FEntry[entriesamount];
for (int i = 0; i < entriesamount; i++)
{
Entries[i] = new FEntry(reader);
}

int itemsamount = reader.ReadInt32();
Items = new T[itemsamount];
for (int i = 0; i < itemsamount; i++)
{
Items[i] = valueReader();
if (reader != null)
{
var entriesamount = reader.ReadInt32();
Entries = new FEntry[entriesamount];
for (int i = 0; i < entriesamount; i++)
{
Entries[i] = new FEntry(reader);
}

int itemsamount = reader.ReadInt32();
Items = new T[itemsamount];
for (int i = 0; i < itemsamount; i++)
{
Items[i] = valueReader();
}
}
}

Expand Down Expand Up @@ -116,7 +122,7 @@ public class TMovieSceneEvaluationTree<T> : FMovieSceneEvaluationTree

public TMovieSceneEvaluationTree(AssetBinaryReader reader, Func<T> valueReader) : base(reader)
{
Data = new(reader, valueReader);
if (reader != null) Data = new(reader, valueReader);
}

public void Write(AssetBinaryWriter writer, Action<T> valueWriter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,13 @@ public class FMovieSceneEvaluationTreeNode

public FMovieSceneEvaluationTreeNode(AssetBinaryReader reader)
{
Range = new(reader, () => new FFrameNumber(reader));
Parent = new FMovieSceneEvaluationTreeNodeHandle(reader.ReadInt32(), reader.ReadInt32());
ChildrenID = new FEvaluationTreeEntryHandle(reader.ReadInt32());
DataID = new FEvaluationTreeEntryHandle(reader.ReadInt32());
if (reader != null)
{
Range = new(reader, () => new FFrameNumber(reader));
Parent = new FMovieSceneEvaluationTreeNodeHandle(reader.ReadInt32(), reader.ReadInt32());
ChildrenID = new FEvaluationTreeEntryHandle(reader.ReadInt32());
DataID = new FEvaluationTreeEntryHandle(reader.ReadInt32());
}
}

public void Write(AssetBinaryWriter writer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@ public FMovieSceneEventParameters(FSoftObjectPath structType, byte[] structBytes

public FMovieSceneEventParameters(AssetBinaryReader reader)
{
StructType = new FSoftObjectPath(reader);
var length = reader.ReadInt32();
StructBytes = reader.ReadBytes(length);
if (reader != null)
{
StructType = new FSoftObjectPath(reader);
var length = reader.ReadInt32();
StructBytes = reader.ReadBytes(length);
}
}

public int Write(AssetBinaryWriter writer)
Expand Down
52 changes: 30 additions & 22 deletions UAssetAPI/PropertyTypes/Structs/Movies/MovieSceneSegment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,38 @@ public class FMovieSceneSegment
/// <summary> Array of implementations that reside at the segment's range </summary>
public StructPropertyData[] Impls;

public FMovieSceneSegment()
{

}

public FMovieSceneSegment(AssetBinaryReader reader)
{
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.FloatToIntConversion)
{
RangeOld = new TRange<float>(reader, reader.ReadSingle);
}
else
{
Range = new(reader, () => new FFrameNumber(reader));
}

if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() > FSequencerObjectVersion.EvaluationTree)
{
ID = reader.ReadInt32();
bAllowEmpty = reader.ReadBooleanInt();
}

int length = reader.ReadInt32();
Impls = new StructPropertyData[length];
for (int i = 0; i < length; i++)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "Impls"), FName.DefineDummy(reader.Asset, "SectionEvaluationData"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
Impls[i] = data;
if (reader != null)
{
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.FloatToIntConversion)
{
RangeOld = new TRange<float>(reader, reader.ReadSingle);
}
else
{
Range = new(reader, () => new FFrameNumber(reader));
}

if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() > FSequencerObjectVersion.EvaluationTree)
{
ID = reader.ReadInt32();
bAllowEmpty = reader.ReadBooleanInt();
}

int length = reader.ReadInt32();
Impls = new StructPropertyData[length];
for (int i = 0; i < length; i++)
{
var data = new StructPropertyData(FName.DefineDummy(reader.Asset, "Impls"), FName.DefineDummy(reader.Asset, "SectionEvaluationData"));
data.Read(reader, false, 1, 0, PropertySerializationContext.StructFallback);
Impls[i] = data;
}
}
}

Expand Down
73 changes: 42 additions & 31 deletions UAssetAPI/PropertyTypes/Structs/Movies/MovieSceneValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,31 @@ public class FMovieSceneTangentData
public ERichCurveTangentWeightMode TangentWeightMode;
public byte[] padding;

public FMovieSceneTangentData()
{

}

public FMovieSceneTangentData(AssetBinaryReader reader)
{
ArriveTangent = reader.ReadSingle();
LeaveTangent = reader.ReadSingle();
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.SerializeFloatChannelCompletely)
{
TangentWeightMode = (ERichCurveTangentWeightMode)reader.ReadByte();
ArriveTangentWeight = reader.ReadSingle();
LeaveTangentWeight = reader.ReadSingle();
padding = [];
}
else
{
ArriveTangentWeight = reader.ReadSingle();
LeaveTangentWeight = reader.ReadSingle();
TangentWeightMode = (ERichCurveTangentWeightMode)reader.ReadByte();
padding = reader.ReadBytes(3);
if (reader != null)
{
ArriveTangent = reader.ReadSingle();
LeaveTangent = reader.ReadSingle();
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.SerializeFloatChannelCompletely)
{
TangentWeightMode = (ERichCurveTangentWeightMode)reader.ReadByte();
ArriveTangentWeight = reader.ReadSingle();
LeaveTangentWeight = reader.ReadSingle();
padding = [];
}
else
{
ArriveTangentWeight = reader.ReadSingle();
LeaveTangentWeight = reader.ReadSingle();
TangentWeightMode = (ERichCurveTangentWeightMode)reader.ReadByte();
padding = reader.ReadBytes(3);
}
}
}

Expand Down Expand Up @@ -62,21 +70,24 @@ public class FMovieSceneValue<T>
public byte[] padding;

public FMovieSceneValue(AssetBinaryReader reader, T value)
{
{
Value = value;
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.SerializeFloatChannelCompletely)
{
InterpMode = (ERichCurveInterpMode)reader.ReadByte();
TangentMode = (ERichCurveTangentMode)reader.ReadByte();
Tangent = new FMovieSceneTangentData(reader);
padding = [];
}
else
{
Tangent = new FMovieSceneTangentData(reader);
InterpMode = (ERichCurveInterpMode)reader.ReadByte();
TangentMode = (ERichCurveTangentMode)reader.ReadByte();
padding = reader.ReadBytes(2);
if (reader != null)
{
if (reader.Asset.GetCustomVersion<FSequencerObjectVersion>() < FSequencerObjectVersion.SerializeFloatChannelCompletely)
{
InterpMode = (ERichCurveInterpMode)reader.ReadByte();
TangentMode = (ERichCurveTangentMode)reader.ReadByte();
Tangent = new FMovieSceneTangentData(reader);
padding = [];
}
else
{
Tangent = new FMovieSceneTangentData(reader);
InterpMode = (ERichCurveInterpMode)reader.ReadByte();
TangentMode = (ERichCurveTangentMode)reader.ReadByte();
padding = reader.ReadBytes(2);
}
}
}

Expand All @@ -99,6 +110,6 @@ public void Write(AssetBinaryWriter writer, Action<T> valueWriter)
}
}

public class FMovieSceneFloatValue(AssetBinaryReader reader) : FMovieSceneValue<float>(reader, reader.ReadSingle()) { }
public class FMovieSceneFloatValue(AssetBinaryReader reader) : FMovieSceneValue<float>(reader, reader?.ReadSingle() ?? 0) { }

public class FMovieSceneDoubleValue(AssetBinaryReader reader) : FMovieSceneValue<double>(reader, reader.ReadDouble()) { }
public class FMovieSceneDoubleValue(AssetBinaryReader reader) : FMovieSceneValue<double>(reader, reader?.ReadDouble() ?? 0) { }
Loading

0 comments on commit 0eeb768

Please sign in to comment.