vireuikit 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -15
- package/dist/{chunk-BV5P6MF7.js → chunk-VY22O2II.js} +485 -46
- package/dist/chunk-VY22O2II.js.map +1 -0
- package/dist/{dynamics-DelasYER.d.cts → dynamics-DqGk_f1n.d.cts} +170 -14
- package/dist/{dynamics-DelasYER.d.ts → dynamics-DqGk_f1n.d.ts} +170 -14
- package/dist/index.cjs +434 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -4
- package/dist/index.d.ts +19 -4
- package/dist/index.js +1 -1
- package/dist/web/index.cjs +984 -145
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +63 -2
- package/dist/web/index.d.ts +63 -2
- package/dist/web/index.js +462 -13
- package/dist/web/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BV5P6MF7.js.map +0 -1
package/dist/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/web/medium.ts","../../src/web/medium-backdrop.ts"],"names":["phase"],"mappings":"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","file":"index.js","sourcesContent":["// The medium's runtime layer: ping-pong FBOs for the simulation grid and its GPU passes. Shader\n// text and parameters live in the package's model (`../medium`) — this file is WebGL only.\n//\n// Three independent buffers, not one: vapor (a conserved color reserve), condensate (droplets —\n// they grow, settle, and exchange with vapor) and tracks (born from a stamp, fade through decay).\n// Vapor and condensate form ONE conserved sum — water; tracks aren't part of it, and their decay\n// and stamping haven't been folded into that accounting.\nimport {\n depthFarOffsetPx,\n MEDIUM_COMPOSITE_SHADER,\n MEDIUM_CONDENSATE_CORRECT_SHADER,\n MEDIUM_CONDENSATE_FORWARD_SHADER,\n MEDIUM_CONDENSATE_REACT_SHADER,\n MEDIUM_DEFAULTS,\n MEDIUM_EMIT_SHADER,\n MEDIUM_RESAMPLE_SHADER,\n MEDIUM_SEED_SHADER,\n MEDIUM_TIME_PERIOD,\n MEDIUM_TRACK_ADVECT_SHADER,\n MEDIUM_VAPOR_CORRECT_SHADER,\n MEDIUM_VAPOR_FORWARD_SHADER,\n MEDIUM_VAPOR_REACT_SHADER,\n srgbToOklab,\n type VireUIKitMediumEmission,\n type VireUIKitMediumParams,\n} from '../medium';\nimport { toGLSL } from 'vireglass';\nimport {\n bindTextureAt,\n createFramebuffer,\n createProgram,\n createTexture,\n drawFullscreenTriangle,\n locationCache,\n setUniform,\n} from 'vireglass/web';\n\nexport type MediumRuntime = {\n /** Recreates the grid on the first call (seeding it); on a later call with a different size,\n * RESAMPLES the old vapor/condensate/track state into the new size instead of reseeding — see\n * `resizeGrid` below for why. A no-op when the size hasn't changed. */\n ensureGrid(gridWidth: number, gridHeight: number): void;\n /** One transport step for all three buffers (vapor and condensate via MacCormack:\n * forward/correct/react, see `advect-shader.ts`; tracks via a single backtrace plus decay),\n * ping-ponging their own FBOs. The field's phase (curl-noise's time axis) is this runtime's own\n * state, accumulated from `dt` — see `u_phase` below — not derived from a caller-supplied clock. */\n step(dt: number, params?: Partial<VireUIKitMediumParams>): void;\n /**\n * Stamps tracks into the TRACK buffer just refreshed by advection — via additive blending,\n * rather than a separate pass or its own position list. From there the same field carries them\n * and their own decay extinguishes them; there is no lifetime timer here.\n */\n emit(emissions: readonly VireUIKitMediumEmission[]): void;\n /**\n * Composites the current density (vapor + condensate + tracks) into a buffer already bound by\n * the caller (the renderer's `contentFbo`) — this is exactly how the medium acts as the second\n * backdrop path: the result lands in the same `contentTexture` the lens samples, not a separate\n * pass drawn over the glass.\n */\n composite(contentWidth: number, contentHeight: number, params?: Partial<VireUIKitMediumParams>): void;\n /** The raw density sum across every cell — a measurement hook, not part of the frame. Balance\n * and structure gates read THIS, not a composited pixel: compositing muddies things with Oklab\n * nonlinearity, and the water (vapor+condensate) sum and contrast need to be measurable on\n * their own. */\n readTotals(): { vapor: number; condensate: number; track: number } | null;\n /** The raw VAPOR grid, at simulation-grid resolution, `data` as r/g/b triples (three species)\n * per cell, not a sum. Used by the structure gate (contrast BETWEEN species across the grid). */\n readVaporGrid(): { cols: number; rows: number; data: number[] } | null;\n /** The raw CONDENSATE grid, at simulation-grid resolution, `data` as one density value per\n * cell (condensate has no color — see `readVaporGrid`'s r/g/b for the contrast). Used by the\n * gravity gate to find the density-weighted row where the mass sits. */\n readCondensateGrid(): { cols: number; rows: number; data: number[] } | null;\n destroy(): void;\n};\n\ntype DyeTarget = { texture: WebGLTexture; fbo: WebGLFramebuffer };\ntype DyePair = readonly [DyeTarget, DyeTarget];\n\n/** RGBA16F keeps decay from banding on its long tail; without `EXT_color_buffer_float` (float\n * render targets need it) this falls back to RGBA8 — coarser, but works everywhere. */\nfunction pickDyeFormat(gl: WebGL2RenderingContext): { internalFormat: number; type: number } {\n const hasFloat = gl.getExtension('EXT_color_buffer_float') !== null;\n return hasFloat\n ? { internalFormat: gl.RGBA16F, type: gl.HALF_FLOAT }\n : { internalFormat: gl.RGBA8, type: gl.UNSIGNED_BYTE };\n}\n\nexport function createMediumRuntime(gl: WebGL2RenderingContext, vertexSource: string): MediumRuntime {\n const format = pickDyeFormat(gl);\n\n const vaporForwardProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_FORWARD_SHADER));\n const vaporCorrectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_CORRECT_SHADER));\n const vaporReactProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_REACT_SHADER));\n const condensateForwardProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_FORWARD_SHADER));\n const condensateCorrectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_CORRECT_SHADER));\n const condensateReactProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_REACT_SHADER));\n const trackAdvectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_TRACK_ADVECT_SHADER));\n const compositeProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_COMPOSITE_SHADER));\n const seedProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_SEED_SHADER));\n const emitProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_EMIT_SHADER));\n const resampleProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_RESAMPLE_SHADER));\n\n const vaporForwardLoc = locationCache(gl, vaporForwardProgram);\n const vaporCorrectLoc = locationCache(gl, vaporCorrectProgram);\n const vaporReactLoc = locationCache(gl, vaporReactProgram);\n const condensateForwardLoc = locationCache(gl, condensateForwardProgram);\n const condensateCorrectLoc = locationCache(gl, condensateCorrectProgram);\n const condensateReactLoc = locationCache(gl, condensateReactProgram);\n const trackAdvectLoc = locationCache(gl, trackAdvectProgram);\n const compositeLoc = locationCache(gl, compositeProgram);\n const seedLoc = locationCache(gl, seedProgram);\n const emitLoc = locationCache(gl, emitProgram);\n const resampleLoc = locationCache(gl, resampleProgram);\n\n let gridW = 0;\n let gridH = 0;\n let vapor: DyePair | null = null;\n let condensate: DyePair | null = null;\n let track: DyePair | null = null;\n // MacCormack scratch buffers for a single frame, not ping-pong: each is fully overwritten by its\n // own pass and read again within the SAME step — no persistent state carried between frames.\n let vaporForward: DyeTarget | null = null;\n let vaporCorrected: DyeTarget | null = null;\n let condensateForward: DyeTarget | null = null;\n let condensateCorrected: DyeTarget | null = null;\n let front = 0;\n\n function makeTarget(w: number, h: number): DyeTarget {\n const texture = createTexture(gl, {\n width: w,\n height: h,\n internalFormat: format.internalFormat,\n type: format.type,\n // REPEAT: a domain with no border — see TextureOptions.wrap. All buffers carry the same\n // field, so the border needs to behave identically for each of them, or vapor would wrap\n // while condensate or a track at the same coordinate cuts off. The MacCormack limiter also\n // reads neighbors across this same border — it needs REPEAT exactly as much as transport does.\n wrap: gl.REPEAT,\n });\n const fbo = createFramebuffer(gl, texture);\n return { texture, fbo };\n }\n\n function clearTarget(target: DyeTarget, w: number, h: number): void {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo);\n gl.viewport(0, 0, w, h);\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n function destroyPair(pair: DyePair | null): void {\n if (!pair) return;\n for (const t of pair) {\n gl.deleteTexture(t.texture);\n gl.deleteFramebuffer(t.fbo);\n }\n }\n\n function destroyTarget(target: DyeTarget | null): void {\n if (!target) return;\n gl.deleteTexture(target.texture);\n gl.deleteFramebuffer(target.fbo);\n }\n\n function destroyTargets(): void {\n destroyPair(vapor);\n destroyPair(condensate);\n destroyPair(track);\n destroyTarget(vaporForward);\n destroyTarget(vaporCorrected);\n destroyTarget(condensateForward);\n destroyTarget(condensateCorrected);\n vapor = null;\n condensate = null;\n track = null;\n vaporForward = null;\n vaporCorrected = null;\n condensateForward = null;\n condensateCorrected = null;\n }\n\n // Three spots at fixed, spread-out grid points — the \"initial spots\", and the entire water\n // supply: it has no other source (the sum of vapor and condensate is conserved). Condensate and\n // tracks seed empty: only background condensation stamps into condensate on the first step, and\n // only `emit` stamps into tracks.\n function seed(w: number, h: number): void {\n if (!vapor || !condensate || !track) return;\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[front].fbo);\n gl.viewport(0, 0, w, h);\n gl.disable(gl.BLEND);\n gl.useProgram(seedProgram);\n setUniform(gl, seedLoc('u_resolution'), [w, h]);\n setUniform(gl, seedLoc('u_spot0'), [w * 0.28, h * 0.64]);\n setUniform(gl, seedLoc('u_spot1'), [w * 0.7, h * 0.32]);\n setUniform(gl, seedLoc('u_spot2'), [w * 0.48, h * 0.84]);\n setUniform(gl, seedLoc('u_spotRadius'), Math.max(w, h) * 0.18);\n drawFullscreenTriangle(gl);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n clearTarget(condensate[0], w, h);\n clearTarget(condensate[1], w, h);\n clearTarget(track[0], w, h);\n clearTarget(track[1], w, h);\n }\n\n /** Bilinear-resamples one buffer into a differently-sized target — see MEDIUM_RESAMPLE_SHADER. */\n function resample(src: DyeTarget, srcW: number, srcH: number, dst: DyeTarget, dstW: number, dstH: number): void {\n gl.bindFramebuffer(gl.FRAMEBUFFER, dst.fbo);\n gl.viewport(0, 0, dstW, dstH);\n gl.disable(gl.BLEND);\n gl.useProgram(resampleProgram);\n bindTextureAt(gl, 0, src.texture, resampleProgram, 'u_src');\n setUniform(gl, resampleLoc('u_srcSize'), [srcW, srcH]);\n setUniform(gl, resampleLoc('u_resolution'), [dstW, dstH]);\n drawFullscreenTriangle(gl);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n // A resize used to destroy every target and reseed from scratch — a phone rotation or a window\n // resize wiped the vapor back to its three initial spots and blinked condensate/tracks out, the\n // flicker the design forbids. Instead: bilinear-resample the OLD front buffers (the only ones\n // that carry real state — see the comment on the MacCormack scratch buffers above) into NEW,\n // differently-sized targets, then delete the old ones. Seeding stays a first-call-only thing.\n function resizeGrid(w: number, h: number): void {\n if (!vapor || !condensate || !track) return; // narrows for TS; callers already checked\n const oldVapor = vapor;\n const oldCondensate = condensate;\n const oldTrack = track;\n const oldW = gridW;\n const oldH = gridH;\n\n const newVaporFront = makeTarget(w, h);\n const newCondensateFront = makeTarget(w, h);\n const newTrackFront = makeTarget(w, h);\n resample(oldVapor[front], oldW, oldH, newVaporFront, w, h);\n resample(oldCondensate[front], oldW, oldH, newCondensateFront, w, h);\n resample(oldTrack[front], oldW, oldH, newTrackFront, w, h);\n\n destroyTargets();\n gridW = w;\n gridH = h;\n vapor = [newVaporFront, makeTarget(w, h)];\n condensate = [newCondensateFront, makeTarget(w, h)];\n track = [newTrackFront, makeTarget(w, h)];\n vaporForward = makeTarget(w, h);\n vaporCorrected = makeTarget(w, h);\n condensateForward = makeTarget(w, h);\n condensateCorrected = makeTarget(w, h);\n front = 0;\n\n // Total water scales with cell count, not just density: a bilinear resample roughly preserves\n // the AVERAGE value per cell, so the SUM over every cell scales with how many cells there now\n // are. Rescaling the EXISTING target (rather than re-measuring the just-resampled buffers)\n // keeps the invariant exact even if the resample itself is slightly lossy at the edges — the\n // periodic renormalization below already self-corrects any residual, and it needs a real\n // target to correct TOWARD rather than one that already baked in this resize's own error.\n // `timeSinceRenorm`/`framesSinceRenorm` are left running: the interval they measure doesn't\n // care about grid size, only about how much correction accumulated frame to frame.\n const areaRatio = (w * h) / (oldW * oldH);\n waterTargetTotal *= areaRatio;\n }\n\n function ensureGrid(gridWidth: number, gridHeight: number): void {\n const w = Math.max(2, Math.round(gridWidth));\n const h = Math.max(2, Math.round(gridHeight));\n if (vapor && condensate && track && w === gridW && h === gridH) return;\n\n if (!vapor || !condensate || !track) {\n gridW = w;\n gridH = h;\n vapor = [makeTarget(w, h), makeTarget(w, h)];\n condensate = [makeTarget(w, h), makeTarget(w, h)];\n track = [makeTarget(w, h), makeTarget(w, h)];\n vaporForward = makeTarget(w, h);\n vaporCorrected = makeTarget(w, h);\n condensateForward = makeTarget(w, h);\n condensateCorrected = makeTarget(w, h);\n front = 0;\n seed(w, h);\n // The target water total — right after seeding, before the first step: this is \"the entire\n // supply\" (see the comment on `seed`), and every later renormalization checks against it.\n // Right after seeding condensate is empty, so the target equals the vapor sum — but it's\n // re-verified every time as vapor+condensate, not just vapor, in case the initial state ever\n // changes.\n waterTargetTotal = readTarget(vapor[front]) + readTarget(condensate[front]);\n waterScale = 1;\n timeSinceRenorm = 0;\n framesSinceRenorm = 0;\n return;\n }\n\n resizeGrid(w, h);\n }\n\n /** Shared velocity-field uniforms — one set for both phases' forward/correct passes and for\n * tracks (condensate adds its own gravity on top — see `u_settleSpeed` where it's declared).\n * The react passes don't mind them either: the extra `loc()` calls for curl uniforms that don't\n * exist there just return null, and `setUniform` silently skips them. */\n function bindVelocityUniforms(\n loc: (name: string) => WebGLUniformLocation | null,\n dt: number,\n phase: number,\n p: VireUIKitMediumParams,\n ): void {\n setUniform(gl, loc('u_dyeSize'), [gridW, gridH]);\n setUniform(gl, loc('u_resolution'), [gridW, gridH]);\n setUniform(gl, loc('u_dt'), dt);\n setUniform(gl, loc('u_phase'), phase);\n setUniform(gl, loc('u_curlFreq'), p.curlFreq);\n setUniform(gl, loc('u_advectSpeed'), p.advectSpeed);\n setUniform(gl, loc('u_turbulence'), p.turbulence);\n // Only the vapor forward/correct programs declare u_vaporDrift; elsewhere loc() returns null\n // and setUniform silently skips it, same as the curl uniforms already do for the react passes.\n setUniform(gl, loc('u_vaporDrift'), p.gravityVaporDrift);\n }\n\n // The field's phase — curl-noise's time axis, accumulated here in float64 rather than derived\n // from an ever-growing caller-supplied clock, and wrapped at MEDIUM_TIME_PERIOD (noise.ts's\n // MEDIUM_TIME_OCTAVES makes that wrap exact, not approximate). Sending a raw, ever-growing\n // `time * curlSpeed` product to the GPU as a float32 uniform eventually loses the bits that\n // place a point within its own lattice cell — after hours of playback the field would visibly\n // jitter in place. Wrapping the ACCUMULATOR keeps its magnitude bounded, and because the rate is\n // baked in incrementally rather than multiplied in fresh every frame, changing `curlSpeed` at\n // runtime changes the slope going forward instead of rescaling everything already accumulated —\n // no jump.\n let phase = 0;\n\n function wrapPhase(value: number): number {\n const wrapped = value % MEDIUM_TIME_PERIOD;\n return wrapped < 0 ? wrapped + MEDIUM_TIME_PERIOD : wrapped;\n }\n\n // A semi-Lagrangian gather over a non-uniform velocity has no obligation to conserve the sum by\n // itself, and neither does the vapor<->condensate exchange at non-integer rounding exponents\n // (not a boundary or step-size issue — at zero advection and zero exchange there's no loss at\n // all); rather than change the scheme, once a second the WATER sum (vapor+condensate) is checked\n // against its target and the correction is spread as an EQUAL multiplier over the frames of the\n // next interval (an Nth root — otherwise an N-fold ratio would overshoot the target instead of\n // reaching it).\n const WATER_RENORM_INTERVAL_S = 1;\n let waterTargetTotal = 0;\n let waterScale = 1;\n let timeSinceRenorm = 0;\n let framesSinceRenorm = 0;\n\n function step(dt: number, params: Partial<VireUIKitMediumParams> = {}): void {\n if (\n !vapor ||\n !condensate ||\n !track ||\n !vaporForward ||\n !vaporCorrected ||\n !condensateForward ||\n !condensateCorrected\n ) {\n return;\n }\n const p = { ...MEDIUM_DEFAULTS, ...params };\n // dt is clamped: a tab returning from the background would otherwise carry advection past the\n // grid's bounds in one jump, sweeping all the smoke to an edge in a single frame.\n const clampedDt = Math.min(Math.max(dt, 0), 1 / 15);\n // Advance and wrap the phase BEFORE using it this frame — see the comment on `phase` above.\n phase = wrapPhase(phase + clampedDt * p.curlSpeed);\n const back = front === 0 ? 1 : 0;\n const gridSize: readonly [number, number] = [gridW, gridH];\n\n // --- Transport: MacCormack splits each phase into forward/correct, both phases independently\n // (only the react pass below reads the partner, and only on already grid-aligned values). ---\n\n gl.viewport(0, 0, gridW, gridH);\n gl.disable(gl.BLEND);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vaporForward.fbo);\n gl.useProgram(vaporForwardProgram);\n bindTextureAt(gl, 0, vapor[front].texture, vaporForwardProgram, 'u_dye');\n bindVelocityUniforms(vaporForwardLoc, clampedDt, phase, p);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensateForward.fbo);\n gl.useProgram(condensateForwardProgram);\n bindTextureAt(gl, 0, condensate[front].texture, condensateForwardProgram, 'u_dye');\n bindVelocityUniforms(condensateForwardLoc, clampedDt, phase, p);\n setUniform(gl, condensateForwardLoc('u_settleSpeed'), p.condensateSettleSpeed);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vaporCorrected.fbo);\n gl.useProgram(vaporCorrectProgram);\n bindTextureAt(gl, 0, vapor[front].texture, vaporCorrectProgram, 'u_dye');\n bindTextureAt(gl, 1, vaporForward.texture, vaporCorrectProgram, 'u_forward');\n // bindTextureAt only binds the sampler, not its auto uniform size (the transpiler generates a\n // <name>Size for every `uniform shader`) — the second (cross-) sampler needs its own size set\n // separately, or it silently stays (0,0) and `.eval()` divides the coordinate by zero.\n setUniform(gl, vaporCorrectLoc('u_forwardSize'), gridSize);\n bindVelocityUniforms(vaporCorrectLoc, clampedDt, phase, p);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensateCorrected.fbo);\n gl.useProgram(condensateCorrectProgram);\n bindTextureAt(gl, 0, condensate[front].texture, condensateCorrectProgram, 'u_dye');\n bindTextureAt(gl, 1, condensateForward.texture, condensateCorrectProgram, 'u_forward');\n setUniform(gl, condensateCorrectLoc('u_forwardSize'), gridSize);\n bindVelocityUniforms(condensateCorrectLoc, clampedDt, phase, p);\n setUniform(gl, condensateCorrectLoc('u_settleSpeed'), p.condensateSettleSpeed);\n drawFullscreenTriangle(gl);\n\n // --- Reaction: vapor<->condensate exchange and droplet growth, on the already transported\n // (MacCormack) fields, with the partner read directly at its OWN point xy — both fields are\n // already grid-aligned. ---\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[back].fbo);\n gl.useProgram(vaporReactProgram);\n bindTextureAt(gl, 0, vaporCorrected.texture, vaporReactProgram, 'u_transported');\n bindTextureAt(gl, 1, condensateCorrected.texture, vaporReactProgram, 'u_condensateTransported');\n setUniform(gl, vaporReactLoc('u_transportedSize'), gridSize);\n setUniform(gl, vaporReactLoc('u_condensateTransportedSize'), gridSize);\n setUniform(gl, vaporReactLoc('u_resolution'), gridSize);\n setUniform(gl, vaporReactLoc('u_dt'), clampedDt);\n setUniform(gl, vaporReactLoc('u_condensationRate'), p.condensationRate);\n setUniform(gl, vaporReactLoc('u_condensationFloor'), p.condensationFloor);\n setUniform(gl, vaporReactLoc('u_evaporationRate'), p.evaporationRate);\n setUniform(gl, vaporReactLoc('u_totalScale'), waterScale);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensate[back].fbo);\n gl.useProgram(condensateReactProgram);\n bindTextureAt(gl, 0, condensateCorrected.texture, condensateReactProgram, 'u_transported');\n bindTextureAt(gl, 1, vaporCorrected.texture, condensateReactProgram, 'u_vaporTransported');\n // Growth reads the neighbors of its OWN cell xy in the ORIGINAL (pre-transport-this-frame)\n // condensate — see the comment in advect-shader.ts on MEDIUM_CONDENSATE_REACT_SHADER — so the\n // third sampler is the old front buffer.\n bindTextureAt(gl, 2, condensate[front].texture, condensateReactProgram, 'u_dye');\n setUniform(gl, condensateReactLoc('u_transportedSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_vaporTransportedSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_dyeSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_resolution'), gridSize);\n setUniform(gl, condensateReactLoc('u_dt'), clampedDt);\n setUniform(gl, condensateReactLoc('u_condensationRate'), p.condensationRate);\n setUniform(gl, condensateReactLoc('u_condensationFloor'), p.condensationFloor);\n setUniform(gl, condensateReactLoc('u_evaporationRate'), p.evaporationRate);\n setUniform(gl, condensateReactLoc('u_spreadRate'), p.condensateSpreadRate);\n setUniform(gl, condensateReactLoc('u_totalScale'), waterScale);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, track[back].fbo);\n gl.useProgram(trackAdvectProgram);\n bindTextureAt(gl, 0, track[front].texture, trackAdvectProgram, 'u_dye');\n bindVelocityUniforms(trackAdvectLoc, clampedDt, phase, p);\n setUniform(gl, trackAdvectLoc('u_decay'), p.decay);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n front = back;\n framesSinceRenorm += 1;\n\n timeSinceRenorm += clampedDt;\n if (waterTargetTotal > 0 && timeSinceRenorm >= WATER_RENORM_INTERVAL_S && framesSinceRenorm > 0) {\n const current = readTarget(vapor[front]) + readTarget(condensate[front]);\n if (current > 1e-6) {\n // The Nth root: applied N times in a row (N frames of the past interval) has to PRODUCE\n // the ratio target/current, not apply that ratio in EACH frame — otherwise one second's\n // correction would fire N times and overshoot the target instead of reaching it.\n const totalRatio = waterTargetTotal / current;\n const perFrame = Math.pow(totalRatio, 1 / framesSinceRenorm);\n waterScale = Math.min(1.05, Math.max(0.95, perFrame));\n }\n timeSinceRenorm = 0;\n framesSinceRenorm = 0;\n }\n }\n\n // Stamping goes into the TRACK buffer (the one advection just wrote) via additive blending,\n // exactly as track stamping requires: not a separate pass, not its own buffer, not water.\n function emit(emissions: readonly VireUIKitMediumEmission[]): void {\n if (!track || emissions.length === 0) return;\n const minDim = Math.min(gridW, gridH);\n gl.bindFramebuffer(gl.FRAMEBUFFER, track[front].fbo);\n gl.viewport(0, 0, gridW, gridH);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE);\n gl.useProgram(emitProgram);\n // The flip-convention comment above doesn't apply here: the shader never reads its own\n // previous frame (no `.eval()`), so there's nothing to flip — but the transpiler always\n // requires u_resolution regardless (see `targets/glsl.ts`: the entry coordinate goes through\n // it unconditionally).\n setUniform(gl, emitLoc('u_resolution'), [gridW, gridH]);\n for (const e of emissions) {\n const source: [number, number] = [e.source[0] * gridW, e.source[1] * gridH];\n const length = e.lengthFrac * minDim;\n const head: [number, number] = [\n source[0] + Math.cos(e.angle) * length,\n source[1] + Math.sin(e.angle) * length,\n ];\n setUniform(gl, emitLoc('u_source'), source);\n setUniform(gl, emitLoc('u_head'), head);\n setUniform(gl, emitLoc('u_headWidth'), e.headWidthFrac * minDim);\n setUniform(gl, emitLoc('u_tailWidth'), e.tailWidthFrac * minDim);\n setUniform(gl, emitLoc('u_raggedAmp'), e.raggedFrac * minDim);\n setUniform(gl, emitLoc('u_raggedFreq'), e.raggedFreq);\n setUniform(gl, emitLoc('u_settle'), e.settleFrac * minDim);\n setUniform(gl, emitLoc('u_tailDim'), e.tailDim);\n setUniform(gl, emitLoc('u_intensity'), e.intensity);\n setUniform(gl, emitLoc('u_seed'), e.seed);\n setUniform(gl, emitLoc('u_channelMask'), e.channel);\n drawFullscreenTriangle(gl);\n }\n gl.disable(gl.BLEND);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n function composite(\n contentWidth: number,\n contentHeight: number,\n params: Partial<VireUIKitMediumParams> = {},\n ): void {\n if (!vapor || !condensate || !track) return;\n const p = { ...MEDIUM_DEFAULTS, ...params };\n gl.viewport(0, 0, contentWidth, contentHeight);\n gl.disable(gl.BLEND);\n gl.useProgram(compositeProgram);\n bindTextureAt(gl, 0, vapor[front].texture, compositeProgram, 'u_vapor');\n bindTextureAt(gl, 1, condensate[front].texture, compositeProgram, 'u_condensate');\n bindTextureAt(gl, 2, track[front].texture, compositeProgram, 'u_track');\n setUniform(gl, compositeLoc('u_vaporSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_condensateSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_trackSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_resolution'), [contentWidth, contentHeight]);\n setUniform(gl, compositeLoc('u_dyeScale'), [gridW / contentWidth, gridH / contentHeight]);\n // The palette's forward direction (sRGB → Oklab) — here, once per frame (frame constants),\n // not in the shader per pixel (see the comment in composite-shader.ts).\n setUniform(gl, compositeLoc('u_lab0'), srgbToOklab(p.channelColors[0]));\n setUniform(gl, compositeLoc('u_lab1'), srgbToOklab(p.channelColors[1]));\n setUniform(gl, compositeLoc('u_lab2'), srgbToOklab(p.channelColors[2]));\n setUniform(gl, compositeLoc('u_labBg'), srgbToOklab(p.baseColor));\n setUniform(gl, compositeLoc('u_labCondensate'), srgbToOklab(p.condensateColor));\n setUniform(gl, compositeLoc('u_baseWeight'), p.baseWeight);\n setUniform(gl, compositeLoc('u_condensateTint'), p.condensateTint);\n setUniform(gl, compositeLoc('u_condensateGain'), p.condensateGain);\n setUniform(gl, compositeLoc('u_farScale'), p.depthFarScale);\n // Resolved against the GRID's own size (baseSrc is already grid-px), not content size — a\n // fixed fraction of a wrapping axis, not a fixed pixel count (see depthFarOffsetPx's own\n // comment for why a fixed grid-px value doesn't survive every grid size).\n setUniform(gl, compositeLoc('u_farOffset'), depthFarOffsetPx(p.depthFarOffsetFrac, gridW, gridH));\n setUniform(gl, compositeLoc('u_farBlurRadius'), p.depthFarBlurRadius);\n setUniform(gl, compositeLoc('u_farWeight'), p.depthFarWeight);\n setUniform(gl, compositeLoc('u_gravityBoost'), p.gravityBottomBoost);\n setUniform(gl, compositeLoc('u_gravityBoostStart'), p.gravityBottomBoostStart);\n drawFullscreenTriangle(gl);\n }\n\n function readTarget(target: DyeTarget): number {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo);\n let sum = 0;\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(gridW * gridH * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < buf.length; i += 4) sum += buf[i] + buf[i + 1] + buf[i + 2];\n } else {\n const buf = new Uint8Array(gridW * gridH * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < buf.length; i += 4) sum += (buf[i] + buf[i + 1] + buf[i + 2]) / 255;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return sum;\n }\n\n function readTotals(): { vapor: number; condensate: number; track: number } | null {\n if (!vapor || !condensate || !track) return null;\n return {\n vapor: readTarget(vapor[front]),\n condensate: readTarget(condensate[front]),\n track: readTarget(track[front]),\n };\n }\n\n // Three numbers per cell (r/g/b of the three vapor species), not a sum: the structure gate\n // (medium-structure-gate.mjs) measures contrast BETWEEN species — a summed density would lose it.\n function readVaporGrid(): { cols: number; rows: number; data: number[] } | null {\n if (!vapor) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[front].fbo);\n const cells = gridW * gridH;\n const data = new Array(cells * 3);\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < cells; i += 1) {\n data[i * 3] = buf[i * 4];\n data[i * 3 + 1] = buf[i * 4 + 1];\n data[i * 3 + 2] = buf[i * 4 + 2];\n }\n } else {\n const buf = new Uint8Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < cells; i += 1) {\n data[i * 3] = buf[i * 4] / 255;\n data[i * 3 + 1] = buf[i * 4 + 1] / 255;\n data[i * 3 + 2] = buf[i * 4 + 2] / 255;\n }\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { cols: gridW, rows: gridH, data };\n }\n\n // One number per cell, not three: condensate has no color of its own (density lives in .r,\n // g/b unused — see MEDIUM_CONDENSATE_REACT_SHADER). A gravity gate reads THIS, row-weighting the\n // density to find where the mass sits, without decoding an RGB triple that's two-thirds padding.\n function readCondensateGrid(): { cols: number; rows: number; data: number[] } | null {\n if (!condensate) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensate[front].fbo);\n const cells = gridW * gridH;\n const data = new Array(cells);\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4];\n } else {\n const buf = new Uint8Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4] / 255;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { cols: gridW, rows: gridH, data };\n }\n\n function destroy(): void {\n destroyTargets();\n gl.deleteProgram(vaporForwardProgram);\n gl.deleteProgram(vaporCorrectProgram);\n gl.deleteProgram(vaporReactProgram);\n gl.deleteProgram(condensateForwardProgram);\n gl.deleteProgram(condensateCorrectProgram);\n gl.deleteProgram(condensateReactProgram);\n gl.deleteProgram(trackAdvectProgram);\n gl.deleteProgram(compositeProgram);\n gl.deleteProgram(seedProgram);\n gl.deleteProgram(emitProgram);\n gl.deleteProgram(resampleProgram);\n }\n\n return { ensureGrid, step, emit, composite, readTotals, readVaporGrid, readCondensateGrid, destroy };\n}\n","import {\n FULLSCREEN_TRIANGLE_VERTEX_SOURCE,\n type VireGlassBackdropPass,\n} from 'vireglass/web';\nimport type { VireUIKitMediumEmission, VireUIKitMediumParams } from '../medium';\nimport { createMediumRuntime, type MediumRuntime } from './medium';\n\n/** The simulation grid — its own resolution, coarser than the frame. `dt` is the caller's clock:\n * pausing on `prefers-reduced-motion` and testability both stay on its side. There is no `time`\n * field — the field's phase is the runtime's own accumulated state (see `u_phase` in\n * `web/medium.ts`), not something the caller has to track across an arbitrarily long session. */\nexport type MediumFrame = {\n gridWidth: number;\n gridHeight: number;\n dt: number;\n params?: Partial<VireUIKitMediumParams>;\n /** Tracks stamped this frame; `createMediumDynamics` schedules them. */\n emissions?: readonly VireUIKitMediumEmission[];\n};\n\nexport type MediumBackdrop = {\n /** The VireGlass renderer's backdrop for this frame: steps the medium and composites it into\n * the lens's texture. */\n pass(frame: MediumFrame): VireGlassBackdropPass;\n /** Measurement hooks for balance and structure gates; `null` until the medium has rendered once. */\n readTotals(): { vapor: number; condensate: number; track: number } | null;\n readVaporGrid(): { cols: number; rows: number; data: number[] } | null;\n readCondensateGrid(): { cols: number; rows: number; data: number[] } | null;\n destroy(): void;\n};\n\nexport function createMediumBackdrop(): MediumBackdrop {\n let runtime: MediumRuntime | null = null;\n let owner: WebGL2RenderingContext | null = null;\n\n return {\n pass: (frame) => (gl, target) => {\n if (owner && owner !== gl) throw new Error('vireuikit: the medium is already bound to another WebGL context');\n owner = gl;\n runtime ??= createMediumRuntime(gl, FULLSCREEN_TRIANGLE_VERTEX_SOURCE);\n runtime.ensureGrid(frame.gridWidth, frame.gridHeight);\n runtime.step(frame.dt, frame.params);\n runtime.emit(frame.emissions ?? []);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n runtime.composite(target.width, target.height, frame.params);\n },\n readTotals: () => runtime?.readTotals() ?? null,\n readVaporGrid: () => runtime?.readVaporGrid() ?? null,\n readCondensateGrid: () => runtime?.readCondensateGrid() ?? null,\n destroy: () => {\n runtime?.destroy();\n runtime = null;\n owner = null;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/web/track-layer.ts","../../src/web/track-layer-gl.ts","../../src/web/medium.ts","../../src/web/medium-backdrop.ts"],"names":["locationCache","setUniform","bindTextureAt","phase"],"mappings":"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","file":"index.js","sourcesContent":["// The crisp, screen-space track layer's CPU half: a live-track list fed by the same emissions the\n// grid stamp (`emit-shader.ts`) receives. No GL here, so the aging/drift/fade math is testable\n// without a WebGL2 context; `web/track-layer-gl.ts` turns the list into an instanced draw.\nimport {\n MEDIUM_TRACK_LAYER_BURST_ACCENT,\n MEDIUM_TRACK_LAYER_BURST_SPREAD,\n MEDIUM_TRACK_LAYER_CURL_PUSH,\n MEDIUM_TRACK_LAYER_FADE_GAMMA,\n MEDIUM_TRACK_LAYER_GRAVITY_SAG,\n MEDIUM_TRACK_LAYER_LIFE_SECONDS,\n MEDIUM_TRACK_LAYER_MAX_TRACKS,\n type VireUIKitMediumEmission,\n} from '../medium';\nimport { vgPotentialJS } from '../medium/noise';\n\n/** One track alive in the crisp layer: the original emission (never mutated) plus its age and\n * drift. */\nexport type VireUIKitLiveTrack = {\n emission: VireUIKitMediumEmission;\n /** Seconds since the track appeared. Negative while a burst ray is still waiting for its turn. */\n age: number;\n /** Accumulated rigid drift, as a fraction of `min(contentWidth, contentHeight)`. */\n driftX: number;\n driftY: number;\n};\n\n/** `(1 - age/life) ** gamma`, reaching exactly 0 at `age >= life`, so dropping a track never pops. */\nexport function trackLayerFade(age: number, life: number): number {\n if (life <= 0) return 0;\n const t = Math.min(Math.max(age / life, 0), 1);\n return (1 - t) ** MEDIUM_TRACK_LAYER_FADE_GAMMA;\n}\n\n/** Diffusion: droplets spread sideways as `sqrt(age)`, the way an ink line blurs. */\nexport function trackLayerSigmaMul(age: number, broaden: number): number {\n return Math.sqrt(1 + broaden * Math.max(age, 0));\n}\n\nfunction hash01(n: number): number {\n const s = Math.sin(n * 91.3458) * 47453.5453;\n return s - Math.floor(s);\n}\n\nfunction curlVelocityJS(px: number, py: number, phase: number): readonly [number, number] {\n const e = 0.6;\n const px1 = vgPotentialJS(px + e, py, phase);\n const px0 = vgPotentialJS(px - e, py, phase);\n const py1 = vgPotentialJS(px, py + e, phase);\n const py0 = vgPotentialJS(px, py - e, phase);\n return [(py1 - py0) / (2 * e), -(px1 - px0) / (2 * e)];\n}\n\nconst CURL_SAMPLE_SCALE = 40;\nconst PHASE_WRAP = 10_000;\n\nexport type VireUIKitTrackLayer = {\n /**\n * Ages and drifts every live track by `dt`, drops anything past its own life, appends\n * `emissions` as fresh tracks and caps the list at `MEDIUM_TRACK_LAYER_MAX_TRACKS` (oldest out).\n * Alpha rays arriving in one call are one burst: the first few appear at once, the rest are born\n * over `MEDIUM_TRACK_LAYER_BURST_SPREAD` seconds.\n */\n step(dt: number, emissions: readonly VireUIKitMediumEmission[]): readonly VireUIKitLiveTrack[];\n};\n\nexport function createTrackLayer(): VireUIKitTrackLayer {\n let tracks: VireUIKitLiveTrack[] = [];\n let phase = 0;\n\n function step(dt: number, emissions: readonly VireUIKitMediumEmission[]): readonly VireUIKitLiveTrack[] {\n phase = (phase + dt) % PHASE_WRAP;\n\n const next: VireUIKitLiveTrack[] = [];\n for (const track of tracks) {\n const life = MEDIUM_TRACK_LAYER_LIFE_SECONDS[track.emission.kind];\n const age = track.age + dt;\n if (age >= life) continue;\n if (age <= 0) {\n next.push({ ...track, age });\n continue;\n }\n\n const midX = track.emission.source[0] + Math.cos(track.emission.angle) * track.emission.lengthFrac * 0.5;\n const midY = track.emission.source[1] + Math.sin(track.emission.angle) * track.emission.lengthFrac * 0.5;\n const [curlX, curlY] = curlVelocityJS(midX * CURL_SAMPLE_SCALE, midY * CURL_SAMPLE_SCALE, phase);\n const activeDt = Math.min(dt, age);\n\n next.push({\n emission: track.emission,\n age,\n driftX: track.driftX + curlX * MEDIUM_TRACK_LAYER_CURL_PUSH * activeDt,\n driftY: track.driftY + (curlY * MEDIUM_TRACK_LAYER_CURL_PUSH - MEDIUM_TRACK_LAYER_GRAVITY_SAG) * activeDt,\n });\n }\n let burstIndex = 0;\n for (const emission of emissions) {\n let age = 0;\n if (emission.kind === 'alpha') {\n if (burstIndex >= MEDIUM_TRACK_LAYER_BURST_ACCENT) {\n age = -hash01(emission.seed * 3.17 + burstIndex) * MEDIUM_TRACK_LAYER_BURST_SPREAD;\n }\n burstIndex += 1;\n }\n next.push({ emission, age, driftX: 0, driftY: 0 });\n }\n\n tracks = next.length > MEDIUM_TRACK_LAYER_MAX_TRACKS\n ? next.slice(next.length - MEDIUM_TRACK_LAYER_MAX_TRACKS)\n : next;\n return tracks;\n }\n\n return { step };\n}\n","// The crisp track layer's GPU half: one instanced, additive quad per live track, drawn into the\n// backdrop's target right after the fullscreen composite. Raw GLSL ES 3.0 rather than the\n// transpiled shader dialect, which only draws fullscreen passes; the Android port needs its own path.\nimport { bindTextureAt, locationCache, setUniform } from 'vireglass/web';\nimport {\n MEDIUM_TRACK_LAYER_LIFE_SECONDS,\n MEDIUM_TRACK_LAYER_LOOK,\n type VireUIKitMediumLight,\n} from '../medium';\nimport { trackLayerFade, trackLayerSigmaMul, type VireUIKitLiveTrack } from './track-layer';\n\nconst TRACK_LAYER_VERTEX_SOURCE = `#version 300 es\nlayout(location = 0) in vec2 a_corner;\nlayout(location = 1) in vec4 a_geom;\nlayout(location = 2) in vec4 a_span;\nlayout(location = 3) in vec4 a_path;\nlayout(location = 4) in vec4 a_grain;\n\nuniform vec2 u_resolution;\nuniform float u_trackLightFloor;\nuniform sampler2D u_shadow;\nuniform vec2 u_light0Pos;\nuniform vec2 u_light0Dir;\nuniform float u_light0CosCone;\nuniform float u_light0Falloff;\nuniform vec3 u_light0Color;\nuniform float u_light0Intensity;\nuniform vec2 u_light1Pos;\nuniform vec2 u_light1Dir;\nuniform float u_light1CosCone;\nuniform float u_light1Falloff;\nuniform vec3 u_light1Color;\nuniform float u_light1Intensity;\nuniform vec2 u_light2Pos;\nuniform vec2 u_light2Dir;\nuniform float u_light2CosCone;\nuniform float u_light2Falloff;\nuniform vec3 u_light2Color;\nuniform float u_light2Intensity;\n\nout vec2 v_local;\nflat out vec4 v_span;\nflat out vec4 v_path;\nflat out vec4 v_grain;\nflat out float v_reach;\nout vec3 v_illum;\n\nfloat vgHash21(vec2 p) {\n float h = dot(p, vec2(127.1, 311.7));\n return fract(sin(h) * 43758.5453123);\n}\n\nfloat vgValueNoise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n float a = vgHash21(i);\n float b = vgHash21(i + vec2(1.0, 0.0));\n float c = vgHash21(i + vec2(0.0, 1.0));\n float d = vgHash21(i + vec2(1.0, 1.0));\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y) * 2.0 - 1.0;\n}\n\n// Keep in step with vgLightAmount in composite-shader.ts.\nfloat vgLightAmount(vec2 xy, vec2 lightPosFrac, vec2 lightDir, float cosCone, float falloff, vec2 resolution, float seed) {\n vec2 rel = xy - lightPosFrac * resolution;\n if (cosCone <= -0.999) {\n float depth = max(dot(rel, lightDir), 0.0);\n return exp(-(depth / max(resolution.y, 1.0)) * falloff);\n }\n float dist = length(rel);\n vec2 dirN = dist > 1e-4 ? rel / dist : lightDir;\n float cosAngle = dot(dirN, lightDir);\n float lobe = log(0.5) / log(clamp(cosCone, 0.05, 0.999));\n float edge = pow(max(cosAngle, 0.0), lobe);\n float atten = exp(-(dist / max(resolution.y, 1.0)) * falloff);\n if (edge * atten < 0.001) return 0.0;\n float angle = atan(dirN.x * lightDir.y - dirN.y * lightDir.x, cosAngle);\n float shafts = 0.6 + 0.32 * vgValueNoise(vec2(angle * 14.0, seed)) + 0.18 * vgValueNoise(vec2(angle * 33.0, seed + 5.3));\n return edge * atten * clamp(shafts, 0.0, 1.0);\n}\n\nvoid main() {\n vec2 dir = a_geom.zw;\n vec2 side = vec2(-dir.y, dir.x);\n // Beads widen sigma by up to 20%; 3.5 sigma leaves under 1% of the core outside the quad.\n float reach = max(a_span.z, a_span.w) * 1.2 * 3.5 + 1.5;\n float margin = reach + a_path.x * 1.7;\n float u = mix(a_span.y - reach, a_span.x + reach, a_corner.y);\n float s = a_corner.x * margin;\n vec2 pos = a_geom.xy + dir * u + side * s;\n v_local = vec2(u, s);\n v_span = a_span;\n v_path = a_path;\n v_grain = a_grain;\n v_reach = reach;\n // Lit per corner: light varies over hundreds of px, a track is a few px wide. The backdrop\n // target stores the scene top row at y = 0; lights use y up.\n vec2 xy = vec2(pos.x, u_resolution.y - pos.y);\n // The same gas shadow the composite applies to the spotlights (shadow-shader.ts, y up).\n vec4 shadow = texture(u_shadow, xy / u_resolution);\n float light0 = vgLightAmount(xy, u_light0Pos, u_light0Dir, u_light0CosCone, u_light0Falloff, u_resolution, 1.7) * u_light0Intensity;\n float light1 = vgLightAmount(xy, u_light1Pos, u_light1Dir, u_light1CosCone, u_light1Falloff, u_resolution, 4.1) * u_light1Intensity * shadow.r;\n float light2 = vgLightAmount(xy, u_light2Pos, u_light2Dir, u_light2CosCone, u_light2Falloff, u_resolution, 8.3) * u_light2Intensity * shadow.g;\n v_illum = u_light0Color * light0 + u_light1Color * light1 + u_light2Color * light2 + vec3(u_trackLightFloor);\n gl_Position = vec4((pos / u_resolution) * 2.0 - 1.0, 0.0, 1.0);\n}\n`;\n\n// Track-local coordinates: x along the track from its source in px, y across it in px. A track\n// is a Gaussian core whose width and brightness bead along its length, plus stray droplets\n// scattered around it; all noise is 1D along the track, so nothing lines up on a screen grid.\nconst TRACK_LAYER_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec2 v_local;\nflat in vec4 v_span;\nflat in vec4 v_path;\nflat in vec4 v_grain;\nflat in float v_reach;\nin vec3 v_illum;\n\nout vec4 fragColor;\n\nfloat vgHash(float a, float b) {\n uint x = floatBitsToUint(a) * 0x9E3779B1u ^ (floatBitsToUint(b) + 0x7F4A7C15u);\n x ^= x >> 16;\n x *= 0x7FEB352Du;\n x ^= x >> 15;\n x *= 0x846CA68Bu;\n x ^= x >> 16;\n return float(x) * (1.0 / 4294967295.0);\n}\n\nfloat vgNoise1(float x, float salt) {\n float i = floor(x);\n float f = fract(x);\n float u = f * f * (3.0 - 2.0 * f);\n return mix(vgHash(i, salt), vgHash(i + 1.0, salt), u);\n}\n\nvoid main() {\n float len = v_span.x;\n float start = v_span.y;\n float sigma0 = v_span.z;\n float sigma1 = v_span.w;\n float wiggleAmp = v_path.x;\n float wiggleFreq = v_path.y;\n float amp = v_path.z;\n float seed = v_path.w;\n float beadPx = v_grain.x;\n float dropPx = v_grain.y;\n float dropChance = v_grain.z;\n float blur = v_grain.w;\n\n float u = v_local.x;\n float s = v_local.y;\n float t = clamp((u - start) / max(len - start, 1.0), 0.0, 1.0);\n\n float wiggle = 0.0;\n if (wiggleAmp > 0.0) {\n float x = u * wiggleFreq;\n wiggle = wiggleAmp * smoothstep(0.0, 0.2, t) *\n ((vgNoise1(x, seed) - 0.5) * 2.0 + (vgNoise1(x * 3.1, seed + 1.0) - 0.5) * 0.7);\n }\n float across = s - wiggle;\n if (abs(across) > v_reach) discard;\n\n float bead = vgNoise1(u / beadPx, seed + 2.0);\n // Blur (age, defocus) washes the beads out rather than stretching them into ribs.\n float sigma = mix(sigma0, sigma1, t * t) * (1.0 + (bead - 0.5) * 0.4 / blur);\n float beyond = u < start ? start - u : max(u - len, 0.0);\n float core = exp(-0.5 * (across * across + beyond * beyond) / (sigma * sigma));\n float along = 1.0 - 0.35 / blur * vgNoise1(u / (beadPx * 2.3), seed + 3.0);\n\n float drops = 0.0;\n float cell0 = floor(u / dropPx);\n for (int k = -1; k <= 1; k++) {\n float c = cell0 + float(k);\n if (vgHash(c, seed + 4.0) > dropChance) continue;\n float cu = (c + vgHash(c, seed + 5.0)) * dropPx;\n if (cu < start || cu > len) continue;\n float cs = (vgHash(c, seed + 6.0) + vgHash(c, seed + 7.0) - 1.0) * 1.7 * sigma + wiggle;\n float r = max(0.7, sigma * mix(0.35, 0.8, vgHash(c, seed + 8.0)));\n float dx = u - cu;\n float dy = s - cs;\n drops += mix(0.35, 1.0, vgHash(c, seed + 9.0)) * exp(-0.5 * (dx * dx + dy * dy) / (r * r));\n }\n\n float lum = amp * (core * along + drops * 0.7 / (blur * blur));\n if (lum < 0.002) discard;\n\n vec3 glow = lum * v_illum;\n fragColor = vec4(vec3(1.0) - exp(-glow), 1.0);\n}\n`;\n\nconst FLOATS_PER_INSTANCE = 16;\n\n/** Where near tracks start to defocus, on the emission's 0 (far) … 1 (near) depth. */\nconst DEFOCUS_FROM_DEPTH = 0.7;\n/** Sigma multiplier of the nearest track: large and soft, like an out-of-focus droplet line. */\nconst DEFOCUS_MAX = 2.4;\n\n/** Fraction-space live tracks → per-instance floats in content px, y down like the emission\n * fractions and the backdrop target (drift is y-up, hence its sign flip). Skips tracks not yet born,\n * fully faded, or everything when `amount <= 0` (the canary `check:medium` uses). Exported for\n * testing without a GPU. */\nexport function buildTrackLayerInstances(\n tracks: readonly VireUIKitLiveTrack[],\n contentWidth: number,\n contentHeight: number,\n amount: number,\n): { data: Float32Array; count: number } {\n const minDim = Math.min(contentWidth, contentHeight);\n const data = new Float32Array(tracks.length * FLOATS_PER_INSTANCE);\n let count = 0;\n if (amount <= 0) return { data, count };\n\n for (const track of tracks) {\n if (track.age < 0) continue;\n const e = track.emission;\n const fade = trackLayerFade(track.age, MEDIUM_TRACK_LAYER_LIFE_SECONDS[e.kind]);\n if (fade <= 1e-4) continue;\n const look = MEDIUM_TRACK_LAYER_LOOK[e.kind];\n\n const sigmaMul = trackLayerSigmaMul(track.age, look.broaden);\n const near = Math.max(0, (e.depth - DEFOCUS_FROM_DEPTH) / (1 - DEFOCUS_FROM_DEPTH));\n const defocus = 1 + (DEFOCUS_MAX - 1) * near * near;\n const sigma0 = Math.max(look.sigmaFrac * minDim, 0.6) * sigmaMul * defocus;\n\n const o = count * FLOATS_PER_INSTANCE;\n data[o + 0] = e.source[0] * contentWidth + track.driftX * minDim;\n data[o + 1] = e.source[1] * contentHeight - track.driftY * minDim;\n data[o + 2] = Math.cos(e.angle);\n data[o + 3] = Math.sin(e.angle);\n const len = e.lengthFrac * minDim;\n data[o + 4] = len;\n data[o + 5] = Math.min(look.startFrac * minDim, len * 0.5);\n data[o + 6] = sigma0;\n data[o + 7] = sigma0 * look.endSigmaMul;\n data[o + 8] = e.raggedFrac > 0 ? look.wiggleFrac * minDim : 0;\n data[o + 9] = e.raggedFreq / Math.max(len, 1);\n data[o + 10] = (e.intensity * look.gain * fade * amount) / (sigmaMul ** 0.7 * defocus);\n data[o + 11] = e.seed;\n data[o + 12] = look.beadFrac * minDim;\n data[o + 13] = look.dropletFrac * minDim;\n data[o + 14] = look.dropletChance;\n data[o + 15] = sigmaMul * defocus;\n count += 1;\n }\n return { data, count };\n}\n\nexport type TrackLayerProgram = {\n /** Draws the instances additively into the currently bound framebuffer. Leaves blending enabled;\n * the renderer restores its own state after the backdrop pass. */\n draw(\n contentWidth: number,\n contentHeight: number,\n data: Float32Array,\n count: number,\n trackLightFloor: number,\n lights: readonly (VireUIKitMediumLight | undefined)[],\n shadow: WebGLTexture,\n ): void;\n destroy(): void;\n};\n\nfunction compile(gl: WebGL2RenderingContext, type: number, source: string, label: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(`vireuikit: track layer ${label} shader creation failed`);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(`vireuikit: track layer ${label} shader failed:\\n${gl.getShaderInfoLog(shader) ?? ''}`);\n }\n return shader;\n}\n\nexport function createTrackLayerProgram(gl: WebGL2RenderingContext): TrackLayerProgram {\n const vertex = compile(gl, gl.VERTEX_SHADER, TRACK_LAYER_VERTEX_SOURCE, 'vertex');\n const fragment = compile(gl, gl.FRAGMENT_SHADER, TRACK_LAYER_FRAGMENT_SOURCE, 'fragment');\n const program = gl.createProgram();\n if (!program) throw new Error('vireuikit: track layer program creation failed');\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(`vireuikit: track layer program failed to link:\\n${gl.getProgramInfoLog(program) ?? ''}`);\n }\n\n const loc = locationCache(gl, program);\n\n // Unit quad as a triangle strip: x across (-1…1), y along (0…1).\n const quadBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, 0, 1, 0, -1, 1, 1, 1]), gl.STATIC_DRAW);\n\n const instanceBuffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n gl.bindVertexArray(vao);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n const stride = FLOATS_PER_INSTANCE * 4;\n gl.bindBuffer(gl.ARRAY_BUFFER, instanceBuffer);\n for (let location = 1; location <= 4; location += 1) {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(location, 4, gl.FLOAT, false, stride, (location - 1) * 16);\n gl.vertexAttribDivisor(location, 1);\n }\n gl.bindVertexArray(null);\n\n function bindLight(slot: number, light: VireUIKitMediumLight | undefined): void {\n const position = light?.position ?? [0, 0];\n const direction = light?.direction ?? [0, 1];\n const dirLen = Math.hypot(direction[0], direction[1]) || 1;\n setUniform(gl, loc(`u_light${slot}Pos`), position);\n setUniform(gl, loc(`u_light${slot}Dir`), [direction[0] / dirLen, direction[1] / dirLen]);\n setUniform(gl, loc(`u_light${slot}CosCone`), Math.cos(light?.coneAngle ?? 0));\n setUniform(gl, loc(`u_light${slot}Falloff`), light?.falloff ?? 0);\n setUniform(gl, loc(`u_light${slot}Color`), light?.color ?? [0, 0, 0]);\n setUniform(gl, loc(`u_light${slot}Intensity`), light?.intensity ?? 0);\n }\n\n function draw(\n contentWidth: number,\n contentHeight: number,\n data: Float32Array,\n count: number,\n trackLightFloor: number,\n lights: readonly (VireUIKitMediumLight | undefined)[],\n shadow: WebGLTexture,\n ): void {\n if (count <= 0) return;\n gl.useProgram(program);\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, instanceBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.subarray(0, count * FLOATS_PER_INSTANCE), gl.DYNAMIC_DRAW);\n\n setUniform(gl, loc('u_resolution'), [contentWidth, contentHeight]);\n setUniform(gl, loc('u_trackLightFloor'), trackLightFloor);\n for (let slot = 0; slot < 3; slot += 1) bindLight(slot, lights[slot]);\n bindTextureAt(gl, 0, shadow, program, 'u_shadow');\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE);\n gl.disable(gl.DEPTH_TEST);\n gl.viewport(0, 0, contentWidth, contentHeight);\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n gl.bindVertexArray(null);\n }\n\n function destroy(): void {\n gl.deleteBuffer(quadBuffer);\n gl.deleteBuffer(instanceBuffer);\n gl.deleteVertexArray(vao);\n gl.deleteProgram(program);\n }\n\n return { draw, destroy };\n}\n","// The medium's runtime layer: ping-pong FBOs for the simulation grid and its GPU passes. Shader\n// text and parameters live in the package's model (`../medium`) — this file is WebGL only.\n//\n// Three independent buffers, not one: vapor (a conserved color reserve), condensate (droplets —\n// they grow, settle, and exchange with vapor) and tracks (born from a stamp, fade through decay).\n// Vapor and condensate form ONE conserved sum — water; tracks aren't part of it, and their decay\n// and stamping haven't been folded into that accounting.\nimport { computeMediumSpatialPeriods, type MediumSpatialOctave } from '../medium/noise';\nimport {\n depthFarOffsetPx,\n MEDIUM_COMPOSITE_SHADER,\n MEDIUM_CONDENSATE_CORRECT_SHADER,\n MEDIUM_CONDENSATE_FORWARD_SHADER,\n MEDIUM_CONDENSATE_REACT_SHADER,\n MEDIUM_DEFAULTS,\n MEDIUM_EMIT_SHADER,\n MEDIUM_MAX_LIGHTS,\n MEDIUM_RESAMPLE_SHADER,\n MEDIUM_SEED_SHADER,\n MEDIUM_SHADOW_SHADER,\n MEDIUM_TIME_PERIOD,\n MEDIUM_TRACK_ADVECT_SHADER,\n MEDIUM_VAPOR_CORRECT_SHADER,\n MEDIUM_VAPOR_FORWARD_SHADER,\n MEDIUM_VAPOR_REACT_SHADER,\n srgbToOklab,\n type VireUIKitMediumEmission,\n type VireUIKitMediumLight,\n type VireUIKitMediumParams,\n} from '../medium';\nimport { toGLSL } from 'vireglass';\nimport {\n bindTextureAt,\n createFramebuffer,\n createProgram,\n createTexture,\n drawFullscreenTriangle,\n locationCache,\n setUniform,\n} from 'vireglass/web';\nimport { createTrackLayer, type VireUIKitLiveTrack } from './track-layer';\nimport { buildTrackLayerInstances, createTrackLayerProgram } from './track-layer-gl';\n\nexport type MediumRuntime = {\n /** Recreates the grid on the first call (seeding it); on a later call with a different size,\n * RESAMPLES the old vapor/condensate/track state into the new size instead of reseeding — see\n * `resizeGrid` below for why. A no-op when the size hasn't changed. */\n ensureGrid(gridWidth: number, gridHeight: number): void;\n /** One transport step for all three buffers (vapor and condensate via MacCormack:\n * forward/correct/react, see `advect-shader.ts`; tracks via a single backtrace plus decay),\n * ping-ponging their own FBOs. The field's phase (curl-noise's time axis) is this runtime's own\n * state, accumulated from `dt` — see `u_phase` below — not derived from a caller-supplied clock. */\n step(dt: number, params?: Partial<VireUIKitMediumParams>): void;\n /**\n * Stamps tracks into the TRACK buffer just refreshed by advection — via additive blending,\n * rather than a separate pass or its own position list. From there the same field carries them\n * and their own decay extinguishes them; there is no lifetime timer here.\n */\n emit(emissions: readonly VireUIKitMediumEmission[]): void;\n /**\n * Ages, drifts and caps the crisp screen-space track layer's own live-track list (see\n * `track-layer.ts`) and folds `emissions` into it as fresh tracks — independent of `emit()`\n * above: that one stamps the SOFT grid residue, this one feeds the SHARP geometry `composite`\n * draws over it. Called once per frame, same as `emit`.\n */\n stepTrackLayer(dt: number, emissions: readonly VireUIKitMediumEmission[]): void;\n /**\n * Composites the current density (vapor + condensate + tracks) into a buffer already bound by\n * the caller (the renderer's `contentFbo`) — this is exactly how the medium acts as the second\n * backdrop path: the result lands in the same `contentTexture` the lens samples, not a separate\n * pass drawn over the glass.\n */\n composite(contentWidth: number, contentHeight: number, params?: Partial<VireUIKitMediumParams>): void;\n /** The raw density sum across every cell — a measurement hook, not part of the frame. Balance\n * and structure gates read THIS, not a composited pixel: compositing muddies things with Oklab\n * nonlinearity, and the water (vapor+condensate) sum and contrast need to be measurable on\n * their own. */\n readTotals(): { vapor: number; condensate: number; track: number } | null;\n /** The raw VAPOR grid, at simulation-grid resolution, `data` as r/g/b triples (three species)\n * per cell, not a sum. Used by the structure gate (contrast BETWEEN species across the grid). */\n readVaporGrid(): { cols: number; rows: number; data: number[] } | null;\n /** The raw CONDENSATE grid, at simulation-grid resolution, `data` as one density value per\n * cell (condensate has no color — see `readVaporGrid`'s r/g/b for the contrast). Used by the\n * gravity gate to find the density-weighted row where the mass sits. */\n readCondensateGrid(): { cols: number; rows: number; data: number[] } | null;\n /** The raw TRACK grid, at simulation-grid resolution, `data` as one density value per cell (a\n * track carries no color — see `readCondensateGrid`). Used by the \"sharp at birth, soft later\"\n * gate to measure a stamped track's cross-section directly. */\n readTrackGrid(): { cols: number; rows: number; data: number[] } | null;\n destroy(): void;\n};\n\ntype DyeTarget = { texture: WebGLTexture; fbo: WebGLFramebuffer };\ntype DyePair = readonly [DyeTarget, DyeTarget];\n\n/** RGBA16F keeps decay from banding on its long tail; without `EXT_color_buffer_float` (float\n * render targets need it) this falls back to RGBA8 — coarser, but works everywhere. */\nfunction pickDyeFormat(gl: WebGL2RenderingContext): { internalFormat: number; type: number } {\n const hasFloat = gl.getExtension('EXT_color_buffer_float') !== null;\n return hasFloat\n ? { internalFormat: gl.RGBA16F, type: gl.HALF_FLOAT }\n : { internalFormat: gl.RGBA8, type: gl.UNSIGNED_BYTE };\n}\n\nexport function createMediumRuntime(gl: WebGL2RenderingContext, vertexSource: string): MediumRuntime {\n const format = pickDyeFormat(gl);\n\n const vaporForwardProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_FORWARD_SHADER));\n const vaporCorrectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_CORRECT_SHADER));\n const vaporReactProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_VAPOR_REACT_SHADER));\n const condensateForwardProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_FORWARD_SHADER));\n const condensateCorrectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_CORRECT_SHADER));\n const condensateReactProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_CONDENSATE_REACT_SHADER));\n const trackAdvectProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_TRACK_ADVECT_SHADER));\n const compositeProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_COMPOSITE_SHADER));\n const seedProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_SEED_SHADER));\n const emitProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_EMIT_SHADER));\n const resampleProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_RESAMPLE_SHADER));\n const shadowProgram = createProgram(gl, vertexSource, toGLSL(MEDIUM_SHADOW_SHADER));\n const trackLayerProgram = createTrackLayerProgram(gl);\n const trackLayer = createTrackLayer();\n let liveTracks: readonly VireUIKitLiveTrack[] = [];\n\n const vaporForwardLoc = locationCache(gl, vaporForwardProgram);\n const vaporCorrectLoc = locationCache(gl, vaporCorrectProgram);\n const vaporReactLoc = locationCache(gl, vaporReactProgram);\n const condensateForwardLoc = locationCache(gl, condensateForwardProgram);\n const condensateCorrectLoc = locationCache(gl, condensateCorrectProgram);\n const condensateReactLoc = locationCache(gl, condensateReactProgram);\n const trackAdvectLoc = locationCache(gl, trackAdvectProgram);\n const compositeLoc = locationCache(gl, compositeProgram);\n const seedLoc = locationCache(gl, seedProgram);\n const emitLoc = locationCache(gl, emitProgram);\n const resampleLoc = locationCache(gl, resampleProgram);\n const shadowLoc = locationCache(gl, shadowProgram);\n\n let gridW = 0;\n let gridH = 0;\n let vapor: DyePair | null = null;\n let condensate: DyePair | null = null;\n let track: DyePair | null = null;\n // MacCormack scratch buffers for a single frame, not ping-pong: each is fully overwritten by its\n // own pass and read again within the SAME step — no persistent state carried between frames.\n let vaporForward: DyeTarget | null = null;\n let vaporCorrected: DyeTarget | null = null;\n let condensateForward: DyeTarget | null = null;\n let condensateCorrected: DyeTarget | null = null;\n let shadow: DyeTarget | null = null;\n let front = 0;\n\n function makeTarget(w: number, h: number): DyeTarget {\n const texture = createTexture(gl, {\n width: w,\n height: h,\n internalFormat: format.internalFormat,\n type: format.type,\n // REPEAT: a domain with no border — see TextureOptions.wrap. All buffers carry the same\n // field, so the border needs to behave identically for each of them, or vapor would wrap\n // while condensate or a track at the same coordinate cuts off. The MacCormack limiter also\n // reads neighbors across this same border — it needs REPEAT exactly as much as transport does.\n wrap: gl.REPEAT,\n });\n const fbo = createFramebuffer(gl, texture);\n return { texture, fbo };\n }\n\n function clearTarget(target: DyeTarget, w: number, h: number): void {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo);\n gl.viewport(0, 0, w, h);\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n function destroyPair(pair: DyePair | null): void {\n if (!pair) return;\n for (const t of pair) {\n gl.deleteTexture(t.texture);\n gl.deleteFramebuffer(t.fbo);\n }\n }\n\n function destroyTarget(target: DyeTarget | null): void {\n if (!target) return;\n gl.deleteTexture(target.texture);\n gl.deleteFramebuffer(target.fbo);\n }\n\n function destroyTargets(): void {\n destroyPair(vapor);\n destroyPair(condensate);\n destroyPair(track);\n destroyTarget(vaporForward);\n destroyTarget(vaporCorrected);\n destroyTarget(condensateForward);\n destroyTarget(condensateCorrected);\n destroyTarget(shadow);\n vapor = null;\n condensate = null;\n track = null;\n vaporForward = null;\n vaporCorrected = null;\n condensateForward = null;\n condensateCorrected = null;\n shadow = null;\n }\n\n // Three spots at fixed, spread-out grid points — the \"initial spots\", and the entire water\n // supply: it has no other source (the sum of vapor and condensate is conserved). Condensate and\n // tracks seed empty: only background condensation stamps into condensate on the first step, and\n // only `emit` stamps into tracks.\n function seed(w: number, h: number): void {\n if (!vapor || !condensate || !track) return;\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[front].fbo);\n gl.viewport(0, 0, w, h);\n gl.disable(gl.BLEND);\n gl.useProgram(seedProgram);\n setUniform(gl, seedLoc('u_resolution'), [w, h]);\n setUniform(gl, seedLoc('u_spot0'), [w * 0.28, h * 0.64]);\n setUniform(gl, seedLoc('u_spot1'), [w * 0.7, h * 0.32]);\n setUniform(gl, seedLoc('u_spot2'), [w * 0.48, h * 0.84]);\n setUniform(gl, seedLoc('u_spotRadius'), Math.max(w, h) * 0.18);\n drawFullscreenTriangle(gl);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n clearTarget(condensate[0], w, h);\n clearTarget(condensate[1], w, h);\n clearTarget(track[0], w, h);\n clearTarget(track[1], w, h);\n }\n\n /** Bilinear-resamples one buffer into a differently-sized target — see MEDIUM_RESAMPLE_SHADER. */\n function resample(src: DyeTarget, srcW: number, srcH: number, dst: DyeTarget, dstW: number, dstH: number): void {\n gl.bindFramebuffer(gl.FRAMEBUFFER, dst.fbo);\n gl.viewport(0, 0, dstW, dstH);\n gl.disable(gl.BLEND);\n gl.useProgram(resampleProgram);\n bindTextureAt(gl, 0, src.texture, resampleProgram, 'u_src');\n setUniform(gl, resampleLoc('u_srcSize'), [srcW, srcH]);\n setUniform(gl, resampleLoc('u_resolution'), [dstW, dstH]);\n drawFullscreenTriangle(gl);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n // A resize used to destroy every target and reseed from scratch — a phone rotation or a window\n // resize wiped the vapor back to its three initial spots and blinked condensate/tracks out, the\n // flicker the design forbids. Instead: bilinear-resample the OLD front buffers (the only ones\n // that carry real state — see the comment on the MacCormack scratch buffers above) into NEW,\n // differently-sized targets, then delete the old ones. Seeding stays a first-call-only thing.\n function resizeGrid(w: number, h: number): void {\n if (!vapor || !condensate || !track) return; // narrows for TS; callers already checked\n const oldVapor = vapor;\n const oldCondensate = condensate;\n const oldTrack = track;\n const oldW = gridW;\n const oldH = gridH;\n\n const newVaporFront = makeTarget(w, h);\n const newCondensateFront = makeTarget(w, h);\n const newTrackFront = makeTarget(w, h);\n resample(oldVapor[front], oldW, oldH, newVaporFront, w, h);\n resample(oldCondensate[front], oldW, oldH, newCondensateFront, w, h);\n resample(oldTrack[front], oldW, oldH, newTrackFront, w, h);\n\n destroyTargets();\n gridW = w;\n gridH = h;\n vapor = [newVaporFront, makeTarget(w, h)];\n condensate = [newCondensateFront, makeTarget(w, h)];\n track = [newTrackFront, makeTarget(w, h)];\n vaporForward = makeTarget(w, h);\n vaporCorrected = makeTarget(w, h);\n condensateForward = makeTarget(w, h);\n condensateCorrected = makeTarget(w, h);\n shadow = makeTarget(w, h);\n front = 0;\n\n // Total water scales with cell count, not just density: a bilinear resample roughly preserves\n // the AVERAGE value per cell, so the SUM over every cell scales with how many cells there now\n // are. Rescaling the EXISTING target (rather than re-measuring the just-resampled buffers)\n // keeps the invariant exact even if the resample itself is slightly lossy at the edges — the\n // periodic renormalization below already self-corrects any residual, and it needs a real\n // target to correct TOWARD rather than one that already baked in this resize's own error.\n // `timeSinceRenorm`/`framesSinceRenorm` are left running: the interval they measure doesn't\n // care about grid size, only about how much correction accumulated frame to frame.\n const areaRatio = (w * h) / (oldW * oldH);\n waterTargetTotal *= areaRatio;\n }\n\n function ensureGrid(gridWidth: number, gridHeight: number): void {\n const w = Math.max(2, Math.round(gridWidth));\n const h = Math.max(2, Math.round(gridHeight));\n if (vapor && condensate && track && w === gridW && h === gridH) return;\n\n if (!vapor || !condensate || !track) {\n gridW = w;\n gridH = h;\n vapor = [makeTarget(w, h), makeTarget(w, h)];\n condensate = [makeTarget(w, h), makeTarget(w, h)];\n track = [makeTarget(w, h), makeTarget(w, h)];\n vaporForward = makeTarget(w, h);\n vaporCorrected = makeTarget(w, h);\n condensateForward = makeTarget(w, h);\n condensateCorrected = makeTarget(w, h);\n shadow = makeTarget(w, h);\n front = 0;\n seed(w, h);\n // The target water total — right after seeding, before the first step: this is \"the entire\n // supply\" (see the comment on `seed`), and every later renormalization checks against it.\n // Right after seeding condensate is empty, so the target equals the vapor sum — but it's\n // re-verified every time as vapor+condensate, not just vapor, in case the initial state ever\n // changes.\n waterTargetTotal = readTarget(vapor[front]) + readTarget(condensate[front]);\n waterScale = 1;\n timeSinceRenorm = 0;\n framesSinceRenorm = 0;\n return;\n }\n\n resizeGrid(w, h);\n }\n\n /** Binds one light slot (`u_light<slot>*`) of `MEDIUM_COMPOSITE_SHADER` — `undefined` (a `lights`\n * array shorter than `MEDIUM_MAX_LIGHTS`) binds intensity 0, same as simply never setting the\n * uniform (GL's own default), so an unused slot contributes nothing either way. */\n function bindLightUniforms(slot: number, light: VireUIKitMediumLight | undefined): void {\n const position = light?.position ?? [0, 0];\n const direction = light?.direction ?? [0, 1];\n const dirLen = Math.hypot(direction[0], direction[1]) || 1;\n setUniform(gl, compositeLoc(`u_light${slot}Pos`), position);\n setUniform(gl, compositeLoc(`u_light${slot}Dir`), [direction[0] / dirLen, direction[1] / dirLen]);\n setUniform(gl, compositeLoc(`u_light${slot}CosCone`), Math.cos(light?.coneAngle ?? 0));\n setUniform(gl, compositeLoc(`u_light${slot}Falloff`), light?.falloff ?? 0);\n setUniform(gl, compositeLoc(`u_light${slot}Color`), light?.color ?? [0, 0, 0]);\n setUniform(gl, compositeLoc(`u_light${slot}Intensity`), light?.intensity ?? 0);\n }\n\n /** Shared velocity-field uniforms — one set for both phases' forward/correct passes and for\n * tracks (condensate adds its own gravity on top — see `u_settleSpeed` where it's declared).\n * The react passes don't mind them either: the extra `loc()` calls for curl uniforms that don't\n * exist there just return null, and `setUniform` silently skips them. */\n function bindVelocityUniforms(\n loc: (name: string) => WebGLUniformLocation | null,\n dt: number,\n phase: number,\n p: VireUIKitMediumParams,\n spatial: readonly MediumSpatialOctave[],\n ): void {\n setUniform(gl, loc('u_dyeSize'), [gridW, gridH]);\n setUniform(gl, loc('u_resolution'), [gridW, gridH]);\n setUniform(gl, loc('u_dt'), dt);\n setUniform(gl, loc('u_phase'), phase);\n setUniform(gl, loc('u_curlFreq'), p.curlFreq);\n setUniform(gl, loc('u_advectSpeed'), p.advectSpeed);\n setUniform(gl, loc('u_turbulence'), p.turbulence);\n // Only the vapor forward/correct programs declare u_vaporDrift; elsewhere loc() returns null\n // and setUniform silently skips it, same as the curl uniforms already do for the react passes.\n setUniform(gl, loc('u_vaporDrift'), p.gravityVaporDrift);\n setUniform(gl, loc('u_spatial0'), [spatial[0].freqX, spatial[0].freqY, spatial[0].periodX, spatial[0].periodY]);\n setUniform(gl, loc('u_spatial1'), [spatial[1].freqX, spatial[1].freqY, spatial[1].periodX, spatial[1].periodY]);\n setUniform(gl, loc('u_spatial2'), [spatial[2].freqX, spatial[2].freqY, spatial[2].periodX, spatial[2].periodY]);\n setUniform(gl, loc('u_spatial3'), [spatial[3].freqX, spatial[3].freqY, spatial[3].periodX, spatial[3].periodY]);\n }\n\n // The field's phase — curl-noise's time axis, accumulated here in float64 rather than derived\n // from an ever-growing caller-supplied clock, and wrapped at MEDIUM_TIME_PERIOD (noise.ts's\n // MEDIUM_TIME_OCTAVES makes that wrap exact, not approximate). Sending a raw, ever-growing\n // `time * curlSpeed` product to the GPU as a float32 uniform eventually loses the bits that\n // place a point within its own lattice cell — after hours of playback the field would visibly\n // jitter in place. Wrapping the ACCUMULATOR keeps its magnitude bounded, and because the rate is\n // baked in incrementally rather than multiplied in fresh every frame, changing `curlSpeed` at\n // runtime changes the slope going forward instead of rescaling everything already accumulated —\n // no jump.\n let phase = 0;\n\n function wrapPhase(value: number): number {\n const wrapped = value % MEDIUM_TIME_PERIOD;\n return wrapped < 0 ? wrapped + MEDIUM_TIME_PERIOD : wrapped;\n }\n\n // A semi-Lagrangian gather over a non-uniform velocity has no obligation to conserve the sum by\n // itself, and neither does the vapor<->condensate exchange at non-integer rounding exponents\n // (not a boundary or step-size issue — at zero advection and zero exchange there's no loss at\n // all); rather than change the scheme, once a second the WATER sum (vapor+condensate) is checked\n // against its target and the correction is spread as an EQUAL multiplier over the frames of the\n // next interval (an Nth root — otherwise an N-fold ratio would overshoot the target instead of\n // reaching it).\n const WATER_RENORM_INTERVAL_S = 1;\n let waterTargetTotal = 0;\n let waterScale = 1;\n let timeSinceRenorm = 0;\n let framesSinceRenorm = 0;\n\n function step(dt: number, params: Partial<VireUIKitMediumParams> = {}): void {\n if (\n !vapor ||\n !condensate ||\n !track ||\n !vaporForward ||\n !vaporCorrected ||\n !condensateForward ||\n !condensateCorrected ||\n !shadow\n ) {\n return;\n }\n const p = { ...MEDIUM_DEFAULTS, ...params };\n // Per step, not cached on resize: a caller may override curlFreq between frames.\n const spatial = computeMediumSpatialPeriods(gridW, gridH, p.curlFreq);\n // dt is clamped: a tab returning from the background would otherwise carry advection past the\n // grid's bounds in one jump, sweeping all the smoke to an edge in a single frame.\n const clampedDt = Math.min(Math.max(dt, 0), 1 / 15);\n // Advance and wrap the phase BEFORE using it this frame — see the comment on `phase` above.\n phase = wrapPhase(phase + clampedDt * p.curlSpeed);\n const back = front === 0 ? 1 : 0;\n const gridSize: readonly [number, number] = [gridW, gridH];\n\n // --- Transport: MacCormack splits each phase into forward/correct, both phases independently\n // (only the react pass below reads the partner, and only on already grid-aligned values). ---\n\n gl.viewport(0, 0, gridW, gridH);\n gl.disable(gl.BLEND);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vaporForward.fbo);\n gl.useProgram(vaporForwardProgram);\n bindTextureAt(gl, 0, vapor[front].texture, vaporForwardProgram, 'u_dye');\n bindVelocityUniforms(vaporForwardLoc, clampedDt, phase, p, spatial);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensateForward.fbo);\n gl.useProgram(condensateForwardProgram);\n bindTextureAt(gl, 0, condensate[front].texture, condensateForwardProgram, 'u_dye');\n bindVelocityUniforms(condensateForwardLoc, clampedDt, phase, p, spatial);\n setUniform(gl, condensateForwardLoc('u_settleSpeed'), p.condensateSettleSpeed);\n setUniform(gl, condensateForwardLoc('u_settleWiggle'), p.condensateSettleWiggle);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vaporCorrected.fbo);\n gl.useProgram(vaporCorrectProgram);\n bindTextureAt(gl, 0, vapor[front].texture, vaporCorrectProgram, 'u_dye');\n bindTextureAt(gl, 1, vaporForward.texture, vaporCorrectProgram, 'u_forward');\n // bindTextureAt only binds the sampler, not its auto uniform size (the transpiler generates a\n // <name>Size for every `uniform shader`) — the second (cross-) sampler needs its own size set\n // separately, or it silently stays (0,0) and `.eval()` divides the coordinate by zero.\n setUniform(gl, vaporCorrectLoc('u_forwardSize'), gridSize);\n bindVelocityUniforms(vaporCorrectLoc, clampedDt, phase, p, spatial);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensateCorrected.fbo);\n gl.useProgram(condensateCorrectProgram);\n bindTextureAt(gl, 0, condensate[front].texture, condensateCorrectProgram, 'u_dye');\n bindTextureAt(gl, 1, condensateForward.texture, condensateCorrectProgram, 'u_forward');\n setUniform(gl, condensateCorrectLoc('u_forwardSize'), gridSize);\n bindVelocityUniforms(condensateCorrectLoc, clampedDt, phase, p, spatial);\n setUniform(gl, condensateCorrectLoc('u_settleSpeed'), p.condensateSettleSpeed);\n setUniform(gl, condensateCorrectLoc('u_settleWiggle'), p.condensateSettleWiggle);\n drawFullscreenTriangle(gl);\n\n // --- Reaction: vapor<->condensate exchange and droplet growth, on the already transported\n // (MacCormack) fields, with the partner read directly at its OWN point xy — both fields are\n // already grid-aligned. ---\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[back].fbo);\n gl.useProgram(vaporReactProgram);\n bindTextureAt(gl, 0, vaporCorrected.texture, vaporReactProgram, 'u_transported');\n bindTextureAt(gl, 1, condensateCorrected.texture, vaporReactProgram, 'u_condensateTransported');\n setUniform(gl, vaporReactLoc('u_transportedSize'), gridSize);\n setUniform(gl, vaporReactLoc('u_condensateTransportedSize'), gridSize);\n setUniform(gl, vaporReactLoc('u_resolution'), gridSize);\n setUniform(gl, vaporReactLoc('u_dt'), clampedDt);\n setUniform(gl, vaporReactLoc('u_condensationRate'), p.condensationRate);\n setUniform(gl, vaporReactLoc('u_condensationFloor'), p.condensationFloor);\n setUniform(gl, vaporReactLoc('u_evaporationRate'), p.evaporationRate);\n setUniform(gl, vaporReactLoc('u_totalScale'), waterScale);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensate[back].fbo);\n gl.useProgram(condensateReactProgram);\n bindTextureAt(gl, 0, condensateCorrected.texture, condensateReactProgram, 'u_transported');\n bindTextureAt(gl, 1, vaporCorrected.texture, condensateReactProgram, 'u_vaporTransported');\n // Growth reads the neighbors of its OWN cell xy in the ORIGINAL (pre-transport-this-frame)\n // condensate — see the comment in advect-shader.ts on MEDIUM_CONDENSATE_REACT_SHADER — so the\n // third sampler is the old front buffer.\n bindTextureAt(gl, 2, condensate[front].texture, condensateReactProgram, 'u_dye');\n setUniform(gl, condensateReactLoc('u_transportedSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_vaporTransportedSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_dyeSize'), gridSize);\n setUniform(gl, condensateReactLoc('u_resolution'), gridSize);\n setUniform(gl, condensateReactLoc('u_dt'), clampedDt);\n setUniform(gl, condensateReactLoc('u_condensationRate'), p.condensationRate);\n setUniform(gl, condensateReactLoc('u_condensationFloor'), p.condensationFloor);\n setUniform(gl, condensateReactLoc('u_evaporationRate'), p.evaporationRate);\n setUniform(gl, condensateReactLoc('u_spreadRate'), p.condensateSpreadRate);\n setUniform(gl, condensateReactLoc('u_totalScale'), waterScale);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, track[back].fbo);\n gl.useProgram(trackAdvectProgram);\n bindTextureAt(gl, 0, track[front].texture, trackAdvectProgram, 'u_dye');\n bindVelocityUniforms(trackAdvectLoc, clampedDt, phase, p, spatial);\n setUniform(gl, trackAdvectLoc('u_decay'), p.decay);\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, shadow.fbo);\n gl.useProgram(shadowProgram);\n bindTextureAt(gl, 0, vapor[back].texture, shadowProgram, 'u_vapor');\n bindTextureAt(gl, 1, condensate[back].texture, shadowProgram, 'u_condensate');\n setUniform(gl, shadowLoc('u_vaporSize'), gridSize);\n setUniform(gl, shadowLoc('u_condensateSize'), gridSize);\n setUniform(gl, shadowLoc('u_resolution'), gridSize);\n setUniform(gl, shadowLoc('u_condensateGain'), p.condensateGain);\n setUniform(gl, shadowLoc('u_extinction'), p.shadowExtinction);\n for (const slot of [1, 2]) {\n const position = p.lights[slot]?.position ?? [0, 0];\n setUniform(gl, shadowLoc(`u_light${slot}Grid`), [position[0] * gridW, position[1] * gridH]);\n }\n drawFullscreenTriangle(gl);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n front = back;\n framesSinceRenorm += 1;\n\n timeSinceRenorm += clampedDt;\n if (waterTargetTotal > 0 && timeSinceRenorm >= WATER_RENORM_INTERVAL_S && framesSinceRenorm > 0) {\n const current = readTarget(vapor[front]) + readTarget(condensate[front]);\n if (current > 1e-6) {\n // The Nth root: applied N times in a row (N frames of the past interval) has to PRODUCE\n // the ratio target/current, not apply that ratio in EACH frame — otherwise one second's\n // correction would fire N times and overshoot the target instead of reaching it.\n const totalRatio = waterTargetTotal / current;\n const perFrame = Math.pow(totalRatio, 1 / framesSinceRenorm);\n waterScale = Math.min(1.05, Math.max(0.95, perFrame));\n }\n timeSinceRenorm = 0;\n framesSinceRenorm = 0;\n }\n }\n\n // Stamping goes into the TRACK buffer (the one advection just wrote) via additive blending,\n // exactly as track stamping requires: not a separate pass, not its own buffer, not water.\n function emit(emissions: readonly VireUIKitMediumEmission[]): void {\n if (!track || emissions.length === 0) return;\n const minDim = Math.min(gridW, gridH);\n gl.bindFramebuffer(gl.FRAMEBUFFER, track[front].fbo);\n gl.viewport(0, 0, gridW, gridH);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE);\n gl.useProgram(emitProgram);\n // The flip-convention comment above doesn't apply here: the shader never reads its own\n // previous frame (no `.eval()`), so there's nothing to flip — but the transpiler always\n // requires u_resolution regardless (see `targets/glsl.ts`: the entry coordinate goes through\n // it unconditionally).\n setUniform(gl, emitLoc('u_resolution'), [gridW, gridH]);\n for (const e of emissions) {\n const source: [number, number] = [e.source[0] * gridW, e.source[1] * gridH];\n const length = e.lengthFrac * minDim;\n const head: [number, number] = [\n source[0] + Math.cos(e.angle) * length,\n source[1] + Math.sin(e.angle) * length,\n ];\n setUniform(gl, emitLoc('u_source'), source);\n setUniform(gl, emitLoc('u_head'), head);\n setUniform(gl, emitLoc('u_headWidth'), e.headWidthFrac * minDim);\n setUniform(gl, emitLoc('u_tailWidth'), e.tailWidthFrac * minDim);\n setUniform(gl, emitLoc('u_raggedAmp'), e.raggedFrac * minDim);\n setUniform(gl, emitLoc('u_raggedFreq'), e.raggedFreq);\n setUniform(gl, emitLoc('u_settle'), e.settleFrac * minDim);\n setUniform(gl, emitLoc('u_tailDim'), e.tailDim);\n setUniform(gl, emitLoc('u_intensity'), e.intensity);\n setUniform(gl, emitLoc('u_seed'), e.seed);\n drawFullscreenTriangle(gl);\n }\n gl.disable(gl.BLEND);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n function stepTrackLayer(dt: number, emissions: readonly VireUIKitMediumEmission[]): void {\n liveTracks = trackLayer.step(dt, emissions);\n }\n\n function composite(\n contentWidth: number,\n contentHeight: number,\n params: Partial<VireUIKitMediumParams> = {},\n ): void {\n if (!vapor || !condensate || !track || !shadow) return;\n const p = { ...MEDIUM_DEFAULTS, ...params };\n gl.viewport(0, 0, contentWidth, contentHeight);\n gl.disable(gl.BLEND);\n gl.useProgram(compositeProgram);\n bindTextureAt(gl, 0, vapor[front].texture, compositeProgram, 'u_vapor');\n bindTextureAt(gl, 1, condensate[front].texture, compositeProgram, 'u_condensate');\n bindTextureAt(gl, 2, track[front].texture, compositeProgram, 'u_track');\n bindTextureAt(gl, 3, shadow.texture, compositeProgram, 'u_shadow');\n setUniform(gl, compositeLoc('u_vaporSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_condensateSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_trackSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_shadowSize'), [gridW, gridH]);\n setUniform(gl, compositeLoc('u_resolution'), [contentWidth, contentHeight]);\n setUniform(gl, compositeLoc('u_dyeScale'), [gridW / contentWidth, gridH / contentHeight]);\n // The palette's forward direction (sRGB → Oklab) — here, once per frame (frame constants),\n // not in the shader per pixel (see the comment in composite-shader.ts).\n setUniform(gl, compositeLoc('u_lab0'), srgbToOklab(p.channelColors[0]));\n setUniform(gl, compositeLoc('u_lab1'), srgbToOklab(p.channelColors[1]));\n setUniform(gl, compositeLoc('u_lab2'), srgbToOklab(p.channelColors[2]));\n setUniform(gl, compositeLoc('u_labBg'), srgbToOklab(p.baseColor));\n setUniform(gl, compositeLoc('u_labCondensate'), srgbToOklab(p.condensateColor));\n setUniform(gl, compositeLoc('u_baseWeight'), p.baseWeight);\n setUniform(gl, compositeLoc('u_condensateTint'), p.condensateTint);\n setUniform(gl, compositeLoc('u_condensateGain'), p.condensateGain);\n setUniform(gl, compositeLoc('u_farScale'), p.depthFarScale);\n // Resolved against the GRID's own size (baseSrc is already grid-px), not content size — a\n // fixed fraction of a wrapping axis, not a fixed pixel count (see depthFarOffsetPx's own\n // comment for why a fixed grid-px value doesn't survive every grid size).\n setUniform(gl, compositeLoc('u_farOffset'), depthFarOffsetPx(p.depthFarOffsetFrac, gridW, gridH));\n setUniform(gl, compositeLoc('u_farBlurRadius'), p.depthFarBlurRadius);\n setUniform(gl, compositeLoc('u_farWeight'), p.depthFarWeight);\n setUniform(gl, compositeLoc('u_gravityBoost'), p.gravityBottomBoost);\n setUniform(gl, compositeLoc('u_gravityBoostStart'), p.gravityBottomBoostStart);\n setUniform(gl, compositeLoc('u_channelScatter'), p.channelScatter);\n for (let slot = 0; slot < MEDIUM_MAX_LIGHTS; slot += 1) bindLightUniforms(slot, p.lights[slot]);\n setUniform(gl, compositeLoc('u_trackLightFloor'), p.trackLightFloor);\n drawFullscreenTriangle(gl);\n\n // The crisp screen-space layer draws OVER the fullscreen composite just written, additively, in\n // the SAME target framebuffer — see track-layer-gl.ts's own file header for why this is a raw\n // instanced GLSL pass rather than another fullscreen shader in the DSL above.\n const { data, count } = buildTrackLayerInstances(liveTracks, contentWidth, contentHeight, p.trackLayerAmount);\n trackLayerProgram.draw(contentWidth, contentHeight, data, count, p.trackLightFloor, p.lights, shadow.texture);\n }\n\n function readTarget(target: DyeTarget): number {\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo);\n let sum = 0;\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(gridW * gridH * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < buf.length; i += 4) sum += buf[i] + buf[i + 1] + buf[i + 2];\n } else {\n const buf = new Uint8Array(gridW * gridH * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < buf.length; i += 4) sum += (buf[i] + buf[i + 1] + buf[i + 2]) / 255;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return sum;\n }\n\n function readTotals(): { vapor: number; condensate: number; track: number } | null {\n if (!vapor || !condensate || !track) return null;\n return {\n vapor: readTarget(vapor[front]),\n condensate: readTarget(condensate[front]),\n track: readTarget(track[front]),\n };\n }\n\n // Three numbers per cell (r/g/b of the three vapor species), not a sum: the structure gate\n // (medium-structure-gate.mjs) measures contrast BETWEEN species — a summed density would lose it.\n function readVaporGrid(): { cols: number; rows: number; data: number[] } | null {\n if (!vapor) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, vapor[front].fbo);\n const cells = gridW * gridH;\n const data = new Array(cells * 3);\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < cells; i += 1) {\n data[i * 3] = buf[i * 4];\n data[i * 3 + 1] = buf[i * 4 + 1];\n data[i * 3 + 2] = buf[i * 4 + 2];\n }\n } else {\n const buf = new Uint8Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < cells; i += 1) {\n data[i * 3] = buf[i * 4] / 255;\n data[i * 3 + 1] = buf[i * 4 + 1] / 255;\n data[i * 3 + 2] = buf[i * 4 + 2] / 255;\n }\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { cols: gridW, rows: gridH, data };\n }\n\n // One number per cell, not three: condensate has no color of its own (density lives in .r,\n // g/b unused — see MEDIUM_CONDENSATE_REACT_SHADER). A gravity gate reads THIS, row-weighting the\n // density to find where the mass sits, without decoding an RGB triple that's two-thirds padding.\n function readCondensateGrid(): { cols: number; rows: number; data: number[] } | null {\n if (!condensate) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, condensate[front].fbo);\n const cells = gridW * gridH;\n const data = new Array(cells);\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4];\n } else {\n const buf = new Uint8Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4] / 255;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { cols: gridW, rows: gridH, data };\n }\n\n // One number per cell, same reasoning as readCondensateGrid: a track carries no color of its own\n // (emit-shader.ts stamps r=g=b — see its own comment) since MEDIUM_COMPOSITE_SHADER now lights\n // tracks rather than tinting them. Used by the \"sharp at birth, soft later\" gate to measure a\n // stamped track's cross-section directly, without compositing/lighting in the way.\n function readTrackGrid(): { cols: number; rows: number; data: number[] } | null {\n if (!track) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, track[front].fbo);\n const cells = gridW * gridH;\n const data = new Array(cells);\n if (format.type === gl.HALF_FLOAT) {\n const buf = new Float32Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.FLOAT, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4];\n } else {\n const buf = new Uint8Array(cells * 4);\n gl.readPixels(0, 0, gridW, gridH, gl.RGBA, gl.UNSIGNED_BYTE, buf);\n for (let i = 0; i < cells; i += 1) data[i] = buf[i * 4] / 255;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { cols: gridW, rows: gridH, data };\n }\n\n function destroy(): void {\n destroyTargets();\n gl.deleteProgram(vaporForwardProgram);\n gl.deleteProgram(vaporCorrectProgram);\n gl.deleteProgram(vaporReactProgram);\n gl.deleteProgram(condensateForwardProgram);\n gl.deleteProgram(condensateCorrectProgram);\n gl.deleteProgram(condensateReactProgram);\n gl.deleteProgram(trackAdvectProgram);\n gl.deleteProgram(compositeProgram);\n gl.deleteProgram(seedProgram);\n gl.deleteProgram(emitProgram);\n gl.deleteProgram(shadowProgram);\n gl.deleteProgram(resampleProgram);\n trackLayerProgram.destroy();\n }\n\n return {\n ensureGrid,\n step,\n emit,\n stepTrackLayer,\n composite,\n readTotals,\n readVaporGrid,\n readCondensateGrid,\n readTrackGrid,\n destroy,\n };\n}\n","import {\n FULLSCREEN_TRIANGLE_VERTEX_SOURCE,\n type VireGlassBackdropPass,\n} from 'vireglass/web';\nimport type { VireUIKitMediumEmission, VireUIKitMediumParams } from '../medium';\nimport { createMediumRuntime, type MediumRuntime } from './medium';\n\n/** The simulation grid — its own resolution, coarser than the frame. `dt` is the caller's clock:\n * pausing on `prefers-reduced-motion` and testability both stay on its side. There is no `time`\n * field — the field's phase is the runtime's own accumulated state (see `u_phase` in\n * `web/medium.ts`), not something the caller has to track across an arbitrarily long session. */\nexport type MediumFrame = {\n gridWidth: number;\n gridHeight: number;\n dt: number;\n params?: Partial<VireUIKitMediumParams>;\n /** Tracks stamped this frame; `createMediumDynamics` schedules them. */\n emissions?: readonly VireUIKitMediumEmission[];\n};\n\nexport type MediumBackdrop = {\n /** The VireGlass renderer's backdrop for this frame: steps the medium and composites it into\n * the lens's texture. */\n pass(frame: MediumFrame): VireGlassBackdropPass;\n /** Measurement hooks for balance and structure gates; `null` until the medium has rendered once. */\n readTotals(): { vapor: number; condensate: number; track: number } | null;\n readVaporGrid(): { cols: number; rows: number; data: number[] } | null;\n readCondensateGrid(): { cols: number; rows: number; data: number[] } | null;\n readTrackGrid(): { cols: number; rows: number; data: number[] } | null;\n destroy(): void;\n};\n\nexport function createMediumBackdrop(): MediumBackdrop {\n let runtime: MediumRuntime | null = null;\n let owner: WebGL2RenderingContext | null = null;\n\n return {\n pass: (frame) => (gl, target) => {\n if (owner && owner !== gl) throw new Error('vireuikit: the medium is already bound to another WebGL context');\n owner = gl;\n runtime ??= createMediumRuntime(gl, FULLSCREEN_TRIANGLE_VERTEX_SOURCE);\n runtime.ensureGrid(frame.gridWidth, frame.gridHeight);\n runtime.step(frame.dt, frame.params);\n runtime.emit(frame.emissions ?? []);\n runtime.stepTrackLayer(frame.dt, frame.emissions ?? []);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n runtime.composite(target.width, target.height, frame.params);\n },\n readTotals: () => runtime?.readTotals() ?? null,\n readVaporGrid: () => runtime?.readVaporGrid() ?? null,\n readCondensateGrid: () => runtime?.readCondensateGrid() ?? null,\n readTrackGrid: () => runtime?.readTrackGrid() ?? null,\n destroy: () => {\n runtime?.destroy();\n runtime = null;\n owner = null;\n },\n };\n}\n"]}
|
package/package.json
CHANGED