Skip to content

Commit

Permalink
Convert static mesh storage to dictionaries (LostArtefacts#634)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahm86 authored Apr 29, 2024
1 parent 5b45d14 commit e334bef
Show file tree
Hide file tree
Showing 26 changed files with 117 additions and 129 deletions.
20 changes: 10 additions & 10 deletions TREnvironmentEditor/Model/Types/Mirroring/EMMirrorFunction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -561,20 +561,20 @@ private void MirrorBoxes(List<TR2Box> boxes)

private static void MirrorStaticMeshes(TR1Level level)
{
MirrorStaticMeshes(level.StaticMeshes);
MirrorStaticMeshes(level.StaticMeshes.Values);
}

private static void MirrorStaticMeshes(TR2Level level)
{
MirrorStaticMeshes(level.StaticMeshes);
MirrorStaticMeshes(level.StaticMeshes.Values);
}

private static void MirrorStaticMeshes(TR3Level level)
{
MirrorStaticMeshes(level.StaticMeshes);
MirrorStaticMeshes(level.StaticMeshes.Values);
}

private static void MirrorStaticMeshes(List<TRStaticMesh> staticMeshes)
private static void MirrorStaticMeshes(IEnumerable<TRStaticMesh> staticMeshes)
{
foreach (TRStaticMesh staticMesh in staticMeshes)
{
Expand Down Expand Up @@ -1010,7 +1010,6 @@ private static void MirrorTextures(TR1Level level)

// Keep track of static meshes so they are only processed once,
// and so we only target those actually in use in rooms.
List<TRStaticMesh> staticMeshes = level.StaticMeshes.ToList();
ISet<TRStaticMesh> processedMeshes = new HashSet<TRStaticMesh>();

foreach (TR1Room room in level.Rooms)
Expand All @@ -1031,7 +1030,8 @@ private static void MirrorTextures(TR1Level level)

foreach (TR1RoomStaticMesh roomStaticMesh in room.StaticMeshes)
{
TRStaticMesh staticMesh = staticMeshes.Find(m => m.ID == roomStaticMesh.MeshID);
TR1Type id = roomStaticMesh.MeshID + TR1Type.SceneryBase;
TRStaticMesh staticMesh = level.StaticMeshes[id];
if (!processedMeshes.Add(staticMesh))
{
continue;
Expand Down Expand Up @@ -1088,7 +1088,6 @@ private static void MirrorTextures(TR2Level level)

// Keep track of static meshes so they are only processed once,
// and so we only target those actually in use in rooms.
List<TRStaticMesh> staticMeshes = level.StaticMeshes.ToList();
ISet<TRStaticMesh> processedMeshes = new HashSet<TRStaticMesh>();

foreach (TR2Room room in level.Rooms)
Expand All @@ -1109,7 +1108,8 @@ private static void MirrorTextures(TR2Level level)

foreach (TR2RoomStaticMesh roomStaticMesh in room.StaticMeshes)
{
TRStaticMesh staticMesh = staticMeshes.Find(m => m.ID == roomStaticMesh.MeshID);
TR2Type id = roomStaticMesh.MeshID + TR2Type.SceneryBase;
TRStaticMesh staticMesh = level.StaticMeshes[id];
if (!processedMeshes.Add(staticMesh))
{
continue;
Expand Down Expand Up @@ -1158,7 +1158,6 @@ private static void MirrorTextures(TR3Level level)
{
ISet<ushort> textureReferences = new HashSet<ushort>();

List<TRStaticMesh> staticMeshes = level.StaticMeshes.ToList();
ISet<TRStaticMesh> processedMeshes = new HashSet<TRStaticMesh>();

foreach (TR3Room room in level.Rooms)
Expand All @@ -1179,7 +1178,8 @@ private static void MirrorTextures(TR3Level level)

foreach (TR3RoomStaticMesh roomStaticMesh in room.StaticMeshes)
{
TRStaticMesh staticMesh = staticMeshes.Find(m => m.ID == roomStaticMesh.MeshID);
TR3Type id = roomStaticMesh.MeshID + TR3Type.SceneryBase;
TRStaticMesh staticMesh = level.StaticMeshes[id];
if (!processedMeshes.Add(staticMesh))
{
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,27 @@ public class EMMirrorStaticMeshFunction : BaseEMFunction

public override void ApplyToLevel(TR1Level level)
{
IEnumerable<TRMesh> meshes = level.StaticMeshes.ToList()
.FindAll(s => MeshIDs.Contains(s.ID))
.Select(s => s.Mesh);
IEnumerable<TRMesh> meshes = level.StaticMeshes
.Where(kvp => MeshIDs.Contains(kvp.Key - TR1Type.SceneryBase))
.Select(kvp => kvp.Value.Mesh);

MirrorMeshes(meshes);
}

public override void ApplyToLevel(TR2Level level)
{
IEnumerable<TRMesh> meshes = level.StaticMeshes.ToList()
.FindAll(s => MeshIDs.Contains(s.ID))
.Select(s => s.Mesh);
IEnumerable<TRMesh> meshes = level.StaticMeshes
.Where(kvp => MeshIDs.Contains(kvp.Key - TR2Type.SceneryBase))
.Select(kvp => kvp.Value.Mesh);

MirrorMeshes(meshes);
}

public override void ApplyToLevel(TR3Level level)
{
IEnumerable<TRMesh> meshes = level.StaticMeshes.ToList()
.FindAll(s => MeshIDs.Contains(s.ID))
.Select(s => s.Mesh);
IEnumerable<TRMesh> meshes = level.StaticMeshes
.Where(kvp => MeshIDs.Contains(kvp.Key - TR3Type.SceneryBase))
.Select(kvp => kvp.Value.Mesh);

MirrorMeshes(meshes);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,28 @@ namespace TREnvironmentEditor.Model;

public class EMCreateStaticMeshFunction : BaseEMFunction
{
public uint ID { get; set; }
public TRMesh Mesh { get; set; }
public TRStaticMesh Info { get; set; }

public override void ApplyToLevel(TR1Level level)
{
TRStaticMesh newMesh = Info.Clone();
newMesh.Mesh = Mesh;
level.StaticMeshes.Add(newMesh);
level.StaticMeshes[(TR1Type)ID] = newMesh;
}

public override void ApplyToLevel(TR2Level level)
{
TRStaticMesh newMesh = Info.Clone();
newMesh.Mesh = Mesh;
level.StaticMeshes.Add(newMesh);
level.StaticMeshes[(TR2Type)ID] = newMesh;
}

public override void ApplyToLevel(TR3Level level)
{
TRStaticMesh newMesh = Info.Clone();
newMesh.Mesh = Mesh;
level.StaticMeshes.Add(newMesh);
level.StaticMeshes[(TR3Type)ID] = newMesh;
}
}
32 changes: 18 additions & 14 deletions TRLevelControl/Build/TRObjectMeshBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@

namespace TRLevelControl.Build;

public class TRObjectMeshBuilder : IMeshProvider
public class TRObjectMeshBuilder<T> : IMeshProvider
where T : Enum
{
private readonly TRGameVersion _version;
private readonly ITRLevelObserver _observer;

private uint[] _meshPointers;
private Dictionary<long, TRMesh> _objectMeshes;
private Dictionary<uint, ushort> _staticMeshPointers;
private Dictionary<T, ushort> _staticMeshPointers;

public TRMesh GetObjectMesh(long pointer)
=> _objectMeshes[_meshPointers[pointer]];
Expand Down Expand Up @@ -95,7 +96,7 @@ public void BuildObjectMeshes(TRLevelReader reader)
}
}

public void WriteObjectMeshes(TRLevelWriter writer, IEnumerable<TRMesh> objectMeshes, List<TRStaticMesh> staticMeshes)
public void WriteObjectMeshes(TRLevelWriter writer, IEnumerable<TRMesh> objectMeshes, TRDictionary<T, TRStaticMesh> staticMeshes)
{
List<TRMesh> cachedMeshes = new();
List<uint> meshPointers = new();
Expand Down Expand Up @@ -123,9 +124,9 @@ void StoreMesh(TRMesh m)
StoreMesh(mesh);
}

foreach (TRStaticMesh staticMesh in staticMeshes)
foreach (var (type, staticMesh) in staticMeshes)
{
_staticMeshPointers[staticMesh.ID] = (ushort)meshPointers.Count;
_staticMeshPointers[type] = (ushort)meshPointers.Count;
StoreMesh(staticMesh.Mesh);
}

Expand All @@ -136,33 +137,36 @@ void StoreMesh(TRMesh m)
writer.Write(meshPointers);
}

public List<TRStaticMesh> ReadStaticMeshes(TRLevelReader reader)
public TRDictionary<T, TRStaticMesh> ReadStaticMeshes(TRLevelReader reader, T sceneryBase)
{
uint sceneryID = (uint)(object)sceneryBase;
uint numMeshes = reader.ReadUInt32();
List<TRStaticMesh> meshes = new();
TRDictionary<T, TRStaticMesh> meshes = new();

for (int i = 0; i < numMeshes; i++)
{
meshes.Add(new()
T type = (T)(object)(reader.ReadUInt32() + sceneryID);
meshes[type] = new()
{
ID = reader.ReadUInt32(),
Mesh = GetObjectMesh(reader.ReadUInt16()),
VisibilityBox = reader.ReadBoundingBox(),
CollisionBox = reader.ReadBoundingBox(),
Flags = reader.ReadUInt16()
});
};
}

return meshes;
}

public void WriteStaticMeshes(TRLevelWriter writer, List<TRStaticMesh> staticMeshes)
public void WriteStaticMeshes(TRLevelWriter writer, TRDictionary<T, TRStaticMesh> staticMeshes, T sceneryBase)
{
uint sceneryID = (uint)(object)sceneryBase;
writer.Write((uint)staticMeshes.Count);
foreach (TRStaticMesh staticMesh in staticMeshes)
foreach (T staticType in staticMeshes.Keys)
{
writer.Write(staticMesh.ID);
writer.Write(_staticMeshPointers[staticMesh.ID]);
TRStaticMesh staticMesh = staticMeshes[staticType];
writer.Write((uint)(object)staticType - sceneryID);
writer.Write(_staticMeshPointers[staticType]);
writer.Write(staticMesh.VisibilityBox);
writer.Write(staticMesh.CollisionBox);
writer.Write(staticMesh.Flags);
Expand Down
6 changes: 3 additions & 3 deletions TRLevelControl/Control/TR1LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace TRLevelControl;

public class TR1LevelControl : TRLevelControlBase<TR1Level>
{
private readonly TRObjectMeshBuilder _meshBuilder;
private readonly TRObjectMeshBuilder<TR1Type> _meshBuilder;
private readonly TRSpriteBuilder<TR1Type> _spriteBuilder;

public TR1LevelControl(ITRLevelObserver observer = null)
Expand Down Expand Up @@ -264,12 +264,12 @@ private void WriteModelData(TRLevelWriter writer)

private void ReadStaticMeshes(TRLevelReader reader)
{
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader);
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader, TR1Type.SceneryBase);
}

private void WriteStaticMeshes(TRLevelWriter writer)
{
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes);
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes, TR1Type.SceneryBase);
}

private void ReadSprites(TRLevelReader reader)
Expand Down
6 changes: 3 additions & 3 deletions TRLevelControl/Control/TR2LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace TRLevelControl;

public class TR2LevelControl : TRLevelControlBase<TR2Level>
{
private readonly TRObjectMeshBuilder _meshBuilder;
private readonly TRObjectMeshBuilder<TR2Type> _meshBuilder;
private readonly TRSpriteBuilder<TR2Type> _spriteBuilder;

public TR2LevelControl(ITRLevelObserver observer = null)
Expand Down Expand Up @@ -275,12 +275,12 @@ private void WriteModelData(TRLevelWriter writer)

private void ReadStaticMeshes(TRLevelReader reader)
{
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader);
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader, TR2Type.SceneryBase);
}

private void WriteStaticMeshes(TRLevelWriter writer)
{
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes);
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes, TR2Type.SceneryBase);
}

private void ReadSprites(TRLevelReader reader)
Expand Down
6 changes: 3 additions & 3 deletions TRLevelControl/Control/TR3LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace TRLevelControl;

public class TR3LevelControl : TRLevelControlBase<TR3Level>
{
private readonly TRObjectMeshBuilder _meshBuilder;
private readonly TRObjectMeshBuilder<TR3Type> _meshBuilder;
private readonly TRSpriteBuilder<TR3Type> _spriteBuilder;

public TR3LevelControl(ITRLevelObserver observer = null)
Expand Down Expand Up @@ -281,12 +281,12 @@ private void WriteModelData(TRLevelWriter writer)

private void ReadStaticMeshes(TRLevelReader reader)
{
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader);
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader, TR3Type.SceneryBase);
}

private void WriteStaticMeshes(TRLevelWriter writer)
{
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes);
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes, TR3Type.SceneryBase);
}

private void ReadSprites(TRLevelReader reader)
Expand Down
6 changes: 3 additions & 3 deletions TRLevelControl/Control/TR4LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace TRLevelControl;

public class TR4LevelControl : TRLevelControlBase<TR4Level>
{
private readonly TRObjectMeshBuilder _meshBuilder;
private readonly TRObjectMeshBuilder<TR4Type> _meshBuilder;
private readonly TRSpriteBuilder<TR4Type> _spriteBuilder;

public TR4LevelControl(ITRLevelObserver observer = null)
Expand Down Expand Up @@ -206,12 +206,12 @@ private void WriteModelData(TRLevelWriter writer)

private void ReadStaticMeshes(TRLevelReader reader)
{
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader);
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader, TR4Type.SceneryBase);
}

private void WriteStaticMeshes(TRLevelWriter writer)
{
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes);
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes, TR4Type.SceneryBase);
}

private void ReadSprites(TRLevelReader reader)
Expand Down
6 changes: 3 additions & 3 deletions TRLevelControl/Control/TR5LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace TRLevelControl;

public class TR5LevelControl : TRLevelControlBase<TR5Level>
{
private readonly TRObjectMeshBuilder _meshBuilder;
private readonly TRObjectMeshBuilder<TR5Type> _meshBuilder;
private readonly TRSpriteBuilder<TR5Type> _spriteBuilder;

public TR5LevelControl(ITRLevelObserver observer = null)
Expand Down Expand Up @@ -223,12 +223,12 @@ private void WriteModelData(TRLevelWriter writer)

private void ReadStaticMeshes(TRLevelReader reader)
{
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader);
_level.StaticMeshes = _meshBuilder.ReadStaticMeshes(reader, TR5Type.SceneryBase);
}

private void WriteStaticMeshes(TRLevelWriter writer)
{
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes);
_meshBuilder.WriteStaticMeshes(writer, _level.StaticMeshes, TR5Type.SceneryBase);
}

private void ReadSprites(TRLevelReader reader)
Expand Down
2 changes: 0 additions & 2 deletions TRLevelControl/Model/Common/TRStaticMesh.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

public class TRStaticMesh : ICloneable
{
public uint ID { get; set; }
public TRMesh Mesh { get; set; }
public TRBoundingBox VisibilityBox { get; set; }
public TRBoundingBox CollisionBox { get; set; }
Expand Down Expand Up @@ -44,7 +43,6 @@ public TRStaticMesh Clone()
{
return new()
{
ID = ID,
Mesh = Mesh.Clone(),
VisibilityBox = VisibilityBox.Clone(),
CollisionBox = CollisionBox.Clone(),
Expand Down
4 changes: 2 additions & 2 deletions TRLevelControl/Model/TR1/TR1Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class TR1Level : TRLevelBase
public List<TR1Room> Rooms { get; set; }
public List<ushort> FloorData { get; set; }
public TRDictionary<TR1Type, TRModel> Models { get; set; }
public List<TRStaticMesh> StaticMeshes { get; set; }
public TRDictionary<TR1Type, TRStaticMesh> StaticMeshes { get; set; }
public List<TRObjectTexture> ObjectTextures { get; set; }
public TRDictionary<TR1Type, TRSpriteSequence> Sprites { get; set; }
public List<TRCamera> Cameras { get; set; }
Expand All @@ -23,6 +23,6 @@ public class TR1Level : TRLevelBase
public SortedDictionary<TR1SFX, TR1SoundEffect> SoundEffects { get; set; }

public override IEnumerable<TRMesh> DistinctMeshes => Models.Values.SelectMany(m => m.Meshes)
.Concat(StaticMeshes.Select(s => s.Mesh))
.Concat(StaticMeshes.Values.Select(s => s.Mesh))
.Distinct();
}
Loading

0 comments on commit e334bef

Please sign in to comment.