summaryrefslogtreecommitdiff
path: root/notes/roadmap.md
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-08-09 02:37:37 +0200
committercashmere <cashmere@autistici.org>2026-08-09 02:37:37 +0200
commitc555f1eaebff90749bdc543592cfa80a060b29e2 (patch)
treee6a04adb212871063653b66c17eb1b8c17c7d22f /notes/roadmap.md
parentdf82306a86d14bca0149e6d756ba82b75659af43 (diff)
downloadopencut-c555f1eaebff90749bdc543592cfa80a060b29e2.tar.gz
feat: lens effects tab, standalone motion effects, clip/asset rename, preview popout
- New Lens category in the assets panel: Blur, Motion Blur, Zoom In/Out, Pan x4, Shake, Pulse, Spin, Custom Zoom. EffectDefinition gains a category field; tabs with an empty category are hidden, and the properties-panel 'Open effects' button opens the first non-empty one. - Motion effects work standalone: dropping them on the timeline creates an effect-track element that animates (scale/translate/rotate) every track below it, computed purely in the TS frame descriptor - no wasm changes, identical in preview and export. supportsStandalone removed. - Motion Blur: directional gaussian smear (amount + angle) reusing the existing WGSL shader with arbitrary u_direction. - Custom Zoom: start/end scale params (keyframable clip-level). - MotionOffset gains optional rotate, accumulated clip-level and applied to standalone layer quads via rotationDegrees. - Rename clips (timeline context menu) and media assets (media panel context menu) via a shared RenameDialog; asset rename persists through storageService with rollback on error. - Preview pops out into a Document Picture-in-Picture window and docks back; button hidden where the API is unsupported. - Export keeps running when the export popover is closed; only the explicit Cancel button aborts. - Captions and Adjustment tabs removed from the assets panel.
Diffstat (limited to 'notes/roadmap.md')
-rw-r--r--notes/roadmap.md26
1 files changed, 26 insertions, 0 deletions
diff --git a/notes/roadmap.md b/notes/roadmap.md
index 0f23514d..ff27ba44 100644
--- a/notes/roadmap.md
+++ b/notes/roadmap.md
@@ -4,6 +4,19 @@ Working notes for the fork's development direction. Captured 2026-07-26,
updated 2026-07-30 (desktop app shipped via Electron; GPUI/Rust rewrite
parked on the `rust-rewrite` branch).
+## Done (2026-08-08 session — effects panel + workflow fixes)
+
+- Export no longer aborts when the export popover is closed (`export-button.tsx` called `cancelExport()` on close; now only the explicit Cancel button aborts). Download/save still lands when the popover is closed.
+- Captions and Adjustment tabs removed from the assets panel (entry points only; subtitles/transcription code kept on disk per the features.ts convention).
+- Clip rename: timeline element context menu → Rename → shared `components/editor/rename-dialog.tsx` (also used for media assets). Goes through `editor.timeline.updateElements` so it's one undo step.
+- Standalone motion effects: motion defs (zoom/pan/...) were `supportsStandalone: false` because they only worked as per-clip transforms. Now pure-TS: `resolveEffectLayerNode` evaluates the eased motion offset per frame, and the frame descriptor scales/translates/rotates the quads of all z-below layer items about the canvas center. No Rust/wasm change needed (the app consumes the published `opencut-wasm` npm package). Works in preview AND export (same pipeline). `supportsStandalone` flag deleted.
+- New "Lens" assets tab: `EffectDefinition.category` ("lens" | "effect"); Blur + all motion effects live there. Tabs whose category has no definitions are hidden (so the Effects tab disappears until shader effects land). Properties-panel "Open effects" button opens the first non-empty category via `getDefaultEffectsTab()`.
+- New lens effects, all pure TS: Shake, Pulse, Spin (motion; `MotionOffset` gained optional `rotate`, wired clip-level via `applyMotionEffects` and standalone via quad `rotationDegrees`), Motion Blur (single directional gaussian pass, amount + angle params — reuses the existing WGSL shader with arbitrary `u_direction`), Custom Zoom (start/end scale params, both keyframable clip-level — the "two keyframes" zoom control).
+- Media asset rename: context menu in the Media panel → `media-manager.renameMediaAsset` (in-memory + storage upsert with rollback+toast on error; not undoable, matches renameProject precedent).
+- Preview popout: toolbar button toggles a Document Picture-in-Picture window (`preview/popout-store.ts` + portal in `app/editor/page.tsx`); dock via the same button or the placeholder in the main window; button hidden where the API is unsupported. PiP document needs styles cloned AND `height: 100%` on html/body or the canvas overflows.
+- Gates green: bun test 349 pass / 1 skip, tsc, eslint on touched files. Browser-verified headless (playwright-core + nix chromium): lens tab, standalone zoom visibly scaling lower tracks (295→366px text growth), rename + undo, popout/dock, export-survives-close (download fired), motion blur on a clip.
+- Verified workflow (no code needed): Transform-tab params (position/scale/rotate) are already keyframable (diamond toggle per field; second value at another playhead position creates the second keyframe, easing via graph editor). Lens motion effects compose multiplicatively on top of the animated base transform (`applyMotionEffects` receives `resolveTransformAtTime`) — so "start/end framing via Transform + Zoom In on top" works today; browser-verified with keyframed scale 1→2 + Custom Zoom.
+
## Done (2026-07-30 session — desktop app + static web)
- Rust rewrite parked: the three GPUI/domain-crate commits live on branch
@@ -138,6 +151,19 @@ work. The GPUI desktop app sidesteps it entirely (native GPU).
branch `rust-rewrite` (foundation + 14 domain crates green, see
notes/gpui-port.md) — resume there if the Electron shell ever
becomes the bottleneck. BSD still parked.
+8. Shader-based effects (owner request 2026-08-08): Vignette, Glow/Bloom,
+ Sharpen, Chromatic Aberration, Pixelate/Mosaic (censoring),
+ Grayscale/Sepia/Invert/Hue-Rotate, Exposure/Contrast/Saturation,
+ Tilt-Shift. Each is ~20 lines WGSL in `rust/crates/effects` (new
+ shader file + pipeline entry + uniform-packing branch; note
+ `pack_effect_uniforms` is currently hardcoded to the gaussian
+ uniforms) plus a TS `EffectDefinition` with `category: "effect"` —
+ which re-enables the hidden Effects tab automatically. Blocker: the
+ app consumes the PUBLISHED `opencut-wasm` npm package, so this needs
+ the wasm toolchain (wasm32 target + wasm-pack — neither is on this
+ machine; cargo 1.93.1 exists under ~/.rustup) and either
+ `bun publish:wasm` or pointing apps/web at `rust/wasm/pkg` via
+ `file:` for local dev.
## Deprioritized / parked