Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions crates/bevy_camera/src/visibility/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ use crate::{
};
use bevy_mesh::{mark_3d_meshes_as_changed_if_their_assets_changed, Mesh, Mesh2d, Mesh3d};

/// Use this component to opt-out of the built-in CPU frustum culling, see
/// [`Frustum`]. This can be attached to a [`Camera`] or to individual entities.
///
/// It can be used for example:
/// - disabling CPU culling completely for a [`Camera`], using only GPU culling.
/// - when overwriting a [`Mesh`]'s transform on the GPU side (e.g. overwriting `MeshInputUniform`'s
/// `world_from_local`), resulting in stale CPU-side positions.
#[derive(Component, Default)]
pub struct NoCpuCulling;

Expand Down Expand Up @@ -653,12 +660,13 @@ pub fn check_visibility(
&GlobalTransform,
Has<NoFrustumCulling>,
Has<VisibilityRange>,
Has<NoCpuCulling>,
)>,
visible_entity_ranges: Option<Res<VisibleEntityRanges>>,
) {
let visible_entity_ranges = visible_entity_ranges.as_deref();

for (view, mut visible_entities, frustum, maybe_view_mask, camera, no_cpu_culling) in
for (view, mut visible_entities, frustum, maybe_view_mask, camera, no_cpu_culling_camera) in
&mut view_query
{
if !camera.is_active {
Expand All @@ -680,6 +688,7 @@ pub fn check_visibility(
transform,
no_frustum_culling,
has_visibility_range,
no_cpu_culling_entity,
) = query_item;

// Skip computing visibility for entities that are configured to be hidden.
Expand All @@ -704,7 +713,8 @@ pub fn check_visibility(

// If we have an aabb, do frustum culling
if !no_frustum_culling
&& !no_cpu_culling
&& !no_cpu_culling_camera
&& !no_cpu_culling_entity
&& let Some(model_aabb) = maybe_model_aabb
{
let world_from_local = transform.affine();
Expand Down
Loading