Gizmo Engine is a high-performance, data-driven, and fully modular game development framework. Designed specifically for large-scale physics simulations, advanced vehicular dynamics, and modern 3D rendering, it provides an industry-standard workflow with zero external physics API dependencies.
- Deterministic simulation: The rigid-body simulation is bit-exactly reproducible on the same platform — the property that makes replay, deterministic rollback netcode and reproducible bug reports possible. It is enforced, not hoped for: a
state_hashover the world, a cross-process oracle that runs the same scene in two separate processes (different hash seeds) and compares, and long-horizon soak tests all gate CI. Cross-platform bit-exactness is explicitly out of scope — seedocs/ENGINE.md§5. - Archetype-based ECS: A columnar, data-driven Entity Component System built for cache locality, easily scaling to tens of thousands of entities. Systems declare their component access and the scheduler batches non-conflicting ones onto a Rayon pool. Component access goes through a borrow-checked query API — shared reads via
World::query(read-only), exclusive mutation viaWorld::query_mut/borrow_mut— so two aliasing&mutviews can never be created from safe code, a contract fenced bycompile_faildoctests and a Miri job in CI. - Custom Physics Engine: Written from scratch, with no third-party physics dependency. Features include:
- Dynamic AABB tree (BVH) broad-phase with swept AABBs for CCD.
- GJK/EPA narrow-phase (sphere, box, capsule, plane, convex hull, triangle mesh, compound), with a dedicated SAT path and full contact manifold for box–box.
- TGS-Soft contact solver — temporal Gauss-Seidel with inter-iteration position integration, a per-manifold block LCP, warm starting and a true two-tangent Coulomb friction cone. Islands are solved in parallel via Rayon, in a deterministic order.
- FEM (Finite Element Method) soft bodies — compressible Neo-Hookean first Piola–Kirchhoff stress — plus XPBD cloth, rope and Voronoi fracture.
- WGPU-Based Rendering: A graphics pipeline targeting Vulkan, Metal, DX12 — and WebGPU in the browser. Features Instanced Rendering, GLTF PBR Materials, Dynamic Shadows (CSM), SSAO, SSGI, Bloom, TAA and Deferred Shading. The engine also runs on
wasm32-unknown-unknownwith a substantially reduced web pipeline (forward-only, fixed internal resolution, no shadows/AO/GI/TAA); try it with thedemo-web/crate. Networking and Lua scripting are native-only — seedocs/ENGINE.md. - In-Game Editor:
egui-based tooling with a scene hierarchy, an inspector for the engine's built-in components, transform gizmos and prefabs. It is a library of panels (gizmo-editor); the editor application (gizmo-studio) is not published to crates.io yet, and the inspector does not yet cover user-defined components. - Spatial Audio: RAM-cached 3D audio with distance attenuation and pitch-based Doppler, on a mixer with named buses (
music/sfx/ui/voice) and a master gain — a scene's chosen bus is applied on the engine's own audio pass. A live low-pass filter, retunable while a sound plays, drives the underwater muffle. It runs in the browser too —gizmo-audiohas a wasm backend anddemo-webenables it.
Gizmo Engine is designed to be highly modular and ergonomic. Here is a minimal
example — the default 3d_scene demo — that opens a window and renders a lit
3D scene (a ground disc, a cube, a directional light, and a camera) using the
high-level SimpleApp API.
use gizmo::prelude::*;
use gizmo::math::Vec3;
use gizmo::simple::{SimpleAppExt, SimpleSceneState};
fn main() {
gizmo::app::App::<SimpleSceneState>::new("Gizmo Engine - 3D Scene", 1280, 720)
.with_simple_scene(|scene, state| {
// Circular ground disc.
scene.spawn_ground(4.0);
// A cube sitting on the ground.
scene.spawn_cube(Vec3::new(0.0, 0.5, 0.0), 1.0, Vec3::new(0.20, 0.28, 1.0));
// A directional light.
let light = scene.world.spawn();
DirectionalLightBundle {
rotation: Quat::from_rotation_x(-std::f32::consts::FRAC_PI_4)
* Quat::from_rotation_y(std::f32::consts::FRAC_PI_4),
intensity: 1.8,
..Default::default()
}
.apply(scene.world, light);
// A camera looking at the origin.
scene.spawn_camera(state, Vec3::new(-2.5, 4.5, 9.0), Vec3::ZERO);
})
.run()
.expect("failed to run the app");
}The full source is
demo/src/bin/3d_scene.rs. For lower-level control, drop down toApp,Plugin,Commands,Query,Res/ResMut, and the*Bundletypes ingizmo::prelude.
Gizmo is a workspace of small crates layered bottom-up, so you can depend on the parts you need rather than the whole engine.
gizmo-math: Vector/quaternion math (re-exportsglam).gizmo-core: The foundational ECS, scheduling, events, hierarchy and input.gizmo-physics-core/-rigid/-dynamics/-soft: The physics stack — colliders and collision detection, the rigid-body world and solver, vehicle/character dynamics, and soft bodies/cloth/rope. Render-agnostic:PhysicsWorldis a plain structure-of-arrays container keyed by opaqueBodyHandles, and stepping it never touches the ECS.gizmo-renderer: The WGPU-driven rendering pipeline.gizmo-app: The plugin-driven app loop and phase executor.gizmo-engine: The facade crate that ties it all together (gizmo::prelude::*).
Note on embedding the physics on its own: the simulation core is genuinely independent of the renderer and only lightly coupled to the ECS, but
gizmo-physics-rigidstill takesgizmo-coreas a mandatory dependency today, so using it from another engine pulls the ECS in with it. Making that dependency optional (and shipping the physics crates with their own docs) is a tracked roadmap item — seedocs/ENGINE.md§3.
To compile the engine and test the showcase scene with advanced physics and rendering:
# Default demo scene (3D PBR + physics)
cargo run --release -p demo
# Other showcase binaries:
cargo run --release -p demo --bin advanced_physics
cargo run --release -p demo --bin car_demo
cargo run --release -p demo --bin fluid_rigidNote: Due to the extreme scale of the broad-phase and narrow-phase physics computations, compiling without
--releasewill cause a severe CPU bottleneck. Always use the release profile for optimal performance.
Assets: every demo runs on a fresh clone. Large
.glbmodels are not committed, so the couple of demos that showcase one (car_demo,wind_tunnel) fall back to procedural geometry and say so on stderr. Drop the model intoassets/or pointGIZMO_ASSETSat a directory containing it to get the real thing — seeassets/README.md.
Upgrading?
0.10.0raises the minimum Rust to 1.96 (from 1.92) along with thewgpu30 /egui0.36 graphics stack — that is why the minor moved.0.9.1before it is what followed0.8.0on crates.io —0.9.0was documented and then never published, so there is nothing to upgrade from at that number. It carries the correctness work of both: two paths to undefined behaviour, one determinism hole, the reason the crate previously compiled in only one feature configuration, and the removal of an exportedSpritecomponent that nothing could ever draw. Public signatures changed, because their old shape was the bug. The whole workspace still ships at one uniform0.xversion and no API is promised stable yet. See theCHANGELOG(and, if coming from0.1.x, the migration guide (§6)).
Gizmo Engine is free, open source, and dual-licensed under the MIT and Apache 2.0 licenses.



