Skip to content

Releases: electroheadfx/efx-motion-editor

v0.7.0 — Monorepo & Paint Enhancements

05 Apr 20:04

Choose a tag to compare

What shipped

pnpm monorepo (Phase 26)

Converted the repo to a pnpm workspace. Application/ is now app/, full git history preserved via isolated git mv. efx-physic-paint lives in packages/ as a workspace package — ready for the standalone window work in v0.8.0.

Paint engine overhaul (Phase 33)

20 plans of fixes, polish, and new features on top of the existing perfect-freehand + p5.brush stack.

3-mode paint system — Each frame is now explicitly Flat, FX, or Physical (placeholder). Modes are mutually exclusive per frame. Switching shows a conversion dialog, brush style resets on mode change, and the mode persists per layer across sessions.

Inline color picker — Canvas-adjacent 260px panel with 4 color modes: Box (SV square + hue), TSL, RVB, and CMYK. All slider tracks render live gradients. HEX input, auto-apply, 12 recent colors, persistent saved favorites. Replaces the old sidebar color swatch.

Wireframe overlay — Selected strokes show a dashed path + bounding box so you can actually see what you're grabbing, especially in FX mode.

Stroke draw-reveal animation — Select a stroke, pick a frame range, and it distributes the points across frames using speed-based weighting (slow drawing = more frames, fast = fewer). Single undo entry.

Circle cursor — Photoshop-style brush size cursor that scales with zoom.

Brush persistence — Color and si Jump to bottom ↓ s. Default is #203769 at 35px.

Undo/FX cache fixesCmd+Z no Jump to bottom ↓ ders the canvas in both flat and FX mode. FX cache invalidates on color change, clear, and mode switch.


What didn't ship

Phases 27–32 (replacing perfect-freehand + p5.brush with a headless efx-physic-paint adapter) were abandoned after the batch rendering approach produced inferior visual quality and O(n²) re-render performance. The physics engine will come back in v0.8.0 as a standalone window with a transport protocol instead of an in-process adapter.

v0.6.0 — Stroke Management, Bezier Path Editing & Paint UX

03 Apr 10:34

Choose a tag to compare

What's New

Bezier Path Editing

  • Edit freehand stroke paths as bezier curves with draggable anchor points and control handles
  • Add, move, and delete control points for precise shape refinement
  • Progressive simplify button for reducing path complexity
  • Pen tool overlay with real-time visual feedback

Stroke List Panel

  • Dedicated stroke management panel in roto paint edit mode
  • Drag-and-drop reorder with immediate canvas update
  • Visibility toggles (hide/show) without deleting strokes
  • Multi-select with Cmd+click and Shift+click
  • Bidirectional selection sync between list and canvas

Stroke Interactions

  • Alt+drag to duplicate any selected stroke
  • Non-uniform scale via 4 edge handles (independent X/Y axes)
  • Undo/redo for all transform gestures (move, rotate, scale, duplicate)

Paint UX Improvements

  • Reorganized paint properties panel with compact 2-column grid layouts
  • Auto-flatten frame on exit paint mode
  • Isolation-scoped layer creation — new layers target the soloed sequence
  • 4× denser motion path dots for short sequences

4 phases · 14 plans · 107 commits · 12 requirements satisfied

v0.5.0 — Motion Blur & Paint Styles

26 Mar 18:17

Choose a tag to compare

Description:

Paint Brush FX

Draw flat strokes, then select and apply expressive styles — each rendered via p5.brush with Kubelka-Munk spectral pigment mixing.

  • 5 brush styles: Watercolor (edge bleed, paper texture), Ink (edge darkening, variable opacity), Charcoal (grain texture, scatter), Pencil (fine-grain texture), Marker (flat semi-transparent)
  • Spectral pigment mixing: Overlapping strokes blend physically — blue + yellow produces green, not gray
  • Flow field distortion: Hash-based 2D noise warps stroke paths for organic rendering
  • Non-destructive workflow: Draw flat → select strokes → apply FX → flatten for performance
  • Per-frame FX cache: All styled strokes rendered together on shared canvas for correct spectral mixing
  • Solid paint background with color picker in PaintProperties panel

Motion Blur

Per-layer GLSL velocity motion blur with cinematographic shutter angle controls.

  • Preview: WebGL2 directional blur shader with triangle filter kernel and configurable quality (Off / Low 16 samples / Medium 32 samples)
  • Export: Combined GLSL velocity blur + sub-frame accumulation (8/16/32/64/128 samples) for cinematic quality
  • Shutter angle: 0–360° control affects blur intensity proportionally
  • Velocity engine: VelocityCache with seek invalidation — stationary layers stay sharp
  • Toolbar: Split-button toggle (⚡) with dropdown popover for shutter angle and quality
  • Keyboard shortcut: M toggles motion blur (guarded in paint mode)

Other

  • Project format: .mce v15 with full backward compatibility (v1–v15)
  • Export: "Selected sequence only" option
  • Tests: 27 unit tests covering motionBlurStore, motionBlurEngine, and VelocityCache

Stats: 2 phases, 8 plans, 116 commits, +13,928 / −1,859 lines across 133 files
Codebase: 40,066 LOC (37,810 TypeScript + 2,256 Rust)

v0.4.0 — Canvas & Paint

25 Mar 10:59

Choose a tag to compare

Canvas Motion Path

After Effects-style spatial keyframe path editing directly on the canvas. Animated layers display their trajectory as a dotted trail with interactive keyframe markers — drag keyframe positions to reshape motion paths in real-time with auto-seek and undo coalescing.

  • Dotted SVG trail with dots clustered where motion is slow (easing visualization)
  • Filled/outlined keyframe circle markers with selection state
  • Drag-to-reposition with real-time trail update
  • Playhead auto-seeks to keyframe frame on drag start
  • Unified keyframe upsert routing — sidebar and canvas drag edits both update the preview in real-time

Paint Layer / Rotopaint

Frame-by-frame drawing and rotoscoping with a complete paint system. Powered by perfect-freehand for smooth, pressure-sensitive brush strokes.

  • 7 tools: brush, eraser, eyedropper, flood fill, line, rectangle, ellipse
  • Onion skinning overlay with configurable frame range and opacity falloff
  • Floating toolbar on canvas + full sidebar panel with tool/brush/stroke/shape/fill/onion controls
  • Sidecar JSON persistence — paint data saved as paint/{uuid}/frame-NNN.json alongside the .mce project
  • Export pipeline — paint layers composite in both preview and video export with blend modes and opacity
  • Project format v14 with backward compatibility (v1–v14)

Tablet & Pen Support

Native macOS tablet pressure bridge via NSEvent for high-fidelity drawing input.

  • Pen pressure sensitivity with easing/taper curves
  • Tilt detection modulating stroke thinning
  • Coalesced pointer events at full tablet polling rate
  • Works with Wacom, Apple Pencil (iPad Sidecar), and other pressure devices
  • Backward-compatible defaults for mouse input (simulated pressure)

Stats

Phases 2 (Phase 18: Canvas Motion Path, Phase 19: Paint Layer Rotopaint)
Plans 9
Tasks 19
Commits 75
LOC 34,067 (31,814 TypeScript + 2,253 Rust)
Timeline 2 days

v0.3.0 Audio & Polish

24 Mar 13:58

Choose a tag to compare

v0.3.0 Audio & Polish

8 phases, 29 plans, 63 tasks — shipped in 5 days (2026-03-20 → 2026-03-24)

Highlights

  • Audio Import & Waveform — Import WAV/MP3/AAC/FLAC, waveform visualization on timeline, synced playback, volume/fade controls,
    click/drag/trim/slip/reorder interactions
  • Media In-Use Tracking — Color-coded usage badges on all assets, portal-based usage popovers, cascade removal with composite undo
  • Solid & Transparent Key Entries — Split add button (Camera/Square), inline color picker, gradient fills (linear/radial/conic) with
    draggable stops
  • GLSL Shader Effects — WebGL2 runtime, 17 Shadertoy-ported effects, ShaderBrowser with animated previews, parameter controls, keyframe
    animation
  • GL Transitions — 18 curated gl-transitions.com shaders, dual-texture WebGL2 pipeline, TransitionProperties sidebar, teal timeline
    overlays
  • Audio Export & Beat Sync — OfflineAudioContext pre-render, FFmpeg audio muxing, BPM detection via onset autocorrelation, beat
    markers, snap-to-beat, auto-arrange (every beat / 2 beats / bar)
  • Sidebar Enhancements — Collapsible key photo lists, global solo mode (S key), Tailwind v4 syntax migration across 33 files
  • Adaptive 2-Panel Sidebar — Replaced 3-panel layout with sequence/layer view switching, Layers icon with green count badge, back
    navigation

Stats

  • LOC: 31,522 (29,037 TypeScript + 2,157 Rust + 328 CSS)
  • Files changed: 350 (+48,438 / -3,853)
  • Project format: .mce v8 → v13 (full backward compatibility chain)
  • Stores: 11 reactive signal stores (added audioStore, soloStore)
  • Quick tasks: 7 inline fixes (context menu, transport bar, zoom controls, shader button)

v0.2.0 From Editor to Cinema Pipeline

24 Mar 12:35

Choose a tag to compare

What's New

v0.2.0 transforms the editing foundation into a complete stop-motion-to-cinema pipeline — from keyframe animation to final export.

Animation & Effects

  • Per-layer keyframe animation with 4 interpolation curves (linear, ease-in, ease-out, ease-in-out)
  • GPU-accelerated WebGL2 blur with automatic CPU fallback
  • Live canvas transform handles — move, scale, rotate layers directly on the canvas
  • Content overlay layers (static image, image sequence, video) as timeline-level sequences

Transitions & Export

  • Fade and cross-dissolve transitions with opacity and solid color modes
  • PNG image sequence export with resolution multipliers and metadata sidecars
  • Video export (ProRes, H.264, AV1) via automatic FFmpeg provisioning

UI Overhaul

  • 3-level theme system (dark, medium, light) with CSS variable architecture
  • Redesigned sidebar with 3 resizable panels, inline key photos, and keyframe navigation
  • Canvas zoom/pan with keyboard shortcuts, pinch gestures, and fit-to-window
  • Linear timeline layout mode with togglable stacked/linear views
  • Tabbed shortcuts overlay with 7 groups and full keyboard navigation
  • Timeline vertical scrollbar with playback auto-scroll
  • Lucide icon buttons with keyboard shortcut tooltips

Playback

  • Full-speed playback mode bypassing frame rate cap
  • Fullscreen canvas with letterboxed preview
  • Sequence isolation (solo) and global loop toggle

By the Numbers

23 phases · 66 plans · 847 commits · 20,428 LOC

v0.1.0 — Initial Release

26 Mar 18:21

Choose a tag to compare

Complete stop-motion editor foundation — from Tauri scaffold through production-ready editing with multi-layer compositing and cinematic FX effects.

Highlights

  • Tauri 2.0 + Preact + Motion Canvas + Tailwind CSS v4 foundation with 6 reactive signal stores and dark theme editor UI
  • Rust image pipeline with drag-and-drop import, file dialog, thumbnail generation, and LRU memory management
  • Project management (.mce format v4) with auto-save, recent projects, and unsaved-changes guard
  • Canvas-based timeline with virtualized frame rendering, playhead scrubbing, zoom, and real-time preview playback at 15/24 fps
  • Multi-layer compositing: static image, image sequence, and video layers with blend modes (normal, screen, multiply, overlay, add), opacity, transforms, and drag-reorder
  • Cinematic FX effects: film grain, vignette, color grade, dirt/scratches, light leaks — applied as FX sequences with draggable timeline range bars
  • Undo/redo command pattern engine (100+ levels)
  • Keyboard shortcuts: JKL shuttle, Space play/pause, arrow step, Cmd+Z/S/N/O, ? overlay

Sequence Management

  • Create, duplicate, delete, reorder sequences
  • Key photos with configurable hold duration
  • Per-sequence frame rate and resolution settings

Architecture

  • 6 reactive Preact Signal stores (project, sequence, layer, timeline, canvas, ui)
  • Canvas 2D PreviewRenderer with resolution-independent FX parameters
  • Rust backend with IPC bridge and asset protocol
  • Audio-sync-ready clock (performance.now() delta accumulation)

Stats: 8 phases, 36 plans, 284 commits
Codebase: 10,159 LOC (8,753 TypeScript + 1,352 Rust + 54 CSS)