mod cast;
mod gjk;
mod simplex;
mod toi;
mod types;
pub use cast::{get_sweep_transform, shape_cast};
pub use gjk::{get_point_support, get_proxy_support, shape_distance};
pub use toi::time_of_impact;
pub use types::{
CastOutput, DistanceInput, DistanceOutput, ShapeCastPairInput, ShapeProxy, Simplex,
SimplexCache, SimplexVertex, Sweep, ToiInput, ToiOutput, ToiState,
};
use crate::constants::MAX_SHAPE_CAST_POINTS;
use crate::math_functions::{
add, invert_transform, make_aabb, make_matrix_from_quat, min_int, mul_mv, Aabb, Transform, Vec3,
};
pub fn make_proxy(points: &[Vec3], radius: f32) -> ShapeProxy {
let count = min_int(points.len() as i32, MAX_SHAPE_CAST_POINTS as i32);
let mut proxy = ShapeProxy {
count,
radius,
..Default::default()
};
proxy.points[..count as usize].copy_from_slice(&points[..count as usize]);
proxy
}
pub fn make_local_proxy(proxy: &ShapeProxy, transform: Transform) -> ShapeProxy {
let inv_transform = invert_transform(transform);
let r = make_matrix_from_quat(inv_transform.q);
let count = min_int(proxy.count, MAX_SHAPE_CAST_POINTS as i32);
let mut local = ShapeProxy {
count,
radius: proxy.radius,
..Default::default()
};
for i in 0..count as usize {
local.points[i] = add(mul_mv(r, proxy.points[i]), inv_transform.p);
}
local
}
pub fn compute_proxy_aabb(proxy: &ShapeProxy) -> Aabb {
debug_assert!(proxy.count > 0);
make_aabb(&proxy.points[..proxy.count as usize], proxy.radius)
}