summaryrefslogtreecommitdiff
path: root/engine-ecs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs')
-rw-r--r--engine-ecs/src/lib.rs9
-rw-r--r--engine-ecs/src/phase.rs24
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);