Skip to content

Commit

Permalink
Reorganise colours and textiles (LostArtefacts#650)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahm86 authored May 4, 2024
1 parent 0ec7c0a commit 18a0188
Show file tree
Hide file tree
Showing 13 changed files with 165 additions and 195 deletions.
51 changes: 40 additions & 11 deletions TRLevelControl/Control/TR1LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,8 @@ protected override void Initialise()

protected override void Read(TRLevelReader reader)
{
uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
ReadImages(reader);

// Unused, always 0 in OG
_level.Version.LevelNumber = reader.ReadUInt32();

ReadRooms(reader);
Expand All @@ -64,8 +62,8 @@ protected override void Read(TRLevelReader reader)

ReadEntities(reader);

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

ReadCinematicFrames(reader);

Expand All @@ -77,8 +75,7 @@ protected override void Read(TRLevelReader reader)

protected override void Write(TRLevelWriter writer)
{
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
WriteImages(writer);

writer.Write(_level.Version.LevelNumber);

Expand All @@ -101,10 +98,8 @@ protected override void Write(TRLevelWriter writer)

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);
WriteLightMap(writer);
WritePalette(writer);

WriteCinematicFrames(writer);

Expand All @@ -114,6 +109,18 @@ protected override void Write(TRLevelWriter writer)
WriteSoundEffects(writer);
}

private void ReadImages(TRLevelReader reader)
{
uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
}

private void WriteImages(TRLevelWriter writer)
{
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
}

private void ReadRooms(TRLevelReader reader)
{
_level.Rooms = _roomBuilder.ReadRooms(reader);
Expand Down Expand Up @@ -249,6 +256,28 @@ private void WriteEntities(TRLevelWriter writer)
writer.Write(_level.Entities);
}

private void ReadLightMap(TRLevelReader reader)
{
_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
}

private void WriteLightMap(TRLevelWriter writer)
{
Debug.Assert(_level.LightMap.Count == TRConsts.LightMapSize);
writer.Write(_level.LightMap);
}

private void ReadPalette(TRLevelReader reader)
{
_level.Palette = reader.ReadColours(TRConsts.PaletteSize, TRConsts.Palette8Multiplier);
}

private void WritePalette(TRLevelWriter writer)
{
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
writer.Write(_level.Palette, TRConsts.Palette8Multiplier);
}

private void ReadCinematicFrames(TRLevelReader reader)
{
ushort numFrames = reader.ReadUInt16();
Expand Down
66 changes: 46 additions & 20 deletions TRLevelControl/Control/TR2LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,9 @@ protected override void Initialise()

protected override void Read(TRLevelReader reader)
{
// Colour palettes and textures
_level.Palette = reader.ReadColours(TRConsts.PaletteSize);
_level.Palette16 = reader.ReadColour4s(TRConsts.PaletteSize);

uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
_level.Images16 = reader.ReadImage16s(numImages);
ReadPalette(reader);
ReadImages(reader);

// Unused, always 0 in OG
_level.Version.LevelNumber = reader.ReadUInt32();

ReadRooms(reader);
Expand All @@ -69,7 +63,7 @@ protected override void Read(TRLevelReader reader)

ReadEntities(reader);

_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
ReadLightMap(reader);

ReadCinematicFrames(reader);

Expand All @@ -81,15 +75,8 @@ protected override void Read(TRLevelReader reader)

protected override void Write(TRLevelWriter writer)
{
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
Debug.Assert(_level.Palette16.Count == TRConsts.PaletteSize);
writer.Write(_level.Palette);
writer.Write(_level.Palette16);

Debug.Assert(_level.Images8.Count == _level.Images16.Count);
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
writer.Write(_level.Images16);
WritePalette(writer);
WriteImages(writer);

writer.Write(_level.Version.LevelNumber);

Expand All @@ -112,8 +99,7 @@ protected override void Write(TRLevelWriter writer)

WriteEntities(writer);

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

WriteCinematicFrames(writer);

Expand All @@ -123,6 +109,35 @@ protected override void Write(TRLevelWriter writer)
WriteSoundEffects(writer);
}

private void ReadPalette(TRLevelReader reader)
{
_level.Palette = reader.ReadColours(TRConsts.PaletteSize, TRConsts.Palette8Multiplier);
_level.Palette16 = reader.ReadColour4s(TRConsts.PaletteSize);
}

private void WritePalette(TRLevelWriter writer)
{
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
Debug.Assert(_level.Palette16.Count == TRConsts.PaletteSize);
writer.Write(_level.Palette, TRConsts.Palette8Multiplier);
writer.Write(_level.Palette16);
}

private void ReadImages(TRLevelReader reader)
{
uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
_level.Images16 = reader.ReadImage16s(numImages);
}

private void WriteImages(TRLevelWriter writer)
{
Debug.Assert(_level.Images8.Count == _level.Images16.Count);
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
writer.Write(_level.Images16);
}

private void ReadRooms(TRLevelReader reader)
{
_level.Rooms = _roomBuilder.ReadRooms(reader);
Expand Down Expand Up @@ -258,6 +273,17 @@ private void WriteEntities(TRLevelWriter writer)
writer.Write(_level.Entities);
}

private void ReadLightMap(TRLevelReader reader)
{
_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
}

private void WriteLightMap(TRLevelWriter writer)
{
Debug.Assert(_level.LightMap.Count == TRConsts.LightMapSize);
writer.Write(_level.LightMap);
}

private void ReadCinematicFrames(TRLevelReader reader)
{
ushort numFrames = reader.ReadUInt16();
Expand Down
66 changes: 46 additions & 20 deletions TRLevelControl/Control/TR3LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,9 @@ protected override void Initialise()

protected override void Read(TRLevelReader reader)
{
// Colour palettes and textures
_level.Palette = reader.ReadColours(TRConsts.PaletteSize);
_level.Palette16 = reader.ReadColour4s(TRConsts.PaletteSize);

uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
_level.Images16 = reader.ReadImage16s(numImages);
ReadPalette(reader);
ReadImages(reader);

// Unused, always 0 in OG
_level.Version.LevelNumber = reader.ReadUInt32();

ReadRooms(reader);
Expand All @@ -69,7 +63,7 @@ protected override void Read(TRLevelReader reader)

ReadEntities(reader);

_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
ReadLightMap(reader);

ReadCinematicFrames(reader);

Expand All @@ -81,15 +75,8 @@ protected override void Read(TRLevelReader reader)

protected override void Write(TRLevelWriter writer)
{
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
Debug.Assert(_level.Palette16.Count == TRConsts.PaletteSize);
writer.Write(_level.Palette);
writer.Write(_level.Palette16);

Debug.Assert(_level.Images8.Count == _level.Images16.Count);
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
writer.Write(_level.Images16);
WritePalette(writer);
WriteImages(writer);

writer.Write(_level.Version.LevelNumber);

Expand All @@ -112,8 +99,7 @@ protected override void Write(TRLevelWriter writer)

WriteEntities(writer);

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

WriteCinematicFrames(writer);

Expand All @@ -123,6 +109,35 @@ protected override void Write(TRLevelWriter writer)
WriteSoundEffects(writer);
}

private void ReadPalette(TRLevelReader reader)
{
_level.Palette = reader.ReadColours(TRConsts.PaletteSize, TRConsts.Palette8Multiplier);
_level.Palette16 = reader.ReadColour4s(TRConsts.PaletteSize);
}

private void WritePalette(TRLevelWriter writer)
{
Debug.Assert(_level.Palette.Count == TRConsts.PaletteSize);
Debug.Assert(_level.Palette16.Count == TRConsts.PaletteSize);
writer.Write(_level.Palette, TRConsts.Palette8Multiplier);
writer.Write(_level.Palette16);
}

private void ReadImages(TRLevelReader reader)
{
uint numImages = reader.ReadUInt32();
_level.Images8 = reader.ReadImage8s(numImages);
_level.Images16 = reader.ReadImage16s(numImages);
}

private void WriteImages(TRLevelWriter writer)
{
Debug.Assert(_level.Images8.Count == _level.Images16.Count);
writer.Write((uint)_level.Images8.Count);
writer.Write(_level.Images8);
writer.Write(_level.Images16);
}

private void ReadRooms(TRLevelReader reader)
{
_level.Rooms = _roomBuilder.ReadRooms(reader);
Expand Down Expand Up @@ -258,6 +273,17 @@ private void WriteEntities(TRLevelWriter writer)
writer.Write(_level.Entities);
}

private void ReadLightMap(TRLevelReader reader)
{
_level.LightMap = new(reader.ReadBytes(TRConsts.LightMapSize));
}

private void WriteLightMap(TRLevelWriter writer)
{
Debug.Assert(_level.LightMap.Count == TRConsts.LightMapSize);
writer.Write(_level.LightMap);
}

private void ReadCinematicFrames(TRLevelReader reader)
{
ushort numFrames = reader.ReadUInt16();
Expand Down
4 changes: 2 additions & 2 deletions TRLevelControl/Control/TR4LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ private void ReadLevelDataChunk(TRLevelReader mainReader)
{
using TRLevelReader reader = mainReader.Inflate(TRChunkType.LevelData);

reader.ReadUInt32(); // Unused, always 0
_level.Version.LevelNumber = reader.ReadUInt32();

ReadRooms(reader);

Expand Down Expand Up @@ -138,7 +138,7 @@ private void WriteLevelDataChunk(TRLevelWriter mainWriter)
{
using TRLevelWriter writer = new();

writer.Write((uint)0); // Unused, always 0
writer.Write(_level.Version.LevelNumber);

WriteRooms(writer);

Expand Down
4 changes: 2 additions & 2 deletions TRLevelControl/Control/TR5LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ private void ReadLevelDataChunk(TRLevelReader reader)
uint compressedLength = reader.ReadUInt32();
Debug.Assert(expectedLength == compressedLength);

reader.ReadUInt32(); // Unused, always 0
_level.Version.LevelNumber = reader.ReadUInt32();

ReadRooms(reader);

Expand Down Expand Up @@ -149,7 +149,7 @@ private void WriteLevelDataChunk(TRLevelWriter mainWriter)
{
using TRLevelWriter writer = new();

writer.Write((uint)0); // Unused, always 0
writer.Write(_level.Version.LevelNumber);

WriteRooms(writer);

Expand Down
14 changes: 0 additions & 14 deletions TRLevelControl/Helpers/TextileToBitmapConverter.cs

This file was deleted.

13 changes: 7 additions & 6 deletions TRLevelControl/IO/TRLevelWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,19 +115,20 @@ public void Write(TRTexImage32 image)
Write(image.Pixels);
}

public void Write(IEnumerable<TRColour> colours)
public void Write(IEnumerable<TRColour> colours, byte divisor)
{
foreach (TRColour colour in colours)
{
Write(colour);
Write(colour, divisor);
}
}

public void Write(TRColour colour)
public void Write(TRColour colour, byte divisor = 1)
{
Write(colour.Red);
Write(colour.Green);
Write(colour.Blue);
divisor = Math.Max((byte)1, divisor);
Write((byte)(colour.Red / divisor));
Write((byte)(colour.Green / divisor));
Write((byte)(colour.Blue / divisor));
}

public void Write(IEnumerable<TRColour4> colours)
Expand Down
Loading

0 comments on commit 18a0188

Please sign in to comment.