bevy_director 0.7.0-dev

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.

## Shipped (0.5, unreleased)

- **Actor tracks.** An `actors:` track of named animation cues aimed at
  world entities, the level-triggered `ActiveActorCues` contract, a
  viewfinder preview, and a Director's Cut ACTORS lane.
- **Borrowed cameras.** With no `CineCamera` of its own the director
  drives the gameplay camera in place — no swap, so the game's clear
  color, tonemapping, bloom, and skybox never leave the frame — and puts
  back everything it touched (pose, projection, viewport, lens) when the
  take ends. Text renders in a plain game build: `titles` is a default
  feature and `DirectorPlugin` installs the renderer itself.
- **Filmic lens tracks.** Keyed vignette, lens distortion, and chromatic
  aberration, plus a per-shot motion blur setting, over bevy 0.19's
  post-process components.
- **Color grading.** A per-shot grade (exposure, temperature, tint,
  saturation) composed onto the camera's own `ColorGrading` instead of
  replacing it.
- **Multi-camera cuts.** Shots naming a `CineCamera` to cut to, each
  keeping its own post stack, with `SequenceCut` for stingers. Cuts are
  hard; blends authored across one are ignored and reported at bake.
- **Preview lens parity.** Scrubbing and previewing apply the lens
  components, so grading and depth of field can be judged by eye.
- **Shake depth and held cameras.** Shake gained a keyed ramp, fov
  wobble, and focus hunting; `Rig::Held` lets a cut target keep its own
  (possibly parented) pose — the camera-in-the-mirror shot.

## Next: editor depth (0.6)

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.
- **Grading and filmic depth.** 0.5 keys intensity only, composed over
  the game's grade. Still ahead: per-section grading (shadows, midtones,
  highlights as lift/gamma/gain), the rest of each effect's parameters
  (vignette radius and color, distortion center and edge curvature,
  aberration LUTs), and animated motion blur.
- **Cut authoring polish.** Editor and viewfinder previews that perform
  real cuts instead of driving the piloted camera, a camera picker over
  the live `CineCamera` names rather than a typed name, and cross-camera
  dissolves — which need render-target compositing, so cuts stay hard
  until then.
- **Shake depth.** 0.5 ships one ramp scaling every channel; still
  ahead: per-channel ramps, noise octaves beyond the detuned sines, and
  shake authoring in the Director's Cut inspector (the editor still has
  no shake UI at all).
- **glTF / DCC camera import.** Bring cameras animated in Blender or
  another DCC in as shots: a glTF camera plus its animation becomes
  `Rig::Keys` and `FovSpec::FocalLengthMm`, so previz cut in a real DCC
  plays back through the director.
- **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, deeper.** Named cues shipped in 0.5 and the camera core
  stays animation-graph-agnostic. Still ahead: transform keys driven
  directly by the director (position/rotation tracks per actor), and
  `AnimationPlayer` handles resolved by the crate rather than by name.
- **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.5.0** once the borrowed-camera handoff and the multi-camera
  flow have soaked in a real project.