From c1b7d5ea004c415c5fad4baa1bf259702b31add3 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 28 Sep 2024 13:22:23 +0300 Subject: [PATCH] mesh display: allow switching perspective/orthographic in runtime --- src/bin/mesh/main.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bin/mesh/main.rs b/src/bin/mesh/main.rs index b8c27fe..399d48c 100644 --- a/src/bin/mesh/main.rs +++ b/src/bin/mesh/main.rs @@ -1,12 +1,14 @@ use glam::*; use refraction::mesh_loader::load_mesh; use refraction::mesh_tracer::{trace_to_mesh, Mesh}; +use show_image::event::{ElementState, VirtualKeyCode, WindowEvent}; use show_image::{exit, ImageInfo, ImageView, WindowOptions}; use std::env; use std::error::Error; use std::f32::consts::PI; use std::fs::File; use std::io::BufReader; +use std::sync::atomic::{AtomicUsize, Ordering::Relaxed}; const W: i32 = 320; const H: i32 = 240; @@ -109,6 +111,10 @@ fn test_projs() { check(ortho, 9., 1., 8.); } +// add_event_handler wants 'static + Send. Let it be so. +static PROJ_INDEX: AtomicUsize = AtomicUsize::new(0); +static PROJS: [fn(dist: f32, off: Vec2) -> (Vec3, Vec3); 2] = [persp, ortho]; + #[show_image::main] fn main() -> Result<(), Box> { let args: Vec = env::args().collect(); @@ -121,10 +127,20 @@ fn main() -> Result<(), Box> { let mut f = BufReader::new(f); load_mesh(&mut f)? }; - let proj = persp; let window = show_image::create_window("Raytracing", WindowOptions::default())?; + window.add_event_handler(|_wnd, ev, _ctl| { + if let WindowEvent::KeyboardInput(ev) = ev { + if ev.input.state != ElementState::Pressed { + return; + } + if let Some(VirtualKeyCode::Tab) = ev.input.key_code { + PROJ_INDEX.store((PROJ_INDEX.load(Relaxed) + 1) % PROJS.len(), Relaxed); + } + } + })?; loop { for phi in 0..360 { + let proj = PROJS[PROJ_INDEX.load(Relaxed)]; let m_view = ypr_to_mat(vec3( (135.0 + phi as f32) * PI / 180.0, -30.0 * PI / 180.0,