canvas_recursion/
canvas_recursion.rs

1// Demonstrates drawing a canvas image inside itself
2
3use bevy::{color::palettes::css::*, prelude::*};
4use bevy_vector_shapes::prelude::*;
5
6fn main() {
7    App::new()
8        .add_plugins(DefaultPlugins)
9        .add_plugins(ShapePlugin::default())
10        .insert_resource(ClearColor(DIM_GRAY.into()))
11        .add_systems(Startup, setup)
12        .add_systems(Update, draw_shapes)
13        .run();
14}
15
16fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
17    let config = CanvasConfig::new(1024, 1024);
18    commands.spawn_canvas(images.as_mut(), config);
19
20    commands.spawn((
21        Camera3d::default(),
22        Transform::from_xyz(0., 0., 16.).looking_at(Vec3::ZERO, Vec3::Y),
23        Msaa::Off,
24    ));
25}
26
27fn draw_shapes(time: Res<Time>, mut painter: ShapePainter, canvas: Single<(Entity, &Canvas)>) {
28    let (canvas_e, canvas) = canvas.into_inner();
29    painter.image(canvas.image.clone(), Vec2::splat(12.));
30
31    painter.set_canvas(canvas_e);
32    painter.hollow = true;
33    painter.thickness = 16.0;
34    painter.set_color(SEA_GREEN + Srgba::WHITE * 0.25);
35    painter.rect(Vec2::splat(1024.0));
36
37    painter.rotate_z(time.elapsed_secs().sin());
38    painter.image(canvas.image.clone(), Vec2::splat(980.0));
39
40    painter.reset();
41}