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)? {