Rewrite occlusion checks to use different scenes where relevant

This commit is contained in:
Jarrod Doyle 2025-01-26 12:35:35 +00:00
parent 223aee980e
commit c28626bf20
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
1 changed files with 8 additions and 6 deletions

View File

@ -742,7 +742,7 @@ public class LightMapper
continue; continue;
} }
if (!TraceOcclusion(light.Position, point)) if (!TraceOcclusion(_scene, light.Position, point))
{ {
strength += targetWeights[idx] * light.StrengthAtPoint(point, plane, settings.AnimLightCutoff); strength += targetWeights[idx] * light.StrengthAtPoint(point, plane, settings.AnimLightCutoff);
} }
@ -826,6 +826,8 @@ public class LightMapper
{ {
polyCenter += planeMapper.Normal * 0.25f; polyCenter += planeMapper.Normal * 0.25f;
// All of the traces here are done using the no object scene. We just want to find a point in-world, we don't
// care about if an object is in the way
var tracePoints = new Vector3[offsets.Length]; var tracePoints = new Vector3[offsets.Length];
for (var i = 0; i < offsets.Length; i++) for (var i = 0; i < offsets.Length; i++)
{ {
@ -834,7 +836,7 @@ public class LightMapper
// If the target lightmap point is in view of the center // If the target lightmap point is in view of the center
// then we can use it as-is. Using it straight fixes seams and such. // then we can use it as-is. Using it straight fixes seams and such.
if (!TraceOcclusion(polyCenter, pos)) if (!TraceOcclusion(_sceneNoObj, polyCenter, pos))
{ {
tracePoints[i] = pos; tracePoints[i] = pos;
continue; continue;
@ -852,9 +854,9 @@ public class LightMapper
pos = planeMapper.MapTo3d(p2d); pos = planeMapper.MapTo3d(p2d);
// If the clipping fails, just say screw it and cast :( // If the clipping fails, just say screw it and cast :(
if (TraceOcclusion(polyCenter, pos)) if (TraceOcclusion(_sceneNoObj, polyCenter, pos))
{ {
var hitResult = _scene.Trace(new Ray var hitResult = _sceneNoObj.Trace(new Ray
{ {
Origin = polyCenter, Origin = polyCenter,
Direction = Vector3.Normalize(pos - polyCenter), Direction = Vector3.Normalize(pos - polyCenter),
@ -872,7 +874,7 @@ public class LightMapper
return tracePoints; return tracePoints;
} }
private bool TraceOcclusion(Vector3 origin, Vector3 target) private static bool TraceOcclusion(Raytracer scene, Vector3 origin, Vector3 target, float epsilon = MathUtils.Epsilon)
{ {
var direction = target - origin; var direction = target - origin;
var ray = new Ray var ray = new Ray
@ -882,7 +884,7 @@ public class LightMapper
}; };
// Epsilon is used here to avoid occlusion when origin lies exactly on a poly // Epsilon is used here to avoid occlusion when origin lies exactly on a poly
return _scene.IsOccluded(new ShadowRay(ray, direction.Length() - MathUtils.Epsilon)); return scene.IsOccluded(new ShadowRay(ray, direction.Length() - epsilon));
} }
// TODO: direction should already be normalised here // TODO: direction should already be normalised here