Merge pull request #79590 from 0010200303/master

Fix bad LOD selection when Camera in Mesh AABB
This commit is contained in:
Yuri Sizov 2023-07-24 19:32:54 +02:00
commit 360633089c

View File

@ -944,6 +944,10 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
// LOD // LOD
if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) {
float distance = 0.0;
// Check if camera is NOT inside the mesh AABB.
if (!inst->transformed_aabb.has_point(p_render_data->scene_data->cam_transform.origin)) {
// Get the LOD support points on the mesh AABB. // Get the LOD support points on the mesh AABB.
Vector3 lod_support_min = inst->transformed_aabb.get_support(p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z)); Vector3 lod_support_min = inst->transformed_aabb.get_support(p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z));
Vector3 lod_support_max = inst->transformed_aabb.get_support(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z)); Vector3 lod_support_max = inst->transformed_aabb.get_support(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z));
@ -952,8 +956,6 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
float distance_min = (float)p_render_data->scene_data->cam_transform.origin.distance_to(lod_support_min); float distance_min = (float)p_render_data->scene_data->cam_transform.origin.distance_to(lod_support_min);
float distance_max = (float)p_render_data->scene_data->cam_transform.origin.distance_to(lod_support_max); float distance_max = (float)p_render_data->scene_data->cam_transform.origin.distance_to(lod_support_max);
float distance = 0.0;
if (distance_min * distance_max < 0.0) { if (distance_min * distance_max < 0.0) {
//crossing plane //crossing plane
distance = 0.0; distance = 0.0;
@ -962,7 +964,7 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
} else if (distance_max <= 0.0) { } else if (distance_max <= 0.0) {
distance = -distance_max; distance = -distance_max;
} }
}
if (p_render_data->scene_data->cam_orthogonal) { if (p_render_data->scene_data->cam_orthogonal) {
distance = 1.0; distance = 1.0;
} }