diff --git a/Cargo.lock b/Cargo.lock index 6b50248..3be5cb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,6 +67,15 @@ dependencies = [ "libc", ] +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -481,6 +490,7 @@ version = "0.30.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46" dependencies = [ + "approx", "bytemuck", ] @@ -1144,6 +1154,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" name = "photon-light" version = "0.1.0" dependencies = [ + "approx", "bytemuck", "glam", "pollster", diff --git a/Cargo.toml b/Cargo.toml index 033fca3..da3d29b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,10 +14,13 @@ opt-level = 3 [dependencies] bytemuck = "1.24.0" -glam = { version = "0.30.9", features = ["bytemuck"] } +glam = { version = "0.30.9", features = ["bytemuck", "approx"] } pollster = "0.4.0" rand = "0.9.2" rand_distr = "0.5.1" rand_pcg = "0.9.0" wgpu = "27.0.1" winit = "0.30.12" + +[dev-dependencies] +approx = "0.5.1" diff --git a/src/camera.rs b/src/camera.rs new file mode 100644 index 0000000..3729487 --- /dev/null +++ b/src/camera.rs @@ -0,0 +1,40 @@ +use glam::{Mat3, Vec3}; + +pub fn ypr_to_mat(ypr: Vec3) -> Mat3 { + glam::Mat3::from_euler(glam::EulerRot::ZXZEx, ypr.x, ypr.y, ypr.z) +} + +#[cfg(test)] +mod tests { + use std::f32::consts::PI; + + use approx::assert_ulps_eq; + use glam::vec3; + + use super::*; + + #[test] + fn test_ypr_to_mat() { + assert_ulps_eq!(ypr_to_mat(vec3(0., 0., 0.)), Mat3::IDENTITY, max_ulps = 3); + assert_ulps_eq!( + ypr_to_mat(vec3(PI / 2., 0., 0.)), + Mat3::from_cols_array_2d(&[[0., 1., 0.], [-1., 0., 0.], [0., 0., 1.]]), + max_ulps = 3, + ); + assert_ulps_eq!( + ypr_to_mat(vec3(0., 0., PI / 2.)), + Mat3::from_cols_array_2d(&[[0., 1., 0.], [-1., 0., 0.], [0., 0., 1.]]), + max_ulps = 3, + ); + assert_ulps_eq!( + ypr_to_mat(vec3(0., PI / 2., 0.)), + Mat3::from_cols_array_2d(&[[1., 0., 0.], [0., 0., 1.], [0., -1., 0.]]), + max_ulps = 3, + ); + assert_ulps_eq!( + ypr_to_mat(vec3(PI / 2., PI / 2., 0.)), + Mat3::from_cols_array_2d(&[[0., 0., 1.], [-1., 0., 0.], [0., -1., 0.]]), + max_ulps = 3, + ); + } +} diff --git a/src/main.rs b/src/main.rs index e46c85d..f49a08b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use winit::{ use crate::render::lines::{LookParams, Mesh, Pipeline, Vertex}; +mod camera; mod render; const TITLE: &str = "WGPU example";