1
2
3
4
5
6
7
8
9
10
11
12
13
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
47
48
49
50
51
52
53
54
55
56
// Demonstrates the various canvas modes
// Press Space to request a redraw and M to cycle through the various modes

use bevy::prelude::*;
use bevy_vector_shapes::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugin(ShapePlugin::default())
        .insert_resource(ClearColor(Color::DARK_GRAY))
        .add_startup_system(setup)
        .add_system(draw_shapes)
        .add_system(update_canvas)
        .run();
}

fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
    let config = CanvasConfig::new(1024, 1024);
    commands.spawn_canvas(images.as_mut(), config);

    commands.spawn(Camera3dBundle {
        transform: Transform::from_xyz(0., 0., 16.).looking_at(Vec3::ZERO, Vec3::Y),
        ..default()
    });
}

fn update_canvas(keys: Res<Input<KeyCode>>, mut canvas: Query<&mut Canvas>) {
    let mut canvas = canvas.single_mut();

    if keys.just_pressed(KeyCode::Space) {
        canvas.redraw();
    }

    if keys.just_pressed(KeyCode::M) {
        canvas.mode = match canvas.mode {
            CanvasMode::Continuous => CanvasMode::Persistent,
            CanvasMode::Persistent => CanvasMode::OnDemand,
            CanvasMode::OnDemand => CanvasMode::Continuous,
        }
    }
}

fn draw_shapes(time: Res<Time>, mut painter: ShapePainter, canvas: Query<(Entity, &Canvas)>) {
    let (canvas_e, canvas) = canvas.single();
    painter.image(canvas.image.clone(), Vec2::splat(20.));

    painter.set_canvas(canvas_e);
    painter.hollow = true;
    painter.thickness = 6.0;
    painter.color = Color::CRIMSON;
    painter.translate(Vec3::Y * time.elapsed_seconds().sin() * 256.0);
    painter.circle(48.0);

    painter.reset();
}