From 28438c40c09bb52f8bd444b6f5cf9b34bdf71fee Mon Sep 17 00:00:00 2001
From: HampusM <hampus@hampusmat.com>
Date: Mon, 12 Aug 2024 19:43:47 +0200
Subject: feat(ecs): add action for removing components(s) from entity

---
 ecs/src/component/storage.rs | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

(limited to 'ecs/src/component')

diff --git a/ecs/src/component/storage.rs b/ecs/src/component/storage.rs
index 76e1a7e..05ede9b 100644
--- a/ecs/src/component/storage.rs
+++ b/ecs/src/component/storage.rs
@@ -174,6 +174,36 @@ impl Storage
         Some(())
     }
 
+    pub fn remove_components_from_entity(
+        &mut self,
+        entity_uid: EntityUid,
+        component_ids: impl IntoIterator<Item = ComponentId>,
+    ) -> Option<()>
+    {
+        let archetype_id = self.entity_archetype_lookup.get(&entity_uid)?;
+
+        let archetype_index =
+            self.find_archetype_index_with_entity(*archetype_id, entity_uid)?;
+
+        let archetype = self.archetypes.get_mut(archetype_index)?;
+
+        let entity = archetype.take_entity(entity_uid)?;
+
+        let component_ids_set = component_ids.into_iter().collect::<HashSet<_>>();
+
+        self.push_entity(
+            entity_uid,
+            entity
+                .components
+                .into_iter()
+                .map(|component| component.component.into_inner())
+                .filter(|component| !component_ids_set.contains(&component.id()))
+                .collect(),
+        );
+
+        Some(())
+    }
+
     fn populate_matching_archetype_lookup_entries(
         &mut self,
         comp_ids_set: &HashSet<ComponentId>,
-- 
cgit v1.2.3-18-g5258