From 6fdc189cf9faaa90b00789aecc334c5b62aab14b Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Mon, 4 Mar 2024 15:51:30 +0100 Subject: [PATCH 1/5] [wip] add initial axes_2d fn to Gizmos --- crates/bevy_gizmos/src/arrows.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/bevy_gizmos/src/arrows.rs b/crates/bevy_gizmos/src/arrows.rs index 5571fecf9a24e..4d422662e75d9 100644 --- a/crates/bevy_gizmos/src/arrows.rs +++ b/crates/bevy_gizmos/src/arrows.rs @@ -162,4 +162,13 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { self.arrow(start, end_y, GREEN); self.arrow(start, end_z, BLUE); } + + pub fn axes_2d(&mut self, transform: impl TransformPoint, base_length: f32) { + let start = transform.transform_point(Vec2::ZERO); + let end_x = transform.transform_point(base_length * Vec2::X); + let end_y = transform.transform_point(base_length * Vec2::Y); + + self.arrow_2d(start, end_x, RED); + self.arrow_2d(start, end_y, GREEN); + } } From 0dba551c97ab95031a07fb392a80108889581f0e Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 6 Mar 2024 07:23:03 +0100 Subject: [PATCH 2/5] add axes_2d and update example --- crates/bevy_gizmos/Cargo.toml | 2 +- crates/bevy_gizmos/src/arrows.rs | 43 +++++++++++++++++++++++++++----- examples/gizmos/2d_gizmos.rs | 2 ++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/crates/bevy_gizmos/Cargo.toml b/crates/bevy_gizmos/Cargo.toml index 205759c974ee2..c04a6eef0b227 100644 --- a/crates/bevy_gizmos/Cargo.toml +++ b/crates/bevy_gizmos/Cargo.toml @@ -14,8 +14,8 @@ webgpu = [] [dependencies] # Bevy -bevy_pbr = { path = "../bevy_pbr", version = "0.14.0-dev", optional = true } bevy_sprite = { path = "../bevy_sprite", version = "0.14.0-dev", optional = true } +bevy_pbr = { path = "../bevy_pbr", version = "0.14.0-dev", optional = true } bevy_app = { path = "../bevy_app", version = "0.14.0-dev" } bevy_color = { path = "../bevy_color", version = "0.14.0-dev" } bevy_ecs = { path = "../bevy_ecs", version = "0.14.0-dev" } diff --git a/crates/bevy_gizmos/src/arrows.rs b/crates/bevy_gizmos/src/arrows.rs index 4d422662e75d9..899af3374890d 100644 --- a/crates/bevy_gizmos/src/arrows.rs +++ b/crates/bevy_gizmos/src/arrows.rs @@ -125,7 +125,14 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { end: Vec2, color: impl Into, ) -> ArrowBuilder<'_, 'w, 's, T> { - self.arrow(start.extend(0.), end.extend(0.), color) + let length = (end - start).length(); + ArrowBuilder { + gizmos: self, + start: start.extend(0.), + end: end.extend(0.), + color: color.into(), + tip_length: length / 10., + } } } @@ -162,13 +169,37 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { self.arrow(start, end_y, GREEN); self.arrow(start, end_z, BLUE); } +} +impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { + /// Draw a set of axes local to the given transform (`transform`), with length scaled by a factor + /// of `base_length`. + /// + /// This should be called for each frame the axes need to be rendered. + /// + /// # Example + /// ``` + /// # use bevy_gizmos::prelude::*; + /// # use bevy_ecs::prelude::*; + /// # use bevy_transform::components::Transform; + /// # #[derive(Component)] + /// # struct AxesComponent; + /// fn draw_axes_2d( + /// mut gizmos: Gizmos, + /// query: Query<&Transform, With>, + /// ) { + /// for &transform in &query { + /// gizmos.axes_2d(transform, 1.); + /// } + /// } + /// # bevy_ecs::system::assert_is_system(draw_axes_2d); + /// ``` pub fn axes_2d(&mut self, transform: impl TransformPoint, base_length: f32) { - let start = transform.transform_point(Vec2::ZERO); - let end_x = transform.transform_point(base_length * Vec2::X); - let end_y = transform.transform_point(base_length * Vec2::Y); + let start = transform.transform_point(Vec3::ZERO); + let end_x = transform.transform_point(base_length * Vec3::X); + let end_y = transform.transform_point(base_length * Vec3::Y); - self.arrow_2d(start, end_x, RED); - self.arrow_2d(start, end_y, GREEN); + self.arrow_2d(start.into(), end_x.into(), RED); + self.arrow_2d(start.into(), end_y.into(), GREEN); } } diff --git a/examples/gizmos/2d_gizmos.rs b/examples/gizmos/2d_gizmos.rs index aae281286e71e..59d7819521e10 100644 --- a/examples/gizmos/2d_gizmos.rs +++ b/examples/gizmos/2d_gizmos.rs @@ -87,6 +87,8 @@ fn draw_example_collection( Vec2::from_angle(sin / -10. + PI / 2.) * 50., YELLOW, ); + + gizmos.axes_2d(Transform::from_translation(Vec3::new(sin, 0.0, 0.0)), 25.0) } fn update_config( From 345fedbbd5d42ba78abe9f9cd89b22d35bb09c0b Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 6 Mar 2024 12:07:59 +0100 Subject: [PATCH 3/5] [fix] remove from examples, revert arrow_2d, revert reordering in cargo.toml, remove From for Vec2 --- crates/bevy_gizmos/Cargo.toml | 2 +- crates/bevy_gizmos/src/arrows.rs | 15 ++++----------- examples/gizmos/2d_gizmos.rs | 2 -- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/crates/bevy_gizmos/Cargo.toml b/crates/bevy_gizmos/Cargo.toml index c04a6eef0b227..205759c974ee2 100644 --- a/crates/bevy_gizmos/Cargo.toml +++ b/crates/bevy_gizmos/Cargo.toml @@ -14,8 +14,8 @@ webgpu = [] [dependencies] # Bevy -bevy_sprite = { path = "../bevy_sprite", version = "0.14.0-dev", optional = true } bevy_pbr = { path = "../bevy_pbr", version = "0.14.0-dev", optional = true } +bevy_sprite = { path = "../bevy_sprite", version = "0.14.0-dev", optional = true } bevy_app = { path = "../bevy_app", version = "0.14.0-dev" } bevy_color = { path = "../bevy_color", version = "0.14.0-dev" } bevy_ecs = { path = "../bevy_ecs", version = "0.14.0-dev" } diff --git a/crates/bevy_gizmos/src/arrows.rs b/crates/bevy_gizmos/src/arrows.rs index 899af3374890d..4663edd0c7d34 100644 --- a/crates/bevy_gizmos/src/arrows.rs +++ b/crates/bevy_gizmos/src/arrows.rs @@ -8,7 +8,7 @@ use bevy_color::{ palettes::basic::{BLUE, GREEN, RED}, Color, }; -use bevy_math::{Quat, Vec2, Vec3}; +use bevy_math::{Quat, Vec2, Vec3, Vec3Swizzles}; use bevy_transform::TransformPoint; /// A builder returned by [`Gizmos::arrow`] and [`Gizmos::arrow_2d`] @@ -125,14 +125,7 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { end: Vec2, color: impl Into, ) -> ArrowBuilder<'_, 'w, 's, T> { - let length = (end - start).length(); - ArrowBuilder { - gizmos: self, - start: start.extend(0.), - end: end.extend(0.), - color: color.into(), - tip_length: length / 10., - } + self.arrow(start.extend(0.), end.extend(0.), color) } } @@ -199,7 +192,7 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { let end_x = transform.transform_point(base_length * Vec3::X); let end_y = transform.transform_point(base_length * Vec3::Y); - self.arrow_2d(start.into(), end_x.into(), RED); - self.arrow_2d(start.into(), end_y.into(), GREEN); + self.arrow_2d(start.xy(), end_x.xy(), RED); + self.arrow_2d(start.xy(), end_y.xy(), GREEN); } } diff --git a/examples/gizmos/2d_gizmos.rs b/examples/gizmos/2d_gizmos.rs index 59d7819521e10..aae281286e71e 100644 --- a/examples/gizmos/2d_gizmos.rs +++ b/examples/gizmos/2d_gizmos.rs @@ -87,8 +87,6 @@ fn draw_example_collection( Vec2::from_angle(sin / -10. + PI / 2.) * 50., YELLOW, ); - - gizmos.axes_2d(Transform::from_translation(Vec3::new(sin, 0.0, 0.0)), 25.0) } fn update_config( From 248697727ee14837eb76b98c0f8da80bf8562724 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 6 Mar 2024 15:47:10 +0100 Subject: [PATCH 4/5] remove extra impl block and place with axes fn. Add to axes example. --- crates/bevy_gizmos/src/arrows.rs | 2 -- examples/gizmos/axes.rs | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/crates/bevy_gizmos/src/arrows.rs b/crates/bevy_gizmos/src/arrows.rs index 4663edd0c7d34..719d5a0af4525 100644 --- a/crates/bevy_gizmos/src/arrows.rs +++ b/crates/bevy_gizmos/src/arrows.rs @@ -162,9 +162,7 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { self.arrow(start, end_y, GREEN); self.arrow(start, end_z, BLUE); } -} -impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { /// Draw a set of axes local to the given transform (`transform`), with length scaled by a factor /// of `base_length`. /// diff --git a/examples/gizmos/axes.rs b/examples/gizmos/axes.rs index 224d419b87827..e4a39d1d1db51 100644 --- a/examples/gizmos/axes.rs +++ b/examples/gizmos/axes.rs @@ -8,7 +8,7 @@ fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup) - .add_systems(Update, (move_cubes, draw_axes)) + .add_systems(Update, (move_cubes, draw_axes, draw_axes_2d)) .run(); } @@ -17,6 +17,9 @@ fn main() { #[derive(Component)] struct ShowAxes; +#[derive(Component)] +struct ShowAxes2D; + /// The `TransformTracking` component keeps track of the data we need to interpolate /// between two transforms in our example. #[derive(Component)] @@ -82,12 +85,15 @@ fn setup( )); // A plane to give a sense of place - commands.spawn(PbrBundle { - mesh: meshes.add(Plane3d::default().mesh().size(20., 20.)), - material: materials.add(Color::srgb(0.1, 0.1, 0.1)), - transform: Transform::from_xyz(0., -2., 0.), - ..default() - }); + commands.spawn(( + PbrBundle { + mesh: meshes.add(Plane3d::default().mesh().size(20., 20.)), + material: materials.add(Color::srgb(0.1, 0.1, 0.1)), + transform: Transform::from_xyz(0., -2., 0.), + ..default() + }, + ShowAxes2D, + )); } // This system draws the axes based on the cube's transform, with length based on the size of @@ -99,6 +105,13 @@ fn draw_axes(mut gizmos: Gizmos, query: Query<(&Transform, &Aabb), With>) { + for (&transform, &aabb) in &query { + let length = aabb.half_extents.length() / 10.; + gizmos.axes_2d(transform, length); + } +} + // This system changes the cubes' transforms to interpolate between random transforms fn move_cubes(mut query: Query<(&mut Transform, &mut TransformTracking)>) { for (mut transform, mut tracking) in &mut query { From a837a7f4b3f9ee394f372421353ddf624e5103d0 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 6 Mar 2024 16:41:29 +0100 Subject: [PATCH 5/5] revert axes example --- examples/gizmos/axes.rs | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/examples/gizmos/axes.rs b/examples/gizmos/axes.rs index e4a39d1d1db51..224d419b87827 100644 --- a/examples/gizmos/axes.rs +++ b/examples/gizmos/axes.rs @@ -8,7 +8,7 @@ fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup) - .add_systems(Update, (move_cubes, draw_axes, draw_axes_2d)) + .add_systems(Update, (move_cubes, draw_axes)) .run(); } @@ -17,9 +17,6 @@ fn main() { #[derive(Component)] struct ShowAxes; -#[derive(Component)] -struct ShowAxes2D; - /// The `TransformTracking` component keeps track of the data we need to interpolate /// between two transforms in our example. #[derive(Component)] @@ -85,15 +82,12 @@ fn setup( )); // A plane to give a sense of place - commands.spawn(( - PbrBundle { - mesh: meshes.add(Plane3d::default().mesh().size(20., 20.)), - material: materials.add(Color::srgb(0.1, 0.1, 0.1)), - transform: Transform::from_xyz(0., -2., 0.), - ..default() - }, - ShowAxes2D, - )); + commands.spawn(PbrBundle { + mesh: meshes.add(Plane3d::default().mesh().size(20., 20.)), + material: materials.add(Color::srgb(0.1, 0.1, 0.1)), + transform: Transform::from_xyz(0., -2., 0.), + ..default() + }); } // This system draws the axes based on the cube's transform, with length based on the size of @@ -105,13 +99,6 @@ fn draw_axes(mut gizmos: Gizmos, query: Query<(&Transform, &Aabb), With>) { - for (&transform, &aabb) in &query { - let length = aabb.half_extents.length() / 10.; - gizmos.axes_2d(transform, length); - } -} - // This system changes the cubes' transforms to interpolate between random transforms fn move_cubes(mut query: Query<(&mut Transform, &mut TransformTracking)>) { for (mut transform, mut tracking) in &mut query {