godot-box3d0.2.0-dev Box3D physics for Godot 4, as a drop-in PhysicsServer3D extension GitHub

Building from source

Requirements

godot-cpp is fetched automatically during configure, so it does not need to be installed.

Clone and build

git clone --recurse-submodules https://github.com/bearlikelion/godot-box3d.git
cd godot-box3d
cmake -B build
cmake --build build --parallel

If you cloned without --recurse-submodules:

git submodule update --init --recursive

The library lands in bin/ and is copied into test_project/addons/godot-box3d/bin/, so the demo project always runs against a fresh build.

Cross-compiling a Windows DLL from Linux

Needs MinGW-w64 installed.

cmake -B build-win --toolchain "$(pwd)/cmake/mingw-w64.cmake" -G Ninja
cmake --build build-win --parallel

This produces bin/godot-box3d.dll, statically linked against the MinGW runtime so no extra DLLs ship beside it. Release builds use the MSVC DLL from CI instead; this exists for exporting a Windows demo locally without waiting on a CI run.

The toolchain file also generates a capitalised Windows.h symlink, because box3d/src/timer.c includes it capitalised while MinGW ships lowercase windows.h and Linux filesystems are case-sensitive.

Running the tests

GODOT_BIN=/path/to/godot scripts/run_headless_tests.sh

The runner builds the extension, registers it, checks the Box3D backend actually loaded, then runs the headless regression tests. It exits non-zero if a test fails or leaks a Box3D RID. GODOT_BIN can be omitted when a suitable godot is on PATH.

The runner registers only Box3D. A second GDExtension built against a different Godot version can abort the process before Box3D registers, which would fail every test for an unrelated reason.

Tests live in test_project/tests/, one file per behavior, each extending SceneTree. Assertions were validated against stock Godot Physics first, so they encode real engine behavior rather than whatever this backend happened to do.

Regenerating demo screenshots

godot --path test_project --script res://tools/capture_demos.gd

Needs a real GPU. --headless forces the dummy rasterizer and writes blank images, so the script refuses to run there.