From d7b8ee35f4857e887074c248c73025ed4a5dd759 Mon Sep 17 00:00:00 2001 From: Jarrod Doyle Date: Thu, 1 Aug 2024 18:23:17 +0100 Subject: [PATCH] Render all lightmap layers --- project/code/LGS/Database/Chunks/WorldRep.cs | 44 +++++++------------- project/code/Mission.cs | 19 +++++---- 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/project/code/LGS/Database/Chunks/WorldRep.cs b/project/code/LGS/Database/Chunks/WorldRep.cs index 18b0d51..e1956a6 100644 --- a/project/code/LGS/Database/Chunks/WorldRep.cs +++ b/project/code/LGS/Database/Chunks/WorldRep.cs @@ -118,42 +118,26 @@ public class WorldRep : IChunk } } - public readonly Vector4[] AsRgba(uint layer) + public readonly Vector4 GetPixel(uint layer, uint x, uint y) { - if (layer >= Pixels.GetLength(0)) + if (layer >= Pixels.GetLength(0) || x >= Pixels.GetLength(2) || y >= Pixels.GetLength(1)) { - - return System.Array.Empty(); + return Vector4.Zero; } - var height = Pixels.GetLength(1); - var width = Pixels.GetLength(2); - var bpp = Pixels.GetLength(3); - var colours = new Vector4[height * width]; - for (var y = 0; y < height; y++) + switch (Pixels.GetLength(3)) { - for (var x = 0; x < width; x++) - { - var idx = x + y * width; - - switch (bpp) - { - case 1: - var raw1 = Pixels[layer, y, x, 0]; - colours[idx] = new Vector4(raw1, raw1, raw1, 255) / 255.0f; - break; - case 2: - var raw2 = Pixels[layer, y, x, 0] + (Pixels[layer, y, x, 1] << 8); - colours[idx] = new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 32) / 32.0f; - break; - case 4: - colours[idx] = new Vector4(Pixels[layer, y, x, 0], Pixels[layer, y, x, 1], Pixels[layer, y, x, 2], Pixels[layer, y, x, 3]) / 255.0f; - break; - } - } + case 1: + var raw1 = Pixels[layer, y, x, 0]; + return new Vector4(raw1, raw1, raw1, 255) / 255.0f; + case 2: + var raw2 = Pixels[layer, y, x, 0] + (Pixels[layer, y, x, 1] << 8); + return new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 32) / 32.0f; + case 4: + return new Vector4(Pixels[layer, y, x, 0], Pixels[layer, y, x, 1], Pixels[layer, y, x, 2], Pixels[layer, y, x, 3]) / 255.0f; + default: + return Vector4.Zero; } - - return colours; } } diff --git a/project/code/Mission.cs b/project/code/Mission.cs index a94e117..629875e 100644 --- a/project/code/Mission.cs +++ b/project/code/Mission.cs @@ -137,15 +137,20 @@ public partial class Mission : Node3D // Build lightmap var lightmap = cell.Lightmaps[rect.Id]; // TODO: Handle animlight layers - var colours = lightmap.AsRgba(0); - var height = lightmap.Pixels.GetLength(1); - var width = lightmap.Pixels.GetLength(2); - for (var y = 0; y < height; y++) + var layers = (uint)lightmap.Pixels.GetLength(0); + var height = (uint)lightmap.Pixels.GetLength(1); + var width = (uint)lightmap.Pixels.GetLength(2); + for (uint y = 0; y < height; y++) { - for (var x = 0; x < width; x++) + for (uint x = 0; x < width; x++) { - var rawColour = colours[x + y * width]; - image.SetPixel((int)rect.X + x, (int)rect.Y + y, new Color(rawColour.X, rawColour.Y, rawColour.Z, rawColour.W)); + var rawColour = System.Numerics.Vector4.Zero; + for (uint l = 0; l < layers; l++) + { + rawColour += lightmap.GetPixel(l, x, y); + } + var colour = new Color(MathF.Min(rawColour.X, 1.0f), MathF.Min(rawColour.Y, 1.0f), MathF.Min(rawColour.Z, 1.0f), MathF.Min(rawColour.W, 1.0f)); + image.SetPixel((int)(rect.X + x), (int)(rect.Y + y), colour); } }