diff options
| -rw-r--r-- | engine/src/rendering.rs | 2 | ||||
| -rw-r--r-- | engine/src/rendering/backend/opengl.rs | 6 | ||||
| -rw-r--r-- | engine/src/shader/default.rs | 2 | ||||
| -rw-r--r-- | engine/src/ui/imgui.rs | 12 | ||||
| -rw-r--r-- | engine/src/windowing.rs | 10 | ||||
| -rw-r--r-- | engine/src/windowing/window.rs | 32 |
6 files changed, 41 insertions, 23 deletions
diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 47a1ec4..1544a29 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -464,7 +464,7 @@ fn handle_window_changed( command_queue.queue.push_front(Command::SetSurfaceSize( window_surface_spec.id, - evt_match.get_ent_target_comp().inner_size().clone(), + evt_match.get_ent_target_comp().inner_size.clone(), )); command_queue diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index 5ef6b38..47c2145 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -293,7 +293,7 @@ fn init_window_graphics( } }; - let Some(window_inner_size) = window.inner_size().try_into_nonzero() else { + let Some(window_inner_size) = window.inner_size.clone().try_into_nonzero() else { tracing::error!( "Cannot create a surface for a window with a width/height of 0", ); @@ -343,7 +343,7 @@ fn init_window_graphics( if let Err(err) = gl_set_viewport( &gl_context, &Vec2 { x: 0, y: 0 }.into(), - &window.inner_size().clone().into(), + &window.inner_size.clone().into(), ) { tracing::error!("Failed to set viewport: {err}"); } @@ -392,7 +392,7 @@ fn init_window_graphics( surface_id, GraphicsContextSurface { window_surface, - size: window.inner_size().clone(), + size: window.inner_size.clone(), }, ); } diff --git a/engine/src/shader/default.rs b/engine/src/shader/default.rs index 5b360ec..e682a81 100644 --- a/engine/src/shader/default.rs +++ b/engine/src/shader/default.rs @@ -194,7 +194,7 @@ pub fn enqueue_set_shader_bindings( model_3d_shader_cursor .field("projection") .into_binding_location(), - create_projection_matrix(&camera, window.inner_size()).into(), + create_projection_matrix(&camera, &window.inner_size).into(), )); } diff --git a/engine/src/ui/imgui.rs b/engine/src/ui/imgui.rs index ad59555..aa90e9f 100644 --- a/engine/src/ui/imgui.rs +++ b/engine/src/ui/imgui.rs @@ -182,11 +182,9 @@ fn handle_window_changed( .get_io_mut() .set_display_framebuffer_scale([hidpi_factor as f32, hidpi_factor as f32]); - let window_size = window.inner_size(); - let window_size = Dimens { - width: window_size.width as f32, - height: window_size.height as f32, + width: window.inner_size.width as f32, + height: window.inner_size.height as f32, }; let window_logical_size = window_size / (hidpi_factor as f32); @@ -391,11 +389,9 @@ fn initialize_context( .get_io_mut() .set_display_framebuffer_scale([hidpi_factor as f32, hidpi_factor as f32]); - let window_size = window.inner_size(); - let window_size = Dimens { - width: window_size.width as f32, - height: window_size.height as f32, + width: window.inner_size.width as f32, + height: window.inner_size.height as f32, }; let window_logical_size = window_size / (hidpi_factor as f32); diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs index 53e7bc3..0e2d1c3 100644 --- a/engine/src/windowing.rs +++ b/engine/src/windowing.rs @@ -223,7 +223,7 @@ fn update_stuff( ); } MessageFromApp::WindowResized(window_id, new_window_size) => { - tracing::debug!( + tracing::trace!( window_id = ?window_id, "Received window resized message" ); @@ -309,7 +309,7 @@ fn handle_window_changed( for evt_match in &observe { let window_ent_id = evt_match.entity_id(); - let window = evt_match.get_ent_target_comp(); + let mut window = evt_match.get_ent_target_comp_mut(); let Some((winit_window, _)) = context.windows.get(&window.wid()) else { tracing::error!( @@ -320,7 +320,11 @@ fn handle_window_changed( continue; }; - window.apply(winit_window); + let window_apply_results = window.apply(winit_window); + + if let Err(actual_window_inner_size) = window_apply_results.inner_size_request { + window.set_inner_size(actual_window_inner_size); + } context.try_send_message_to_app(MessageToApp::SetWindowCursorGrabMode( window.wid(), diff --git a/engine/src/windowing/window.rs b/engine/src/windowing/window.rs index 79b16e4..5c5e149 100644 --- a/engine/src/windowing/window.rs +++ b/engine/src/windowing/window.rs @@ -115,8 +115,8 @@ pub struct Window pub title: String, pub cursor_visible: bool, pub cursor_grab_mode: CursorGrabMode, + pub inner_size: Dimens<u32>, wid: Id, - inner_size: Dimens<u32>, scale_factor: f64, } @@ -127,11 +127,6 @@ impl Window self.wid } - pub fn inner_size(&self) -> &Dimens<u32> - { - &self.inner_size - } - pub fn scale_factor(&self) -> f64 { self.scale_factor @@ -152,10 +147,27 @@ impl Window } } - pub(crate) fn apply(&self, winit_window: &winit::window::Window) + #[must_use] + pub(crate) fn apply(&self, winit_window: &winit::window::Window) -> ApplyResults { winit_window.set_title(&self.title); winit_window.set_cursor_visible(self.cursor_visible); + + let curr_inner_size = winit_window.inner_size(); + + let inner_size_request_result = match winit_window + .request_inner_size(winit::dpi::Size::Physical(self.inner_size.into())) + { + // The comparison of curr_inner_size is in case the user's windowing system + // lies about using the requested inner size + None if curr_inner_size == self.inner_size.into() => Ok(()), + None => Err(curr_inner_size.into()), + Some(inner_size) => Err(inner_size.into()), + }; + + ApplyResults { + inner_size_request: inner_size_request_result, + } } pub(crate) fn set_inner_size(&mut self, inner_size: Dimens<u32>) @@ -209,3 +221,9 @@ impl<P> From<Dimens<P>> for winit::dpi::PhysicalSize<P> } } } + +#[derive(Debug)] +pub(crate) struct ApplyResults +{ + pub inner_size_request: Result<(), Dimens<u32>>, +} |
