diff --git a/core/src/engine.rs b/core/src/engine.rs index 4c73815..53aeef1 100644 --- a/core/src/engine.rs +++ b/core/src/engine.rs @@ -8,6 +8,7 @@ pub trait EngineTrait { fn new() -> Self; fn initialize(&mut self, platform_context: PlatformContext); fn update(&mut self, platform_context: PlatformContext); + fn handle_event(&mut self, platform_context: PlatformContext); fn current_scene_mut(&mut self) -> &mut Scene; fn get_debug_ui_buffer(&self) -> Rc>; fn reset_debug_ui_buffer(&mut self); diff --git a/engine/src/engine.rs b/engine/src/engine.rs index 171d631..bf3b692 100644 --- a/engine/src/engine.rs +++ b/engine/src/engine.rs @@ -56,6 +56,18 @@ impl EngineTrait for Engine { } } + fn handle_event(&mut self, platform_context: PlatformContext) { + let mut ctx = SystemContext { + scene: self.scene_manager.current_mut(), + platform_context, + debug_ui_buffer: self.debug_ui_buffer.clone(), + }; + + for system in self.system_manager.systems.values_mut() { + system.handle_event(&mut ctx); + } + } + // pub fn build_system_context(&mut self) -> SystemContext { // SystemContext { // scene: self.scene_manager.current_mut(), diff --git a/engine/src/system.rs b/engine/src/system.rs index 1e62e52..2de9f82 100644 --- a/engine/src/system.rs +++ b/engine/src/system.rs @@ -18,6 +18,8 @@ pub trait System { fn initialize(&mut self) {} /// Spawn the first entities of the world. fn load_world(&mut self, _ctx: &mut SystemContext) {} + /// Handle events sent from the platform. + fn handle_event(&mut self, _ctx: &mut SystemContext) {} fn update(&mut self, _ctx: &mut SystemContext) {} } diff --git a/game/src/main.rs b/game/src/main.rs index 396d962..b771a4a 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -18,27 +18,18 @@ const MAIN_SCENE_ID: &str = "main_scene"; #[derive(Default)] struct UpdateAspectRatioSystem; impl System for UpdateAspectRatioSystem { - fn initialize(&mut self) {} - - fn load_world(&mut self, _ctx: &mut SystemContext) {} - - fn update(&mut self, ctx: &mut SystemContext) { - // FIXME: Need an event handler rework for systems. - match &ctx.platform_context.current_event { - Event::WindowEvent { event, .. } => match event { - WindowEvent::Resized(sz) => { - let _ = ctx - .scene - .world - .query_mut::<&mut Camera>() - .into_iter() - .map(|(_, cam)| { - cam.aspect = sz.width as f32 / sz.height as f32; - }); - } - _ => {} - }, - _ => {} + fn handle_event(&mut self, ctx: &mut SystemContext) { + if let Event::WindowEvent { event: WindowEvent::Resized(sz), .. } = + &ctx.platform_context.current_event + { + let _ = ctx + .scene + .world + .query_mut::<&mut Camera>() + .into_iter() + .map(|(_, cam)| { + cam.aspect = sz.width as f32 / sz.height as f32; + }); } } } diff --git a/glium_platform/src/platform.rs b/glium_platform/src/platform.rs index 7f4320f..d66e1fc 100644 --- a/glium_platform/src/platform.rs +++ b/glium_platform/src/platform.rs @@ -66,6 +66,9 @@ impl Platform for GliumPlatform { .systems .values_mut() .for_each(|system| system.handle_event(&mut self.window, event.clone())); + let mut ctx2 = ctx.clone(); + ctx2.current_event = event.clone(); + self.engine.handle_event(ctx2.clone()); match event { Event::WindowEvent { event, .. } => match event { @@ -94,8 +97,6 @@ impl Platform for GliumPlatform { _ => {}, }, Event::AboutToWait => { - let mut ctx2 = ctx.clone(); - ctx2.current_event = event.clone(); self.engine.update(ctx2); self.rendering_system_manager .systems