The Rust rewrite of Unhuman Engine — a real-time engine for robotics simulation, synthetic data generation and games.
The C++ tree is the specification; this repository is the port, and it is a port with
opinions: the five structural failures docs/architecture/00-spine.md documents in the
C++ (ambient globals, a hollow RHI abstraction, two owners of synchronization, a render
graph whose parallelism was thrown away by one shared command buffer) are the reason
each subsystem here has the shape it has.
UHE/src/core/ adam Engine, App, the plugin registry, the loop
UHE/src/rhi/ chassis the backend-neutral RHI and the render graph
UHE/src/jobs/ grind job system and task graph
UHE/src/shaders/ forge Slang and WGSL in, SPIR-V out
UHE/src/events/ pings event bus, key and mouse codes
UHE/src/platform/ eyes window and input (winit)
UHE/src/scene/ meats ECS, components, hierarchy, .unhuman serialisation
UHE/src/assets/ vault asset registry, VFS, loaders
UHE/src/renderer/ bifrost the renderer frontend
UHE/src/audio/ wire audio
UHE/src/physics/ femur rigid bodies and colliders
UHE/Stormbreaker/wgpu/ stormglass the wgpu backend (default)
UHE/Stormbreaker/vulkan/ stormbreaker the Vulkan backend (opt-in)
UHE/bins/ nocap (headless), sandbox (windowed)
UHE-EDITOR/mirror/ mirror the editor model
UHE-EDITOR/editor/ editor the gpui editor binary
UHE-AIMLAB/aimlab/ the UHEGAME demo, as a plugin
docs/architecture/01-crate-map.md is the interface contract every crate is written
against: the seams, the dependency direction, the things deliberately not ported, and
why. docs/WORK.md is the state of the work and the rules this repository runs by.
cargo build --workspace # logic crates only; no GPU, no Vulkan SDK needed
./scripts/gate.sh # the whole gate: build, clippy -D warnings, tests
./scripts/gate.sh --no-vulkan # on a machine with no driver
./scripts/parity.sh # coverage: every C++ file ported or a recorded reasonscripts/gate.sh is the gate: a green run locally means a green run in CI. Two rules it
encodes are there because getting them wrong produces a green run that means nothing —
validation is enabled only through DeviceOptions::from_env, and the suites run with
--test-threads=1 because they share one device and one scratch directory.
scripts/parity.sh is the check behind this README's claim that nothing was left behind:
232 C++ files, each mapped to the Rust file that holds its port or to a recorded reason it
does not exist. It exits non-zero on a file it cannot place, and it verifies that every
target in its table still exists, so a rename breaks the check instead of the table going
stale. Point it at a C++ checkout (scripts/parity.sh ../UNHUMAN, the default) or run it
where the tree is absent — it says so and passes.
Backends: wgpu by default, Vulkan opt-in, chosen by --backend, UHE_BACKEND or a
backend key in the settings file. That is a stability decision, not a preference: when
a frame is wrong the first question is "the backend or the engine".
Listed with a reason each in docs/architecture/01-crate-map.md — the C++ render graph's
legacy BeginRenderPass, cached graph compilation, the excluded 2D renderer, the
vestigial Linux platform layer, basis_universal transcoding, runtime MSDF atlas
generation (the runtime path is a coverage atlas; the MSDF path reads a pre-baked one),
and Tracy/spdlog.
The whole C++ tree outside Platform/Vulkan has a Rust counterpart, and the tree
builds clean: cargo build --workspace (and --all-targets, --release,
--locked), clippy -D warnings and rustfmt --check all pass, and the
driver-free suite is green. The backend suite runs in CI against lavapipe. The
seams are documented and the tests exist; docs/WORK.md is the state of the work.
Contributions are accepted under the terms of CLA.md; sign off your
commits (git commit -s) or state your agreement on the pull request.
Licensed under the Apache License, Version 2.0 — see LICENSE and
NOTICE.