use crate::{engine::Engine, resources::Resources, EngineResult};
pub trait System {
fn run(&mut self, engine: &mut Engine, resources: &mut Resources) -> EngineResult<()>;
}
pub enum SystemSet {
Startup(Vec<Box<dyn System>>),
Update(Vec<Box<dyn System>>),
Render(Vec<Box<dyn System>>),
}
impl<F> System for F
where
F: FnMut(&mut Engine, &mut Resources) -> EngineResult<()>,
{
fn run(&mut self, engine: &mut Engine, resources: &mut Resources) -> EngineResult<()> {
self(engine, resources)
}
}
#[macro_export]
macro_rules! system_set {
(startup: [$($system:expr),* $(,)?]) => {
$crate::systems::SystemSet::Startup(vec![$(Box::new($system)),*])
};
(update: [$($system:expr),* $(,)?]) => {
$crate::systems::SystemSet::Update(vec![$(Box::new($system)),*])
};
(render: [$($system:expr),* $(,)?]) => {
$crate::systems::SystemSet::Render(vec![$(Box::new($system)),*])
};
}
pub struct PhysicsSystem;
impl System for PhysicsSystem {
fn run(&mut self, engine: &mut Engine, _resources: &mut Resources) -> EngineResult<()> {
let delta_time = engine.time.delta_time();
engine.entities.update_physics(delta_time);
Ok(())
}
}
pub struct ClearScreenSystem {
pub color: crate::math::Color,
}
impl ClearScreenSystem {
pub fn new(color: crate::math::Color) -> Self {
Self { color }
}
}
impl System for ClearScreenSystem {
fn run(&mut self, engine: &mut Engine, _resources: &mut Resources) -> EngineResult<()> {
if let Some(renderer) = engine.renderer_mut() {
renderer.set_clear_color(self.color);
}
Ok(())
}
}
impl Default for PhysicsSystem {
fn default() -> Self {
Self
}
}