mesh display: allow switching perspective/orthographic in runtime
This commit is contained in:
parent
db50127cf5
commit
c1b7d5ea00
|
|
@ -1,12 +1,14 @@
|
||||||
use glam::*;
|
use glam::*;
|
||||||
use refraction::mesh_loader::load_mesh;
|
use refraction::mesh_loader::load_mesh;
|
||||||
use refraction::mesh_tracer::{trace_to_mesh, Mesh};
|
use refraction::mesh_tracer::{trace_to_mesh, Mesh};
|
||||||
|
use show_image::event::{ElementState, VirtualKeyCode, WindowEvent};
|
||||||
use show_image::{exit, ImageInfo, ImageView, WindowOptions};
|
use show_image::{exit, ImageInfo, ImageView, WindowOptions};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering::Relaxed};
|
||||||
|
|
||||||
const W: i32 = 320;
|
const W: i32 = 320;
|
||||||
const H: i32 = 240;
|
const H: i32 = 240;
|
||||||
|
|
@ -109,6 +111,10 @@ fn test_projs() {
|
||||||
check(ortho, 9., 1., 8.);
|
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]
|
#[show_image::main]
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
@ -121,10 +127,20 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let mut f = BufReader::new(f);
|
let mut f = BufReader::new(f);
|
||||||
load_mesh(&mut f)?
|
load_mesh(&mut f)?
|
||||||
};
|
};
|
||||||
let proj = persp;
|
|
||||||
let window = show_image::create_window("Raytracing", WindowOptions::default())?;
|
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 {
|
loop {
|
||||||
for phi in 0..360 {
|
for phi in 0..360 {
|
||||||
|
let proj = PROJS[PROJ_INDEX.load(Relaxed)];
|
||||||
let m_view = ypr_to_mat(vec3(
|
let m_view = ypr_to_mat(vec3(
|
||||||
(135.0 + phi as f32) * PI / 180.0,
|
(135.0 + phi as f32) * PI / 180.0,
|
||||||
-30.0 * PI / 180.0,
|
-30.0 * PI / 180.0,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user