diff --git a/crates/bevy_ui/src/render/debug_overlay.rs b/crates/bevy_ui/src/render/debug_overlay.rs index fb735ce5ec..6ee7f14732 100644 --- a/crates/bevy_ui/src/render/debug_overlay.rs +++ b/crates/bevy_ui/src/render/debug_overlay.rs @@ -1,3 +1,7 @@ +use crate::CalculatedClip; +use crate::ComputedNode; +use crate::DefaultUiCamera; +use crate::TargetCamera; use bevy_asset::AssetId; use bevy_color::Hsla; use bevy_ecs::entity::Entity; @@ -10,14 +14,11 @@ use bevy_math::Rect; use bevy_math::Vec2; use bevy_render::sync_world::RenderEntity; use bevy_render::sync_world::TemporaryRenderEntity; +use bevy_render::view::ViewVisibility; use bevy_render::Extract; use bevy_sprite::BorderRect; use bevy_transform::components::GlobalTransform; -use crate::ComputedNode; -use crate::DefaultUiCamera; -use crate::TargetCamera; - use super::ExtractedUiItem; use super::ExtractedUiNode; use super::ExtractedUiNodes; @@ -30,6 +31,10 @@ pub struct UiDebugOptions { pub enabled: bool, /// Width of the overlay's lines in logical pixels pub line_width: f32, + /// Show outlines for non-visible UI nodes + pub show_hidden: bool, + /// Show outlines for clipped sections of UI nodes + pub show_clipped: bool, } impl UiDebugOptions { @@ -43,6 +48,8 @@ impl Default for UiDebugOptions { Self { enabled: false, line_width: 1., + show_hidden: false, + show_clipped: false, } } } @@ -57,6 +64,8 @@ pub fn extract_debug_overlay( Query<( Entity, &ComputedNode, + &ViewVisibility, + Option<&CalculatedClip>, &GlobalTransform, Option<&TargetCamera>, )>, @@ -67,7 +76,11 @@ pub fn extract_debug_overlay( return; } - for (entity, uinode, transform, camera) in &uinode_query { + for (entity, uinode, visibility, maybe_clip, transform, camera) in &uinode_query { + if !debug_options.show_hidden && !visibility.get() { + continue; + } + let Some(camera_entity) = camera.map(TargetCamera::entity).or(default_ui_camera.get()) else { continue; @@ -88,7 +101,9 @@ pub fn extract_debug_overlay( min: Vec2::ZERO, max: uinode.size, }, - clip: None, + clip: maybe_clip + .filter(|_| !debug_options.show_clipped) + .map(|clip| clip.clip), image: AssetId::default(), camera_entity: render_camera_entity, item: ExtractedUiItem::Node { diff --git a/examples/testbed/ui.rs b/examples/testbed/ui.rs index 31805dd9a6..c312e6c3fb 100644 --- a/examples/testbed/ui.rs +++ b/examples/testbed/ui.rs @@ -60,6 +60,7 @@ fn setup(mut commands: Commands, asset_server: Res) { ..default() }, BackgroundColor(Color::srgb(0.15, 0.15, 0.15)), + Visibility::Visible, )) .with_children(|parent| { // text @@ -77,16 +78,46 @@ fn setup(mut commands: Commands, asset_server: Res) { )); #[cfg(feature = "bevy_ui_debug")] - // Debug overlay text - parent.spawn(( - Text::new("Press Space to toggle debug outlines."), - TextFont { - font: asset_server.load("fonts/FiraSans-Bold.ttf"), - ..default() - }, - Label, - )); + { + // Debug overlay text + parent.spawn(( + Text::new("Press Space to toggle debug outlines."), + TextFont { + font: asset_server.load("fonts/FiraSans-Bold.ttf"), + ..default() + }, + Label, + )); + parent.spawn(( + Text::new("V: toggle UI root's visibility"), + TextFont { + font: asset_server.load("fonts/FiraSans-Bold.ttf"), + font_size: 12., + ..default() + }, + Label, + )); + + parent.spawn(( + Text::new("S: toggle outlines for hidden nodes"), + TextFont { + font: asset_server.load("fonts/FiraSans-Bold.ttf"), + font_size: 12., + ..default() + }, + Label, + )); + parent.spawn(( + Text::new("C: toggle outlines for clipped nodes"), + TextFont { + font: asset_server.load("fonts/FiraSans-Bold.ttf"), + font_size: 12., + ..default() + }, + Label, + )); + } #[cfg(not(feature = "bevy_ui_debug"))] parent.spawn(( Text::new("Try enabling feature \"bevy_ui_debug\"."), @@ -346,11 +377,32 @@ fn setup(mut commands: Commands, asset_server: Res) { #[cfg(feature = "bevy_ui_debug")] // The system that will enable/disable the debug outlines around the nodes -fn toggle_debug_overlay(input: Res>, mut options: ResMut) { +fn toggle_debug_overlay( + input: Res>, + mut debug_options: ResMut, + mut root_node_query: Query<&mut Visibility, (With, Without)>, +) { info_once!("The debug outlines are enabled, press Space to turn them on/off"); if input.just_pressed(KeyCode::Space) { - // The toggle method will enable the debug_overlay if disabled and disable if enabled - options.toggle(); + // The toggle method will enable the debug overlay if disabled and disable if enabled + debug_options.toggle(); + } + + if input.just_pressed(KeyCode::KeyS) { + // Toggle debug outlines for nodes with `ViewVisibility` set to false. + debug_options.show_hidden = !debug_options.show_hidden; + } + + if input.just_pressed(KeyCode::KeyC) { + // Toggle outlines for clipped UI nodes. + debug_options.show_clipped = !debug_options.show_clipped; + } + + if input.just_pressed(KeyCode::KeyV) { + for mut visibility in root_node_query.iter_mut() { + // Toggle the UI root node's visibility + visibility.toggle_inherited_hidden(); + } } }