Blacksite/docs/editor/roadmap.md
Rbanh a048233fce
Some checks are pending
CI / Format, lint, test, build (push) Waiting to run
Record guarded shutdown and scoped UI acceptance
2026-07-13 10:23:56 -04:00

168 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Editor Framework Roadmap
Phased work for the in-process editor (`crates/editor`). Status reflects the current codebase; update this file when closing a phase.
## Production editor program (P5 cleanup remaining)
**Goal:** Zero-debt authoring loop — hydration modules, mandatory `ActorKind`, actor inspector only, schema v2 migrations. See [ADR 00090012](../adr/0009-authoring-vs-hydrated.md) and `.cursor/plans/editor_rendering_and_ux_*.plan.md`.
| Phase | Status | Notes |
|-------|--------|-------|
| P0 Hydration + lighting | **Done** | `shared/hydration/*`, strip-on-save, schema v2 migrate, live ambient/sun, Rendering Diagnostics |
| P1 Actor model | **Done** | `ActorKind`, `validate_actor`, history snapshots, ADRs 00090012 |
| P2 Actor inspector | **Done** | `ui/actor_inspector/`; removed `DefaultInspectorConfigPlugin` + ECS dump on Inspector tab |
| P3 Hierarchy tree + sibling order | **Done** | `HierarchySiblingIndex`, tree outliner, full-row DnD attach/reorder/root, world-transform preservation, cycle guards, visibility/lock |
| P4 Viewport modes | **Done** | Lit / Unlit / Collider toolbar, light gizmo overlays, Tab pick cycle |
| P5 Assets + prefabs | **Partial** | Prefab v2 is production-accepted with stable nested identity, scoped/runtime overrides, committed base/nested/variant fixtures, source Apply/conflict recovery, and local conversion; legacy `fbx_preview` cleanup remains |
| P6 Extensibility + CI | **Done** | `ActorInspectorSection`, palette commands, BRP policy, hydration/scene CI |
| P7 Docs + debt audit | **Done** | ADRs 00090012, [debt-audit.md](debt-audit.md), CI matrix |
## M1.5 — Foundations
**Goal:** Shared project settings, WYSIWYG rendering profile, and PIE possess/eject.
| Item | Status | Notes |
|------|--------|-------|
| `settings` crate + `assets/project.ron` | Done | Serde types, `ProjectSettingsPlugin`, `SimTuning` |
| Project Settings panel (`settings_ui.rs`) | Done | Edit → Project Settings; draft buffer + **Apply** / Save / Revert |
| Shared camera FX (`ProjectRenderCamera`) | Done | Unified viewport target + editor/player cameras |
| PIE possess/eject (F8) | Done | `SimEnabled` while playing; input only when possessed |
| Player-only PIE snapshot | Done | Scene edits retained on stop; not full-scene rollback |
| Split UI vs data | Done | Panel open state in editor; paths/dirty in `ProjectSettingsIo` |
## Phase 1 — Project workspace
**Goal:** Treat the repo as a project root with user vs project prefs.
| Item | Status | Notes |
|------|--------|-------|
| `ProjectWorkspace` resource | Done | Root, settings path, dirty flags |
| User prefs (`~/.config/bevy-fps/editor_prefs.ron`) | Done | Recent levels, load on startup |
| Window title from project + scene | Done | `project_io::window_title` |
| Project launcher and scaffolding | Done | Project Browser validates/scaffolds before AssetServer startup; `--project`, recent projects, and clean process handoff preserve the startup boundary |
| Dock layout persistence | Done | RON in `editor_prefs.ron`; View → Reset Layout |
## Phase 2 — Viewport excellence
**Goal:** Viewport parity with DCC-style navigation aids.
| Item | Status | Notes |
|------|--------|-------|
| `viewport.rs` module | Done | Physical viewport, ground raycast, snap |
| Grid overlay (Ctrl+G) | Done | Tied to snap increment |
| Focus selection (F) | Done | Frames editor camera on selection |
| Camera bookmarks | Done | Ctrl+Shift+1/2 + viewport buttons |
| Scene visualizers | Done | Colliders, lights, spawns, prefab/model anchors, Project Sun, runtime player/camera markers |
| Viewport Lit / Unlit / Collider modes | Done | `EditorViewportMode` + toolbar; unlit material override |
| Clean game-view overlay | Done | `G` hides editor chrome, grid, visualizers, proxies, gizmos, and selection outlines |
| Tab cycle overlapping picks | Done | `ViewportPickStack` + Tab in viewport |
| Multi-viewport | Scaffolded | Primary viewport state is separated from render ownership; secondary viewports remain future work |
| Physics placement | Done | Existing horizontal toolbar action; real Avian settling, prerequisite diagnostics, exact cancel, grouped undo, and isolated non-selected bodies |
| Collider authoring diagnostics | Done | World-scale shape overlays, semantic health colors, stale/missing/invalid/oversized findings, undoable shape switching, and shared placement preflight |
## Phase 2b — Advanced rendering
**Goal:** Tiered GI + local post-process volumes with full editor workflow.
| Item | Status | Notes |
|------|--------|-------|
| ADR 0013 + `GiMode` / volume schema | Done | `settings`, `shared`, `game_hot` resolver |
| Post-process volume authoring + undo | Done | `SetPostProcessVolume`, catalog spawn, scene save |
| Rendering panel (Active / Project / Volumes) | Done | Replaces Diagnostics-only view |
| Volume inspector inherit/override | Done | `post_process_volume_ui.rs` |
| Viewport GI badge + volume HUD + gizmos | Done | `viewport_chrome`, `visualizers` |
| Solari + Forward fallback | Done | `bevy_solari`, RT fallback, point/spot LightDesc disabled while Solari is active |
| Post FX + rendering profile assets | Done | `assets/post_fx/`, `assets/rendering_profiles/` |
| Showcase level + docs | Done | `rendering_showcase.scn.ron`, [rendering.md](rendering.md) |
## Phase 3 — PIE polish
**Goal:** Predictable play sessions while editing.
| Item | Status | Notes |
|------|--------|-------|
| Unified render-to-texture viewport | Done | Avoids HDR/atmosphere breakage; player/editor cameras share one target |
| Game input focus gating | Done | `GameInputFocused` while Play-possessed |
| Gameplay hot reload (`game_hot` dylib) | Done | `--features dev`; see [ADR 0004](../adr/0004-editor-hot-reload.md) |
## Phase 4 — Inspector & history
**Goal:** Authoring ergonomics at component granularity.
| Item | Status | Notes |
|------|--------|-------|
| Hierarchy search filter | Done | Filter box in Hierarchy tab |
| Multi-select | Done | Hierarchy + viewport additive; multi-entity gizmo delta |
| Per-field undo | Partial | Typed inspectors + material/light/rigid-body/collider/primitive/static-mesh |
| Add/remove components | Done | Registry-driven Inspector Add Component footer |
## Phase 4b — Editor chrome (follow-up)
**Goal:** DCC-style hierarchy/inspector/asset browser depth (after shell polish).
| Item | Status | Notes |
|------|--------|-------|
| Blacksite dark visual system + Phosphor icons | Done | Near-black shell, Blacksite toolbar mark, semantic amber/cyan states, `ui/theme.rs`, `ui/fonts.rs`, overlay toolbars |
| Fixed status bar | Done | Replaces Status dock tab; exposes scene I/O and operator feedback alongside scene/mode/selection/history |
| Viewport overlay toolbar | Done | Gizmo/grid/focus/options/game-view toggle (play moved to main toolbar) |
| Main toolbar transport | Done | Centered Play/Pause/Stop/Eject; taller bar (~52px) |
| Pause in PIE | Done | `PlayPaused` freezes sim while staying in Play (`F6`) |
| Dock layout persistence | Done | `ui/layout.rs` + `UserPreferences.dock_layout` |
| Hierarchy tree + type icons | Done | Authored + generated/runtime rows, persistent expansion, full-row attach targets, subtree-safe multi-drag, transform-preserving undo |
| Actor inspector (authoring-only) | Done | Transform + `LightDesc`/`MaterialDesc`/…; no bevy_inspector dump |
| Inspector component headers | Done | Header + Transform + component cards + Add Component footer |
| Asset browser project/file views | Done | Folder tree, breadcrumb, search/filter/sort, grid/list, details pane, texture + model thumbnails |
## Phase 5 — Asset pipeline
**Goal:** Stable asset IDs and import metadata (aligns M5).
| Item | Status | Notes |
|------|--------|-------|
| `asset_db.rs` registry | Done | Stable UUIDs by path; import settings in details |
| Model import formats | Done | glTF/GLB + FBX (binary); `.fbm` sidecar copy on import |
| Thumbnails | Done | Textures via asset load; glTF albedo fast-path; FBX/untextured models via offscreen studio |
| Import settings per asset | Done | Scale/collider/LOD in registry + details pane |
| Prefab workflow | Done | Shared stable nested property/component/structural overrides, recursive validation, committed variant fixtures, transactional source Apply, conflict recovery, and undoable outer unpack/recursive local conversion passed headless, packaged-runtime, and live editor acceptance in Gitea #43 |
| Curated editor regression samples | Done | Versioned five-area manifest, dedicated brush/material labs, strengthened terrain/physics/rendering fixtures, **File > Open Sample**, typed scene coverage, and `validate-samples` release gate in Gitea #32 |
## Phase 6 — Extensibility
**Goal:** Third-party and game-specific panels without editing core UI.
| Item | Status | Notes |
|------|--------|-------|
| `ActorInspectorSection` registry | Done | `ext/extensibility.rs` + `game_inspector.rs` |
| Command registry | Done | Play, lighting reset, group, focus |
| Command palette (Ctrl+P) | Done | Executes registered commands |
| Typed operator dispatch and mutation invariants | Done | Immediate commands commit, modal commands retain Preview ownership, and production asset/brush/terrain/physics/history paths pass the shared lifecycle and undo contract ([testing guide](operator-regression-testing.md), [Gitea #33](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/33)) |
| `EditorPlugin` trait | Done | `register_editor_plugin`; dogfood panel from `game::editor_ext` |
| Undo: `SetActorKind`, add/remove component | Done | `SetActorKind` + `AddComponent` / `RemoveComponent` |
| BRP authoring-only policy | Done | [brp.md](brp.md) |
| CI: `shared` hydration, `scene` migration + allowlist | Done | See `.github/workflows/ci.yml` |
## Production Readiness Program
The live program is tracked by Gitea
[`#1`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/1),
with implementation sequencing in
`.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md`.
| Milestone | Exit condition | Status |
|-----------|----------------|--------|
| M6 Reliability, recovery, and project workflow | Transactional save/recovery, stable sessions, project launcher, hardened hierarchy/prefabs, multi-scene composition | Implementation complete; all six scoped issues are closed after prefab #43 passed workspace, headless, packaged-runtime, and live editor acceptance |
| M7 Content production and shipping | Build/package profiles, content release gate, animation, audio, navigation, collaborative safety | Active; #44-#49 are complete after source, headless, and native acceptance. P0 #55 is complete at source implementation `4b33f32`, and follow-on P0 #57 scoped UI action safety is complete at `9e23ae7` after workspace, focused, independent-review, and native acceptance. No known P0 implementation blocker remains, but #50 is still the final candidate gate and production readiness is not established. Deterministic imported-asset fingerprints #56 are P1 follow-up work. Packaged acceptance is deferred until requested by the project owner. |
Production readiness is not inferred from feature count. Gitea
[`#50`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/50)
requires representative-project workflows, soak and performance evidence, headless validation,
packaging, recovery QA, first-hour signoff, and no open P0 blocker.
## Documentation maintenance
When you ship editor behavior changes:
1. Update this roadmap status table.
2. Update [architecture.md](architecture.md) if subsystems or data flow change.
3. Update root [README](../../README.md) controls and [editor README](README.md) module index.