Compare commits
No commits in common. "d144bdb6e991016a7307491c13f08db4d4f17f7b" and "10a8a31520349b24f6bdeb3d6b1f87ff42713431" have entirely different histories.
d144bdb6e9
...
10a8a31520
|
@ -1,54 +0,0 @@
|
||||||
using System.Numerics;
|
|
||||||
|
|
||||||
namespace KeepersCompound.Lightmapper;
|
|
||||||
|
|
||||||
public static class MathUtils
|
|
||||||
{
|
|
||||||
public readonly struct Aabb
|
|
||||||
{
|
|
||||||
public readonly Vector3 Min;
|
|
||||||
public readonly Vector3 Max;
|
|
||||||
|
|
||||||
public Aabb(Vector3[] points)
|
|
||||||
{
|
|
||||||
Min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
|
|
||||||
Max = new Vector3(float.MinValue, float.MinValue, float.MinValue);
|
|
||||||
|
|
||||||
foreach (var p in points)
|
|
||||||
{
|
|
||||||
Min = Vector3.Min(Min, p);
|
|
||||||
Max = Vector3.Max(Max, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly struct Sphere
|
|
||||||
{
|
|
||||||
public readonly Vector3 Position;
|
|
||||||
public readonly float Radius;
|
|
||||||
|
|
||||||
public Sphere(Vector3 position, float radius)
|
|
||||||
{
|
|
||||||
Position = position;
|
|
||||||
Radius = radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vector3 ClosestPoint(Aabb aabb, Vector3 point)
|
|
||||||
{
|
|
||||||
return Vector3.Min(aabb.Max, Vector3.Max(aabb.Min, point));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool Intersects(Sphere sphere, Aabb aabb)
|
|
||||||
{
|
|
||||||
var closestPoint = ClosestPoint(aabb, sphere.Position);
|
|
||||||
var d2 = (sphere.Position - closestPoint).LengthSquared();
|
|
||||||
var r2 = sphere.Radius * sphere.Radius;
|
|
||||||
return d2 < r2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float DistanceFromPlane(Plane plane, Vector3 point)
|
|
||||||
{
|
|
||||||
return Math.Abs(Vector3.Dot(plane.Normal, point) + plane.D) / plane.Normal.Length();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -22,7 +22,6 @@ class Program
|
||||||
|
|
||||||
var misPath = "/stuff/Games/thief/drive_c/GOG Games/TG ND 1.27 (MAPPING)/FMs/JAYRUDE_Tests/lm_test.cow";
|
var misPath = "/stuff/Games/thief/drive_c/GOG Games/TG ND 1.27 (MAPPING)/FMs/JAYRUDE_Tests/lm_test.cow";
|
||||||
misPath = "/stuff/Games/thief/drive_c/GOG Games/TG ND 1.27 (MAPPING)/FMs/AtdV/miss20.mis";
|
misPath = "/stuff/Games/thief/drive_c/GOG Games/TG ND 1.27 (MAPPING)/FMs/AtdV/miss20.mis";
|
||||||
misPath = "/stuff/Games/thief/drive_c/GOG Games/TG ND 1.27 (MAPPING)/FMs/TDP20AC_a_burrick_in_a_room/miss20.mis";
|
|
||||||
Timing.TimeStage("Total", () => LightmapMission(misPath));
|
Timing.TimeStage("Total", () => LightmapMission(misPath));
|
||||||
|
|
||||||
Timing.LogAll();
|
Timing.LogAll();
|
||||||
|
@ -247,15 +246,6 @@ class Program
|
||||||
topLeft -= renderPoly.TextureVectors.Item1 * (renderPoly.TextureBases.Item1 - info.Bases.Item1 * 0.25f);
|
topLeft -= renderPoly.TextureVectors.Item1 * (renderPoly.TextureBases.Item1 - info.Bases.Item1 * 0.25f);
|
||||||
topLeft -= renderPoly.TextureVectors.Item2 * (renderPoly.TextureBases.Item2 - info.Bases.Item2 * 0.25f);
|
topLeft -= renderPoly.TextureVectors.Item2 * (renderPoly.TextureBases.Item2 - info.Bases.Item2 * 0.25f);
|
||||||
|
|
||||||
var xDir = 0.25f * lightmap.Width * renderPoly.TextureVectors.Item1;
|
|
||||||
var yDir = 0.25f * lightmap.Height * renderPoly.TextureVectors.Item2;
|
|
||||||
var aabb = new MathUtils.Aabb([
|
|
||||||
topLeft,
|
|
||||||
topLeft + xDir,
|
|
||||||
topLeft + yDir,
|
|
||||||
topLeft + xDir + yDir,
|
|
||||||
]);
|
|
||||||
|
|
||||||
foreach (var light in lights)
|
foreach (var light in lights)
|
||||||
{
|
{
|
||||||
// Check if plane normal is facing towards the light
|
// Check if plane normal is facing towards the light
|
||||||
|
@ -267,22 +257,6 @@ class Program
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there aren't *any* points on the plane that are in range of the light
|
|
||||||
// then none of the lightmap points will be so we can discard.
|
|
||||||
// The more compact a map is the less effective this is
|
|
||||||
var planeDist = MathUtils.DistanceFromPlane(plane, light.position);
|
|
||||||
if (planeDist > light.radius)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the poly of the lightmap doesn't intersect the light radius then
|
|
||||||
// none of the lightmap points will so we can discard.
|
|
||||||
if (!MathUtils.Intersects(new MathUtils.Sphere(light.position, light.radius), aabb))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var y = 0; y < lightmap.Height; y++)
|
for (var y = 0; y < lightmap.Height; y++)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < lightmap.Width; x++)
|
for (var x = 0; x < lightmap.Width; x++)
|
||||||
|
|
Loading…
Reference in New Issue