use alice_physics::collider::{gjk, ScaledShape, Sphere, Support, AABB};
use alice_physics::math::{Fix128, Vec3Fix};
fn v3(x: i64, y: i64, z: i64) -> Vec3Fix {
Vec3Fix::from_int(x, y, z)
}
fn main() {
let scaled = ScaledShape::new(Sphere::new(v3(1, 0, 0), Fix128::ONE), Fix128::from_int(2));
assert_eq!(scaled.support(v3(1, 0, 0)), v3(4, 0, 0));
assert_eq!(scaled.support(v3(-1, 0, 0)), v3(0, 0, 0));
assert_eq!(scaled.support(v3(0, 1, 0)), v3(2, 2, 0));
println!(
"[scaled_shape] ball (1,0,0) r 1 x 2 -> support +x {:?}",
scaled.support(v3(1, 0, 0)).to_f32()
);
let probe = |x: i64| Sphere::new(v3(x, 0, 0), Fix128::ONE);
assert!(gjk(&scaled, &probe(4)).colliding, "centre distance 2 < 3");
assert!(!gjk(&scaled, &probe(6)).colliding, "centre distance 4 > 3");
assert!(!gjk(&Sphere::new(v3(1, 0, 0), Fix128::ONE), &probe(4)).colliding);
println!("[scaled_shape] gjk: probe at x = 4 hits the scaled ball, at x = 6 misses");
let mirrored = ScaledShape::new(AABB::new(v3(1, 1, 1), v3(2, 3, 4)), Fix128::from_int(-2));
assert_eq!(mirrored.support(v3(1, 1, 1)), v3(-2, -2, -2));
assert_eq!(mirrored.support(v3(-1, -1, -1)), v3(-4, -6, -8));
assert!(gjk(&mirrored, &Sphere::new(v3(-3, -4, -5), Fix128::ONE)).colliding);
assert!(!gjk(&mirrored, &Sphere::new(v3(3, 4, 5), Fix128::ONE)).colliding);
println!("[scaled_shape] box x -2 spans [-4,-2]x[-6,-2]x[-8,-2]");
}