You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Renamed Application/ to app/ via isolated git mv with full --follow history, moved lockfile to workspace root, updated .gitignore for monorepo paths
10
+
-1.[Rule 1 - Bug] Removed redundant pnpm.onlyBuiltDependencies from paint package.json
11
+
- Full monorepo verification suite — 8 automated checks passed, dev server and Tauri build confirmed working
12
+
- Fixed all undo/redo rendering bugs with _notifyVisualChange + FX cache invalidation, enabled immediate FX brush drawing, and implemented 4 UX quick wins (auto-enter paint mode, no-confirm clear, orange exit button, sidebar reorder)
13
+
- Brush color/size persist via LazyStore with #203769/35px defaults, plus circle cursor overlay that scales with zoom
14
+
- Realtime color picker without Apply/Cancel buttons, no dark overlay, positioned near mouse click with bounds clamping
15
+
- 3-mode paint system with flat/FX exclusivity, conversion dialogs, transparent flat background, and layer blend/opacity controls in paint edit mode
16
+
- 4-mode inline color picker (Box HSV/TSL/RVB/CMYK) with HEX input, recent + favorite swatches persisted via LazyStore
17
+
- Dashed wireframe path and bounding box overlay for selected FX strokes with expanded bounding-box hit testing
18
+
- Speed-based stroke animation distributing points across frames with inverse distance weighting and atomic single-Cmd+Z undo
19
+
- Fixed infinite re-render loop in InlineColorPicker via useRef guard and restored blend mode functionality in paint edit mode
20
+
- FX cache invalidation on clearFrame/color change, color-aware cache keys, activePaintMode with persistence, and mode-aware white/transparent background
21
+
- Fixed cursor position offset with high-contrast visibility, strengthened exit button pulsate, modal conversion dialog with dark overlay, and multi-stroke animation support
22
+
- InlineColorPicker relocated from sidebar to canvas-adjacent panel with shared paintStore signal for cross-component visibility control
23
+
- Per-layer paint mode with brushStyle reset on mode switch, frame content inference, and flat-to-FX stroke batch conversion
**Goal:** Convert to pnpm monorepo with `efx-physic-paint` as a workspace package, then replace the `perfect-freehand` + `p5.brush` painting engine with the new physics-based paint engine.
107
+
2 completed phases (26, 33), 23 plans, 112 commits. Phases 27-32 failed (adapter approach abandoned — efx-physic-paint deferred to v0.8.0 as standalone window). See `.planning/MILESTONES.md` for details.
106
108
107
-
**Target features:**
108
-
- Monorepo scaffold: root `package.json`, `pnpm-workspace.yaml`, lockfile migration, rename `Application/` to `app/`, copy `efx-physic-paint` into `packages/`
Architecture: 13 reactive signal stores, Rust image pipeline, Canvas 2D PreviewRenderer with multi-layer compositing (including paint layers with per-frame FX cache and bezier-aware rendering), WebGL2 GPU blur/GLSL runtime/motion blur, p5.brush adapter for spectral pigment mixing, bezierPath.ts math module (10 pure functions for curve conversion, sampling, editing), StrokeList component with SortableJS, PaintOverlay with pen tool bezier interaction system, perfect-freehand brush engine, paint sidecar JSON persistence, sub-frame accumulation export pipeline, command-pattern undo/redo engine with snapshot-before/commit-on-release pattern for all transform gestures, tinykeys keyboard shortcuts, exportRenderer with FFmpeg encoding.
126
+
Shipped v0.7.0 with 112 commits across 80 files (10k insertions). pnpm monorepo with app/ + packages/efx-physic-paint/. Paint engine enhanced with 3-mode system (flat/FX/physical), inline 4-mode color picker, wireframe overlay, stroke animation, circle cursor, and brush persistence.
Architecture: 13 reactive signal stores, Rust image pipeline, Canvas 2D PreviewRenderer with multi-layer compositing (including paint layers with per-frame FX cache and bezier-aware rendering), WebGL2 GPU blur/GLSL runtime/motion blur, p5.brush adapter for spectral pigment mixing, 3-mode paint system with per-frame mode exclusivity, inline color picker with LazyStore persistence, bezierPath.ts math module, StrokeList with SortableJS, PaintOverlay with pen/bezier interaction, paint sidecar JSON persistence, sub-frame accumulation export pipeline, command-pattern undo/redo engine, tinykeys shortcuts, exportRenderer with FFmpeg encoding.
136
129
Project format: .mce v15 with backward compatibility (v1 through v15).
137
130
138
-
v0.7.0 context: `efx-physic-paint` (v0.1.0) is a standalone physics-based paint engine at `~/Dev/efx-physic-paint`. It supports physics brush rendering, transparency, animation, and a JSON brush format — but has no bezier editing. It will be copied into `packages/efx-physic-paint/` as a workspace package. `Application/` will be renamed to `app/`. The `perfect-freehand` + `p5.brush` stack will be replaced by the new engine. Bezier path editing (fit-curve, bezier-js) remains in the editor.
139
-
140
131
Known technical debt:
141
132
- S key shortcut lacks isPaintEditMode() guard (low severity) — from v0.6.0
142
133
- 2 medium-severity export edge cases (content-overlay image preload, FX generator frame offset) — carried from v0.2.0
@@ -221,4 +212,4 @@ This document evolves at phase transitions and milestone boundaries.
Copy file name to clipboardExpand all lines: .planning/REQUIREMENTS.md
+32-3Lines changed: 32 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,6 +23,22 @@
23
23
-[ ]**ENGN-05**: Per-frame FX cache with aggressive caching -- engine rendering is not real-time, all frames pre-rendered and cached for playback and animation propagation
24
24
-[ ]**ENGN-06**: Old v0.6.0 project strokes render via existing Canvas 2D flat brush path; default brush preset for new strokes is **flat**
25
25
26
+
### Enhanced Current Engine
27
+
28
+
-[ ]**ECUR-01**: `Cmd+Z` after any paint operation (draw, clear, undo in FX mode) immediately re-renders canvas with correct visual state for both flat and FX strokes
29
+
-[x]**ECUR-02**: Selecting an FX brush style (watercolor, ink, charcoal, pencil, marker) in FX mode actually paints in that style during drawing — no manual reselection required
30
+
-[x]**ECUR-03**: Brush color and size persist across sessions in app preferences, defaulting to `#203769` at 35px
31
+
-[x]**ECUR-04**: Paint brush shows a circle cursor at the current brush pixel size, scaling with canvas zoom (Photoshop behavior)
32
+
-[ ]**ECUR-05**: Creating a new paint layer auto-switches to paint edit mode (equivalent to pressing `[p]`)
33
+
-[ ]**ECUR-06**: "Clear Brush" button deletes all strokes on current frame; `Cmd+Z` properly undoes clear and re-renders
34
+
-[x]**ECUR-07**: "Exit Paint Mode" button is larger and styled in orange with CSS pulsate color animation
35
+
-[ ]**ECUR-08**: STROKES panel moves before SELECTION panel in sidebar ordering
36
+
-[x]**ECUR-09**: Three brush modes in UI (Paint flat, FX Paint, Physical Paint grayed-out placeholder) with per-frame mutual exclusivity and conversion dialogs
37
+
-[x]**ECUR-10**: Inline color picker on canvas side with 4 modes (Box/TSL/RVB/CMYK), HEX input, auto-apply, recent colors + saved favorites in persistent swatches
38
+
-[ ]**ECUR-11**: Modal color picker removes Apply/Cancel buttons (realtime apply), removes dark overlay, opens near mouse position clamped to window bounds
39
+
-[ ]**ECUR-12**: Selected FX stroke shows visible wireframe/path overlay for easy grab; transform bounding box for move within selection bounds
40
+
-[x]**ECUR-13**: Stroke draw-reveal animation distributes selected stroke's points across target frame range using speed-based distribution (slow drawing = more frames, fast = fewer); single atomic undo
41
+
26
42
### Paint Tools
27
43
28
44
-[ ]**PAINT-01**: User can draw freehand strokes with pressure sensitivity via physics engine
@@ -84,6 +100,19 @@
84
100
| ENGN-04 | Phase 28 | Pending |
85
101
| ENGN-05 | Phase 28 | Pending |
86
102
| ENGN-06 | Phase 28 | Pending |
103
+
| ECUR-01 | Phase 33 | Pending |
104
+
| ECUR-02 | Phase 33 | Complete |
105
+
| ECUR-03 | Phase 33 | Complete |
106
+
| ECUR-04 | Phase 33 | Complete |
107
+
| ECUR-05 | Phase 33 | Pending |
108
+
| ECUR-06 | Phase 33 | Pending |
109
+
| ECUR-07 | Phase 33 | Complete |
110
+
| ECUR-08 | Phase 33 | Pending |
111
+
| ECUR-09 | Phase 33 | Complete |
112
+
| ECUR-10 | Phase 33 | Complete |
113
+
| ECUR-11 | Phase 33 | Pending |
114
+
| ECUR-12 | Phase 33 | Pending |
115
+
| ECUR-13 | Phase 33 | Complete |
87
116
| PAINT-01 | Phase 29 | Pending |
88
117
| PAINT-02 | Phase 29 | Pending |
89
118
| PAINT-03 | Phase 29 | Pending |
@@ -104,10 +133,10 @@
104
133
| PERS-03 | Phase 32 | Pending |
105
134
106
135
**Coverage:**
107
-
- v0.7.0 requirements: 30 total
108
-
- Mapped to phases: 30
136
+
- v0.7.0 requirements: 43 total
137
+
- Mapped to phases: 43
109
138
- Unmapped: 0
110
139
111
140
---
112
141
*Requirements defined: 2026-04-03*
113
-
*Last updated: 2026-04-03 after roadmap creation*
142
+
*Last updated: 2026-04-05 after adding ECUR requirements for Phase 33*
0 commit comments