diff --git a/crates/bevy_ui/src/focus.rs b/crates/bevy_ui/src/focus.rs index 384661f4d1..50b434cc18 100644 --- a/crates/bevy_ui/src/focus.rs +++ b/crates/bevy_ui/src/focus.rs @@ -1,10 +1,12 @@ -use crate::{ui_transform::UiGlobalTransform, ComputedNode, ComputedNodeTarget, Node, UiStack}; +use crate::{ + ui_transform::UiGlobalTransform, ComputedNode, ComputedNodeTarget, Node, OverrideClip, UiStack, +}; use bevy_ecs::{ change_detection::DetectChangesMut, entity::{ContainsEntity, Entity}, hierarchy::ChildOf, prelude::{Component, With}, - query::QueryData, + query::{Has, QueryData, Without}, reflect::ReflectComponent, system::{Local, Query, Res}, }; @@ -157,7 +159,7 @@ pub fn ui_focus_system( ui_stack: Res, mut node_query: Query, clipping_query: Query<(&ComputedNode, &UiGlobalTransform, &Node)>, - child_of_query: Query<&ChildOf>, + child_of_query: Query<&ChildOf, Without>, ) { let primary_window = primary_window.iter().next(); @@ -325,11 +327,12 @@ pub fn ui_focus_system( } /// Walk up the tree child-to-parent checking that `point` is not clipped by any ancestor node. +/// If `entity has an `OverrideClip` component it ignores any inherited clipping and returns true. pub fn clip_check_recursive( point: Vec2, entity: Entity, clipping_query: &Query<'_, '_, (&ComputedNode, &UiGlobalTransform, &Node)>, - child_of_query: &Query<&ChildOf>, + child_of_query: &Query<&ChildOf, Without>, ) -> bool { if let Ok(child_of) = child_of_query.get(entity) { let parent = child_of.0; diff --git a/crates/bevy_ui/src/picking_backend.rs b/crates/bevy_ui/src/picking_backend.rs index ccd61a3807..891aea7d35 100644 --- a/crates/bevy_ui/src/picking_backend.rs +++ b/crates/bevy_ui/src/picking_backend.rs @@ -109,7 +109,7 @@ pub fn ui_picking( node_query: Query, mut output: EventWriter, clipping_query: Query<(&ComputedNode, &UiGlobalTransform, &Node)>, - child_of_query: Query<&ChildOf>, + child_of_query: Query<&ChildOf, Without>, ) { // For each camera, the pointer and its position let mut pointer_pos_by_camera = HashMap::>::default();