From 572514c19ec494f858bb36ccf63a3230b36de6bf Mon Sep 17 00:00:00 2001 From: Felix de Maneville Date: Sat, 29 Jan 2022 11:38:06 +0100 Subject: [PATCH] Visiblity as a marker component --- crates/bevy_pbr/src/bundle.rs | 6 +-- crates/bevy_pbr/src/light.rs | 24 ++-------- crates/bevy_render/src/camera/mod.rs | 4 +- crates/bevy_render/src/lib.rs | 2 +- crates/bevy_render/src/view/visibility/mod.rs | 39 ++++++--------- crates/bevy_sprite/src/bundle.rs | 8 ++-- crates/bevy_sprite/src/mesh2d/material.rs | 6 +-- crates/bevy_sprite/src/render/mod.rs | 24 ++++------ crates/bevy_text/src/text2d.rs | 13 ++--- crates/bevy_ui/src/entity.rs | 14 +++--- crates/bevy_ui/src/render/mod.rs | 48 +++++++++---------- examples/2d/mesh2d_manual.rs | 2 +- examples/shader/animate_shader.rs | 4 +- examples/shader/shader_defs.rs | 4 +- examples/shader/shader_instancing.rs | 4 +- 15 files changed, 81 insertions(+), 121 deletions(-) diff --git a/crates/bevy_pbr/src/bundle.rs b/crates/bevy_pbr/src/bundle.rs index ba235c56b5791..f7fb757c6b349 100644 --- a/crates/bevy_pbr/src/bundle.rs +++ b/crates/bevy_pbr/src/bundle.rs @@ -5,7 +5,7 @@ use bevy_reflect::Reflect; use bevy_render::{ mesh::Mesh, primitives::{CubemapFrusta, Frustum}, - view::{ComputedVisibility, Visibility, VisibleEntities}, + view::{ComputedVisibility, Visible, VisibleEntities}, }; use bevy_transform::components::{GlobalTransform, Transform}; @@ -20,7 +20,7 @@ pub struct MaterialMeshBundle { pub transform: Transform, pub global_transform: GlobalTransform, /// User indication of whether an entity is visible - pub visibility: Visibility, + pub visible: Visible, /// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering pub computed_visibility: ComputedVisibility, } @@ -32,7 +32,7 @@ impl Default for MaterialMeshBundle { material: Default::default(), transform: Default::default(), global_transform: Default::default(), - visibility: Default::default(), + visible: Default::default(), computed_visibility: Default::default(), } } diff --git a/crates/bevy_pbr/src/light.rs b/crates/bevy_pbr/src/light.rs index a0380e1d6aeab..9bab5702c4921 100644 --- a/crates/bevy_pbr/src/light.rs +++ b/crates/bevy_pbr/src/light.rs @@ -7,7 +7,7 @@ use bevy_render::{ camera::{Camera, CameraProjection, OrthographicProjection}, color::Color, primitives::{Aabb, CubemapFrusta, Frustum, Sphere}, - view::{ComputedVisibility, RenderLayers, Visibility, VisibleEntities}, + view::{ComputedVisibility, RenderLayers, Visible, VisibleEntities}, }; use bevy_transform::components::GlobalTransform; use bevy_window::Windows; @@ -705,13 +705,12 @@ pub fn check_light_mesh_visibility( mut visible_entity_query: Query< ( Entity, - &Visibility, &mut ComputedVisibility, Option<&RenderLayers>, Option<&Aabb>, Option<&GlobalTransform>, ), - Without, + (Without, With), >, ) { // Directonal lights @@ -727,19 +726,9 @@ pub fn check_light_mesh_visibility( let view_mask = maybe_view_mask.copied().unwrap_or_default(); - for ( - entity, - visibility, - mut computed_visibility, - maybe_entity_mask, - maybe_aabb, - maybe_transform, - ) in visible_entity_query.iter_mut() + for (entity, mut computed_visibility, maybe_entity_mask, maybe_aabb, maybe_transform) in + visible_entity_query.iter_mut() { - if !visibility.is_visible { - continue; - } - let entity_mask = maybe_entity_mask.copied().unwrap_or_default(); if !view_mask.intersects(&entity_mask) { continue; @@ -788,17 +777,12 @@ pub fn check_light_mesh_visibility( for ( entity, - visibility, mut computed_visibility, maybe_entity_mask, maybe_aabb, maybe_transform, ) in visible_entity_query.iter_mut() { - if !visibility.is_visible { - continue; - } - let entity_mask = maybe_entity_mask.copied().unwrap_or_default(); if !view_mask.intersects(&entity_mask) { continue; diff --git a/crates/bevy_render/src/camera/mod.rs b/crates/bevy_render/src/camera/mod.rs index 4df498f0bf34f..33d54bd5057c8 100644 --- a/crates/bevy_render/src/camera/mod.rs +++ b/crates/bevy_render/src/camera/mod.rs @@ -14,7 +14,7 @@ pub use projection::*; use crate::{ primitives::Aabb, - view::{ComputedVisibility, ExtractedView, Visibility, VisibleEntities}, + view::{ComputedVisibility, ExtractedView, Visible, VisibleEntities}, RenderApp, RenderStage, }; use bevy_app::{App, CoreStage, Plugin}; @@ -34,7 +34,7 @@ impl Plugin for CameraPlugin { active_cameras.add(Self::CAMERA_2D); active_cameras.add(Self::CAMERA_3D); app.register_type::() - .register_type::() + .register_type::() .register_type::() .register_type::() .register_type::() diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 788dd9365b48f..14c72a0dabeb3 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -23,7 +23,7 @@ pub mod prelude { mesh::{shape, Mesh}, render_resource::Shader, texture::Image, - view::{ComputedVisibility, Msaa, Visibility}, + view::{ComputedVisibility, Msaa, Visible}, }; } diff --git a/crates/bevy_render/src/view/visibility/mod.rs b/crates/bevy_render/src/view/visibility/mod.rs index cec6525d1acf2..9e7a7506e2997 100644 --- a/crates/bevy_render/src/view/visibility/mod.rs +++ b/crates/bevy_render/src/view/visibility/mod.rs @@ -14,18 +14,10 @@ use crate::{ primitives::{Aabb, Frustum}, }; -/// User indication of whether an entity is visible -#[derive(Component, Clone, Reflect, Debug)] +/// User indication of whether an entity is visible as a marker component +#[derive(Component, Copy, Clone, Reflect, Debug, Default)] #[reflect(Component)] -pub struct Visibility { - pub is_visible: bool, -} - -impl Default for Visibility { - fn default() -> Self { - Self { is_visible: true } - } -} +pub struct Visible; /// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering #[derive(Component, Clone, Reflect, Debug)] @@ -140,15 +132,17 @@ pub fn check_visibility( mut view_query: Query<(&mut VisibleEntities, &Frustum, Option<&RenderLayers>), With>, mut visible_entity_query: QuerySet<( QueryState<&mut ComputedVisibility>, - QueryState<( - Entity, - &Visibility, - &mut ComputedVisibility, - Option<&RenderLayers>, - Option<&Aabb>, - Option<&NoFrustumCulling>, - Option<&GlobalTransform>, - )>, + QueryState< + ( + Entity, + &mut ComputedVisibility, + Option<&RenderLayers>, + Option<&Aabb>, + Option<&NoFrustumCulling>, + Option<&GlobalTransform>, + ), + With, + >, )>, ) { // Reset the computed visibility to false @@ -162,7 +156,6 @@ pub fn check_visibility( for ( entity, - visibility, mut computed_visibility, maybe_entity_mask, maybe_aabb, @@ -170,10 +163,6 @@ pub fn check_visibility( maybe_transform, ) in visible_entity_query.q1().iter_mut() { - if !visibility.is_visible { - continue; - } - let entity_mask = maybe_entity_mask.copied().unwrap_or_default(); if !view_mask.intersects(&entity_mask) { continue; diff --git a/crates/bevy_sprite/src/bundle.rs b/crates/bevy_sprite/src/bundle.rs index 82fdcd9db6292..32fca56af5328 100644 --- a/crates/bevy_sprite/src/bundle.rs +++ b/crates/bevy_sprite/src/bundle.rs @@ -6,7 +6,7 @@ use bevy_asset::Handle; use bevy_ecs::bundle::Bundle; use bevy_render::{ texture::{Image, DEFAULT_IMAGE_HANDLE}, - view::Visibility, + view::Visible, }; use bevy_transform::components::{GlobalTransform, Transform}; @@ -17,7 +17,7 @@ pub struct SpriteBundle { pub global_transform: GlobalTransform, pub texture: Handle, /// User indication of whether an entity is visible - pub visibility: Visibility, + pub visible: Visible, } impl Default for SpriteBundle { @@ -27,7 +27,7 @@ impl Default for SpriteBundle { transform: Default::default(), global_transform: Default::default(), texture: DEFAULT_IMAGE_HANDLE.typed(), - visibility: Default::default(), + visible: Default::default(), } } } @@ -43,5 +43,5 @@ pub struct SpriteSheetBundle { pub transform: Transform, pub global_transform: GlobalTransform, /// User indication of whether an entity is visible - pub visibility: Visibility, + pub visible: Visible, } diff --git a/crates/bevy_sprite/src/mesh2d/material.rs b/crates/bevy_sprite/src/mesh2d/material.rs index 0e3ceaae55cc0..edba76249ea41 100644 --- a/crates/bevy_sprite/src/mesh2d/material.rs +++ b/crates/bevy_sprite/src/mesh2d/material.rs @@ -24,7 +24,7 @@ use bevy_render::{ SpecializedPipeline, SpecializedPipelines, }, renderer::RenderDevice, - view::{ComputedVisibility, Msaa, Visibility, VisibleEntities}, + view::{ComputedVisibility, Msaa, Visible, VisibleEntities}, RenderApp, RenderStage, }; use bevy_transform::components::{GlobalTransform, Transform}; @@ -326,7 +326,7 @@ pub struct MaterialMesh2dBundle { pub transform: Transform, pub global_transform: GlobalTransform, /// User indication of whether an entity is visible - pub visibility: Visibility, + pub visible: Visible, /// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering pub computed_visibility: ComputedVisibility, } @@ -338,7 +338,7 @@ impl Default for MaterialMesh2dBundle { material: Default::default(), transform: Default::default(), global_transform: Default::default(), - visibility: Default::default(), + visible: Default::default(), computed_visibility: Default::default(), } } diff --git a/crates/bevy_sprite/src/render/mod.rs b/crates/bevy_sprite/src/render/mod.rs index f4d0f035a98bb..7c6fb2e52a8b7 100644 --- a/crates/bevy_sprite/src/render/mod.rs +++ b/crates/bevy_sprite/src/render/mod.rs @@ -23,7 +23,7 @@ use bevy_render::{ render_resource::{std140::AsStd140, *}, renderer::{RenderDevice, RenderQueue}, texture::{BevyDefault, Image}, - view::{Msaa, ViewUniform, ViewUniformOffset, ViewUniforms, Visibility}, + view::{Msaa, ViewUniform, ViewUniformOffset, ViewUniforms, Visible}, RenderWorld, }; use bevy_transform::components::GlobalTransform; @@ -232,20 +232,15 @@ pub fn extract_sprite_events( pub fn extract_sprites( mut render_world: ResMut, texture_atlases: Res>, - sprite_query: Query<(&Visibility, &Sprite, &GlobalTransform, &Handle)>, - atlas_query: Query<( - &Visibility, - &TextureAtlasSprite, - &GlobalTransform, - &Handle, - )>, + sprite_query: Query<(&Sprite, &GlobalTransform, &Handle), With>, + atlas_query: Query< + (&TextureAtlasSprite, &GlobalTransform, &Handle), + With, + >, ) { let mut extracted_sprites = render_world.get_resource_mut::().unwrap(); extracted_sprites.sprites.clear(); - for (visibility, sprite, transform, handle) in sprite_query.iter() { - if !visibility.is_visible { - continue; - } + for (sprite, transform, handle) in sprite_query.iter() { // PERF: we don't check in this function that the `Image` asset is ready, since it should be in most cases and hashing the handle is expensive extracted_sprites.sprites.alloc().init(ExtractedSprite { color: sprite.color, @@ -259,10 +254,7 @@ pub fn extract_sprites( image_handle_id: handle.id, }); } - for (visibility, atlas_sprite, transform, texture_atlas_handle) in atlas_query.iter() { - if !visibility.is_visible { - continue; - } + for (atlas_sprite, transform, texture_atlas_handle) in atlas_query.iter() { if let Some(texture_atlas) = texture_atlases.get(texture_atlas_handle) { let rect = Some(texture_atlas.textures[atlas_sprite.index as usize]); extracted_sprites.sprites.alloc().init(ExtractedSprite { diff --git a/crates/bevy_text/src/text2d.rs b/crates/bevy_text/src/text2d.rs index 34eccc2351477..46566b205b0cc 100644 --- a/crates/bevy_text/src/text2d.rs +++ b/crates/bevy_text/src/text2d.rs @@ -6,7 +6,7 @@ use bevy_ecs::{ system::{Local, Query, QuerySet, Res, ResMut}, }; use bevy_math::{Size, Vec3}; -use bevy_render::{texture::Image, view::Visibility, RenderWorld}; +use bevy_render::{texture::Image, view::Visible, RenderWorld}; use bevy_sprite::{ExtractedSprite, ExtractedSprites, TextureAtlas}; use bevy_transform::prelude::{GlobalTransform, Transform}; use bevy_window::Windows; @@ -24,7 +24,7 @@ pub struct Text2dBundle { pub transform: Transform, pub global_transform: GlobalTransform, pub text_2d_size: Text2dSize, - pub visibility: Visibility, + pub visible: Visible, } impl Default for Text2dBundle { @@ -36,7 +36,7 @@ impl Default for Text2dBundle { text_2d_size: Text2dSize { size: Size::default(), }, - visibility: Default::default(), + visible: Default::default(), } } } @@ -46,7 +46,7 @@ pub fn extract_text2d_sprite( texture_atlases: Res>, text_pipeline: Res, windows: Res, - text2d_query: Query<(Entity, &Visibility, &Text, &GlobalTransform, &Text2dSize)>, + text2d_query: Query<(Entity, &Text, &GlobalTransform, &Text2dSize), With>, ) { let mut extracted_sprites = render_world.get_resource_mut::().unwrap(); @@ -56,10 +56,7 @@ pub fn extract_text2d_sprite( 1. }; - for (entity, visibility, text, transform, calculated_size) in text2d_query.iter() { - if !visibility.is_visible { - continue; - } + for (entity, text, transform, calculated_size) in text2d_query.iter() { let (width, height) = (calculated_size.size.width, calculated_size.size.height); if let Some(text_layout) = text_pipeline.get_glyphs(&entity) { diff --git a/crates/bevy_ui/src/entity.rs b/crates/bevy_ui/src/entity.rs index 6f145ac7805d2..882b8e595b1af 100644 --- a/crates/bevy_ui/src/entity.rs +++ b/crates/bevy_ui/src/entity.rs @@ -7,7 +7,7 @@ use crate::{ use bevy_ecs::bundle::Bundle; use bevy_render::{ camera::{Camera, DepthCalculation, OrthographicProjection, WindowOrigin}, - view::{Visibility, VisibleEntities}, + view::{Visible, VisibleEntities}, }; use bevy_text::Text; use bevy_transform::prelude::{GlobalTransform, Transform}; @@ -28,7 +28,7 @@ pub struct NodeBundle { /// The global transform of the node pub global_transform: GlobalTransform, /// Describes the visibility properties of the node - pub visibility: Visibility, + pub visible: Visible, } /// A UI node that is an image @@ -51,7 +51,7 @@ pub struct ImageBundle { /// The global transform of the node pub global_transform: GlobalTransform, /// Describes the visibility properties of the node - pub visibility: Visibility, + pub visible: Visible, } /// A UI node that is text @@ -72,7 +72,7 @@ pub struct TextBundle { /// The global transform of the node pub global_transform: GlobalTransform, /// Describes the visibility properties of the node - pub visibility: Visibility, + pub visible: Visible, } impl Default for TextBundle { @@ -85,7 +85,7 @@ impl Default for TextBundle { style: Default::default(), transform: Default::default(), global_transform: Default::default(), - visibility: Default::default(), + visible: Default::default(), } } } @@ -112,7 +112,7 @@ pub struct ButtonBundle { /// The global transform of the node pub global_transform: GlobalTransform, /// Describes the visibility properties of the node - pub visibility: Visibility, + pub visible: Visible, } impl Default for ButtonBundle { @@ -127,7 +127,7 @@ impl Default for ButtonBundle { image: Default::default(), transform: Default::default(), global_transform: Default::default(), - visibility: Default::default(), + visible: Default::default(), } } } diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index e632b4eee18cb..e03adadc3fa25 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -23,7 +23,7 @@ use bevy_render::{ render_resource::*, renderer::{RenderDevice, RenderQueue}, texture::Image, - view::{ViewUniforms, Visibility}, + view::{ViewUniforms, Visible}, RenderApp, RenderStage, RenderWorld, }; use bevy_sprite::{Rect, SpriteAssetEvents, TextureAtlas}; @@ -138,21 +138,20 @@ pub struct ExtractedUiNodes { pub fn extract_uinodes( mut render_world: ResMut, images: Res>, - uinode_query: Query<( - &Node, - &GlobalTransform, - &UiColor, - &UiImage, - &Visibility, - Option<&CalculatedClip>, - )>, + uinode_query: Query< + ( + &Node, + &GlobalTransform, + &UiColor, + &UiImage, + Option<&CalculatedClip>, + ), + With, + >, ) { let mut extracted_uinodes = render_world.get_resource_mut::().unwrap(); extracted_uinodes.uinodes.clear(); - for (uinode, transform, color, image, visibility, clip) in uinode_query.iter() { - if !visibility.is_visible { - continue; - } + for (uinode, transform, color, image, clip) in uinode_query.iter() { let image = image.0.clone_weak(); // Skip loading images if !images.contains(image.clone_weak()) { @@ -177,14 +176,16 @@ pub fn extract_text_uinodes( texture_atlases: Res>, text_pipeline: Res, windows: Res, - uinode_query: Query<( - Entity, - &Node, - &GlobalTransform, - &Text, - &Visibility, - Option<&CalculatedClip>, - )>, + uinode_query: Query< + ( + Entity, + &Node, + &GlobalTransform, + &Text, + Option<&CalculatedClip>, + ), + With, + >, ) { let mut extracted_uinodes = render_world.get_resource_mut::().unwrap(); @@ -194,10 +195,7 @@ pub fn extract_text_uinodes( 1. }; - for (entity, uinode, transform, text, visibility, clip) in uinode_query.iter() { - if !visibility.is_visible { - continue; - } + for (entity, uinode, transform, text, clip) in uinode_query.iter() { // Skip if size is set to zero (e.g. when a parent is set to `Display::None`) if uinode.size == Vec2::ZERO { continue; diff --git a/examples/2d/mesh2d_manual.rs b/examples/2d/mesh2d_manual.rs index 371645839ac08..a5c7c362341a4 100644 --- a/examples/2d/mesh2d_manual.rs +++ b/examples/2d/mesh2d_manual.rs @@ -98,7 +98,7 @@ fn star( // These other components are needed for 2d meshes to be rendered Transform::default(), GlobalTransform::default(), - Visibility::default(), + Visible::default(), ComputedVisibility::default(), )); commands diff --git a/examples/shader/animate_shader.rs b/examples/shader/animate_shader.rs index 6e8f4b00af0fc..856d594dfac30 100644 --- a/examples/shader/animate_shader.rs +++ b/examples/shader/animate_shader.rs @@ -13,7 +13,7 @@ use bevy::{ }, render_resource::*, renderer::{RenderDevice, RenderQueue}, - view::{ComputedVisibility, ExtractedView, Msaa, Visibility}, + view::{ComputedVisibility, ExtractedView, Msaa, Visible}, RenderApp, RenderStage, }, }; @@ -33,7 +33,7 @@ fn setup(mut commands: Commands, mut meshes: ResMut>) { Transform::from_xyz(0.0, 0.5, 0.0), GlobalTransform::default(), CustomMaterial, - Visibility::default(), + Visible::default(), ComputedVisibility::default(), )); diff --git a/examples/shader/shader_defs.rs b/examples/shader/shader_defs.rs index bec75411f0a3e..ae338e3972d00 100644 --- a/examples/shader/shader_defs.rs +++ b/examples/shader/shader_defs.rs @@ -60,7 +60,7 @@ fn setup(mut commands: Commands, mut meshes: ResMut>) { IsRed(true), Transform::from_xyz(-1.0, 0.5, 0.0), GlobalTransform::default(), - Visibility::default(), + Visible::default(), ComputedVisibility::default(), )); @@ -70,7 +70,7 @@ fn setup(mut commands: Commands, mut meshes: ResMut>) { IsRed(false), Transform::from_xyz(1.0, 0.5, 0.0), GlobalTransform::default(), - Visibility::default(), + Visible::default(), ComputedVisibility::default(), )); diff --git a/examples/shader/shader_instancing.rs b/examples/shader/shader_instancing.rs index 9c5a048ea6107..f2ee19d1ca293 100644 --- a/examples/shader/shader_instancing.rs +++ b/examples/shader/shader_instancing.rs @@ -14,7 +14,7 @@ use bevy::{ }, render_resource::*, renderer::RenderDevice, - view::{ComputedVisibility, ExtractedView, Msaa, NoFrustumCulling, Visibility}, + view::{ComputedVisibility, ExtractedView, Msaa, NoFrustumCulling, Visible}, RenderApp, RenderStage, }, }; @@ -43,7 +43,7 @@ fn setup(mut commands: Commands, mut meshes: ResMut>) { }) .collect(), ), - Visibility::default(), + Visible::default(), ComputedVisibility::default(), // NOTE: Frustum culling is done based on the Aabb of the Mesh and the GlobalTransform. // As the cube is at the origin, if its Aabb moves outside the view frustum, all the