Skip to content

Commit

Permalink
Refactor entities, cameras and sounds (LostArtefacts#646)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahm86 authored May 3, 2024
1 parent 5160d9f commit 0d337a0
Show file tree
Hide file tree
Showing 33 changed files with 557 additions and 557 deletions.
6 changes: 3 additions & 3 deletions TREnvironmentEditor/Model/Types/Mirroring/EMMirrorFunction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ private void MirrorNullMeshes(TR1Level level)
camera.X = FlipWorldX(camera.X);
}

foreach (TRSoundSource sound in level.SoundSources)
foreach (TRSoundSource<TR1SFX> sound in level.SoundSources)
{
sound.X = FlipWorldX(sound.X);
}
Expand All @@ -872,7 +872,7 @@ private void MirrorNullMeshes(TR2Level level)
camera.X = FlipWorldX(camera.X);
}

foreach (TRSoundSource sound in level.SoundSources)
foreach (TRSoundSource<TR2SFX> sound in level.SoundSources)
{
sound.X = FlipWorldX(sound.X);
}
Expand All @@ -892,7 +892,7 @@ private void MirrorNullMeshes(TR3Level level)
camera.X = FlipWorldX(camera.X);
}

foreach (TRSoundSource sound in level.SoundSources)
foreach (TRSoundSource<TR3SFX> sound in level.SoundSources)
{
sound.X = FlipWorldX(sound.X);
}
Expand Down
25 changes: 21 additions & 4 deletions TREnvironmentEditor/Model/Types/Sounds/EMAddSoundSourceFunction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,37 @@ namespace TREnvironmentEditor.Model.Types;

public class EMAddSoundSourceFunction : BaseEMFunction
{
public TRSoundSource Source { get; set; }
public uint ID { get; set; }
public TRSoundMode Mode { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }

public override void ApplyToLevel(TR1Level level)
{
level.SoundSources.Add(Source);
AddSource(level.SoundSources);
}

public override void ApplyToLevel(TR2Level level)
{
level.SoundSources.Add(Source);
AddSource(level.SoundSources);
}

public override void ApplyToLevel(TR3Level level)
{
level.SoundSources.Add(Source);
AddSource(level.SoundSources);
}

private void AddSource<T>(List<TRSoundSource<T>> sources)
where T : Enum
{
sources.Add(new()
{
ID = (T)(object)ID,
Mode = Mode,
X = X,
Y = Y,
Z = Z,
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ public override void ApplyToLevel(TR3Level level)
MoveSoundSource(level.SoundSources[Index]);
}

private void MoveSoundSource(TRSoundSource source)
private void MoveSoundSource<T>(TRSoundSource<T> source)
where T : Enum
{
source.X += Relocation.X;
source.Y += Relocation.Y;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace TREnvironmentEditor.Model.Types;

public class EMRemoveSoundSourceFunction : BaseEMFunction
{
public TRSoundSource Source { get; set; }
public TRSoundSource<TR1SFX> Source { get; set; }

public override void ApplyToLevel(TR1Level level)
{
Expand All @@ -21,9 +21,10 @@ public override void ApplyToLevel(TR3Level level)
RemoveSource(level.SoundSources);
}

private bool RemoveSource(List<TRSoundSource> sources)
private bool RemoveSource<T>(List<TRSoundSource<T>> sources)
where T : Enum
{
TRSoundSource source = sources.Find(s => s.X == Source.X && s.Y == Source.Y && s.Z == Source.Z);
TRSoundSource<T> source = sources.Find(s => s.X == Source.X && s.Y == Source.Y && s.Z == Source.Z);
return source != null && sources.Remove(source);
}
}
73 changes: 73 additions & 0 deletions TRLevelControl/Build/TRFlybyBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using TRLevelControl.Model;

namespace TRLevelControl.Build;

public class TRFlybyBuilder
{
private readonly ITRLevelObserver _observer;

public TRFlybyBuilder(ITRLevelObserver observer = null)
{
_observer = observer;
}

public TRDictionary<byte, List<TRFlybyCamera>> ReadFlybys(TRLevelReader reader)
{
TRDictionary<byte, List<TRFlybyCamera>> flybys = new();

uint numFlybys = reader.ReadUInt32();
for (int i = 0; i < numFlybys; i++)
{
TRFlybyCamera camera = new()
{
Position = reader.ReadVertex32(),
Target = reader.ReadVertex32(),
};

// Sequence is the flyby ID, index is the camera position in the sequence.
// This is reset on write as OG data contains gaps. Observers can observe.
byte sequence = reader.ReadByte();
byte index = reader.ReadByte();
_observer?.OnFlybyIndexRead(sequence, index);

camera.FOV = reader.ReadUInt16();
camera.Roll = reader.ReadInt16();
camera.Timer = reader.ReadUInt16();
camera.Speed = reader.ReadUInt16();
camera.Flags = (TRFlybyFlags)reader.ReadUInt16();
camera.Room = reader.ReadUInt32();

if (!flybys.ContainsKey(sequence))
{
flybys[sequence] = new();
}
flybys[sequence].Add(camera);
}

return flybys;
}

public void WriteFlybys(TRLevelWriter writer, TRDictionary<byte, List<TRFlybyCamera>> flybys)
{
writer.Write((uint)flybys.Values.Sum(f => f.Count));

foreach (byte sequence in flybys.Keys)
{
List<byte> indices = _observer?.GetFlybyIndices(sequence);
for (byte i = 0; i < flybys[sequence].Count; i++)
{
TRFlybyCamera camera = flybys[sequence][i];
writer.Write(camera.Position);
writer.Write(camera.Target);
writer.Write(sequence);
writer.Write(indices?[i] ?? i);
writer.Write(camera.FOV);
writer.Write(camera.Roll);
writer.Write(camera.Timer);
writer.Write(camera.Speed);
writer.Write((ushort)camera.Flags);
writer.Write(camera.Room);
}
}
}
}
89 changes: 56 additions & 33 deletions TRLevelControl/Control/TR1LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,20 +59,8 @@ protected override void Read(TRLevelReader reader)

ReadSprites(reader);

//Cameras
uint numCameras = reader.ReadUInt32();
_level.Cameras = new();
for (int i = 0; i < numCameras; i++)
{
_level.Cameras.Add(TR2FileReadUtilities.ReadCamera(reader));
}

uint numSoundSources = reader.ReadUInt32();
_level.SoundSources = new();
for (int i = 0; i < numSoundSources; i++)
{
_level.SoundSources.Add(TR2FileReadUtilities.ReadSoundSource(reader));
}
ReadCameras(reader);
ReadSoundSources(reader);

ReadBoxes(reader);

Expand All @@ -84,20 +72,12 @@ protected override void Read(TRLevelReader reader)
_level.AnimatedTextures.Add(TR2FileReadUtilities.ReadAnimatedTexture(reader));
}

//Entities
uint numEntities = reader.ReadUInt32();
_level.Entities = reader.ReadTR1Entities(numEntities);
ReadEntities(reader);

_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
_level.Palette = reader.ReadColours(TRConsts.PaletteSize);

//Cinematic Frames
ushort numCinematicFrames = reader.ReadUInt16();
_level.CinematicFrames = new();
for (int i = 0; i < numCinematicFrames; i++)
{
_level.CinematicFrames.Add(TR2FileReadUtilities.ReadCinematicFrame(reader));
}
ReadCinematicFrames(reader);

ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
Expand All @@ -123,11 +103,8 @@ protected override void Write(TRLevelWriter writer)
foreach (TRObjectTexture tex in _level.ObjectTextures) { writer.Write(tex.Serialize()); }
WriteSprites(writer);

writer.Write((uint)_level.Cameras.Count);
foreach (TRCamera cam in _level.Cameras) { writer.Write(cam.Serialize()); }

writer.Write((uint)_level.SoundSources.Count);
foreach (TRSoundSource src in _level.SoundSources) { writer.Write(src.Serialize()); }
WriteCameras(writer);
WriteSoundSources(writer);

WriteBoxes(writer);

Expand All @@ -136,16 +113,14 @@ protected override void Write(TRLevelWriter writer)
writer.Write((ushort)_level.AnimatedTextures.Count);
writer.Write(animTextureData);

writer.Write((uint)_level.Entities.Count);
writer.Write(_level.Entities);
WriteEntities(writer);

Debug.Assert(_level.LightMap.Count == TRConsts.LightMapSize);
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
writer.Write(_level.LightMap.ToArray());
writer.Write(_level.Palette);

writer.Write((ushort)_level.CinematicFrames.Count);
foreach (TRCinematicFrame cineframe in _level.CinematicFrames) { writer.Write(cineframe.Serialize()); }
WriteCinematicFrames(writer);

writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
Expand Down Expand Up @@ -220,6 +195,30 @@ private void WriteSprites(TRLevelWriter writer)
_spriteBuilder.WriteSprites(writer, _level.Sprites);
}

private void ReadCameras(TRLevelReader reader)
{
uint numCameras = reader.ReadUInt32();
_level.Cameras = reader.ReadCameras(numCameras);
}

private void WriteCameras(TRLevelWriter writer)
{
writer.Write((uint)_level.Cameras.Count);
writer.Write(_level.Cameras);
}

private void ReadSoundSources(TRLevelReader reader)
{
uint numSources = reader.ReadUInt32();
_level.SoundSources = reader.ReadSoundSources<TR1SFX>(numSources);
}

private void WriteSoundSources(TRLevelWriter writer)
{
writer.Write((uint)_level.SoundSources.Count);
writer.Write(_level.SoundSources);
}

private void ReadBoxes(TRLevelReader reader)
{
TRBoxBuilder boxBuilder = new(_level.Version.Game, _observer);
Expand All @@ -232,6 +231,30 @@ private void WriteBoxes(TRLevelWriter writer)
boxBuilder.WriteBoxes(writer, _level.Boxes);
}

private void ReadEntities(TRLevelReader reader)
{
uint numEntities = reader.ReadUInt32();
_level.Entities = reader.ReadTR1Entities(numEntities);
}

private void WriteEntities(TRLevelWriter writer)
{
writer.Write((uint)_level.Entities.Count);
writer.Write(_level.Entities);
}

private void ReadCinematicFrames(TRLevelReader reader)
{
ushort numFrames = reader.ReadUInt16();
_level.CinematicFrames = reader.ReadCinematicFrames(numFrames);
}

private void WriteCinematicFrames(TRLevelWriter writer)
{
writer.Write((ushort)_level.CinematicFrames.Count);
writer.Write(_level.CinematicFrames);
}

private void ReadSoundEffects(TRLevelReader reader)
{
_level.SoundEffects = new();
Expand Down
Loading

0 comments on commit 0d337a0

Please sign in to comment.