boxdd - Rust bindings for Box2D v3 (C API)

Crates
boxdd-sys: low-level FFI for the official Box2D v3 C API (vendored)boxdd: safe layer (world, bodies, shapes, joints, queries, events, debug draw)
Highlights
- Safe, ergonomic Rust wrapper over the official Box2D v3 C API.
- Mint interop by default: any
Into<Vec2>acceptsmint::Vector2<f32>,mint::Point2<f32>, arrays/tuples.
Quickstart
use ;
let def = builder.gravity.build;
let mut world = new.unwrap;
let mut body = world.create_body;
let poly = box_polygon;
let _shape = body.create_polygon_shape;
world.step;
Features (optional)
serde: serialization forVec2,Rot(radians),Transform({ pos, angle }) and config types.serialize: snapshot helpers (save/apply world config; take/rebuild minimal full-scene snapshot).cgmath,nalgebra,glam: conversions with their 2D types (e.g.Vector2/Point2,UnitComplex/Isometry2,glam::Vec2).
Snapshots
- Enable
serializeand see exampleexamples/scene_serialize.rsfor a minimal scene round-trip. - Note: chain shapes are captured when created via ID-style API (
World::create_chain_for_id).
Build Modes
- From source: builds vendored Box2D C sources via
ccand uses pregenerated bindings by default.- Example:
cargo build -p boxdd.
- Example:
- System library (optional): link an existing
box2dinstalled on the system.- Via env: set
BOX2D_LIB_DIR=/path/to/liband optionallyBOXDD_SYS_LINK_KIND=static|dylib. - Via feature: enable
pkg-configand providebox2dthrough your system's package manager. - Note: crate features that affect C build (e.g.
simd-avx2,disable-simd,validate) are ignored in system mode. SetBOXDD_SYS_STRICT_FEATURES=1to fail the build if such features are enabled.
- Via env: set
Getting Started
# run some examples
Examples
- The
examples/folder covers worlds/bodies/shapes, joints, queries/casts, events/sensors, CCD, and debug draw.
Events
- Three access styles:
- By value:
world.contact_events()/sensor_events()/body_events()/joint_events()return owned data for storage or cross-frame use. - Zero‑copy views:
with_*_events_view(...)iterate without exposing FFI types and without allocations (recommended for per‑frame processing). - Raw slices:
with_*_events(...)expose FFI slices for power users; valid only within the callback.
- By value:
- Example (zero‑copy views):
use *;
let mut world = new.unwrap;
world.with_contact_events_view;
world.with_sensor_events_view;
world.with_body_events_view;
world.with_joint_events_view;
Notes
- Vendored C sources + pregenerated bindings by default (no LLVM needed on CI). To force bindgen: set
BOXDD_SYS_FORCE_BINDGEN=1and ensurelibclangis available. On Windows/MSVC, setLIBCLANG_PATHif needed. - On docs.rs, the native C build is skipped.
Documentation
- Local:
cargo doc --open - Online: https://docs.rs/boxdd
Acknowledgments
- Thanks to the Rust Box2D bindings project for prior art and inspiration: https://github.com/Bastacyclop/rust_box2d
- Huge thanks to the upstream Box2D project by Erin Catto: https://github.com/erincatto/box2d
Related Projects
If you're working with graphics applications in Rust, you might also be interested in:
- asset-importer - A comprehensive Rust binding for the latest Assimp 3D asset import library, providing robust 3D model loading capabilities for graphics applications
- dear-imgui - Comprehensive Dear ImGui bindings for Rust using C++ bindgen, providing immediate mode GUI capabilities for graphics applications
License
boxdd: MIT OR Apache-2.0boxdd-sys: MIT OR Apache-2.0