Skip to content

Commit 76ec709

Browse files
committed
Add Visibility component to UI (#3426)
# Objective Fixes #3422 ## Solution Adds the existing `Visibility` component to UI bundles and checks for it in the extract phase of the render app. The `ComputedVisibility` component was not added. I don't think the UI camera needs frustum culling, but having `RenderLayers` work may be desirable. However I think we would need to change `check_visibility()` to differentiate between 2d, 3d and UI entities.
1 parent adb3ad3 commit 76ec709

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

crates/bevy_render/src/view/visibility/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
};
1616

1717
/// User indication of whether an entity is visible
18-
#[derive(Component, Clone, Reflect)]
18+
#[derive(Component, Clone, Reflect, Debug)]
1919
#[reflect(Component)]
2020
pub struct Visibility {
2121
pub is_visible: bool,

crates/bevy_ui/src/entity.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
use bevy_ecs::bundle::Bundle;
66
use bevy_render::{
77
camera::{Camera, DepthCalculation, OrthographicProjection, WindowOrigin},
8-
view::VisibleEntities,
8+
view::{Visibility, VisibleEntities},
99
};
1010
use bevy_text::Text;
1111
use bevy_transform::prelude::{GlobalTransform, Transform};
@@ -18,6 +18,7 @@ pub struct NodeBundle {
1818
pub image: UiImage,
1919
pub transform: Transform,
2020
pub global_transform: GlobalTransform,
21+
pub visibility: Visibility,
2122
}
2223

2324
#[derive(Bundle, Clone, Debug, Default)]
@@ -30,6 +31,7 @@ pub struct ImageBundle {
3031
pub image: UiImage,
3132
pub transform: Transform,
3233
pub global_transform: GlobalTransform,
34+
pub visibility: Visibility,
3335
}
3436

3537
#[derive(Bundle, Clone, Debug)]
@@ -41,6 +43,7 @@ pub struct TextBundle {
4143
pub focus_policy: FocusPolicy,
4244
pub transform: Transform,
4345
pub global_transform: GlobalTransform,
46+
pub visibility: Visibility,
4447
}
4548

4649
impl Default for TextBundle {
@@ -53,6 +56,7 @@ impl Default for TextBundle {
5356
style: Default::default(),
5457
transform: Default::default(),
5558
global_transform: Default::default(),
59+
visibility: Default::default(),
5660
}
5761
}
5862
}
@@ -68,6 +72,7 @@ pub struct ButtonBundle {
6872
pub image: UiImage,
6973
pub transform: Transform,
7074
pub global_transform: GlobalTransform,
75+
pub visibility: Visibility,
7176
}
7277

7378
impl Default for ButtonBundle {
@@ -82,6 +87,7 @@ impl Default for ButtonBundle {
8287
image: Default::default(),
8388
transform: Default::default(),
8489
global_transform: Default::default(),
90+
visibility: Default::default(),
8591
}
8692
}
8793
}

crates/bevy_ui/src/render/mod.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use bevy_render::{
2323
render_resource::*,
2424
renderer::{RenderDevice, RenderQueue},
2525
texture::Image,
26-
view::ViewUniforms,
26+
view::{ViewUniforms, Visibility},
2727
RenderApp, RenderStage, RenderWorld,
2828
};
2929
use bevy_sprite::{Rect, SpriteAssetEvents, TextureAtlas};
@@ -139,12 +139,16 @@ pub fn extract_uinodes(
139139
&GlobalTransform,
140140
&UiColor,
141141
&UiImage,
142+
&Visibility,
142143
Option<&CalculatedClip>,
143144
)>,
144145
) {
145146
let mut extracted_uinodes = render_world.get_resource_mut::<ExtractedUiNodes>().unwrap();
146147
extracted_uinodes.uinodes.clear();
147-
for (uinode, transform, color, image, clip) in uinode_query.iter() {
148+
for (uinode, transform, color, image, visibility, clip) in uinode_query.iter() {
149+
if !visibility.is_visible {
150+
continue;
151+
}
148152
let image = image.0.clone_weak();
149153
// Skip loading images
150154
if !images.contains(image.clone_weak()) {
@@ -174,6 +178,7 @@ pub fn extract_text_uinodes(
174178
&Node,
175179
&GlobalTransform,
176180
&Text,
181+
&Visibility,
177182
Option<&CalculatedClip>,
178183
)>,
179184
) {
@@ -185,7 +190,10 @@ pub fn extract_text_uinodes(
185190
1.
186191
};
187192

188-
for (entity, uinode, transform, text, clip) in uinode_query.iter() {
193+
for (entity, uinode, transform, text, visibility, clip) in uinode_query.iter() {
194+
if !visibility.is_visible {
195+
continue;
196+
}
189197
// Skip if size is set to zero (e.g. when a parent is set to `Display::None`)
190198
if uinode.size == Vec2::ZERO {
191199
continue;

0 commit comments

Comments
 (0)