summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/black.rs8
-rw-r--r--examples/bmp.rs14
-rw-r--r--src/renderer.rs34
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!();
}
_ => {}
- })
+ });
}
}