From 71c1188f3a0e2eaed19642ba9349d15a78a7b2c6 Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Sun, 10 Sep 2023 00:38:54 -0400 Subject: [PATCH] Finish implementing plugins, create default plugins, create input plugin --- Cargo.toml | 1 + src/app.rs | 3 --- src/ecs/events.rs | 2 +- src/game.rs | 7 +++-- src/input.rs | 46 +++++-------------------------- src/lib.rs | 16 ++++++++++- src/plugin.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 96 insertions(+), 48 deletions(-) delete mode 100644 src/app.rs diff --git a/Cargo.toml b/Cargo.toml index 79dd7d2..ba39438 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,3 +30,4 @@ edict = "0.5.0" atomicell = "0.1.9" aligned-vec = "0.5.0" tracing-appender = "0.2.2" +stopwatch = "0.0.7" diff --git a/src/app.rs b/src/app.rs deleted file mode 100644 index 85af48d..0000000 --- a/src/app.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct App { - -} \ No newline at end of file diff --git a/src/ecs/events.rs b/src/ecs/events.rs index df4e06a..2374fd3 100644 --- a/src/ecs/events.rs +++ b/src/ecs/events.rs @@ -1,4 +1,4 @@ -use std::{collections::{HashMap, VecDeque}, any::{TypeId, Any}, cell::{RefCell, Ref, RefMut}}; +use std::{collections::{HashMap, VecDeque}, any::{TypeId, Any}, cell::RefCell}; use crate::castable_any::CastableAny; diff --git a/src/game.rs b/src/game.rs index 01ed209..ab157b2 100755 --- a/src/game.rs +++ b/src/game.rs @@ -241,9 +241,7 @@ impl Default for Game { impl Game { pub async fn initialize() -> Game { - let mut def = Self::default(); - //def.system_dispatcher.add_system("input", InputSystem::new(), &[]); - def + Self::default() } pub fn with_system(&mut self, name: &str, system: S, depends: &[&str]) -> &mut Self @@ -279,7 +277,8 @@ impl Game { .with(fmt::layer().with_writer(stdout_layer)) .with(filter::Targets::new() .with_target("lyra_engine", Level::TRACE) - .with_default(Level::INFO)) + .with_target("wgpu_core", Level::INFO) + .with_default(Level::DEBUG)) .init(); // setup all the plugins diff --git a/src/input.rs b/src/input.rs index 4d71d08..fabdef8 100755 --- a/src/input.rs +++ b/src/input.rs @@ -221,26 +221,10 @@ impl InputStorage for InputButtons>>, // TODO -} +#[derive(Default)] +pub struct InputSystem; impl InputSystem { - pub(crate) fn new() -> Self { - let gilrs = match Gilrs::new() { - Ok(g) => Some(Arc::new(Mutex::new(g))), - Err(e) => { - warn!("Failure to initialize gilrs, gamepads will not work!\n{}", e); - - None - } - }; - - Self { - gilrs, - } - } - pub fn update(&mut self, event: &InputEvent, world: &mut edict::World) -> bool { let event_queue = world.get_resource_mut::(); if event_queue.is_none() { @@ -349,28 +333,12 @@ impl SimpleSystem for InputSystem { } } -fn input_system_fn(world: &mut edict::World) -> anyhow::Result<()> { - //let world = &mut controls.world; +/// Plugin that runs InputSystem +#[derive(Default)] +pub struct InputPlugin; - let queue = world.get_resource_mut::() - .map(|q| q.read_events::()).flatten(); - - if queue.is_none() { - return Ok(()); - } - - let mut events = queue.unwrap(); - let mut input = InputSystem::new(); - - while let Some(event) = events.pop_front() { - input.update(&event, world); - } - - Ok(()) -} - -impl Plugin for InputSystem { +impl Plugin for InputPlugin { fn setup(&self, game: &mut crate::game::Game) { - game.with_system("input", input_system_fn, &[]); + game.with_system("input", InputSystem::default(), &[]); } } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 886723b..eefaaca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,4 +7,18 @@ pub mod math; pub mod input; pub mod castable_any; pub mod plugin; -pub mod app; \ No newline at end of file + +use plugin::Plugin; + +use crate::input::InputPlugin; + +/// Default plugins of Lyra. Make sure to have these added to the Game first +#[derive(Default)] +pub struct DefaultPlugins; + +impl Plugin for DefaultPlugins { + fn setup(&self, game: &mut game::Game) { + // setup input + InputPlugin::default().setup(game); + } +} \ No newline at end of file diff --git a/src/plugin.rs b/src/plugin.rs index 762f441..1f28220 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -1,7 +1,76 @@ use crate::game::Game; +/// A Plugin is something you can add to a `Game` that can be used to define systems, or spawn initial entities. pub trait Plugin { /// Setup this plugin. This runs before the game has started fn setup(&self, game: &mut Game); } +impl

Plugin for P + where P: Fn(&mut Game) +{ + fn setup(&self, game: &mut Game) { + self(game); + } +} + +/// Represents a set of plugins that will be executed in order they are supplied. +#[derive(Default)] +pub struct PluginSet { + /// A set of plugins that will be executed in order + pub plugins: Vec>, +} + +impl PluginSet { + pub fn new() -> Self { + Self::default() + } + + pub fn add_plugin

(&mut self, plugin: P) -> &mut Self + where + P: Plugin + 'static + { + self.plugins.push(Box::new(plugin)); + + self + } +} + +impl Plugin for PluginSet { + fn setup(&self, game: &mut Game) { + for plugin in self.plugins.iter() { + plugin.setup(game); + } + } +} + +// Macro used for implementing PluginSet for tuples +macro_rules! impl_tuple_plugin_set { + ( $(($name: ident, $index: tt))+ ) => ( + impl<$($name: Plugin + 'static),+> From<($($name,)+)> for PluginSet { + fn from(value: ($($name,)+)) -> Self { + let plugins = vec![$(Box::new(value.$index) as Box<(dyn Plugin + 'static)>),+]; + + Self { + plugins, + } + } + } + ); +} + +impl_tuple_plugin_set! { (C0, 0) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) (C10, 10) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) (C10, 10) (C11, 11) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) (C10, 10) (C11, 11) (C12, 12) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) (C10, 10) (C11, 11) (C12, 12) (C13, 13) } +impl_tuple_plugin_set! { (C0, 0) (C1, 1) (C2, 2) (C3, 3) (C4, 4) (C5, 5) (C6, 6) (C7, 7) (C8, 8) (C9, 9) (C10, 10) (C11, 11) (C12, 12) (C13, 13) (C14, 14) } \ No newline at end of file