From 62771c4e3714e068a85427e40f33b279afa49c17 Mon Sep 17 00:00:00 2001 From: HampusM Date: Fri, 10 Jul 2026 15:37:09 +0200 Subject: refactor(engine): use new Single get* fns --- engine/src/asset.rs | 10 ++++++- engine/src/camera/fly.rs | 8 +++++- engine/src/delta_time.rs | 4 +++ engine/src/rendering.rs | 16 +++++++++++ engine/src/rendering/backend/opengl.rs | 39 ++++++++++++++++++++----- engine/src/rendering/main_render_pass.rs | 13 +++++++-- engine/src/rendering/shader.rs | 19 +++++++++++-- engine/src/rendering/shader/default.rs | 16 ++++++++--- engine/src/ui/imgui.rs | 49 ++++++++++++++++++++++---------- engine/src/windowing.rs | 20 +++++++++++++ 10 files changed, 161 insertions(+), 33 deletions(-) (limited to 'engine') diff --git a/engine/src/asset.rs b/engine/src/asset.rs index 76d664a..ebcf5c7 100644 --- a/engine/src/asset.rs +++ b/engine/src/asset.rs @@ -860,6 +860,10 @@ impl crate::ecs::extension::Extension for Extension fn add_received_assets(mut assets: Single) { + let Ok(assets) = assets.get_mut() else { + unreachable!(); + }; + let Events { curr_tick_events, last_tick_events } = &mut assets.events; std::mem::swap(last_tick_events, curr_tick_events); @@ -869,7 +873,7 @@ fn add_received_assets(mut assets: Single) while let Some(import_work_msg) = assets.import_work_msg_receiver.try_recv().ok() { match import_work_msg { ImportWorkMessage::Store { do_store, label, asset } => { - do_store(&mut assets, label, asset); + do_store(assets, label, asset); } ImportWorkMessage::Load { do_load, label, asset_settings } => { do_load( @@ -887,6 +891,10 @@ fn add_received_assets(mut assets: Single) fn check_import_wq_thread_not_panicked(assets: Single, mut actions: Actions<'_>) { + let Ok(assets) = assets.get() else { + unreachable!(); + }; + if assets.import_work_queue.get_thread_panic().is_some() { cold_path(); diff --git a/engine/src/camera/fly.rs b/engine/src/camera/fly.rs index 589ba8a..9d5658b 100644 --- a/engine/src/camera/fly.rs +++ b/engine/src/camera/fly.rs @@ -87,8 +87,12 @@ fn update( delta_time: Single, options: Local, mut actions: Actions, -) +) -> Result<(), crate::Error> { + let keyboard = keyboard.get()?; + let mouse = mouse.get()?; + let delta_time = delta_time.get()?; + for ( camera_ent_id, (mut camera, mut camera_world_pos, mut fly_camera, controllable_camera), @@ -158,4 +162,6 @@ fn update( camera.target = camera_world_pos.position + direction; } + + Ok(()) } diff --git a/engine/src/delta_time.rs b/engine/src/delta_time.rs index 6f75247..a26007d 100644 --- a/engine/src/delta_time.rs +++ b/engine/src/delta_time.rs @@ -22,6 +22,10 @@ pub struct LastUpdate /// Will panic if no delta time component exists. pub fn update(mut delta_time: Single, mut last_update: Local) { + let Ok(delta_time) = delta_time.get_mut() else { + unreachable!(); + }; + let current_time = Instant::now(); if let Some(last_update_time) = last_update.time { diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 94e5000..46e47e9 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -413,6 +413,14 @@ fn enqueue_commands_from_render_passes( mut active_draw_props: Local, ) { + let Ok(command_queue) = command_queue.get_mut() else { + unreachable!(); + }; + + let Ok(render_passes) = render_passes.get_mut() else { + unreachable!(); + }; + let mut last_render_pass_draw_props = active_draw_props.draw_properties.clone(); for render_pass in render_passes.passes.drain(..) { @@ -454,6 +462,10 @@ fn handle_window_changed( mut command_queue: Single, ) { + let Ok(command_queue) = command_queue.get_mut() else { + unreachable!(); + }; + for evt_match in &observe { let window_ent = evt_match.get_entity(); @@ -491,6 +503,10 @@ fn handle_window_removed( mut actions: Actions, ) { + let Ok(command_queue) = command_queue.get_mut() else { + unreachable!(); + }; + for evt_match in &observe { let window_ent_id = evt_match.entity_id(); diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index 41d6968..c545ccc 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -196,10 +196,13 @@ fn prepare_windows( windowing_context: Single, graphics_props: Single, mut actions: Actions, -) +) -> Result<(), crate::Error> { + let windowing_context = windowing_context.get()?; + let graphics_props = graphics_props.get()?; + let Some(display_handle) = windowing_context.display_handle() else { - return; + return Ok(()); }; for (window_ent_id, (window, mut window_creation_attrs)) in @@ -259,6 +262,8 @@ fn prepare_windows( actions.add_components(window_ent_id, (CreationReady,)); } } + + Ok(()) } #[tracing::instrument(skip_all)] @@ -271,8 +276,15 @@ fn init_window_graphics( graphics_props: Single, mut graphics_ctx: Single, mut actions: Actions, -) +) -> Result<(), crate::Error> { + let Ok(graphics_ctx) = graphics_ctx.get_mut() else { + unreachable!(); + }; + + let windowing_context = windowing_context.get()?; + let graphics_props = graphics_props.get()?; + for (window_ent_id, (window, window_gl_config)) in window_query.iter_with_euids() { tracing::info!( window_entity_id=%window_ent_id, @@ -409,6 +421,8 @@ fn init_window_graphics( }, ); } + + Ok(()) } #[tracing::instrument(skip_all)] @@ -418,8 +432,17 @@ fn handle_commands( mut command_queue: Single, assets: Single, shader_context: Single, -) +) -> Result<(), crate::Error> { + let Ok(graphics_ctx) = graphics_ctx.get_mut() else { + unreachable!(); + }; + + let object_store = object_store.get_mut()?; + let command_queue = command_queue.get_mut()?; + let assets = assets.get()?; + let shader_context = shader_context.get()?; + let GraphicsContext { ref gl_context, ref mut surfaces, @@ -429,7 +452,7 @@ fn handle_commands( } = *graphics_ctx; let Some(gl_context) = gl_context else { - return; + return Ok(()); }; let mut activated_gl_shader_program: Option<(ObjectId, GlShaderProgram)> = None; @@ -676,8 +699,8 @@ fn handle_commands( Command::CreateTexture(texture_asset) => { if let Err(err) = create_texture_object( gl_context, - &mut object_store, - &assets, + object_store, + assets, &texture_asset, ) { tracing::error!("Failed to create texture object: {err}"); @@ -1015,6 +1038,8 @@ fn handle_commands( } } } + + Ok(()) } fn create_gl_context( diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index ec30dc5..02e0ca0 100644 --- a/engine/src/rendering/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -3,6 +3,7 @@ use crate::draw_flags::{DrawFlags, NoDraw, PolygonModeConfig}; use crate::ecs::query::term::{With, Without}; use crate::ecs::sole::Single; use crate::ecs::Query; +use crate::error; use crate::model::{MaterialSearchResult, Model}; use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; use crate::rendering::shader::default::ASSET_LABEL as DEFAULT_SHADER_ASSET_LABEL; @@ -42,13 +43,17 @@ pub fn add_main_render_passes( shader_context: Single, mut render_passes: Single, mut object_store: Single, -) +) -> Result<(), crate::Error> { + let assets = assets.get()?; + let shader_context = shader_context.get()?; + let render_passes = render_passes.get_mut()?; + let object_store = object_store.get_mut()?; + let Some(default_shader_asset) = assets .get_handle_to_loaded::(DEFAULT_SHADER_ASSET_LABEL.clone()) else { - tracing::error!("Default shader asset is not loaded"); - return; + return Err(error!("Default shader asset is not loaded")); }; let render_pass = render_passes.passes.push_front_mut(RenderPass { @@ -237,4 +242,6 @@ pub fn add_main_render_passes( } } } + + Ok(()) } diff --git a/engine/src/rendering/shader.rs b/engine/src/rendering/shader.rs index 961bea2..6b68e1e 100644 --- a/engine/src/rendering/shader.rs +++ b/engine/src/rendering/shader.rs @@ -1016,14 +1016,27 @@ pub(super) fn prepare(collector: &mut crate::ecs::extension::Collector<'_>) ); } -fn initialize(mut assets: Single) +fn initialize(mut assets: Single) -> Result<(), crate::Error> { + let assets = assets.get_mut()?; + assets.set_importer::<_, _>(["slang"], import_slang_asset); + + Ok(()) } #[tracing::instrument(skip_all)] -fn load_modules(mut context: Single, assets: Single) +fn load_modules( + mut context: Single, + assets: Single, +) -> Result<(), crate::Error> { + let Ok(context) = context.get_mut() else { + unreachable!(); + }; + + let assets = assets.get()?; + for AssetEvent::Stored(asset_id, asset_label) in assets.events().last_tick_events() { let asset_handle = AssetHandle::::from_id(*asset_id); @@ -1124,6 +1137,8 @@ fn load_modules(mut context: Single, assets: Single) ); } } + + Ok(()) } fn load_module( diff --git a/engine/src/rendering/shader/default.rs b/engine/src/rendering/shader/default.rs index a60fd61..3194706 100644 --- a/engine/src/rendering/shader/default.rs +++ b/engine/src/rendering/shader/default.rs @@ -42,9 +42,9 @@ pub static ASSET_LABEL: LazyLock = LazyLock::new(|| AssetLabel { name: Some("default_shader".into()), }); -pub fn initialize(mut assets: Single) +pub fn initialize(mut assets: Single) -> Result<(), crate::Error> { - assets.store_with_label( + assets.get_mut()?.store_with_label( ASSET_LABEL.clone(), ShaderModuleSource { name: "default_shader.slang".into(), @@ -54,6 +54,8 @@ pub fn initialize(mut assets: Single) | ShaderEntrypointFlags::FRAGMENT, }, ); + + Ok(()) } pub fn enqueue_set_shader_bindings( @@ -66,11 +68,15 @@ pub fn enqueue_set_shader_bindings( shader_context: Single, global_light: Single, mut actions: Actions, -) +) -> Result<(), crate::Error> { + let assets = assets.get()?; + let shader_context = shader_context.get()?; + let global_light = global_light.get()?; + let Some((camera, camera_world_pos, _)) = camera_query.iter().next() else { tracing::trace!("No current camera"); - return; + return Ok(()); }; let default_shader_asset = assets @@ -344,6 +350,8 @@ pub fn enqueue_set_shader_bindings( actions.add_components(entity_id, (shader_bindings.clone(),)); } } + + Ok(()) } fn create_model_matrix(transform: Transform) -> Matrix diff --git a/engine/src/ui/imgui.rs b/engine/src/ui/imgui.rs index 45efc6d..1cb3b98 100644 --- a/engine/src/ui/imgui.rs +++ b/engine/src/ui/imgui.rs @@ -170,6 +170,10 @@ fn handle_window_changed( mut context: Single, ) { + let Ok(context) = context.get_mut() else { + unreachable!(); + }; + let Some(event_match) = observe .iter() .find(|event_match| event_match.get_entity().has_component(TargetWindow::id())) @@ -204,16 +208,29 @@ fn update( delta_time: Single, mut assets: Single, mut render_passes: Single, - renderer_object_store: Single, + rendering_object_store: Single, shader_context: Single, keyboard: Single, mouse: Single, mouse_buttons: Single, mut state: Local, -) +) -> Result<(), crate::Error> { + let Ok(context) = context.get_mut() else { + unreachable!(); + }; + + let delta_time = delta_time.get()?; + let assets = assets.get_mut()?; + let render_passes = render_passes.get_mut()?; + let rendering_object_store = rendering_object_store.get()?; + let shader_context = shader_context.get()?; + let keyboard = keyboard.get()?; + let mouse = mouse.get()?; + let mouse_buttons = mouse_buttons.get()?; + let Some((window, window_surface_spec)) = target_window_query.iter().next() else { - return; + return Ok(()); }; let curr_state = std::mem::replace(&mut *state, State::Unreachable); @@ -222,16 +239,16 @@ fn update( State::NotInitialized => { let Some((font_texture_asset, shader_asset, mesh_obj_id, mesh)) = initialize_context( - &mut context, + context, &window, window_surface_spec.id, - &mut assets, - &mut render_passes, - &shader_context, + assets, + render_passes, + shader_context, ) else { *state = State::NotInitialized; - return; + return Ok(()); }; *state = State::Initializing { @@ -247,7 +264,7 @@ fn update( mesh_obj_id, mesh, } => { - let Some(font_texture_obj) = renderer_object_store + let Some(font_texture_obj) = rendering_object_store .get_obj(&RenderingObjectId::Asset(font_texture_asset.id())) else { *state = State::Initializing { @@ -256,7 +273,7 @@ fn update( mesh_obj_id, mesh, }; - return; + return Ok(()); }; context @@ -291,7 +308,7 @@ fn update( mesh_obj_id, mesh, }; - return; + return Ok(()); } context @@ -299,12 +316,12 @@ fn update( .get_io_mut() .set_delta_time(delta_time.duration.as_secs_f32()); - update_inputs(&mut context, &window, &keyboard, &mouse, &mouse_buttons); + update_inputs(context, &window, keyboard, mouse, mouse_buttons); add_drawing_render_pass( - &mut context, - &mut render_passes, - &shader_context, + context, + render_passes, + shader_context, window_surface_spec.id, font_texture_asset.clone(), shader_asset.clone(), @@ -323,6 +340,8 @@ fn update( } State::Unreachable => unreachable!(), } + + Ok(()) } #[derive(Debug, Component)] diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs index d1eadf7..eae7616 100644 --- a/engine/src/windowing.rs +++ b/engine/src/windowing.rs @@ -105,6 +105,10 @@ fn handle_window_creation_ready( context: Single, ) { + let Ok(context) = context.get() else { + unreachable!(); + }; + for evt_match in &observe { let Some(ent) = evt_match.try_get_entity() else { unreachable!(); @@ -135,6 +139,14 @@ fn update_stuff( entity_obtainer: EntityObtainer, ) -> Result<(), EngineError> { + let Ok(context) = context.get_mut() else { + unreachable!(); + }; + + let keyboard = keyboard.get_mut()?; + let mouse = mouse.get_mut()?; + let mouse_buttons = mouse_buttons.get_mut()?; + if context.display_handle.is_none() { cold_path(); actions.stop(); @@ -296,6 +308,10 @@ fn handle_window_changed( context: Single, ) { + let Ok(context) = context.get() else { + unreachable!(); + }; + for evt_match in &observe { let window_ent_id = evt_match.entity_id(); @@ -330,6 +346,10 @@ fn handle_window_removed( mut actions: Actions, ) { + let Ok(context) = context.get_mut() else { + unreachable!(); + }; + for evt_match in &observe { let window = evt_match.get_ent_target_comp(); -- cgit v1.2.3-18-g5258