Skip to main content

pebble/ecs/
schedule.rs

1use crate::ecs::{
2    commands::{ResourceCommandQueue, TriggerQueue},
3    resources::Resources,
4    system_param::{IntoSystem, System},
5};
6
7#[derive(Default)]
8pub struct Schedule {
9    systems: Vec<Box<dyn System>>,
10}
11
12impl Schedule {
13    pub fn add_system<Params: 'static>(
14        &mut self,
15        system: impl IntoSystem<Params> + 'static,
16    ) -> &mut Self {
17        self.systems.push(Box::new(system.into_system()));
18        self
19    }
20
21    pub fn run(&mut self, world: &mut hecs::World, resources: &mut Resources) {
22        for system in &mut self.systems {
23            system.run(world, &*resources);
24        }
25
26        // sync entity commands
27        resources.get_mut::<hecs::CommandBuffer>().run_on(world);
28
29        // sync resource commands
30        if resources.contains::<ResourceCommandQueue>() {
31            let commands = std::mem::take(&mut resources.get_mut::<ResourceCommandQueue>().0);
32            for command in commands {
33                command(resources);
34            }
35        }
36
37        // sync triggered observers
38        if resources.contains::<TriggerQueue>() {
39            let triggers = std::mem::take(&mut resources.get_mut::<TriggerQueue>().0);
40            for trigger in triggers {
41                trigger(world, resources);
42            }
43        }
44    }
45}