bevy_pixel_buffer 0.3.0

A library to draw pixels in bevy
Documentation
use bevy::prelude::*;
use bevy_egui::{egui, EguiContext, EguiPlugin};
use bevy_pixel_buffer::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugin(EguiPlugin)
        .add_plugins(PixelBufferPlugins)
        .add_startup_system(setup)
        .add_system(update)
        .add_system(delete)
        .insert_resource(NextId(1))
        .run()
}

#[derive(Component)]
struct MyBuffer {
    shown: bool,
    id: usize,
}

#[derive(Resource)]
struct NextId(usize);

impl NextId {
    fn get(&mut self) -> usize {
        let id = self.0;
        self.0 += 1;
        id
    }
}

const SIZE: PixelBufferSize = PixelBufferSize {
    size: UVec2 { x: 9, y: 9 },
    pixel_size: UVec2 { x: 10, y: 10 },
};

fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>, mut id: ResMut<NextId>) {
    const COLORS: [[f32; 3]; 3] = [[1.0, 0.2, 0.2], [0.2, 1.0, 0.2], [0.2, 0.2, 1.0]];

    for i in 0..3 {
        insert_pixel_buffer(&mut commands, &mut images, &COLORS[i], id.get());
    }
}

fn update(
    mut commands: Commands,
    mut egui_context: ResMut<EguiContext>,
    mut images: ResMut<Assets<Image>>,
    mut buffers: Query<(&mut MyBuffer, &EguiTexture)>,
    mut id: ResMut<NextId>,
    mut new_color: Local<[f32; 3]>,
) {
    let ctx = egui_context.ctx_mut();

    egui::Window::new("Add new").show(ctx, |ui| {
        ui.color_edit_button_rgb(&mut new_color);
        if ui.button("Add new").clicked() {
            insert_pixel_buffer(&mut commands, &mut images, &new_color, id.get())
        }
    });

    for (mut buffer, texture) in buffers.iter_mut() {
        egui::Window::new(format!("Buffer {}", buffer.id))
            .collapsible(false)
            .open(&mut buffer.shown)
            .show(ctx, |ui| ui.image(texture.id, texture.size));
    }
}

fn delete(mut commands: Commands, buffers: Query<(Entity, &mut MyBuffer)>) {
    for (entity, buffer) in buffers.iter() {
        if !buffer.shown {
            commands.entity(entity).despawn();
        }
    }
}

fn insert_pixel_buffer(
    commands: &mut Commands,
    images: &mut Assets<Image>,
    color: &[f32; 3],
    id: usize,
) {
    PixelBufferBuilder::new()
        .with_render(false)
        .with_size(SIZE)
        .spawn(commands, images)
        .edit_frame(|frame| {
            let size = frame.size();
            frame.per_pixel(|p, _| {
                let a = if (p.x + p.y * size.x) % 2 == 0 {
                    1.0
                } else {
                    0.8
                };
                Color::rgba_linear(color[0], color[1], color[2], a)
            });
        })
        .entity()
        .insert(MyBuffer { shown: true, id });
}