rtiow: AABB handle infinite bounds better.

This commit is contained in:
Bill Thiede 2023-02-12 16:51:25 -08:00
parent 88b8c547e0
commit 7d9750b9d0

View File

@ -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<V: Into<Vec3>>(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,)*) => {
$(