Animatic with Boards (#61) #116

Merged
crowmaki merged 2 commits from issue-61-animatic-boards into main 2026-10-09 08:27:09 +00:00
Owner

Closes #61.

The Animatic now plays a Scene's Cut with Boards: each Line from exactly one covering Shot, timed from its Lines, with a Line lane for cut decisions. Decisions follow #8.

What changed

Core (studio-core)

  • New animatic.rs: scene_animatic computes the Cut. By default each Line plays from the first covering Setup in Setup order, then from that Setup's earliest Shot. A dual dialogue pair is one unit. Neighbouring units on the same Shot merge into one event, and so do uncovered ones ("no coverage"). Transitions and shot directions are zero-length markers.
  • Cut overrides live in a new cut_override table, and only overrides are stored. assign_cut_line is undoable ("Assign line to 12B" / "Reset line to default"). An override whose Shot was deleted or no longer covers the Line falls back to the default and is flagged reassigned. Splitting a Shot carries its overrides to the new parts, and undo moves them back.
  • Line durations: a manual duration (line.duration_ms, undoable) wins, else a text estimate. The estimate is dialogue at the Project's rate plus 0.5 s per parenthetical, and action at its rate with a 1 s minimum. The rates are per Project, in words a minute (default 150 / 90 = 2.5 / 1.5 words/s), set with set_reading_rates (undoable).
  • Shot length now uses the same Line durations, per #8 §5. Changing a rate or a Line's duration can therefore resize Shots and make Takes stale (Framing reason). The Timing page says so.
  • Board events carry Panel spans: a Board's Panels spread evenly across the Shot's whole span, handles included.
  • Schema step V32.

App

  • Animatic view (/scenes/<scene>/animatic):
    • The stage letterboxes other-ratio Shots into the Project ratio. It shows dialogue captions (both halves of a pair stacked) and an "Action captions" switch, off by default.
    • Play from here runs on through later Scenes, skipping omitted ones (Space toggles).
    • Below the stage are the Cut's event track, markers, and a Line lane. Click a block to seek and select it. Right-click it, or use the bar, to pick its Shot, use the default, set or estimate its duration, or play from it.
  • New Project settings page Timing (/settings/timing) for the reading rates. ADR-0006's route table is updated.

Out of scope (later tickets): circled Takes replacing Boards (#62) and Performance audio and timing (#63–65). Board events play silence with captions.

Screenshots

Shot 1B at 2.39:1, letterboxed into the 16:9 Project, with the line assigned to it by override and its caption:
Letterbox and caption

Line lane menu on a dual dialogue pair (assigned as a unit), with both speakers' captions stacked over a Shot with no Board:
Line lane menu

After Shot 1B is deleted, its line falls back to 1A·1 and is flagged reassigned:
Reassigned

Play from here, run on into Scene 3 (Scene 2 is omitted and skipped). Its uncovered Lines show the no-coverage slate:
Run on

A no-coverage stretch, with the CUT TO: marker:
No coverage

A Line's duration set by hand (6.0 s):
Manual duration

Project settings → Timing:
Timing

Tests

  • crates/studio-core/tests/animatic.rs (20 tests) covers durations and rates, manual durations, Cut defaults and Setup order, overrides and undo, pairs as units, reassigned fallback, carry-over on split, Panel spans and omitted Scenes.
  • src/lib/animatic/cut.test.ts covers playback lookup, captions, lane blocks, run-on order and the clock.
  • cargo test --workspace --all-features: everything passes except 2 ffmpeg proxy tests. They fail locally because this machine's ffmpeg has no libopenh264 encoder, which is unrelated to this change.
  • bun test src and bun run check are clean.
Closes #61. The Animatic now plays a Scene's Cut with Boards: each Line from exactly one covering Shot, timed from its Lines, with a Line lane for cut decisions. Decisions follow #8. ## What changed **Core (`studio-core`)** - New `animatic.rs`: `scene_animatic` computes the Cut. By default each Line plays from the first covering Setup in Setup order, then from that Setup's earliest Shot. A dual dialogue pair is one unit. Neighbouring units on the same Shot merge into one event, and so do uncovered ones ("no coverage"). Transitions and shot directions are zero-length markers. - Cut overrides live in a new `cut_override` table, and only overrides are stored. `assign_cut_line` is undoable ("Assign line to 12B" / "Reset line to default"). An override whose Shot was deleted or no longer covers the Line falls back to the default and is flagged `reassigned`. Splitting a Shot carries its overrides to the new parts, and undo moves them back. - Line durations: a manual duration (`line.duration_ms`, undoable) wins, else a text estimate. The estimate is dialogue at the Project's rate plus 0.5 s per parenthetical, and action at its rate with a 1 s minimum. The rates are per Project, in words a minute (default 150 / 90 = 2.5 / 1.5 words/s), set with `set_reading_rates` (undoable). - **Shot length now uses the same Line durations**, per #8 §5. Changing a rate or a Line's duration can therefore resize Shots and make Takes stale (Framing reason). The Timing page says so. - Board events carry Panel spans: a Board's Panels spread evenly across the Shot's whole span, handles included. - Schema step V32. **App** - Animatic view (`/scenes/<scene>/animatic`): - The stage letterboxes other-ratio Shots into the Project ratio. It shows dialogue captions (both halves of a pair stacked) and an "Action captions" switch, off by default. - **Play from here** runs on through later Scenes, skipping omitted ones (Space toggles). - Below the stage are the Cut's event track, markers, and a Line lane. Click a block to seek and select it. Right-click it, or use the bar, to pick its Shot, use the default, set or estimate its duration, or play from it. - New Project settings page **Timing** (`/settings/timing`) for the reading rates. ADR-0006's route table is updated. Out of scope (later tickets): circled Takes replacing Boards (#62) and Performance audio and timing (#63–65). Board events play silence with captions. ## Screenshots Shot 1B at 2.39:1, letterboxed into the 16:9 Project, with the line assigned to it by override and its caption: ![Letterbox and caption](https://git.crowmaki.me/attachments/a7b5e849-f3f0-4c14-8d58-0111ebb1b71e) Line lane menu on a dual dialogue pair (assigned as a unit), with both speakers' captions stacked over a Shot with no Board: ![Line lane menu](https://git.crowmaki.me/attachments/9a72d6bc-31d3-4b00-a0b1-4f46ebd2ad77) After Shot 1B is deleted, its line falls back to 1A·1 and is flagged *reassigned*: ![Reassigned](https://git.crowmaki.me/attachments/3ded795c-f621-4371-9b50-4d9d1a355f2d) Play from here, run on into Scene 3 (Scene 2 is omitted and skipped). Its uncovered Lines show the no-coverage slate: ![Run on](https://git.crowmaki.me/attachments/5780b658-c6b8-43af-a79e-c35da2a637d6) A no-coverage stretch, with the `CUT TO:` marker: ![No coverage](https://git.crowmaki.me/attachments/cb3e7fb5-0bb6-4b7e-a437-85f78dc3b024) A Line's duration set by hand (6.0 s): ![Manual duration](https://git.crowmaki.me/attachments/586c10bd-80a1-49d4-8267-79bb5c3f5dfb) Project settings → Timing: ![Timing](https://git.crowmaki.me/attachments/49503a09-6f1c-4da5-ab8d-46d5440fef76) ## Tests - `crates/studio-core/tests/animatic.rs` (20 tests) covers durations and rates, manual durations, Cut defaults and Setup order, overrides and undo, pairs as units, reassigned fallback, carry-over on split, Panel spans and omitted Scenes. - `src/lib/animatic/cut.test.ts` covers playback lookup, captions, lane blocks, run-on order and the clock. - `cargo test --workspace --all-features`: everything passes except 2 `ffmpeg` proxy tests. They fail locally because this machine's ffmpeg has no `libopenh264` encoder, which is unrelated to this change. - `bun test src` and `bun run check` are clean.
Play a Scene's Cut: each Line from one covering Shot (first covering Setup
in Setup order by default, overridable per Line in a Line lane), timed by
manual durations or text estimates at per-Project reading rates. Board
events spread Panels across the Shot's span, uncovered Lines show a
no-coverage slate, transitions show as markers, and Play runs on through
later Scenes. Overrides whose Shot no longer covers the Line fall back,
flagged reassigned, and carry over when a Shot is split.
Expose the Cut's units from the core instead of regrouping pairs in the
view, key events by their first Line, move the reading-rate helpers into
shot_length, type the override rows, letterbox Shots without a Board,
use colour tokens, and bound hand-set durations.
crowmaki deleted branch issue-61-animatic-boards 2026-10-09 08:27:09 +00:00
Sign in to join this conversation.
No description provided.