Render all lightmap layers

This commit is contained in:
Jarrod Doyle 2024-08-01 18:23:17 +01:00
parent 3307cdc8a9
commit d7b8ee35f4
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
2 changed files with 26 additions and 37 deletions

View File

@ -118,45 +118,29 @@ 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<Vector4>();
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++)
{
for (var x = 0; x < width; x++)
{
var idx = x + y * width;
switch (bpp)
switch (Pixels.GetLength(3))
{
case 1:
var raw1 = Pixels[layer, y, x, 0];
colours[idx] = new Vector4(raw1, raw1, raw1, 255) / 255.0f;
break;
return new Vector4(raw1, raw1, raw1, 255) / 255.0f;
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;
return new Vector4(raw2 & 31, (raw2 >> 5) & 31, (raw2 >> 10) & 31, 32) / 32.0f;
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;
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;
}
}
public byte VertexCount { get; set; }
public byte PolyCount { get; set; }
public byte RenderPolyCount { get; set; }

View File

@ -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);
}
}