rtiow: stub triangles shape created from STLs.

This commit is contained in:
Bill Thiede 2023-01-15 11:55:11 -08:00
parent 54e72cd81d
commit 39eeb79409
5 changed files with 172 additions and 6 deletions

97
rtiow/Cargo.lock generated
View File

@ -223,6 +223,12 @@ dependencies = [
"winapi 0.3.9", "winapi 0.3.9",
] ]
[[package]]
name = "anyhow"
version = "1.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
[[package]] [[package]]
name = "askama" name = "askama"
version = "0.7.2" version = "0.7.2"
@ -1670,7 +1676,7 @@ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
"stderrlog", "stderrlog",
"structopt", "structopt 0.2.18",
] ]
[[package]] [[package]]
@ -1685,7 +1691,7 @@ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
"stderrlog", "stderrlog",
"structopt", "structopt 0.2.18",
"warp", "warp",
] ]
@ -1932,6 +1938,30 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 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]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "0.4.30" version = "0.4.30"
@ -2288,7 +2318,8 @@ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
"structopt", "stl",
"structopt 0.2.18",
"vec3", "vec3",
] ]
@ -2550,6 +2581,18 @@ dependencies = [
"thread_local", "thread_local",
] ]
[[package]]
name = "stl"
version = "0.1.0"
dependencies = [
"ansi_term",
"anyhow",
"byteorder",
"structopt 0.3.26",
"thiserror",
"vec3",
]
[[package]] [[package]]
name = "string" name = "string"
version = "0.2.1" version = "0.2.1"
@ -2572,7 +2615,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7"
dependencies = [ dependencies = [
"clap", "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]] [[package]]
@ -2587,6 +2641,19 @@ dependencies = [
"syn 0.15.44", "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]] [[package]]
name = "subtle" name = "subtle"
version = "2.4.1" version = "2.4.1"
@ -2671,6 +2738,26 @@ dependencies = [
"unicode-width", "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]] [[package]]
name = "thread_local" name = "thread_local"
version = "0.3.4" version = "0.3.4"
@ -2964,7 +3051,7 @@ dependencies = [
"log 0.4.17", "log 0.4.17",
"renderer", "renderer",
"stderrlog", "stderrlog",
"structopt", "structopt 0.2.18",
] ]
[[package]] [[package]]

View File

@ -23,6 +23,8 @@ serde_derive = "1.0.79"
serde_json = "1.0.41" serde_json = "1.0.41"
structopt = "0.2.10" structopt = "0.2.10"
vec3 = {path = "../vec3"} vec3 = {path = "../vec3"}
stl = {path = "../../../stl"}
#stl = {git = "https://git-private.z.xinu.tv/wathiede/stl"}
[dev-dependencies] [dev-dependencies]
criterion = "0.2" criterion = "0.2"

View File

@ -2,7 +2,7 @@ use std::fmt;
use crate::{ray::Ray, vec3::Vec3}; use crate::{ray::Ray, vec3::Vec3};
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq)]
pub struct AABB { pub struct AABB {
bounds: [Vec3; 2], bounds: [Vec3; 2],
} }

View File

@ -21,4 +21,5 @@ pub mod scenes;
pub mod sphere; pub mod sphere;
pub mod texture; pub mod texture;
pub mod translate; pub mod translate;
pub mod triangles;
pub mod vec3; pub mod vec3;

View File

@ -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<M>
where
M: Material,
{
triangles: Vec<Triangle>,
bbox: Option<AABB>,
material: M,
}
impl<M> Triangles<M>
where
M: Material,
{
pub fn new<V>(stl: &STL, material: M) -> Triangles<M> {
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<M> Hit for Triangles<M>
where
M: Material,
{
fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option<HitRecord> {
None
}
fn bounding_box(&self, _t_min: f32, _t_max: f32) -> Option<AABB> {
self.bbox
}
}