diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/renderer.rs | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/src/renderer.rs b/src/renderer.rs index 1b72e12..c9c51bc 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,4 +1,4 @@ -use std::num::NonZeroU32; +use std::{borrow::Cow, num::NonZeroU32}; use pollster::FutureExt; use thiserror::Error; @@ -81,7 +81,7 @@ impl Default for WindowMode { #[derive(Clone, Debug, PartialEq, Eq)] // TODO window icon -pub struct RenderWindowConfig { +pub struct RenderWindowConfig<'a> { /// The width of the window, once initialized pub default_width: NonZeroU32, /// The height of the window, once initialized @@ -89,7 +89,7 @@ pub struct RenderWindowConfig { /// The window may be fullscreen pub mode: WindowMode, /// The title for the window - pub title: Box<str>, + pub title: Cow<'a, str>, /// If true, a low-power device will be selected as the GPU, if possible pub low_power: bool, /// If true, Fifo mode is used to present frames. If false, then Mailbox or @@ -97,11 +97,11 @@ pub struct RenderWindowConfig { pub vsync: bool, } -impl Default for RenderWindowConfig { +impl<'a> Default for RenderWindowConfig<'a> { fn default() -> Self { Self { - default_width: NonZeroU32::new(480).unwrap(), - default_height: NonZeroU32::new(640).unwrap(), + default_width: NonZeroU32::new(640).unwrap(), + default_height: NonZeroU32::new(480).unwrap(), mode: WindowMode::default(), title: "Alligator Game".into(), low_power: true, @@ -254,16 +254,15 @@ impl Renderer { } /// Resize just the renderer. The window will remain unchanged - fn resize_renderer(&mut self, size: PhysicalSize<u32>) -> Option<()> { + fn resize_renderer(&mut self, size: PhysicalSize<u32>) { if size.width == 0 || size.height == 0 { - return None; + log::error!("The window was somehow set to a size of zero"); + return; } self.config.height = size.height; self.config.width = size.width; self.surface.configure(&self.device, &self.config); - - Some(()) } /// Renders a new frame to the window @@ -317,26 +316,25 @@ impl Renderer { Event::WindowEvent { window_id, event } => { if window_id == self.window.id() { match event { - WindowEvent::Resized(size) => { - if self.resize_renderer(size).is_none() { - log::error!("Somehow the window was resized to zero?"); - } - } + WindowEvent::Resized(size) => self.resize_renderer(size), WindowEvent::CloseRequested => *control_flow = ControlFlow::ExitWithCode(0), _ => (), } } } - Event::RedrawRequested(window_id) => { - if window_id == self.window.id() { - if let Err(e) = self.render() { - log::error!("{}", e); + Event::MainEventsCleared => { + match self.render() { + Ok(_) => {} + // reconfigure the surface if it's been lost + Err(wgpu::SurfaceError::Lost) => self.resize_renderer(self.window.inner_size()), + // if we ran out of memory, then we'll die + Err(wgpu::SurfaceError::OutOfMemory) => { + *control_flow = ControlFlow::ExitWithCode(1); } + // otherwise, we'll just log the error + Err(e) => log::error!("{}", e), } } - Event::MainEventsCleared => { - self.window.request_redraw(); - } _ => {} }) } |
