summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicha White <botahamec@outlook.com>2022-09-17 22:35:56 -0400
committerMicha White <botahamec@outlook.com>2022-09-17 22:35:56 -0400
commit8f08ff0b62d82bc969aed135b37b864e6b51e0c8 (patch)
tree027e60febb4ad81f5d52ebefa74f7917e15b1284
parentccbdb87e3a294c689d156517d37649cb47979804 (diff)
Switched to a cow
-rw-r--r--examples/black.rs20
-rw-r--r--src/renderer.rs42
2 files changed, 24 insertions, 38 deletions
diff --git a/examples/black.rs b/examples/black.rs
index 7c75117..205f7bd 100644
--- a/examples/black.rs
+++ b/examples/black.rs
@@ -1,25 +1,13 @@
-use std::num::NonZeroU32;
-
-use alligator_render::{
- renderer::{RenderWindowConfig, Resizable, WindowInfo, WindowMode},
- Renderer,
-};
+use alligator_render::{renderer::RenderWindowConfig, Renderer};
use winit::event_loop::EventLoop;
fn main() {
// configure the render window
let config = RenderWindowConfig {
- default_width: NonZeroU32::new(640).unwrap(),
- default_height: NonZeroU32::new(480).unwrap(),
- mode: WindowMode::Windowed(WindowInfo {
- default_x: 100,
- default_y: 100,
- resizable: Some(Resizable::default()),
- default_maximized: false,
- }),
+ //vsync: false,
+ //mode: WindowMode::BorderlessFullscreen,
title: "Black Screen.exe".into(),
- low_power: true,
- vsync: true,
+ ..Default::default()
};
let event_loop = EventLoop::new();
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();
- }
_ => {}
})
}