From 6d710fbc218ae316bf97885902a68567d2751d36 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 25 Aug 2026 16:38:57 +0200 Subject: fix(engine): update rendering surface sizes before next frame --- engine/src/rendering.rs | 59 +++++++++++++------------------------------------ 1 file changed, 15 insertions(+), 44 deletions(-) (limited to 'engine/src/rendering.rs') diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 57d9698..2a73625 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -10,7 +10,7 @@ use crate::data_types::dimens::Dimens; use crate::draw_flags::PolygonModeConfig; use crate::ecs::actions::Actions; use crate::ecs::component::local::Local; -use crate::ecs::event::component::{Changed, EventMatchExt, Removed}; +use crate::ecs::event::component::{EventMatchExt, Removed}; use crate::ecs::pair::{ChildOf, Pair}; use crate::ecs::phase::{Phase, POST_UPDATE as POST_UPDATE_PHASE}; use crate::ecs::query::term::With; @@ -86,7 +86,6 @@ impl crate::ecs::extension::Extension for Extension .initialize((ActiveDrawProperties::default(),)), ); - collector.add_observer(handle_window_changed); collector.add_observer(handle_window_removed); crate::rendering::shader::prepare(&mut collector); @@ -172,6 +171,7 @@ impl Default for GraphicsPropertiesBuilder pub struct Surface { pub id: SurfaceId, + pub size: PhysicalSize, } #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -429,7 +429,7 @@ impl Default for CommandQueue #[tracing::instrument(skip_all)] fn enqueue_commands_from_render_passes( - window_surface_query: Query<(&Surface, With, With)>, + window_surface_query: Query<(&mut Surface, &Window, With)>, mut command_queue: Single, mut render_passes: Single, mut active_draw_props: Local, @@ -445,6 +445,17 @@ fn enqueue_commands_from_render_passes( let mut last_render_pass_draw_props = active_draw_props.draw_properties.clone(); + for (mut window_surface, window) in &window_surface_query { + if window_surface.size != window.inner_size { + command_queue.push(Command::SetSurfaceSize( + window_surface.id, + window.inner_size, + )); + + window_surface.size = window.inner_size.clone(); + } + } + for render_pass in render_passes.passes.drain(..) { if render_pass.draw_properties != last_render_pass_draw_props { command_queue.push(Command::UpdateDrawProperties( @@ -473,51 +484,11 @@ fn enqueue_commands_from_render_passes( active_draw_props.draw_properties = last_render_pass_draw_props; - for (window_surface,) in &window_surface_query { + for (window_surface, _) in &window_surface_query { command_queue.push(Command::SwapBuffers(window_surface.id)); } } -#[tracing::instrument(skip_all)] -fn handle_window_changed( - observe: Observe>, - 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(); - - if window_ent.get::().is_none() { - continue; - } - - let Some(window_surface) = window_ent.get::() else { - continue; - }; - - let window = evt_match.get_ent_target_comp(); - - tracing::trace!( - window_id=?window.wid(), - window_title=&*window.title, - "Handling potential resize of window" - ); - - command_queue.queue.push_front(Command::SetSurfaceSize( - window_surface.id, - evt_match.get_ent_target_comp().inner_size.clone(), - )); - - command_queue - .queue - .push_front(Command::MakeCurrent(window_surface.id)); - } -} - #[tracing::instrument(skip_all)] fn handle_window_removed( observe: Observe>, -- cgit v1.2.3-18-g5258