diff --git a/rtiow/Cargo.lock b/rtiow/Cargo.lock index 2366eff..b02e7f2 100644 --- a/rtiow/Cargo.lock +++ b/rtiow/Cargo.lock @@ -223,6 +223,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "anyhow" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" + [[package]] name = "askama" version = "0.7.2" @@ -1670,7 +1676,7 @@ dependencies = [ "serde", "serde_derive", "stderrlog", - "structopt", + "structopt 0.2.18", ] [[package]] @@ -1685,7 +1691,7 @@ dependencies = [ "serde", "serde_derive", "stderrlog", - "structopt", + "structopt 0.2.18", "warp", ] @@ -1932,6 +1938,30 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2 1.0.49", + "quote 1.0.21", + "syn 1.0.107", + "version_check 0.9.4", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2 1.0.49", + "quote 1.0.21", + "version_check 0.9.4", +] + [[package]] name = "proc-macro2" version = "0.4.30" @@ -2288,7 +2318,8 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "structopt", + "stl", + "structopt 0.2.18", "vec3", ] @@ -2550,6 +2581,18 @@ dependencies = [ "thread_local", ] +[[package]] +name = "stl" +version = "0.1.0" +dependencies = [ + "ansi_term", + "anyhow", + "byteorder", + "structopt 0.3.26", + "thiserror", + "vec3", +] + [[package]] name = "string" version = "0.2.1" @@ -2572,7 +2615,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" dependencies = [ "clap", - "structopt-derive", + "structopt-derive 0.2.18", +] + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap", + "lazy_static 1.4.0", + "structopt-derive 0.4.18", ] [[package]] @@ -2587,6 +2641,19 @@ dependencies = [ "syn 0.15.44", ] +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2 1.0.49", + "quote 1.0.21", + "syn 1.0.107", +] + [[package]] name = "subtle" version = "2.4.1" @@ -2671,6 +2738,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2 1.0.49", + "quote 1.0.21", + "syn 1.0.107", +] + [[package]] name = "thread_local" version = "0.3.4" @@ -2964,7 +3051,7 @@ dependencies = [ "log 0.4.17", "renderer", "stderrlog", - "structopt", + "structopt 0.2.18", ] [[package]] diff --git a/rtiow/renderer/Cargo.toml b/rtiow/renderer/Cargo.toml index 384d713..2cb1772 100644 --- a/rtiow/renderer/Cargo.toml +++ b/rtiow/renderer/Cargo.toml @@ -23,6 +23,8 @@ serde_derive = "1.0.79" serde_json = "1.0.41" structopt = "0.2.10" vec3 = {path = "../vec3"} +stl = {path = "../../../stl"} +#stl = {git = "https://git-private.z.xinu.tv/wathiede/stl"} [dev-dependencies] criterion = "0.2" diff --git a/rtiow/renderer/src/aabb.rs b/rtiow/renderer/src/aabb.rs index a1454dc..95bf2a1 100644 --- a/rtiow/renderer/src/aabb.rs +++ b/rtiow/renderer/src/aabb.rs @@ -2,7 +2,7 @@ use std::fmt; use crate::{ray::Ray, vec3::Vec3}; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Copy, Clone, PartialEq)] pub struct AABB { bounds: [Vec3; 2], } diff --git a/rtiow/renderer/src/lib.rs b/rtiow/renderer/src/lib.rs index b6513f0..622ef2c 100644 --- a/rtiow/renderer/src/lib.rs +++ b/rtiow/renderer/src/lib.rs @@ -21,4 +21,5 @@ pub mod scenes; pub mod sphere; pub mod texture; pub mod translate; +pub mod triangles; pub mod vec3; diff --git a/rtiow/renderer/src/triangles.rs b/rtiow/renderer/src/triangles.rs new file mode 100644 index 0000000..acc78af --- /dev/null +++ b/rtiow/renderer/src/triangles.rs @@ -0,0 +1,76 @@ +use stl::STL; + +use crate::{ + aabb::AABB, + hitable::{Hit, HitRecord}, + material::Material, + ray::Ray, + vec3::{dot, Vec3}, +}; + +#[derive(Debug)] +pub struct Triangle { + pub normal: Vec3, + pub verts: [Vec3; 3], +} + +#[derive(Debug)] +pub struct Triangles +where + M: Material, +{ + triangles: Vec, + bbox: Option, + material: M, +} + +impl Triangles +where + M: Material, +{ + pub fn new(stl: &STL, material: M) -> Triangles { + let triangles: Vec<_> = stl + .triangles + .iter() + .map(|t| Triangle { + normal: t.normal, + verts: t.verts, + }) + .collect(); + let (min, max) = triangles.iter().fold( + (Vec3::from(f32::MAX), Vec3::from(f32::MIN)), + |(min, max), t| { + let t_min_x = t.verts[0].x.min(t.verts[1].x.min(t.verts[2].x)); + let t_min_y = t.verts[0].y.min(t.verts[1].y.min(t.verts[2].y)); + let t_min_z = t.verts[0].z.min(t.verts[1].z.min(t.verts[2].z)); + let t_max_x = t.verts[0].x.max(t.verts[1].x.max(t.verts[2].x)); + let t_max_y = t.verts[0].y.max(t.verts[1].y.max(t.verts[2].y)); + let t_max_z = t.verts[0].z.max(t.verts[1].z.max(t.verts[2].z)); + + ( + Vec3::from([min.x.min(t_min_x), min.y.min(t_min_y), min.z.min(t_min_z)]), + Vec3::from([max.x.max(t_max_x), max.y.max(t_max_y), max.z.max(t_max_z)]), + ) + }, + ); + let bbox = Some(AABB::new(min, max)); + Triangles { + triangles, + bbox, + material, + } + } +} + +impl Hit for Triangles +where + M: Material, +{ + fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option { + None + } + + fn bounding_box(&self, _t_min: f32, _t_max: f32) -> Option { + self.bbox + } +}