rtiow: BVHTriangles add tests comparing results with Cuboid impl.
This commit is contained in:
parent
95827a4a52
commit
fc1bfa419e
@ -183,7 +183,7 @@ where
|
|||||||
|
|
||||||
let v0v1 = v1 - v0;
|
let v0v1 = v1 - v0;
|
||||||
let v0v2 = v2 - v0;
|
let v0v2 = v2 - v0;
|
||||||
let normal = cross(v0v1, v0v2);
|
let normal = cross(v0v1, v0v2).unit_vector();
|
||||||
return Some(HitRecord {
|
return Some(HitRecord {
|
||||||
t,
|
t,
|
||||||
uv,
|
uv,
|
||||||
@ -289,3 +289,64 @@ fn ray_triangle_intersect_moller_trumbore(r: Ray, tri: &Triangle) -> Option<RayT
|
|||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{
|
||||||
|
bvh_triangles::BVHTriangles, cuboid::Cuboid, hitable::Hit, material::Dielectric, ray::Ray,
|
||||||
|
};
|
||||||
|
use std::{
|
||||||
|
io::{BufReader, Cursor},
|
||||||
|
sync::Arc,
|
||||||
|
};
|
||||||
|
use stl::STL;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compare_cuboid() {
|
||||||
|
let c = Cuboid::new(
|
||||||
|
[0., 0., 0.].into(),
|
||||||
|
[20., 20., 20.].into(),
|
||||||
|
Arc::new(Dielectric::new(1.5)),
|
||||||
|
);
|
||||||
|
let stl_cube = STL::parse(
|
||||||
|
BufReader::new(Cursor::new(include_bytes!("../stls/cube.stl"))),
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.expect("failed to parse cube");
|
||||||
|
|
||||||
|
let s = BVHTriangles::new(
|
||||||
|
&stl_cube,
|
||||||
|
Dielectric::new(1.5),
|
||||||
|
//Metal::new(Vec3::new(0.8, 0.8, 0.8), 0.2),
|
||||||
|
//Lambertian::new(ConstantTexture::new(Vec3::new(1.0, 0.2, 0.2))),
|
||||||
|
);
|
||||||
|
let rays = [
|
||||||
|
Ray::new([-1., 1., 1.], [1., 0., 0.], 0.),
|
||||||
|
Ray::new([21., 1., 1.], [-1., 0., 0.], 0.),
|
||||||
|
Ray::new([1., -1., 1.], [0., 1., 0.], 0.),
|
||||||
|
Ray::new([1., 21., 1.], [0., -1., 0.], 0.),
|
||||||
|
Ray::new([1., 1., -1.], [0., 0., 1.], 0.),
|
||||||
|
Ray::new([1., 1., 21.], [0., 0., -1.], 0.),
|
||||||
|
// TODO more
|
||||||
|
];
|
||||||
|
|
||||||
|
for (i, r) in rays.into_iter().enumerate() {
|
||||||
|
let c_hit = c.hit(r, 0., f32::MAX).expect("c_hit missed");
|
||||||
|
let s_hit = s.hit(r, 0., f32::MAX).expect("s_hit missed");
|
||||||
|
assert_eq!(
|
||||||
|
c_hit.t, s_hit.t,
|
||||||
|
"{i}: [t] c_hit: {c_hit:?}, s_hit: {s_hit:?}"
|
||||||
|
);
|
||||||
|
// uv isn't valid for BVHTriangles.
|
||||||
|
// assert_eq!( c_hit.uv, s_hit.uv, "{i}: [uv] c_hit: {c_hit:?}, s_hit: {s_hit:?}");
|
||||||
|
assert_eq!(
|
||||||
|
c_hit.p, s_hit.p,
|
||||||
|
"{i}: [p] c_hit: {c_hit:?}, s_hit: {s_hit:?}"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
c_hit.normal, s_hit.normal,
|
||||||
|
"{i}: [normal] c_hit: {c_hit:?}, s_hit: {s_hit:?}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user