Fix trace_ray() function in the lightmapper missing hits with large triangles.

The DDA traversal had a conceptual error where it did an early termination of the search if it hit a triangle, but it didn't check if the hit position was inside the bounds of the cell being traversed. This can aid to fix light leaks such as the ones found in issue #75440.
This commit is contained in:
Dario 2023-10-09 08:25:03 -03:00
parent 6916349697
commit 94c60ae556

View file

@ -205,6 +205,14 @@ uint trace_ray(vec3 p_from, vec3 p_to
return RAY_ANY; //any hit good
#endif
vec3 position = p_from + dir * distance;
vec3 hit_cell = (position - params.to_cell_offset) * params.to_cell_size;
if (icell != ivec3(hit_cell)) {
// It's possible for the ray to hit a triangle in a position outside the bounds of the cell
// if it's large enough to cover multiple ones. The hit must be ignored if this is the case.
continue;
}
#if defined(MODE_UNOCCLUDE) || defined(MODE_BOUNCE_LIGHT) || defined(MODE_LIGHT_PROBES)
if (!backface) {
// the case of meshes having both a front and back face in the same plane is more common than