diff options
Diffstat (limited to 'ecs')
-rw-r--r-- | ecs/src/component/storage.rs | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/ecs/src/component/storage.rs b/ecs/src/component/storage.rs index 1db9227..70981a3 100644 --- a/ecs/src/component/storage.rs +++ b/ecs/src/component/storage.rs @@ -65,13 +65,17 @@ impl Storage .map(|component| component.id()), )) .or_insert_with(|| { - self.archetypes.push(Archetype::default()); + self.archetypes.push(Archetype::new( + components.iter().map(|component| component.id()), + )); vec![self.archetypes.len() - 1] }); if archetype_indices.is_empty() { - self.archetypes.push(Archetype::default()); + self.archetypes.push(Archetype::new( + components.iter().map(|component| component.id()), + )); archetype_indices.push(self.archetypes.len() - 1); } @@ -86,10 +90,6 @@ impl Storage ) .expect("Archetype is gone"); - archetype - .component_ids - .extend(components.iter().map(|component| component.id())); - archetype.components.push( components .into_iter() @@ -147,13 +147,24 @@ impl TypeName for Storage } } -#[derive(Debug, Default)] +#[derive(Debug)] pub struct Archetype { component_ids: HashSet<ComponentId>, pub components: Vec<Vec<EntityComponent>>, } +impl Archetype +{ + fn new(component_ids: impl IntoIterator<Item = ComponentId>) -> Self + { + Self { + component_ids: component_ids.into_iter().collect(), + components: Vec::new(), + } + } +} + #[derive(Debug)] pub struct ArchetypeRefIter<'component_storage> { |