mesh display: allow switching perspective/orthographic in runtime

This commit is contained in:
numzero 2024-09-28 13:22:23 +03:00
parent db50127cf5
commit c1b7d5ea00

View File

@ -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<dyn Error>> {
let args: Vec<String> = env::args().collect();
@ -121,10 +127,20 @@ fn main() -> Result<(), Box<dyn Error>> {
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,