summaryrefslogtreecommitdiff
path: root/engine-ecs/src/phase.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs/src/phase.rs')
-rw-r--r--engine-ecs/src/phase.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/engine-ecs/src/phase.rs b/engine-ecs/src/phase.rs
new file mode 100644
index 0000000..78428c4
--- /dev/null
+++ b/engine-ecs/src/phase.rs
@@ -0,0 +1,73 @@
+use crate::{declare_entity, Component, World};
+
+#[derive(Debug, Default, Clone, Copy, Component)]
+pub struct Phase;
+
+declare_entity! {
+/// Initialization phase that only occurs the first tick, before [`START`].
+/// Should not be used for game logic
+pub INIT: (Phase,);
+
+/// 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);
+ world.spawn_declared_entity(&POST_UPDATE);
+}
+
+#[derive(Debug, Component)]
+pub(crate) struct HasSystem;
+
+#[cfg(debug_assertions)]
+pub(crate) fn check_parents(
+ phase_query: crate::query::Query<(
+ crate::pair::Pair<crate::pair::ChildOf, crate::pair::Wildcard>,
+ Option<&crate::entity::Name>,
+ crate::query::term::With<Phase>,
+ )>,
+)
+{
+ for (child_of, ent_name) in &phase_query {
+ let Some(parent_ent) = child_of.get_target_ent() else {
+ tracing::warn!(
+ phase_entity = ent_name
+ .as_ref()
+ .map(|ent_name| ent_name.name.as_ref())
+ .unwrap_or("<unnamed>"),
+ "Parent entity of phase entity does not exist"
+ );
+ continue;
+ };
+
+ if !parent_ent.has_component(Phase::id()) {
+ let parent_ent_name = parent_ent.get::<crate::entity::Name>();
+
+ tracing::warn!(
+ phase_entity = ent_name
+ .as_ref()
+ .map(|ent_name| ent_name.name.as_ref())
+ .unwrap_or("<unnamed>"),
+ parent_entity = parent_ent_name
+ .as_ref()
+ .map(|parent_ent_name| parent_ent_name.name.as_ref())
+ .unwrap_or("<unnamed>"),
+ "Parent entity of phase entity is not a phase (missing Phase component)"
+ );
+ }
+ }
+}