# 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.