feat(runtime): add M2 live play mode, assets, export and hot reload

- play/pause/stop with a tracked-transform snapshot and validation summary
- asset browser with kind filters and image preview from project assets
- BSN and imperative Rust export through bevy_forge_core codegen
- .forge.ron watcher applying transform/name/visibility edits
- 95 runtime tests; workspace 441 passed; M2 demo docs/screenshots
This commit is contained in:
Emil Shanaty
2026-10-27 23:51:41 +03:00
parent 3eea9c020d
commit 72960eb2d0
11 changed files with 3436 additions and 4 deletions
+72
View File
@@ -0,0 +1,72 @@
# Bevy Forge v2 — M2 Live
Status: **M2 Live complete and independently verified (`pass_with_risks`)**. M1 Core is committed at
`3eea9c0`; M2 adds live-mode controls and project workflow around the M1 scene editor.
![Bevy Forge M2 Live — play mode and asset browser](m2-live-1440x900.png)
_1000×640 variant (play overlay, panel closed): [m2-live-1000x640.png](m2-live-1000x640.png)._
## What M2 adds
- **Play / Pause / Stop**: a viewport overlay and keyboard controls. Play animates the scene, Pause
freezes it, Stop restores every tracked transform exactly (the snapshot includes the camera pose
captured on Play). A small validation summary (errors/warnings/info) is shown for the loaded
scene.
- **Asset browser**: toggle with `B`; lists the project `assets/` folder with kind filters and an
image preview.
- **Export**: `Ctrl+E` writes BSN, `Ctrl+Shift+E` writes imperative Rust to `exports/` using the
existing `bevy_forge_core` codegen. The garden has seven roots, so its BSN uses core's
`bsn_list!`; single-root scenes use `bsn!`.
- **Hot reload watcher**: when the loaded `.forge.ron` changes on disk, transform/name/visibility
changes are applied to existing entities. Add/remove is logged and ignored in M2; the camera is
never duplicated.
## Run
```bash
cd bevy-forge
FORGE_PROJECT=examples/demo-project \
FORGE_SCENE=scenes/garden.forge.ron \
cargo run -p bevy_forge_runtime --example editor_live
```
## Controls
| Input | Action |
|---|---|
| F1 / toolbar **Editor (F1)** | Toggle the editor UI |
| Click hierarchy row | Select entity |
| Drag inspector slider / gizmo axis | Move selected entity |
| Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y | Undo / redo transform |
| Ctrl+S | Save `.forge.ron` |
| F | Focus camera |
| Delete / Ctrl+D | Delete / duplicate subtree |
| **P** | Play / pause |
| **Shift+P / Esc** | Stop and restore |
| **B** | Toggle asset browser |
| **Ctrl+E / Ctrl+Shift+E** | Export BSN / Rust |
## Limits (M2)
- Asset **drag-into-scene is deferred to M3**: `bevy_forge_core::MaterialData` has no texture field
yet, so the browser is list/filter/preview only.
- Watcher hot reload applies transform/name/visibility to existing mapped IDs; adding or removing
entities/components requires a restart in M2. The watcher has no spawn/despawn path, so the editor
camera cannot be duplicated.
- Play mode is a snapshot/restore demonstration (rotating meshes), not a full game play mode.
- 3D only; custom components are preserved in the document but skipped in the live ECS.
- Delete/duplicate are not undoable; multi-select/docking/terminal are out of scope.
- The asset browser uses the project's `assets/` via `BEVY_ASSET_ROOT` (set by `editor_live`);
files outside the asset root fall back to a local decode for preview only.
- Tests: **95 runtime tests**, workspace **441 passed / 2 ignored**. M2 validation was run with the
garden demo (9 entities / 7 roots) and computer-use for Play/Pause/Stop, the asset panel and
exports.
## Verification
M0: [`m0-spike.md`](m0-spike.md). M1: [`m1-core.md`](m1-core.md). M2: **V21 pass_with_risks**
(`.swarm/m2/reviews/V21.md`); runtime **95 tests**, workspace **441 passed / 2 ignored**. V21's
low-severity residuals are the live 3-key `Ctrl+Shift+E` portal injection (handler unit-tested), play
shortcuts remaining active while the editor is hidden, the camera pose restored on Stop by design,
and the watcher not retrying a failed parse until the next mtime change.