bevy/crates/bevy_ui/src/update.rs

50 lines
1.3 KiB
Rust
Raw Normal View History

2020-04-06 21:20:53 +00:00
use super::Node;
2020-07-25 06:04:45 +00:00
use bevy_ecs::{Entity, Query, With, Without};
2020-07-16 23:32:39 +00:00
use bevy_transform::{
hierarchy,
prelude::{Children, Parent, Transform},
2020-07-16 23:32:39 +00:00
};
2020-01-13 00:51:21 +00:00
pub const UI_Z_STEP: f32 = 0.001;
2020-07-25 06:04:45 +00:00
pub fn ui_z_system(
root_node_query: Query<With<Node, Without<Parent, Entity>>>,
mut node_query: Query<(Entity, &Node, &mut Transform)>,
2020-07-10 04:18:35 +00:00
children_query: Query<&Children>,
) {
let mut current_global_z = 0.0;
2020-07-25 06:04:45 +00:00
for entity in root_node_query.iter() {
2020-07-25 06:04:45 +00:00
if let Some(result) = hierarchy::run_on_hierarchy(
2020-07-10 04:18:35 +00:00
&children_query,
&mut node_query,
entity,
Some(current_global_z),
Some(current_global_z),
&mut update_node_entity,
2020-07-25 06:04:45 +00:00
) {
current_global_z = result;
2020-07-25 06:04:45 +00:00
}
}
2020-01-13 00:51:21 +00:00
}
2020-01-13 06:18:17 +00:00
2020-06-27 17:18:27 +00:00
fn update_node_entity(
node_query: &mut Query<(Entity, &Node, &mut Transform)>,
2020-06-27 17:18:27 +00:00
entity: Entity,
parent_result: Option<f32>,
2020-07-25 20:14:36 +00:00
previous_result: Option<f32>,
) -> Option<f32> {
2020-07-25 06:04:45 +00:00
let mut z = UI_Z_STEP;
let parent_global_z = parent_result.unwrap();
if let Some(previous_global_z) = previous_result {
z += previous_global_z - parent_global_z;
2020-07-25 06:04:45 +00:00
};
let global_z = z + parent_global_z;
if let Ok(mut transform) = node_query.get_mut::<Transform>(entity) {
transform.translation.set_z(z);
}
2020-07-25 06:04:45 +00:00
Some(global_z)
2020-06-27 17:18:27 +00:00
}