rtiow: precache some things in Triangles.

This commit is contained in:
Bill Thiede 2023-01-15 15:29:52 -08:00
parent a0fb4637b5
commit a8756debb8
2 changed files with 31 additions and 23 deletions

View File

@ -16,7 +16,7 @@ use crate::{
}; };
pub fn new(opt: &Opt) -> Scene { pub fn new(opt: &Opt) -> Scene {
let lookfrom = Vec3::new(200., 200., 200.); let lookfrom = Vec3::new(100., 200., 200.);
let lookat = Vec3::new(0., 1., 0.); let lookat = Vec3::new(0., 1., 0.);
let dist_to_focus = 10.0; let dist_to_focus = 10.0;
let aperture = 0.0; let aperture = 0.0;
@ -48,9 +48,10 @@ pub fn new(opt: &Opt) -> Scene {
let light_height = 200.; let light_height = 200.;
let tri_mesh = Triangles::new( let tri_mesh = Triangles::new(
&stl_cube, &stl_cube,
Lambertian::new(ConstantTexture::new(Vec3::new(1., 0., 0.))), Lambertian::new(ConstantTexture::new(Vec3::new(1., 0.1, 0.1))),
1.,
); );
dbg!(&tri_mesh); dbg!(tri_mesh.triangles.len(), tri_mesh.bbox);
let objects: Vec<Box<dyn Hit>> = vec![ let objects: Vec<Box<dyn Hit>> = vec![
// Light from above // Light from above
Box::new(XZRect::new( Box::new(XZRect::new(

View File

@ -10,9 +10,14 @@ use crate::{
#[derive(Debug)] #[derive(Debug)]
pub struct Triangle { pub struct Triangle {
pub normal: Vec3, normal: Vec3,
verts: [Vec3; 3],
// Precomputed data
// TODO(wathiede): precompute `d` on load. // TODO(wathiede): precompute `d` on load.
pub verts: [Vec3; 3], d: f32,
edge0: Vec3,
edge1: Vec3,
edge2: Vec3,
} }
#[derive(Debug)] #[derive(Debug)]
@ -20,8 +25,8 @@ pub struct Triangles<M>
where where
M: Material, M: Material,
{ {
triangles: Vec<Triangle>, pub triangles: Vec<Triangle>,
bbox: AABB, pub bbox: AABB,
material: M, material: M,
} }
@ -29,13 +34,22 @@ impl<M> Triangles<M>
where where
M: Material, M: Material,
{ {
pub fn new(stl: &STL, material: M) -> Triangles<M> { pub fn new(stl: &STL, material: M, scale_factor: f32) -> Triangles<M> {
let triangles: Vec<_> = stl let triangles: Vec<_> = stl
.triangles .triangles
.iter() .iter()
.map(|t| Triangle { .map(|t| {
normal: t.normal, let v0 = t.verts[0] * scale_factor;
verts: t.verts, let v1 = t.verts[1] * scale_factor;
let v2 = t.verts[2] * scale_factor;
Triangle {
normal: t.normal,
verts: [v0, v1, v2],
d: -dot(t.normal, t.verts[0]),
edge0: v1 - v0,
edge1: v2 - v1,
edge2: v0 - v2,
}
}) })
.collect(); .collect();
let (min, max) = triangles.iter().fold( let (min, max) = triangles.iter().fold(
@ -68,11 +82,8 @@ where
M: Material, M: Material,
{ {
// Based on https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ray-triangle-intersection-geometric-solution.html // Based on https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ray-triangle-intersection-geometric-solution.html
fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option<HitRecord> { fn hit(&self, r: Ray, _t_min: f32, _t_max: f32) -> Option<HitRecord> {
for tri in &self.triangles { for tri in &self.triangles {
let v0 = tri.verts[0];
let v1 = tri.verts[1];
let v2 = tri.verts[2];
let n = tri.normal; let n = tri.normal;
// close enough to parallel, won't hit // close enough to parallel, won't hit
@ -83,8 +94,7 @@ where
continue; continue;
} }
let d = -dot(n, tri.verts[0]); let t = -(dot(n, r.origin) + tri.d) / n_dot_dir;
let t = -(dot(n, r.origin) + d) / n_dot_dir;
// check if the triangle is behind the ray // check if the triangle is behind the ray
if t < 0. { if t < 0. {
continue; continue;
@ -95,23 +105,20 @@ where
let v1 = tri.verts[1]; let v1 = tri.verts[1];
let v2 = tri.verts[2]; let v2 = tri.verts[2];
let edge0 = v1 - v0;
let vp0 = p - v0; let vp0 = p - v0;
let c = cross(edge0, vp0); let c = cross(tri.edge0, vp0);
if dot(n, c) < 0. { if dot(n, c) < 0. {
continue; continue;
} }
let edge1 = v2 - v1;
let vp1 = p - v1; let vp1 = p - v1;
let c = cross(edge1, vp1); let c = cross(tri.edge1, vp1);
if dot(n, c) < 0. { if dot(n, c) < 0. {
continue; continue;
} }
let edge2 = v0 - v2;
let vp2 = p - v2; let vp2 = p - v2;
let c = cross(edge2, vp2); let c = cross(tri.edge2, vp2);
if dot(n, c) < 0. { if dot(n, c) < 0. {
continue; continue;
} }