pub mod aabb;
pub mod fixed;
pub mod frustum;
pub mod ray;
pub mod spatial;
pub use bevy_math::{EulerRot, Mat3, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4};
pub use aabb::Aabb;
pub use fixed::{Fp32, FpVec3};
pub use frustum::{Frustum, Intersection, Plane};
pub use ray::Ray;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ray_intersects_aabb_inside_frustum() {
let view = Mat4::look_at_rh(Vec3::new(0.0, 0.0, 5.0), Vec3::ZERO, Vec3::Y);
let proj = Mat4::perspective_rh(std::f32::consts::FRAC_PI_4, 1.0, 0.1, 100.0);
let vp = proj * view;
let frustum = Frustum::from_matrix(&vp);
let aabb = Aabb::new(Vec3::splat(-1.0), Vec3::splat(1.0));
assert_eq!(frustum.test_aabb(aabb), Intersection::Inside);
let ray = Ray::new(Vec3::new(0.0, 0.0, 5.0), Vec3::new(0.0, 0.0, -1.0));
let t = ray.intersect_aabb(aabb);
assert!(t.is_some());
let intersection_distance = t.unwrap();
assert!((intersection_distance - 4.0).abs() < 1e-5);
}
#[test]
fn aabb_transform_then_frustum_cull() {
let view = Mat4::look_at_rh(Vec3::new(0.0, 0.0, 5.0), Vec3::ZERO, Vec3::Y);
let proj = Mat4::perspective_rh(std::f32::consts::FRAC_PI_4, 1.0, 0.1, 100.0);
let vp = proj * view;
let frustum = Frustum::from_matrix(&vp);
let local_aabb = Aabb::new(Vec3::splat(-0.5), Vec3::splat(0.5));
let inside_mat = Mat4::from_translation(Vec3::new(0.0, 0.0, -10.0));
let world_aabb_inside = local_aabb.transform(&inside_mat);
assert_eq!(frustum.test_aabb(world_aabb_inside), Intersection::Inside);
let outside_mat = Mat4::from_translation(Vec3::new(100.0, 0.0, 0.0));
let world_aabb_outside = local_aabb.transform(&outside_mat);
assert_eq!(frustum.test_aabb(world_aabb_outside), Intersection::Outside);
}
}