Skip to content

Commit

Permalink
Use direction between camera origin and AABB center to calculate mini…
Browse files Browse the repository at this point in the history
…mum support for LOD selection
  • Loading branch information
clayjohn committed May 23, 2024
1 parent 267ea14 commit 327db13
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 80 deletions.
39 changes: 12 additions & 27 deletions drivers/gles3/rasterizer_scene_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1355,38 +1355,23 @@ void RasterizerSceneGLES3::_fill_render_list(RenderListType p_render_list, const

GeometryInstanceSurface *surf = inst->surface_caches;

float lod_distance = 0.0;

if (p_render_data->scene_data->cam_orthogonal) {

Check failure on line 1360 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

'const struct RenderDataGLES3' has no member named 'scene_data'

Check failure on line 1360 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

no member named 'scene_data' in 'RenderDataGLES3'

Check failure on line 1360 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

'const struct RenderDataGLES3' has no member named 'scene_data'
lod_distance = 1.0;
} else if (!inst->transformed_aabb.has_point(p_render_data->scene_data->main_cam_transform.origin)) {

Check failure on line 1362 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

'const struct RenderDataGLES3' has no member named 'scene_data'

Check failure on line 1362 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

no member named 'scene_data' in 'RenderDataGLES3'

Check failure on line 1362 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

'const struct RenderDataGLES3' has no member named 'scene_data'
// Get the distance to the closest corner of the AABB.
Vector3 direction_to_aabb = (inst->transformed_aabb.position + (inst->transformed_aabb.size * 0.5)) - p_render_data->scene_data->main_cam_transform.origin;

Check failure on line 1364 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

'const struct RenderDataGLES3' has no member named 'scene_data'

Check failure on line 1364 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

no member named 'scene_data' in 'RenderDataGLES3'

Check failure on line 1364 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

'const struct RenderDataGLES3' has no member named 'scene_data'
Vector3 lod_support_min = inst->transformed_aabb.get_support(-direction_to_aabb);
lod_distance = (float)p_render_data->scene_data->main_cam_transform.origin.distance_to(lod_support_min);

Check failure on line 1366 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

'const struct RenderDataGLES3' has no member named 'scene_data'

Check failure on line 1366 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

no member named 'scene_data' in 'RenderDataGLES3'

Check failure on line 1366 in drivers/gles3/rasterizer_scene_gles3.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

'const struct RenderDataGLES3' has no member named 'scene_data'
}

while (surf) {
// LOD

if (p_render_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->main_cam_transform.origin)) {
// Get the LOD support points on the mesh AABB.
Vector3 lod_support_min = inst->transformed_aabb.get_support(p_render_data->main_cam_transform.basis.get_column(Vector3::AXIS_Z));
Vector3 lod_support_max = inst->transformed_aabb.get_support(-p_render_data->main_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->main_cam_transform.origin.distance_to(lod_support_min);
float distance_max = (float)p_render_data->main_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->cam_orthogonal) {
distance = 1.0;
}

uint32_t indices = 0;
surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, indices);
surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, lod_distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, indices);
surf->index_count = indices;

if (p_render_data->render_info) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -962,40 +962,25 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con

GeometryInstanceSurfaceDataCache *surf = inst->surface_caches;

float lod_distance = 0.0;

if (p_render_data->scene_data->cam_orthogonal) {
lod_distance = 1.0;
} else if (!inst->transformed_aabb.has_point(p_render_data->scene_data->main_cam_transform.origin)) {
// Get the distance to the closest corner of the AABB.
Vector3 direction_to_aabb = (inst->transformed_aabb.position + (inst->transformed_aabb.size * 0.5)) - p_render_data->scene_data->main_cam_transform.origin;
Vector3 lod_support_min = inst->transformed_aabb.get_support(-direction_to_aabb);
lod_distance = (float)p_render_data->scene_data->main_cam_transform.origin.distance_to(lod_support_min);
}

while (surf) {
surf->sort.uses_forward_gi = 0;
surf->sort.uses_lightmap = 0;

// LOD

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->main_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->main_cam_transform.basis.get_column(Vector3::AXIS_Z));
Vector3 lod_support_max = inst->transformed_aabb.get_support(-p_render_data->scene_data->main_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->main_cam_transform.origin.distance_to(lod_support_min);
float distance_max = (float)p_render_data->scene_data->main_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;
}

uint32_t indices = 0;
surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, lod_distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
if (p_render_data->render_info) {
indices = _indices_to_primitives(surf->primitive, indices);
if (p_render_list == RENDER_LIST_OPAQUE) { //opaque
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1871,39 +1871,25 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const

GeometryInstanceSurfaceDataCache *surf = inst->surface_caches;

float lod_distance = 0.0;

if (p_render_data->scene_data->cam_orthogonal) {
lod_distance = 1.0;
} else if (!inst->transformed_aabb.has_point(p_render_data->scene_data->main_cam_transform.origin)) {
// Get the distance to the closest corner of the AABB.
Vector3 direction_to_aabb = (inst->transformed_aabb.position + (inst->transformed_aabb.size * 0.5)) - p_render_data->scene_data->main_cam_transform.origin;
Vector3 lod_support_min = inst->transformed_aabb.get_support(-direction_to_aabb);
lod_distance = (float)p_render_data->scene_data->main_cam_transform.origin.distance_to(lod_support_min);
}

while (surf) {
surf->sort.uses_lightmap = 0;

// LOD

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->main_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->main_cam_transform.basis.get_column(Vector3::AXIS_Z));
Vector3 lod_support_max = inst->transformed_aabb.get_support(-p_render_data->scene_data->main_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->main_cam_transform.origin.distance_to(lod_support_min);
float distance_max = (float)p_render_data->scene_data->main_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;
}

uint32_t indices = 0;
surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, lod_distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
if (p_render_data->render_info) {
indices = _indices_to_primitives(surf->primitive, indices);
if (p_render_list == RENDER_LIST_OPAQUE) { //opaque
Expand Down

0 comments on commit 327db13

Please sign in to comment.