From 5815d2f8f31e5ef2201547cff67e2bb51be01860 Mon Sep 17 00:00:00 2001 From: Michael Huebner <michael.huebner@ptspaper.de> Date: Mon, 24 Mar 2025 13:04:45 +0100 Subject: [PATCH] Track entity changes --- ecs/src/world.rs | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/ecs/src/world.rs b/ecs/src/world.rs index 12044bd..8e97c92 100644 --- a/ecs/src/world.rs +++ b/ecs/src/world.rs @@ -43,6 +43,7 @@ impl WorldBuilder { entities_to_remove: Default::default(), entities_to_add: Default::default(), entities_updates: Default::default(), + had_entity_changes: false, entity_object_manager: Default::default(), @@ -68,6 +69,7 @@ pub struct World { entities_to_remove: Vec<Entity>, entities_to_add: Vec<EntityObject>, entities_updates: HashMap<Entity, Vec<ComponentChange>>, + had_entity_changes: bool, entity_object_manager: EntityObjectManager, @@ -103,6 +105,10 @@ impl World { self.entities.values() } + pub fn had_entity_changes(&self) -> bool { + self.had_entity_changes + } + pub fn entity_resources( &mut self, entity: Entity, @@ -335,27 +341,37 @@ impl World { Ok(()) } - pub fn commit_entity_changes(&mut self) -> Result<()> { - if !self.entities_to_remove.is_empty() { - println!("entities to remove {}", self.entities_to_remove.len()); + pub fn commit_entity_changes(&mut self) -> Result<bool> { + #[cfg(debug_assertions)] + { + if !self.entities_to_remove.is_empty() { + println!("entities to remove {}", self.entities_to_remove.len()); + } + + if !self.entities_to_add.is_empty() { + println!("entities to add {}", self.entities_to_add.len()); + } + + if !self.entities_updates.is_empty() { + println!("entities to update {}", self.entities_updates.len()); + } + } + + if self.entities_to_remove.is_empty() + && self.entities_to_add.is_empty() + && self.entities_updates.is_empty() + { + return Ok(false); } for entity in core::mem::take(&mut self.entities_to_remove) { self._remove_entity(entity)?; } - if !self.entities_to_add.is_empty() { - println!("entities to add {}", self.entities_to_add.len()); - } - for entity_object in core::mem::take(&mut self.entities_to_add) { self._add_entity(entity_object)?; } - if !self.entities_updates.is_empty() { - println!("entities to update {}", self.entities_updates.len()); - } - for (entity, changes) in core::mem::take(&mut self.entities_updates) { self.updates.remove_entity(entity); self.archetypes.remove_entity(entity); @@ -393,7 +409,7 @@ impl World { } } - Ok(()) + Ok(true) } } @@ -415,7 +431,7 @@ impl World { self.updates.update(w)?; } - self.commit_entity_changes()?; + self.had_entity_changes = self.commit_entity_changes()?; for system in systems.iter() { if !system(self)? {