summaryrefslogtreecommitdiff
path: root/ecs/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2024-04-06 12:30:49 +0200
committerHampusM <hampus@hampusmat.com>2024-04-06 13:44:26 +0200
commit519a73f83848ea668fe79895e6643cff4c5c51be (patch)
tree23e52eac67f80241f4efe590a05c17d489d48a2b /ecs/src
parent3e6d04be56e910f77048442a3c744298ef856ca1 (diff)
feat(ecs): add stopping event loop
Diffstat (limited to 'ecs/src')
-rw-r--r--ecs/src/flags.rs66
-rw-r--r--ecs/src/lib.rs26
2 files changed, 92 insertions, 0 deletions
diff --git a/ecs/src/flags.rs b/ecs/src/flags.rs
new file mode 100644
index 0000000..ad10a0f
--- /dev/null
+++ b/ecs/src/flags.rs
@@ -0,0 +1,66 @@
+use std::any::Any;
+
+use crate::lock::WriteGuard;
+use crate::system::{
+ NoInitParamFlag as NoInitSystemParamFlag,
+ Param as SystemParam,
+ System,
+};
+use crate::tuple::FilterExclude as TupleFilterExclude;
+use crate::{WorldData, WorldFlags};
+
+#[derive(Debug)]
+pub struct Flags<'world>
+{
+ world_flags: WriteGuard<'world, WorldFlags>,
+}
+
+impl<'world> Flags<'world>
+{
+ /// Calling this function makes the loop in [`Engine::event_loop`] stop at the next
+ /// opportune time.
+ pub fn stop(&mut self)
+ {
+ self.world_flags.stop = true;
+ }
+}
+
+unsafe impl<'world> SystemParam<'world> for Flags<'world>
+{
+ type Flags = NoInitSystemParamFlag;
+ type Input = TupleFilterExclude;
+
+ fn initialize<SystemImpl>(
+ _system: &mut impl System<'world, SystemImpl>,
+ _input: Self::Input,
+ )
+ {
+ }
+
+ fn new<SystemImpl>(
+ _system: &'world impl System<'world, SystemImpl>,
+ world_data: &'world WorldData,
+ ) -> Self
+ {
+ Self {
+ world_flags: world_data
+ .flags
+ .write_nonblock()
+ .expect("Failed to acquire read-write world flags lock"),
+ }
+ }
+
+ fn is_compatible<Other: SystemParam<'world>>() -> bool
+ {
+ let other_comparable = Other::get_comparable();
+
+ other_comparable.downcast_ref::<Comparable>().is_none()
+ }
+
+ fn get_comparable() -> Box<dyn Any>
+ {
+ Box::new(Comparable)
+ }
+}
+
+struct Comparable;
diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs
index 339a314..fc97d42 100644
--- a/ecs/src/lib.rs
+++ b/ecs/src/lib.rs
@@ -26,6 +26,7 @@ use crate::type_name::TypeName;
pub mod actions;
pub mod component;
pub mod event;
+pub mod flags;
pub mod lock;
pub mod system;
pub mod tuple;
@@ -166,6 +167,16 @@ impl World
}
self.perform_queued_actions();
+
+ let flags = self
+ .data
+ .flags
+ .read_nonblock()
+ .expect("Failed to aquire lock to flags");
+
+ if flags.stop {
+ break;
+ }
}
}
@@ -187,11 +198,26 @@ impl World
}
#[derive(Debug, Default)]
+struct WorldFlags
+{
+ stop: bool,
+}
+
+impl TypeName for WorldFlags
+{
+ fn type_name(&self) -> &'static str
+ {
+ type_name::<Self>()
+ }
+}
+
+#[derive(Debug, Default)]
pub struct WorldData
{
events: HashMap<EventId, Vec<usize>>,
component_storage: Arc<Lock<ComponentStorage>>,
action_queue: Lock<ActionQueue>,
+ flags: Lock<WorldFlags>,
}
#[derive(Debug, Default)]