use alice_physics::math::{Fix128, Vec3Fix};
use alice_physics::solver::{PhysicsConfig, PhysicsWorld, RigidBody};
fn main() {
let config = PhysicsConfig {
substeps: 4,
iterations: 8,
gravity: Vec3Fix::new(Fix128::ZERO, Fix128::from_int(-10), Fix128::ZERO),
damping: Fix128::from_ratio(99, 100),
..Default::default()
};
let mut world = PhysicsWorld::new(config);
let floor = RigidBody::new_static(Vec3Fix::new(
Fix128::ZERO,
Fix128::from_int(-1),
Fix128::ZERO,
));
world.add_body(floor);
let ball = RigidBody::new_dynamic(
Vec3Fix::new(Fix128::ZERO, Fix128::from_int(10), Fix128::ZERO),
Fix128::ONE, );
world.add_body(ball);
let ball2 = RigidBody::new_dynamic(
Vec3Fix::new(Fix128::from_int(2), Fix128::from_int(15), Fix128::ZERO),
Fix128::from_int(2), )
.with_restitution(Fix128::from_ratio(8, 10))
.with_linear_damping(Fix128::from_ratio(95, 100));
world.add_body(ball2);
println!("ALICE-Physics Basic Example");
println!("===========================");
println!("Bodies: {}", world.body_count());
println!();
let dt = Fix128::from_ratio(1, 60);
for frame in 0..120 {
world.step(dt);
if frame % 20 == 0 {
let pos1 = world.bodies[1].position;
let pos2 = world.bodies[2].position;
println!(
"Frame {:3}: ball1 y={:.4} ball2 y={:.4}",
frame,
pos1.y.to_f64(),
pos2.y.to_f64(),
);
}
}
println!();
println!("Simulation complete (120 frames, 2 seconds).");
println!("Debug: {world:?}");
}