70cf131c47ffc809ec6acb9a6e6a0df86cc92e0f
3
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
70cf131c47 | Make kaleido pivot keyframable | ||
|
|
42c5f68182 |
1.2.13: README + Effects merge + draggable kaleido pivot for layers
README ------ Initial README.md at repo root with the existing src/assets/logo.png header, the editor screenshot from src/assets/ruwio_screenshot.png, a feature-highlights list, quickstart, stack, project layout, and the in-app test runner shortcut (Ctrl+Shift+Alt+T). Effects panel merge ------------------- Wiggle and Kaleidoscope used to live in two separate collapsible sections. Now they share one "Effects" section with a thin border between the two sub-blocks (`.effect-block + .effect-block`), keeping their independent toggles + controls. Same change for the ClipInstance variant. Section preference key flows through one `effects` slot instead of two. Layer kaleido pivot ------------------- Until now only ClipInstance kaleido had a separate pivot; Layer kaleido was locked to the layer's own (x, y). Layers now get optional `kaleidoPivotX/Y` too, mirroring the ClipInstance contract. - types/scene.ts: optional pivot fields on Layer. - lib/kaleido.ts: layerKaleidoPivot + layerArmTransform helpers computing per-arm world (x, y, rotation) around the override. - lib/render.ts: drawLayers + drawMaskShape route through layerArmTransform. - lib/exportPlayer.ts: byte-for-byte JS mirror layerArmTf inside the engine source. RUNTIME_VERSION 32 → 33. - components/CanvasStage.vue: withK now takes the layer + computes rotated x/y/rotation per arm; honours the liveKaleidoPivot ref so a drag updates all copies in real time. Generic kaleidoPivotHandle handles both clip-instance and layer entities (KaleidoPivotEntity discriminated union); manual window-level pointermove drives the drag because Konva's `draggable: true` didn't fire dragmove for shapes inside the clipFunc'd canvas group here. - stores/scene.ts: setLayerKaleidoPivot(id, patch | null) with null-clear semantics. - components/PropertiesPanel.vue: two pivot X/Y inputs in a `.row` inside the layer kaleido sub-block, defaulting to the sampled position. All kaleido inputs (count, offset, pivot) switched from @change to @input so the stage repaints live while the user types or spins the value. Test fixes ---------- - "PropertiesPanel kaleido offset writes back through the mode" dispatched a synthetic 'change' event; the input now binds to @input. Updated to dispatch 'input'. - "PropertiesPanel: Wiggle section toggles the wiggle field" — section open-state persists across tests via the panel's localStorage pref. Test now resets the key before mount and only clicks the header when the body isn't already shown, then restores the prior value. - "PropertiesPanel: layer kaleido pivot inputs render + write back live" used a global value-50 filter that also matched the Transform section's X/Y inputs at the sampled position (50, 50). Scoped the search to the Effects section's body + its `.row`. Tests added (6 new under "layer kaleido pivot — separate orbit centre"): - layerArmTransform math: defaults vs explicit override. - store roundtrip + null-clear of setLayerKaleidoPivot. - drawSceneFrame integration: 4 cardinal pixel checks for a 20×20 red rect at (160, 100), pivot (100, 100), 4 arms — sampled at the rotated body centres. - PropertiesPanel: two pivot inputs render at the sampled position; @input writes pivotX while pivotY stays default. - CanvasStage smoke: pivot handle paths render when a kaleido- on layer is selected (plus toggle-off cleanup). - Engine source carries layerArmTf and bumps RUNTIME_VERSION to '33'. Earlier '32' assertions in the kaleido + wiggle suites also bumped to '33'. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
80e1510b53 |
1.2.8: kaleidoscope — radial repeat for layers + clips with delayed-start arms
New per-entity property that renders content N times around a pivot.
For clip instances each radial copy can also be staggered in time, so
arm i starts playing the clip i*offset frames later than the source.
Data model (src/types/scene.ts):
- Layer: kaleido?, kaleidoCount?
- ClipInstance: kaleido?, kaleidoCount?, kaleidoOffset?, kaleidoRotateCopies?,
kaleidoPivotX?, kaleidoPivotY?
All fields optional; legacy projects unchanged.
Math (src/lib/kaleido.ts):
- kaleidoCountFor / kaleidoAngleDegrees, clipKaleidoPivot, clipArmTranslate.
- clipArmLocalTime: returns the per-arm clip-local time. For arm i with
offset dt, the arm shows frame (offsetIntoBlock - i*dt) — visible only
when that falls inside [0, trimmedDuration]. Returns null otherwise so
the caller can hide pre-start and post-end arms.
Render parity:
- src/lib/render.ts: extracted renderClipInstance helper used by both the
top-level scene loop and drawTrackGroup. drawLayers + drawMaskShape now
loop the kaleido count and add the per-copy angle to the layer rotation
(Konva-style "rotate around (x,y)" comes for free).
- src/lib/exportPlayer.ts: mirror in JS (kalCount, kalAngle, clipKaleidoPivot,
clipArmLocalT, clipArmTrans, drawClipInstance). drawLayer + drawMaskShape
wrapped the same way. RUNTIME_VERSION 28 → 31 (3 fixes during landing).
- src/components/CanvasStage.vue: stackItems now emits one bundle per
kaleido arm with arm-specific items sampled at the arm's localT, so the
Konva live preview shows the staggered start in the editor — not just
in the fullscreen preview / export. Source arm (armIndex 0) keeps the
selection / drag / transform handlers; non-source arms are listening:
false. New clipInstanceKaleidoGroupConfig handles the per-arm transform
with rotateCopies on/off semantics. withK helper augments per-layer
configs with the kaleido rotation.
UI (src/components/PropertiesPanel.vue + i18n):
- New "Kaleidoscope" collapsible section. Layer mode: toggle + repeat.
Clip-instance mode (selected via canvas, panel banner explains the
partial editability): toggle, repeat, start offset (frames — converted
to seconds via scene.fps before storage), pivot X/Y, rotate-copies
toggle. Hidden for button-asset layers (hit-area routing breaks if
multiplied).
Store (src/stores/scene.ts):
- setLayerKaleido / setLayerKaleidoCount with [2, 64] integer clamp,
setClipInstanceKaleido with clear-semantics for offset=0 and
rotateCopies=true (deletes the field so JSON stays clean).
Tests (8 new under "kaleidoscope — store + render + engine"):
- Roundtrip + clamp for both Layer and ClipInstance setters.
- drawSceneFrame: 4 cardinal-pixel kaleido smoke for static layer.
- Button asset bypasses kaleido (hit-area routing intact).
- ClipInstance roundtrip + clear-semantics for offset=0.
- clipArmLocalTime: arm 0 honours bounds (returns null when source
itself is past), delayed arms outlive the source's window when
their shifted time is still in [0, dur].
- drawSceneFrame integration: 4-arm clip with 0.5s offset; sample at
t=0 / t=0.5 / t=1.5 verifies staircase visibility (1 → 2 → 3 arms).
- Engine source carries kalCount, kalAngle, drawClipInstance,
clipKaleidoPivot, clipArmLocalT; RUNTIME_VERSION '31'.
- layerActiveAt regression — kaleido fields don't break visibility gate.
Plus the prior export-runtime test updated to read drawClipInstance's
inst.{x,y,scaleX,scaleY,rotation} variables instead of the old inline
inst2.* names that the kaleido refactor removed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|