summaryrefslogtreecommitdiff
path: root/racer-tracer/src/main.rs
diff options
context:
space:
mode:
authorSakarias Johansson <sakarias.johansson@goodbyekansas.com>2023-03-20 21:25:41 +0100
committerSakarias Johansson <sakariasjohansson@hotmail.com>2023-03-20 21:33:38 +0100
commited8de4988d3f1c81bc4ca833c760dce1497e99d7 (patch)
tree9c96da4d3f2b5216f6e7f455f77ab5cd931d7c8f /racer-tracer/src/main.rs
parent60139fe0629a2680160549b525c7cb18bb43be13 (diff)
downloadracer-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.rs74
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()