rtiow: AABB handle infinite bounds better.
This commit is contained in:
parent
88b8c547e0
commit
7d9750b9d0
@ -47,7 +47,7 @@ impl AABB {
|
|||||||
// a vaild AABB.
|
// a vaild AABB.
|
||||||
pub fn infinite() -> AABB {
|
pub fn infinite() -> AABB {
|
||||||
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 {
|
pub fn new<V: Into<Vec3>>(min: V, max: V) -> AABB {
|
||||||
@ -60,13 +60,29 @@ impl AABB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn area(&self) -> f32 {
|
pub fn area(&self) -> f32 {
|
||||||
|
if self.max().x == f32::MIN || self.min().x == f32::MAX {
|
||||||
|
return 0.;
|
||||||
|
}
|
||||||
let e = self.max() - self.min();
|
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 {
|
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().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) {
|
pub fn grow(&mut self, v: Vec3) {
|
||||||
@ -255,6 +271,13 @@ pub fn surrounding_box(box0: &AABB, box1: &AABB) -> AABB {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn infinite() {
|
||||||
|
let bb = AABB::infinite();
|
||||||
|
assert_eq!(bb.area(), 0.);
|
||||||
|
assert_eq!(bb.volume(), 0.);
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! hit_test {
|
macro_rules! hit_test {
|
||||||
($($name:ident,)*) => {
|
($($name:ident,)*) => {
|
||||||
$(
|
$(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user