flatbox_systems 0.1.0

ECS systems for Flatbox engine
Documentation
use anyhow::Result;
use flatbox_core::math::transform::Transform;
use flatbox_ecs::{SubWorld, Write};
use flatbox_render::{
    pbr::{
        material::Material, 
        model::Model, camera::Camera,
    }, 
    renderer::{Renderer, PrepareModelCommand, DrawModelCommand, ClearCommand, RenderCameraCommand}, 
    error::RenderError,
};

pub fn clear_screen(mut renderer: Write<Renderer>) -> Result<()> {
    renderer.execute(&mut ClearCommand(0.1, 0.1, 0.1))?;
    
    Ok(())
}

pub fn bind_material<M: Material>(mut renderer: Write<Renderer>) {
    renderer.bind_material::<M>();
}

pub fn render_material<M: Material>(
    model_world: SubWorld<(&mut Model, &M, &Transform)>,
    camera_world: SubWorld<(&mut Camera, &Transform)>,
    mut renderer: Write<Renderer>,
) -> Result<()> {
    let mut found_active_camera = false;

    for (_, (mut camera, transform)) in &mut camera_world.query::<(&mut Camera, &Transform)>() {
        if camera.is_active() {
            if found_active_camera {
                Err(RenderError::MultipleActiveCameras)?;
            } else {
                found_active_camera = true;

                renderer.execute(&mut RenderCameraCommand::<M>::new(&mut camera, transform))?;
                for (_, (mut model, material, transform)) in &mut model_world.query::<(&mut Model, &M, &Transform)>() {
                    renderer.execute(&mut PrepareModelCommand::new(&mut model, material))?;
                    renderer.execute(&mut DrawModelCommand::new(&model, material, transform))?;
                }
            }
        }
    }

    Ok(())
}