Visibility range takes the model aabb into acount (#15164)
# Objective I'm building a game where i generate a set of meshes where the transform is identity, and in each mesh the vertices are offset to where the model is. When adding visibility ranges to the models i noticed that they only switched when the distance to the origin changed over the threshold and all at the same time. ## Solution I believe that each mesh gets a Aabb generated for use with visibility testing. So we can use that aabb to calculate a more representative distance to the mesh. The code to transform the aabb is taken from the visibility sysyem. ## Testing I tested the changes locally in my project. Would you like me to write an example or a test somewhere? Is there any other code that uses the visibility range, that i should also update?
This commit is contained in:
parent
740d1cc9ff
commit
0ebd7fcdf4
@ -24,6 +24,7 @@ use wgpu::{BufferBindingType, BufferUsages};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
camera::Camera,
|
camera::Camera,
|
||||||
|
primitives::Aabb,
|
||||||
render_resource::BufferVec,
|
render_resource::BufferVec,
|
||||||
renderer::{RenderDevice, RenderQueue},
|
renderer::{RenderDevice, RenderQueue},
|
||||||
Extract, ExtractSchedule, Render, RenderApp, RenderSet,
|
Extract, ExtractSchedule, Render, RenderApp, RenderSet,
|
||||||
@ -366,7 +367,7 @@ impl VisibleEntityRanges {
|
|||||||
pub fn check_visibility_ranges(
|
pub fn check_visibility_ranges(
|
||||||
mut visible_entity_ranges: ResMut<VisibleEntityRanges>,
|
mut visible_entity_ranges: ResMut<VisibleEntityRanges>,
|
||||||
view_query: Query<(Entity, &GlobalTransform), With<Camera>>,
|
view_query: Query<(Entity, &GlobalTransform), With<Camera>>,
|
||||||
mut entity_query: Query<(Entity, &GlobalTransform, &VisibilityRange)>,
|
mut entity_query: Query<(Entity, &GlobalTransform, Option<&Aabb>, &VisibilityRange)>,
|
||||||
) {
|
) {
|
||||||
visible_entity_ranges.clear();
|
visible_entity_ranges.clear();
|
||||||
|
|
||||||
@ -385,12 +386,17 @@ pub fn check_visibility_ranges(
|
|||||||
|
|
||||||
// Check each entity/view pair. Only consider entities with
|
// Check each entity/view pair. Only consider entities with
|
||||||
// [`VisibilityRange`] components.
|
// [`VisibilityRange`] components.
|
||||||
for (entity, entity_transform, visibility_range) in entity_query.iter_mut() {
|
for (entity, entity_transform, maybe_model_aabb, visibility_range) in entity_query.iter_mut() {
|
||||||
let mut visibility = 0;
|
let mut visibility = 0;
|
||||||
for (view_index, &(_, view_position)) in views.iter().enumerate() {
|
for (view_index, &(_, view_position)) in views.iter().enumerate() {
|
||||||
if visibility_range
|
let model_pos = if let Some(model_aabb) = maybe_model_aabb {
|
||||||
.is_visible_at_all((view_position - entity_transform.translation_vec3a()).length())
|
let world_from_local = entity_transform.affine();
|
||||||
{
|
world_from_local.transform_point3a(model_aabb.center)
|
||||||
|
} else {
|
||||||
|
entity_transform.translation_vec3a()
|
||||||
|
};
|
||||||
|
|
||||||
|
if visibility_range.is_visible_at_all((view_position - model_pos).length()) {
|
||||||
visibility |= 1 << view_index;
|
visibility |= 1 << view_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user