Blacksite/docs/adr/0041-transactional-editor-physics-placement.md
Rbanh 0e7aed40f1
Some checks are pending
CI / Format, lint, test, build (push) Waiting to run
Add transactional physics placement
2026-07-12 22:07:17 -04:00

45 lines
2.2 KiB
Markdown

# ADR 0041: Transactional Editor Physics Placement
## Status
Accepted
## Context
The editor and game share one Bevy world and one Avian physics instance. Authored rigid
bodies are hydrated in Edit mode so collider visualization and queries remain available,
but advancing the shared simulation while editing mutates scene transforms outside history.
A physics-placement tool must use the real runtime colliders while preventing unrelated
dynamic bodies, PIE state, or authored physics settings from changing.
Running a second physics world would duplicate hydration, imported-mesh collider cooking,
and hierarchy mapping. Advancing the existing world without isolation would make placement
dependent on every other movable body in the scene and would violate cancel safety.
## Decision
The editor owns Avian's `Time<Physics>` clock:
- normal Edit mode and paused Play mode keep physics paused;
- active Play mode unpauses physics;
- paused Play single-step advances the physics clock by one fixed tick;
- the placement tool advances bounded 120 Hz steps while Edit mode remains paused.
Physics placement is a transactional preview in the shared world. It snapshots the selected
bodies' local transforms and runtime motion components, temporarily makes them dynamic, and
temporarily makes every other movable rigid body static. Static bodies and all colliders stay
in the same world, preserving production collision fidelity. Commit restores every temporary
runtime override and writes only the final local transforms through one grouped history
command. Cancel restores the full snapshot and writes no history.
## Consequences
- Edit mode no longer permits authored dynamic bodies to drift outside undo history.
- Placement uses the exact hydrated collider geometry used by PIE and the standalone game.
- Kinematic and dynamic non-selected bodies behave as fixed collision surfaces during the
preview; simulating interacting piles is deliberately outside this tool's contract.
- A placement session cannot cross the Edit/Play boundary and is cancelled on mode exit.
- Future editor physics previews should reuse this clock ownership and transactional-session
model instead of introducing independent ad hoc simulation loops.