use glam::{Mat4, Vec3};
use physx::prelude::*;
const PX_PHYSICS_VERSION: u32 = physx::version(4, 1, 1);
fn main() {
let mut foundation = Foundation::new(PX_PHYSICS_VERSION);
let mut physics = PhysicsBuilder::default()
.load_extensions(false)
.build(&mut foundation);
let mut scene = physics.create_scene(
SceneBuilder::default()
.set_gravity(Vec3::new(0.0, -9.81, 0.0))
.set_simulation_threading(SimulationThreadType::Dedicated(1)),
);
let material = physics.create_material(0.5, 0.5, 0.6);
let ground_plane = unsafe { physics.create_plane(Vec3::new(0.0, 1.0, 0.0), 0.0, material) };
scene.add_actor(ground_plane);
let sphere_geo = PhysicsGeometry::from(&ColliderDesc::Sphere(10.0));
let mut sphere_actor = unsafe {
physics.create_dynamic(
Mat4::from_translation(Vec3::new(0.0, 40.0, 100.0)),
sphere_geo.as_raw(), material,
10.0,
Mat4::identity(),
)
};
sphere_actor.set_angular_damping(0.5);
let sphere_handle = scene.add_dynamic(sphere_actor);
let heights_over_time = (0..100)
.map(|_| {
scene.simulate(0.1);
scene
.fetch_results(true)
.expect("error occured during simulation");
unsafe { scene.get_rigid_actor_unchecked(&sphere_handle) }
.get_global_position()
.y() as i32
- 10
})
.collect::<Vec<_>>();
let max_h = 18;
(0..max_h)
.map(|h| {
let h = max_h - 1 - h;
heights_over_time
.iter()
.enumerate()
.map(|(_t, p)| if h == *p { 'o' } else { ' ' })
.collect::<String>()
})
.for_each(|line| println!("{}", line));
unsafe {
scene.release();
}
drop(physics);
foundation.release();
}