rtiow: AABB handle infinite bounds better.
This commit is contained in:
parent
88b8c547e0
commit
7d9750b9d0
@ -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,)*) => {
|
||||
$(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user