Skip to content

V3: designer-focused composition and experimental graphics - #150

Merged
git-chad merged 188 commits into
mainfrom
git-chad/shader-lab-v3-plan
Oct 13, 2026
Merged

git-chad merged 188 commits into
mainfrom
git-chad/shader-lab-v3-plan

Conversation

@git-chad

@git-chad git-chad commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

Shader Lab V3 makes composition easier for designers and expands its visual direction toward experimental editorial collage, analog photographic grunge, and digital psychedelia.

This is the integration PR for V3. Small implementation PRs are stacked: the first targets git-chad/shader-lab-v3-plan, and each successor targets the preceding feature branch. This PR stays in draft and must not merge into main until the required roadmap scope and final validation are complete. See V3-ROADMAP.md for requirements, dependencies, and acceptance criteria.

  • Phase 1: neutral blank projects, composition, alpha, isolated groups, simple general masks, and compatibility baselines
  • Phase 2: transparent text, direct typography editing, local Gradient Map, shape layers, stable artboards, and curated effect defaults
  • Phase 3: select and integrate the first artistic effect families
  • Phase 4: complete the supported 3D model workflow
  • Phase 5: supported SVG extrusion workflow
  • Phase 6: further artistic families, prominent technical annotations/Blob Tracking review, depth/parallax research, and low-priority custom Pattern exploration
  • Phase 7: regression, usability, performance, and export validation

Phase 8 (composition grid) is optional and does not block V3. Candidate effect families and exploratory features remain subject to the decisions specified in the roadmap.

Priority update (September 17): transparent text (#156) is implemented and user-confirmed. The displaced-ring prototype (#157), already listed in phase 3, adds offset half-discs and effect-specific coverage; the user confirmed its visual direction and will tune its defaults. Later designer feedback supersedes the mask postponement: the user approved gradient (linear/radial), ellipse, rectangle, and brush masks, with no pen tool. Preserve tailored effect modes. Technical annotations and the related Blob Tracking quality pass now have a prominent artistic role in roadmap 6.3.

Initial changes: commit the roadmap and enable existing CI checks for PRs targeting the V3 integration branch. No rendering behavior has changed in this initial commit.

Implementation PRs:

Approved designer-feedback roadmap update: clean starting state first, then reusable masks/local Gradient Map, shape and text composition tools linked to the optional grid, technical annotations, and depth/parallax feasibility research. Custom Pattern uploads (SVG/images), manual light-to-dark motif ordering, original colors and explicit SVG recoloring are recorded at low priority. The neutral-start slice is implemented in #164 pending user acceptance; the remaining ideas are planning changes. Current feature visual acceptance remains separate; no merges.

  • V3: neutral projects and visible global color adjustments #164 → Add Cells edge scatter and editable editorial studies #163 — Neutral first visits and persistent blank/demo actions, visible global grading and undoable reset, empty-project recovery and delayed-boot guards. New documents clear prior history/media/audio and draft/remix associations. Fixes empty-scene settings access, mobile panel sizing and restore-notice position. Local check, full composition suite and actual desktop/mobile lifecycle, Cells paint and editorial-study UI regressions pass; user acceptance and CI remain pending. Reusable masks follow.

@vercel

vercel Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
shader-lab Ready Ready Preview Oct 13, 2026 7:12pm UTC

Lossy, transparency and duplicate-frame optimization bring it from 3.8 MB to 2.0 MB with the same frames, size and palette.
Pattern motifs could keep their own colors but not change them. With Color
Mode set to Motif colors, the custom motif section now lists the colors found
across its SVG motifs and edits them through the same File colors control as
SVG shapes, which moves into a shared SvgColorPalette. The palette is stored
in a new internal motifPalette param; Pattern passes in the editor and the
runtime fetch each SVG motif, apply the palette and rebuild the atlas when it
changes. Bitmap motifs and an empty palette take the old loading path, so
existing projects render unchanged.
Zooming in only scaled the fitted canvas with CSS, so a 300% view showed
magnified render pixels. The editor now raises the renderer's pixel ratio by
the zoom factor once zooming settles for 150 ms, capped at 4096 device pixels
on the long edge so the GPU cost stays bounded. Zoom at or below 100% keeps
the previous pixel ratio, and exports are unaffected.
…olors in the roadmap

Depth parallax on an Apple Metal 3 GPU costs 0.8 ms without depth and 1.6, 3.0 and 4.0 ms at Low, Medium and High per 1080p frame. Large rotated text only clips where it leaves the frame, the same in the editor and the PNG export, so that limit is closed without changes.
SVG shapes, the animatable Gradient Map ramp, the Grain layer, Connected Dots edge snap and the Annotations additions were accepted on 13 October 2026, which completes the required V3 scope.
Scene settings gain a Grid section with columns, rows, gap and margin in
document pixels and an overlay opacity, drawn in the orange accent at 6% by
default. Shift+G and a toolbar button show or hide it. The grid is an SVG
guide over the artboard, saved with the project in sceneConfig.grid, and is
never rendered or exported; a static project exports byte-identical PNGs with
it on and off. The field is optional, so existing projects and fixtures are
unchanged, and it stays out of undo history. The model gizmo now ignores
Shift so Shift+G no longer starts a grab.
While the grid is visible, dragging a shape, text, mask or annotation snaps
its edges or center to column and row edges, the margins and the artboard
center and edges within 8 screen pixels, and size, rotation and gradient end
handles snap their point to the same lines. An orange guide marks each active
snap. Holding Cmd or Ctrl turns snapping off for that drag, and a hidden grid
never snaps.
Shapes, text, masks and annotation targets used a center dot plus an X
handle that rotated and resized at once and a Y handle for height. They now
share a transform box: drag inside it to move (Shift locks the axis), drag a
corner or an edge to resize from the opposite side (Shift keeps the ratio, Alt
resizes from the center), and drag just outside a corner to rotate around the
center (Shift snaps to 15 degrees). Corner squares rotate with the box,
cursors follow the box angle, and the size in document pixels sits under it.
Text scales its font size uniformly and annotation targets stay square and
upright. Grid snapping and Esc to cancel still apply.

Masks draw a dashed box with round handles and a center dot, so they read
apart from the layer's own box and sit above it without stealing its drags.
The text box now wraps the text for every anchor, and rotating or scaling
keeps the box center fixed instead of pivoting on the anchor point. Handles
hide while a paint mode is active so brush strokes reach the canvas. The
manual UI tests and QA notes follow the new handles.
…errors

Arrow keys move the selected shape, text, annotation target or mask by one
document pixel, ten with Shift, while the pointer is over the canvas and the
handles are showing, so the timeline keeps its arrow keys everywhere else.
Each nudge is one undo step. A mask nudges only when its layer has no box of
its own. CI's lint failed on three nested ternaries in the new handles, now
rewritten.
The inner effect section skipped every text parameter, so ASCII had no Custom
Chars field and Annotations had no word list or metadata text. Visible text
parameters now render as an input or textarea like in Properties, while
internal ones such as palettes stay hidden. Picking an Annotations text
preset inside an inner effect also fills its words and metadata, as it does
on the layer.
@git-chad

Copy link
Copy Markdown
Collaborator Author

@greptileai review — both earlier P1s (hidden audio video on publish, missing media links on import) were fixed in 6aff54a; please re-review the current head.

Comment thread packages/shader-lab-react/src/renderer/blob-tracking-pass.ts
Comment thread src/renderer/layer-mask.ts
Comment thread src/renderer/layer-mask.ts
Comment thread src/renderer/pattern-pass.ts
…e, simple distortion and looping motion

The old presets were high-frequency warps with tonemapped colors, so they read
as oily blotches rather than a mesh gradient, and the names did not match the
results. Eight new presets (Peach, Lagoon, Dusk, Citrus, Mint, Aurora, Ink,
Basement) are soft color fields with exact colors and light grain, and a new
gradient now starts from Peach.

Each color point shows on the canvas while the layer is selected: drag to
move it (Shift locks the axis), double-click to pick its color, Alt-drag to
change its reach. Shuffle replaces Randomize: it builds a harmonious OKLCH
palette (analogous, split complementary, triad or monochrome with a dark and
a light anchor) or reuses a preset palette, lays the points out evenly, and
keeps distortion, motion and finish.

Distortion gains a Simple mode with Softness, Warp and Detail, which give each
point a soft core so low-weight points no longer form hard dots; the raw
controls live under Advanced. Motion gets styles (Drift, Breathe, Swirl,
Flow) built from whole harmonics of the timeline duration, which passes now
receive through updateTimelineDuration in the editor and the runtime, so a
video export loops without a seam.

Saved gradients migrate to Advanced with their Original motion and old preset
ids fall back to Custom, so they render exactly as before.
…otif colors, and mark Mesh Gradient as reworked

- Painted brush masks stay inside their saved bounds, and an empty brush mask hides the layer
- The runtime accepts every inner effect the editor offers, so exported Blob Tracking projects keep them
- Pattern motif images rebuild when the palette changes
- Mesh Gradient shows the orange reworked dot
V3: Mesh Gradient rework (presets, canvas points, shuffle, simple distortion, looping motion)
…work

Tests turned gradients off with the legacy animate param, which the new Breathe default overrides, so a hidden group looked animated. The Edge Snap field also relied on the old Aurora default, so it now sets those points and Advanced distortion explicitly.
@git-chad
git-chad merged commit f3998a3 into main Oct 13, 2026
5 checks passed

This branch was successfully deployed

1 active deployment
Preview — be87d505 Deployed Oct 13, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant