Struct bevy::gizmos::prelude::Gizmos

source ·
pub struct Gizmos<'w, 's, T = DefaultGizmoConfigGroup>{
    pub config: &'w GizmoConfig,
    pub config_ext: &'w T,
    /* private fields */
}
Expand description

A SystemParam for drawing gizmos.

They are drawn in immediate mode, which means they will be rendered only for the frames in which they are spawned. Gizmos should be spawned before the Last schedule to ensure they are drawn.

Fields§

§config: &'w GizmoConfig

The currently used GizmoConfig

§config_ext: &'w T

The currently used GizmoConfigGroup

Implementations§

source§

impl<'w, 's, T> Gizmos<'w, 's, T>

source

pub fn arc_2d( &mut self, position: Vec2, direction_angle: f32, arc_angle: f32, radius: f32, color: Color ) -> Arc2dBuilder<'_, 'w, 's, T>

Draw an arc, which is a part of the circumference of a circle, in 2D.

This should be called for each frame the arc needs to be rendered.

§Arguments
  • position sets the center of this circle.
  • radius controls the distance from position to this arc, and thus its curvature.
  • direction_angle sets the clockwise angle in radians between Vec2::Y and the vector from position to the midpoint of the arc.
  • arc_angle sets the length of this arc, in radians.
§Example
fn system(mut gizmos: Gizmos) {
    gizmos.arc_2d(Vec2::ZERO, 0., PI / 4., 1., Color::GREEN);

    // Arcs have 32 line-segments by default.
    // You may want to increase this for larger arcs.
    gizmos
        .arc_2d(Vec2::ZERO, 0., PI / 4., 5., Color::RED)
        .segments(64);
}
Examples found in repository?
examples/2d/2d_gizmos.rs (line 74)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source§

impl<'w, 's, T> Gizmos<'w, 's, T>

source

pub fn arc_3d( &mut self, angle: f32, radius: f32, position: Vec3, rotation: Quat, color: Color ) -> Arc3dBuilder<'_, 'w, 's, T>

Draw an arc, which is a part of the circumference of a circle, in 3D. For default values this is drawing a standard arc. A standard arc is defined as

  • an arc with a center at Vec3::ZERO
  • starting at Vec3::X
  • embedded in the XZ plane
  • rotates counterclockwise

This should be called for each frame the arc needs to be rendered.

§Arguments
  • angle: sets how much of a circle circumference is passed, e.g. PI is half a circle. This value should be in the range (-2 * PI..=2 * PI)
  • radius: distance between the arc and it’s center point
  • position: position of the arcs center point
  • rotation: defines orientation of the arc, by default we assume the arc is contained in a plane parallel to the XZ plane and the default starting point is (position + Vec3::X)
  • color: color of the arc
§Builder methods

The number of segments of the arc (i.e. the level of detail) can be adjusted with the .segments(...) method.

§Example
fn system(mut gizmos: Gizmos) {
    // rotation rotates normal to point in the direction of `Vec3::NEG_ONE`
    let rotation = Quat::from_rotation_arc(Vec3::Y, Vec3::NEG_ONE.normalize());

    gizmos
       .arc_3d(
         270.0_f32.to_radians(),
         0.25,
         Vec3::ONE,
         rotation,
         Color::ORANGE
         )
         .segments(100);
}
Examples found in repository?
examples/3d/3d_gizmos.rs (lines 111-117)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn short_arc_3d_between( &mut self, center: Vec3, from: Vec3, to: Vec3, color: Color ) -> Arc3dBuilder<'_, 'w, 's, T>

Draws the shortest arc between two points (from and to) relative to a specified center point.

§Arguments
  • center: The center point around which the arc is drawn.
  • from: The starting point of the arc.
  • to: The ending point of the arc.
  • color: color of the arc
§Builder methods

The number of segments of the arc (i.e. the level of detail) can be adjusted with the .segments(...) method.

§Examples
fn system(mut gizmos: Gizmos) {
    gizmos.short_arc_3d_between(
       Vec3::ONE,
       Vec3::ONE + Vec3::NEG_ONE,
       Vec3::ZERO,
       Color::ORANGE
       )
       .segments(100);
}
§Notes
  • This method assumes that the points from and to are distinct from center. If one of the points is coincident with center, nothing is rendered.
  • The arc is drawn as a portion of a circle with a radius equal to the distance from the center to from. If the distance from center to to is not equal to the radius, then the results will behave as if this were the case
source

pub fn long_arc_3d_between( &mut self, center: Vec3, from: Vec3, to: Vec3, color: Color ) -> Arc3dBuilder<'_, 'w, 's, T>

Draws the longest arc between two points (from and to) relative to a specified center point.

§Arguments
  • center: The center point around which the arc is drawn.
  • from: The starting point of the arc.
  • to: The ending point of the arc.
  • color: color of the arc
§Builder methods

The number of segments of the arc (i.e. the level of detail) can be adjusted with the .segments(...) method.

§Examples
fn system(mut gizmos: Gizmos) {
    gizmos.long_arc_3d_between(
       Vec3::ONE,
       Vec3::ONE + Vec3::NEG_ONE,
       Vec3::ZERO,
       Color::ORANGE
       )
       .segments(100);
}
§Notes
  • This method assumes that the points from and to are distinct from center. If one of the points is coincident with center, nothing is rendered.
  • The arc is drawn as a portion of a circle with a radius equal to the distance from the center to from. If the distance from center to to is not equal to the radius, then the results will behave as if this were the case.
source§

impl<'w, 's, T> Gizmos<'w, 's, T>

source

pub fn arrow( &mut self, start: Vec3, end: Vec3, color: Color ) -> ArrowBuilder<'_, 'w, 's, T>

Draw an arrow in 3D, from start to end. Has four tips for convenient viewing from any direction.

This should be called for each frame the arrow needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.arrow(Vec3::ZERO, Vec3::ONE, Color::GREEN);
}
Examples found in repository?
examples/3d/3d_gizmos.rs (line 130)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn arrow_2d( &mut self, start: Vec2, end: Vec2, color: Color ) -> ArrowBuilder<'_, 'w, 's, T>

Draw an arrow in 2D (on the xy plane), from start to end.

This should be called for each frame the arrow needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.arrow_2d(Vec2::ZERO, Vec2::X, Color::GREEN);
}
Examples found in repository?
examples/2d/2d_gizmos.rs (lines 76-80)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source§

impl<'w, 's, T> Gizmos<'w, 's, T>

source

pub fn ellipse( &mut self, position: Vec3, rotation: Quat, half_size: Vec2, color: Color ) -> EllipseBuilder<'_, 'w, 's, T>

Draw an ellipse in 3D at position with the flat side facing normal.

This should be called for each frame the ellipse needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.ellipse(Vec3::ZERO, Quat::IDENTITY, Vec2::new(1., 2.), Color::GREEN);

    // Ellipses have 32 line-segments by default.
    // You may want to increase this for larger ellipses.
    gizmos
        .ellipse(Vec3::ZERO, Quat::IDENTITY, Vec2::new(5., 1.), Color::RED)
        .segments(64);
}
source

pub fn ellipse_2d( &mut self, position: Vec2, angle: f32, half_size: Vec2, color: Color ) -> Ellipse2dBuilder<'_, 'w, 's, T>

Draw an ellipse in 2D.

This should be called for each frame the ellipse needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.ellipse_2d(Vec2::ZERO, 180.0_f32.to_radians(), Vec2::new(2., 1.), Color::GREEN);

    // Ellipses have 32 line-segments by default.
    // You may want to increase this for larger ellipses.
    gizmos
        .ellipse_2d(Vec2::ZERO, 180.0_f32.to_radians(), Vec2::new(5., 1.), Color::RED)
        .segments(64);
}
Examples found in repository?
examples/2d/2d_gizmos.rs (lines 61-66)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source

pub fn circle( &mut self, position: Vec3, normal: Direction3d, radius: f32, color: Color ) -> EllipseBuilder<'_, 'w, 's, T>

Draw a circle in 3D at position with the flat side facing normal.

This should be called for each frame the circle needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.circle(Vec3::ZERO, Direction3d::Z, 1., Color::GREEN);

    // Circles have 32 line-segments by default.
    // You may want to increase this for larger circles.
    gizmos
        .circle(Vec3::ZERO, Direction3d::Z, 5., Color::RED)
        .segments(64);
}
Examples found in repository?
examples/3d/3d_viewport_to_world.rs (lines 40-45)
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
fn draw_cursor(
    camera_query: Query<(&Camera, &GlobalTransform)>,
    ground_query: Query<&GlobalTransform, With<Ground>>,
    windows: Query<&Window>,
    mut gizmos: Gizmos,
) {
    let (camera, camera_transform) = camera_query.single();
    let ground = ground_query.single();

    let Some(cursor_position) = windows.single().cursor_position() else {
        return;
    };

    // Calculate a ray pointing from the camera into the world based on the cursor's position.
    let Some(ray) = camera.viewport_to_world(camera_transform, cursor_position) else {
        return;
    };

    // Calculate if and where the ray is hitting the ground plane.
    let Some(distance) = ray.intersect_plane(ground.translation(), Plane3d::new(ground.up()))
    else {
        return;
    };
    let point = ray.get_point(distance);

    // Draw a circle just above the ground plane at that position.
    gizmos.circle(
        point + ground.up() * 0.01,
        Direction3d::new_unchecked(ground.up()), // Up vector is already normalized.
        0.2,
        Color::WHITE,
    );
}
More examples
Hide additional examples
examples/3d/3d_gizmos.rs (line 121)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn circle_2d( &mut self, position: Vec2, radius: f32, color: Color ) -> Ellipse2dBuilder<'_, 'w, 's, T>

Draw a circle in 2D.

This should be called for each frame the circle needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.circle_2d(Vec2::ZERO, 1., Color::GREEN);

    // Circles have 32 line-segments by default.
    // You may want to increase this for larger circles.
    gizmos
        .circle_2d(Vec2::ZERO, 5., Color::RED)
        .segments(64);
}
Examples found in repository?
examples/2d/2d_viewport_to_world.rs (line 29)
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fn draw_cursor(
    camera_query: Query<(&Camera, &GlobalTransform)>,
    windows: Query<&Window>,
    mut gizmos: Gizmos,
) {
    let (camera, camera_transform) = camera_query.single();

    let Some(cursor_position) = windows.single().cursor_position() else {
        return;
    };

    // Calculate a world position based on the cursor's position.
    let Some(point) = camera.viewport_to_world_2d(camera_transform, cursor_position) else {
        return;
    };

    gizmos.circle_2d(point, 10., Color::WHITE);
}
More examples
Hide additional examples
examples/2d/bounding_2d.rs (line 190)
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
fn render_volumes(mut gizmos: Gizmos, query: Query<(&CurrentVolume, &Intersects)>) {
    for (volume, intersects) in query.iter() {
        let color = if **intersects {
            Color::CYAN
        } else {
            Color::ORANGE_RED
        };
        match volume {
            CurrentVolume::Aabb(a) => {
                gizmos.rect_2d(a.center(), 0., a.half_size() * 2., color);
            }
            CurrentVolume::Circle(c) => {
                gizmos.circle_2d(c.center(), c.radius(), color);
            }
        }
    }
}

#[derive(Component, Deref, DerefMut, Default)]
struct Intersects(bool);

const OFFSET_X: f32 = 125.;
const OFFSET_Y: f32 = 75.;

fn setup(mut commands: Commands, loader: Res<AssetServer>) {
    commands.spawn(Camera2dBundle::default());
    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(-OFFSET_X, OFFSET_Y, 0.),
            ..default()
        },
        Shape::Circle(Circle::new(45.)),
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(0., OFFSET_Y, 0.),
            ..default()
        },
        Shape::Rectangle(Rectangle::new(80., 80.)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(OFFSET_X, OFFSET_Y, 0.),
            ..default()
        },
        Shape::Triangle(Triangle2d::new(
            Vec2::new(-40., -40.),
            Vec2::new(-20., 40.),
            Vec2::new(40., 50.),
        )),
        Spin,
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(-OFFSET_X, -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Line(Segment2d::new(Direction2d::from_xy(1., 0.3).unwrap(), 90.)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(0., -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Capsule(Capsule2d::new(25., 50.)),
        Spin,
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(OFFSET_X, -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Polygon(RegularPolygon::new(50., 6)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn(
        TextBundle::from_section(
            "",
            TextStyle {
                font: loader.load("fonts/FiraMono-Medium.ttf"),
                font_size: 26.0,
                ..default()
            },
        )
        .with_style(Style {
            position_type: PositionType::Absolute,
            bottom: Val::Px(10.0),
            left: Val::Px(10.0),
            ..default()
        }),
    );
}

fn draw_ray(gizmos: &mut Gizmos, ray: &RayCast2d) {
    gizmos.line_2d(
        ray.ray.origin,
        ray.ray.origin + *ray.ray.direction * ray.max,
        Color::WHITE,
    );
    for r in [1., 2., 3.] {
        gizmos.circle_2d(ray.ray.origin, r, Color::FUCHSIA);
    }
}

fn get_and_draw_ray(gizmos: &mut Gizmos, time: &Time) -> RayCast2d {
    let ray = Vec2::new(time.elapsed_seconds().cos(), time.elapsed_seconds().sin());
    let dist = 150. + (0.5 * time.elapsed_seconds()).sin().abs() * 500.;

    let aabb_ray = Ray2d {
        origin: ray * 250.,
        direction: Direction2d::new_unchecked(-ray),
    };
    let ray_cast = RayCast2d::from_ray(aabb_ray, dist - 20.);

    draw_ray(gizmos, &ray_cast);
    ray_cast
}

fn ray_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match volume {
            CurrentVolume::Aabb(a) => ray_cast.aabb_intersection_at(a),
            CurrentVolume::Circle(c) => ray_cast.circle_intersection_at(c),
        };
        **intersects = toi.is_some();
        if let Some(toi) = toi {
            for r in [1., 2., 3.] {
                gizmos.circle_2d(
                    ray_cast.ray.origin + *ray_cast.ray.direction * toi,
                    r,
                    Color::GREEN,
                );
            }
        }
    }
}

fn aabb_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);
    let aabb_cast = AabbCast2d {
        aabb: Aabb2d::new(Vec2::ZERO, Vec2::splat(15.)),
        ray: ray_cast,
    };

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match *volume {
            CurrentVolume::Aabb(a) => aabb_cast.aabb_collision_at(a),
            CurrentVolume::Circle(_) => None,
        };

        **intersects = toi.is_some();
        if let Some(toi) = toi {
            gizmos.rect_2d(
                aabb_cast.ray.ray.origin
                    + *aabb_cast.ray.ray.direction * toi
                    + aabb_cast.aabb.center(),
                0.,
                aabb_cast.aabb.half_size() * 2.,
                Color::GREEN,
            );
        }
    }
}

fn bounding_circle_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);
    let circle_cast = BoundingCircleCast {
        circle: BoundingCircle::new(Vec2::ZERO, 15.),
        ray: ray_cast,
    };

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match *volume {
            CurrentVolume::Aabb(_) => None,
            CurrentVolume::Circle(c) => circle_cast.circle_collision_at(c),
        };

        **intersects = toi.is_some();
        if let Some(toi) = toi {
            gizmos.circle_2d(
                circle_cast.ray.ray.origin
                    + *circle_cast.ray.ray.direction * toi
                    + circle_cast.circle.center(),
                circle_cast.circle.radius(),
                Color::GREEN,
            );
        }
    }
}

fn get_intersection_position(time: &Time) -> Vec2 {
    let x = (0.8 * time.elapsed_seconds()).cos() * 250.;
    let y = (0.4 * time.elapsed_seconds()).sin() * 100.;
    Vec2::new(x, y)
}

fn aabb_intersection_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let center = get_intersection_position(&time);
    let aabb = Aabb2d::new(center, Vec2::splat(50.));
    gizmos.rect_2d(center, 0., aabb.half_size() * 2., Color::YELLOW);

    for (volume, mut intersects) in volumes.iter_mut() {
        let hit = match volume {
            CurrentVolume::Aabb(a) => aabb.intersects(a),
            CurrentVolume::Circle(c) => aabb.intersects(c),
        };

        **intersects = hit;
    }
}

fn circle_intersection_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let center = get_intersection_position(&time);
    let circle = BoundingCircle::new(center, 50.);
    gizmos.circle_2d(center, circle.radius(), Color::YELLOW);

    for (volume, mut intersects) in volumes.iter_mut() {
        let hit = match volume {
            CurrentVolume::Aabb(a) => circle.intersects(a),
            CurrentVolume::Circle(c) => circle.intersects(c),
        };

        **intersects = hit;
    }
}
examples/2d/2d_gizmos.rs (line 60)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source§

impl<'w, 's, T> Gizmos<'w, 's, T>

source

pub fn line(&mut self, start: Vec3, end: Vec3, color: Color)

Draw a line in 3D from start to end.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.line(Vec3::ZERO, Vec3::X, Color::GREEN);
}
Examples found in repository?
examples/stress_tests/many_gizmos.rs (line 67)
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
fn system(config: Res<Config>, time: Res<Time>, mut draw: Gizmos) {
    if !config.fancy {
        for _ in 0..(config.line_count / SYSTEM_COUNT) {
            draw.line(Vec3::NEG_Y, Vec3::Y, Color::BLACK);
        }
    } else {
        for i in 0..(config.line_count / SYSTEM_COUNT) {
            let angle = i as f32 / (config.line_count / SYSTEM_COUNT) as f32 * TAU;

            let vector = Vec2::from(angle.sin_cos()).extend(time.elapsed_seconds().sin());
            let start_color = Color::rgb(vector.x, vector.z, 0.5);
            let end_color = Color::rgb(-vector.z, -vector.y, 0.5);

            draw.line_gradient(vector, -vector, start_color, end_color);
        }
    }
}
source

pub fn line_gradient( &mut self, start: Vec3, end: Vec3, start_color: Color, end_color: Color )

Draw a line in 3D with a color gradient from start to end.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.line_gradient(Vec3::ZERO, Vec3::X, Color::GREEN, Color::RED);
}
Examples found in repository?
examples/stress_tests/many_gizmos.rs (line 77)
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
fn system(config: Res<Config>, time: Res<Time>, mut draw: Gizmos) {
    if !config.fancy {
        for _ in 0..(config.line_count / SYSTEM_COUNT) {
            draw.line(Vec3::NEG_Y, Vec3::Y, Color::BLACK);
        }
    } else {
        for i in 0..(config.line_count / SYSTEM_COUNT) {
            let angle = i as f32 / (config.line_count / SYSTEM_COUNT) as f32 * TAU;

            let vector = Vec2::from(angle.sin_cos()).extend(time.elapsed_seconds().sin());
            let start_color = Color::rgb(vector.x, vector.z, 0.5);
            let end_color = Color::rgb(-vector.z, -vector.y, 0.5);

            draw.line_gradient(vector, -vector, start_color, end_color);
        }
    }
}
source

pub fn ray(&mut self, start: Vec3, vector: Vec3, color: Color)

Draw a line in 3D from start to start + vector.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.ray(Vec3::Y, Vec3::X, Color::GREEN);
}
Examples found in repository?
examples/3d/3d_gizmos.rs (lines 103-107)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn ray_gradient( &mut self, start: Vec3, vector: Vec3, start_color: Color, end_color: Color )

Draw a line in 3D with a color gradient from start to start + vector.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.ray_gradient(Vec3::Y, Vec3::X, Color::GREEN, Color::RED);
}
source

pub fn linestrip( &mut self, positions: impl IntoIterator<Item = Vec3>, color: Color )

Draw a line in 3D made of straight segments between the points.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.linestrip([Vec3::ZERO, Vec3::X, Vec3::Y], Color::GREEN);
}
Examples found in repository?
examples/animation/cubic_curve.rs (line 80)
75
76
77
78
79
80
81
82
83
84
85
fn animate_cube(time: Res<Time>, mut query: Query<(&mut Transform, &Curve)>, mut gizmos: Gizmos) {
    let t = (time.elapsed_seconds().sin() + 1.) / 2.;

    for (mut transform, cubic_curve) in &mut query {
        // Draw the curve
        gizmos.linestrip(cubic_curve.0.iter_positions(50), Color::WHITE);
        // position takes a point from the curve where 0 is the initial point
        // and 1 is the last point
        transform.translation = cubic_curve.0.position(t);
    }
}
source

pub fn linestrip_gradient( &mut self, points: impl IntoIterator<Item = (Vec3, Color)> )

Draw a line in 3D made of straight segments between the points, with a color gradient.

This should be called for each frame the lines need to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.linestrip_gradient([
        (Vec3::ZERO, Color::GREEN),
        (Vec3::X, Color::RED),
        (Vec3::Y, Color::BLUE)
    ]);
}
source

pub fn sphere( &mut self, position: Vec3, rotation: Quat, radius: f32, color: Color ) -> SphereBuilder<'_, 'w, 's, T>

Draw a wireframe sphere in 3D made out of 3 circles around the axes.

This should be called for each frame the sphere needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.sphere(Vec3::ZERO, Quat::IDENTITY, 1., Color::BLACK);

    // Each circle has 32 line-segments by default.
    // You may want to increase this for larger spheres.
    gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 5., Color::BLACK)
        .circle_segments(64);
}
Examples found in repository?
examples/3d/3d_gizmos.rs (line 100)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn rect(&mut self, position: Vec3, rotation: Quat, size: Vec2, color: Color)

Draw a wireframe rectangle in 3D.

This should be called for each frame the rectangle needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.rect(Vec3::ZERO, Quat::IDENTITY, Vec2::ONE, Color::GREEN);
}
Examples found in repository?
examples/3d/3d_gizmos.rs (lines 93-98)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn cuboid(&mut self, transform: impl TransformPoint, color: Color)

Draw a wireframe cube in 3D.

This should be called for each frame the cube needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.cuboid(Transform::IDENTITY, Color::GREEN);
}
Examples found in repository?
examples/3d/irradiance_volumes.rs (line 637)
630
631
632
633
634
635
636
637
638
639
640
fn draw_gizmo(
    mut gizmos: Gizmos,
    irradiance_volume_query: Query<&GlobalTransform, With<IrradianceVolume>>,
    app_status: Res<AppStatus>,
) {
    if app_status.voxels_visible {
        for transform in irradiance_volume_query.iter() {
            gizmos.cuboid(*transform, GIZMO_COLOR);
        }
    }
}
More examples
Hide additional examples
examples/3d/3d_gizmos.rs (lines 89-92)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    gizmos.cuboid(
        Transform::from_translation(Vec3::Y * 0.5).with_scale(Vec3::splat(1.25)),
        Color::BLACK,
    );
    gizmos.rect(
        Vec3::new(time.elapsed_seconds().cos() * 2.5, 1., 0.),
        Quat::from_rotation_y(PI / 2.),
        Vec2::splat(2.),
        Color::GREEN,
    );

    my_gizmos.sphere(Vec3::new(1., 0.5, 0.), Quat::IDENTITY, 0.5, Color::RED);

    for y in [0., 0.5, 1.] {
        gizmos.ray(
            Vec3::new(1., y, 0.),
            Vec3::new(-3., (time.elapsed_seconds() * 3.).sin(), 0.),
            Color::BLUE,
        );
    }

    my_gizmos
        .arc_3d(
            180.0_f32.to_radians(),
            0.2,
            Vec3::ONE,
            Quat::from_rotation_arc(Vec3::Y, Vec3::ONE.normalize()),
            Color::ORANGE,
        )
        .segments(10);

    // Circles have 32 line-segments by default.
    my_gizmos.circle(Vec3::ZERO, Direction3d::Y, 3., Color::BLACK);
    // You may want to increase this for larger circles or spheres.
    my_gizmos
        .circle(Vec3::ZERO, Direction3d::Y, 3.1, Color::NAVY)
        .segments(64);
    my_gizmos
        .sphere(Vec3::ZERO, Quat::IDENTITY, 3.2, Color::BLACK)
        .circle_segments(64);

    gizmos.arrow(Vec3::ZERO, Vec3::ONE * 1.5, Color::YELLOW);
}
source

pub fn line_2d(&mut self, start: Vec2, end: Vec2, color: Color)

Draw a line in 2D from start to end.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.line_2d(Vec2::ZERO, Vec2::X, Color::GREEN);
}
Examples found in repository?
examples/2d/bounding_2d.rs (lines 292-296)
291
292
293
294
295
296
297
298
299
300
fn draw_ray(gizmos: &mut Gizmos, ray: &RayCast2d) {
    gizmos.line_2d(
        ray.ray.origin,
        ray.ray.origin + *ray.ray.direction * ray.max,
        Color::WHITE,
    );
    for r in [1., 2., 3.] {
        gizmos.circle_2d(ray.ray.origin, r, Color::FUCHSIA);
    }
}
More examples
Hide additional examples
examples/2d/2d_gizmos.rs (line 41)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source

pub fn line_gradient_2d( &mut self, start: Vec2, end: Vec2, start_color: Color, end_color: Color )

Draw a line in 2D with a color gradient from start to end.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.line_gradient_2d(Vec2::ZERO, Vec2::X, Color::GREEN, Color::RED);
}
source

pub fn linestrip_2d( &mut self, positions: impl IntoIterator<Item = Vec2>, color: Color )

Draw a line in 2D made of straight segments between the points.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.linestrip_2d([Vec2::ZERO, Vec2::X, Vec2::Y], Color::GREEN);
}
source

pub fn linestrip_gradient_2d( &mut self, positions: impl IntoIterator<Item = (Vec2, Color)> )

Draw a line in 2D made of straight segments between the points, with a color gradient.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.linestrip_gradient_2d([
        (Vec2::ZERO, Color::GREEN),
        (Vec2::X, Color::RED),
        (Vec2::Y, Color::BLUE)
    ]);
}
Examples found in repository?
examples/2d/2d_gizmos.rs (lines 45-50)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source

pub fn ray_2d(&mut self, start: Vec2, vector: Vec2, color: Color)

Draw a line in 2D from start to start + vector.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.ray_2d(Vec2::Y, Vec2::X, Color::GREEN);
}
Examples found in repository?
examples/2d/2d_gizmos.rs (line 42)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}
source

pub fn ray_gradient_2d( &mut self, start: Vec2, vector: Vec2, start_color: Color, end_color: Color )

Draw a line in 2D with a color gradient from start to start + vector.

This should be called for each frame the line needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.line_gradient(Vec3::Y, Vec3::X, Color::GREEN, Color::RED);
}
source

pub fn rect_2d( &mut self, position: Vec2, rotation: f32, size: Vec2, color: Color )

Draw a wireframe rectangle in 2D.

This should be called for each frame the rectangle needs to be rendered.

§Example
fn system(mut gizmos: Gizmos) {
    gizmos.rect_2d(Vec2::ZERO, 0., Vec2::ONE, Color::GREEN);
}
Examples found in repository?
examples/2d/bounding_2d.rs (line 187)
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
fn render_volumes(mut gizmos: Gizmos, query: Query<(&CurrentVolume, &Intersects)>) {
    for (volume, intersects) in query.iter() {
        let color = if **intersects {
            Color::CYAN
        } else {
            Color::ORANGE_RED
        };
        match volume {
            CurrentVolume::Aabb(a) => {
                gizmos.rect_2d(a.center(), 0., a.half_size() * 2., color);
            }
            CurrentVolume::Circle(c) => {
                gizmos.circle_2d(c.center(), c.radius(), color);
            }
        }
    }
}

#[derive(Component, Deref, DerefMut, Default)]
struct Intersects(bool);

const OFFSET_X: f32 = 125.;
const OFFSET_Y: f32 = 75.;

fn setup(mut commands: Commands, loader: Res<AssetServer>) {
    commands.spawn(Camera2dBundle::default());
    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(-OFFSET_X, OFFSET_Y, 0.),
            ..default()
        },
        Shape::Circle(Circle::new(45.)),
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(0., OFFSET_Y, 0.),
            ..default()
        },
        Shape::Rectangle(Rectangle::new(80., 80.)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(OFFSET_X, OFFSET_Y, 0.),
            ..default()
        },
        Shape::Triangle(Triangle2d::new(
            Vec2::new(-40., -40.),
            Vec2::new(-20., 40.),
            Vec2::new(40., 50.),
        )),
        Spin,
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(-OFFSET_X, -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Line(Segment2d::new(Direction2d::from_xy(1., 0.3).unwrap(), 90.)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(0., -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Capsule(Capsule2d::new(25., 50.)),
        Spin,
        DesiredVolume::Aabb,
        Intersects::default(),
    ));

    commands.spawn((
        SpatialBundle {
            transform: Transform::from_xyz(OFFSET_X, -OFFSET_Y, 0.),
            ..default()
        },
        Shape::Polygon(RegularPolygon::new(50., 6)),
        Spin,
        DesiredVolume::Circle,
        Intersects::default(),
    ));

    commands.spawn(
        TextBundle::from_section(
            "",
            TextStyle {
                font: loader.load("fonts/FiraMono-Medium.ttf"),
                font_size: 26.0,
                ..default()
            },
        )
        .with_style(Style {
            position_type: PositionType::Absolute,
            bottom: Val::Px(10.0),
            left: Val::Px(10.0),
            ..default()
        }),
    );
}

fn draw_ray(gizmos: &mut Gizmos, ray: &RayCast2d) {
    gizmos.line_2d(
        ray.ray.origin,
        ray.ray.origin + *ray.ray.direction * ray.max,
        Color::WHITE,
    );
    for r in [1., 2., 3.] {
        gizmos.circle_2d(ray.ray.origin, r, Color::FUCHSIA);
    }
}

fn get_and_draw_ray(gizmos: &mut Gizmos, time: &Time) -> RayCast2d {
    let ray = Vec2::new(time.elapsed_seconds().cos(), time.elapsed_seconds().sin());
    let dist = 150. + (0.5 * time.elapsed_seconds()).sin().abs() * 500.;

    let aabb_ray = Ray2d {
        origin: ray * 250.,
        direction: Direction2d::new_unchecked(-ray),
    };
    let ray_cast = RayCast2d::from_ray(aabb_ray, dist - 20.);

    draw_ray(gizmos, &ray_cast);
    ray_cast
}

fn ray_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match volume {
            CurrentVolume::Aabb(a) => ray_cast.aabb_intersection_at(a),
            CurrentVolume::Circle(c) => ray_cast.circle_intersection_at(c),
        };
        **intersects = toi.is_some();
        if let Some(toi) = toi {
            for r in [1., 2., 3.] {
                gizmos.circle_2d(
                    ray_cast.ray.origin + *ray_cast.ray.direction * toi,
                    r,
                    Color::GREEN,
                );
            }
        }
    }
}

fn aabb_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);
    let aabb_cast = AabbCast2d {
        aabb: Aabb2d::new(Vec2::ZERO, Vec2::splat(15.)),
        ray: ray_cast,
    };

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match *volume {
            CurrentVolume::Aabb(a) => aabb_cast.aabb_collision_at(a),
            CurrentVolume::Circle(_) => None,
        };

        **intersects = toi.is_some();
        if let Some(toi) = toi {
            gizmos.rect_2d(
                aabb_cast.ray.ray.origin
                    + *aabb_cast.ray.ray.direction * toi
                    + aabb_cast.aabb.center(),
                0.,
                aabb_cast.aabb.half_size() * 2.,
                Color::GREEN,
            );
        }
    }
}

fn bounding_circle_cast_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let ray_cast = get_and_draw_ray(&mut gizmos, &time);
    let circle_cast = BoundingCircleCast {
        circle: BoundingCircle::new(Vec2::ZERO, 15.),
        ray: ray_cast,
    };

    for (volume, mut intersects) in volumes.iter_mut() {
        let toi = match *volume {
            CurrentVolume::Aabb(_) => None,
            CurrentVolume::Circle(c) => circle_cast.circle_collision_at(c),
        };

        **intersects = toi.is_some();
        if let Some(toi) = toi {
            gizmos.circle_2d(
                circle_cast.ray.ray.origin
                    + *circle_cast.ray.ray.direction * toi
                    + circle_cast.circle.center(),
                circle_cast.circle.radius(),
                Color::GREEN,
            );
        }
    }
}

fn get_intersection_position(time: &Time) -> Vec2 {
    let x = (0.8 * time.elapsed_seconds()).cos() * 250.;
    let y = (0.4 * time.elapsed_seconds()).sin() * 100.;
    Vec2::new(x, y)
}

fn aabb_intersection_system(
    mut gizmos: Gizmos,
    time: Res<Time>,
    mut volumes: Query<(&CurrentVolume, &mut Intersects)>,
) {
    let center = get_intersection_position(&time);
    let aabb = Aabb2d::new(center, Vec2::splat(50.));
    gizmos.rect_2d(center, 0., aabb.half_size() * 2., Color::YELLOW);

    for (volume, mut intersects) in volumes.iter_mut() {
        let hit = match volume {
            CurrentVolume::Aabb(a) => aabb.intersects(a),
            CurrentVolume::Circle(c) => aabb.intersects(c),
        };

        **intersects = hit;
    }
}
More examples
Hide additional examples
examples/2d/2d_gizmos.rs (lines 52-57)
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
fn draw_example_collection(
    mut gizmos: Gizmos,
    mut my_gizmos: Gizmos<MyRoundGizmos>,
    time: Res<Time>,
) {
    let sin = time.elapsed_seconds().sin() * 50.;
    gizmos.line_2d(Vec2::Y * -sin, Vec2::splat(-80.), Color::RED);
    gizmos.ray_2d(Vec2::Y * sin, Vec2::splat(80.), Color::GREEN);

    // Triangle
    gizmos.linestrip_gradient_2d([
        (Vec2::Y * 300., Color::BLUE),
        (Vec2::new(-255., -155.), Color::RED),
        (Vec2::new(255., -155.), Color::GREEN),
        (Vec2::Y * 300., Color::BLUE),
    ]);

    gizmos.rect_2d(
        Vec2::ZERO,
        time.elapsed_seconds() / 3.,
        Vec2::splat(300.),
        Color::BLACK,
    );

    // The circles have 32 line-segments by default.
    my_gizmos.circle_2d(Vec2::ZERO, 120., Color::BLACK);
    my_gizmos.ellipse_2d(
        Vec2::ZERO,
        time.elapsed_seconds() % TAU,
        Vec2::new(100., 200.),
        Color::YELLOW_GREEN,
    );
    // You may want to increase this for larger circles.
    my_gizmos
        .circle_2d(Vec2::ZERO, 300., Color::NAVY)
        .segments(64);

    // Arcs default amount of segments is linearly interpolated between
    // 1 and 32, using the arc length as scalar.
    my_gizmos.arc_2d(Vec2::ZERO, sin / 10., PI / 2., 350., Color::ORANGE_RED);

    gizmos.arrow_2d(
        Vec2::ZERO,
        Vec2::from_angle(sin / -10. + PI / 2.) * 50.,
        Color::YELLOW,
    );
}

Trait Implementations§

source§

impl<'w, 's, T> GizmoPrimitive2d<BoxedPolygon> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: BoxedPolygon, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<BoxedPolygon>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<BoxedPolyline2d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: BoxedPolyline2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<BoxedPolyline2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Capsule2d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Capsule2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Capsule2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Circle> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Circle, position: Vec2, _angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Circle>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Direction2d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Direction2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Direction2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Ellipse> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Ellipse, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Ellipse>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Line2d> for Gizmos<'w, 's, T>

§

type Output<'a> = Line2dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Line2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Line2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Plane2d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Plane2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Plane2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, const N: usize, T> GizmoPrimitive2d<Polygon<N>> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Polygon<N>, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Polygon<N>>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, const N: usize, T> GizmoPrimitive2d<Polyline2d<N>> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Polyline2d<N>, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Polyline2d<N>>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Rectangle> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Rectangle, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Rectangle>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<RegularPolygon> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: RegularPolygon, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<RegularPolygon>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Segment2d> for Gizmos<'w, 's, T>

§

type Output<'a> = Segment2dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Segment2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Segment2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive2d<Triangle2d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_2d. This is a builder to set non-default values.
source§

fn primitive_2d( &mut self, primitive: Triangle2d, position: Vec2, angle: f32, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive2d<Triangle2d>>::Output<'_>

Renders a 2D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<BoxedPolyline3d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: BoxedPolyline3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<BoxedPolyline3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Capsule3d> for Gizmos<'w, 's, T>

§

type Output<'a> = Capsule3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Capsule3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Capsule3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Cone> for Gizmos<'w, 's, T>

§

type Output<'a> = Cone3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Cone, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Cone>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<ConicalFrustum> for Gizmos<'w, 's, T>

§

type Output<'a> = ConicalFrustum3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: ConicalFrustum, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<ConicalFrustum>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Cuboid> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Cuboid, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Cuboid>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Cylinder> for Gizmos<'w, 's, T>

§

type Output<'a> = Cylinder3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Cylinder, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Cylinder>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Direction3d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Direction3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Direction3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Line3d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Line3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Line3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Plane3d> for Gizmos<'w, 's, T>

§

type Output<'a> = Plane3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Plane3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Plane3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, const N: usize, T> GizmoPrimitive3d<Polyline3d<N>> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Polyline3d<N>, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Polyline3d<N>>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Segment3d> for Gizmos<'w, 's, T>

§

type Output<'a> = () where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Segment3d, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Segment3d>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Sphere> for Gizmos<'w, 's, T>

§

type Output<'a> = SphereBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Sphere, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Sphere>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<'w, 's, T> GizmoPrimitive3d<Torus> for Gizmos<'w, 's, T>

§

type Output<'a> = Torus3dBuilder<'a, 'w, 's, T> where Gizmos<'w, 's, T>: 'a

The output of primitive_3d. This is a builder to set non-default values.
source§

fn primitive_3d( &mut self, primitive: Torus, position: Vec3, rotation: Quat, color: Color ) -> <Gizmos<'w, 's, T> as GizmoPrimitive3d<Torus>>::Output<'_>

Renders a 3D primitive with its associated details.
source§

impl<T> SystemParam for Gizmos<'_, '_, T>

§

type State = GizmosFetchState<T>

Used to store data which persists across invocations of a system.
§

type Item<'w, 's> = Gizmos<'w, 's, T>

The item type returned when constructing this system param. The value of this associated type should be Self, instantiated with new lifetimes. Read more
source§

fn init_state( world: &mut World, system_meta: &mut SystemMeta ) -> <Gizmos<'_, '_, T> as SystemParam>::State

Registers any World access used by this SystemParam and creates a new instance of this param’s State.
source§

fn new_archetype( state: &mut <Gizmos<'_, '_, T> as SystemParam>::State, archetype: &Archetype, system_meta: &mut SystemMeta )

For the specified Archetype, registers the components accessed by this SystemParam (if applicable).
source§

fn apply( state: &mut <Gizmos<'_, '_, T> as SystemParam>::State, system_meta: &SystemMeta, world: &mut World )

Applies any deferred mutations stored in this SystemParam’s state. This is used to apply Commands during apply_deferred.
source§

unsafe fn get_param<'w, 's>( state: &'s mut <Gizmos<'_, '_, T> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick ) -> <Gizmos<'_, '_, T> as SystemParam>::Item<'w, 's>

Creates a parameter to be passed into a SystemParamFunction. Read more
source§

impl<'w, 's, T> ReadOnlySystemParam for Gizmos<'w, 's, T>

Auto Trait Implementations§

§

impl<'w, 's, T> Freeze for Gizmos<'w, 's, T>
where T: Default + TypePath + Reflect + Sync + Send + Any + DynamicTypePath + 'static,

§

impl<'w, 's, T> RefUnwindSafe for Gizmos<'w, 's, T>
where T: Default + TypePath + Reflect + Sync + Send + Any + DynamicTypePath + 'static + RefUnwindSafe,

§

impl<'w, 's, T> Send for Gizmos<'w, 's, T>
where T: Default + TypePath + Reflect + Sync + Send + Any + DynamicTypePath + 'static,

§

impl<'w, 's, T> Sync for Gizmos<'w, 's, T>
where T: Default + TypePath + Reflect + Sync + Send + Any + DynamicTypePath + 'static,

§

impl<'w, 's, T> Unpin for Gizmos<'w, 's, T>
where T: Default + TypePath + Reflect + Sync + Send + Any + DynamicTypePath + 'static,

§

impl<'w, 's, T = DefaultGizmoConfigGroup> !UnwindSafe for Gizmos<'w, 's, T>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Downcast<T> for T

source§

fn downcast(&self) -> &T

source§

impl<T> Downcast for T
where T: Any,

source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<S> FromSample<S> for S

source§

fn from_sample_(s: S) -> S

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

source§

fn to_sample_(self) -> U

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> Upcast<T> for T

source§

fn upcast(&self) -> Option<&T>

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

source§

impl<T> Settings for T
where T: 'static + Send + Sync,

source§

impl<T> WasmNotSend for T
where T: Send,

source§

impl<T> WasmNotSendSync for T

source§

impl<T> WasmNotSync for T
where T: Sync,