diff options
| -rw-r--r-- | examples/black.rs | 8 | ||||
| -rw-r--r-- | examples/bmp.rs | 14 | ||||
| -rw-r--r-- | src/renderer.rs | 34 |
3 files changed, 37 insertions, 19 deletions
diff --git a/examples/black.rs b/examples/black.rs index 291fafb..c66b080 100644 --- a/examples/black.rs +++ b/examples/black.rs @@ -1,7 +1,8 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] use alligator_render::{RenderWindowConfig, Renderer}; -use winit::event_loop::EventLoop; + +fn update(_renderer: &mut Renderer) {} fn main() { let start = std::time::Instant::now(); @@ -13,9 +14,8 @@ fn main() { ..Default::default() }; - let event_loop = EventLoop::new(); - let renderer = Renderer::new(&config, &event_loop).unwrap(); + let renderer = Renderer::new(&config).unwrap(); println!("Startup time: {:?}", start.elapsed()); - renderer.run(event_loop); + renderer.run(&update); } diff --git a/examples/bmp.rs b/examples/bmp.rs index 9db50d1..6c8774c 100644 --- a/examples/bmp.rs +++ b/examples/bmp.rs @@ -3,7 +3,11 @@ use std::num::NonZeroU32; use alligator_render::{ImageFormat, Instance, RenderWindowConfig, Renderer}; -use winit::event_loop::EventLoop; + +fn update(renderer: &mut Renderer) { + let camera = renderer.camera_mut(); + camera.set_rotation(camera.rotation() + 0.01); +} fn main() { // configure the render window @@ -17,8 +21,7 @@ fn main() { ..Default::default() }; - let event_loop = EventLoop::new(); - let mut renderer = Renderer::new(&config, &event_loop).unwrap(); + let mut renderer = Renderer::new(&config).unwrap(); // render the alligator let gator = include_bytes!("res/gator.ff"); @@ -51,7 +54,6 @@ fn main() { let icon_x = renderer.textures().texture_x(icon_id).unwrap(); let icon_y = renderer.textures().texture_y(icon_id).unwrap(); - // TODO we can make a helper function that makes a square to fit a texture renderer.instances_mut().push_instance(Instance { position: [0.5, 0.5], size: [0.75; 2], @@ -81,7 +83,5 @@ fn main() { ..Default::default() }); - renderer.camera_mut().set_rotation(0.1); - - renderer.run(event_loop); + renderer.run(&update); } diff --git a/src/renderer.rs b/src/renderer.rs index 4768615..afcb92b 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -52,6 +52,7 @@ pub struct Renderer { instances: InstanceBuffer, camera: Camera, textures: TextureAtlas, + event_loop: Option<EventLoop<()>>, window: Window, } @@ -128,16 +129,15 @@ impl Renderer { /// panic on some platforms. // TODO make it possible to use without a window (ie, use a bitmap in memory as a surface) // TODO this function needs to be smaller - pub fn new( - config: &RenderWindowConfig, - event_loop: &EventLoop<()>, - ) -> Result<Self, NewRendererError> { + pub fn new(config: &RenderWindowConfig) -> Result<Self, NewRendererError> { #[cfg(feature = "profile-with-tracy")] profiling::tracy_client::Client::start(); profiling::register_thread!("main"); // build the window - let window = config.to_window().build(event_loop)?; + let event_loop = EventLoop::new(); + let window = config.to_window().build(&event_loop)?; + let event_loop = Some(event_loop); // the instance's main purpose is to create an adapter and a surface let instance = wgpu::Instance::new(wgpu::Backends::VULKAN); @@ -226,6 +226,7 @@ impl Renderer { instances, camera, textures, + event_loop, window, }) } @@ -357,20 +358,37 @@ impl Renderer { Ok(()) } + /// Take the event loop out of the Renderer, without moving it + /// + /// # Panics + /// + /// This method must only be called once + // TODO This is a quick fix to get the event loop inside the renderer. + // In the future, we should make a separate struct that contains the + // renderer and the event loop, which we move the event loop out of + // while still being able to move the renderer. + fn event_loop(&mut self) -> EventLoop<()> { + self.event_loop.take().unwrap() + } + /// Run the renderer indefinitely - pub fn run(mut self, event_loop: EventLoop<()>) -> ! { + pub fn run(mut self, f: &'static dyn Fn(&mut Self)) -> ! { self.window.set_visible(true); + let event_loop = self.event_loop(); event_loop.run(move |event, _, control_flow| match event { Event::WindowEvent { window_id, event } => { if window_id == self.window.id() { match event { WindowEvent::Resized(size) => self.resize_renderer(size), - WindowEvent::CloseRequested => *control_flow = ControlFlow::ExitWithCode(0), + WindowEvent::CloseRequested => { + *control_flow = ControlFlow::ExitWithCode(0); + } _ => (), } } } Event::MainEventsCleared => { + f(&mut self); match self.render() { Ok(_) => {} // reconfigure the surface if it's been lost @@ -387,6 +405,6 @@ impl Renderer { profiling::finish_frame!(); } _ => {} - }) + }); } } |
