|
@@ -944,25 +944,27 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
|
|
|
// LOD
|
|
|
|
|
|
if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) {
|
|
|
- // 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_max = inst->transformed_aabb.get_support(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z));
|
|
|
-
|
|
|
- // Get the distances to those points on the AABB from the camera origin.
|
|
|
- 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 = 0.0;
|
|
|
|
|
|
- if (distance_min * distance_max < 0.0) {
|
|
|
- //crossing plane
|
|
|
- distance = 0.0;
|
|
|
- } else if (distance_min >= 0.0) {
|
|
|
- distance = distance_min;
|
|
|
- } else if (distance_max <= 0.0) {
|
|
|
- distance = -distance_max;
|
|
|
+ // 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.
|
|
|
+ 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));
|
|
|
+
|
|
|
+ // Get the distances to those points on the AABB from the camera origin.
|
|
|
+ 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);
|
|
|
+
|
|
|
+ if (distance_min * distance_max < 0.0) {
|
|
|
+ //crossing plane
|
|
|
+ distance = 0.0;
|
|
|
+ } else if (distance_min >= 0.0) {
|
|
|
+ distance = distance_min;
|
|
|
+ } else if (distance_max <= 0.0) {
|
|
|
+ distance = -distance_max;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
if (p_render_data->scene_data->cam_orthogonal) {
|
|
|
distance = 1.0;
|
|
|
}
|