diff options
Diffstat (limited to 'engine-ecs/src')
| -rw-r--r-- | engine-ecs/src/lib.rs | 9 | ||||
| -rw-r--r-- | engine-ecs/src/phase.rs | 24 |
2 files changed, 27 insertions, 6 deletions
diff --git a/engine-ecs/src/lib.rs b/engine-ecs/src/lib.rs index 62d2f71..3292bec 100644 --- a/engine-ecs/src/lib.rs +++ b/engine-ecs/src/lib.rs @@ -36,6 +36,7 @@ use crate::pair::{ChildOf, Pair, Wildcard}; use crate::phase::{ HasSystem as PhaseHasSystem, Phase, + INIT as INIT_PHASE, POST_UPDATE as POST_UPDATE_PHASE, PRE_UPDATE as PRE_UPDATE_PHASE, START as START_PHASE, @@ -107,7 +108,7 @@ impl World error_handler: err_handler_panic, }; - crate::phase::spawn_entities(&mut world); + crate::phase::spawn_standard_phases(&mut world); world.add_sole(Stats::default()).ok(); @@ -337,6 +338,12 @@ impl World .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { + let Some(init_phase_entity) = self.get_entity(*INIT_PHASE) else { + unreachable!(); + }; + + self.run_phase_systems(&init_phase_entity); + let Some(start_phase_entity) = self.get_entity(*START_PHASE) else { unreachable!(); }; diff --git a/engine-ecs/src/phase.rs b/engine-ecs/src/phase.rs index cb87cc6..f789120 100644 --- a/engine-ecs/src/phase.rs +++ b/engine-ecs/src/phase.rs @@ -3,13 +3,27 @@ use crate::{declare_entity, Component, World}; #[derive(Debug, Default, Clone, Copy, Component)] pub struct Phase; -declare_entity!(pub START, (Phase,)); -declare_entity!(pub PRE_UPDATE, (Phase,)); -declare_entity!(pub UPDATE, (Phase,)); -declare_entity!(pub POST_UPDATE, (Phase,)); +declare_entity! { +/// Initialization phase that only occurs the first tick, before [`START`]. +/// Should not be used for game logic +pub INIT: (Phase,); -pub(crate) fn spawn_entities(world: &mut World) +/// Phase that only occurs the first tick, after [`INIT`]. +pub START: (Phase,); + +/// Phase that occurs every tick, before [`UPDATE`]. +pub PRE_UPDATE: (Phase,); + +/// Phase that occurs every tick, after [`PRE_UPDATE`]. +pub UPDATE: (Phase,); + +/// Phase that occurs every tick, after [`UPDATE`]. +pub POST_UPDATE: (Phase,); +} + +pub(crate) fn spawn_standard_phases(world: &mut World) { + world.spawn_declared_entity(&INIT); world.spawn_declared_entity(&START); world.spawn_declared_entity(&PRE_UPDATE); world.spawn_declared_entity(&UPDATE); |
