bevy_director 0.4.0

Unreal-Sequencer-inspired cinematic camera and sequence system for Bevy
Documentation
# Roadmap

Where bevy_director is heading. Grounded in what Bevy 0.18/0.19 actually
ship; engine features are cited so future-us can check assumptions when
0.20 lands. Nothing here is a promise; order reflects current judgment
of pain-relieved per effort.

## Shipped (0.4)

- Text blocks with fades, the `titles` overlay renderer, the
  `ActiveTexts` contract for custom caption rendering.
- The Open panel: browse and load `.dir.ron` files from the dock.
- Typing guards: text fields no longer leak hotkeys into the viewfinder.

## Next: editor depth (0.5)

The data model is ahead of the editor; close the gap before growing the
format again.

- **Marker lane.** Markers are the cue mechanism and today they are not
  even visible in Director's Cut — author them like text blocks: a lane,
  draggable diamonds, a name field.
- **Ease editing.** Every key carries an `EaseFunction` but the UI can
  neither show nor change it (capture stamps SmoothStep). An inspector
  cycle row is the minimum; a curve preview would be better.
- **Blend editing.** `blend_in`/`blend_out` exist in the format only;
  give shots a draggable blend handle on their left edge.
- **Copy / duplicate.** Duplicate shot and duplicate text block buttons;
  the checkpoint/undo machinery already covers them.
- **Snapping.** Optional frame-grid snapping (configurable fps, e.g.
  24), plus snap-to-shot-edge and snap-to-marker while dragging.
- **Dirty indicator.** `saved_fingerprint` already knows; show a dot on
  the filename instead of only a status-line warning.
- **Rail and orbit authoring.** Only `Rig::Keys` shots can be authored
  in the UI today. Rail point editing wants draggable 3D handles — see
  the transform gizmo below.
- **Sticky lane headers.** Lane labels scroll away with the canvas;
  Bevy 0.18's `IgnoreScroll` component is purpose-built for this.
- **Multiline captions.** `EditableText::allow_newlines` exists in Bevy
  0.19; needs a confirm binding that is not Enter.

## Later: runtime tracks

- **Screen fade track.** Fade to/from black (or a color) independent of
  text. Bevy 0.18's `FullscreenMaterial` makes this feasible in the
  UI-less core, matching how the letterbox avoided bevy_ui.
- **Vignette and lens distortion.** Bevy 0.19 shipped `Vignette` and
  `LensDistortion` in bevy_post_process — which is already a core
  dependency. Natural `Lens` extensions beside DoF and exposure, same
  insert/remove pattern.
- **Audio cues.** An `audio` feature: sound handles at times, volume
  tracks, fade-out on skip/stop. The marker workaround (game plays the
  sound) stays the zero-dependency path.
- **Actor tracks.** Animate non-camera entities (a door, a walking NPC)
  via `TargetRef` — transform keys first, `AnimationPlayer` triggers
  later. This is the big step toward full Sequencer parity; it must not
  compromise the camera core.
- **Multi-camera cuts.** Shots referencing named `CineCamera`s (each
  with its own post stack) instead of the single implicit one.
- **Sequence composition.** Chaining (`play_next`) first; nested
  subsequences only if real projects demand them.
- **Text localization hook.** `ActiveTexts` already lets a game treat
  `text` as a key; consider an explicit `key: Option<String>` field once
  a real localized project shapes the requirement.
- **Letterbox animation.** Bars that slide in over the blend-in instead
  of snapping.
- **Viewport-relative caption sizing.** Bevy 0.19's `FontSize::Vw/Vh`
  would make subtitle sizes resolution-independent; needs a style enum
  extension that stays RON-friendly.

## Later: tooling

- **3D key manipulation.** Bevy 0.19's interactive transform gizmo
  (`TransformGizmoPlugin`, snapping included) can drag camera keys and
  rail points in the scene — the missing half of rail authoring.
- **Overlay labels.** 0.19's text gizmos (`Gizmos::text`) can label
  keys/shots in the 3D overlay with zero UI dependencies (the `gizmos`
  feature stays UI-free).
- **Curve editor.** A graph lane for scalar tracks (fov, focus,
  aperture) with per-key ease visualization.
- **Timecode ruler.** Frames at a configurable fps alongside seconds.
- **Editor persistence.** Recent files, dock height, zoom via Bevy
  0.19's `SettingsPlugin` (`bevy_settings`, non-default) rather than a
  hand-rolled prefs file.
- **Take export.** Render a take to video via 0.18's
  `EasyScreenRecordPlugin` (bevy_dev_tools; not supported on Windows).
- **AssetSaver path.** 0.19 added first-party asset saving
  (`save_using_saver`); migrate `save_sequence` off raw `fs::write` when
  the API settles.
- **Native file dialogs.** An optional `rfd` feature for people who want
  to browse outside the assets tree; the in-dock panel stays the
  zero-dependency default.
- **wasm save/load.** Download/upload (or OPFS) so web builds can
  author; 0.19's cancellable web tasks help here.
- **Camera preview pane.** A picture-in-picture `ViewportNode` showing a
  selected shot's framing while flying elsewhere.

## Engine watch

- **feathers / bevy_ui_widgets**: both still carry experimental-API
  warnings in 0.19 despite losing the `experimental_` feature prefix.
  The hand-rolled widget set stays until they stabilize.
- **BSN**: `bsn!` shipped in 0.19 but `.bsn` asset files did not.
  When the loader lands (0.20 per the release notes), rebuilding the
  dock's UI construction on BSN patches is worth a spike.
- **Assets as entities**: an explicit post-0.19 goal; expect churn in
  the loader/hot-reload plumbing when it lands.
- **No first-party sequencer**: 0.18's camera controllers
  (`FreeCamera`/`PanCamera`) are dev tools, and nothing dolly- or
  timeline-shaped shipped in 0.19. The niche this crate fills is intact.

## Infrastructure

- **Remote + CI.** RECOVERY.md records that this workspace had to be
  reconstructed from the crates.io archive because no remote existed.
  Losing the repo once is enough: push a remote, add a CI matrix
  (`--no-default-features`, default, `titles`, `editor`, clippy).
- **Format policy.** New `SequenceAsset` fields must be
  `#[serde(default)]` (old files load) and `skip_serializing_if` empty
  (old writers' output stays byte-identical); unknown fields are
  ignored on read, which is what lets old binaries read new files. Add
  an explicit `version:` field the first time a change cannot meet
  those rules.
- **Publish 0.4.0** once the editor flow has soaked in a real project.