1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Move occlusion culling back to being based on euclidian distance but with some distance calculation using double precision

This commit is contained in:
Rudolph Bester
2025-07-01 19:01:38 +02:00
parent e1b4101e34
commit a54df7fdb7
2 changed files with 9 additions and 4 deletions

View File

@@ -71,7 +71,9 @@ public:
return false;
}
float min_depth = -closest_point_view.z;
// Force distance calculation to use double precision to avoid floating-point overflow for distant objects.
closest_point = closest_point - p_cam_position;
float min_depth = Math::sqrt((double)closest_point.x * (double)closest_point.x + (double)closest_point.y * (double)closest_point.y + (double)closest_point.z * (double)closest_point.z);
Vector2 rect_min = Vector2(FLT_MAX, FLT_MAX);
Vector2 rect_max = Vector2(FLT_MIN, FLT_MIN);
@@ -82,9 +84,13 @@ public:
Vector3 corner = Vector3(p_bounds[0] * c.x + p_bounds[3] * nc.x, p_bounds[1] * c.y + p_bounds[4] * nc.y, p_bounds[2] * c.z + p_bounds[5] * nc.z);
Vector3 view = p_cam_inv_transform.xform(corner);
// When using an orthogonal camera, the closest point of an AABB to the camera is guaranteed to be a corner.
if (p_cam_projection.is_orthogonal()) {
min_depth = MIN(min_depth, -view.z);
}
Plane vp = Plane(view, 1.0);
Plane projected = p_cam_projection.xform4(vp);
min_depth = MIN(min_depth, -view.z);
float w = projected.d;
if (w < 1.0) {