- libs/game/sim/dynamics.rs: box3d world inside GameWorld, body mirror RECONCILED against the sorted entity list per tick (merge-walk), so retain/rollback/reset are correct by construction. Statics + kinematics mirrored (kinematics via target transforms so resting rigids inherit platform velocity); smooth terrain as a box3d heightfield - New BodyKind::Rigid + body:"rigid" with density/friction/restitution; game.push = mass-scaled impulse; set_pos/set_vel detected via bit-exact pose caches (no new dispatch arms). Sphere rigids roll on real spheres - Entity.orient quat read back per tick; renderer builds quat instance transforms for rigids (no shader change). Step order: mover sweep verbatim -> reconcile -> world_step(dt, 4) -> readback; rigid-free worlds skip the solver - GameWorld stays Clone via box3d snapshot round-trip (bit-identical continuation proven by test) - Determinism: double-run equality + golden hash 0xa8a2baf71e4a564f (aarch64, debug and release). Perf: 0.038 ms/tick for 100 movers + 50 rigids + 65x65 terrain (budget 2 ms) - Tape probe BYTE_IDENTICAL; box3d crate untouched; arcade demo gains a kicked crate stack (captures verified: settles upright, then topples with rotated resting poses) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
12 lines
405 B
TOML
12 lines
405 B
TOML
[package]
|
|
name = "makepad-game-sim"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "Deterministic game simulation core for Makepad Arcade (see game.md)"
|
|
license = "MIT OR Apache-2.0"
|
|
|
|
[dependencies]
|
|
makepad-game-math = { path = "../math" }
|
|
makepad-math = { path = "../../math", version = "1.0.0" }
|
|
makepad-live-id = { path = "../../live_id", version = "1.0.0" }
|
|
makepad-box3d = { path = "../../box3d" }
|