From 3068710ba4512cb1c09f68d14f9e95fab84d8f8e Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Fri, 1 Sep 2023 11:41:54 -0400 Subject: [PATCH] Clean up code a bit --- src/ecs/mod.rs | 11 +++++++++-- src/game.rs | 30 ++++++++++++++---------------- src/input.rs | 18 +++++++++--------- src/main.rs | 5 ++--- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/ecs/mod.rs b/src/ecs/mod.rs index fca2e95..f90d624 100755 --- a/src/ecs/mod.rs +++ b/src/ecs/mod.rs @@ -89,10 +89,17 @@ impl SystemDispatcher { /// and will cause a panic later on in the engine. /// /// TODO: Return false if a cycle was created, making it impossible to know when to dispatch them. This will mean that the System would not of had been added. - pub fn add_system(&mut self, name: String, system: Box, dependencies: Vec) -> bool { + pub fn add_system(&mut self, name: &str, system: S, dependencies: &[&str]) -> bool + where + S: SimpleSystem + 'static + { + let name = name.to_string(); + let dependencies: Vec = dependencies.iter().map(|s| s.to_string()).collect(); + let system = Box::new(system) as Box; + let added_index = self.graph.add_node(SystemGraphNode { - name: name.clone(), + name: name.to_string(), dependent_on: dependencies.clone(), system, }); diff --git a/src/game.rs b/src/game.rs index 78fdecb..dd97f85 100755 --- a/src/game.rs +++ b/src/game.rs @@ -13,7 +13,7 @@ use tracing_subscriber::{ use winit::{window::{WindowBuilder, Window}, event::{Event, WindowEvent, KeyboardInput, ElementState, VirtualKeyCode, DeviceEvent}, event_loop::{EventLoop, ControlFlow}}; -use crate::{render::renderer::{Renderer, BasicRenderer}, input_event::InputEvent, ecs::{SimpleSystem, SystemDispatcher, resources::{WindowState, Events, EventQueue}}}; +use crate::{render::renderer::{Renderer, BasicRenderer}, input_event::InputEvent, ecs::{SimpleSystem, SystemDispatcher, resources::{WindowState, Events, EventQueue}}, input::InputSystem}; pub struct Controls<'a> { pub world: &'a mut edict::World, @@ -87,12 +87,6 @@ struct GameLoop { impl GameLoop { pub async fn new(window: Arc, world: Arc>, user_systems: SystemDispatcher) -> GameLoop { - // Create the EventQueue resource in the world - { - let mut world = world.lock().await; - world.insert_resource(EventQueue::new()); - } - Self { window: Arc::clone(&window), renderer: Box::new(BasicRenderer::create_with_window(window).await), @@ -108,6 +102,12 @@ impl GameLoop { self.renderer.on_resize(new_size); } + pub async fn on_init(&mut self) { + // Create the EventQueue resource in the world + let mut world = self.world.lock().await; + world.insert_resource(EventQueue::new()); + } + pub fn run_sync(&mut self, event: Event<()>, control_flow: &mut ControlFlow) { block_on(self.run_event_loop(event, control_flow)) } @@ -291,7 +291,7 @@ impl GameLoop { pub struct Game { world: Option>>, - system_dispatcher: Option + system_dispatcher: Option, } impl Default for Game { @@ -317,7 +317,9 @@ impl Game { .with(layer.with_filter(filter)) .init(); - Self::default() + let mut def = Self::default(); + def.system_dispatcher.as_mut().unwrap().add_system("input", InputSystem::new(), &[]); + def } pub fn with_world(&mut self, world: edict::World) -> &mut Self { @@ -336,14 +338,8 @@ impl Game { where S: SimpleSystem + 'static { - - let depends: Vec = depends - .iter() - .map(|s| s.to_string()) - .collect(); - let dispatcher = self.system_dispatcher.as_mut().unwrap(); - dispatcher.add_system(name.to_string(), Box::new(system), depends); + dispatcher.add_system(name, system, depends); self } @@ -358,6 +354,8 @@ impl Game { let mut g_loop = GameLoop::new(Arc::clone(&window), world, systems).await; + g_loop.on_init().await; + event_loop.run(move |event, _, control_flow| { g_loop.run_sync(event, control_flow); }); diff --git a/src/input.rs b/src/input.rs index 9c26777..3cc9d84 100755 --- a/src/input.rs +++ b/src/input.rs @@ -1,11 +1,11 @@ -use std::{any::{Any, TypeId}, collections::{HashMap, hash_map::DefaultHasher, VecDeque, HashSet}, hash::{Hash, Hasher}, sync::{Arc, Mutex}, cell::RefCell}; +use std::{collections::{HashMap, hash_map::DefaultHasher}, hash::{Hash, Hasher}, sync::{Arc, Mutex}}; use gilrs_core::Gilrs; use glam::Vec2; use tracing::{warn, debug}; -use winit::event::{VirtualKeyCode, ElementState, MouseScrollDelta}; +use winit::event::{ElementState, MouseScrollDelta}; -use crate::{ecs::{SimpleSystem, resources::{CastableAny, Events, EventQueue}}, input_event::InputEvent}; +use crate::{ecs::{SimpleSystem, resources::EventQueue}, input_event::InputEvent}; pub type KeyCode = winit::event::VirtualKeyCode; @@ -239,11 +239,11 @@ impl InputStorage for InputButtons>>, // TODO } -impl InputEventUpdater { +impl InputSystem { pub(crate) fn new() -> Self { let gilrs = match Gilrs::new() { Ok(g) => Some(Arc::new(Mutex::new(g))), @@ -270,7 +270,7 @@ impl InputEventUpdater { InputEvent::KeyboardInput { input, .. } => { if let Some(code) = input.virtual_keycode { drop(event_queue); - let mut e = world.with_resource(|| InputButtons::::new()); + let e = world.with_resource(|| InputButtons::::new()); //let mut e = with_resource_mut(world, || InputButtons::::new()); e.add_input_from_winit(code, input.state); } @@ -320,7 +320,7 @@ impl InputEventUpdater { event_queue.trigger_event(button_event.clone()); drop(event_queue); - let mut e = world.with_resource(|| InputButtons::::new()); + let e = world.with_resource(|| InputButtons::::new()); e.add_input_from_winit(button_event, state.clone()); }, InputEvent::Touch(t) => { @@ -336,7 +336,7 @@ impl InputEventUpdater { finger_id: t.id, }; - let mut touches = world.with_resource(|| Touches::new()); + let touches = world.with_resource(|| Touches::new()); touches.touches.push(touch); }, _ => {}, @@ -346,7 +346,7 @@ impl InputEventUpdater { } } -impl SimpleSystem for InputEventUpdater { +impl SimpleSystem for InputSystem { fn execute_mut(&mut self, controls: &mut crate::game::Controls) -> anyhow::Result<()> { let world = &mut controls.world; diff --git a/src/main.rs b/src/main.rs index 45ad4cd..0e51c2b 100755 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ use game::Game; use input_event::InputEvent; use tracing::debug; -use crate::input::{InputEventUpdater, KeyCode, MouseMotion, MouseExact, CursorEnteredWindow, MouseScroll, CursorLeftWindow, MouseButton, InputButtons}; +use crate::input::{InputSystem, KeyCode, MouseMotion, MouseExact, CursorEnteredWindow, MouseScroll, CursorLeftWindow, MouseButton, InputButtons}; use crate::render::material::Material; use crate::render::texture::Texture; use crate::ecs::components::camera::CameraComponent; @@ -146,7 +146,6 @@ async fn main() { Game::initialize().await .with_world(world) - .with_system("input", InputEventUpdater::new(), &[]) - .with_system("jiggle", jiggle_system, &[]) + .with_system("jiggle", jiggle_system, &["input"]) .run().await; }