Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Removed ComputedVisibility component #1

Open
wants to merge 2 commits into
base: feat/visibiliy_marker
Choose a base branch
from
Open
Show file tree
Hide file tree
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
5 changes: 1 addition & 4 deletions crates/bevy_pbr/src/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use bevy_reflect::Reflect;
use bevy_render::{
mesh::Mesh,
primitives::{CubemapFrusta, Frustum},
view::{ComputedVisibility, Visible, VisibleEntities},
view::{Visible, VisibleEntities},
};
use bevy_transform::components::{GlobalTransform, Transform};

Expand All @@ -21,8 +21,6 @@ pub struct MaterialMeshBundle<M: SpecializedMaterial> {
pub global_transform: GlobalTransform,
/// User indication of whether an entity is visible
pub visible: Visible,
/// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering
pub computed_visibility: ComputedVisibility,
}

impl<M: SpecializedMaterial> Default for MaterialMeshBundle<M> {
Expand All @@ -33,7 +31,6 @@ impl<M: SpecializedMaterial> Default for MaterialMeshBundle<M> {
transform: Default::default(),
global_transform: Default::default(),
visible: Default::default(),
computed_visibility: Default::default(),
}
}
}
Expand Down
6 changes: 1 addition & 5 deletions crates/bevy_pbr/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,7 @@ impl Plugin for PbrPlugin {
.after(TransformSystem::TransformPropagate)
.after(VisibilitySystems::CalculateBounds)
.after(SimulationLightSystems::UpdateDirectionalLightFrusta)
.after(SimulationLightSystems::UpdatePointLightFrusta)
// NOTE: This MUST be scheduled AFTER the core renderer visibility check
// because that resets entity ComputedVisibility for the first view
// which would override any results from this otherwise
.after(VisibilitySystems::CheckVisibility),
.after(SimulationLightSystems::UpdatePointLightFrusta),
);

app.world
Expand Down
23 changes: 6 additions & 17 deletions crates/bevy_pbr/src/light.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use bevy_render::{
camera::{Camera, CameraProjection, OrthographicProjection},
color::Color,
primitives::{Aabb, CubemapFrusta, Frustum, Sphere},
view::{ComputedVisibility, RenderLayers, Visible, VisibleEntities},
view::{RenderLayers, Visible, VisibleEntities},
};
use bevy_transform::components::GlobalTransform;
use bevy_window::Windows;
Expand Down Expand Up @@ -702,18 +702,17 @@ pub fn check_light_mesh_visibility(
&mut VisibleEntities,
Option<&RenderLayers>,
)>,
mut visible_entity_query: Query<
visible_entity_query: Query<
(
Entity,
&mut ComputedVisibility,
Option<&RenderLayers>,
Option<&Aabb>,
Option<&GlobalTransform>,
),
(Without<NotShadowCaster>, With<Visible>),
>,
) {
// Directonal lights
// Directional lights
for (directional_light, frustum, mut visible_entities, maybe_view_mask) in
directional_lights.iter_mut()
{
Expand All @@ -726,8 +725,7 @@ pub fn check_light_mesh_visibility(

let view_mask = maybe_view_mask.copied().unwrap_or_default();

for (entity, mut computed_visibility, maybe_entity_mask, maybe_aabb, maybe_transform) in
visible_entity_query.iter_mut()
for (entity, maybe_entity_mask, maybe_aabb, maybe_transform) in visible_entity_query.iter()
{
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
if !view_mask.intersects(&entity_mask) {
Expand All @@ -740,8 +738,6 @@ pub fn check_light_mesh_visibility(
continue;
}
}

computed_visibility.is_visible = true;
visible_entities.entities.push(entity);
}

Expand Down Expand Up @@ -775,13 +771,8 @@ pub fn check_light_mesh_visibility(
radius: point_light.range,
};

for (
entity,
mut computed_visibility,
maybe_entity_mask,
maybe_aabb,
maybe_transform,
) in visible_entity_query.iter_mut()
for (entity, maybe_entity_mask, maybe_aabb, maybe_transform) in
visible_entity_query.iter()
{
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
if !view_mask.intersects(&entity_mask) {
Expand All @@ -800,12 +791,10 @@ pub fn check_light_mesh_visibility(
.zip(cubemap_visible_entities.iter_mut())
{
if frustum.intersects_obb(aabb, &model_to_world) {
computed_visibility.is_visible = true;
visible_entities.entities.push(entity);
}
}
} else {
computed_visibility.is_visible = true;
for visible_entities in cubemap_visible_entities.iter_mut() {
visible_entities.entities.push(entity)
}
Expand Down
23 changes: 14 additions & 9 deletions crates/bevy_pbr/src/render/mesh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use bevy_ecs::{
};
use bevy_math::{Mat4, Size};
use bevy_reflect::TypeUuid;
use bevy_render::view::{Visible, VisibleEntities};
use bevy_render::{
mesh::{GpuBufferInfo, Mesh},
render_asset::RenderAssets,
Expand All @@ -18,10 +19,11 @@ use bevy_render::{
render_resource::{std140::AsStd140, *},
renderer::{RenderDevice, RenderQueue},
texture::{BevyDefault, GpuImage, Image, TextureFormatPixelInfo},
view::{ComputedVisibility, ViewUniform, ViewUniformOffset, ViewUniforms},
view::{ViewUniform, ViewUniformOffset, ViewUniforms},
RenderApp, RenderStage,
};
use bevy_transform::components::GlobalTransform;
use bevy_utils::HashSet;

#[derive(Default)]
pub struct MeshRenderPlugin;
Expand Down Expand Up @@ -84,30 +86,33 @@ pub fn extract_meshes(
mut commands: Commands,
mut previous_caster_len: Local<usize>,
mut previous_not_caster_len: Local<usize>,
visible_entities_query: Query<&VisibleEntities>,
caster_query: Query<
(
Entity,
&ComputedVisibility,
&GlobalTransform,
&Handle<Mesh>,
Option<&NotShadowReceiver>,
),
Without<NotShadowCaster>,
(Without<NotShadowCaster>, With<Visible>),
>,
not_caster_query: Query<
(
Entity,
&ComputedVisibility,
&GlobalTransform,
&Handle<Mesh>,
Option<&NotShadowReceiver>,
),
With<NotShadowCaster>,
(With<NotShadowCaster>, With<Visible>),
>,
) {
let visible_entities: HashSet<Entity> = visible_entities_query
.iter()
.flat_map(|v| v.entities.clone())
.collect();
let mut caster_values = Vec::with_capacity(*previous_caster_len);
for (entity, computed_visibility, transform, handle, not_receiver) in caster_query.iter() {
if !computed_visibility.is_visible {
for (entity, transform, handle, not_receiver) in caster_query.iter() {
if !visible_entities.contains(&entity) {
continue;
}
let transform = transform.compute_matrix();
Expand All @@ -131,8 +136,8 @@ pub fn extract_meshes(
commands.insert_or_spawn_batch(caster_values);

let mut not_caster_values = Vec::with_capacity(*previous_not_caster_len);
for (entity, computed_visibility, transform, handle, not_receiver) in not_caster_query.iter() {
if !computed_visibility.is_visible {
for (entity, transform, handle, not_receiver) in not_caster_query.iter() {
if !visible_entities.contains(&entity) {
continue;
}
let transform = transform.compute_matrix();
Expand Down
3 changes: 1 addition & 2 deletions crates/bevy_render/src/camera/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ pub use projection::*;

use crate::{
primitives::Aabb,
view::{ComputedVisibility, ExtractedView, Visible, VisibleEntities},
view::{ExtractedView, Visible, VisibleEntities},
RenderApp, RenderStage,
};
use bevy_app::{App, CoreStage, Plugin};
Expand All @@ -35,7 +35,6 @@ impl Plugin for CameraPlugin {
active_cameras.add(Self::CAMERA_3D);
app.register_type::<Camera>()
.register_type::<Visible>()
.register_type::<ComputedVisibility>()
.register_type::<OrthographicProjection>()
.register_type::<PerspectiveProjection>()
.register_type::<VisibleEntities>()
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_render/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pub mod prelude {
mesh::{shape, Mesh},
render_resource::Shader,
texture::Image,
view::{ComputedVisibility, Msaa, Visible},
view::{Msaa, Visible},
};
}

Expand Down
54 changes: 12 additions & 42 deletions crates/bevy_render/src/view/visibility/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,6 @@ use crate::{
#[reflect(Component)]
pub struct Visible;

/// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering
#[derive(Component, Clone, Reflect, Debug)]
#[reflect(Component)]
pub struct ComputedVisibility {
pub is_visible: bool,
}

impl Default for ComputedVisibility {
fn default() -> Self {
Self { is_visible: true }
}
}

/// Use this component to opt-out of built-in frustum culling for Mesh entities
#[derive(Component)]
pub struct NoFrustumCulling;
Expand Down Expand Up @@ -130,38 +117,23 @@ pub fn update_frusta<T: Component + CameraProjection + Send + Sync + 'static>(

pub fn check_visibility(
mut view_query: Query<(&mut VisibleEntities, &Frustum, Option<&RenderLayers>), With<Camera>>,
mut visible_entity_query: QuerySet<(
QueryState<&mut ComputedVisibility>,
QueryState<
(
Entity,
&mut ComputedVisibility,
Option<&RenderLayers>,
Option<&Aabb>,
Option<&NoFrustumCulling>,
Option<&GlobalTransform>,
),
With<Visible>,
>,
)>,
visible_entity_query: Query<
(
Entity,
Option<&RenderLayers>,
Option<&Aabb>,
Option<&NoFrustumCulling>,
Option<&GlobalTransform>,
),
With<Visible>,
>,
) {
// Reset the computed visibility to false
for mut computed_visibility in visible_entity_query.q0().iter_mut() {
computed_visibility.is_visible = false;
}

for (mut visible_entities, frustum, maybe_view_mask) in view_query.iter_mut() {
visible_entities.entities.clear();
let view_mask = maybe_view_mask.copied().unwrap_or_default();

for (
entity,
mut computed_visibility,
maybe_entity_mask,
maybe_aabb,
maybe_no_frustum_culling,
maybe_transform,
) in visible_entity_query.q1().iter_mut()
for (entity, maybe_entity_mask, maybe_aabb, maybe_no_frustum_culling, maybe_transform) in
visible_entity_query.iter()
{
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
if !view_mask.intersects(&entity_mask) {
Expand All @@ -176,8 +148,6 @@ pub fn check_visibility(
continue;
}
}

computed_visibility.is_visible = true;
visible_entities.entities.push(entity);
}

Expand Down
5 changes: 1 addition & 4 deletions crates/bevy_sprite/src/mesh2d/material.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use bevy_render::{
SpecializedPipeline, SpecializedPipelines,
},
renderer::RenderDevice,
view::{ComputedVisibility, Msaa, Visible, VisibleEntities},
view::{Msaa, Visible, VisibleEntities},
RenderApp, RenderStage,
};
use bevy_transform::components::{GlobalTransform, Transform};
Expand Down Expand Up @@ -327,8 +327,6 @@ pub struct MaterialMesh2dBundle<M: SpecializedMaterial2d> {
pub global_transform: GlobalTransform,
/// User indication of whether an entity is visible
pub visible: Visible,
/// Algorithmically-computed indication of whether an entity is visible and should be extracted for rendering
pub computed_visibility: ComputedVisibility,
}

impl<M: SpecializedMaterial2d> Default for MaterialMesh2dBundle<M> {
Expand All @@ -339,7 +337,6 @@ impl<M: SpecializedMaterial2d> Default for MaterialMesh2dBundle<M> {
transform: Default::default(),
global_transform: Default::default(),
visible: Default::default(),
computed_visibility: Default::default(),
}
}
}
15 changes: 11 additions & 4 deletions crates/bevy_sprite/src/mesh2d/mesh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use bevy_ecs::{
};
use bevy_math::{Mat4, Size};
use bevy_reflect::TypeUuid;
use bevy_render::view::{Visible, VisibleEntities};
use bevy_render::{
mesh::{GpuBufferInfo, Mesh},
render_asset::RenderAssets,
Expand All @@ -14,10 +15,11 @@ use bevy_render::{
render_resource::{std140::AsStd140, *},
renderer::{RenderDevice, RenderQueue},
texture::{BevyDefault, GpuImage, Image, TextureFormatPixelInfo},
view::{ComputedVisibility, ExtractedView, ViewUniform, ViewUniformOffset, ViewUniforms},
view::{ExtractedView, ViewUniform, ViewUniformOffset, ViewUniforms},
RenderApp, RenderStage,
};
use bevy_transform::components::GlobalTransform;
use bevy_utils::HashSet;

/// Component for rendering with meshes in the 2d pipeline, usually with a [2d material](crate::Material2d) such as [`ColorMaterial`](crate::ColorMaterial).
///
Expand Down Expand Up @@ -91,11 +93,16 @@ bitflags::bitflags! {
pub fn extract_mesh2d(
mut commands: Commands,
mut previous_len: Local<usize>,
query: Query<(Entity, &ComputedVisibility, &GlobalTransform, &Mesh2dHandle)>,
visible_entities_query: Query<&VisibleEntities>,
query: Query<(Entity, &GlobalTransform, &Mesh2dHandle), With<Visible>>,
) {
let visible_entities: HashSet<Entity> = visible_entities_query
.iter()
.flat_map(|v| v.entities.clone())
.collect();
let mut values = Vec::with_capacity(*previous_len);
for (entity, computed_visibility, transform, handle) in query.iter() {
if !computed_visibility.is_visible {
for (entity, transform, handle) in query.iter() {
if !visible_entities.contains(&entity) {
continue;
}
let transform = transform.compute_matrix();
Expand Down