|
4 | 4 | //! and assorted support items.
|
5 | 5 |
|
6 | 6 | use crate::prelude::{GizmoConfigGroup, Gizmos};
|
7 |
| -use bevy_color::Color; |
| 7 | +use bevy_color::{ |
| 8 | + palettes::basic::{BLUE, GREEN, RED}, |
| 9 | + Color, |
| 10 | +}; |
8 | 11 | use bevy_math::{Quat, Vec2, Vec3};
|
| 12 | +use bevy_transform::TransformPoint; |
9 | 13 |
|
10 | 14 | /// A builder returned by [`Gizmos::arrow`] and [`Gizmos::arrow_2d`]
|
11 | 15 | pub struct ArrowBuilder<'a, 'w, 's, T: GizmoConfigGroup> {
|
@@ -33,8 +37,9 @@ impl<T: GizmoConfigGroup> ArrowBuilder<'_, '_, '_, T> {
|
33 | 37 | /// # bevy_ecs::system::assert_is_system(system);
|
34 | 38 | /// ```
|
35 | 39 | #[doc(alias = "arrow_head_length")]
|
36 |
| - pub fn with_tip_length(&mut self, length: f32) { |
| 40 | + pub fn with_tip_length(mut self, length: f32) -> Self { |
37 | 41 | self.tip_length = length;
|
| 42 | + self |
38 | 43 | }
|
39 | 44 | }
|
40 | 45 |
|
@@ -123,3 +128,38 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> {
|
123 | 128 | self.arrow(start.extend(0.), end.extend(0.), color)
|
124 | 129 | }
|
125 | 130 | }
|
| 131 | + |
| 132 | +impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { |
| 133 | + /// Draw a set of axes local to the given transform (`transform`), with length scaled by a factor |
| 134 | + /// of `base_length`. |
| 135 | + /// |
| 136 | + /// This should be called for each frame the axes need to be rendered. |
| 137 | + /// |
| 138 | + /// # Example |
| 139 | + /// ``` |
| 140 | + /// # use bevy_gizmos::prelude::*; |
| 141 | + /// # use bevy_ecs::prelude::*; |
| 142 | + /// # use bevy_transform::components::Transform; |
| 143 | + /// # #[derive(Component)] |
| 144 | + /// # struct MyComponent; |
| 145 | + /// fn draw_axes( |
| 146 | + /// mut gizmos: Gizmos, |
| 147 | + /// query: Query<&Transform, With<MyComponent>>, |
| 148 | + /// ) { |
| 149 | + /// for &transform in &query { |
| 150 | + /// gizmos.axes(transform, 1.); |
| 151 | + /// } |
| 152 | + /// } |
| 153 | + /// # bevy_ecs::system::assert_is_system(draw_axes); |
| 154 | + /// ``` |
| 155 | + pub fn axes(&mut self, transform: impl TransformPoint, base_length: f32) { |
| 156 | + let start = transform.transform_point(Vec3::ZERO); |
| 157 | + let end_x = transform.transform_point(base_length * Vec3::X); |
| 158 | + let end_y = transform.transform_point(base_length * Vec3::Y); |
| 159 | + let end_z = transform.transform_point(base_length * Vec3::Z); |
| 160 | + |
| 161 | + self.arrow(start, end_x, RED); |
| 162 | + self.arrow(start, end_y, GREEN); |
| 163 | + self.arrow(start, end_z, BLUE); |
| 164 | + } |
| 165 | +} |
0 commit comments