Compare commits

...

2 Commits

2 changed files with 8 additions and 7 deletions

View File

@ -564,8 +564,8 @@ public class LightMapper
}
var visibleSet = settings.FastPvs switch {
true => pvs.ComputeVisibilityFast(lightCellMap[i]),
false => pvs.ComputeVisibilityExact(_lights[i].Position, lightCellMap[i], _lights[i].Radius)
true => pvs.ComputeVisibilityFast(cellIdx),
false => pvs.ComputeVisibilityExact(_lights[i].Position, cellIdx, _lights[i].Radius)
};
// Log.Information("Light {i} sees {c} cells", i, visibleSet.Count);
@ -1068,16 +1068,17 @@ public class LightMapper
// TODO: direction should already be normalised here
private bool TraceSunRay(Vector3 origin, Vector3 direction)
{
// Avoid self intersection
origin += direction * MathUtils.Epsilon;
var hitResult = _scene.Trace(new Ray
{
Origin = origin,
Direction = Vector3.Normalize(direction),
});
if (hitResult)
// If origin is very close to a wall, the initial trace to the sun sometimes misses the wall. Now that we have
// backface culling enabled in Embree, this can result in reaching a sky when we shouldn't.
// By doing another occlusion trace in the reverse direction we fix this. Any backfaces we passed through in
// the initial trace become frontfaces to be occluded by.
if (hitResult && !TraceOcclusion(_scene, hitResult.Position + hitResult.ErrorOffset * hitResult.Normal, origin))
{
return _triangleTypeMap[(int)hitResult.PrimId] == SurfaceType.Sky;
}

View File

@ -154,7 +154,7 @@ public class PotentiallyVisibleSet
return [];
}
var visibleCells = new HashSet<int>();
var visibleCells = new HashSet<int> { cellIdx };
foreach (var edgeIdx in _graph[cellIdx].EdgeIndices)
{
var edge = _edges[edgeIdx];