diff options
author | HampusM <hampus@hampusmat.com> | 2025-01-19 20:38:30 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-01-19 20:38:30 +0100 |
commit | 9b4b46438eca26faca9809646dc1631ddcafd64e (patch) | |
tree | d1d1b70a1048eb7e16cebb37f87791f09eb8de9d | |
parent | 05d2d6bad38edc7973175dc917c86597bb8aa08d (diff) |
feat(ecs): add Query function to iterate with entity UIDs
-rw-r--r-- | ecs/src/query.rs | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/ecs/src/query.rs b/ecs/src/query.rs index 8c1ede5..3ee7e5b 100644 --- a/ecs/src/query.rs +++ b/ecs/src/query.rs @@ -29,7 +29,8 @@ where Comps: ComponentRefSequence, OptionsT: Options, { - /// Iterates over the entities matching this query. + /// Iterates over the entities matching this query, the iterator item being the entity + /// components. #[must_use] pub fn iter<'query>( &'query self, @@ -45,6 +46,23 @@ where } } + /// Iterates over the entities matching this query, the iterator item being the entity + /// [`Uid`] and the entity components. + #[must_use] + pub fn iter_with_euids<'query>( + &'query self, + ) -> ComponentAndEuidIter<'query, 'world, Comps, FlexibleQueryIter<'query>> + { + #[cfg(feature = "debug")] + tracing::debug!("Searching for {}", std::any::type_name::<Comps>()); + + ComponentAndEuidIter { + world: self.world, + iter: self.inner.iter::<OptionsT>(), + comps_pd: PhantomData, + } + } + /// Iterates over the entities matching this query using the iterator returned by /// `func`. /// @@ -165,3 +183,36 @@ where )) } } + +pub struct ComponentAndEuidIter<'query, 'world, Comps, EntityHandleIter> +where + EntityHandleIter: Iterator<Item = EntityHandle<'query>>, +{ + world: &'world World, + iter: EntityHandleIter, + comps_pd: PhantomData<Comps>, +} + +impl<'query, 'world, Comps, EntityHandleIter> Iterator + for ComponentAndEuidIter<'query, 'world, Comps, EntityHandleIter> +where + Comps: ComponentRefSequence + 'world, + EntityHandleIter: Iterator<Item = EntityHandle<'query>>, + 'world: 'query, +{ + type Item = (Uid, Comps::Handles<'query>); + + fn next(&mut self) -> Option<Self::Item> + { + let entity_handle = self.iter.next()?; + + Some(( + entity_handle.uid(), + Comps::from_components( + entity_handle.components(), + |component_uid| entity_handle.get_component_index(component_uid), + self.world, + ), + )) + } +} |