From cf61d00cedcc127609479565451dd89650414e36 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Mon, 17 Feb 2025 23:15:32 +0000 Subject: [PATCH 1/3] Unrequire `VisibilityClass` from `Node` --- crates/bevy_ui/src/ui_node.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 96d9d2aeb2410..38b387bde5892 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -331,7 +331,6 @@ impl From for ScrollPosition { ScrollPosition, Transform, Visibility, - VisibilityClass, ZIndex )] #[reflect(Component, Default, PartialEq, Debug)] From 51d052f7138aac1f50533ff993fbfe67a092be96 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Mon, 17 Feb 2025 23:19:30 +0000 Subject: [PATCH 2/3] Fixed imports --- crates/bevy_ui/src/ui_node.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 38b387bde5892..6f8c71addb0f4 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -7,7 +7,6 @@ use bevy_reflect::prelude::*; use bevy_render::{ camera::{Camera, RenderTarget}, view::Visibility, - view::VisibilityClass, }; use bevy_sprite::BorderRect; use bevy_transform::components::Transform; From 452ecbf6db6c7c4ec0852138147b8b867d617539 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Mon, 17 Feb 2025 23:40:17 +0000 Subject: [PATCH 3/3] Added a `transform` field to `Node`. In layout updates apply the layout position translation to the transform field and then `set_if_neq` it to the node entitie's `Transform` component. --- crates/bevy_ui/src/layout/convert.rs | 3 +++ crates/bevy_ui/src/layout/mod.rs | 5 ++-- crates/bevy_ui/src/ui_node.rs | 4 ++++ examples/ui/overflow_debug.rs | 34 ++++++++++------------------ 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/crates/bevy_ui/src/layout/convert.rs b/crates/bevy_ui/src/layout/convert.rs index 079e73bb49ace..8f64f697e8c6d 100644 --- a/crates/bevy_ui/src/layout/convert.rs +++ b/crates/bevy_ui/src/layout/convert.rs @@ -448,6 +448,8 @@ impl RepeatedGridTrack { #[cfg(test)] mod tests { + use bevy_transform::components::Transform; + use super::*; #[test] @@ -522,6 +524,7 @@ mod tests { ], grid_column: GridPlacement::start(4), grid_row: GridPlacement::span(3), + transform: Transform::IDENTITY, }; let viewport_values = LayoutContext::new(1.0, bevy_math::Vec2::new(800., 600.)); let taffy_style = from_node(&node, &viewport_values, false); diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index 912079fdaeac8..534202c9cf10d 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -288,9 +288,8 @@ with UI components as a child of an entity without UI components, your UI layout .max(0.); } - if transform.translation.truncate() != node_center { - transform.translation = node_center.extend(0.); - } + transform + .set_if_neq(style.transform * Transform::from_translation(node_center.extend(0.))); let scroll_position: Vec2 = maybe_scroll_position .map(|scroll_pos| { diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 6f8c71addb0f4..95772552fc9a9 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -618,6 +618,9 @@ pub struct Node { /// /// pub grid_column: GridPlacement, + + /// Rotate, scale, skew, or translate the node and its content. + pub transform: Transform, } impl Node { @@ -661,6 +664,7 @@ impl Node { grid_auto_columns: Vec::new(), grid_column: GridPlacement::DEFAULT, grid_row: GridPlacement::DEFAULT, + transform: Transform::IDENTITY, }; } diff --git a/examples/ui/overflow_debug.rs b/examples/ui/overflow_debug.rs index 400c257166926..41a324ee3e9b4 100644 --- a/examples/ui/overflow_debug.rs +++ b/examples/ui/overflow_debug.rs @@ -41,16 +41,16 @@ struct AnimationState { struct Container(u8); trait UpdateTransform { - fn update(&self, t: f32, transform: &mut Transform); + fn update(&self, t: f32, transform: &mut Node); } #[derive(Component)] struct Move; impl UpdateTransform for Move { - fn update(&self, t: f32, transform: &mut Transform) { - transform.translation.x = ops::sin(t * TAU - FRAC_PI_2) * HALF_CONTAINER_SIZE; - transform.translation.y = -ops::cos(t * TAU - FRAC_PI_2) * HALF_CONTAINER_SIZE; + fn update(&self, t: f32, node: &mut Node) { + node.transform.translation.x = ops::sin(t * TAU - FRAC_PI_2) * HALF_CONTAINER_SIZE; + node.transform.translation.y = -ops::cos(t * TAU - FRAC_PI_2) * HALF_CONTAINER_SIZE; } } @@ -58,9 +58,9 @@ impl UpdateTransform for Move { struct Scale; impl UpdateTransform for Scale { - fn update(&self, t: f32, transform: &mut Transform) { - transform.scale.x = 1.0 + 0.5 * ops::cos(t * TAU).max(0.0); - transform.scale.y = 1.0 + 0.5 * ops::cos(t * TAU + PI).max(0.0); + fn update(&self, t: f32, node: &mut Node) { + node.transform.scale.x = 1.0 + 0.5 * ops::cos(t * TAU).max(0.0); + node.transform.scale.y = 1.0 + 0.5 * ops::cos(t * TAU + PI).max(0.0); } } @@ -68,8 +68,8 @@ impl UpdateTransform for Scale { struct Rotate; impl UpdateTransform for Rotate { - fn update(&self, t: f32, transform: &mut Transform) { - transform.rotation = + fn update(&self, t: f32, node: &mut Node) { + node.transform.rotation = Quat::from_axis_angle(Vec3::Z, (ops::cos(t * TAU) * 45.0).to_radians()); } } @@ -175,10 +175,6 @@ fn spawn_container( update_transform: impl UpdateTransform + Component, spawn_children: impl FnOnce(&mut ChildSpawnerCommands), ) { - let mut transform = Transform::default(); - - update_transform.update(0.0, &mut transform); - parent .spawn(( Node { @@ -198,11 +194,8 @@ fn spawn_container( Node { align_items: AlignItems::Center, justify_content: JustifyContent::Center, - top: Val::Px(transform.translation.x), - left: Val::Px(transform.translation.y), ..default() }, - transform, update_transform, )) .with_children(spawn_children); @@ -233,13 +226,10 @@ fn update_animation( fn update_transform( animation: Res, - mut containers: Query<(&mut Transform, &mut Node, &ComputedNode, &T)>, + mut containers: Query<(&mut Node, &T)>, ) { - for (mut transform, mut node, computed_node, update_transform) in &mut containers { - update_transform.update(animation.t, &mut transform); - - node.left = Val::Px(transform.translation.x * computed_node.inverse_scale_factor()); - node.top = Val::Px(transform.translation.y * computed_node.inverse_scale_factor()); + for (mut node, update_transform) in &mut containers { + update_transform.update(animation.t, &mut node); } }