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:
parent
6916349697
commit
94c60ae556
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue