Per lightmap pixel raycasting
This commit is contained in:
parent
6a9aac972d
commit
f4c4237306
|
@ -185,7 +185,7 @@ class Program
|
|||
var cells = wr.Cells;
|
||||
for (var cellIdx = 0; cellIdx < cells.Length; cellIdx++)
|
||||
{
|
||||
Console.Write($"\rResetting cell lighting... {cellIdx + 1}/{cells.Length}");
|
||||
Console.Write($"\rLighting cell... {cellIdx + 1}/{cells.Length}\n");
|
||||
|
||||
var cell = cells[cellIdx];
|
||||
var numPolys = cell.PolyCount;
|
||||
|
@ -200,6 +200,7 @@ class Program
|
|||
}
|
||||
|
||||
var maxPolyIdx = Math.Min(numRenderPolys, numPolys - numPortalPolys);
|
||||
var cellIdxOffset = 0;
|
||||
for (int polyIdx = 0; polyIdx < maxPolyIdx; polyIdx++)
|
||||
{
|
||||
var poly = cell.Polys[polyIdx];
|
||||
|
@ -210,36 +211,51 @@ class Program
|
|||
|
||||
ResetLightmap(ambientLight, lightmap);
|
||||
|
||||
// Get world position of lightmap (0, 0)
|
||||
var baseU = (4.0f / info.Width) * (renderPoly.TextureBases.Item1 + (0.5f - info.Bases.Item1) * 0.25f);
|
||||
var baseV = (4.0f / info.Height) * (renderPoly.TextureBases.Item2 + (0.5f - info.Bases.Item2) * 0.25f);
|
||||
var topLeft = cell.Vertices[cell.Indices[cellIdxOffset]];
|
||||
topLeft -= baseU * (info.Width * 0.25f) * renderPoly.TextureVectors.Item1;
|
||||
topLeft -= baseV * (info.Height * 0.25f) * renderPoly.TextureVectors.Item2;
|
||||
|
||||
foreach (var light in lights)
|
||||
{
|
||||
// Check if plane normal is facing towards the light
|
||||
var direction = renderPoly.Center - light.position;
|
||||
if (Vector3.Dot(plane.Normal, direction) >= 0)
|
||||
// If it's not then we're never going to be (directly) lit by this
|
||||
// light.
|
||||
var centerDirection = renderPoly.Center - light.position;
|
||||
if (Vector3.Dot(plane.Normal, centerDirection) >= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (var y = 0; y < lightmap.Height; y++)
|
||||
{
|
||||
for (var x = 0; x < lightmap.Width; x++)
|
||||
{
|
||||
var pos = topLeft;
|
||||
pos += x * 0.25f * renderPoly.TextureVectors.Item1;
|
||||
pos += y * 0.25f * renderPoly.TextureVectors.Item2;
|
||||
|
||||
// Cast from the light to the center (later each pixel)
|
||||
var direction = pos - light.position;
|
||||
var hitResult = scene.Trace(new Ray
|
||||
{
|
||||
Origin = light.position,
|
||||
Direction = Vector3.Normalize(direction)
|
||||
Direction = Vector3.Normalize(direction),
|
||||
});
|
||||
|
||||
// cheeky epsilon
|
||||
var hit = hitResult && Math.Abs(hitResult.Distance - direction.Length()) < 0.001;
|
||||
if (hit)
|
||||
{
|
||||
for (var y = 0; y < lightmap.Height; y++)
|
||||
{
|
||||
for (var x = 0; x < lightmap.Width; x++)
|
||||
{
|
||||
lightmap.AddLight(0, x, y, (byte)light.color.X, (byte)light.color.Y, (byte)light.color.Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
cellIdxOffset += poly.VertexCount;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue