Skip to content

Commit a0bc2ef

Browse files
committed
Use UiChildren/UiRootNodes in bevy_ui::update
1 parent c0fa36a commit a0bc2ef

File tree

1 file changed

+24
-27
lines changed

1 file changed

+24
-27
lines changed

crates/bevy_ui/src/update.rs

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
//! This module contains systems that update the UI when something changes
22
3-
use crate::{CalculatedClip, Display, OverflowAxis, Style, TargetCamera, UiRootNodes};
3+
use crate::{CalculatedClip, Display, OverflowAxis, Style, TargetCamera, UiChildren, UiRootNodes};
44

55
use super::Node;
66
use bevy_ecs::{
77
entity::Entity,
8-
query::{Changed, With, Without},
8+
query::{Changed, With},
99
system::{Commands, Query},
1010
};
11-
use bevy_hierarchy::{Children, Parent};
1211
use bevy_math::Rect;
1312
use bevy_transform::components::GlobalTransform;
1413
use bevy_utils::HashSet;
@@ -18,12 +17,12 @@ pub fn update_clipping_system(
1817
mut commands: Commands,
1918
root_nodes: UiRootNodes,
2019
mut node_query: Query<(&Node, &GlobalTransform, &Style, Option<&mut CalculatedClip>)>,
21-
children_query: Query<&Children>,
20+
ui_children: UiChildren,
2221
) {
2322
for root_node in root_nodes.iter() {
2423
update_clipping(
2524
&mut commands,
26-
&children_query,
25+
&ui_children,
2726
&mut node_query,
2827
root_node,
2928
None,
@@ -33,7 +32,7 @@ pub fn update_clipping_system(
3332

3433
fn update_clipping(
3534
commands: &mut Commands,
36-
children_query: &Query<&Children>,
35+
ui_children: &UiChildren,
3736
node_query: &mut Query<(&Node, &GlobalTransform, &Style, Option<&mut CalculatedClip>)>,
3837
entity: Entity,
3938
mut maybe_inherited_clip: Option<Rect>,
@@ -92,35 +91,33 @@ fn update_clipping(
9291
Some(maybe_inherited_clip.map_or(node_rect, |c| c.intersect(node_rect)))
9392
};
9493

95-
if let Ok(children) = children_query.get(entity) {
96-
for &child in children {
97-
update_clipping(commands, children_query, node_query, child, children_clip);
98-
}
94+
for child in ui_children.iter_ui_children(entity) {
95+
update_clipping(commands, ui_children, node_query, child, children_clip);
9996
}
10097
}
10198

10299
pub fn update_target_camera_system(
103100
mut commands: Commands,
104101
changed_root_nodes_query: Query<
105102
(Entity, Option<&TargetCamera>),
106-
(With<Node>, Without<Parent>, Changed<TargetCamera>),
103+
(With<Node>, Changed<TargetCamera>),
107104
>,
108-
changed_children_query: Query<(Entity, Option<&TargetCamera>), (With<Node>, Changed<Children>)>,
109-
children_query: Query<&Children, With<Node>>,
110-
node_query: Query<Option<&TargetCamera>, With<Node>>,
105+
node_query: Query<(Entity, Option<&TargetCamera>), With<Node>>,
106+
ui_root_nodes: UiRootNodes,
107+
ui_children: UiChildren,
111108
) {
112109
// Track updated entities to prevent redundant updates, as `Commands` changes are deferred,
113110
// and updates done for changed_children_query can overlap with itself or with root_node_query
114111
let mut updated_entities = HashSet::new();
115112

116113
// Assuming that TargetCamera is manually set on the root node only,
117114
// update root nodes first, since it implies the biggest change
118-
for (root_node, target_camera) in &changed_root_nodes_query {
115+
for (root_node, target_camera) in changed_root_nodes_query.iter_many(ui_root_nodes.iter()) {
119116
update_children_target_camera(
120117
root_node,
121118
target_camera,
122119
&node_query,
123-
&children_query,
120+
&ui_children,
124121
&mut commands,
125122
&mut updated_entities,
126123
);
@@ -129,12 +126,16 @@ pub fn update_target_camera_system(
129126
// If the root node TargetCamera was changed, then every child is updated
130127
// by this point, and iteration will be skipped.
131128
// Otherwise, update changed children
132-
for (parent, target_camera) in &changed_children_query {
129+
for (parent, target_camera) in &node_query {
130+
if !ui_children.is_changed(parent) {
131+
continue;
132+
}
133+
133134
update_children_target_camera(
134135
parent,
135136
target_camera,
136137
&node_query,
137-
&children_query,
138+
&ui_children,
138139
&mut commands,
139140
&mut updated_entities,
140141
);
@@ -144,19 +145,15 @@ pub fn update_target_camera_system(
144145
fn update_children_target_camera(
145146
entity: Entity,
146147
camera_to_set: Option<&TargetCamera>,
147-
node_query: &Query<Option<&TargetCamera>, With<Node>>,
148-
children_query: &Query<&Children, With<Node>>,
148+
node_query: &Query<(Entity, Option<&TargetCamera>), With<Node>>,
149+
ui_children: &UiChildren,
149150
commands: &mut Commands,
150151
updated_entities: &mut HashSet<Entity>,
151152
) {
152-
let Ok(children) = children_query.get(entity) else {
153-
return;
154-
};
155-
156-
for &child in children {
153+
for child in ui_children.iter_ui_children(entity) {
157154
// Skip if the child has already been updated or update is not needed
158155
if updated_entities.contains(&child)
159-
|| camera_to_set == node_query.get(child).ok().flatten()
156+
|| camera_to_set == node_query.get(child).ok().and_then(|(_, camera)| camera)
160157
{
161158
continue;
162159
}
@@ -175,7 +172,7 @@ fn update_children_target_camera(
175172
child,
176173
camera_to_set,
177174
node_query,
178-
children_query,
175+
ui_children,
179176
commands,
180177
updated_entities,
181178
);

0 commit comments

Comments
 (0)