summaryrefslogtreecommitdiff
path: root/ecs/src/lib.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2024-03-06 00:23:07 +0100
committerHampusM <hampus@hampusmat.com>2024-03-06 00:23:07 +0100
commitdba19db5f649f73a5abb1bc3589580721a9a4e32 (patch)
tree7fe133d807a834919c983ce1e6535b920a46b4bb /ecs/src/lib.rs
parente246f90bc33fd489e300366e30354e34a05b8107 (diff)
refactor(ecs): pass around all world data and not component storage
Diffstat (limited to 'ecs/src/lib.rs')
-rw-r--r--ecs/src/lib.rs53
1 files changed, 23 insertions, 30 deletions
diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs
index e22913f..0c06472 100644
--- a/ecs/src/lib.rs
+++ b/ecs/src/lib.rs
@@ -23,18 +23,17 @@ pub mod tuple;
pub use ecs_macros::Component;
-#[derive(Debug)]
+#[derive(Debug, Default)]
struct Entity
{
components: Vec<Box<dyn Component>>,
}
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct World
{
systems: Vec<TypeErasedSystem>,
- events: HashMap<EventId, Vec<usize>>,
- component_storage: ComponentStorage,
+ data: WorldData,
}
impl World
@@ -42,18 +41,15 @@ impl World
#[must_use]
pub fn new() -> Self
{
- Self {
- systems: Vec::new(),
- component_storage: ComponentStorage { entities: Vec::new() },
- events: HashMap::new(),
- }
+ Self::default()
}
pub fn create_entity<Comps>(&mut self, components: Comps)
where
Comps: ComponentSequence,
{
- self.component_storage
+ self.data
+ .component_storage
.entities
.push(Entity { components: components.into_vec() });
}
@@ -67,7 +63,8 @@ impl World
{
self.systems.push(system.into_type_erased());
- self.events
+ self.data
+ .events
.entry(event.id())
.or_default()
.push(self.systems.len() - 1);
@@ -80,14 +77,14 @@ impl World
/// Will panic if a system has dissapeared.
pub fn emit(&mut self, event: &impl Event)
{
- let Some(system_indices) = self.events.get(&event.id()).cloned() else {
+ let Some(system_indices) = self.data.events.get(&event.id()).cloned() else {
return;
};
for system_index in system_indices {
let system = self.systems.get_mut(system_index).unwrap();
- system.run(&mut self.component_storage);
+ system.run(&mut self.data);
}
}
@@ -95,16 +92,15 @@ impl World
where
Comps: ComponentSequence,
{
- Query::new(&mut self.component_storage)
+ Query::new(&mut self.data)
}
}
-impl Default for World
+#[derive(Debug, Default)]
+pub struct WorldData
{
- fn default() -> Self
- {
- Self::new()
- }
+ events: HashMap<EventId, Vec<usize>>,
+ component_storage: ComponentStorage,
}
#[derive(Debug)]
@@ -112,7 +108,7 @@ pub struct Query<'world, Comps>
where
Comps: ComponentSequence,
{
- component_storage: &'world mut ComponentStorage,
+ world_data: &'world mut WorldData,
comps_pd: PhantomData<Comps>,
}
@@ -120,12 +116,9 @@ impl<'world, Comps> Query<'world, Comps>
where
Comps: ComponentSequence,
{
- fn new(component_storage: &'world mut ComponentStorage) -> Self
+ fn new(world_data: &'world mut WorldData) -> Self
{
- Self {
- component_storage,
- comps_pd: PhantomData,
- }
+ Self { world_data, comps_pd: PhantomData }
}
}
@@ -136,7 +129,7 @@ where
pub fn iter(&self) -> QueryComponentIter<Comps>
{
QueryComponentIter {
- entity_iter: self.component_storage.entities.iter(),
+ entity_iter: self.world_data.component_storage.entities.iter(),
component_type_ids: Comps::type_ids(),
comps_pd: PhantomData,
}
@@ -145,7 +138,7 @@ where
pub fn iter_mut(&mut self) -> QueryComponentMutIter<Comps>
{
QueryComponentMutIter {
- entity_iter: self.component_storage.entities.iter_mut(),
+ entity_iter: self.world_data.component_storage.entities.iter_mut(),
component_type_ids: Comps::type_ids(),
comps_pd: PhantomData,
}
@@ -191,10 +184,10 @@ where
fn new<SystemImpl>(
_system: &'world mut impl System<SystemImpl>,
- component_storage: &'world mut ComponentStorage,
+ world_data: &'world mut WorldData,
) -> Self
{
- Self::new(component_storage)
+ Self::new(world_data)
}
fn is_compatible<Other: SystemParam<'world>>() -> bool
@@ -338,7 +331,7 @@ where
})
}
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct ComponentStorage
{
entities: Vec<Entity>,