From 1c7a8d02de2f037d46a3779cf37c71131b4b6f2f Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Sun, 11 Oct 2026 14:26:07 -0400 Subject: [PATCH 1/6] docs: add UV warp to the glossary Name what an Effect's base-pass UV transform does, since SwirlGradient is a Source that CursorDisplacement bends that way. "Warp" on its own moves to Avoid, because Paper's Warp is a Source, not a UV warp. --- GLOSSARY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GLOSSARY.md b/GLOSSARY.md index d86e789f..f7dd2647 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -14,6 +14,10 @@ _Avoid_: Base component, generator, layer A component that acts on the image beneath it in a scene rather than drawing its own, such as Grain, Dither, or LedWall. An Effect composes over any Source or Effect mounted before it. _Avoid_: Overlay, post-process pass, post-process layer, filter +**UV warp**: +An Effect's change to where the image beneath it is sampled, such as Dither's pixel snap or CursorRipple's refraction. A UV warp bends only what Sources drew. +_Avoid_: Warp on its own, base UV transform + **Input**: A value that changes over time and is not drawn, such as the cursor, scroll, or canvas size. An Input is fed to a component as an animation signal. _Avoid_: Cursor hook, entry point, scene-level field From fa89eceeff5045462f459708ba19fbf3e49aeae9 Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Sun, 11 Oct 2026 14:26:19 -0400 Subject: [PATCH 2/6] feat(shaders): add SwirlGradient's bands folded along a still flow Phase 1 of SHA-223. Each pixel traces 24 steps backward along the curl of a periodic gradient noise and reads LinearGradient's repeating bands where it lands, so swirl={0} draws LinearGradient's image exactly. The flow pass draws the velocity into a half-float texture each frame, because computing the noise inline at every step read 3.6 ms in the Reactive card's window at 2x. With the texture it reads 0.35 ms there and 1.9 ms at 1440 by 900. Renderers that can't draw half floats compute it inline instead. Adds the docs page, a temporary tuning rig for the step count, step length, and smaller eddies, and a dev benchmark route. --- .../docs/src/app/components/demo-registry.tsx | 7 + .../app/components/swirl-gradient/demo.tsx | 114 ++++++ .../app/components/swirl-gradient/params.ts | 52 +++ .../app/components/swirl-gradient/scene.tsx | 32 ++ .../benchmark-scene.tsx | 60 ++++ .../dev/swirl-gradient-benchmark/page.dev.tsx | 12 + apps/docs/src/content/components.ts | 5 + packages/shaders/src/components/index.ts | 3 + .../src/components/swirl-gradient/flow.ts | 336 ++++++++++++++++++ .../src/components/swirl-gradient/shader.tsx | 289 +++++++++++++++ .../swirl-gradient/swirl-gradient.tsx | 99 ++++++ 11 files changed, 1009 insertions(+) create mode 100644 apps/docs/src/app/components/swirl-gradient/demo.tsx create mode 100644 apps/docs/src/app/components/swirl-gradient/params.ts create mode 100644 apps/docs/src/app/components/swirl-gradient/scene.tsx create mode 100644 apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx create mode 100644 apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx create mode 100644 packages/shaders/src/components/swirl-gradient/flow.ts create mode 100644 packages/shaders/src/components/swirl-gradient/shader.tsx create mode 100644 packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx diff --git a/apps/docs/src/app/components/demo-registry.tsx b/apps/docs/src/app/components/demo-registry.tsx index 3105b8d5..d4218e41 100644 --- a/apps/docs/src/app/components/demo-registry.tsx +++ b/apps/docs/src/app/components/demo-registry.tsx @@ -25,6 +25,7 @@ import { MeshGradientIsland } from './mesh-gradient/demo'; import { RadialGradientIsland } from './radial-gradient/demo'; import { RadialWipeIsland } from './radial-wipe/demo'; import { SimplexNoiseIsland } from './simplex-noise/demo'; +import { SwirlGradientIsland } from './swirl-gradient/demo'; import { VignetteIsland } from './vignette/demo'; import { VoronoiIsland } from './voronoi/demo'; import { WaveLinesIsland } from './wave-lines/demo'; @@ -282,6 +283,12 @@ export const COMPONENT_PAGES: Record = { Island: SimplexNoiseIsland, usageSnippet: ` +`, + }, + 'swirl-gradient': { + Island: SwirlGradientIsland, + usageSnippet: ` + `, }, vignette: { diff --git a/apps/docs/src/app/components/swirl-gradient/demo.tsx b/apps/docs/src/app/components/swirl-gradient/demo.tsx new file mode 100644 index 00000000..ee2964db --- /dev/null +++ b/apps/docs/src/app/components/swirl-gradient/demo.tsx @@ -0,0 +1,114 @@ +'use client'; + +/** + * SwirlGradient demo island: the interactive slice of the SwirlGradient + * page — control store, shader preview, and control panel for the bands, + * the flow that folds them, mixing, and the color stops. The shared + * components/[slug] template renders this between its static header and + * prose sections. + */ +import dynamic from 'next/dynamic'; +import { useMemo } from 'react'; + +import { + COLOR_SPACE_OPTIONS, + ColorInput, + ControlPanel, + ControlsProvider, + createControlStore, + DemoLayout, + HUE_ARC_OPTIONS, + ListInput, + NumberInput, + Section, + SelectInput, + SliderInput, + useSnapshot, +} from '@/components/controls'; +import { DemoPoster } from '@/components/DemoPoster'; +import { createStop, newStopIndex } from '@/lib/stops'; +import { VisualTestPause } from '@/lib/visualTestHooks'; + +import { INITIAL, MAX_STOPS, MIN_STOPS } from './params'; +import type { Params, Stop } from './params'; + +const SwirlGradientScene = dynamic(() => import('./scene'), { ssr: false }); + +function SwirlGradientDemo() { + const params = useSnapshot(); + + return ( + + + + + + ); +} + +function SwirlGradientControls() { + return ( + +
+ + +
+
+ + + +
+
+ + +
+ {/* TEMPORARY (build-phase tuning only): stripped at the defaults gate. */} +
+ + + +
+ + createItem={createStop} + insertIndex={newStopIndex} + itemLabel="stop" + label="Color stops" + max={MAX_STOPS} + min={MIN_STOPS} + path="stops" + > + {() => ( + <> + + + + )} + +
+ ); +} + +export function SwirlGradientIsland() { + const store = useMemo(() => createControlStore(INITIAL), []); + + return ( + + }> +
+ +
+
+
+ ); +} diff --git a/apps/docs/src/app/components/swirl-gradient/params.ts b/apps/docs/src/app/components/swirl-gradient/params.ts new file mode 100644 index 00000000..876af889 --- /dev/null +++ b/apps/docs/src/app/components/swirl-gradient/params.ts @@ -0,0 +1,52 @@ +import type { ColorSpace, HueInterpolation } from '@camp-dev/shaders'; + +import { paletteOklch } from '../../../lib/palette'; + +export interface Stop { + color: string; + position: number; +} + +/** TEMPORARY (build-phase tuning only): mirrors SwirlGradientTuning. */ +export interface Tuning { + steps: number; + stepLength: number; + smallEddies: number; +} + +export interface Params { + angle: number; + repeat: number; + swirl: number; + scale: number; + seed: number; + colorSpace: ColorSpace; + hueInterpolation: HueInterpolation; + stops: Stop[]; + tuning: Tuning; +} + +export const MIN_STOPS = 1; +export const MAX_STOPS = 6; + +// Values mirror the component defaults in swirl-gradient.tsx and the flow +// constants in its shader.tsx. Keep them in sync. +export const INITIAL: Params = { + angle: 0, + repeat: 3, + swirl: 1, + scale: 2, + seed: 0, + colorSpace: 'oklab', + hueInterpolation: 'shorter', + stops: [ + { color: paletteOklch.blue[3], position: 0 }, + { color: paletteOklch.violet[6], position: 0.5 }, + { color: paletteOklch.purple[9], position: 1 }, + ], + tuning: { + steps: 24, + stepLength: 0.05, + smallEddies: 0.35, + }, +}; diff --git a/apps/docs/src/app/components/swirl-gradient/scene.tsx b/apps/docs/src/app/components/swirl-gradient/scene.tsx new file mode 100644 index 00000000..848cf65b --- /dev/null +++ b/apps/docs/src/app/components/swirl-gradient/scene.tsx @@ -0,0 +1,32 @@ +'use client'; + +import type { ReactNode } from 'react'; + +import { ShaderScene, SwirlGradient } from '@camp-dev/shaders'; + +import { INITIAL, type Params } from './params'; + +export default function SwirlGradientScene({ + params = INITIAL, + children, +}: { + params?: Params; + children?: ReactNode; +} = {}) { + return ( + + + {children} + + ); +} diff --git a/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx b/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx new file mode 100644 index 00000000..5f6f4976 --- /dev/null +++ b/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx @@ -0,0 +1,60 @@ +'use client'; + +// Benchmark for SwirlGradient with ShaderMonitor's GPU readout (SHA-223). +// `?size=card` renders it in the Reactive card's 312 by 309 CSS-pixel +// window, where it must stay under 0.4 ms at 2x; `?size=full` renders it at +// 1440 by 900. `?dpr=2` caps the canvas at two pixels per CSS pixel, and +// anything else at one. The links between settings are full page loads, so +// each measurement starts from a fresh renderer. +import { useState } from 'react'; + +import { ShaderMonitor, ShaderScene, SwirlGradient, useStaticSceneHint } from '@camp-dev/shaders'; + +const SIZES = { + card: { width: 312, height: 309 }, + full: { width: 1440, height: 900 }, +} as const; + +type SizeName = keyof typeof SIZES; + +const readSettings = (): { size: SizeName; pixelRatio: number } => { + const search = new URLSearchParams(window.location.search); + + return { + size: search.get('size') === 'full' ? 'full' : 'card', + pixelRatio: search.get('dpr') === '2' ? 2 : 1, + }; +}; + +/** + * Votes the scene animated, so a still SwirlGradient keeps drawing frames + * and the GPU readout averages many frames instead of settling on one. + */ +function KeepDrawing() { + useStaticSceneHint(false); + + return null; +} + +export default function BenchmarkScene() { + const [{ size, pixelRatio }] = useState(readSettings); + const { width, height } = SIZES[size]; + + return ( +
+

+ SwirlGradient at {width} × {height} CSS px, pixel ratio capped at {pixelRatio}x.{' '} + card ·{' '} + full · 1x ·{' '} + 2x +

+
+ + + + + +
+
+ ); +} diff --git a/apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx b/apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx new file mode 100644 index 00000000..a8a34a7b --- /dev/null +++ b/apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx @@ -0,0 +1,12 @@ +'use client'; + +import dynamic from 'next/dynamic'; + +// three/webgpu references `self` at module load and cannot SSR, so the +// benchmark scene is loaded client-only. Dev route: invisible to production +// builds. +const BenchmarkScene = dynamic(() => import('./benchmark-scene'), { ssr: false }); + +export default function SwirlGradientBenchmarkPage() { + return ; +} diff --git a/apps/docs/src/content/components.ts b/apps/docs/src/content/components.ts index 7f7fe0ef..b3201f57 100644 --- a/apps/docs/src/content/components.ts +++ b/apps/docs/src/content/components.ts @@ -103,6 +103,11 @@ export const COMPONENTS = { 'Evolving 3D simplex noise with color ramp, contour bands, and brightness/contrast histogram shaping.', category: 'noise', }, + 'swirl-gradient': { + description: + 'Repeating color bands folded along a drifting flow, like paint swirled on water. Stretches bands into fine threads without bunching them.', + category: 'gradients', + }, vignette: { description: 'Radial darkening at the canvas edges. Stacks on top of any base component inside .', diff --git a/packages/shaders/src/components/index.ts b/packages/shaders/src/components/index.ts index 59148915..4ae6861a 100644 --- a/packages/shaders/src/components/index.ts +++ b/packages/shaders/src/components/index.ts @@ -61,6 +61,9 @@ export type { RadialWipeProps } from './radial-wipe/radial-wipe.js'; export { SimplexNoise } from './simplex-noise/simplex-noise.js'; export type { SimplexNoiseProps } from './simplex-noise/simplex-noise.js'; +export { SwirlGradient } from './swirl-gradient/swirl-gradient.js'; +export type { SwirlGradientProps } from './swirl-gradient/swirl-gradient.js'; + export { Vignette } from './vignette/vignette.js'; export type { VignetteProps } from './vignette/vignette.js'; diff --git a/packages/shaders/src/components/swirl-gradient/flow.ts b/packages/shaders/src/components/swirl-gradient/flow.ts new file mode 100644 index 00000000..c14d5a4c --- /dev/null +++ b/packages/shaders/src/components/swirl-gradient/flow.ts @@ -0,0 +1,336 @@ +// The flow SwirlGradient folds its bands along, and the backward trace +// through it. The flow is the curl of a gradient-noise field: the noise's +// slope turned 90 degrees, so colors slide along the noise's contour lines +// and never pile up. The flow pass draws it into a texture once a frame, and +// the shader (./shader.tsx) traces each pixel back through that texture to +// find where its color started. Lives beside the component, as stroke.ts +// does in cursor-ripple/, until a second component needs it. +import type { ShaderNodeObject } from 'three/tsl'; +import { cos, float, floor, Fn, fract, Loop, sin, texture, uv, vec2, vec4 } from 'three/tsl'; +import { HalfFloatType, LinearFilter, type Node } from 'three/webgpu'; + +import { createTexturePass, stableHash, stableHashUint, type TSLNode } from '../../engine.js'; +import type { ShaderContextValue } from '../../react/context/shader-context.js'; + +// --------------------------------------------- +// Constants +// --------------------------------------------- + +// The flow repeats every FLOW_PERIOD lattice cells on both axes, so one +// period drawn into a texture covers every point a trace can reach. A +// lattice cell is about one eddy, so at the scale slider's top, 8 eddies +// per canvas height, a 16:10 canvas spans about 13 cells and no repeat +// shows. Raising it pushes the repeat further out at the cost of texels. +// A power of two, so dividing a cell index by it stays exact in a float. +const FLOW_PERIOD = 16; + +// Texels per period on each side. 512 over 16 cells gives 32 texels per +// eddy, and 16 per smaller eddy, which the texture's linear filter blends +// into a smooth flow. Fewer texels draw faster: 256 took 0.09 ms off the +// card's 0.36 at 2x, but the filter's straight runs between texels showed, +// and the crisp seams came out faceted instead of curved. +const FLOW_TEXELS = 512; + +// The smaller eddies run at twice the broad flow's frequency, so each one is +// half the size of a broad eddy. 2 divides FLOW_PERIOD, so they repeat with +// the broad flow. +const SMALL_EDDY_FREQUENCY = 2; + +const TWO_PI = Math.PI * 2; + +// --------------------------------------------- +// Gradient noise with its slope +// --------------------------------------------- + +/** + * The random arrow at one corner of the noise lattice, a unit vector at a + * hashed angle. `rowWord` is the hash of the corner's row, so the four + * corners of a cell share two row hashes instead of hashing a row each. + */ +function cornerArrow(column: ShaderNodeObject, rowWord: ShaderNodeObject) { + const angle = stableHash(column.toUint().add(rowWord)).mul(TWO_PI); + + return vec2(cos(angle), sin(angle)); +} + +/** + * A lattice index folded into 0..FLOW_PERIOD - 1, so the arrows, and with + * them the whole flow, repeat every FLOW_PERIOD cells. Written out with + * floor() rather than mod(), because WGSL's float remainder keeps the sign + * of a negative index and GLSL's mod() does not. It also keeps the hash's + * input positive, as stableHash needs. + */ +function wrapCell(index: ShaderNodeObject) { + return index.sub(floor(index.div(FLOW_PERIOD)).mul(FLOW_PERIOD)); +} + +/** + * 2D gradient noise (Perlin's kind) at `point`, together with its slope: how + * fast the noise climbs along x and along y. The slope comes from the same + * reads as the value, by the chain rule, so a caller that needs the slope + * pays for one noise read, not three. After Inigo Quilez's "gradient noise + * derivatives" (iquilezles.org/articles/gradientnoise). + * + * The value runs roughly -0.7..0.7, and the slope's length stays under about + * 2 per lattice cell. Only `slope` feeds the flow, and the GPU compiler drops + * `value` when nothing reads it. + */ +function gradientNoise(point: TSLNode, seedWord: ShaderNodeObject) { + // Split the point into its lattice cell (the integer corner below and to + // its left) and its place inside that cell, 0..1 on each axis. + const cell = floor(point); + const local = fract(point); + + // The quintic fade 6t^5 - 15t^4 + 10t^3: an S-curve from 0 to 1 whose + // first and second slopes are 0 at both ends, so neighboring cells meet + // with no visible crease in the noise or in its slope. `fadeSlope` is its + // derivative, 30t^2(t - 1)^2, which the slope below needs. + const fade = local + .mul(local) + .mul(local) + .mul(local.mul(local.mul(6).sub(15)).add(10)); + const fadeSlope = local + .mul(local) + .mul(30) + .mul(local.mul(local.sub(2)).add(1)); + + // One random arrow per corner. Nested hashing, row then column, as in + // voronoi-cells.ts, keeps neighboring cells unrelated. The seed joins the + // row hash, so each seed reshuffles every arrow. + const lowerRow = stableHashUint(wrapCell(cell.y).toUint().add(seedWord)); + const upperRow = stableHashUint(wrapCell(cell.y.add(1)).toUint().add(seedWord)); + const leftColumn = wrapCell(cell.x); + const rightColumn = wrapCell(cell.x.add(1)); + const arrowA = cornerArrow(leftColumn, lowerRow); // corner (0, 0) + const arrowB = cornerArrow(rightColumn, lowerRow); // corner (1, 0) + const arrowC = cornerArrow(leftColumn, upperRow); // corner (0, 1) + const arrowD = cornerArrow(rightColumn, upperRow); // corner (1, 1) + + // Each corner's vote: how far the point sits along that corner's arrow. + // The vote is 0 at the corner itself, so the noise is 0 on every lattice + // point, and it rises or falls away from the corner as the arrow points. + const voteA = arrowA.dot(local); + const voteB = arrowB.dot(local.sub(vec2(1, 0))); + const voteC = arrowC.dot(local.sub(vec2(0, 1))); + const voteD = arrowD.dot(local.sub(vec2(1, 1))); + + // Blend the four votes across the cell with the fade as the weight, written + // out as a bilinear blend: start at A, add the x and y steps, then the + // cross term that bends the surface between the four corners. + const cross = voteA.sub(voteB).sub(voteC).add(voteD); + const value = voteA + .add(fade.x.mul(voteB.sub(voteA))) + .add(fade.y.mul(voteC.sub(voteA))) + .add(fade.x.mul(fade.y).mul(cross)); + + // The same blend, differentiated. Two parts: the arrows blended with the + // same weights (how each vote changes as the point moves), plus the + // fade's own slope times how much the votes differ across the cell (how + // the weights change as the point moves). + const arrowCross = arrowA.sub(arrowB).sub(arrowC).add(arrowD); + const slope = arrowA + .add(arrowB.sub(arrowA).mul(fade.x)) + .add(arrowC.sub(arrowA).mul(fade.y)) + .add(arrowCross.mul(fade.x.mul(fade.y))) + .add(fadeSlope.mul(fade.yx.mul(cross).add(vec2(voteB, voteC)).sub(voteA))); + + return { value, slope }; +} + +// --------------------------------------------- +// The flow's velocity +// --------------------------------------------- + +/** What shapes the flow, shared by the flow pass and the inline fallback. */ +export interface FlowInputs { + /** A whole number 0 or above that picks the flow's random layout. */ + seed: TSLNode; + /** + * The smaller eddies' strength, from 0 for the broad flow alone to 1, where + * they swirl as hard as the broad eddies do. + */ + smallEddies: TSLNode; +} + +/** + * The flow's velocity at `point`, in lattice cells per unit of trace time, + * worked out from the noise. The velocity is the curl of the noise: its + * slope turned 90 degrees, (slope.y, -slope.x). Turned that way, it runs + * along the noise's contour lines instead of downhill, so it never gathers + * into a sink or spreads from a source. Every patch of color keeps its area + * as it moves: bands stretch into threads and fold rather than bunching + * into knots. + * + * The flow is two layers of noise, broad eddies and smaller ones at twice + * the frequency, and the curl of a sum is the sum of the curls. + */ +function flowVelocity(point: TSLNode, { seed, smallEddies }: FlowInputs) { + const broadSeed = stableHashUint(float(seed)); + // A second, unrelated hash stream, so the smaller eddies don't line up + // with the broad ones. + const smallSeed = stableHashUint(broadSeed); + + const broadSlope = gradientNoise(point, broadSeed).slope; + const smallSlope = gradientNoise(vec2(point).mul(SMALL_EDDY_FREQUENCY), smallSeed).slope; + + // The small layer's slope weight. Read at twice the frequency, its slope + // comes out twice as steep by the chain rule, so at a strength of 0.5 the + // small eddies swirl as hard as the broad ones. The strength scales the + // layer's height, as an fBm octave's gain does. + const slope = broadSlope.add(smallSlope.mul(float(smallEddies).mul(SMALL_EDDY_FREQUENCY))); + + // Curl: the slope turned 90 degrees clockwise. + return vec2(slope.y, slope.x.negate()); +} + +/** Reads the flow's velocity at a point, in lattice cells. */ +export type VelocityAt = (point: ShaderNodeObject) => ShaderNodeObject; + +/** + * The inline fallback: a VelocityAt that works the velocity out from the + * noise at every read, two noise reads per step. For renderers the flow + * pass can't draw on. + */ +export function inlineVelocity(inputs: FlowInputs): VelocityAt { + return (point) => flowVelocity(point, inputs); +} + +// --------------------------------------------- +// The flow pass +// --------------------------------------------- + +/** The flow pass's handle: how to read the flow, and how to release it. */ +export interface FlowPass { + velocityAt: VelocityAt; + dispose: () => void; +} + +/** + * Draws one period of the flow's velocity into a texture, so each trace step + * reads one texel (one pixel of a texture) instead of working out two noise + * layers. The velocity depends on the point the trace reaches and on the + * uniforms, never on the pixel, so every pixel's steps read the same field + * (the texture-pass case in docs/agents/tsl.md). Returns null where the + * renderer can't draw into a half-float target, and the trace works the + * velocity out inline. + * + * The texture holds FLOW_TEXELS + 1 texels a side. Texel i sits at lattice + * point i x FLOW_PERIOD / FLOW_TEXELS, so the last row and column land on + * the period's far edge and, since the flow repeats, repeat the first. A + * read anywhere in the period falls between two drawn texels and never on + * the texture's edge, so the linear filter blends across the period's seam + * as smoothly as anywhere else. + * + * The caller creates and disposes the pass in one effect, so a Strict Mode + * remount builds a fresh one (the Strict Mode gotcha in docs/agents/tsl.md). + */ +export function createFlowPass( + shaderContext: ShaderContextValue, + inputs: FlowInputs, +): FlowPass | null { + const side = FLOW_TEXELS + 1; + + // One texel's value: the velocity at the lattice point under it. uv() is + // the texel center's 0..1 position, (i + 0.5) / side, so undoing that + // gives back i, and i x FLOW_PERIOD / FLOW_TEXELS is the lattice point. + const velocityNode = Fn(() => { + const point = uv() + .mul(side) + .sub(0.5) + .mul(FLOW_PERIOD / FLOW_TEXELS); + + return vec4(flowVelocity(point, inputs), 0, 1); + })(); + + // A half float holds the velocity to about three significant digits, far + // finer than a step can show. Half floats are filterable on every backend + // that draws them, so the linear filter blends the four texels around + // each read. + const pass = createTexturePass(shaderContext.renderer.three, velocityNode, { + width: side, + height: side, + type: HalfFloatType, + filter: LinearFilter, + }); + const velocityTexture = pass.texture; + + if (velocityTexture === null) return null; + + // The output stage draws pre-passes ahead of the scene pass in the same + // frame, so the trace always reads this frame's flow (the draw-order + // gotcha in docs/agents/tsl.md). + const removePrePass = shaderContext.registerPrePass(pass.render); + + return { + // Fold the point into the period, then into the texture: f x FLOW_TEXELS + // is the texel index, and + 0.5 over the side is its center in 0..1. + // The coordinate goes in when the texture node is built, not chained on + // with .uv(), so three skips the texture matrix on every step (the + // texture-matrix gotcha in docs/agents/tsl.md). + velocityAt: (point) => { + const periodFraction = fract(point.mul(1 / FLOW_PERIOD)); + const coordinate = periodFraction.mul(FLOW_TEXELS).add(0.5).div(side); + + return texture(velocityTexture, coordinate).xy; + }, + dispose() { + removePrePass(); + pass.dispose(); + }, + }; +} + +// --------------------------------------------- +// The backward trace +// --------------------------------------------- + +/** The options for one backward trace through the flow. */ +export interface TraceFlowOptions { + /** + * How many steps the trace takes. A plain number, because it is the loop's + * bound and the loop is compiled into the shader. + */ + steps: number; + /** + * How far each step travels where the flow runs at unit speed, in lattice + * cells. 0 holds the trace in place. + */ + stepLength: TSLNode; + /** Where the trace reads the flow's velocity: the flow pass, or inline. */ + velocityAt: VelocityAt; +} + +/** + * Trace a point backward along the flow and return how far it moved, in + * lattice cells. The pixel at `start` shows whatever color sat at + * `start + offset` before the flow carried it here. Each step reads the + * velocity where the trace has reached and steps against it. + * + * Written with Fn and Loop, so the GPU runs a real loop instead of `steps` + * copies of the body. + */ +export function traceFlow( + start: TSLNode, + { steps, stepLength, velocityAt }: TraceFlowOptions, +): ShaderNodeObject { + return Fn(() => { + // Pin what is the same on every step before the loop. Without .toVar(), + // TSL writes each expression where the shader first uses it, which is + // inside the loop, so every step would redo it (the first-use gotcha in + // docs/agents/tsl.md). + const origin = vec2(start).toVar(); + const step = float(stepLength).toVar(); + + // The loop's running state: how far the trace has moved from `origin`. + // Starting at 0 means a step length of 0 returns exactly 0, so straight + // bands stay exactly straight. + const offset = vec2(0, 0).toVar(); + + Loop(steps, () => { + // Backward: step against the velocity, toward where the color came from. + offset.subAssign(velocityAt(origin.add(offset)).mul(step)); + }); + + return offset; + })(); +} diff --git a/packages/shaders/src/components/swirl-gradient/shader.tsx b/packages/shaders/src/components/swirl-gradient/shader.tsx new file mode 100644 index 00000000..53f181b7 --- /dev/null +++ b/packages/shaders/src/components/swirl-gradient/shader.tsx @@ -0,0 +1,289 @@ +'use client'; + +// SwirlGradient's GPU half. The pixel's journey: place the pixel in the +// flow, trace it backward along the flow (./flow.ts) to where its color +// started, then read LinearGradient's repeating bands at that starting +// point. Every pixel reads the bands from somewhere upstream, so the +// straight bands come out stretched and folded, like paint swirled on +// water. The wrapper (./swirl-gradient.tsx) supplies the props. +import { useEffect, useMemo } from 'react'; + +import { cos, fract, max, mix, sin, smoothstep, uniform, uv, vec2 } from 'three/tsl'; +import { Mesh, MeshBasicNodeMaterial, PlaneGeometry } from 'three/webgpu'; + +import { colorRamp, type ColorSpace, type HueInterpolation } from '../../engine.js'; +import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; +import { useAnimatableUniform } from '../../react/hooks/use-animatable-uniform/use-animatable-uniform.js'; +import { useAspectUniform } from '../../react/hooks/use-aspect-uniform/use-aspect-uniform.js'; +import { useShaderContext } from '../../react/hooks/use-shader-context/use-shader-context.js'; +import { useStaticSceneHint } from '../../react/hooks/use-static-hint/use-static-hint.js'; +import { type ColorStop, colorStopsKey, toColorRampStops } from '../shared/color.js'; +import { createFlowPass, inlineVelocity, traceFlow } from './flow.js'; + +// --------------------------------------------- +// Flow constants (provisional until the defaults gate) +// --------------------------------------------- +// How many steps each pixel's trace takes. More steps follow tight eddies +// more faithfully, and each one costs a texture read per pixel. Too few +// and a step overshoots the curve it should follow, so neighboring pixels +// land in unrelated places and the threads tear. +const STEP_COUNT = 24; + +// How far one step travels at swirl 1 where the flow runs at unit speed, in +// lattice cells (about one eddy each). STEP_COUNT x STEP_LENGTH is the whole trace's reach at swirl +// 1. Longer steps reach further for the same cost, until they start to tear. +const STEP_LENGTH = 0.05; + +// The smaller eddies' strength, 0..1. 0 leaves the broad flow alone, with +// smooth, wide folds. Raising it curls finer swirls into the folds. +const SMALL_EDDIES = 0.35; + +/** + * TEMPORARY (build-phase tuning only): dev overrides for the flow's feel + * constants. Stripped at the defaults gate. + */ +export interface SwirlGradientTuning { + /** + * Steps in each pixel's trace. Compiled into the shader, so a change + * rebuilds the material. + */ + steps?: number; + /** Distance one step travels at swirl 1, in lattice cells (about one eddy each). */ + stepLength?: number; + /** Strength of the smaller eddies, from 0 for none to 1. */ + smallEddies?: number; +} + +export interface SwirlGradientShaderProps { + /** + * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions + * auto-space when omitted. + */ + stops: ColorStop[]; + /** + * Direction the bands run across, in degrees. 0 runs left to right, 90 + * runs bottom to top. Accepts a static value or an animation signal. + */ + angle: AnimatableProp; + /** + * How many times the stops run across the canvas. Each pass runs the stops + * in the same direction and snaps back to the first, so unless the first + * and last stop match there is a crisp seam at every band boundary, which + * the flow draws out into threads. Values at or below 1 render as a single + * pass. Accepts a static value or an animation signal. + */ + repeat: AnimatableProp; + /** + * How far the flow carries the colors. 0 leaves the bands straight; higher + * values stretch and fold them further. Accepts a static value or an + * animation signal. + */ + swirl: AnimatableProp; + /** + * Roughly how many eddies span the canvas's height. Accepts a static value + * or an animation signal. + */ + scale: AnimatableProp; + /** + * Picks a different flow with the same character. Each whole number gives + * an unrelated flow. + */ + seed: number; + /** Color space the bands are interpolated in. */ + colorSpace: ColorSpace; + /** Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert otherwise. */ + hueInterpolation: HueInterpolation; + /** TEMPORARY (build-phase tuning only). Stripped at the defaults gate. */ + tuning?: SwirlGradientTuning; +} + +export function SwirlGradientShader({ + stops, + angle, + repeat, + swirl, + scale, + seed, + colorSpace, + hueInterpolation, + tuning, +}: SwirlGradientShaderProps) { + const shaderContext = useShaderContext(); + + // Nothing moves yet, so the scene can render once and park. + useStaticSceneHint(true); + + // The animatable dials live in uniforms (values the CPU can update each + // frame without rebuilding the shader), tracking either a static number or + // an animation signal. + const angleUniform = useAnimatableUniform(angle); + const repeatUniform = useAnimatableUniform(repeat); + const swirlUniform = useAnimatableUniform(swirl); + const scaleUniform = useAnimatableUniform(scale); + + // Canvas width over height, so the eddies stay round on a wide canvas. + const aspectNode = useAspectUniform(); + + // The seed goes into the flow's hash, which reads it as a whole number 0 + // or above (stableHash truncates to u32, and u32 of a negative float is + // backend-defined). The uniform is created once and rewritten, so a new + // seed repaints without recompiling. The scene renders on demand, so poke + // it to show the change (the bare-uniform-write gotcha in + // docs/agents/tsl.md). + const seedUniform = useMemo(() => uniform(0), []); + + useEffect(() => { + seedUniform.value = Math.round(Math.abs(seed)); + shaderContext?.scheduler.requestRender(); + }, [shaderContext, seedUniform, seed]); + + // --------------------------------------------- + // Tuning (dev), stripped at the defaults gate + // --------------------------------------------- + // The step length and the smaller eddies ride uniforms, so their sliders + // glide without a rebuild. The step count is the loop's bound, compiled + // into the shader, so it joins the build effect's deps instead. + const stepCount = tuning?.steps ?? STEP_COUNT; + const stepLength = tuning?.stepLength ?? STEP_LENGTH; + const smallEddies = tuning?.smallEddies ?? SMALL_EDDIES; + const stepLengthUniform = useMemo(() => uniform(STEP_LENGTH), []); + const smallEddiesUniform = useMemo(() => uniform(SMALL_EDDIES), []); + + useEffect(() => { + stepLengthUniform.value = stepLength; + smallEddiesUniform.value = smallEddies; + shaderContext?.scheduler.requestRender(); + }, [shaderContext, stepLengthUniform, smallEddiesUniform, stepLength, smallEddies]); + + // Content fingerprint of the stops array (colors + positions). The build + // effect keys on this string, so a re-render that passes a new array with + // the same contents doesn't rebuild the material. + const stopsKey = colorStopsKey(stops); + + // --------------------------------------------- + // Build the material and mount the mesh + // --------------------------------------------- + // Runs once per mount, and again when the stops or color space change + // (colorRamp bakes the stop colors in as constants) or the step count does + // (the loop's bound). Every dial above flows through uniforms. + useEffect( + () => { + if (!shaderContext) return; + + // --------------------------------------------- + // Place the pixel in the flow + // --------------------------------------------- + // uv() is the pixel's position on the plane, 0..1 both ways. + // Subtracting 0.5 centers it, so changing the scale zooms around the + // middle of the canvas rather than its corner. x times the aspect + // ratio measures both axes in canvas heights, which keeps the eddies + // round on a wide canvas. Times scale, one lattice cell of the noise, + // about one eddy, spans 1/scale of the canvas's height. + const centered = uv().sub(vec2(0.5, 0.5)); + const flowPoint = vec2(centered.x.mul(aspectNode), centered.y).mul(scaleUniform); + + // --------------------------------------------- + // Trace it back to where its color started + // --------------------------------------------- + // The flow pass draws the flow's velocity into a texture before each + // frame, so a step costs one texture read. Where the renderer can't + // draw half floats, the trace works the velocity out from the noise + // at every step instead, which looks the same and costs far more. + const flowInputs = { seed: seedUniform, smallEddies: smallEddiesUniform }; + const flowPass = createFlowPass(shaderContext, flowInputs); + + // swirl scales every step, so it sets how far the trace reaches: at 0 + // the trace stands still and the bands stay exactly straight. + const flowOffset = traceFlow(flowPoint, { + steps: stepCount, + stepLength: swirlUniform.mul(stepLengthUniform), + velocityAt: flowPass?.velocityAt ?? inlineVelocity(flowInputs), + }); + + // The offset comes back in lattice cells. Undo the placement's + // stretches, in reverse, to turn it into uv: divide by scale, then x + // by the aspect. The max() keeps a scale of 0 from dividing by zero. + const safeScale = max(scaleUniform, 0.001); + const uvOffset = vec2(flowOffset.x.div(aspectNode), flowOffset.y).div(safeScale); + const sourceUv = uv().add(uvOffset); + + // --------------------------------------------- + // Read the bands where the color started + // --------------------------------------------- + // From here on this is LinearGradient's math at its default center and + // a speed of 0, read at sourceUv instead of uv, so at swirl 0 the two + // draw the same image. The angle becomes a unit direction, and the + // pixel's distance along it, plus 0.5, is its place on the ramp. At + // angle 0 that is plain u: 0 at the left edge, 1 at the right. + const angleRadians = angleUniform.mul(Math.PI / 180); + const direction = vec2(cos(angleRadians), sin(angleRadians)); + const gradientCoord = sourceUv.sub(vec2(0.5, 0.5)).dot(direction).add(0.5); + + // The repeating bands: multiplying by repeat fits that many passes of + // the ramp into one, and fract() keeps the fractional part, so the + // coordinate saws 0 -> 1 over and over. The mix is LinearGradient's + // repeat gate: at repeat <= 1 the smoothstep is exactly 0 and the + // single pass comes through untouched. + const tiled = fract(gradientCoord.mul(repeatUniform)); + const rampCoord = mix(gradientCoord, tiled, smoothstep(1, 1.01, repeatUniform)); + + // An unlit material whose per-pixel color comes from colorNode. + // colorRamp maps the 0..1 coordinate to a color, blending between + // stops in the chosen color space. + const material = new MeshBasicNodeMaterial(); + + material.colorNode = colorRamp( + rampCoord, + toColorRampStops(stops), + colorSpace, + hueInterpolation, + ); + + // A 2x2 plane exactly fills ShaderScene's camera view (-1..1 on both + // axes), so the bands cover the whole canvas. + const mesh = new Mesh(new PlaneGeometry(2, 2), material); + + shaderContext.scene.add(mesh); + + // A rebuild swaps the mesh without touching any uniform, and a still + // scene is parked, so poke it to draw the new material. + shaderContext.scheduler.requestRender(); + + return () => { + shaderContext.scene.remove(mesh); + flowPass?.dispose(); + try { + material.dispose(); + } catch { + // three/webgpu can throw during dispose under Strict Mode double-invoke + } + try { + mesh.geometry.dispose(); + } catch { + // same + } + }; + }, + // stopsKey is a stable string proxy for the stops array; the array itself + // is intentionally omitted to avoid rebuilds on identity-only changes. + // Animatable uniforms are mutated in place. + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + shaderContext, + angleUniform, + repeatUniform, + swirlUniform, + scaleUniform, + aspectNode, + seedUniform, + stepLengthUniform, + smallEddiesUniform, + stepCount, + stopsKey, + colorSpace, + hueInterpolation, + ], + ); + + return null; +} diff --git a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx new file mode 100644 index 00000000..a165c69a --- /dev/null +++ b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx @@ -0,0 +1,99 @@ +'use client'; + +// Public face of the swirl gradient: owns the props, their JSDoc, and their +// defaults, then delegates to SwirlGradientShader (./shader.tsx), which +// folds LinearGradient's repeating bands along a flow, like paint swirled +// on water. Render it inside a . +import type { ColorSpace, HueInterpolation } from '../../engine.js'; +import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; +import type { ColorStop } from '../shared/color.js'; +import { SwirlGradientShader, type SwirlGradientTuning } from './shader.js'; + +export type { ColorStop } from '../shared/color.js'; +export type { SwirlGradientTuning } from './shader.js'; + +export interface SwirlGradientProps { + /** + * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions + * auto-space when omitted. + */ + stops?: ColorStop[]; + /** + * Direction the bands run across, in degrees. 0 runs left to right, 90 + * runs bottom to top. Defaults to 0. Accepts a static value or an + * animation signal. + */ + angle?: AnimatableProp; + /** + * How many times the stops run across the canvas. Each pass runs the stops + * in the same direction and snaps back to the first, so unless the first + * and last stop match there is a crisp seam at every band boundary, which + * the flow draws out into threads. Values at or below 1 render as a single + * pass. Defaults to 3. Accepts a static value or an animation signal. + */ + repeat?: AnimatableProp; + /** + * How far the flow carries the colors. 0 leaves the bands straight; higher + * values stretch and fold them further. Defaults to 1. Accepts a static + * value or an animation signal. + */ + swirl?: AnimatableProp; + /** + * Roughly how many eddies span the canvas's height. Defaults to 2. Accepts + * a static value or an animation signal. + */ + scale?: AnimatableProp; + /** + * Picks a different flow with the same character. Each whole number gives + * an unrelated flow. Defaults to 0. + */ + seed?: number; + /** Color space the bands are interpolated in. Defaults to `'oklab'`. */ + colorSpace?: ColorSpace; + /** + * Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert + * otherwise. Defaults to `'shorter'`. + */ + hueInterpolation?: HueInterpolation; + /** + * TEMPORARY (build-phase tuning only): dev overrides for the flow's feel + * constants. Stripped at the defaults gate. Do not use. + */ + tuning?: SwirlGradientTuning; +} + +// Provisional palette until the defaults gate: blue -> violet -> purple, +// 55 degrees of hue, climbing about 0.15 to 0.26 in lightness per stop. The +// first and last stops differ, so each band ends in a crisp seam for the +// flow to draw out. +const DEFAULT_STOPS: ColorStop[] = [ + { color: 'oklch(0.303 0.152 265.847)' }, // paletteOklch.blue[3] + { color: 'oklch(0.460 0.248 293.328)' }, // paletteOklch.violet[6] + { color: 'oklch(0.720 0.250 320)' }, // paletteOklch.purple[9] +]; + +export function SwirlGradient({ + stops = DEFAULT_STOPS, + angle = 0, + repeat = 3, + swirl = 1, + scale = 2, + seed = 0, + colorSpace = 'oklab', + hueInterpolation = 'shorter', + tuning, +}: SwirlGradientProps) { + return ( + + ); +} From d0ba48e1377f0b83947fd32d347c5b323aba3d3c Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Sun, 11 Oct 2026 14:38:54 -0400 Subject: [PATCH 3/6] feat(shaders): drift SwirlGradient's flow with spinning noise arrows Phase 2 of SHA-223. speed turns each lattice arrow at its own rate (Perlin and Neyret's flow noise), so the eddies form, merge, and dissolve in place. A literal speed of 0 votes idle, so the scene parks. One hash word per corner supplies both the start angle and the spin, because a second hash per corner pushed the Reactive card's window past 0.4 ms at 2x. A temporary slide knob in the tuning rig moves the whole flow, for comparison. --- .../app/components/swirl-gradient/demo.tsx | 2 + .../app/components/swirl-gradient/params.ts | 4 + .../app/components/swirl-gradient/scene.tsx | 1 + .../src/components/swirl-gradient/flow.ts | 110 +++++++++++++++--- .../src/components/swirl-gradient/shader.tsx | 61 ++++++++-- .../swirl-gradient/swirl-gradient.tsx | 8 ++ 6 files changed, 162 insertions(+), 24 deletions(-) diff --git a/apps/docs/src/app/components/swirl-gradient/demo.tsx b/apps/docs/src/app/components/swirl-gradient/demo.tsx index ee2964db..fe731fc2 100644 --- a/apps/docs/src/app/components/swirl-gradient/demo.tsx +++ b/apps/docs/src/app/components/swirl-gradient/demo.tsx @@ -59,6 +59,7 @@ function SwirlGradientControls() {
+
@@ -70,6 +71,7 @@ function SwirlGradientControls() { +
createItem={createStop} diff --git a/apps/docs/src/app/components/swirl-gradient/params.ts b/apps/docs/src/app/components/swirl-gradient/params.ts index 876af889..1fb2c866 100644 --- a/apps/docs/src/app/components/swirl-gradient/params.ts +++ b/apps/docs/src/app/components/swirl-gradient/params.ts @@ -12,6 +12,7 @@ export interface Tuning { steps: number; stepLength: number; smallEddies: number; + slide: number; } export interface Params { @@ -19,6 +20,7 @@ export interface Params { repeat: number; swirl: number; scale: number; + speed: number; seed: number; colorSpace: ColorSpace; hueInterpolation: HueInterpolation; @@ -36,6 +38,7 @@ export const INITIAL: Params = { repeat: 3, swirl: 1, scale: 2, + speed: 0.25, seed: 0, colorSpace: 'oklab', hueInterpolation: 'shorter', @@ -48,5 +51,6 @@ export const INITIAL: Params = { steps: 24, stepLength: 0.05, smallEddies: 0.35, + slide: 0, }, }; diff --git a/apps/docs/src/app/components/swirl-gradient/scene.tsx b/apps/docs/src/app/components/swirl-gradient/scene.tsx index 848cf65b..451bbf29 100644 --- a/apps/docs/src/app/components/swirl-gradient/scene.tsx +++ b/apps/docs/src/app/components/swirl-gradient/scene.tsx @@ -22,6 +22,7 @@ export default function SwirlGradientScene({ repeat={params.repeat} scale={params.scale} seed={params.seed} + speed={params.speed} stops={params.stops} swirl={params.swirl} tuning={params.tuning} diff --git a/packages/shaders/src/components/swirl-gradient/flow.ts b/packages/shaders/src/components/swirl-gradient/flow.ts index c14d5a4c..5ead4004 100644 --- a/packages/shaders/src/components/swirl-gradient/flow.ts +++ b/packages/shaders/src/components/swirl-gradient/flow.ts @@ -6,10 +6,24 @@ // find where its color started. Lives beside the component, as stroke.ts // does in cursor-ripple/, until a second component needs it. import type { ShaderNodeObject } from 'three/tsl'; -import { cos, float, floor, Fn, fract, Loop, sin, texture, uv, vec2, vec4 } from 'three/tsl'; +import { + cos, + float, + floor, + Fn, + fract, + Loop, + sign, + sin, + texture, + uint, + uv, + vec2, + vec4, +} from 'three/tsl'; import { HalfFloatType, LinearFilter, type Node } from 'three/webgpu'; -import { createTexturePass, stableHash, stableHashUint, type TSLNode } from '../../engine.js'; +import { createTexturePass, stableHashUint, type TSLNode } from '../../engine.js'; import type { ShaderContextValue } from '../../react/context/shader-context.js'; // --------------------------------------------- @@ -36,6 +50,10 @@ const FLOW_TEXELS = 512; // the broad flow. const SMALL_EDDY_FREQUENCY = 2; +// The way the flow slides when the tuning rig's slide is above 0: right and +// a little up, as a unit vector. TEMPORARY with the slide itself. +const SLIDE_DIRECTION = [0.8, 0.6] as const; + const TWO_PI = Math.PI * 2; // --------------------------------------------- @@ -44,11 +62,45 @@ const TWO_PI = Math.PI * 2; /** * The random arrow at one corner of the noise lattice, a unit vector at a - * hashed angle. `rowWord` is the hash of the corner's row, so the four - * corners of a cell share two row hashes instead of hashing a row each. + * hashed angle that turns as `phase` grows. `rowWord` is the hash of the + * corner's row, so the four corners of a cell share two row hashes instead + * of hashing a row each. + * + * The turning is Perlin and Neyret's "flow noise": every arrow spins at its + * own rate, so the hills and valleys of the noise swell, shrink, and trade + * places, and the eddies around them form, merge, and dissolve where they + * stand instead of sliding across the canvas. Each arrow spins between half + * and one and a half radians per unit of phase, clockwise or + * counterclockwise at random. A rate near 0 would leave patches of the flow + * frozen while the rest moved, and arrows all spinning one way would cycle + * the whole flow back to its start every turn. */ -function cornerArrow(column: ShaderNodeObject, rowWord: ShaderNodeObject) { - const angle = stableHash(column.toUint().add(rowWord)).mul(TWO_PI); +function cornerArrow( + column: ShaderNodeObject, + rowWord: ShaderNodeObject, + phase: ShaderNodeObject, +) { + // One 32-bit hash word per corner, split in two: the top 16 bits set the + // starting angle and the bottom 16 the spin. Each half is a random whole + // number 0..65535, which a float holds exactly on both backends, and + // dividing by 65536 turns it into 0..1. One hash serves both because the + // flow pass runs this for four corners, two noise layers, and every texel, + // each frame the flow moves. + const cornerWord = stableHashUint(column.toUint().add(rowWord)); + const startAngle = cornerWord + .shiftRight(uint(16)) + .toFloat() + .mul(TWO_PI / 65536); + + // A random -1..1, then pushed half a unit away from 0 on its own side: + // -1.5..-0.5 spins one way, 0.5..1.5 the other. + const signedSpin = cornerWord + .bitAnd(uint(0xffff)) + .toFloat() + .mul(2 / 65536) + .sub(1); + const spin = signedSpin.add(sign(signedSpin).mul(0.5)); + const angle = startAngle.add(phase.mul(spin)); return vec2(cos(angle), sin(angle)); } @@ -75,7 +127,11 @@ function wrapCell(index: ShaderNodeObject) { * 2 per lattice cell. Only `slope` feeds the flow, and the GPU compiler drops * `value` when nothing reads it. */ -function gradientNoise(point: TSLNode, seedWord: ShaderNodeObject) { +function gradientNoise( + point: TSLNode, + seedWord: ShaderNodeObject, + phase: ShaderNodeObject, +) { // Split the point into its lattice cell (the integer corner below and to // its left) and its place inside that cell, 0..1 on each axis. const cell = floor(point); @@ -101,10 +157,10 @@ function gradientNoise(point: TSLNode, seedWord: ShaderNodeObject) { const upperRow = stableHashUint(wrapCell(cell.y.add(1)).toUint().add(seedWord)); const leftColumn = wrapCell(cell.x); const rightColumn = wrapCell(cell.x.add(1)); - const arrowA = cornerArrow(leftColumn, lowerRow); // corner (0, 0) - const arrowB = cornerArrow(rightColumn, lowerRow); // corner (1, 0) - const arrowC = cornerArrow(leftColumn, upperRow); // corner (0, 1) - const arrowD = cornerArrow(rightColumn, upperRow); // corner (1, 1) + const arrowA = cornerArrow(leftColumn, lowerRow, phase); // corner (0, 0) + const arrowB = cornerArrow(rightColumn, lowerRow, phase); // corner (1, 0) + const arrowC = cornerArrow(leftColumn, upperRow, phase); // corner (0, 1) + const arrowD = cornerArrow(rightColumn, upperRow, phase); // corner (1, 1) // Each corner's vote: how far the point sits along that corner's arrow. // The vote is 0 at the corner itself, so the noise is 0 on every lattice @@ -146,10 +202,21 @@ export interface FlowInputs { /** A whole number 0 or above that picks the flow's random layout. */ seed: TSLNode; /** - * The smaller eddies' strength, from 0 for the broad flow alone to 1, where - * they swirl as hard as the broad eddies do. + * The smaller eddies' strength: 0 leaves the broad flow alone, 0.5 swirls + * them as hard as the broad eddies, and 1 twice as hard. */ smallEddies: TSLNode; + /** + * How far the flow has moved: the speed prop summed over time. Each lattice + * arrow turns by about this many radians, more or less by its own spin. + */ + phase: TSLNode; + /** + * TEMPORARY (build-phase tuning only): how far the flow slides per unit + * of phase, in lattice cells, on top of the arrows' spin. 0 leaves the + * eddies morphing in place. + */ + slide: TSLNode; } /** @@ -164,14 +231,23 @@ export interface FlowInputs { * The flow is two layers of noise, broad eddies and smaller ones at twice * the frequency, and the curl of a sum is the sum of the curls. */ -function flowVelocity(point: TSLNode, { seed, smallEddies }: FlowInputs) { +function flowVelocity(point: TSLNode, { seed, smallEddies, phase, slide }: FlowInputs) { const broadSeed = stableHashUint(float(seed)); // A second, unrelated hash stream, so the smaller eddies don't line up // with the broad ones. const smallSeed = stableHashUint(broadSeed); - - const broadSlope = gradientNoise(point, broadSeed).slope; - const smallSlope = gradientNoise(vec2(point).mul(SMALL_EDDY_FREQUENCY), smallSeed).slope; + const phaseNode = float(phase); + + // Reading the flow from a point behind this one, against SLIDE_DIRECTION, + // shifts the whole flow forward along it by phase x slide lattice cells. + // At a slide of 0 the point is untouched. + const slideDistance = phaseNode.mul(slide); + const readPoint = vec2(point).sub( + vec2(slideDistance.mul(SLIDE_DIRECTION[0]), slideDistance.mul(SLIDE_DIRECTION[1])), + ); + + const broadSlope = gradientNoise(readPoint, broadSeed, phaseNode).slope; + const smallSlope = gradientNoise(readPoint.mul(SMALL_EDDY_FREQUENCY), smallSeed, phaseNode).slope; // The small layer's slope weight. Read at twice the frequency, its slope // comes out twice as steep by the chain rule, so at a strength of 0.5 the diff --git a/packages/shaders/src/components/swirl-gradient/shader.tsx b/packages/shaders/src/components/swirl-gradient/shader.tsx index 53f181b7..3e2a29cd 100644 --- a/packages/shaders/src/components/swirl-gradient/shader.tsx +++ b/packages/shaders/src/components/swirl-gradient/shader.tsx @@ -13,6 +13,7 @@ import { Mesh, MeshBasicNodeMaterial, PlaneGeometry } from 'three/webgpu'; import { colorRamp, type ColorSpace, type HueInterpolation } from '../../engine.js'; import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; +import { useAnimatableSpeed } from '../../react/hooks/use-animatable-speed/use-animatable-speed.js'; import { useAnimatableUniform } from '../../react/hooks/use-animatable-uniform/use-animatable-uniform.js'; import { useAspectUniform } from '../../react/hooks/use-aspect-uniform/use-aspect-uniform.js'; import { useShaderContext } from '../../react/hooks/use-shader-context/use-shader-context.js'; @@ -35,9 +36,14 @@ const STEP_COUNT = 24; const STEP_LENGTH = 0.05; // The smaller eddies' strength, 0..1. 0 leaves the broad flow alone, with -// smooth, wide folds. Raising it curls finer swirls into the folds. +// smooth, wide folds. Raising it curls finer swirls into the folds; at 0.5 +// they swirl as hard as the broad eddies. const SMALL_EDDIES = 0.35; +// How far the flow slides per unit of phase, in lattice cells, on top of +// the eddies morphing in place. 0 keeps the eddies where they are. +const SLIDE = 0; + /** * TEMPORARY (build-phase tuning only): dev overrides for the flow's feel * constants. Stripped at the defaults gate. @@ -52,6 +58,11 @@ export interface SwirlGradientTuning { stepLength?: number; /** Strength of the smaller eddies, from 0 for none to 1. */ smallEddies?: number; + /** + * How far the flow slides per unit of phase, in lattice cells, on top of + * the eddies morphing in place. + */ + slide?: number; } export interface SwirlGradientShaderProps { @@ -84,6 +95,12 @@ export interface SwirlGradientShaderProps { * or an animation signal. */ scale: AnimatableProp; + /** + * How fast the flow drifts: its eddies form, merge, and dissolve, and the + * bands fold along with them. 0 holds the flow still. Accepts a static + * value or an animation signal. + */ + speed: AnimatableProp; /** * Picks a different flow with the same character. Each whole number gives * an unrelated flow. @@ -103,6 +120,7 @@ export function SwirlGradientShader({ repeat, swirl, scale, + speed, seed, colorSpace, hueInterpolation, @@ -110,8 +128,19 @@ export function SwirlGradientShader({ }: SwirlGradientShaderProps) { const shaderContext = useShaderContext(); - // Nothing moves yet, so the scene can render once and park. - useStaticSceneHint(true); + // A literal speed of 0 holds the flow still, so nothing on screen changes + // (an animation signal might move later, so it doesn't count). Telling + // the scene lets its frame scheduler park on the still frame instead of + // redrawing an unchanging image, as Grain does. + const isStatic = typeof speed === 'number' && speed === 0; + + useStaticSceneHint(isStatic); + + // useAnimatableSpeed sums speed x frame time into a phase uniform each + // frame. The flow's arrows turn by the phase, so changing speed changes + // the tempo without snapping the flow to where a time x speed product + // would put it. + const phaseUniform = useAnimatableSpeed(speed); // The animatable dials live in uniforms (values the CPU can update each // frame without rebuilding the shader), tracking either a static number or @@ -146,14 +175,25 @@ export function SwirlGradientShader({ const stepCount = tuning?.steps ?? STEP_COUNT; const stepLength = tuning?.stepLength ?? STEP_LENGTH; const smallEddies = tuning?.smallEddies ?? SMALL_EDDIES; + const slide = tuning?.slide ?? SLIDE; const stepLengthUniform = useMemo(() => uniform(STEP_LENGTH), []); const smallEddiesUniform = useMemo(() => uniform(SMALL_EDDIES), []); + const slideUniform = useMemo(() => uniform(SLIDE), []); useEffect(() => { stepLengthUniform.value = stepLength; smallEddiesUniform.value = smallEddies; + slideUniform.value = slide; shaderContext?.scheduler.requestRender(); - }, [shaderContext, stepLengthUniform, smallEddiesUniform, stepLength, smallEddies]); + }, [ + shaderContext, + stepLengthUniform, + smallEddiesUniform, + slideUniform, + stepLength, + smallEddies, + slide, + ]); // Content fingerprint of the stops array (colors + positions). The build // effect keys on this string, so a re-render that passes a new array with @@ -189,7 +229,12 @@ export function SwirlGradientShader({ // frame, so a step costs one texture read. Where the renderer can't // draw half floats, the trace works the velocity out from the noise // at every step instead, which looks the same and costs far more. - const flowInputs = { seed: seedUniform, smallEddies: smallEddiesUniform }; + const flowInputs = { + seed: seedUniform, + smallEddies: smallEddiesUniform, + phase: phaseUniform, + slide: slideUniform, + }; const flowPass = createFlowPass(shaderContext, flowInputs); // swirl scales every step, so it sets how far the trace reaches: at 0 @@ -211,8 +256,8 @@ export function SwirlGradientShader({ // Read the bands where the color started // --------------------------------------------- // From here on this is LinearGradient's math at its default center and - // a speed of 0, read at sourceUv instead of uv, so at swirl 0 the two - // draw the same image. The angle becomes a unit direction, and the + // its own speed at 0 (here speed moves the flow, not the bands), read + // at sourceUv instead of uv, so at swirl 0 the two draw the same image. The angle becomes a unit direction, and the // pixel's distance along it, plus 0.5, is its place on the ramp. At // angle 0 that is plain u: 0 at the left edge, 1 at the right. const angleRadians = angleUniform.mul(Math.PI / 180); @@ -275,9 +320,11 @@ export function SwirlGradientShader({ swirlUniform, scaleUniform, aspectNode, + phaseUniform, seedUniform, stepLengthUniform, smallEddiesUniform, + slideUniform, stepCount, stopsKey, colorSpace, diff --git a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx index a165c69a..1ca4ac5f 100644 --- a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx +++ b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx @@ -43,6 +43,12 @@ export interface SwirlGradientProps { * a static value or an animation signal. */ scale?: AnimatableProp; + /** + * How fast the flow drifts: its eddies form, merge, and dissolve, and the + * bands fold along with them. 0 holds the flow still. Defaults to 0.25. + * Accepts a static value or an animation signal. + */ + speed?: AnimatableProp; /** * Picks a different flow with the same character. Each whole number gives * an unrelated flow. Defaults to 0. @@ -78,6 +84,7 @@ export function SwirlGradient({ repeat = 3, swirl = 1, scale = 2, + speed = 0.25, seed = 0, colorSpace = 'oklab', hueInterpolation = 'shorter', @@ -91,6 +98,7 @@ export function SwirlGradient({ repeat={repeat} scale={scale} seed={seed} + speed={speed} stops={stops} swirl={swirl} tuning={tuning} From b3bcec7400b24c7453ecf8a012c6c9def83881a5 Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Sun, 11 Oct 2026 20:30:51 -0400 Subject: [PATCH 4/6] feat(shaders): turn SwirlGradient into a streaked liquid gradient Phase 3 and the liquid rework of SHA-223. Each pixel now averages the colors along its backward trace, which streaks the bands and a fractal paint field along the current, closer to the liquid look the author picked than folded marbling. A cached ramp texture colors each sample, and midpoint integration keeps traces on tight eddies. softness eases each stop in with smoothstep, fwidth keeps every edge one pixel wide, and streaks thinner than a pixel fade to the bands' average color. Mirrored band ends replace seams by default. The flow repeats every 8 eddies, and the average, ramp, and paint passes redraw only when their inputs change. --- .../app/components/swirl-gradient/demo.tsx | 10 +- .../app/components/swirl-gradient/params.ts | 28 +- .../app/components/swirl-gradient/scene.tsx | 1 + .../src/components/swirl-gradient/bands.ts | 342 +++++++++++++++++ .../src/components/swirl-gradient/flow.ts | 125 +++++-- .../src/components/swirl-gradient/paint.ts | 217 +++++++++++ .../src/components/swirl-gradient/shader.tsx | 353 +++++++++++++----- .../swirl-gradient/swirl-gradient.tsx | 25 +- 8 files changed, 961 insertions(+), 140 deletions(-) create mode 100644 packages/shaders/src/components/swirl-gradient/bands.ts create mode 100644 packages/shaders/src/components/swirl-gradient/paint.ts diff --git a/apps/docs/src/app/components/swirl-gradient/demo.tsx b/apps/docs/src/app/components/swirl-gradient/demo.tsx index fe731fc2..5f3453e8 100644 --- a/apps/docs/src/app/components/swirl-gradient/demo.tsx +++ b/apps/docs/src/app/components/swirl-gradient/demo.tsx @@ -55,10 +55,11 @@ function SwirlGradientControls() {
+
- +
@@ -71,7 +72,12 @@ function SwirlGradientControls() { - + + + + + + createItem={createStop} diff --git a/apps/docs/src/app/components/swirl-gradient/params.ts b/apps/docs/src/app/components/swirl-gradient/params.ts index 1fb2c866..8044c678 100644 --- a/apps/docs/src/app/components/swirl-gradient/params.ts +++ b/apps/docs/src/app/components/swirl-gradient/params.ts @@ -13,11 +13,17 @@ export interface Tuning { stepLength: number; smallEddies: number; slide: number; + fadeStart: number; + smear: number; + mirror: number; + paint: number; + paintDetail: number; } export interface Params { angle: number; repeat: number; + softness: number; swirl: number; scale: number; speed: number; @@ -35,10 +41,11 @@ export const MAX_STOPS = 6; // constants in its shader.tsx. Keep them in sync. export const INITIAL: Params = { angle: 0, - repeat: 3, - swirl: 1, - scale: 2, - speed: 0.25, + repeat: 2, + softness: 1, + swirl: 0.9, + scale: 1.5, + speed: 0.15, seed: 0, colorSpace: 'oklab', hueInterpolation: 'shorter', @@ -48,9 +55,14 @@ export const INITIAL: Params = { { color: paletteOklch.purple[9], position: 1 }, ], tuning: { - steps: 24, - stepLength: 0.05, - smallEddies: 0.35, - slide: 0, + steps: 12, + stepLength: 0.025, + smallEddies: 0.45, + slide: 1, + fadeStart: 0.25, + smear: 1, + mirror: 1, + paint: 1, + paintDetail: 0.6, }, }; diff --git a/apps/docs/src/app/components/swirl-gradient/scene.tsx b/apps/docs/src/app/components/swirl-gradient/scene.tsx index 451bbf29..204e8b3c 100644 --- a/apps/docs/src/app/components/swirl-gradient/scene.tsx +++ b/apps/docs/src/app/components/swirl-gradient/scene.tsx @@ -22,6 +22,7 @@ export default function SwirlGradientScene({ repeat={params.repeat} scale={params.scale} seed={params.seed} + softness={params.softness} speed={params.speed} stops={params.stops} swirl={params.swirl} diff --git a/packages/shaders/src/components/swirl-gradient/bands.ts b/packages/shaders/src/components/swirl-gradient/bands.ts new file mode 100644 index 00000000..3154075d --- /dev/null +++ b/packages/shaders/src/components/swirl-gradient/bands.ts @@ -0,0 +1,342 @@ +// How SwirlGradient colors each band coordinate along the trace: +// the stops eased in with smoothstep, the seams smoothed across one pixel, +// and the bands' average color, which threads thinner than a pixel fade to. +// A cached palette keeps color-space conversion out of the tracing loop. +// The shader (./shader.tsx) measures how much of the ramp one pixel spans +// with fwidth() and hands that footprint to each of these. +import type { ShaderNodeObject } from 'three/tsl'; +import { + clamp, + float, + Fn, + Loop, + max, + mix, + smoothstep, + texture, + type uniform, + uv, + vec2, + vec3, + vec4, +} from 'three/tsl'; +import { HalfFloatType, LinearFilter, NearestFilter, type Node } from 'three/webgpu'; + +import { + colorRamp, + type ColorRampStop, + type ColorSpace, + createTexturePass, + type HueInterpolation, + type TSLNode, +} from '../../engine.js'; +import type { ShaderContextValue } from '../../react/context/shader-context.js'; + +// The narrowest a stop's blend may get, as a fraction of its segment. It +// keeps smoothstep's two edges apart, because smoothstep(a, a, x) divides +// by zero. Far below a pixel at any canvas size. +const MIN_BLEND_WIDTH = 1e-4; + +// How many points along the ramp the average pass reads. Hard bands need +// enough to land each stop's edge close to where it is: 64 places it within +// 1/128 of the ramp. +const AVERAGE_SAMPLES = 64; + +// The inline fallback reads fewer, because every pixel pays for them. +const INLINE_AVERAGE_SAMPLES = 16; + +/** The palette and how to blend it, shared by every coloring step. */ +export interface BandPalette { + stops: ColorRampStop[]; + colorSpace: ColorSpace; + hueInterpolation: HueInterpolation; +} + +// --------------------------------------------- +// The stops, eased in +// --------------------------------------------- + +/** + * The band coordinate, reshaped so colorRamp's straight blend between two + * stops becomes an eased one. colorRamp blends linearly across each segment + * (the stretch between two neighboring stops), so the color's rate of change + * jumps at every stop, and the eye reads that jump as a faint crease. Easing + * each segment through smoothstep flattens the blend to zero slope at both + * of its stops, so neighboring segments meet without a crease. + * + * The blend fills the middle `width` of each segment. At softness 1 that is + * the whole segment: smoothstep(0, 1, x), the S-curve. At softness 0 it + * would be a hard step at the segment's middle, so each stop owns a flat + * band, as FractalNoise's softness 0 does. The blend never gets narrower + * than one pixel's footprint, though, so a hard edge still spans a pixel + * and reads smooth instead of stair-stepped. + * + * The reshaped coordinate is a sum over the segments. Each segment adds its + * eased share of its own span: none before the coordinate reaches it, all + * of it once the coordinate has passed it. Inside segment j everything + * before it adds up to its start, so the sum lands at + * start_j + span_j x ease(x), and colorRamp turns that back into an eased + * blend between stop j and stop j + 1. + */ +export function easeStops( + coordinate: TSLNode, + stops: ColorRampStop[], + softness: TSLNode, + footprint: TSLNode, +): ShaderNodeObject { + const first = stops[0]; + + if (first === undefined) return float(coordinate); + + let eased = float(first.position); + + // Mirrors colorRamp's own walk: adjacent pairs, skipping a pair with no + // span to blend across. + for (let i = 1; i < stops.length; i += 1) { + const start = stops[i - 1]?.position ?? 0; + const span = (stops[i]?.position ?? 0) - start; + + if (span <= 0) continue; + + // The footprint is in whole passes of the ramp, so dividing by the + // span gives it as a fraction of this segment. + const width = clamp(max(softness, float(footprint).div(span)), MIN_BLEND_WIDTH, 1); + const halfWidth = width.mul(0.5); + const segmentX = float(coordinate).sub(start).div(span); + + // smoothstep is 0 below its first edge and 1 above its second, so x + // before the segment adds nothing and x past it adds the whole span. + eased = eased.add( + smoothstep(float(0.5).sub(halfWidth), halfWidth.add(0.5), segmentX).mul(span), + ); + } + + return eased; +} + +/** The color of a band coordinate, its stops eased in. */ +export function bandColor( + coordinate: TSLNode, + { stops, colorSpace, hueInterpolation }: BandPalette, + softness: TSLNode, + footprint: TSLNode, +): ShaderNodeObject { + return colorRamp( + easeStops(coordinate, stops, softness, footprint), + stops, + colorSpace, + hueInterpolation, + ); +} + +// --------------------------------------------- +// Cache the palette for reads along a trace +// --------------------------------------------- + +// Samples across one pass of the ramp. The endpoints occupy texel centers, +// so clamped reads preserve the first and last colors. 1024 half-float RGBA +// texels use 8 KiB. More samples reduce interpolation error between texels. +const RAMP_TEXELS = 1024; + +/** A cached ramp, with the same inputs as bandColor and an owned texture. */ +export interface RampPass { + colorAt: (coordinate: TSLNode, softness: TSLNode, footprint: TSLNode) => ShaderNodeObject; + dispose: () => void; +} + +/** + * Cache color-space conversion once per palette, so every trace sample + * reads RGB instead of evaluating the full colorRamp. Stop easing still + * runs at the read, because its width depends on the pixel's footprint. + */ +export function createRampPass(shaderContext: ShaderContextValue, palette: BandPalette): RampPass { + const inline: RampPass = { + colorAt: (coordinate, softness, footprint) => + bandColor(coordinate, palette, softness, footprint), + dispose: () => { + // The inline path owns no texture or pre-pass. + }, + }; + + // A narrow stop interval needs more samples than this table can give it. + // Keep the exact calculation there, and for constant or linear palettes + // whose conversion costs too little to justify a texture read. + const hasNarrowInterval = palette.stops.some((stop, index) => { + const previous = palette.stops[index - 1]; + const span = previous === undefined ? 0 : stop.position - previous.position; + + return span > 0 && span < 4 / (RAMP_TEXELS - 1); + }); + + if (palette.stops.length < 2 || palette.colorSpace === 'linear' || hasNarrowInterval) + return inline; + + const coordinate = uv() + .x.mul(RAMP_TEXELS) + .sub(0.5) + .div(RAMP_TEXELS - 1); + const pass = createTexturePass( + shaderContext.renderer.three, + vec4(colorRamp(coordinate, palette.stops, palette.colorSpace, palette.hueInterpolation), 1), + { width: RAMP_TEXELS, height: 1, type: HalfFloatType, filter: LinearFilter }, + ); + const rampTexture = pass.texture; + + if (rampTexture === null) return inline; + + // Palette edits rebuild the material and this cache together. Draw once, + // before the scene first samples it, then reuse it even as softness moves. + let drawn = false; + const removePrePass = shaderContext.registerPrePass(() => { + if (drawn) return; + pass.render(); + drawn = true; + }); + + return { + colorAt: (position, softness, footprint) => { + const eased = easeStops(position, palette.stops, softness, footprint); + const sampleX = clamp(eased, 0, 1) + .mul(RAMP_TEXELS - 1) + .add(0.5) + .div(RAMP_TEXELS); + + return texture(rampTexture, vec2(sampleX, 0.5)).rgb; + }, + dispose() { + removePrePass(); + pass.dispose(); + }, + }; +} + +// --------------------------------------------- +// The seams, smoothed +// --------------------------------------------- + +/** + * Smooths the seams, where the repeating coordinate drops from 1 back to 0 + * and the last stop meets the first. A pixel's color comes from one point, + * its center, so a pixel the seam crosses lands wholly on one side, and a + * curved seam comes out as a staircase. Here a pixel near the seam takes + * the share of the other side's color that its footprint covers instead, + * so the seam spans one pixel and reads as a smooth line. + * + * `coordinate` is the repeating 0..1 band coordinate and `footprint` how + * much of it one pixel spans. Near the top, the part of the footprint past 1 + * belongs to the first stop. Near the bottom, the part below 0 belongs to + * the last. The blend is in linear light, as light mixes inside one pixel. + * `seamWeight` turns the smoothing off at a single pass, which has no seam. + */ +export function smoothSeams( + color: TSLNode, + coordinate: TSLNode, + footprint: TSLNode, + { first, last }: { first: TSLNode; last: TSLNode }, + seamWeight: TSLNode, +): ShaderNodeObject { + const halfFootprint = float(footprint).mul(0.5); + const safeFootprint = max(footprint, 1e-5); + const pastTop = clamp(float(coordinate).add(halfFootprint).sub(1).div(safeFootprint), 0, 1); + const belowBottom = clamp(halfFootprint.sub(coordinate).div(safeFootprint), 0, 1); + + const withFirst = mix(color, first, pastTop.mul(seamWeight)); + + return mix(withFirst, last, belowBottom.mul(seamWeight)); +} + +// --------------------------------------------- +// The bands' average color +// --------------------------------------------- + +/** + * The average color of one whole pass of the bands: the color a pixel should + * show once it spans every stop, as when the flow stretches a thread thinner + * than a pixel. Reads the eased ramp at evenly spaced points and averages + * them in linear light, the way light averages inside a pixel. Averaging the + * stop colors alone misses the ramp's blend curve: on a dark-to-light + * palette it landed 0.1 off in OKLab, enough to show as a halo where the + * threads fade. + */ +function averageBandColor(palette: BandPalette, softness: TSLNode, sampleCount: number) { + return Fn(() => { + const total = vec3(0, 0, 0).toVar(); + + Loop(sampleCount, ({ i }: { i: ShaderNodeObject }) => { + // Each sample sits at the middle of its share of the ramp, and with no + // footprint the eased blend is softness's alone. + const coordinate = float(i).add(0.5).div(sampleCount); + + total.addAssign(bandColor(coordinate, palette, softness, float(0))); + }); + + return total.div(sampleCount); + })(); +} + +/** The average pass's handle: the average color, and how to release it. */ +export interface AveragePass { + color: ShaderNodeObject; + dispose: () => void; +} + +/** + * Draws the bands' average color into a one-texel texture, so a pixel reads + * one texel instead of sampling the ramp 64 times. The average depends on + * the palette and on softness, never on the pixel. A palette change rebuilds + * the material and this pass with it, so the pass redraws only when softness + * has moved since its last draw. Where the renderer can't draw half floats, + * every pixel works it out from fewer samples instead, and `dispose` has + * nothing to release. + * + * The caller creates and disposes the pass in one effect, so a Strict Mode + * remount builds a fresh one (the Strict Mode gotcha in docs/agents/tsl.md). + */ +export function createAveragePass( + shaderContext: ShaderContextValue, + palette: BandPalette, + softness: ReturnType>, +): AveragePass { + // A half float keeps the dark end of linear light, which an 8-bit texel + // rounds into visible steps. One texel needs no filtering. + const pass = createTexturePass( + shaderContext.renderer.three, + vec4(averageBandColor(palette, softness, AVERAGE_SAMPLES), 1), + { width: 1, height: 1, type: HalfFloatType, filter: NearestFilter }, + ); + const averageTexture = pass.texture; + + if (averageTexture === null) { + return { + color: averageBandColor(palette, softness, INLINE_AVERAGE_SAMPLES), + dispose: () => { + // Nothing was allocated. + }, + }; + } + + // A pre-pass draws before the scene pass in the same frame, so a softness + // change reaches the average on the frame it lands (the draw-order gotcha + // in docs/agents/tsl.md). Each draw is its own render pass, and a pass + // costs time to begin and end even for one texel: drawing every frame + // read 0.04 ms in the Reactive card's window at 2x, a tenth of its + // budget. So the pre-pass checks softness on the CPU first and skips the + // draw while it holds still. NaN never equals a number, so the first + // frame always draws. + let drawnSoftness = Number.NaN; + const removePrePass = shaderContext.registerPrePass(() => { + if (softness.value === drawnSoftness) return; + drawnSoftness = softness.value; + pass.render(); + }); + + return { + // The coordinate goes in when the node is built, so three skips the + // texture matrix (the texture-matrix gotcha in docs/agents/tsl.md). + color: texture(averageTexture, vec2(0.5, 0.5)).rgb, + dispose() { + removePrePass(); + pass.dispose(); + }, + }; +} diff --git a/packages/shaders/src/components/swirl-gradient/flow.ts b/packages/shaders/src/components/swirl-gradient/flow.ts index 5ead4004..7ef8d1c3 100644 --- a/packages/shaders/src/components/swirl-gradient/flow.ts +++ b/packages/shaders/src/components/swirl-gradient/flow.ts @@ -17,8 +17,10 @@ import { sin, texture, uint, + type uniform, uv, vec2, + vec3, vec4, } from 'three/tsl'; import { HalfFloatType, LinearFilter, type Node } from 'three/webgpu'; @@ -32,18 +34,20 @@ import type { ShaderContextValue } from '../../react/context/shader-context.js'; // The flow repeats every FLOW_PERIOD lattice cells on both axes, so one // period drawn into a texture covers every point a trace can reach. A -// lattice cell is about one eddy, so at the scale slider's top, 8 eddies -// per canvas height, a 16:10 canvas spans about 13 cells and no repeat -// shows. Raising it pushes the repeat further out at the cost of texels. -// A power of two, so dividing a cell index by it stays exact in a float. -const FLOW_PERIOD = 16; - -// Texels per period on each side. 512 over 16 cells gives 32 texels per +// lattice cell is about one eddy, so at the scale slider's top, 4 eddies +// per canvas height, a 16:10 canvas spans about 6.4 cells and no repeat +// shows. Doubling it pushes the repeat out past scale 8, but the flow pass +// draws four times the texels whenever the flow moves: a period of 16 read +// 0.45 ms in the Reactive card's window at 2x, against 0.35 ms for 8. A +// power of two, so dividing a cell index by it stays exact in a float. +export const FLOW_PERIOD = 8; + +// Texels per period on each side. 256 over 8 cells gives 32 texels per // eddy, and 16 per smaller eddy, which the texture's linear filter blends -// into a smooth flow. Fewer texels draw faster: 256 took 0.09 ms off the -// card's 0.36 at 2x, but the filter's straight runs between texels showed, -// and the crisp seams came out faceted instead of curved. -const FLOW_TEXELS = 512; +// into a smooth flow. Half that density drew faster but showed the filter's +// straight runs between texels: crisp seams came out faceted instead of +// curved. +const FLOW_TEXELS = 256; // The smaller eddies run at twice the broad flow's frequency, so each one is // half the size of a broad eddy. 2 divides FLOW_PERIOD, so they repeat with @@ -106,14 +110,20 @@ function cornerArrow( } /** - * A lattice index folded into 0..FLOW_PERIOD - 1, so the arrows, and with - * them the whole flow, repeat every FLOW_PERIOD cells. Written out with - * floor() rather than mod(), because WGSL's float remainder keeps the sign - * of a negative index and GLSL's mod() does not. It also keeps the hash's - * input positive, as stableHash needs. + * A lattice index folded into 0..period - 1, so whatever it hashes repeats + * every `period` cells. Written out with floor() rather than mod(), because + * WGSL's float remainder keeps the sign of a negative index and GLSL's + * mod() does not. It also keeps the hash's input positive, as stableHash + * needs. The period is a whole number, and a power of two keeps the divide + * exact in a float. */ +export function wrapIndex(index: ShaderNodeObject, period: number) { + return index.sub(floor(index.div(period)).mul(period)); +} + +/** A flow lattice index folded into 0..FLOW_PERIOD - 1, so the flow repeats. */ function wrapCell(index: ShaderNodeObject) { - return index.sub(floor(index.div(FLOW_PERIOD)).mul(FLOW_PERIOD)); + return wrapIndex(index, FLOW_PERIOD); } /** @@ -259,6 +269,12 @@ function flowVelocity(point: TSLNode, { seed, smallEddies, phase, slide }: FlowI return vec2(slope.y, slope.x.negate()); } +/** + * FlowInputs as uniforms, whose current values the flow pass can read on + * the CPU to tell whether the flow changed since its last draw. + */ +export type FlowUniforms = { [Input in keyof FlowInputs]: ReturnType> }; + /** Reads the flow's velocity at a point, in lattice cells. */ export type VelocityAt = (point: ShaderNodeObject) => ShaderNodeObject; @@ -297,12 +313,16 @@ export interface FlowPass { * the texture's edge, so the linear filter blends across the period's seam * as smoothly as anywhere else. * + * The pass redraws only on a frame where one of its inputs has changed since + * its last draw. While the flow holds still, other layers can keep the scene + * drawing, as a cursor effect does, and the texture already holds the flow. + * * The caller creates and disposes the pass in one effect, so a Strict Mode * remount builds a fresh one (the Strict Mode gotcha in docs/agents/tsl.md). */ export function createFlowPass( shaderContext: ShaderContextValue, - inputs: FlowInputs, + inputs: FlowUniforms, ): FlowPass | null { const side = FLOW_TEXELS + 1; @@ -334,8 +354,18 @@ export function createFlowPass( // The output stage draws pre-passes ahead of the scene pass in the same // frame, so the trace always reads this frame's flow (the draw-order - // gotcha in docs/agents/tsl.md). - const removePrePass = shaderContext.registerPrePass(pass.render); + // gotcha in docs/agents/tsl.md). The CPU compares each input with the + // value it had at the last draw and skips the draw while all of them + // match. NaN never equals a number, so the first frame always draws. + const sources = [inputs.seed, inputs.smallEddies, inputs.phase, inputs.slide]; + const drawnValues = sources.map(() => Number.NaN); + const removePrePass = shaderContext.registerPrePass(() => { + if (sources.every((source, index) => source.value === drawnValues[index])) return; + sources.forEach((source, index) => { + drawnValues[index] = source.value; + }); + pass.render(); + }); return { // Fold the point into the period, then into the texture: f x FLOW_TEXELS @@ -360,6 +390,9 @@ export function createFlowPass( // The backward trace // --------------------------------------------- +/** Reads linear RGB at one point of a trace, given its offset from the start. */ +export type PathSampler = (offset: ShaderNodeObject) => ShaderNodeObject; + /** The options for one backward trace through the flow. */ export interface TraceFlowOptions { /** @@ -374,20 +407,37 @@ export interface TraceFlowOptions { stepLength: TSLNode; /** Where the trace reads the flow's velocity: the flow pass, or inline. */ velocityAt: VelocityAt; + /** + * What color to read at every point of the path. The trace calls + * this inside its shader function before the loop, so it can pin the + * values that are the same on every step with .toVar() (the first-use + * gotcha in docs/agents/tsl.md), and it returns the reader for one point. + */ + sampleAlongPath: () => PathSampler; + /** + * Combines the final offset and the mean linear RGB after the loop. Runs + * inside the same shader function so both answers share one trace. + */ + finishTrace: ( + offset: ShaderNodeObject, + meanColor: ShaderNodeObject, + ) => ShaderNodeObject; } /** - * Trace a point backward along the flow and return how far it moved, in - * lattice cells. The pixel at `start` shows whatever color sat at - * `start + offset` before the flow carried it here. Each step reads the - * velocity where the trace has reached and steps against it. + * Trace a point backward along the flow. The pixel at `start` shows + * whatever color sat at `start + offset` before the flow carried it here. + * Each step reads the velocity where the trace has reached and steps + * against it, then reads `sampleAlongPath` at the new point. Averaging those + * reads gives every color the pixel's path passed through, the way a + * long-exposure photo of moving liquid streaks it along the current. * * Written with Fn and Loop, so the GPU runs a real loop instead of `steps` * copies of the body. */ export function traceFlow( start: TSLNode, - { steps, stepLength, velocityAt }: TraceFlowOptions, + { steps, stepLength, velocityAt, sampleAlongPath, finishTrace }: TraceFlowOptions, ): ShaderNodeObject { return Fn(() => { // Pin what is the same on every step before the loop. Without .toVar(), @@ -396,17 +446,30 @@ export function traceFlow( // docs/agents/tsl.md). const origin = vec2(start).toVar(); const step = float(stepLength).toVar(); + const sampleAt = sampleAlongPath(); - // The loop's running state: how far the trace has moved from `origin`. - // Starting at 0 means a step length of 0 returns exactly 0, so straight - // bands stay exactly straight. + // The loop's running state: how far the trace has moved from `origin`, + // and the sum of what it read along the way. Starting the offset at 0 + // means a step length of 0 returns exactly 0, so straight bands stay + // exactly straight. The sum starts with the pixel's own point. const offset = vec2(0, 0).toVar(); + // Average colors, not their positions on the ramp. Positions on either + // side of a seam average to its middle stop, even if the path never + // touched that color. Linear RGB mixes the colors the path actually saw. + const sampleSum = vec3(sampleAt(offset)).toVar(); Loop(steps, () => { - // Backward: step against the velocity, toward where the color came from. - offset.subAssign(velocityAt(origin.add(offset)).mul(step)); + // Midpoint integration: predict a half-step backward, then use the + // velocity there for the full step. Following the starting direction + // for a whole step cuts across a curved flow and pushes traces across + // its contours, creating false edges around tight eddies. + const position = origin.add(offset).toVar(); + const midpoint = position.sub(velocityAt(position).mul(step).mul(0.5)).toVar(); + + offset.subAssign(velocityAt(midpoint).mul(step)); + sampleSum.addAssign(sampleAt(offset)); }); - return offset; + return finishTrace(offset, sampleSum.div(steps + 1)); })(); } diff --git a/packages/shaders/src/components/swirl-gradient/paint.ts b/packages/shaders/src/components/swirl-gradient/paint.ts new file mode 100644 index 00000000..087e145f --- /dev/null +++ b/packages/shaders/src/components/swirl-gradient/paint.ts @@ -0,0 +1,217 @@ +// The paint the flow carries: a field of fractal noise that the shader +// (./shader.tsx) adds to each point's place in the bands. Its broad layers +// break the bands into blotches, and its fine layers are what the path +// average draws out into streaks along the current, the way a long exposure +// streaks a detailed surface. The paint pass draws one period of it into a +// texture when the seed or the detail changes, so each trace step reads one +// texel instead of summing the layers. +import type { ShaderNodeObject } from 'three/tsl'; +import { float, floor, Fn, fract, mix, texture, uv, vec2, vec4 } from 'three/tsl'; +import { HalfFloatType, LinearFilter, type Node, RedFormat } from 'three/webgpu'; + +import { createTexturePass, stableHash, stableHashUint, type TSLNode } from '../../engine.js'; +import type { ShaderContextValue } from '../../react/context/shader-context.js'; +import { FLOW_PERIOD, wrapIndex } from './flow.js'; + +// --------------------------------------------- +// Constants +// --------------------------------------------- + +// The paint repeats with the flow, every FLOW_PERIOD lattice cells, so the +// two tile together and no repeat shows below the scale slider's top. +const PAINT_PERIOD = FLOW_PERIOD; + +// The noise layers, broadest first, in waves per lattice cell. Each doubles +// the one before, so the broadest makes blotches about an eddy wide and the +// finest makes detail a sixteenth of that, which the path average draws +// out into streaks. Every frequency times PAINT_PERIOD is a whole number, +// so every layer repeats with the period. +const LAYER_FREQUENCIES = [1, 2, 4, 8, 16]; + +// Texels per period on each side. 1024 over 8 cells gives 128 texels per +// cell, 8 per wave of the finest layer, which the linear filter blends +// smoothly. The texture holds one half float per texel, 2 MB, and draws +// only when the seed or the detail changes. +const PAINT_TEXELS = 1024; + +// The inline fallback sums only the broadest layers, because every pixel +// pays for them at every step. +const INLINE_LAYERS = 2; + +// --------------------------------------------- +// Value noise +// --------------------------------------------- + +/** + * Smooth value noise at `point`, -1..1, repeating every `period` cells. Each + * lattice corner gets a random height from stableHash, and the point blends + * the four corners around it with the quintic fade, so the surface is + * smooth across cell edges. Cheaper than gradient noise, and fine here, + * where nothing needs its slope. + */ +function valueNoise( + point: ShaderNodeObject, + seedWord: ShaderNodeObject, + period: number, +) { + const cell = floor(point); + const local = fract(point); + + // The quintic fade 6t^5 - 15t^4 + 10t^3, as in flow.ts. + const fade = local + .mul(local) + .mul(local) + .mul(local.mul(local.mul(6).sub(15)).add(10)); + + // One random height per corner, from nested row-then-column hashes as in + // flow.ts, mapped from 0..1 to -1..1. + const lowerRow = stableHashUint(wrapIndex(cell.y, period).toUint().add(seedWord)); + const upperRow = stableHashUint(wrapIndex(cell.y.add(1), period).toUint().add(seedWord)); + const leftColumn = wrapIndex(cell.x, period).toUint(); + const rightColumn = wrapIndex(cell.x.add(1), period).toUint(); + const heightAt = (column: ShaderNodeObject, rowWord: ShaderNodeObject) => + stableHash(column.add(rowWord)).mul(2).sub(1); + + const lower = mix(heightAt(leftColumn, lowerRow), heightAt(rightColumn, lowerRow), fade.x); + const upper = mix(heightAt(leftColumn, upperRow), heightAt(rightColumn, upperRow), fade.x); + + return mix(lower, upper, fade.y); +} + +/** What shapes the paint. */ +export interface PaintInputs { + /** A whole number 0 or above that picks the paint's random layout. */ + seed: TSLNode; + /** + * How loudly the finer layers speak, 0..1: each layer's weight is this + * times the one before. 0 leaves only the broad blotches; 1 gives every + * layer the same weight. + */ + detail: TSLNode; +} + +/** + * The paint at `point`, summed from the first `layerCount` layers and + * divided by the total weight, so it stays roughly -1..1 at any detail. + */ +function paintNoise(point: TSLNode, { seed, detail }: PaintInputs, layerCount: number) { + // A hash stream of its own, so the paint doesn't line up with the flow, + // which hashes the seed directly. + const seedWord = stableHashUint(stableHashUint(float(seed)).add(1)); + let total = float(0); + let totalWeight = float(0); + let weight = float(1); + + LAYER_FREQUENCIES.slice(0, layerCount).forEach((frequency, layer) => { + // Each layer gets its own stream, seedWord + layer, so the layers + // don't echo each other. + const layerNoise = valueNoise( + vec2(point).mul(frequency), + seedWord.add(layer), + PAINT_PERIOD * frequency, + ); + + total = total.add(layerNoise.mul(weight)); + totalWeight = totalWeight.add(weight); + weight = weight.mul(detail); + }); + + return total.div(totalWeight); +} + +// --------------------------------------------- +// The paint pass +// --------------------------------------------- + +/** Reads the paint at a point in lattice cells, -1..1. */ +export type PaintAt = (point: ShaderNodeObject) => ShaderNodeObject; + +/** The paint pass's handle: how to read the paint, and how to release it. */ +export interface PaintPass { + paintAt: PaintAt; + dispose: () => void; +} + +/** + * Draws one period of the paint into a one-channel texture, so a trace step + * reads one texel instead of summing five layers. Laid out like the flow + * pass in flow.ts: PAINT_TEXELS + 1 texels a side, the last row and column + * repeating the first, so the linear filter blends across the period's seam + * as smoothly as anywhere else. The paint holds still while the flow moves, + * so the pass draws on the first frame and again only when the seed or the + * detail changes. Where the renderer can't draw half floats, every read + * sums the broadest layers inline instead. + * + * The caller creates and disposes the pass in one effect, so a Strict Mode + * remount builds a fresh one (the Strict Mode gotcha in docs/agents/tsl.md). + */ +export function createPaintPass( + shaderContext: ShaderContextValue, + inputs: PaintInputs & { + seed: { value: number }; + detail: { value: number }; + }, +): PaintPass { + const side = PAINT_TEXELS + 1; + + // One texel's value: the paint at the lattice point under it, worked out + // from uv() as the flow pass does. + const paintNode = Fn(() => { + const point = uv() + .mul(side) + .sub(0.5) + .mul(PAINT_PERIOD / PAINT_TEXELS); + + return vec4(paintNoise(point, inputs, LAYER_FREQUENCIES.length), 0, 0, 1); + })(); + + // A half float keeps the paint's fine steps, which an 8-bit texel would + // round into visible terraces once the path average smooths them. One + // channel stores a quarter of the bytes an RGBA texel would. + const pass = createTexturePass(shaderContext.renderer.three, paintNode, { + width: side, + height: side, + type: HalfFloatType, + filter: LinearFilter, + format: RedFormat, + }); + const paintTexture = pass.texture; + + if (paintTexture === null) { + return { + paintAt: (point) => paintNoise(point, inputs, INLINE_LAYERS), + dispose: () => { + // Nothing was allocated. + }, + }; + } + + // A pre-pass draws before the scene pass in the same frame (the + // draw-order gotcha in docs/agents/tsl.md). It compares the seed and the + // detail with their values at the last draw and skips the draw while both + // match. NaN never equals a number, so the first frame always draws. + let drawnSeed = Number.NaN; + let drawnDetail = Number.NaN; + const removePrePass = shaderContext.registerPrePass(() => { + if (inputs.seed.value === drawnSeed && inputs.detail.value === drawnDetail) return; + drawnSeed = inputs.seed.value; + drawnDetail = inputs.detail.value; + pass.render(); + }); + + return { + // Fold the point into the period, then into the texture, as the flow + // pass's velocityAt does, with the coordinate passed when the node is + // built (the texture-matrix gotcha in docs/agents/tsl.md). + paintAt: (point) => { + const periodFraction = fract(point.mul(1 / PAINT_PERIOD)); + const coordinate = periodFraction.mul(PAINT_TEXELS).add(0.5).div(side); + + return texture(paintTexture, coordinate).r; + }, + dispose() { + removePrePass(); + pass.dispose(); + }, + }; +} diff --git a/packages/shaders/src/components/swirl-gradient/shader.tsx b/packages/shaders/src/components/swirl-gradient/shader.tsx index 3e2a29cd..afff25f8 100644 --- a/packages/shaders/src/components/swirl-gradient/shader.tsx +++ b/packages/shaders/src/components/swirl-gradient/shader.tsx @@ -1,17 +1,32 @@ 'use client'; // SwirlGradient's GPU half. The pixel's journey: place the pixel in the -// flow, trace it backward along the flow (./flow.ts) to where its color -// started, then read LinearGradient's repeating bands at that starting -// point. Every pixel reads the bands from somewhere upstream, so the -// straight bands come out stretched and folded, like paint swirled on -// water. The wrapper (./swirl-gradient.tsx) supplies the props. +// flow, trace it backward along the flow (./flow.ts) while reading the +// bands and the paint (./paint.ts) at every point it passes, then color it +// by averaging their linear RGB colors (./bands.ts). Averaging along the path +// streaks each color along the current, the way moving liquid looks, +// instead of folding sharp copies of the bands, and the paint's fine +// detail is what the streaks are drawn from. The wrapper +// (./swirl-gradient.tsx) supplies the props. import { useEffect, useMemo } from 'react'; -import { cos, fract, max, mix, sin, smoothstep, uniform, uv, vec2 } from 'three/tsl'; -import { Mesh, MeshBasicNodeMaterial, PlaneGeometry } from 'three/webgpu'; - -import { colorRamp, type ColorSpace, type HueInterpolation } from '../../engine.js'; +import { + cos, + fract, + fwidth, + max, + mix, + type ShaderNodeObject, + sin, + smoothstep, + uniform, + uv, + vec2, + vec3, +} from 'three/tsl'; +import { Mesh, MeshBasicNodeMaterial, type Node, PlaneGeometry } from 'three/webgpu'; + +import type { ColorSpace, HueInterpolation } from '../../engine.js'; import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; import { useAnimatableSpeed } from '../../react/hooks/use-animatable-speed/use-animatable-speed.js'; import { useAnimatableUniform } from '../../react/hooks/use-animatable-uniform/use-animatable-uniform.js'; @@ -19,33 +34,67 @@ import { useAspectUniform } from '../../react/hooks/use-aspect-uniform/use-aspec import { useShaderContext } from '../../react/hooks/use-shader-context/use-shader-context.js'; import { useStaticSceneHint } from '../../react/hooks/use-static-hint/use-static-hint.js'; import { type ColorStop, colorStopsKey, toColorRampStops } from '../shared/color.js'; -import { createFlowPass, inlineVelocity, traceFlow } from './flow.js'; +import { type BandPalette, createAveragePass, createRampPass, smoothSeams } from './bands.js'; +import { createFlowPass, inlineVelocity, type PathSampler, traceFlow } from './flow.js'; +import { createPaintPass } from './paint.js'; // --------------------------------------------- -// Flow constants (provisional until the defaults gate) +// Feel constants (provisional until the defaults gate) // --------------------------------------------- -// How many steps each pixel's trace takes. More steps follow tight eddies -// more faithfully, and each one costs a texture read per pixel. Too few -// and a step overshoots the curve it should follow, so neighboring pixels -// land in unrelated places and the threads tear. -const STEP_COUNT = 24; +// Samples along each pixel's trace. Each step reads the flow twice for +// midpoint integration, then the paint and cached palette. To compare +// sampling quality at the same reach, increase this count and reduce +// STEP_LENGTH by the same factor. Increasing the count alone traces farther. +const STEP_COUNT = 12; // How far one step travels at swirl 1 where the flow runs at unit speed, in -// lattice cells (about one eddy each). STEP_COUNT x STEP_LENGTH is the whole trace's reach at swirl -// 1. Longer steps reach further for the same cost, until they start to tear. -const STEP_LENGTH = 0.05; - -// The smaller eddies' strength, 0..1. 0 leaves the broad flow alone, with -// smooth, wide folds. Raising it curls finer swirls into the folds; at 0.5 -// they swirl as hard as the broad eddies. -const SMALL_EDDIES = 0.35; +// lattice cells (about one eddy each). STEP_COUNT x STEP_LENGTH is the +// nominal trace time at swirl 1. At 0.1, neighboring samples were far +// enough apart to draw separate paint contours around tight curls. 0.025 +// keeps the default trace shorter and its samples close enough to blend. +// Large swirl or step-length overrides can still expose separate samples. +const STEP_LENGTH = 0.025; + +// The smaller eddies' strength, 0..1. 0 leaves the broad currents alone. +// Raising it ripples finer swirls into them; at 0.5 they swirl as hard as +// the broad eddies. +const SMALL_EDDIES = 0.45; // How far the flow slides per unit of phase, in lattice cells, on top of // the eddies morphing in place. 0 keeps the eddies where they are. -const SLIDE = 0; +const SLIDE = 1; + +// Where thin streaks start fading to the bands' average color: the share of +// one whole pass of the stops a single pixel spans. The fade is complete at +// 1, where a pixel spans every stop and its true color is the average. +// Lower starts the fade sooner, which calms moving streaks at the cost of +// fine detail; higher keeps detail longer, and with it more shimmer. +const FADE_START = 0.25; + +// How much of each pixel's color comes from the average along its path, +// 0..1. 0 reads the bands once, where the trace ends, which folds sharp +// copies of them. 1 averages every point the trace passed, which streaks +// the colors along the current. +const SMEAR = 1; + +// How a pass of the stops meets the next. 0 snaps back to the first stop, +// as LinearGradient does, leaving a seam wherever the first and last stops +// differ. 1 runs every other pass backward, so each pass ends on the color +// the next one starts with and no seam forms. +const MIRROR = 1; + +// How far the paint shifts each point's place in the bands, in passes of +// the stops. The paint runs -1..1, so at 1 it can move a point a whole pass +// either way, which breaks the bands into blotches. 0 leaves plain bands. +const PAINT = 1; + +// How loudly the paint's finer layers speak, 0..1, each layer weighted this +// much times the one before. Low leaves soft blotches; high adds the fine +// detail the path average streaks along the current. +const PAINT_DETAIL = 0.6; /** - * TEMPORARY (build-phase tuning only): dev overrides for the flow's feel + * TEMPORARY (build-phase tuning only): dev overrides for the feel * constants. Stripped at the defaults gate. */ export interface SwirlGradientTuning { @@ -63,6 +112,39 @@ export interface SwirlGradientTuning { * the eddies morphing in place. */ slide?: number; + /** + * The share of one pass of the stops a pixel spans when streaks start + * fading to the average color, 0..1. + */ + fadeStart?: number; + /** + * How much of each pixel's color comes from the average along its path, + * from 0 for the trace's end alone to 1. + */ + smear?: number; + /** 0 snaps each pass back to the first stop; 1 mirrors every other pass. */ + mirror?: number; + /** How far the paint shifts each point along the bands, in passes. */ + paint?: number; + /** How loudly the paint's finer layers speak, 0..1. */ + paintDetail?: number; +} + +// The tuning rig's knobs, each falling back to its feel constant. ?? per +// knob, rather than spreading the overrides over a defaults object, so a +// knob passed as undefined still gets its constant. +function resolveTuning(tuning: SwirlGradientTuning = {}): Required { + return { + steps: tuning.steps ?? STEP_COUNT, + stepLength: tuning.stepLength ?? STEP_LENGTH, + smallEddies: tuning.smallEddies ?? SMALL_EDDIES, + slide: tuning.slide ?? SLIDE, + fadeStart: tuning.fadeStart ?? FADE_START, + smear: tuning.smear ?? SMEAR, + mirror: tuning.mirror ?? MIRROR, + paint: tuning.paint ?? PAINT, + paintDetail: tuning.paintDetail ?? PAINT_DETAIL, + }; } export interface SwirlGradientShaderProps { @@ -84,6 +166,12 @@ export interface SwirlGradientShaderProps { * pass. Accepts a static value or an animation signal. */ repeat: AnimatableProp; + /** + * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases + * each stop into the next across the whole space between them. Seams stay + * crisp at any softness. Accepts a static value or an animation signal. + */ + softness: AnimatableProp; /** * How far the flow carries the colors. 0 leaves the bands straight; higher * values stretch and fold them further. Accepts a static value or an @@ -118,6 +206,7 @@ export function SwirlGradientShader({ stops, angle, repeat, + softness, swirl, scale, speed, @@ -147,6 +236,7 @@ export function SwirlGradientShader({ // an animation signal. const angleUniform = useAnimatableUniform(angle); const repeatUniform = useAnimatableUniform(repeat); + const softnessUniform = useAnimatableUniform(softness); const swirlUniform = useAnimatableUniform(swirl); const scaleUniform = useAnimatableUniform(scale); @@ -169,31 +259,19 @@ export function SwirlGradientShader({ // --------------------------------------------- // Tuning (dev), stripped at the defaults gate // --------------------------------------------- - // The step length and the smaller eddies ride uniforms, so their sliders - // glide without a rebuild. The step count is the loop's bound, compiled - // into the shader, so it joins the build effect's deps instead. - const stepCount = tuning?.steps ?? STEP_COUNT; - const stepLength = tuning?.stepLength ?? STEP_LENGTH; - const smallEddies = tuning?.smallEddies ?? SMALL_EDDIES; - const slide = tuning?.slide ?? SLIDE; - const stepLengthUniform = useMemo(() => uniform(STEP_LENGTH), []); - const smallEddiesUniform = useMemo(() => uniform(SMALL_EDDIES), []); - const slideUniform = useMemo(() => uniform(SLIDE), []); - - useEffect(() => { - stepLengthUniform.value = stepLength; - smallEddiesUniform.value = smallEddies; - slideUniform.value = slide; - shaderContext?.scheduler.requestRender(); - }, [ - shaderContext, - stepLengthUniform, - smallEddiesUniform, - slideUniform, - stepLength, - smallEddies, - slide, - ]); + // Each knob rides a uniform, like the props above, so its slider glides + // without a rebuild. The step count is the loop's bound, compiled into the + // shader, so it joins the build effect's deps instead. + const knobs = resolveTuning(tuning); + const stepCount = knobs.steps; + const stepLengthUniform = useAnimatableUniform(knobs.stepLength); + const smallEddiesUniform = useAnimatableUniform(knobs.smallEddies); + const slideUniform = useAnimatableUniform(knobs.slide); + const fadeStartUniform = useAnimatableUniform(knobs.fadeStart); + const smearUniform = useAnimatableUniform(knobs.smear); + const mirrorUniform = useAnimatableUniform(knobs.mirror); + const paintUniform = useAnimatableUniform(knobs.paint); + const paintDetailUniform = useAnimatableUniform(knobs.paintDetail); // Content fingerprint of the stops array (colors + positions). The build // effect keys on this string, so a re-render that passes a new array with @@ -222,13 +300,10 @@ export function SwirlGradientShader({ const centered = uv().sub(vec2(0.5, 0.5)); const flowPoint = vec2(centered.x.mul(aspectNode), centered.y).mul(scaleUniform); - // --------------------------------------------- - // Trace it back to where its color started - // --------------------------------------------- // The flow pass draws the flow's velocity into a texture before each - // frame, so a step costs one texture read. Where the renderer can't - // draw half floats, the trace works the velocity out from the noise - // at every step instead, which looks the same and costs far more. + // frame, so a read costs one texel. Where the renderer can't draw half + // floats, each read works the velocity out from the noise instead, + // which looks the same and costs far more. const flowInputs = { seed: seedUniform, smallEddies: smallEddiesUniform, @@ -236,53 +311,140 @@ export function SwirlGradientShader({ slide: slideUniform, }; const flowPass = createFlowPass(shaderContext, flowInputs); + const velocityAt = flowPass?.velocityAt ?? inlineVelocity(flowInputs); - // swirl scales every step, so it sets how far the trace reaches: at 0 - // the trace stands still and the bands stay exactly straight. - const flowOffset = traceFlow(flowPoint, { - steps: stepCount, - stepLength: swirlUniform.mul(stepLengthUniform), - velocityAt: flowPass?.velocityAt ?? inlineVelocity(flowInputs), + // The paint pass draws the paint into a texture on the first frame and + // again only when the seed or its detail changes (./paint.ts). + const paintPass = createPaintPass(shaderContext, { + seed: seedUniform, + detail: paintDetailUniform, }); - // The offset comes back in lattice cells. Undo the placement's - // stretches, in reverse, to turn it into uv: divide by scale, then x + // --------------------------------------------- + // Find the pixel's place in the bands + // --------------------------------------------- + // LinearGradient's projection at its default center: the angle becomes + // a unit direction, and the pixel's distance along it from the canvas + // center, plus 0.5, is its place on the ramp. At angle 0 that is plain + // u: 0 at the left edge, 1 at the right. + const angleRadians = angleUniform.mul(Math.PI / 180); + const direction = vec2(cos(angleRadians), sin(angleRadians)); + const pixelCoord = uv().sub(vec2(0.5, 0.5)).dot(direction).add(0.5); + + // The projection is a straight line, so a point some lattice cells + // away from the pixel sits that offset, dotted with coordPerCell, + // further along the ramp. coordPerCell undoes the placement's + // stretches in reverse to turn cells into uv: divide by scale, then x // by the aspect. The max() keeps a scale of 0 from dividing by zero. const safeScale = max(scaleUniform, 0.001); - const uvOffset = vec2(flowOffset.x.div(aspectNode), flowOffset.y).div(safeScale); - const sourceUv = uv().add(uvOffset); + const coordPerCell = vec2(direction.x.div(aspectNode), direction.y).div(safeScale); + + // A coordinate's place on the ramp, 0..1. Times repeat, it counts + // passes of the stops. fract() keeps the fractional part, a sawtooth + // that snaps back to the first stop each pass. The mirrored form is a + // triangle instead: fract(passes / 2) climbs 0..1 over two passes, x 2 + // - 1 makes that -1..1, and 1 - abs() folds it into 0 -> 1 -> 0, so + // every other pass runs backward. LinearGradient's repeat gate keeps a + // single pass, at repeat <= 1, as the plain coordinate. + const repeatGate = smoothstep(1, 1.01, repeatUniform); + const bandPosition = (coordinate: ShaderNodeObject) => { + const passes = coordinate.mul(repeatUniform); + const sawtooth = fract(passes); + const mirrored = fract(passes.mul(0.5)).mul(2).sub(1).abs().oneMinus(); + + return mix(coordinate, mix(sawtooth, mirrored, mirrorUniform), repeatGate); + }; + + // A point's place in the bands, before the sawtooth or triangle: the + // band coordinate there, shifted by the paint there. The paint runs + // -1..1, so `paint` is how many passes of the stops it can shift a + // point either way. + const paintedCoord = (bandCoord: ShaderNodeObject, point: ShaderNodeObject) => + bandCoord.add(paintPass.paintAt(point).mul(paintUniform)); // --------------------------------------------- - // Read the bands where the color started + // Color each paint sample before mixing it // --------------------------------------------- - // From here on this is LinearGradient's math at its default center and - // its own speed at 0 (here speed moves the flow, not the bands), read - // at sourceUv instead of uv, so at swirl 0 the two draw the same image. The angle becomes a unit direction, and the - // pixel's distance along it, plus 0.5, is its place on the ramp. At - // angle 0 that is plain u: 0 at the left edge, 1 at the right. - const angleRadians = angleUniform.mul(Math.PI / 180); - const direction = vec2(cos(angleRadians), sin(angleRadians)); - const gradientCoord = sourceUv.sub(vec2(0.5, 0.5)).dot(direction).add(0.5); + const palette: BandPalette = { + stops: toColorRampStops(stops), + colorSpace, + hueInterpolation, + }; + const seamColors = { + first: palette.stops[0]?.color ?? vec3(0, 0, 0), + last: palette.stops[palette.stops.length - 1]?.color ?? vec3(0, 0, 0), + }; + const averagePass = createAveragePass(shaderContext, palette, softnessUniform); + const rampPass = createRampPass(shaderContext, palette); + + // A ramp coordinate is a position, not a color. Mapping the average + // position through a nonlinear ramp invents a middle color instead + // of mixing the colors the trace passed. Convert every sample to + // linear RGB first, then let traceFlow average those colors. + const colorAt = ( + coordinate: ShaderNodeObject, + averageColor: ShaderNodeObject, + ) => { + const position = bandPosition(coordinate); + + // fwidth measures the change across neighboring pixels. Measure + // the unfolded coordinate at each sample, before fract introduces + // a seam. Opposite slopes can cancel if averaged before this step, + // hiding thin bands that still need smoothing. + const footprint = fwidth(coordinate).mul(max(repeatUniform, 1)); + const edgeColor = smoothSeams( + rampPass.colorAt(position, softnessUniform, footprint), + position, + footprint, + seamColors, + repeatGate.mul(mirrorUniform.oneMinus()), + ); + const threadFade = smoothstep(fadeStartUniform, 1, footprint); + + return mix(edgeColor, averageColor, threadFade); + }; - // The repeating bands: multiplying by repeat fits that many passes of - // the ramp into one, and fract() keeps the fractional part, so the - // coordinate saws 0 -> 1 over and over. The mix is LinearGradient's - // repeat gate: at repeat <= 1 the smoothstep is exactly 0 and the - // single pass comes through untouched. - const tiled = fract(gradientCoord.mul(repeatUniform)); - const rampCoord = mix(gradientCoord, tiled, smoothstep(1, 1.01, repeatUniform)); + // --------------------------------------------- + // Trace it back, mixing the paint along the way + // --------------------------------------------- + // Pin the placement before the loop so each step only recomputes + // the part that depends on its offset. Each sample reads the paint, + // maps it through the palette, and smooths bands narrower than a pixel. + const sampleBandsAlongPath = (): PathSampler => { + const startPoint = flowPoint.toVar(); + const startCoord = pixelCoord.toVar(); + const perCell = coordPerCell.toVar(); + // This one-texel average is identical at every step. Read it once. + const averageColor = averagePass.color.toVar(); + + return (offset) => + colorAt( + paintedCoord(startCoord.add(offset.dot(perCell)), startPoint.add(offset)), + averageColor, + ); + }; + const liquidColor = traceFlow(flowPoint, { + steps: stepCount, + stepLength: swirlUniform.mul(stepLengthUniform), + velocityAt, + sampleAlongPath: sampleBandsAlongPath, + finishTrace: (offset, meanColor) => { + const endCoord = paintedCoord( + pixelCoord.add(offset.dot(coordPerCell)), + flowPoint.add(offset), + ); + + // Smear 0 shows the final point. Smear 1 mixes every sampled + // color in linear light. A zero-length trace samples one point + // throughout, so both ends of the dial give the same color. + return mix(colorAt(endCoord, averagePass.color), meanColor, smearUniform); + }, + }); // An unlit material whose per-pixel color comes from colorNode. - // colorRamp maps the 0..1 coordinate to a color, blending between - // stops in the chosen color space. const material = new MeshBasicNodeMaterial(); - material.colorNode = colorRamp( - rampCoord, - toColorRampStops(stops), - colorSpace, - hueInterpolation, - ); + material.colorNode = liquidColor; // A 2x2 plane exactly fills ShaderScene's camera view (-1..1 on both // axes), so the bands cover the whole canvas. @@ -297,6 +459,9 @@ export function SwirlGradientShader({ return () => { shaderContext.scene.remove(mesh); flowPass?.dispose(); + paintPass.dispose(); + averagePass.dispose(); + rampPass.dispose(); try { material.dispose(); } catch { @@ -317,6 +482,7 @@ export function SwirlGradientShader({ shaderContext, angleUniform, repeatUniform, + softnessUniform, swirlUniform, scaleUniform, aspectNode, @@ -325,6 +491,11 @@ export function SwirlGradientShader({ stepLengthUniform, smallEddiesUniform, slideUniform, + fadeStartUniform, + smearUniform, + mirrorUniform, + paintUniform, + paintDetailUniform, stepCount, stopsKey, colorSpace, diff --git a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx index 1ca4ac5f..c5616394 100644 --- a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx +++ b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx @@ -29,23 +29,30 @@ export interface SwirlGradientProps { * in the same direction and snaps back to the first, so unless the first * and last stop match there is a crisp seam at every band boundary, which * the flow draws out into threads. Values at or below 1 render as a single - * pass. Defaults to 3. Accepts a static value or an animation signal. + * pass. Defaults to 2. Accepts a static value or an animation signal. */ repeat?: AnimatableProp; + /** + * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases + * each stop into the next across the whole space between them. Seams stay + * crisp at any softness. Defaults to 1. Accepts a static value or an + * animation signal. + */ + softness?: AnimatableProp; /** * How far the flow carries the colors. 0 leaves the bands straight; higher - * values stretch and fold them further. Defaults to 1. Accepts a static + * values stretch and fold them further. Defaults to 0.9. Accepts a static * value or an animation signal. */ swirl?: AnimatableProp; /** - * Roughly how many eddies span the canvas's height. Defaults to 2. Accepts + * Roughly how many eddies span the canvas's height. Defaults to 1.5. Accepts * a static value or an animation signal. */ scale?: AnimatableProp; /** * How fast the flow drifts: its eddies form, merge, and dissolve, and the - * bands fold along with them. 0 holds the flow still. Defaults to 0.25. + * bands fold along with them. 0 holds the flow still. Defaults to 0.15. * Accepts a static value or an animation signal. */ speed?: AnimatableProp; @@ -81,10 +88,11 @@ const DEFAULT_STOPS: ColorStop[] = [ export function SwirlGradient({ stops = DEFAULT_STOPS, angle = 0, - repeat = 3, - swirl = 1, - scale = 2, - speed = 0.25, + repeat = 2, + softness = 1, + swirl = 0.9, + scale = 1.5, + speed = 0.15, seed = 0, colorSpace = 'oklab', hueInterpolation = 'shorter', @@ -98,6 +106,7 @@ export function SwirlGradient({ repeat={repeat} scale={scale} seed={seed} + softness={softness} speed={speed} stops={stops} swirl={swirl} From 42701f6671911a934852b810705be6d83d67fb47 Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Sun, 11 Oct 2026 20:59:24 -0400 Subject: [PATCH 5/6] feat(shaders): rename SwirlGradient to LiquidGradient and bake its defaults The defaults gate of SHA-223. The look is a liquid gradient now, so the component, slug, and benchmark route take that name. The tuning rig is gone. Mirrored band ends and the full path average are fixed, and each feel constant lives in the module that uses it. Each trace takes 8 steps of one flow read at the reach of the author's 12 midpoint steps. That looked the same and brought the Reactive card's window at 2x from 0.57-0.63 ms to 0.34-0.38 ms, under its 0.4 ms budget. The paint fades in as swirl rises to 0.2, so swirl={0} draws straight bands. Adds the catalog copy, the poster and thumbnail, and the visual spec with its baselines. The benchmark keeps a LinearGradient baseline that shows when another tab is sharing the GPU. --- .../docs-tests/visual/liquid-gradient.spec.ts | 8 + ...iquid-gradient-default-chromium-darwin.png | Bin 0 -> 162969 bytes ...liquid-gradient-default-chromium-linux.png | Bin 0 -> 162968 bytes apps/docs/public/posters/liquid-gradient.jpg | Bin 0 -> 70001 bytes .../public/posters/liquid-gradient.thumb.webp | Bin 0 -> 1250 bytes .../docs/src/app/components/demo-registry.tsx | 14 +- .../demo.tsx | 38 +- .../params.ts | 29 +- .../scene.tsx | 7 +- .../benchmark-scene.tsx | 83 +++ .../page.dev.tsx | 2 +- .../benchmark-scene.tsx | 60 --- apps/docs/src/content/components.ts | 10 +- packages/shaders/src/components/index.ts | 6 +- .../bands.ts | 79 +-- .../flow.ts | 113 ++-- .../liquid-gradient/liquid-gradient.tsx | 109 ++++ .../paint.ts | 61 +-- .../src/components/liquid-gradient/shader.tsx | 403 ++++++++++++++ .../src/components/swirl-gradient/shader.tsx | 507 ------------------ .../swirl-gradient/swirl-gradient.tsx | 116 ---- scripts/build-posters.sh | 1 + 22 files changed, 741 insertions(+), 905 deletions(-) create mode 100644 apps/docs-tests/visual/liquid-gradient.spec.ts create mode 100644 apps/docs-tests/visual/liquid-gradient.spec.ts-snapshots/liquid-gradient-default-chromium-darwin.png create mode 100644 apps/docs-tests/visual/liquid-gradient.spec.ts-snapshots/liquid-gradient-default-chromium-linux.png create mode 100644 apps/docs/public/posters/liquid-gradient.jpg create mode 100644 apps/docs/public/posters/liquid-gradient.thumb.webp rename apps/docs/src/app/components/{swirl-gradient => liquid-gradient}/demo.tsx (60%) rename apps/docs/src/app/components/{swirl-gradient => liquid-gradient}/params.ts (58%) rename apps/docs/src/app/components/{swirl-gradient => liquid-gradient}/scene.tsx (79%) create mode 100644 apps/docs/src/app/dev/liquid-gradient-benchmark/benchmark-scene.tsx rename apps/docs/src/app/dev/{swirl-gradient-benchmark => liquid-gradient-benchmark}/page.dev.tsx (85%) delete mode 100644 apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx rename packages/shaders/src/components/{swirl-gradient => liquid-gradient}/bands.ts (79%) rename packages/shaders/src/components/{swirl-gradient => liquid-gradient}/flow.ts (81%) create mode 100644 packages/shaders/src/components/liquid-gradient/liquid-gradient.tsx rename packages/shaders/src/components/{swirl-gradient => liquid-gradient}/paint.ts (82%) create mode 100644 packages/shaders/src/components/liquid-gradient/shader.tsx delete mode 100644 packages/shaders/src/components/swirl-gradient/shader.tsx delete mode 100644 packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx diff --git a/apps/docs-tests/visual/liquid-gradient.spec.ts b/apps/docs-tests/visual/liquid-gradient.spec.ts new file mode 100644 index 00000000..359ae0b5 --- /dev/null +++ b/apps/docs-tests/visual/liquid-gradient.spec.ts @@ -0,0 +1,8 @@ +import { expect, test } from './fixtures'; +import { waitForShader } from './helpers'; + +test('LiquidGradient — default story', async ({ page }) => { + await page.goto('/components/liquid-gradient?visualTest=1'); + await waitForShader(page); + await expect(page.locator('canvas').first()).toHaveScreenshot('liquid-gradient-default.png'); +}); diff --git a/apps/docs-tests/visual/liquid-gradient.spec.ts-snapshots/liquid-gradient-default-chromium-darwin.png b/apps/docs-tests/visual/liquid-gradient.spec.ts-snapshots/liquid-gradient-default-chromium-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..34793ccd846d5868456afcf1e01fde27b974f8a6 GIT binary patch literal 162969 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

0)$F<_BN5EgtZua<2a)ktOCGuDU>lF== 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�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 Ot<=&4!T10DxBm~_>hDMZ literal 0 HcmV?d00001 diff --git a/apps/docs/public/posters/liquid-gradient.thumb.webp b/apps/docs/public/posters/liquid-gradient.thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..2f9e27c632879d486b421b9798066e6da5f7cb1d GIT binary patch literal 1250 zcmV<81ReWQNk&H61ONb6MM6+kP&gpY1ONa~Dgd1UDtrKZ06u9fk42;+p&5GioInPI zrnL19s^mgH3(i*P-L5`S5lL>M6_|2MOUUg4PjVCX0P)tX%8)=};1-9^&cPY#ZXFI({DF+$^*c&7hy^2c%k6QckV$-29KmaaJS$^!*%b$0h0i@WLz4u|&->Z%O zcm(Y8D%;P$7uyWeaCZR7Z@@mQrbq#O0P;X*j|Swml>{M{m<)b3|Zx>2#iZh9nzB8 z27W>^{&-j?5kLU`^#k(BG>`vLE8pd8|A@2XN8mlvuDSzq{E&e?Ee&JEWPvbb z5}l2NAPBRGlcxh#@hqr=xkGMfYHZ4cV*rmWJigiki`n|cRhGudr5@KB zKUq!nI!GSmIWln<05!@t^l_P6%u9bO?*NNHHqTUDQv!6c+p)u0b1lH>A;cG-B4cun zyY9|h6`4I`sc#ZNb?roXT_k-zvm~O(J_vE_fx3Td>K8R0#yq%Z90)C848ADFQE&^l z5Om-F%v5+9->6ihvLUmX;@t)o&?>m_aJ=Yslnvu3JK`o1Dwai)7ELIklyG?otA4+H zfo#o&L`lM-5vh(jNwy!^MT5PY!y4t@g&-K}vGz@arNHhiOWQcSH*bEbRr>w1qs8q% ztBGJ59gZ^-85+*vh$OUxXE=QyPADI5+_1q8#uo#8oCix+8Fws9I?NhW@KhQ5j&>rw z+q_@PW@{1*;UKGzc3WzDsap3{5(Q=0E_k`r4G|Or(U7Q4n5q5(ElCtm(E9pnU)SGqBG5>{4(UYtQo*ObUy69cc>w^+Ti1Lr(U=b$Cwjyqo%aV(T4 z&Y~7S$^NMhla5K8BEVcA@MmJIA+nu(&OHnrD(h(4uA)fuK+!3NLq0b}RMRN}4A$#S zQ|~^;jWONr!m8GbOd1VSvcd+YEl#dz_1%e^PY)!*t=mLe|AYyoeg%*g4KgMqi~}O$ zz_hwpmU@f8&rFs}lvIeW!Z~nz*mt3=7qyIW_dB#jWmxtEM} MB?byTV29uU0LB(d2><{9 literal 0 HcmV?d00001 diff --git a/apps/docs/src/app/components/demo-registry.tsx b/apps/docs/src/app/components/demo-registry.tsx index d4218e41..f049342a 100644 --- a/apps/docs/src/app/components/demo-registry.tsx +++ b/apps/docs/src/app/components/demo-registry.tsx @@ -21,11 +21,11 @@ import { GodRaysIsland } from './god-rays/demo'; import { GrainIsland } from './grain/demo'; import { LedWallIsland } from './led-wall/demo'; import { LinearGradientIsland } from './linear-gradient/demo'; +import { LiquidGradientIsland } from './liquid-gradient/demo'; import { MeshGradientIsland } from './mesh-gradient/demo'; import { RadialGradientIsland } from './radial-gradient/demo'; import { RadialWipeIsland } from './radial-wipe/demo'; import { SimplexNoiseIsland } from './simplex-noise/demo'; -import { SwirlGradientIsland } from './swirl-gradient/demo'; import { VignetteIsland } from './vignette/demo'; import { VoronoiIsland } from './voronoi/demo'; import { WaveLinesIsland } from './wave-lines/demo'; @@ -249,6 +249,12 @@ export const COMPONENT_PAGES: Record = { Island: LinearGradientIsland, usageSnippet: ` +`, + }, + 'liquid-gradient': { + Island: LiquidGradientIsland, + usageSnippet: ` + `, }, 'mesh-gradient': { @@ -283,12 +289,6 @@ export const COMPONENT_PAGES: Record = { Island: SimplexNoiseIsland, usageSnippet: ` -`, - }, - 'swirl-gradient': { - Island: SwirlGradientIsland, - usageSnippet: ` - `, }, vignette: { diff --git a/apps/docs/src/app/components/swirl-gradient/demo.tsx b/apps/docs/src/app/components/liquid-gradient/demo.tsx similarity index 60% rename from apps/docs/src/app/components/swirl-gradient/demo.tsx rename to apps/docs/src/app/components/liquid-gradient/demo.tsx index 5f3453e8..da90272c 100644 --- a/apps/docs/src/app/components/swirl-gradient/demo.tsx +++ b/apps/docs/src/app/components/liquid-gradient/demo.tsx @@ -1,9 +1,9 @@ 'use client'; /** - * SwirlGradient demo island: the interactive slice of the SwirlGradient + * LiquidGradient demo island: the interactive slice of the LiquidGradient * page — control store, shader preview, and control panel for the bands, - * the flow that folds them, mixing, and the color stops. The shared + * the current that streaks them, mixing, and the color stops. The shared * components/[slug] template renders this between its static header and * prose sections. */ @@ -32,24 +32,24 @@ import { VisualTestPause } from '@/lib/visualTestHooks'; import { INITIAL, MAX_STOPS, MIN_STOPS } from './params'; import type { Params, Stop } from './params'; -const SwirlGradientScene = dynamic(() => import('./scene'), { ssr: false }); +const LiquidGradientScene = dynamic(() => import('./scene'), { ssr: false }); -function SwirlGradientDemo() { +function LiquidGradientDemo() { const params = useSnapshot(); return ( - + - + ); } -function SwirlGradientControls() { +function LiquidGradientControls() { return (

@@ -58,7 +58,7 @@ function SwirlGradientControls() {
- + @@ -67,18 +67,6 @@ function SwirlGradientControls() {
- {/* TEMPORARY (build-phase tuning only): stripped at the defaults gate. */} -
- - - - - - - - - -
createItem={createStop} insertIndex={newStopIndex} @@ -107,14 +95,14 @@ function SwirlGradientControls() { ); } -export function SwirlGradientIsland() { +export function LiquidGradientIsland() { const store = useMemo(() => createControlStore(INITIAL), []); return ( - }> + }>
- +
diff --git a/apps/docs/src/app/components/swirl-gradient/params.ts b/apps/docs/src/app/components/liquid-gradient/params.ts similarity index 58% rename from apps/docs/src/app/components/swirl-gradient/params.ts rename to apps/docs/src/app/components/liquid-gradient/params.ts index 8044c678..9f2b93c2 100644 --- a/apps/docs/src/app/components/swirl-gradient/params.ts +++ b/apps/docs/src/app/components/liquid-gradient/params.ts @@ -7,19 +7,6 @@ export interface Stop { position: number; } -/** TEMPORARY (build-phase tuning only): mirrors SwirlGradientTuning. */ -export interface Tuning { - steps: number; - stepLength: number; - smallEddies: number; - slide: number; - fadeStart: number; - smear: number; - mirror: number; - paint: number; - paintDetail: number; -} - export interface Params { angle: number; repeat: number; @@ -31,14 +18,13 @@ export interface Params { colorSpace: ColorSpace; hueInterpolation: HueInterpolation; stops: Stop[]; - tuning: Tuning; } export const MIN_STOPS = 1; export const MAX_STOPS = 6; -// Values mirror the component defaults in swirl-gradient.tsx and the flow -// constants in its shader.tsx. Keep them in sync. +// Values mirror the component defaults in liquid-gradient.tsx. Keep the two +// in sync. export const INITIAL: Params = { angle: 0, repeat: 2, @@ -54,15 +40,4 @@ export const INITIAL: Params = { { color: paletteOklch.violet[6], position: 0.5 }, { color: paletteOklch.purple[9], position: 1 }, ], - tuning: { - steps: 12, - stepLength: 0.025, - smallEddies: 0.45, - slide: 1, - fadeStart: 0.25, - smear: 1, - mirror: 1, - paint: 1, - paintDetail: 0.6, - }, }; diff --git a/apps/docs/src/app/components/swirl-gradient/scene.tsx b/apps/docs/src/app/components/liquid-gradient/scene.tsx similarity index 79% rename from apps/docs/src/app/components/swirl-gradient/scene.tsx rename to apps/docs/src/app/components/liquid-gradient/scene.tsx index 204e8b3c..6272c3eb 100644 --- a/apps/docs/src/app/components/swirl-gradient/scene.tsx +++ b/apps/docs/src/app/components/liquid-gradient/scene.tsx @@ -2,11 +2,11 @@ import type { ReactNode } from 'react'; -import { ShaderScene, SwirlGradient } from '@camp-dev/shaders'; +import { LiquidGradient, ShaderScene } from '@camp-dev/shaders'; import { INITIAL, type Params } from './params'; -export default function SwirlGradientScene({ +export default function LiquidGradientScene({ params = INITIAL, children, }: { @@ -15,7 +15,7 @@ export default function SwirlGradientScene({ } = {}) { return ( - {children} diff --git a/apps/docs/src/app/dev/liquid-gradient-benchmark/benchmark-scene.tsx b/apps/docs/src/app/dev/liquid-gradient-benchmark/benchmark-scene.tsx new file mode 100644 index 00000000..2fba3575 --- /dev/null +++ b/apps/docs/src/app/dev/liquid-gradient-benchmark/benchmark-scene.tsx @@ -0,0 +1,83 @@ +'use client'; + +// Benchmark for LiquidGradient with ShaderMonitor's GPU readout (SHA-223). +// `?size=card` renders it in the Reactive card's 312 by 309 CSS-pixel +// window, where it must stay under 0.4 ms at 2x; `?size=full` renders it at +// 1440 by 900. `?dpr=2` caps the canvas at two pixels per CSS pixel, and +// anything else at one. `?still` sets speed to 0, the Reactive card's +// parked case, while the scene keeps drawing. `?baseline` renders a +// LinearGradient instead: it reads about 0.12 ms in the card window at 2x +// on the M1 Max, so a higher reading means another tab or app is sharing +// the GPU and every reading beside it is inflated (the skewed-readout +// gotcha in docs/agents/tsl.md). The links are full page loads, so each +// measurement starts from a fresh renderer. +import { useState } from 'react'; + +import { + LinearGradient, + LiquidGradient, + ShaderMonitor, + ShaderScene, + useStaticSceneHint, +} from '@camp-dev/shaders'; + +const SIZES = { + card: { width: 312, height: 309 }, + full: { width: 1440, height: 900 }, +} as const; + +type SizeName = keyof typeof SIZES; + +interface Settings { + size: SizeName; + pixelRatio: number; + still: boolean; + baseline: boolean; +} + +const readSettings = (): Settings => { + const search = new URLSearchParams(window.location.search); + + return { + size: search.get('size') === 'full' ? 'full' : 'card', + pixelRatio: search.get('dpr') === '2' ? 2 : 1, + still: search.has('still'), + baseline: search.has('baseline'), + }; +}; + +/** + * Votes the scene animated, so a still gradient keeps drawing frames and the + * GPU readout averages many frames instead of settling on one. + */ +function KeepDrawing() { + useStaticSceneHint(false); + + return null; +} + +export default function BenchmarkScene() { + const [{ size, pixelRatio, still, baseline }] = useState(readSettings); + const { width, height } = SIZES[size]; + const query = (overrides: Partial>) => + `?size=${overrides.size ?? size}&dpr=${overrides.dpr ?? pixelRatio}`; + + return ( +
+ ); +} diff --git a/apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx b/apps/docs/src/app/dev/liquid-gradient-benchmark/page.dev.tsx similarity index 85% rename from apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx rename to apps/docs/src/app/dev/liquid-gradient-benchmark/page.dev.tsx index a8a34a7b..b58159fc 100644 --- a/apps/docs/src/app/dev/swirl-gradient-benchmark/page.dev.tsx +++ b/apps/docs/src/app/dev/liquid-gradient-benchmark/page.dev.tsx @@ -7,6 +7,6 @@ import dynamic from 'next/dynamic'; // builds. const BenchmarkScene = dynamic(() => import('./benchmark-scene'), { ssr: false }); -export default function SwirlGradientBenchmarkPage() { +export default function LiquidGradientBenchmarkPage() { return ; } diff --git a/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx b/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx deleted file mode 100644 index 5f6f4976..00000000 --- a/apps/docs/src/app/dev/swirl-gradient-benchmark/benchmark-scene.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client'; - -// Benchmark for SwirlGradient with ShaderMonitor's GPU readout (SHA-223). -// `?size=card` renders it in the Reactive card's 312 by 309 CSS-pixel -// window, where it must stay under 0.4 ms at 2x; `?size=full` renders it at -// 1440 by 900. `?dpr=2` caps the canvas at two pixels per CSS pixel, and -// anything else at one. The links between settings are full page loads, so -// each measurement starts from a fresh renderer. -import { useState } from 'react'; - -import { ShaderMonitor, ShaderScene, SwirlGradient, useStaticSceneHint } from '@camp-dev/shaders'; - -const SIZES = { - card: { width: 312, height: 309 }, - full: { width: 1440, height: 900 }, -} as const; - -type SizeName = keyof typeof SIZES; - -const readSettings = (): { size: SizeName; pixelRatio: number } => { - const search = new URLSearchParams(window.location.search); - - return { - size: search.get('size') === 'full' ? 'full' : 'card', - pixelRatio: search.get('dpr') === '2' ? 2 : 1, - }; -}; - -/** - * Votes the scene animated, so a still SwirlGradient keeps drawing frames - * and the GPU readout averages many frames instead of settling on one. - */ -function KeepDrawing() { - useStaticSceneHint(false); - - return null; -} - -export default function BenchmarkScene() { - const [{ size, pixelRatio }] = useState(readSettings); - const { width, height } = SIZES[size]; - - return ( -
-

- SwirlGradient at {width} × {height} CSS px, pixel ratio capped at {pixelRatio}x.{' '} - card ·{' '} - full · 1x ·{' '} - 2x -

-
- - - - - -
-
- ); -} diff --git a/apps/docs/src/content/components.ts b/apps/docs/src/content/components.ts index b3201f57..bf2d849e 100644 --- a/apps/docs/src/content/components.ts +++ b/apps/docs/src/content/components.ts @@ -83,6 +83,11 @@ export const COMPONENTS = { description: 'Animated linear gradient. The simplest, foundational Shaders component.', category: 'gradients', }, + 'liquid-gradient': { + description: + "Colors streaked along slow, curling currents, like dye in moving water. Takes LinearGradient's stops and angle.", + category: 'gradients', + }, 'mesh-gradient': { description: 'Warped 4-color fluid gradient with time-cycling palette and film grain. Linear/Stripe marketing-page style.', @@ -103,11 +108,6 @@ export const COMPONENTS = { 'Evolving 3D simplex noise with color ramp, contour bands, and brightness/contrast histogram shaping.', category: 'noise', }, - 'swirl-gradient': { - description: - 'Repeating color bands folded along a drifting flow, like paint swirled on water. Stretches bands into fine threads without bunching them.', - category: 'gradients', - }, vignette: { description: 'Radial darkening at the canvas edges. Stacks on top of any base component inside .', diff --git a/packages/shaders/src/components/index.ts b/packages/shaders/src/components/index.ts index 4ae6861a..7fedb7bc 100644 --- a/packages/shaders/src/components/index.ts +++ b/packages/shaders/src/components/index.ts @@ -49,6 +49,9 @@ export type { LedWallProps } from './led-wall/led-wall.js'; export { LinearGradient } from './linear-gradient/linear-gradient.js'; export type { LinearGradientProps } from './linear-gradient/linear-gradient.js'; +export { LiquidGradient } from './liquid-gradient/liquid-gradient.js'; +export type { LiquidGradientProps } from './liquid-gradient/liquid-gradient.js'; + export { MeshGradient } from './mesh-gradient/mesh-gradient.js'; export type { MeshGradientProps } from './mesh-gradient/mesh-gradient.js'; @@ -61,9 +64,6 @@ export type { RadialWipeProps } from './radial-wipe/radial-wipe.js'; export { SimplexNoise } from './simplex-noise/simplex-noise.js'; export type { SimplexNoiseProps } from './simplex-noise/simplex-noise.js'; -export { SwirlGradient } from './swirl-gradient/swirl-gradient.js'; -export type { SwirlGradientProps } from './swirl-gradient/swirl-gradient.js'; - export { Vignette } from './vignette/vignette.js'; export type { VignetteProps } from './vignette/vignette.js'; diff --git a/packages/shaders/src/components/swirl-gradient/bands.ts b/packages/shaders/src/components/liquid-gradient/bands.ts similarity index 79% rename from packages/shaders/src/components/swirl-gradient/bands.ts rename to packages/shaders/src/components/liquid-gradient/bands.ts index 3154075d..b212c05a 100644 --- a/packages/shaders/src/components/swirl-gradient/bands.ts +++ b/packages/shaders/src/components/liquid-gradient/bands.ts @@ -1,9 +1,10 @@ -// How SwirlGradient colors each band coordinate along the trace: -// the stops eased in with smoothstep, the seams smoothed across one pixel, -// and the bands' average color, which threads thinner than a pixel fade to. -// A cached palette keeps color-space conversion out of the tracing loop. -// The shader (./shader.tsx) measures how much of the ramp one pixel spans -// with fwidth() and hands that footprint to each of these. +// How LiquidGradient colors each band coordinate along the trace: the +// stops eased in with smoothstep, and the bands' average color, which +// streaks thinner than a pixel fade to. A cached palette keeps color-space +// conversion out of the tracing loop. The shader (./shader.tsx) measures +// how much of the ramp one pixel spans, its footprint, with fwidth() (how +// much a value changes between neighboring pixels), and the easing keeps +// every blend at least that wide. import type { ShaderNodeObject } from 'three/tsl'; import { clamp, @@ -11,7 +12,6 @@ import { Fn, Loop, max, - mix, smoothstep, texture, type uniform, @@ -78,7 +78,7 @@ export interface BandPalette { * start_j + span_j x ease(x), and colorRamp turns that back into an eased * blend between stop j and stop j + 1. */ -export function easeStops( +function easeStops( coordinate: TSLNode, stops: ColorRampStop[], softness: TSLNode, @@ -115,7 +115,7 @@ export function easeStops( } /** The color of a band coordinate, its stops eased in. */ -export function bandColor( +function bandColor( coordinate: TSLNode, { stops, colorSpace, hueInterpolation }: BandPalette, softness: TSLNode, @@ -133,9 +133,10 @@ export function bandColor( // Cache the palette for reads along a trace // --------------------------------------------- -// Samples across one pass of the ramp. The endpoints occupy texel centers, -// so clamped reads preserve the first and last colors. 1024 half-float RGBA -// texels use 8 KiB. More samples reduce interpolation error between texels. +// Samples across one pass of the ramp, one per texel (pixel of a texture). +// The endpoints occupy texel centers, so clamped reads preserve the first +// and last colors. 1024 RGBA texels of half floats, 16-bit floats, use +// 8 KiB. More samples reduce interpolation error between texels. const RAMP_TEXELS = 1024; /** A cached ramp, with the same inputs as bandColor and an owned texture. */ @@ -171,21 +172,28 @@ export function createRampPass(shaderContext: ShaderContextValue, palette: BandP if (palette.stops.length < 2 || palette.colorSpace === 'linear' || hasNarrowInterval) return inline; - const coordinate = uv() + // Each texel's place on the ramp: texel i of n holds the color at i / (n - 1), + // so the first and last texels hold the end stops exactly. + const texelCoordinate = uv() .x.mul(RAMP_TEXELS) .sub(0.5) .div(RAMP_TEXELS - 1); const pass = createTexturePass( shaderContext.renderer.three, - vec4(colorRamp(coordinate, palette.stops, palette.colorSpace, palette.hueInterpolation), 1), + vec4( + colorRamp(texelCoordinate, palette.stops, palette.colorSpace, palette.hueInterpolation), + 1, + ), { width: RAMP_TEXELS, height: 1, type: HalfFloatType, filter: LinearFilter }, ); const rampTexture = pass.texture; if (rampTexture === null) return inline; - // Palette edits rebuild the material and this cache together. Draw once, - // before the scene first samples it, then reuse it even as softness moves. + // Palette edits rebuild the material and this cache together. A pre-pass, + // a draw the output stage runs before the scene pass, draws it once, + // before the scene first samples it, then reuses it even as softness + // moves. let drawn = false; const removePrePass = shaderContext.registerPrePass(() => { if (drawn) return; @@ -194,8 +202,8 @@ export function createRampPass(shaderContext: ShaderContextValue, palette: BandP }); return { - colorAt: (position, softness, footprint) => { - const eased = easeStops(position, palette.stops, softness, footprint); + colorAt: (coordinate, softness, footprint) => { + const eased = easeStops(coordinate, palette.stops, softness, footprint); const sampleX = clamp(eased, 0, 1) .mul(RAMP_TEXELS - 1) .add(0.5) @@ -210,41 +218,6 @@ export function createRampPass(shaderContext: ShaderContextValue, palette: BandP }; } -// --------------------------------------------- -// The seams, smoothed -// --------------------------------------------- - -/** - * Smooths the seams, where the repeating coordinate drops from 1 back to 0 - * and the last stop meets the first. A pixel's color comes from one point, - * its center, so a pixel the seam crosses lands wholly on one side, and a - * curved seam comes out as a staircase. Here a pixel near the seam takes - * the share of the other side's color that its footprint covers instead, - * so the seam spans one pixel and reads as a smooth line. - * - * `coordinate` is the repeating 0..1 band coordinate and `footprint` how - * much of it one pixel spans. Near the top, the part of the footprint past 1 - * belongs to the first stop. Near the bottom, the part below 0 belongs to - * the last. The blend is in linear light, as light mixes inside one pixel. - * `seamWeight` turns the smoothing off at a single pass, which has no seam. - */ -export function smoothSeams( - color: TSLNode, - coordinate: TSLNode, - footprint: TSLNode, - { first, last }: { first: TSLNode; last: TSLNode }, - seamWeight: TSLNode, -): ShaderNodeObject { - const halfFootprint = float(footprint).mul(0.5); - const safeFootprint = max(footprint, 1e-5); - const pastTop = clamp(float(coordinate).add(halfFootprint).sub(1).div(safeFootprint), 0, 1); - const belowBottom = clamp(halfFootprint.sub(coordinate).div(safeFootprint), 0, 1); - - const withFirst = mix(color, first, pastTop.mul(seamWeight)); - - return mix(withFirst, last, belowBottom.mul(seamWeight)); -} - // --------------------------------------------- // The bands' average color // --------------------------------------------- diff --git a/packages/shaders/src/components/swirl-gradient/flow.ts b/packages/shaders/src/components/liquid-gradient/flow.ts similarity index 81% rename from packages/shaders/src/components/swirl-gradient/flow.ts rename to packages/shaders/src/components/liquid-gradient/flow.ts index 7ef8d1c3..b8ea6fbe 100644 --- a/packages/shaders/src/components/swirl-gradient/flow.ts +++ b/packages/shaders/src/components/liquid-gradient/flow.ts @@ -1,9 +1,9 @@ -// The flow SwirlGradient folds its bands along, and the backward trace +// The flow LiquidGradient carries its colors along, and the backward trace // through it. The flow is the curl of a gradient-noise field: the noise's // slope turned 90 degrees, so colors slide along the noise's contour lines -// and never pile up. The flow pass draws it into a texture once a frame, and -// the shader (./shader.tsx) traces each pixel back through that texture to -// find where its color started. Lives beside the component, as stroke.ts +// and never pile up. The flow pass draws it into a texture whenever it +// moves, and the shader (./shader.tsx) traces each pixel back through that +// texture, averaging the colors it passes. Lives beside the component, as stroke.ts // does in cursor-ripple/, until a second component needs it. import type { ShaderNodeObject } from 'three/tsl'; import { @@ -42,11 +42,11 @@ import type { ShaderContextValue } from '../../react/context/shader-context.js'; // power of two, so dividing a cell index by it stays exact in a float. export const FLOW_PERIOD = 8; -// Texels per period on each side. 256 over 8 cells gives 32 texels per -// eddy, and 16 per smaller eddy, which the texture's linear filter blends -// into a smooth flow. Half that density drew faster but showed the filter's -// straight runs between texels: crisp seams came out faceted instead of -// curved. +// Texels (pixels of a texture) per period on each side. 256 over 8 cells +// gives 32 texels per eddy, and 16 per smaller eddy, which the texture's +// linear filter blends into a smooth flow. Half that density drew faster but +// showed the filter's straight runs between texels: hard color edges came +// out faceted instead of curved. const FLOW_TEXELS = 256; // The smaller eddies run at twice the broad flow's frequency, so each one is @@ -54,8 +54,18 @@ const FLOW_TEXELS = 256; // the broad flow. const SMALL_EDDY_FREQUENCY = 2; -// The way the flow slides when the tuning rig's slide is above 0: right and -// a little up, as a unit vector. TEMPORARY with the slide itself. +// The smaller eddies' strength. 0 would leave the broad currents alone, and +// at 0.5 the smaller eddies swirl as hard as the broad ones. Higher curls +// more fine billowing into the broad currents. +const SMALL_EDDY_STRENGTH = 0.45; + +// How far the flow slides per unit of phase, in lattice cells, on top of +// the eddies morphing in place. With the phase at speed x seconds, the +// default speed of 0.15 carries the currents across a canvas height in +// about ten seconds. 0 would leave the eddies morphing where they stand. +const SLIDE_RATE = 1; + +// The way the flow slides: right and a little up, as a unit vector. const SLIDE_DIRECTION = [0.8, 0.6] as const; const TWO_PI = Math.PI * 2; @@ -211,22 +221,12 @@ function gradientNoise( export interface FlowInputs { /** A whole number 0 or above that picks the flow's random layout. */ seed: TSLNode; - /** - * The smaller eddies' strength: 0 leaves the broad flow alone, 0.5 swirls - * them as hard as the broad eddies, and 1 twice as hard. - */ - smallEddies: TSLNode; /** * How far the flow has moved: the speed prop summed over time. Each lattice - * arrow turns by about this many radians, more or less by its own spin. + * arrow turns by about this many radians, more or less by its own spin, + * and the flow slides SLIDE_RATE lattice cells per unit. */ phase: TSLNode; - /** - * TEMPORARY (build-phase tuning only): how far the flow slides per unit - * of phase, in lattice cells, on top of the arrows' spin. 0 leaves the - * eddies morphing in place. - */ - slide: TSLNode; } /** @@ -241,7 +241,7 @@ export interface FlowInputs { * The flow is two layers of noise, broad eddies and smaller ones at twice * the frequency, and the curl of a sum is the sum of the curls. */ -function flowVelocity(point: TSLNode, { seed, smallEddies, phase, slide }: FlowInputs) { +function flowVelocity(point: TSLNode, { seed, phase }: FlowInputs) { const broadSeed = stableHashUint(float(seed)); // A second, unrelated hash stream, so the smaller eddies don't line up // with the broad ones. @@ -249,9 +249,8 @@ function flowVelocity(point: TSLNode, { seed, smallEddies, phase, slide }: FlowI const phaseNode = float(phase); // Reading the flow from a point behind this one, against SLIDE_DIRECTION, - // shifts the whole flow forward along it by phase x slide lattice cells. - // At a slide of 0 the point is untouched. - const slideDistance = phaseNode.mul(slide); + // shifts the whole flow forward along it by phase x SLIDE_RATE lattice cells. + const slideDistance = phaseNode.mul(SLIDE_RATE); const readPoint = vec2(point).sub( vec2(slideDistance.mul(SLIDE_DIRECTION[0]), slideDistance.mul(SLIDE_DIRECTION[1])), ); @@ -263,7 +262,7 @@ function flowVelocity(point: TSLNode, { seed, smallEddies, phase, slide }: FlowI // comes out twice as steep by the chain rule, so at a strength of 0.5 the // small eddies swirl as hard as the broad ones. The strength scales the // layer's height, as an fBm octave's gain does. - const slope = broadSlope.add(smallSlope.mul(float(smallEddies).mul(SMALL_EDDY_FREQUENCY))); + const slope = broadSlope.add(smallSlope.mul(SMALL_EDDY_STRENGTH * SMALL_EDDY_FREQUENCY)); // Curl: the slope turned 90 degrees clockwise. return vec2(slope.y, slope.x.negate()); @@ -357,7 +356,7 @@ export function createFlowPass( // gotcha in docs/agents/tsl.md). The CPU compares each input with the // value it had at the last draw and skips the draw while all of them // match. NaN never equals a number, so the first frame always draws. - const sources = [inputs.seed, inputs.smallEddies, inputs.phase, inputs.slide]; + const sources = [inputs.seed, inputs.phase]; const drawnValues = sources.map(() => Number.NaN); const removePrePass = shaderContext.registerPrePass(() => { if (sources.every((source, index) => source.value === drawnValues[index])) return; @@ -408,36 +407,28 @@ export interface TraceFlowOptions { /** Where the trace reads the flow's velocity: the flow pass, or inline. */ velocityAt: VelocityAt; /** - * What color to read at every point of the path. The trace calls - * this inside its shader function before the loop, so it can pin the - * values that are the same on every step with .toVar() (the first-use - * gotcha in docs/agents/tsl.md), and it returns the reader for one point. + * What color to read at every point of the path. The trace calls this + * inside its shader function before the loop, so it can pin the values + * that are the same on every step with .toVar() (the first-use gotcha in + * docs/agents/tsl.md), and it returns the reader for one point. */ sampleAlongPath: () => PathSampler; - /** - * Combines the final offset and the mean linear RGB after the loop. Runs - * inside the same shader function so both answers share one trace. - */ - finishTrace: ( - offset: ShaderNodeObject, - meanColor: ShaderNodeObject, - ) => ShaderNodeObject; } /** - * Trace a point backward along the flow. The pixel at `start` shows - * whatever color sat at `start + offset` before the flow carried it here. - * Each step reads the velocity where the trace has reached and steps - * against it, then reads `sampleAlongPath` at the new point. Averaging those - * reads gives every color the pixel's path passed through, the way a - * long-exposure photo of moving liquid streaks it along the current. + * Trace a point backward along the flow and return the average linear RGB + * color of every point it passed, from the start through each step to the + * end. Each step reads the velocity where the trace has reached, steps + * against it, toward where the color came from, and reads the color there. + * The average streaks every color along the current, the way a long + * exposure of moving liquid does. * * Written with Fn and Loop, so the GPU runs a real loop instead of `steps` * copies of the body. */ export function traceFlow( start: TSLNode, - { steps, stepLength, velocityAt, sampleAlongPath, finishTrace }: TraceFlowOptions, + { steps, stepLength, velocityAt, sampleAlongPath }: TraceFlowOptions, ): ShaderNodeObject { return Fn(() => { // Pin what is the same on every step before the loop. Without .toVar(), @@ -449,27 +440,19 @@ export function traceFlow( const sampleAt = sampleAlongPath(); // The loop's running state: how far the trace has moved from `origin`, - // and the sum of what it read along the way. Starting the offset at 0 - // means a step length of 0 returns exactly 0, so straight bands stay - // exactly straight. The sum starts with the pixel's own point. + // and the sum of the colors it read. Starting the offset at 0 means a + // step length of 0 reads the pixel's own point every time, so straight + // bands stay straight. The sum starts with that point. const offset = vec2(0, 0).toVar(); - // Average colors, not their positions on the ramp. Positions on either - // side of a seam average to its middle stop, even if the path never - // touched that color. Linear RGB mixes the colors the path actually saw. - const sampleSum = vec3(sampleAt(offset)).toVar(); + const colorSum = vec3(sampleAt(offset)).toVar(); Loop(steps, () => { - // Midpoint integration: predict a half-step backward, then use the - // velocity there for the full step. Following the starting direction - // for a whole step cuts across a curved flow and pushes traces across - // its contours, creating false edges around tight eddies. - const position = origin.add(offset).toVar(); - const midpoint = position.sub(velocityAt(position).mul(step).mul(0.5)).toVar(); - - offset.subAssign(velocityAt(midpoint).mul(step)); - sampleSum.addAssign(sampleAt(offset)); + // One velocity read per step. STEP_COUNT in ./shader.tsx says why + // midpoint integration's second read isn't worth it here. + offset.subAssign(velocityAt(origin.add(offset)).mul(step)); + colorSum.addAssign(sampleAt(offset)); }); - return finishTrace(offset, sampleSum.div(steps + 1)); + return colorSum.div(steps + 1); })(); } diff --git a/packages/shaders/src/components/liquid-gradient/liquid-gradient.tsx b/packages/shaders/src/components/liquid-gradient/liquid-gradient.tsx new file mode 100644 index 00000000..d605d5ca --- /dev/null +++ b/packages/shaders/src/components/liquid-gradient/liquid-gradient.tsx @@ -0,0 +1,109 @@ +'use client'; + +// Public face of the liquid gradient: owns the props, their JSDoc, and their +// defaults, then delegates to LiquidGradientShader (./shader.tsx), which +// streaks LinearGradient's bands and a field of fractal paint along slow, +// curling currents, like color stirred into liquid. Render it inside a +// . +import type { ColorSpace, HueInterpolation } from '../../engine.js'; +import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; +import type { ColorStop } from '../shared/color.js'; +import { LiquidGradientShader } from './shader.js'; + +export type { ColorStop } from '../shared/color.js'; + +export interface LiquidGradientProps { + /** + * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions + * auto-space when omitted. + */ + stops?: ColorStop[]; + /** + * Direction the bands run across before the flow carries them, in + * degrees. 0 runs left to right, 90 runs bottom to top. Defaults to 0. + * Accepts a static value or an animation signal. + */ + angle?: AnimatableProp; + /** + * How many times the stops run across the canvas. Every other pass runs + * the stops backward, so each pass ends on the color the next one starts + * with and no seam forms. Values at or below 1 render as a single pass. + * Defaults to 2. Accepts a static value or an animation signal. + */ + repeat?: AnimatableProp; + /** + * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases + * each stop into the next across the whole space between them. Defaults + * to 1. Accepts a static value or an animation signal. + */ + softness?: AnimatableProp; + /** + * How far the current carries the colors. 0 leaves the bands straight, and + * the paint's blotches fade in by 0.2; higher values streak and curl the + * colors further. Above about 2, the streaks start to break into separate + * copies around tight curls. Defaults to 0.9. Accepts a static value or an + * animation signal. + */ + swirl?: AnimatableProp; + /** + * Roughly how many eddies span the canvas's height. Above 4, the flow's + * pattern starts to repeat across a wide canvas. Defaults to 1.5. Accepts + * a static value or an animation signal. + */ + scale?: AnimatableProp; + /** + * How fast the current drifts: its eddies form, merge, and dissolve as + * they slide across the canvas. 0 holds the flow still. Defaults to 0.15. + * Accepts a static value or an animation signal. + */ + speed?: AnimatableProp; + /** + * Picks a different flow and paint with the same character. Each whole + * number gives an unrelated layout. Defaults to 0. + */ + seed?: number; + /** Color space the bands are interpolated in. Defaults to `'oklab'`. */ + colorSpace?: ColorSpace; + /** + * Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert + * otherwise. Defaults to `'shorter'`. + */ + hueInterpolation?: HueInterpolation; +} + +// Blue -> violet -> purple: 55 degrees of hue, with lightness climbing 0.157 +// and then 0.26 between stops. The mirrored passes run it back down again, +// so the darkest blue and the lightest purple each meet only themselves. +const DEFAULT_STOPS: ColorStop[] = [ + { color: 'oklch(0.303 0.152 265.847)' }, // paletteOklch.blue[3] + { color: 'oklch(0.460 0.248 293.328)' }, // paletteOklch.violet[6] + { color: 'oklch(0.720 0.250 320)' }, // paletteOklch.purple[9] +]; + +export function LiquidGradient({ + stops = DEFAULT_STOPS, + angle = 0, + repeat = 2, + softness = 1, + swirl = 0.9, + scale = 1.5, + speed = 0.15, + seed = 0, + colorSpace = 'oklab', + hueInterpolation = 'shorter', +}: LiquidGradientProps) { + return ( + + ); +} diff --git a/packages/shaders/src/components/swirl-gradient/paint.ts b/packages/shaders/src/components/liquid-gradient/paint.ts similarity index 82% rename from packages/shaders/src/components/swirl-gradient/paint.ts rename to packages/shaders/src/components/liquid-gradient/paint.ts index 087e145f..95fb59b5 100644 --- a/packages/shaders/src/components/swirl-gradient/paint.ts +++ b/packages/shaders/src/components/liquid-gradient/paint.ts @@ -3,10 +3,10 @@ // break the bands into blotches, and its fine layers are what the path // average draws out into streaks along the current, the way a long exposure // streaks a detailed surface. The paint pass draws one period of it into a -// texture when the seed or the detail changes, so each trace step reads one -// texel instead of summing the layers. +// texture when the seed changes, so each trace step reads one texel (one +// pixel of a texture) instead of summing the layers. import type { ShaderNodeObject } from 'three/tsl'; -import { float, floor, Fn, fract, mix, texture, uv, vec2, vec4 } from 'three/tsl'; +import { float, floor, Fn, fract, mix, texture, type uniform, uv, vec2, vec4 } from 'three/tsl'; import { HalfFloatType, LinearFilter, type Node, RedFormat } from 'three/webgpu'; import { createTexturePass, stableHash, stableHashUint, type TSLNode } from '../../engine.js'; @@ -29,11 +29,18 @@ const PAINT_PERIOD = FLOW_PERIOD; const LAYER_FREQUENCIES = [1, 2, 4, 8, 16]; // Texels per period on each side. 1024 over 8 cells gives 128 texels per -// cell, 8 per wave of the finest layer, which the linear filter blends -// smoothly. The texture holds one half float per texel, 2 MB, and draws -// only when the seed or the detail changes. +// cell, 8 per wave of the finest layer, which the linear filter (a read +// between texel centers blends the four around it) smooths over. The +// texture holds one half float, a 16-bit float, per texel, 2 MB, and draws +// only when the seed changes. const PAINT_TEXELS = 1024; +// How loudly the finer layers speak: each layer weighs this much times the +// one before. Lower leaves soft blotches; higher adds more of the fine +// detail the path average streaks along the current. At 1 every layer +// would weigh the same. +const LAYER_GAIN = 0.6; + // The inline fallback sums only the broadest layers, because every pixel // pays for them at every step. const INLINE_LAYERS = 2; @@ -82,25 +89,19 @@ function valueNoise( export interface PaintInputs { /** A whole number 0 or above that picks the paint's random layout. */ seed: TSLNode; - /** - * How loudly the finer layers speak, 0..1: each layer's weight is this - * times the one before. 0 leaves only the broad blotches; 1 gives every - * layer the same weight. - */ - detail: TSLNode; } /** * The paint at `point`, summed from the first `layerCount` layers and - * divided by the total weight, so it stays roughly -1..1 at any detail. + * divided by the total weight, so it stays roughly -1..1. */ -function paintNoise(point: TSLNode, { seed, detail }: PaintInputs, layerCount: number) { +function paintNoise(point: TSLNode, { seed }: PaintInputs, layerCount: number) { // A hash stream of its own, so the paint doesn't line up with the flow, // which hashes the seed directly. const seedWord = stableHashUint(stableHashUint(float(seed)).add(1)); let total = float(0); - let totalWeight = float(0); - let weight = float(1); + let totalWeight = 0; + let weight = 1; LAYER_FREQUENCIES.slice(0, layerCount).forEach((frequency, layer) => { // Each layer gets its own stream, seedWord + layer, so the layers @@ -112,8 +113,8 @@ function paintNoise(point: TSLNode, { seed, detail }: PaintInputs, layerCount: n ); total = total.add(layerNoise.mul(weight)); - totalWeight = totalWeight.add(weight); - weight = weight.mul(detail); + totalWeight += weight; + weight *= LAYER_GAIN; }); return total.div(totalWeight); @@ -138,19 +139,16 @@ export interface PaintPass { * pass in flow.ts: PAINT_TEXELS + 1 texels a side, the last row and column * repeating the first, so the linear filter blends across the period's seam * as smoothly as anywhere else. The paint holds still while the flow moves, - * so the pass draws on the first frame and again only when the seed or the - * detail changes. Where the renderer can't draw half floats, every read - * sums the broadest layers inline instead. + * so the pass draws on the first frame and again only when the seed + * changes. Where the renderer can't draw half floats, every read sums the + * broadest layers inline instead. * * The caller creates and disposes the pass in one effect, so a Strict Mode * remount builds a fresh one (the Strict Mode gotcha in docs/agents/tsl.md). */ export function createPaintPass( shaderContext: ShaderContextValue, - inputs: PaintInputs & { - seed: { value: number }; - detail: { value: number }; - }, + inputs: { seed: ReturnType> }, ): PaintPass { const side = PAINT_TEXELS + 1; @@ -186,16 +184,15 @@ export function createPaintPass( }; } - // A pre-pass draws before the scene pass in the same frame (the - // draw-order gotcha in docs/agents/tsl.md). It compares the seed and the - // detail with their values at the last draw and skips the draw while both - // match. NaN never equals a number, so the first frame always draws. + // A pre-pass is a draw the output stage runs before the scene pass in the + // same frame (the draw-order gotcha in docs/agents/tsl.md). This one + // compares the seed with its value at the last draw and skips the draw + // while it matches. NaN never equals a number, so the first frame always + // draws. let drawnSeed = Number.NaN; - let drawnDetail = Number.NaN; const removePrePass = shaderContext.registerPrePass(() => { - if (inputs.seed.value === drawnSeed && inputs.detail.value === drawnDetail) return; + if (inputs.seed.value === drawnSeed) return; drawnSeed = inputs.seed.value; - drawnDetail = inputs.detail.value; pass.render(); }); diff --git a/packages/shaders/src/components/liquid-gradient/shader.tsx b/packages/shaders/src/components/liquid-gradient/shader.tsx new file mode 100644 index 00000000..efacb66c --- /dev/null +++ b/packages/shaders/src/components/liquid-gradient/shader.tsx @@ -0,0 +1,403 @@ +'use client'; + +// LiquidGradient's GPU half. The pixel's journey: place the pixel in the +// flow, trace it backward along the flow (./flow.ts), color every point the +// trace passes from the bands and the paint there (./bands.ts, ./paint.ts), +// and average those colors. The average streaks each color along the +// current, the way a long exposure of moving liquid does, and the paint's +// fine detail is what the streaks are drawn from. The wrapper +// (./liquid-gradient.tsx) supplies the props. +import { useEffect, useMemo } from 'react'; + +import { + cos, + fract, + fwidth, + max, + mix, + type ShaderNodeObject, + sin, + smoothstep, + uniform, + uv, + vec2, +} from 'three/tsl'; +import { Mesh, MeshBasicNodeMaterial, type Node, PlaneGeometry } from 'three/webgpu'; + +import type { ColorSpace, HueInterpolation } from '../../engine.js'; +import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; +import { useAnimatableSpeed } from '../../react/hooks/use-animatable-speed/use-animatable-speed.js'; +import { useAnimatableUniform } from '../../react/hooks/use-animatable-uniform/use-animatable-uniform.js'; +import { useAspectUniform } from '../../react/hooks/use-aspect-uniform/use-aspect-uniform.js'; +import { useShaderContext } from '../../react/hooks/use-shader-context/use-shader-context.js'; +import { useStaticSceneHint } from '../../react/hooks/use-static-hint/use-static-hint.js'; +import { type ColorStop, colorStopsKey, toColorRampStops } from '../shared/color.js'; +import { type BandPalette, createAveragePass, createRampPass } from './bands.js'; +import { createFlowPass, inlineVelocity, type PathSampler, traceFlow } from './flow.js'; +import { createPaintPass } from './paint.js'; + +// --------------------------------------------- +// Feel constants (tuned by eye at the defaults gate) +// --------------------------------------------- +// GPU time, measured with on WebGPU in headless Chromium +// on the M1 Max at 2x, beside a LinearGradient baseline reading 0.12 ms: at +// 1440 by 900, 2.6 to 2.7 ms with the flow moving and 2.5 to 2.7 ms still. + +// How many points each pixel's trace colors and averages. Each step reads +// the flow, the paint, and the cached palette. 12 steps with two flow reads +// each, for midpoint integration, read 0.57 to 0.63 ms in the Reactive +// card's 312 by 309 window at 2x, over its 0.4 ms budget. 8 steps with one +// read each, at the same reach, read 0.34 to 0.38 ms moving and 0.27 to +// 0.29 ms still, and looked the same. +const STEP_COUNT = 8; + +// How far one step travels at swirl 1 where the flow runs at unit speed, in +// lattice cells (about one eddy each). STEP_COUNT x STEP_LENGTH, 0.3 cells, +// is the whole trace's reach at swirl 1. Longer steps reach further for the +// same cost, until neighboring samples land far enough apart to draw the +// paint's detail as separate copies around tight curls instead of one +// streak. +const STEP_LENGTH = 0.0375; + +// Where thin streaks start fading to the bands' average color: the share of +// one whole pass of the stops a single pixel spans. The fade is complete at +// 1, where a pixel spans every stop and its true color is the average. +// Lower starts the fade sooner, which calms moving streaks at the cost of +// fine detail; higher keeps detail longer, and with it more shimmer. +const FADE_START = 0.25; + +// How far the paint shifts each point's place in the bands, in passes of +// the stops. The paint runs -1..1, so at 1 it can move a point a whole pass +// either way, which breaks the bands into blotches. 0 would leave plain +// streaked bands. +const PAINT_SHIFT = 1; + +// The swirl at which the paint reaches its full shift. Below it, the paint +// fades out with swirl, so swirl 0 draws straight bands instead of still +// blotches. Above it, swirl only carries the colors. +const FULL_PAINT_SWIRL = 0.2; + +export interface LiquidGradientShaderProps { + /** + * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions + * auto-space when omitted. + */ + stops: ColorStop[]; + /** + * Direction the bands run across before the flow carries them, in + * degrees. 0 runs left to right, 90 runs bottom to top. Accepts a static + * value or an animation signal. + */ + angle: AnimatableProp; + /** + * How many times the stops run across the canvas. Every other pass runs + * the stops backward, so each pass ends on the color the next one starts + * with and no seam forms. Values at or below 1 render as a single pass. + * Accepts a static value or an animation signal. + */ + repeat: AnimatableProp; + /** + * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases + * each stop into the next across the whole space between them. Accepts a + * static value or an animation signal. + */ + softness: AnimatableProp; + /** + * How far the current carries the colors. 0 leaves the bands straight, and + * the paint's blotches fade in by 0.2; higher values streak and curl the + * colors further. Above about 2, the streaks start to break into separate + * copies around tight curls. Accepts a static value or an animation + * signal. + */ + swirl: AnimatableProp; + /** + * Roughly how many eddies span the canvas's height. Above 4, the flow's + * pattern starts to repeat across a wide canvas. Accepts a static value or + * an animation signal. + */ + scale: AnimatableProp; + /** + * How fast the current drifts: its eddies form, merge, and dissolve as + * they slide across the canvas. 0 holds the flow still. Accepts a static + * value or an animation signal. + */ + speed: AnimatableProp; + /** + * Picks a different flow and paint with the same character. Each whole + * number gives an unrelated layout. + */ + seed: number; + /** Color space the bands are interpolated in. */ + colorSpace: ColorSpace; + /** Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert otherwise. */ + hueInterpolation: HueInterpolation; +} + +export function LiquidGradientShader({ + stops, + angle, + repeat, + softness, + swirl, + scale, + speed, + seed, + colorSpace, + hueInterpolation, +}: LiquidGradientShaderProps) { + const shaderContext = useShaderContext(); + + // A literal speed of 0 holds the flow still, so nothing on screen changes + // (an animation signal might move later, so it doesn't count). Telling + // the scene lets its frame scheduler park on the still frame instead of + // redrawing an unchanging image, as Grain does. + const isStatic = typeof speed === 'number' && speed === 0; + + useStaticSceneHint(isStatic); + + // useAnimatableSpeed sums speed x frame time into a phase uniform each + // frame. The flow's arrows turn and the flow slides by the phase, so + // changing speed changes the tempo without snapping the flow to where a + // time x speed product would put it. + const phaseUniform = useAnimatableSpeed(speed); + + // The animatable dials live in uniforms (values the CPU can update each + // frame without rebuilding the shader), tracking either a static number or + // an animation signal. + const angleUniform = useAnimatableUniform(angle); + const repeatUniform = useAnimatableUniform(repeat); + const softnessUniform = useAnimatableUniform(softness); + const swirlUniform = useAnimatableUniform(swirl); + const scaleUniform = useAnimatableUniform(scale); + + // Canvas width over height, so the eddies stay round on a wide canvas. + const aspectNode = useAspectUniform(); + + // The seed goes into the flow's and the paint's hashes, which read it as a + // whole number 0 or above (stableHash truncates to u32, and u32 of a + // negative float is backend-defined). The uniform is created once and + // rewritten, so a new seed repaints without recompiling. The scene renders + // on demand, so poke it to show the change (the bare-uniform-write gotcha + // in docs/agents/tsl.md). + const seedUniform = useMemo(() => uniform(0), []); + + useEffect(() => { + seedUniform.value = Math.round(Math.abs(seed)); + shaderContext?.scheduler.requestRender(); + }, [shaderContext, seedUniform, seed]); + + // Content fingerprint of the stops array (colors + positions). The build + // effect keys on this string, so a re-render that passes a new array with + // the same contents doesn't rebuild the material. + const stopsKey = colorStopsKey(stops); + + // --------------------------------------------- + // Build the material and mount the mesh + // --------------------------------------------- + // Runs once per mount, and again only when the stops, the color space, or + // the hue arc change, because colorRamp bakes the stop colors in as + // constants. Every dial above flows through uniforms. + useEffect( + () => { + if (!shaderContext) return; + + // --------------------------------------------- + // Place the pixel in the flow + // --------------------------------------------- + // uv() is the pixel's position on the plane, 0..1 both ways. + // Subtracting 0.5 centers it, so changing the scale zooms around the + // middle of the canvas rather than its corner. x times the aspect + // ratio measures both axes in canvas heights, which keeps the eddies + // round on a wide canvas. Times scale, one lattice cell of the noise, + // about one eddy, spans 1/scale of the canvas's height. + const centered = uv().sub(vec2(0.5, 0.5)); + const flowPoint = vec2(centered.x.mul(aspectNode), centered.y).mul(scaleUniform); + + // The flow pass draws the flow's velocity into a texture whenever the + // flow moves, so a read costs one texel. Where the renderer can't draw + // half floats, each read works the velocity out from the noise + // instead, which looks the same and costs far more. + const flowInputs = { seed: seedUniform, phase: phaseUniform }; + const flowPass = createFlowPass(shaderContext, flowInputs); + const velocityAt = flowPass?.velocityAt ?? inlineVelocity(flowInputs); + + // The paint pass draws the paint into a texture on the first frame and + // again only when the seed changes (./paint.ts). + const paintPass = createPaintPass(shaderContext, { seed: seedUniform }); + + // --------------------------------------------- + // Find the pixel's place in the bands + // --------------------------------------------- + // LinearGradient's projection at its default center: the angle becomes + // a unit direction, and the pixel's distance along it from the canvas + // center, plus 0.5, is its place on the ramp. At angle 0 that is plain + // u: 0 at the left edge, 1 at the right. + const angleRadians = angleUniform.mul(Math.PI / 180); + const direction = vec2(cos(angleRadians), sin(angleRadians)); + const pixelCoord = centered.dot(direction).add(0.5); + + // The projection is a straight line, so a point some lattice cells + // away from the pixel sits that offset, dotted with coordPerCell, + // further along the ramp. coordPerCell undoes the placement's + // stretches in reverse to turn cells into uv: divide by scale, then x + // by the aspect. The max() keeps a scale of 0 from dividing by zero. + const safeScale = max(scaleUniform, 0.001); + const coordPerCell = vec2(direction.x.div(aspectNode), direction.y).div(safeScale); + + // How far the paint can shift a point, in passes of the stops: + // PAINT_SHIFT, faded in by smoothstep as swirl rises from 0 to + // FULL_PAINT_SWIRL. + // smoothstep is exactly 1 past its upper edge, so at the default swirl + // the paint keeps its full strength. + const paintStrength = smoothstep(0, FULL_PAINT_SWIRL, swirlUniform).mul(PAINT_SHIFT); + + // A point's place in the bands, before the passes fold it: the band + // coordinate there, shifted by the paint there. The paint runs -1..1, + // so `strength` is how many passes it can shift a point either way. + const paintedCoord = ( + bandCoord: ShaderNodeObject, + point: ShaderNodeObject, + strength: ShaderNodeObject, + ) => bandCoord.add(paintPass.paintAt(point).mul(strength)); + + // A coordinate's place on the ramp, 0..1. Times repeat, it counts + // passes of the stops, and a triangle wave folds them so every other + // pass runs backward: fract(passes / 2) climbs 0..1 over two passes, + // x 2 - 1 makes that -1..1, and 1 - abs() folds it into 0 -> 1 -> 0. + // Each pass ends on the color the next starts with, so no seam forms. + // max() holds repeat at 1 or more, so a repeat at or below 1 draws a + // single pass. The fold still catches a coordinate the paint pushed + // past either end and turns it back, where clamping it would leave a + // flat patch of the first or last color. + const bandPosition = (coordinate: ShaderNodeObject) => + fract(coordinate.mul(max(repeatUniform, 1)).mul(0.5)) + .mul(2) + .sub(1) + .abs() + .oneMinus(); + + // --------------------------------------------- + // Color each point of the path + // --------------------------------------------- + // The ramp pass caches the palette's colors in a texture, so a sample + // reads RGB instead of converting color spaces (./bands.ts). The + // average pass holds the bands' average color, which thin streaks fade + // to. + const palette: BandPalette = { + stops: toColorRampStops(stops), + colorSpace, + hueInterpolation, + }; + const averagePass = createAveragePass(shaderContext, palette, softnessUniform); + const rampPass = createRampPass(shaderContext, palette); + + // One point's linear RGB color. A ramp coordinate is a position, not a + // color, and averaging positions through a curved ramp would invent a + // middle color the path never passed, so every sample becomes a color + // first and the trace averages the colors. + const colorAt = ( + coordinate: ShaderNodeObject, + averageColor: ShaderNodeObject, + ) => { + // The GPU shades pixels in 2x2 blocks, so each pixel can see how + // much a value changes to its neighbors. fwidth() returns that + // change, |change across| + |change down|. Taken on the coordinate + // before the fold and times repeat, it counts how many whole passes + // of the stops one pixel spans at this sample. On straight bands that + // is a few thousandths. Where the flow squeezes a streak thinner than + // a pixel, it climbs toward 1. Measured per sample, because slopes + // on either side of a fold cancel once averaged. + const footprint = fwidth(coordinate).mul(max(repeatUniform, 1)); + + // Stops ease in no narrower than one pixel's footprint, so a hard + // band's edge spans a pixel instead of a staircase. A sample that + // spans most of a pass would pick one color from all of them, which + // shimmers as the flow moves, so it fades toward the bands' average. + const bandColor = rampPass.colorAt(bandPosition(coordinate), softnessUniform, footprint); + + return mix(bandColor, averageColor, smoothstep(FADE_START, 1, footprint)); + }; + + // --------------------------------------------- + // Trace it back, averaging the colors it passes + // --------------------------------------------- + // swirl scales every step, so it sets how far the trace reaches: at 0 + // the trace stands still and the bands stay straight. The sampler pins + // its per-pixel inputs before the loop (the first-use gotcha in + // docs/agents/tsl.md), so each step recomputes only what depends on + // its offset. + const sampleAlongPath = (): PathSampler => { + const startPoint = flowPoint.toVar(); + const startCoord = pixelCoord.toVar(); + const perCell = coordPerCell.toVar(); + const strength = paintStrength.toVar(); + // The one-texel average is the same at every step. Read it once. + const averageColor = averagePass.color.toVar(); + + return (offset) => + colorAt( + paintedCoord(startCoord.add(offset.dot(perCell)), startPoint.add(offset), strength), + averageColor, + ); + }; + + // An unlit material whose per-pixel color comes from colorNode. + const material = new MeshBasicNodeMaterial(); + + material.colorNode = traceFlow(flowPoint, { + steps: STEP_COUNT, + stepLength: swirlUniform.mul(STEP_LENGTH), + velocityAt, + sampleAlongPath, + }); + + // A 2x2 plane exactly fills ShaderScene's camera view (-1..1 on both + // axes), so the gradient covers the whole canvas. + const mesh = new Mesh(new PlaneGeometry(2, 2), material); + + shaderContext.scene.add(mesh); + + // A rebuild swaps the mesh without touching any uniform, and a still + // scene is parked, so poke it to draw the new material. + shaderContext.scheduler.requestRender(); + + return () => { + shaderContext.scene.remove(mesh); + flowPass?.dispose(); + paintPass.dispose(); + averagePass.dispose(); + rampPass.dispose(); + try { + material.dispose(); + } catch { + // three/webgpu can throw during dispose under Strict Mode double-invoke + } + try { + mesh.geometry.dispose(); + } catch { + // same + } + }; + }, + // stopsKey is a stable string proxy for the stops array; the array itself + // is intentionally omitted to avoid rebuilds on identity-only changes. + // Animatable uniforms are mutated in place. + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + shaderContext, + angleUniform, + repeatUniform, + softnessUniform, + swirlUniform, + scaleUniform, + aspectNode, + phaseUniform, + seedUniform, + stopsKey, + colorSpace, + hueInterpolation, + ], + ); + + return null; +} diff --git a/packages/shaders/src/components/swirl-gradient/shader.tsx b/packages/shaders/src/components/swirl-gradient/shader.tsx deleted file mode 100644 index afff25f8..00000000 --- a/packages/shaders/src/components/swirl-gradient/shader.tsx +++ /dev/null @@ -1,507 +0,0 @@ -'use client'; - -// SwirlGradient's GPU half. The pixel's journey: place the pixel in the -// flow, trace it backward along the flow (./flow.ts) while reading the -// bands and the paint (./paint.ts) at every point it passes, then color it -// by averaging their linear RGB colors (./bands.ts). Averaging along the path -// streaks each color along the current, the way moving liquid looks, -// instead of folding sharp copies of the bands, and the paint's fine -// detail is what the streaks are drawn from. The wrapper -// (./swirl-gradient.tsx) supplies the props. -import { useEffect, useMemo } from 'react'; - -import { - cos, - fract, - fwidth, - max, - mix, - type ShaderNodeObject, - sin, - smoothstep, - uniform, - uv, - vec2, - vec3, -} from 'three/tsl'; -import { Mesh, MeshBasicNodeMaterial, type Node, PlaneGeometry } from 'three/webgpu'; - -import type { ColorSpace, HueInterpolation } from '../../engine.js'; -import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; -import { useAnimatableSpeed } from '../../react/hooks/use-animatable-speed/use-animatable-speed.js'; -import { useAnimatableUniform } from '../../react/hooks/use-animatable-uniform/use-animatable-uniform.js'; -import { useAspectUniform } from '../../react/hooks/use-aspect-uniform/use-aspect-uniform.js'; -import { useShaderContext } from '../../react/hooks/use-shader-context/use-shader-context.js'; -import { useStaticSceneHint } from '../../react/hooks/use-static-hint/use-static-hint.js'; -import { type ColorStop, colorStopsKey, toColorRampStops } from '../shared/color.js'; -import { type BandPalette, createAveragePass, createRampPass, smoothSeams } from './bands.js'; -import { createFlowPass, inlineVelocity, type PathSampler, traceFlow } from './flow.js'; -import { createPaintPass } from './paint.js'; - -// --------------------------------------------- -// Feel constants (provisional until the defaults gate) -// --------------------------------------------- -// Samples along each pixel's trace. Each step reads the flow twice for -// midpoint integration, then the paint and cached palette. To compare -// sampling quality at the same reach, increase this count and reduce -// STEP_LENGTH by the same factor. Increasing the count alone traces farther. -const STEP_COUNT = 12; - -// How far one step travels at swirl 1 where the flow runs at unit speed, in -// lattice cells (about one eddy each). STEP_COUNT x STEP_LENGTH is the -// nominal trace time at swirl 1. At 0.1, neighboring samples were far -// enough apart to draw separate paint contours around tight curls. 0.025 -// keeps the default trace shorter and its samples close enough to blend. -// Large swirl or step-length overrides can still expose separate samples. -const STEP_LENGTH = 0.025; - -// The smaller eddies' strength, 0..1. 0 leaves the broad currents alone. -// Raising it ripples finer swirls into them; at 0.5 they swirl as hard as -// the broad eddies. -const SMALL_EDDIES = 0.45; - -// How far the flow slides per unit of phase, in lattice cells, on top of -// the eddies morphing in place. 0 keeps the eddies where they are. -const SLIDE = 1; - -// Where thin streaks start fading to the bands' average color: the share of -// one whole pass of the stops a single pixel spans. The fade is complete at -// 1, where a pixel spans every stop and its true color is the average. -// Lower starts the fade sooner, which calms moving streaks at the cost of -// fine detail; higher keeps detail longer, and with it more shimmer. -const FADE_START = 0.25; - -// How much of each pixel's color comes from the average along its path, -// 0..1. 0 reads the bands once, where the trace ends, which folds sharp -// copies of them. 1 averages every point the trace passed, which streaks -// the colors along the current. -const SMEAR = 1; - -// How a pass of the stops meets the next. 0 snaps back to the first stop, -// as LinearGradient does, leaving a seam wherever the first and last stops -// differ. 1 runs every other pass backward, so each pass ends on the color -// the next one starts with and no seam forms. -const MIRROR = 1; - -// How far the paint shifts each point's place in the bands, in passes of -// the stops. The paint runs -1..1, so at 1 it can move a point a whole pass -// either way, which breaks the bands into blotches. 0 leaves plain bands. -const PAINT = 1; - -// How loudly the paint's finer layers speak, 0..1, each layer weighted this -// much times the one before. Low leaves soft blotches; high adds the fine -// detail the path average streaks along the current. -const PAINT_DETAIL = 0.6; - -/** - * TEMPORARY (build-phase tuning only): dev overrides for the feel - * constants. Stripped at the defaults gate. - */ -export interface SwirlGradientTuning { - /** - * Steps in each pixel's trace. Compiled into the shader, so a change - * rebuilds the material. - */ - steps?: number; - /** Distance one step travels at swirl 1, in lattice cells (about one eddy each). */ - stepLength?: number; - /** Strength of the smaller eddies, from 0 for none to 1. */ - smallEddies?: number; - /** - * How far the flow slides per unit of phase, in lattice cells, on top of - * the eddies morphing in place. - */ - slide?: number; - /** - * The share of one pass of the stops a pixel spans when streaks start - * fading to the average color, 0..1. - */ - fadeStart?: number; - /** - * How much of each pixel's color comes from the average along its path, - * from 0 for the trace's end alone to 1. - */ - smear?: number; - /** 0 snaps each pass back to the first stop; 1 mirrors every other pass. */ - mirror?: number; - /** How far the paint shifts each point along the bands, in passes. */ - paint?: number; - /** How loudly the paint's finer layers speak, 0..1. */ - paintDetail?: number; -} - -// The tuning rig's knobs, each falling back to its feel constant. ?? per -// knob, rather than spreading the overrides over a defaults object, so a -// knob passed as undefined still gets its constant. -function resolveTuning(tuning: SwirlGradientTuning = {}): Required { - return { - steps: tuning.steps ?? STEP_COUNT, - stepLength: tuning.stepLength ?? STEP_LENGTH, - smallEddies: tuning.smallEddies ?? SMALL_EDDIES, - slide: tuning.slide ?? SLIDE, - fadeStart: tuning.fadeStart ?? FADE_START, - smear: tuning.smear ?? SMEAR, - mirror: tuning.mirror ?? MIRROR, - paint: tuning.paint ?? PAINT, - paintDetail: tuning.paintDetail ?? PAINT_DETAIL, - }; -} - -export interface SwirlGradientShaderProps { - /** - * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions - * auto-space when omitted. - */ - stops: ColorStop[]; - /** - * Direction the bands run across, in degrees. 0 runs left to right, 90 - * runs bottom to top. Accepts a static value or an animation signal. - */ - angle: AnimatableProp; - /** - * How many times the stops run across the canvas. Each pass runs the stops - * in the same direction and snaps back to the first, so unless the first - * and last stop match there is a crisp seam at every band boundary, which - * the flow draws out into threads. Values at or below 1 render as a single - * pass. Accepts a static value or an animation signal. - */ - repeat: AnimatableProp; - /** - * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases - * each stop into the next across the whole space between them. Seams stay - * crisp at any softness. Accepts a static value or an animation signal. - */ - softness: AnimatableProp; - /** - * How far the flow carries the colors. 0 leaves the bands straight; higher - * values stretch and fold them further. Accepts a static value or an - * animation signal. - */ - swirl: AnimatableProp; - /** - * Roughly how many eddies span the canvas's height. Accepts a static value - * or an animation signal. - */ - scale: AnimatableProp; - /** - * How fast the flow drifts: its eddies form, merge, and dissolve, and the - * bands fold along with them. 0 holds the flow still. Accepts a static - * value or an animation signal. - */ - speed: AnimatableProp; - /** - * Picks a different flow with the same character. Each whole number gives - * an unrelated flow. - */ - seed: number; - /** Color space the bands are interpolated in. */ - colorSpace: ColorSpace; - /** Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert otherwise. */ - hueInterpolation: HueInterpolation; - /** TEMPORARY (build-phase tuning only). Stripped at the defaults gate. */ - tuning?: SwirlGradientTuning; -} - -export function SwirlGradientShader({ - stops, - angle, - repeat, - softness, - swirl, - scale, - speed, - seed, - colorSpace, - hueInterpolation, - tuning, -}: SwirlGradientShaderProps) { - const shaderContext = useShaderContext(); - - // A literal speed of 0 holds the flow still, so nothing on screen changes - // (an animation signal might move later, so it doesn't count). Telling - // the scene lets its frame scheduler park on the still frame instead of - // redrawing an unchanging image, as Grain does. - const isStatic = typeof speed === 'number' && speed === 0; - - useStaticSceneHint(isStatic); - - // useAnimatableSpeed sums speed x frame time into a phase uniform each - // frame. The flow's arrows turn by the phase, so changing speed changes - // the tempo without snapping the flow to where a time x speed product - // would put it. - const phaseUniform = useAnimatableSpeed(speed); - - // The animatable dials live in uniforms (values the CPU can update each - // frame without rebuilding the shader), tracking either a static number or - // an animation signal. - const angleUniform = useAnimatableUniform(angle); - const repeatUniform = useAnimatableUniform(repeat); - const softnessUniform = useAnimatableUniform(softness); - const swirlUniform = useAnimatableUniform(swirl); - const scaleUniform = useAnimatableUniform(scale); - - // Canvas width over height, so the eddies stay round on a wide canvas. - const aspectNode = useAspectUniform(); - - // The seed goes into the flow's hash, which reads it as a whole number 0 - // or above (stableHash truncates to u32, and u32 of a negative float is - // backend-defined). The uniform is created once and rewritten, so a new - // seed repaints without recompiling. The scene renders on demand, so poke - // it to show the change (the bare-uniform-write gotcha in - // docs/agents/tsl.md). - const seedUniform = useMemo(() => uniform(0), []); - - useEffect(() => { - seedUniform.value = Math.round(Math.abs(seed)); - shaderContext?.scheduler.requestRender(); - }, [shaderContext, seedUniform, seed]); - - // --------------------------------------------- - // Tuning (dev), stripped at the defaults gate - // --------------------------------------------- - // Each knob rides a uniform, like the props above, so its slider glides - // without a rebuild. The step count is the loop's bound, compiled into the - // shader, so it joins the build effect's deps instead. - const knobs = resolveTuning(tuning); - const stepCount = knobs.steps; - const stepLengthUniform = useAnimatableUniform(knobs.stepLength); - const smallEddiesUniform = useAnimatableUniform(knobs.smallEddies); - const slideUniform = useAnimatableUniform(knobs.slide); - const fadeStartUniform = useAnimatableUniform(knobs.fadeStart); - const smearUniform = useAnimatableUniform(knobs.smear); - const mirrorUniform = useAnimatableUniform(knobs.mirror); - const paintUniform = useAnimatableUniform(knobs.paint); - const paintDetailUniform = useAnimatableUniform(knobs.paintDetail); - - // Content fingerprint of the stops array (colors + positions). The build - // effect keys on this string, so a re-render that passes a new array with - // the same contents doesn't rebuild the material. - const stopsKey = colorStopsKey(stops); - - // --------------------------------------------- - // Build the material and mount the mesh - // --------------------------------------------- - // Runs once per mount, and again when the stops or color space change - // (colorRamp bakes the stop colors in as constants) or the step count does - // (the loop's bound). Every dial above flows through uniforms. - useEffect( - () => { - if (!shaderContext) return; - - // --------------------------------------------- - // Place the pixel in the flow - // --------------------------------------------- - // uv() is the pixel's position on the plane, 0..1 both ways. - // Subtracting 0.5 centers it, so changing the scale zooms around the - // middle of the canvas rather than its corner. x times the aspect - // ratio measures both axes in canvas heights, which keeps the eddies - // round on a wide canvas. Times scale, one lattice cell of the noise, - // about one eddy, spans 1/scale of the canvas's height. - const centered = uv().sub(vec2(0.5, 0.5)); - const flowPoint = vec2(centered.x.mul(aspectNode), centered.y).mul(scaleUniform); - - // The flow pass draws the flow's velocity into a texture before each - // frame, so a read costs one texel. Where the renderer can't draw half - // floats, each read works the velocity out from the noise instead, - // which looks the same and costs far more. - const flowInputs = { - seed: seedUniform, - smallEddies: smallEddiesUniform, - phase: phaseUniform, - slide: slideUniform, - }; - const flowPass = createFlowPass(shaderContext, flowInputs); - const velocityAt = flowPass?.velocityAt ?? inlineVelocity(flowInputs); - - // The paint pass draws the paint into a texture on the first frame and - // again only when the seed or its detail changes (./paint.ts). - const paintPass = createPaintPass(shaderContext, { - seed: seedUniform, - detail: paintDetailUniform, - }); - - // --------------------------------------------- - // Find the pixel's place in the bands - // --------------------------------------------- - // LinearGradient's projection at its default center: the angle becomes - // a unit direction, and the pixel's distance along it from the canvas - // center, plus 0.5, is its place on the ramp. At angle 0 that is plain - // u: 0 at the left edge, 1 at the right. - const angleRadians = angleUniform.mul(Math.PI / 180); - const direction = vec2(cos(angleRadians), sin(angleRadians)); - const pixelCoord = uv().sub(vec2(0.5, 0.5)).dot(direction).add(0.5); - - // The projection is a straight line, so a point some lattice cells - // away from the pixel sits that offset, dotted with coordPerCell, - // further along the ramp. coordPerCell undoes the placement's - // stretches in reverse to turn cells into uv: divide by scale, then x - // by the aspect. The max() keeps a scale of 0 from dividing by zero. - const safeScale = max(scaleUniform, 0.001); - const coordPerCell = vec2(direction.x.div(aspectNode), direction.y).div(safeScale); - - // A coordinate's place on the ramp, 0..1. Times repeat, it counts - // passes of the stops. fract() keeps the fractional part, a sawtooth - // that snaps back to the first stop each pass. The mirrored form is a - // triangle instead: fract(passes / 2) climbs 0..1 over two passes, x 2 - // - 1 makes that -1..1, and 1 - abs() folds it into 0 -> 1 -> 0, so - // every other pass runs backward. LinearGradient's repeat gate keeps a - // single pass, at repeat <= 1, as the plain coordinate. - const repeatGate = smoothstep(1, 1.01, repeatUniform); - const bandPosition = (coordinate: ShaderNodeObject) => { - const passes = coordinate.mul(repeatUniform); - const sawtooth = fract(passes); - const mirrored = fract(passes.mul(0.5)).mul(2).sub(1).abs().oneMinus(); - - return mix(coordinate, mix(sawtooth, mirrored, mirrorUniform), repeatGate); - }; - - // A point's place in the bands, before the sawtooth or triangle: the - // band coordinate there, shifted by the paint there. The paint runs - // -1..1, so `paint` is how many passes of the stops it can shift a - // point either way. - const paintedCoord = (bandCoord: ShaderNodeObject, point: ShaderNodeObject) => - bandCoord.add(paintPass.paintAt(point).mul(paintUniform)); - - // --------------------------------------------- - // Color each paint sample before mixing it - // --------------------------------------------- - const palette: BandPalette = { - stops: toColorRampStops(stops), - colorSpace, - hueInterpolation, - }; - const seamColors = { - first: palette.stops[0]?.color ?? vec3(0, 0, 0), - last: palette.stops[palette.stops.length - 1]?.color ?? vec3(0, 0, 0), - }; - const averagePass = createAveragePass(shaderContext, palette, softnessUniform); - const rampPass = createRampPass(shaderContext, palette); - - // A ramp coordinate is a position, not a color. Mapping the average - // position through a nonlinear ramp invents a middle color instead - // of mixing the colors the trace passed. Convert every sample to - // linear RGB first, then let traceFlow average those colors. - const colorAt = ( - coordinate: ShaderNodeObject, - averageColor: ShaderNodeObject, - ) => { - const position = bandPosition(coordinate); - - // fwidth measures the change across neighboring pixels. Measure - // the unfolded coordinate at each sample, before fract introduces - // a seam. Opposite slopes can cancel if averaged before this step, - // hiding thin bands that still need smoothing. - const footprint = fwidth(coordinate).mul(max(repeatUniform, 1)); - const edgeColor = smoothSeams( - rampPass.colorAt(position, softnessUniform, footprint), - position, - footprint, - seamColors, - repeatGate.mul(mirrorUniform.oneMinus()), - ); - const threadFade = smoothstep(fadeStartUniform, 1, footprint); - - return mix(edgeColor, averageColor, threadFade); - }; - - // --------------------------------------------- - // Trace it back, mixing the paint along the way - // --------------------------------------------- - // Pin the placement before the loop so each step only recomputes - // the part that depends on its offset. Each sample reads the paint, - // maps it through the palette, and smooths bands narrower than a pixel. - const sampleBandsAlongPath = (): PathSampler => { - const startPoint = flowPoint.toVar(); - const startCoord = pixelCoord.toVar(); - const perCell = coordPerCell.toVar(); - // This one-texel average is identical at every step. Read it once. - const averageColor = averagePass.color.toVar(); - - return (offset) => - colorAt( - paintedCoord(startCoord.add(offset.dot(perCell)), startPoint.add(offset)), - averageColor, - ); - }; - const liquidColor = traceFlow(flowPoint, { - steps: stepCount, - stepLength: swirlUniform.mul(stepLengthUniform), - velocityAt, - sampleAlongPath: sampleBandsAlongPath, - finishTrace: (offset, meanColor) => { - const endCoord = paintedCoord( - pixelCoord.add(offset.dot(coordPerCell)), - flowPoint.add(offset), - ); - - // Smear 0 shows the final point. Smear 1 mixes every sampled - // color in linear light. A zero-length trace samples one point - // throughout, so both ends of the dial give the same color. - return mix(colorAt(endCoord, averagePass.color), meanColor, smearUniform); - }, - }); - - // An unlit material whose per-pixel color comes from colorNode. - const material = new MeshBasicNodeMaterial(); - - material.colorNode = liquidColor; - - // A 2x2 plane exactly fills ShaderScene's camera view (-1..1 on both - // axes), so the bands cover the whole canvas. - const mesh = new Mesh(new PlaneGeometry(2, 2), material); - - shaderContext.scene.add(mesh); - - // A rebuild swaps the mesh without touching any uniform, and a still - // scene is parked, so poke it to draw the new material. - shaderContext.scheduler.requestRender(); - - return () => { - shaderContext.scene.remove(mesh); - flowPass?.dispose(); - paintPass.dispose(); - averagePass.dispose(); - rampPass.dispose(); - try { - material.dispose(); - } catch { - // three/webgpu can throw during dispose under Strict Mode double-invoke - } - try { - mesh.geometry.dispose(); - } catch { - // same - } - }; - }, - // stopsKey is a stable string proxy for the stops array; the array itself - // is intentionally omitted to avoid rebuilds on identity-only changes. - // Animatable uniforms are mutated in place. - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - shaderContext, - angleUniform, - repeatUniform, - softnessUniform, - swirlUniform, - scaleUniform, - aspectNode, - phaseUniform, - seedUniform, - stepLengthUniform, - smallEddiesUniform, - slideUniform, - fadeStartUniform, - smearUniform, - mirrorUniform, - paintUniform, - paintDetailUniform, - stepCount, - stopsKey, - colorSpace, - hueInterpolation, - ], - ); - - return null; -} diff --git a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx b/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx deleted file mode 100644 index c5616394..00000000 --- a/packages/shaders/src/components/swirl-gradient/swirl-gradient.tsx +++ /dev/null @@ -1,116 +0,0 @@ -'use client'; - -// Public face of the swirl gradient: owns the props, their JSDoc, and their -// defaults, then delegates to SwirlGradientShader (./shader.tsx), which -// folds LinearGradient's repeating bands along a flow, like paint swirled -// on water. Render it inside a . -import type { ColorSpace, HueInterpolation } from '../../engine.js'; -import type { AnimatableProp } from '../../react/hooks/animatable-signal/animatable-signal.js'; -import type { ColorStop } from '../shared/color.js'; -import { SwirlGradientShader, type SwirlGradientTuning } from './shader.js'; - -export type { ColorStop } from '../shared/color.js'; -export type { SwirlGradientTuning } from './shader.js'; - -export interface SwirlGradientProps { - /** - * Colors of the bands. Accepts hex, `oklch()`, or `oklab()`; positions - * auto-space when omitted. - */ - stops?: ColorStop[]; - /** - * Direction the bands run across, in degrees. 0 runs left to right, 90 - * runs bottom to top. Defaults to 0. Accepts a static value or an - * animation signal. - */ - angle?: AnimatableProp; - /** - * How many times the stops run across the canvas. Each pass runs the stops - * in the same direction and snaps back to the first, so unless the first - * and last stop match there is a crisp seam at every band boundary, which - * the flow draws out into threads. Values at or below 1 render as a single - * pass. Defaults to 2. Accepts a static value or an animation signal. - */ - repeat?: AnimatableProp; - /** - * How the colors meet. 0 gives hard bands, one flat band per stop; 1 eases - * each stop into the next across the whole space between them. Seams stay - * crisp at any softness. Defaults to 1. Accepts a static value or an - * animation signal. - */ - softness?: AnimatableProp; - /** - * How far the flow carries the colors. 0 leaves the bands straight; higher - * values stretch and fold them further. Defaults to 0.9. Accepts a static - * value or an animation signal. - */ - swirl?: AnimatableProp; - /** - * Roughly how many eddies span the canvas's height. Defaults to 1.5. Accepts - * a static value or an animation signal. - */ - scale?: AnimatableProp; - /** - * How fast the flow drifts: its eddies form, merge, and dissolve, and the - * bands fold along with them. 0 holds the flow still. Defaults to 0.15. - * Accepts a static value or an animation signal. - */ - speed?: AnimatableProp; - /** - * Picks a different flow with the same character. Each whole number gives - * an unrelated flow. Defaults to 0. - */ - seed?: number; - /** Color space the bands are interpolated in. Defaults to `'oklab'`. */ - colorSpace?: ColorSpace; - /** - * Hue arc for cylindrical color spaces (oklch/lch/hsl/hsv); inert - * otherwise. Defaults to `'shorter'`. - */ - hueInterpolation?: HueInterpolation; - /** - * TEMPORARY (build-phase tuning only): dev overrides for the flow's feel - * constants. Stripped at the defaults gate. Do not use. - */ - tuning?: SwirlGradientTuning; -} - -// Provisional palette until the defaults gate: blue -> violet -> purple, -// 55 degrees of hue, climbing about 0.15 to 0.26 in lightness per stop. The -// first and last stops differ, so each band ends in a crisp seam for the -// flow to draw out. -const DEFAULT_STOPS: ColorStop[] = [ - { color: 'oklch(0.303 0.152 265.847)' }, // paletteOklch.blue[3] - { color: 'oklch(0.460 0.248 293.328)' }, // paletteOklch.violet[6] - { color: 'oklch(0.720 0.250 320)' }, // paletteOklch.purple[9] -]; - -export function SwirlGradient({ - stops = DEFAULT_STOPS, - angle = 0, - repeat = 2, - softness = 1, - swirl = 0.9, - scale = 1.5, - speed = 0.15, - seed = 0, - colorSpace = 'oklab', - hueInterpolation = 'shorter', - tuning, -}: SwirlGradientProps) { - return ( - - ); -} diff --git a/scripts/build-posters.sh b/scripts/build-posters.sh index c89e386f..ae0a3a27 100755 --- a/scripts/build-posters.sh +++ b/scripts/build-posters.sh @@ -65,6 +65,7 @@ for pair in \ "radial-gradient:jpg" \ "god-rays:jpg:#0b0f1a" \ "conic-gradient:jpg" \ + "liquid-gradient:jpg" \ "dither:jpg" \ "voronoi:jpg" \ "fractal-noise:jpg" \ From 79aca4f4ff5cc3bb947889d3108ad3a8a57c275d Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Mon, 12 Oct 2026 06:19:54 -0400 Subject: [PATCH 6/6] test(shaders): count LiquidGradient's pre-pass draws, and add its changeset The visual spec can't tell a texture drawn once from one drawn every frame. The new tests count each pre-pass's draws across seed, softness, and phase changes, and check that Strict Mode leaves four registered. The changeset adds LiquidGradient to the next minor release. --- .changeset/liquid-gradient.md | 7 + .../liquid-gradient/liquid-gradient.test.tsx | 244 ++++++++++++++++++ 2 files changed, 251 insertions(+) create mode 100644 .changeset/liquid-gradient.md create mode 100644 packages/shaders/src/components/liquid-gradient/liquid-gradient.test.tsx diff --git a/.changeset/liquid-gradient.md b/.changeset/liquid-gradient.md new file mode 100644 index 00000000..dc9320d5 --- /dev/null +++ b/.changeset/liquid-gradient.md @@ -0,0 +1,7 @@ +--- +'@camp-dev/shaders': minor +--- + +Add `LiquidGradient`, a Source that streaks bands of color along slow, curling currents, like paint stirred into liquid. Mount it inside a `ShaderScene`. `stops`, `colorSpace`, and `hueInterpolation` pick the colors, as they do on `LinearGradient`. `angle` and `repeat` lay the bands out before the current moves them, and `softness` sets how the colors meet, from hard bands at 0 to full blends at 1. `swirl` sets how far the current carries the colors, `scale` sets roughly how many eddies span the canvas's height, and `speed` sets how fast the current drifts. Each of those six props takes a static value or an animation signal. `seed` picks a different layout with the same look. A literal `speed={0}` holds the current still and lets the scene park. It works in Mode 1 only. + +`LiquidGradient` draws the current, a noise field, and its palette into textures before the scene pass, and redraws each texture only when a prop it depends on changes. Where the renderer cannot draw into a half-float target, on WebGL2 without `EXT_color_buffer_float`, every read works its value out from the noise or the palette instead. The result looks the same and costs more GPU time. diff --git a/packages/shaders/src/components/liquid-gradient/liquid-gradient.test.tsx b/packages/shaders/src/components/liquid-gradient/liquid-gradient.test.tsx new file mode 100644 index 00000000..444e9323 --- /dev/null +++ b/packages/shaders/src/components/liquid-gradient/liquid-gradient.test.tsx @@ -0,0 +1,244 @@ +import { type ReactNode, StrictMode } from 'react'; + +import { render } from '@testing-library/react'; +import { type RenderTarget, Scene, type Texture, type WebGPURenderer } from 'three/webgpu'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import type { PrePass, SchedulerTick } from '../../engine.js'; +import { ShaderContext, type ShaderContextValue } from '../../react/context/shader-context.js'; +import { LiquidGradient } from './liquid-gradient.js'; + +// When LiquidGradient's pre-passes draw, never what the liquid looks like. +// The look is the demo page and apps/docs-tests/visual/liquid-gradient.spec.ts, +// which can't tell a texture drawn once from one drawn every frame. A stub +// renderer stands in for three's, as in aurora.test.tsx. +beforeEach(() => { + vi.stubGlobal('requestAnimationFrame', () => 0); + vi.stubGlobal('cancelAnimationFrame', () => {}); +}); +afterEach(() => { + vi.unstubAllGlobals(); + vi.restoreAllMocks(); +}); + +interface StubOptions { + /** WebGL2: whether EXT_color_buffer_float lets the renderer draw into float targets. */ + floatTargets?: boolean; +} + +/** A WebGL2 renderer on a device that allows textures 4096 texels a side. */ +function makeRenderer({ floatTargets = true }: StubOptions = {}) { + let boundTarget: RenderTarget | null = null; + + return { + render: vi.fn(), + setRenderTarget: vi.fn((target: RenderTarget | null) => { + boundTarget = target; + }), + getRenderTarget: vi.fn(() => boundTarget), + getPixelRatio: () => 2, + getDrawingBufferSize: (target: { set: (x: number, y: number) => unknown }) => + target.set(1600, 800), + backend: { + isWebGLBackend: true, + extensions: { has: (name: string) => floatTargets && name === 'EXT_color_buffer_float' }, + gl: { MAX_TEXTURE_SIZE: 0x0d33, getParameter: () => 4096 }, + }, + } as unknown as WebGPURenderer; +} + +/** + * A scene context whose registerPrePass records what LiquidGradient draws + * before the scene, and whose scheduler ticks only when a test says so. + */ +function makeScene(renderer: WebGPURenderer) { + const scene = new Scene(); + const prePasses: PrePass[] = []; + const removedPrePasses: PrePass[] = []; + const clients = new Set<(tick: SchedulerTick) => void>(); + const scheduler = { + idle: true, + add: vi.fn((client: (tick: SchedulerTick) => void) => { + clients.add(client); + }), + remove: vi.fn((client: (tick: SchedulerTick) => void) => { + clients.delete(client); + }), + requestRender: vi.fn(() => true), + setIdle: vi.fn(() => () => undefined), + onPhaseReset: vi.fn(() => () => undefined), + }; + const shaderContext = { + renderer: { three: renderer }, + scene, + camera: {}, + scheduler, + registerOverlay: () => () => undefined, + registerBaseUvTransform: () => () => undefined, + registerPrePass: (prePass: PrePass) => { + prePasses.push(prePass); + + return () => { + removedPrePasses.push(prePass); + }; + }, + canvasSize: { + get: () => [800, 400, 2], + on: () => () => undefined, + }, + timeGpu: () => () => undefined, + } as unknown as ShaderContextValue; + + function Wrapper({ children }: { children: ReactNode }) { + return ( + + {children} + + ); + } + + /** Advance every scheduler client by one frame of `delta` seconds. */ + const tick = (delta: number) => { + for (const client of clients) client({ delta, elapsed: delta } as SchedulerTick); + }; + + /** The pre-passes still registered: added and not yet removed. */ + const livePrePasses = () => prePasses.filter((prePass) => !removedPrePasses.includes(prePass)); + + return { Wrapper, scene, tick, livePrePasses }; +} + +/** Run a pre-pass and return the textures it drew into, none if it skipped. */ +function drawPrePass(renderer: WebGPURenderer, prePass: PrePass): Texture[] { + vi.mocked(renderer.setRenderTarget).mockClear(); + prePass(); + + // A draw binds its target, then puts back the one bound before, which is + // none here. + return vi + .mocked(renderer.setRenderTarget) + .mock.calls.flatMap(([target]) => (target ? [target.texture] : [])); +} + +// Each pass draws into a texture of its own size, which names it. +const PASS_BY_SIZE: Record = { + '257x257': 'flow', + '1025x1025': 'paint', + '1024x1': 'ramp', + '1x1': 'average', +}; + +/** + * Run every live pre-pass once, as the first frame does, and name each by + * the texture it drew. + */ +function drawFirstFrame(renderer: WebGPURenderer, live: PrePass[]) { + const passes: Record = {}; + + for (const prePass of live) { + const [drawn] = drawPrePass(renderer, prePass); + + if (!drawn) throw new Error('expected every pre-pass to draw on the first frame'); + const name = PASS_BY_SIZE[`${drawn.image.width}x${drawn.image.height}`]; + + if (!name) throw new Error('expected a texture the size of a known pass'); + passes[name] = prePass; + } + + return passes; +} + +/** How many times each named pre-pass draws on one frame. */ +function drawCounts(renderer: WebGPURenderer, passes: Record) { + return Object.fromEntries( + Object.entries(passes).map(([name, prePass]) => [name, drawPrePass(renderer, prePass).length]), + ); +} + +describe('LiquidGradient with half-float targets', () => { + // Strict Mode mounts, unmounts, and mounts again, so a leaked + // registration from the first mount would draw every texture twice. + it('registers one pre-pass each for the flow, the paint, the ramp, and the average', () => { + const renderer = makeRenderer(); + const scene = makeScene(renderer); + const { unmount } = render(, { wrapper: scene.Wrapper }); + const live = scene.livePrePasses(); + + expect(live).toHaveLength(4); + expect(Object.keys(drawFirstFrame(renderer, live)).sort()).toEqual([ + 'average', + 'flow', + 'paint', + 'ramp', + ]); + expect(scene.scene.children).toHaveLength(1); + + unmount(); + expect(scene.livePrePasses()).toHaveLength(0); + expect(scene.scene.children).toHaveLength(0); + }); + + // Other layers can keep the scene drawing while the liquid holds still, + // and each skipped draw saves a render pass. + it('skips every draw while nothing a texture depends on has changed', () => { + const renderer = makeRenderer(); + const scene = makeScene(renderer); + + render(, { wrapper: scene.Wrapper }); + const passes = drawFirstFrame(renderer, scene.livePrePasses()); + + expect(drawCounts(renderer, passes)).toEqual({ flow: 0, paint: 0, ramp: 0, average: 0 }); + }); + + it('redraws the flow and the paint once when the seed changes', () => { + const renderer = makeRenderer(); + const scene = makeScene(renderer); + const { rerender } = render(, { wrapper: scene.Wrapper }); + const passes = drawFirstFrame(renderer, scene.livePrePasses()); + + rerender(); + + expect(drawCounts(renderer, passes)).toEqual({ flow: 1, paint: 1, ramp: 0, average: 0 }); + expect(drawCounts(renderer, passes)).toEqual({ flow: 0, paint: 0, ramp: 0, average: 0 }); + }); + + it('redraws only the average once when softness changes', () => { + const renderer = makeRenderer(); + const scene = makeScene(renderer); + const { rerender } = render(, { wrapper: scene.Wrapper }); + const passes = drawFirstFrame(renderer, scene.livePrePasses()); + + rerender(); + + expect(drawCounts(renderer, passes)).toEqual({ flow: 0, paint: 0, ramp: 0, average: 1 }); + expect(drawCounts(renderer, passes)).toEqual({ flow: 0, paint: 0, ramp: 0, average: 0 }); + }); + + it('redraws only the flow on each frame the flow moves', () => { + const renderer = makeRenderer(); + const scene = makeScene(renderer); + + render(, { wrapper: scene.Wrapper }); + const passes = drawFirstFrame(renderer, scene.livePrePasses()); + + scene.tick(1 / 60); + expect(drawCounts(renderer, passes)).toEqual({ flow: 1, paint: 0, ramp: 0, average: 0 }); + + scene.tick(1 / 60); + expect(drawCounts(renderer, passes)).toEqual({ flow: 1, paint: 0, ramp: 0, average: 0 }); + }); +}); + +// Without half-float targets every read works its value out inline, so +// LiquidGradient still draws, only slower. +describe('LiquidGradient without half-float targets', () => { + it('registers no pre-pass and still draws its mesh', () => { + const renderer = makeRenderer({ floatTargets: false }); + const scene = makeScene(renderer); + + render(, { wrapper: scene.Wrapper }); + + expect(scene.livePrePasses()).toHaveLength(0); + expect(scene.scene.children).toHaveLength(1); + }); +});
+

+ {baseline ? 'LinearGradient baseline' : 'LiquidGradient'} + {still ? ' (still)' : ''} at {width} × {height} CSS px, pixel ratio capped at {pixelRatio}x.{' '} + card · full ·{' '} + 1x · 2x ·{' '} + still · baseline +

+
+ + {baseline ? : } + + + +
+