From 5815d2f8f31e5ef2201547cff67e2bb51be01860 Mon Sep 17 00:00:00 2001 From: Michael Huebner Date: Mon, 24 Mar 2025 13:04:45 +0100 Subject: [PATCH 1/2] 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, entities_to_add: Vec, entities_updates: HashMap>, + 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 { + #[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)? { From c7a7225c95cf195e5cd727c9eb6881bda8bf17de Mon Sep 17 00:00:00 2001 From: Michael Huebner Date: Mon, 24 Mar 2025 13:11:55 +0100 Subject: [PATCH 2/2] Improve change logic --- ecs/src/world.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ecs/src/world.rs b/ecs/src/world.rs index 8e97c92..e9d1b41 100644 --- a/ecs/src/world.rs +++ b/ecs/src/world.rs @@ -341,7 +341,7 @@ impl World { Ok(()) } - pub fn commit_entity_changes(&mut self) -> Result { + pub fn commit_entity_changes(&mut self) -> Result<()> { #[cfg(debug_assertions)] { if !self.entities_to_remove.is_empty() { @@ -361,7 +361,7 @@ impl World { && self.entities_to_add.is_empty() && self.entities_updates.is_empty() { - return Ok(false); + return Ok(()); } for entity in core::mem::take(&mut self.entities_to_remove) { @@ -409,7 +409,8 @@ impl World { } } - Ok(true) + self.had_entity_changes = true; + Ok(()) } } @@ -431,13 +432,16 @@ impl World { self.updates.update(w)?; } - self.had_entity_changes = self.commit_entity_changes()?; + self.commit_entity_changes()?; for system in systems.iter() { if !system(self)? { return Ok(()); } } + + // reset flag + self.had_entity_changes = false; } } }