summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-11 17:30:17 +0200
committerHampusM <hampus@hampusmat.com>2026-06-11 17:30:17 +0200
commit0918fd95082f3ad4837dec64e6c76d68f06da2fd (patch)
treef243f088456a61fdc52a97ab2e42840850517d31
parent25bd2829b9927e2d5c17c657e6184d14e591a2fc (diff)
feat(engine): make window inner size modifiable
-rw-r--r--engine/src/rendering.rs2
-rw-r--r--engine/src/rendering/backend/opengl.rs6
-rw-r--r--engine/src/shader/default.rs2
-rw-r--r--engine/src/ui/imgui.rs12
-rw-r--r--engine/src/windowing.rs10
-rw-r--r--engine/src/windowing/window.rs32
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>>,
+}