From 7d9750b9d0ae50f9ebdda3e7ab41c6eac10a3eaa Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 12 Feb 2023 16:51:25 -0800 Subject: [PATCH] rtiow: AABB handle infinite bounds better. --- rtiow/renderer/src/aabb.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/rtiow/renderer/src/aabb.rs b/rtiow/renderer/src/aabb.rs index 50934bd..2ddf404 100644 --- a/rtiow/renderer/src/aabb.rs +++ b/rtiow/renderer/src/aabb.rs @@ -47,7 +47,7 @@ impl AABB { // a vaild AABB. pub fn infinite() -> AABB { AABB { - bounds: [Vec3::from(f32::MAX), -Vec3::from(f32::MAX)], + bounds: [Vec3::from(f32::MAX), Vec3::from(f32::MIN)], } } pub fn new>(min: V, max: V) -> AABB { @@ -60,13 +60,29 @@ impl AABB { } pub fn area(&self) -> f32 { + if self.max().x == f32::MIN || self.min().x == f32::MAX { + return 0.; + } let e = self.max() - self.min(); - e.x * e.y + e.y * e.z + e.z * e.x + let v = e.x * e.y + e.y * e.z + e.z * e.x; + if v.is_finite() { + v + } else { + 0. + } } pub fn volume(&self) -> f32 { - (self.min().x - self.max().x).abs() + if self.max().x == f32::MIN || self.min().x == f32::MAX { + return 0.; + } + let v = (self.min().x - self.max().x).abs() * (self.min().y - self.max().y).abs() - * (self.min().z - self.max().z).abs() + * (self.min().z - self.max().z).abs(); + if v.is_finite() { + v + } else { + 0. + } } pub fn grow(&mut self, v: Vec3) { @@ -255,6 +271,13 @@ pub fn surrounding_box(box0: &AABB, box1: &AABB) -> AABB { mod tests { use super::*; + #[test] + fn infinite() { + let bb = AABB::infinite(); + assert_eq!(bb.area(), 0.); + assert_eq!(bb.volume(), 0.); + } + macro_rules! hit_test { ($($name:ident,)*) => { $(