Skip to content

Commit

Permalink
Refactor animation collections (LostArtefacts#616)
Browse files Browse the repository at this point in the history
Converts all animation and model arrays to lists. 

Part of LostArtefacts#468.
  • Loading branch information
lahm86 authored Apr 15, 2024
1 parent ca13dac commit b7074dc
Show file tree
Hide file tree
Showing 40 changed files with 358 additions and 766 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ public class EMModelExistsCondition : BaseEMCondition

protected override bool Evaluate(TR1Level level)
{
TRModel model = level.Models.ToList().Find(m => m.ID == ModelID);
TRModel model = level.Models.Find(m => m.ID == ModelID);
return model != null;
}

protected override bool Evaluate(TR2Level level)
{
TRModel model = level.Models.ToList().Find(m => m.ID == ModelID);
TRModel model = level.Models.Find(m => m.ID == ModelID);
return model != null;
}

protected override bool Evaluate(TR3Level level)
{
TRModel model = level.Models.ToList().Find(m => m.ID == ModelID);
TRModel model = level.Models.Find(m => m.ID == ModelID);
return model != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ protected override bool Evaluate(TR1Level level)

protected override bool Evaluate(TR2Level level)
{
TRModel model = Array.Find(level.Models, m => m.ID == (uint)TR2Type.BirdMonster);
TRModel model = level.Models.Find(m => m.ID == (uint)TR2Type.BirdMonster);
if (model != null)
{
return level.Animations[model.Animation + 20].FrameEnd == level.Animations[model.Animation + 19].FrameEnd;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1263,7 +1263,7 @@ private static void MirrorObjectTextures(ISet<ushort> textureReferences, TRObjec
}
}

private static void MirrorDependentFaces(TRModel[] models, ISet<ushort> textureReferences, Func<uint, TRMesh[]> meshAction)
private static void MirrorDependentFaces(IEnumerable<TRModel> models, ISet<ushort> textureReferences, Func<uint, TRMesh[]> meshAction)
{
foreach (TRModel model in models)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ public override void ApplyToLevel(TR3Level level)
UpdateModelEntities(level.Entities);
}

private void ConvertModel(TRModel[] models)
private void ConvertModel(List<TRModel> models)
{
if (Array.Find(models, m => m.ID == NewModelID) == null)
if (models.Find(m => m.ID == NewModelID) == null)
{
TRModel oldModel = Array.Find(models, m => m.ID == OldModelID);
TRModel oldModel = models.Find(m => m.ID == OldModelID);
if (oldModel != null)
{
oldModel.ID = NewModelID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,12 @@ public override void ApplyToLevel(TR3Level level)
RemapFaces(data, level.NumObjectTextures - 1, modelID => TRMeshUtilities.GetModelMeshes(level, (TR3Type)modelID));
}

private List<EMMeshTextureData> PrepareImportData(TRModel[] existingModels)
private List<EMMeshTextureData> PrepareImportData(List<TRModel> existingModels)
{
List<EMMeshTextureData> importData = new();
foreach (EMMeshTextureData data in Data)
{
if (Array.Find(existingModels, m => m.ID == data.ModelID) == null)
if (existingModels.Find(m => m.ID == data.ModelID) == null)
{
importData.Add(data);
}
Expand Down
72 changes: 35 additions & 37 deletions TRLevelControl/Control/TR1LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,61 +130,59 @@ protected override void Read(TRLevelReader reader)
_level.Meshes = ConstructMeshData(_level.MeshPointers, _level.RawMeshData);

//Animations
_level.NumAnimations = reader.ReadUInt32();
_level.Animations = new TRAnimation[_level.NumAnimations];
for (int i = 0; i < _level.NumAnimations; i++)
uint numAnimations = reader.ReadUInt32();
_level.Animations = new();
for (int i = 0; i < numAnimations; i++)
{
_level.Animations[i] = TR2FileReadUtilities.ReadAnimation(reader);
_level.Animations.Add(TR2FileReadUtilities.ReadAnimation(reader));
}

//State Changes
_level.NumStateChanges = reader.ReadUInt32();
_level.StateChanges = new TRStateChange[_level.NumStateChanges];
for (int i = 0; i < _level.NumStateChanges; i++)
uint numStateChanges = reader.ReadUInt32();
_level.StateChanges = new();
for (int i = 0; i < numStateChanges; i++)
{
_level.StateChanges[i] = TR2FileReadUtilities.ReadStateChange(reader);
_level.StateChanges.Add(TR2FileReadUtilities.ReadStateChange(reader));
}

//Animation Dispatches
_level.NumAnimDispatches = reader.ReadUInt32();
_level.AnimDispatches = new TRAnimDispatch[_level.NumAnimDispatches];
for (int i = 0; i < _level.NumAnimDispatches; i++)
uint numAnimDispatches = reader.ReadUInt32();
_level.AnimDispatches = new();
for (int i = 0; i < numAnimDispatches; i++)
{
_level.AnimDispatches[i] = TR2FileReadUtilities.ReadAnimDispatch(reader);
_level.AnimDispatches.Add(TR2FileReadUtilities.ReadAnimDispatch(reader));
}

//Animation Commands
_level.NumAnimCommands = reader.ReadUInt32();
_level.AnimCommands = new TRAnimCommand[_level.NumAnimCommands];
for (int i = 0; i < _level.NumAnimCommands; i++)
uint numAnimCommands = reader.ReadUInt32();
_level.AnimCommands = new();
for (int i = 0; i < numAnimCommands; i++)
{
_level.AnimCommands[i] = TR2FileReadUtilities.ReadAnimCommand(reader);
_level.AnimCommands.Add(TR2FileReadUtilities.ReadAnimCommand(reader));
}

//Mesh Trees
_level.NumMeshTrees = reader.ReadUInt32();
_level.NumMeshTrees /= 4;
_level.MeshTrees = new TRMeshTreeNode[_level.NumMeshTrees];
for (int i = 0; i < _level.NumMeshTrees; i++)
uint numMeshTrees = reader.ReadUInt32() / 4;
_level.MeshTrees = new();
for (int i = 0; i < numMeshTrees; i++)
{
_level.MeshTrees[i] = TR2FileReadUtilities.ReadMeshTreeNode(reader);
_level.MeshTrees.Add(TR2FileReadUtilities.ReadMeshTreeNode(reader));
}

//Frames
_level.NumFrames = reader.ReadUInt32();
_level.Frames = new ushort[_level.NumFrames];
for (int i = 0; i < _level.NumFrames; i++)
uint numFrames = reader.ReadUInt32();
_level.Frames = new();
for (int i = 0; i < numFrames; i++)
{
_level.Frames[i] = reader.ReadUInt16();
_level.Frames.Add(reader.ReadUInt16());
}

//Models
_level.NumModels = reader.ReadUInt32();
_level.Models = new TRModel[_level.NumModels];

for (int i = 0; i < _level.NumModels; i++)
uint numModels = reader.ReadUInt32();
_level.Models = new();
for (int i = 0; i < numModels; i++)
{
_level.Models[i] = TR2FileReadUtilities.ReadModel(reader);
_level.Models.Add(TR2FileReadUtilities.ReadModel(reader));
}

//Static Meshes
Expand Down Expand Up @@ -352,20 +350,20 @@ protected override void Write(TRLevelWriter writer)
writer.Write(_level.NumMeshPointers);
foreach (uint ptr in _level.MeshPointers) { writer.Write(ptr); }

writer.Write(_level.NumAnimations);
writer.Write((uint)_level.Animations.Count);
foreach (TRAnimation anim in _level.Animations) { writer.Write(anim.Serialize()); }
writer.Write(_level.NumStateChanges);
writer.Write((uint)_level.StateChanges.Count);
foreach (TRStateChange statec in _level.StateChanges) { writer.Write(statec.Serialize()); }
writer.Write(_level.NumAnimDispatches);
writer.Write((uint)_level.AnimDispatches.Count);
foreach (TRAnimDispatch dispatch in _level.AnimDispatches) { writer.Write(dispatch.Serialize()); }
writer.Write(_level.NumAnimCommands);
writer.Write((uint)_level.AnimCommands.Count);
foreach (TRAnimCommand cmd in _level.AnimCommands) { writer.Write(cmd.Serialize()); }
writer.Write(_level.NumMeshTrees * 4); //To get the correct number /= 4 is done during read, make sure to reverse it here.
writer.Write((uint)(_level.MeshTrees.Count * 4)); //To get the correct number /= 4 is done during read, make sure to reverse it here.
foreach (TRMeshTreeNode node in _level.MeshTrees) { writer.Write(node.Serialize()); }
writer.Write(_level.NumFrames);
writer.Write((uint)_level.Frames.Count);
foreach (ushort frame in _level.Frames) { writer.Write(frame); }

writer.Write(_level.NumModels);
writer.Write((uint)_level.Models.Count);
foreach (TRModel model in _level.Models) { writer.Write(model.Serialize()); }
writer.Write(_level.NumStaticMeshes);
foreach (TRStaticMesh mesh in _level.StaticMeshes) { writer.Write(mesh.Serialize()); }
Expand Down
72 changes: 35 additions & 37 deletions TRLevelControl/Control/TR2LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,61 +137,59 @@ protected override void Read(TRLevelReader reader)
_level.Meshes = ConstructMeshData(_level.MeshPointers, _level.RawMeshData);

//Animations
_level.NumAnimations = reader.ReadUInt32();
_level.Animations = new TRAnimation[_level.NumAnimations];
for (int i = 0; i < _level.NumAnimations; i++)
uint numAnimations = reader.ReadUInt32();
_level.Animations = new();
for (int i = 0; i < numAnimations; i++)
{
_level.Animations[i] = TR2FileReadUtilities.ReadAnimation(reader);
_level.Animations.Add(TR2FileReadUtilities.ReadAnimation(reader));
}

//State Changes
_level.NumStateChanges = reader.ReadUInt32();
_level.StateChanges = new TRStateChange[_level.NumStateChanges];
for (int i = 0; i < _level.NumStateChanges; i++)
uint numStateChanges = reader.ReadUInt32();
_level.StateChanges = new();
for (int i = 0; i < numStateChanges; i++)
{
_level.StateChanges[i] = TR2FileReadUtilities.ReadStateChange(reader);
_level.StateChanges.Add(TR2FileReadUtilities.ReadStateChange(reader));
}

//Animation Dispatches
_level.NumAnimDispatches = reader.ReadUInt32();
_level.AnimDispatches = new TRAnimDispatch[_level.NumAnimDispatches];
for (int i = 0; i < _level.NumAnimDispatches; i++)
uint numAnimDispatches = reader.ReadUInt32();
_level.AnimDispatches = new();
for (int i = 0; i < numAnimDispatches; i++)
{
_level.AnimDispatches[i] = TR2FileReadUtilities.ReadAnimDispatch(reader);
_level.AnimDispatches.Add(TR2FileReadUtilities.ReadAnimDispatch(reader));
}

//Animation Commands
_level.NumAnimCommands = reader.ReadUInt32();
_level.AnimCommands = new TRAnimCommand[_level.NumAnimCommands];
for (int i = 0; i < _level.NumAnimCommands; i++)
uint numAnimCommands = reader.ReadUInt32();
_level.AnimCommands = new();
for (int i = 0; i < numAnimCommands; i++)
{
_level.AnimCommands[i] = TR2FileReadUtilities.ReadAnimCommand(reader);
_level.AnimCommands.Add(TR2FileReadUtilities.ReadAnimCommand(reader));
}

//Mesh Trees
_level.NumMeshTrees = reader.ReadUInt32();
_level.NumMeshTrees /= 4;
_level.MeshTrees = new TRMeshTreeNode[_level.NumMeshTrees];
for (int i = 0; i < _level.NumMeshTrees; i++)
uint numMeshTrees = reader.ReadUInt32() / 4;
_level.MeshTrees = new();
for (int i = 0; i < numMeshTrees; i++)
{
_level.MeshTrees[i] = TR2FileReadUtilities.ReadMeshTreeNode(reader);
_level.MeshTrees.Add(TR2FileReadUtilities.ReadMeshTreeNode(reader));
}

//Frames
_level.NumFrames = reader.ReadUInt32();
_level.Frames = new ushort[_level.NumFrames];
for (int i = 0; i < _level.NumFrames; i++)
uint numFrames = reader.ReadUInt32();
_level.Frames = new();
for (int i = 0; i < numFrames; i++)
{
_level.Frames[i] = reader.ReadUInt16();
_level.Frames.Add(reader.ReadUInt16());
}

//Models
_level.NumModels = reader.ReadUInt32();
_level.Models = new TRModel[_level.NumModels];

for (int i = 0; i < _level.NumModels; i++)
uint numModels = reader.ReadUInt32();
_level.Models = new();
for (int i = 0; i < numModels; i++)
{
_level.Models[i] = TR2FileReadUtilities.ReadModel(reader);
_level.Models.Add(TR2FileReadUtilities.ReadModel(reader));
}

//Static Meshes
Expand Down Expand Up @@ -360,20 +358,20 @@ protected override void Write(TRLevelWriter writer)
writer.Write(_level.NumMeshPointers);
foreach (uint ptr in _level.MeshPointers) { writer.Write(ptr); }

writer.Write(_level.NumAnimations);
writer.Write((uint)_level.Animations.Count);
foreach (TRAnimation anim in _level.Animations) { writer.Write(anim.Serialize()); }
writer.Write(_level.NumStateChanges);
writer.Write((uint)_level.StateChanges.Count);
foreach (TRStateChange statec in _level.StateChanges) { writer.Write(statec.Serialize()); }
writer.Write(_level.NumAnimDispatches);
writer.Write((uint)_level.AnimDispatches.Count);
foreach (TRAnimDispatch dispatch in _level.AnimDispatches) { writer.Write(dispatch.Serialize()); }
writer.Write(_level.NumAnimCommands);
writer.Write((uint)_level.AnimCommands.Count);
foreach (TRAnimCommand cmd in _level.AnimCommands) { writer.Write(cmd.Serialize()); }
writer.Write(_level.NumMeshTrees * 4); //To get the correct number /= 4 is done during read, make sure to reverse it here.
writer.Write((uint)_level.MeshTrees.Count * 4); //To get the correct number /= 4 is done during read, make sure to reverse it here.
foreach (TRMeshTreeNode node in _level.MeshTrees) { writer.Write(node.Serialize()); }
writer.Write(_level.NumFrames);
writer.Write((uint)_level.Frames.Count);
foreach (ushort frame in _level.Frames) { writer.Write(frame); }

writer.Write(_level.NumModels);
writer.Write((uint)_level.Models.Count);
foreach (TRModel model in _level.Models) { writer.Write(model.Serialize()); }
writer.Write(_level.NumStaticMeshes);
foreach (TRStaticMesh mesh in _level.StaticMeshes) { writer.Write(mesh.Serialize()); }
Expand Down
Loading

0 comments on commit b7074dc

Please sign in to comment.