diff options
| author | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-03-20 21:25:41 +0100 |
|---|---|---|
| committer | Sakarias Johansson <sakariasjohansson@hotmail.com> | 2023-03-20 21:33:38 +0100 |
| commit | ed8de4988d3f1c81bc4ca833c760dce1497e99d7 (patch) | |
| tree | 9c96da4d3f2b5216f6e7f455f77ab5cd931d7c8f /racer-tracer/src/main.rs | |
| parent | 60139fe0629a2680160549b525c7cb18bb43be13 (diff) | |
| download | racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.tar.gz racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.tar.xz racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.zip | |
✨ Add simple way of handling inputs through CBs
Diffstat (limited to 'racer-tracer/src/main.rs')
| -rw-r--r-- | racer-tracer/src/main.rs | 74 |
1 files changed, 52 insertions, 22 deletions
diff --git a/racer-tracer/src/main.rs b/racer-tracer/src/main.rs index 0c65208..59c9208 100644 --- a/racer-tracer/src/main.rs +++ b/racer-tracer/src/main.rs @@ -5,6 +5,7 @@ mod config; mod geometry; mod image; mod image_action; +mod key_inputs; mod material; mod ray; mod render; @@ -22,6 +23,7 @@ use std::{ }; use image_action::ImageAction; +use key_inputs::KeyInputs; use minifb::{Key, Window, WindowOptions}; use synchronoise::SignalEvent; @@ -61,6 +63,54 @@ fn run(config: Config) -> Result<(), TracerError> { let image_action: Box<dyn ImageAction> = (&config.image_action).into(); + // Setting up controls + let mut key_inputs = KeyInputs::new(); + let render_image_fn = |_| { + render_image.signal(); + Ok(()) + }; + key_inputs.release(Key::R, &render_image_fn); + + let go_forward = |dt: f64| { + camera + .write() + .map_err(|e| TracerError::KeyError(e.to_string())) + .map(|mut cam| { + cam.go_forward(-dt * camera_speed); + }) + }; + key_inputs.down(Key::W, &go_forward); + + let go_back = |dt: f64| { + camera + .write() + .map_err(|e| TracerError::KeyError(e.to_string())) + .map(|mut cam| { + cam.go_forward(dt * camera_speed); + }) + }; + key_inputs.down(Key::S, &go_back); + + let go_left = |dt: f64| { + camera + .write() + .map_err(|e| TracerError::KeyError(e.to_string())) + .map(|mut cam| { + cam.go_right(-dt * camera_speed); + }) + }; + key_inputs.down(Key::A, &go_left); + + let go_right = |dt: f64| { + camera + .write() + .map_err(|e| TracerError::KeyError(e.to_string())) + .map(|mut cam| { + cam.go_right(dt * camera_speed); + }) + }; + key_inputs.down(Key::D, &go_right); + rayon::scope(|s| { s.spawn(|_| { while render_res.is_ok() { @@ -131,29 +181,9 @@ fn run(config: Config) -> Result<(), TracerError> { while window.is_open() && !window.is_key_down(Key::Escape) && !exit.status() { let dt = t.elapsed().as_micros() as f64 / 1000000.0; t = Instant::now(); + key_inputs.update(&window, dt); // Sleep a bit to not hog the lock on the buffer all the time. - std::thread::sleep(std::time::Duration::from_millis(10)); - - if window.is_key_released(Key::R) { - render_image.signal(); - } - - camera - .write() - .map_err(|e| TracerError::FailedToAcquireLock(e.to_string())) - .map(|mut cam| { - if window.is_key_down(Key::W) { - cam.go_forward(-dt * camera_speed); - } else if window.is_key_down(Key::S) { - cam.go_forward(dt * camera_speed); - } - - if window.is_key_down(Key::A) { - cam.go_right(-dt * camera_speed); - } else if window.is_key_down(Key::D) { - cam.go_right(dt * camera_speed); - } - })?; + std::thread::sleep(std::time::Duration::from_millis(1)); screen_buffer .read() |
