canvas_modes/
canvas_modes.rs

1// Demonstrates the various canvas modes
2// Press Space to request a redraw and M to cycle through the various modes
3
4use bevy::{color::palettes::css::*, prelude::*};
5use bevy_vector_shapes::prelude::*;
6
7fn main() {
8    App::new()
9        .add_plugins(DefaultPlugins)
10        .add_plugins(ShapePlugin::default())
11        .insert_resource(ClearColor(DIM_GRAY.into()))
12        .add_systems(Startup, setup)
13        .add_systems(Update, (draw_shapes, update_canvas))
14        .run();
15}
16
17fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
18    let config = CanvasConfig::new(1024, 1024);
19    commands.spawn_canvas(images.as_mut(), config);
20
21    commands.spawn((
22        Camera3d::default(),
23        Transform::from_xyz(0., 0., 16.).looking_at(Vec3::ZERO, Vec3::Y),
24        Msaa::Off,
25    ));
26}
27
28fn update_canvas(keys: Res<ButtonInput<KeyCode>>, mut canvas: Single<&mut Canvas>) {
29    if keys.just_pressed(KeyCode::Space) {
30        canvas.redraw();
31    }
32
33    if keys.just_pressed(KeyCode::KeyM) {
34        canvas.mode = match canvas.mode {
35            CanvasMode::Continuous => CanvasMode::Persistent,
36            CanvasMode::Persistent => CanvasMode::OnDemand,
37            CanvasMode::OnDemand => CanvasMode::Continuous,
38        }
39    }
40}
41
42fn draw_shapes(time: Res<Time>, mut painter: ShapePainter, canvas: Single<(Entity, &Canvas)>) {
43    let (canvas_e, canvas) = canvas.into_inner();
44    painter.image(canvas.image.clone(), Vec2::splat(20.));
45
46    painter.set_canvas(canvas_e);
47    painter.hollow = true;
48    painter.thickness = 6.0;
49    painter.set_color(CRIMSON);
50    painter.translate(Vec3::Y * time.elapsed_secs().sin() * 256.0);
51    painter.circle(48.0);
52
53    painter.reset();
54}