boxddd 0.4.0

Safe, ergonomic Rust bindings for Box3D
Documentation
use boxddd::prelude::*;

fn main() -> boxddd::Result<()> {
    let foundation = Foundation::initialize_default()?;
    let mut world = foundation.create_world(
        foundation
            .world_def_builder()
            .gravity(Vec3::new(0.0, -10.0, 0.0))
            .build()?,
    )?;

    let ground = world.create_body(
        foundation
            .body_def_builder()
            .position([0.0, -0.5, 0.0])
            .build()?,
    )?;
    world.create_hull_shape(
        ground,
        &foundation.shape_def(),
        &BoxHull::new(8.0, 0.5, 8.0)?,
    )?;

    let dynamic_body = world.create_body(
        foundation
            .body_def_builder()
            .body_type(BodyType::Dynamic)
            .position([-1.5, 2.5, 0.0])
            .build()?,
    )?;
    world.create_hull_shape(
        dynamic_body,
        &foundation
            .shape_def_builder()
            .density(1.0)
            .friction(0.4)
            .build()?,
        &BoxHull::cube(0.5)?,
    )?;

    let kinematic_body = world.create_body(
        foundation
            .body_def_builder()
            .body_type(BodyType::Kinematic)
            .position([1.5, 1.0, 0.0])
            .linear_velocity([0.75, 0.0, 0.0])
            .build()?,
    )?;
    world.create_sphere_shape(
        kinematic_body,
        &foundation.shape_def_builder().density(1.0).build()?,
        &Sphere::new(Vec3::ZERO, 0.35),
    )?;

    world.disable_body(dynamic_body)?;
    world.step(1.0 / 60.0, 4)?;
    let disabled_state = world.body_enabled(dynamic_body)?;
    println!("dynamic enabled after disable: {disabled_state}");
    assert!(!disabled_state, "expected disabled body to report disabled");

    world.enable_body(dynamic_body)?;
    let enabled_state = world.body_enabled(dynamic_body)?;
    println!("dynamic enabled after enable: {enabled_state}");
    assert!(enabled_state, "expected re-enabled body to report enabled");

    world.set_body_motion_locks(
        dynamic_body,
        MotionLocks::new(false, false, true, true, true, false),
    )?;
    world.apply_force_to_center(dynamic_body, [25.0, 0.0, 0.0], true)?;
    world.apply_linear_impulse_to_center(dynamic_body, [0.0, 4.0, 0.0], true)?;

    for _ in 0..60 {
        world.step(1.0 / 60.0, 4)?;
    }

    let dynamic_transform = world.body_transform(dynamic_body)?;
    let dynamic_velocity = world.body_linear_velocity(dynamic_body)?;
    let kinematic_position = world.body_position(kinematic_body)?;

    println!(
        "dynamic after force+impulse: position={:?}, velocity={:?}, locks={:?}",
        dynamic_transform.p,
        dynamic_velocity,
        world.body_motion_locks(dynamic_body)?
    );
    println!("kinematic body moved to: {kinematic_position:?}");

    world.set_body_type(kinematic_body, BodyType::Dynamic)?;
    world.set_body_linear_velocity(kinematic_body, [0.0, 0.0, 0.0])?;
    world.set_body_transform(kinematic_body, [0.0, 3.0, 0.0], Quat::IDENTITY)?;
    world.step(1.0 / 60.0, 4)?;
    let converted_type = world.body_type(kinematic_body)?;
    println!(
        "converted kinematic body type={:?}, synced position={:?}",
        converted_type,
        world.body_position(kinematic_body)?
    );
    assert_eq!(converted_type, BodyType::Dynamic);

    Ok(())
}