@pixerate/editor 0.135.0 → 0.137.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/dist/animation-editor/index.cjs +63 -55
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +8 -5
- package/dist/animation-editor/index.d.ts +8 -5
- package/dist/animation-editor/index.js +10 -2
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{bezier-J8i4uqSH.d.cts → bezier-CZ2AhjID.d.cts} +1 -1
- package/dist/{bezier-lNEOp0Jx.d.ts → bezier-Dywv3Bw8.d.ts} +1 -1
- package/dist/blending-D7jCmjO6.d.cts +1026 -0
- package/dist/blending-NgF3qo3d.d.ts +1026 -0
- package/dist/brushes-CnvZSYYU.d.cts +744 -0
- package/dist/brushes-DJmUbIgz.d.ts +744 -0
- package/dist/{brushstrokeRender-SII6MG4R.js → brushstrokeRender-2FAXA3XC.js} +13 -16
- package/dist/{brushstrokeRender-SII6MG4R.js.map → brushstrokeRender-2FAXA3XC.js.map} +1 -1
- package/dist/{brushstrokeRender-JNHVEUFG.cjs → brushstrokeRender-IMFY3FF6.cjs} +16 -19
- package/dist/brushstrokeRender-IMFY3FF6.cjs.map +1 -0
- package/dist/canvas/index.cjs +10 -10
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +10 -7
- package/dist/canvas/index.d.ts +10 -7
- package/dist/canvas/index.js +4 -4
- package/dist/{chunk-W4LNKTHT.cjs → chunk-2XS6LTUP.cjs} +63 -63
- package/dist/{chunk-W4LNKTHT.cjs.map → chunk-2XS6LTUP.cjs.map} +1 -1
- package/dist/{chunk-HHTCDFZC.js → chunk-3D77LOBM.js} +234 -136
- package/dist/chunk-3D77LOBM.js.map +1 -0
- package/dist/{chunk-BR7EKQUP.js → chunk-3G6J7UFV.js} +322 -2
- package/dist/chunk-3G6J7UFV.js.map +1 -0
- package/dist/{chunk-62XUO5LB.js → chunk-3X6IAJUQ.js} +2 -2
- package/dist/{chunk-EM3FMJWE.js → chunk-5FSRTP6E.js} +320 -3
- package/dist/chunk-5FSRTP6E.js.map +1 -0
- package/dist/{chunk-Z2H7KECK.cjs → chunk-5OOIUXNJ.cjs} +345 -247
- package/dist/chunk-5OOIUXNJ.cjs.map +1 -0
- package/dist/{chunk-7RJ6P7MI.js → chunk-6S6362D2.js} +2 -2
- package/dist/chunk-A3BVTI3G.js +150 -0
- package/dist/chunk-A3BVTI3G.js.map +1 -0
- package/dist/{chunk-24ATT2PE.cjs → chunk-AEAAN4AD.cjs} +120 -120
- package/dist/{chunk-24ATT2PE.cjs.map → chunk-AEAAN4AD.cjs.map} +1 -1
- package/dist/chunk-ECCXGELC.cjs +727 -0
- package/dist/chunk-ECCXGELC.cjs.map +1 -0
- package/dist/{chunk-SVYE5HIM.js → chunk-EQQMGO42.js} +2 -2
- package/dist/{chunk-FHPVDTI2.cjs → chunk-F2Y4E4GU.cjs} +22 -22
- package/dist/{chunk-FHPVDTI2.cjs.map → chunk-F2Y4E4GU.cjs.map} +1 -1
- package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
- package/dist/{chunk-UYQUPUR6.js → chunk-HUO3TI4C.js} +3 -3
- package/dist/chunk-I52DRGGJ.js +727 -0
- package/dist/chunk-I52DRGGJ.js.map +1 -0
- package/dist/{chunk-DDSO4HS7.cjs → chunk-KEENUAFN.cjs} +2 -2
- package/dist/{chunk-DDSO4HS7.cjs.map → chunk-KEENUAFN.cjs.map} +1 -1
- package/dist/{chunk-2HC4DRF4.js → chunk-LLFHCSU2.js} +2 -2
- package/dist/{chunk-J5BA3BQ6.cjs → chunk-O7LUD7MH.cjs} +323 -3
- package/dist/chunk-O7LUD7MH.cjs.map +1 -0
- package/dist/{chunk-ILYFOJUN.js → chunk-OIBIRXRG.js} +3 -3
- package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
- package/dist/{chunk-T6TV6HY6.cjs → chunk-PRSRYHQD.cjs} +36 -36
- package/dist/{chunk-T6TV6HY6.cjs.map → chunk-PRSRYHQD.cjs.map} +1 -1
- package/dist/chunk-Q6OUXEK3.cjs +150 -0
- package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
- package/dist/{chunk-6GFRKLLS.cjs → chunk-QBWEH3IM.cjs} +429 -112
- package/dist/chunk-QBWEH3IM.cjs.map +1 -0
- package/dist/{chunk-ESIWZMMK.js → chunk-SYT2TLQF.js} +35 -37
- package/dist/{chunk-ESIWZMMK.js.map → chunk-SYT2TLQF.js.map} +1 -1
- package/dist/{chunk-YT3JL7YM.cjs → chunk-TLCTTQFF.cjs} +53 -53
- package/dist/{chunk-YT3JL7YM.cjs.map → chunk-TLCTTQFF.cjs.map} +1 -1
- package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
- package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
- package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
- package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
- package/dist/{chunk-YAFS2QFZ.cjs → chunk-XN2NBLV5.cjs} +313 -315
- package/dist/chunk-XN2NBLV5.cjs.map +1 -0
- package/dist/effects/index.d.cts +7 -4
- package/dist/effects/index.d.ts +7 -4
- package/dist/{export-DMeG6E06.d.ts → export-41rL6Cne.d.ts} +1 -1
- package/dist/{export-AZSwX087.d.cts → export-CyJdfP_Z.d.cts} +5 -4
- package/dist/{export-KzubBKo7.d.cts → export-D9mXp05Q.d.cts} +1 -1
- package/dist/{export-BDkyDNM8.d.ts → export-DwnZ_hvQ.d.ts} +5 -4
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/generation/index.cjs +150 -945
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +3 -423
- package/dist/generation/index.d.ts +3 -423
- package/dist/generation/index.js +59 -854
- package/dist/generation/index.js.map +1 -1
- package/dist/grammar/index.cjs +3 -3
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.js +2 -2
- package/dist/{helpers-Coa4e2j_.d.ts → helpers-C-RgeyvH.d.ts} +25 -8
- package/dist/{helpers-DHl28yLO.d.cts → helpers-v6GMazzg.d.cts} +25 -8
- package/dist/image-editor/index.cjs +986 -986
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +15 -11
- package/dist/image-editor/index.d.ts +15 -11
- package/dist/image-editor/index.js +94 -94
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -36
- package/dist/{opentype-BWR7Qv8W.d.cts → opentype-KR_jj6b_.d.cts} +1 -1
- package/dist/{opentype-Dfcx6wFx.d.ts → opentype-a1KAW-qs.d.ts} +1 -1
- package/dist/paint/index.cjs +5 -8
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +4 -2
- package/dist/paint/index.d.ts +4 -2
- package/dist/paint/index.js +15 -18
- package/dist/paint-editor/index.cjs +405 -403
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +15 -748
- package/dist/paint-editor/index.d.ts +15 -748
- package/dist/paint-editor/index.js +79 -77
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-BHS4vQNm.d.cts} +1 -1
- package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-BVvTIBMo.d.ts} +1 -1
- package/dist/{pool-8JZGWHvR.d.ts → pool-CZQOrSXZ.d.ts} +1 -1
- package/dist/{pool-BfuxBKTd.d.cts → pool-FjZZmZ80.d.cts} +1 -1
- package/dist/provenance-DmlcgdzT.d.cts +426 -0
- package/dist/provenance-uh5r2TQ8.d.ts +426 -0
- package/dist/rand-8xbUb6ur.d.ts +1118 -0
- package/dist/rand-Cw9VLrVC.d.cts +1118 -0
- package/dist/raster/index.cjs +17 -19
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.js +9 -11
- package/dist/raster/index.js.map +1 -1
- package/dist/{svg-CxxqG3_W.d.ts → svg-CSz3mzkw.d.ts} +2 -2
- package/dist/{svg-pwXWq6s2.d.cts → svg-DTb40ICU.d.cts} +2 -2
- package/dist/{tools-y1M6O3UT.d.ts → tools-B0wXP5cF.d.ts} +1 -1
- package/dist/{tools-3EBjR91b.d.cts → tools-Ca0kI1qo.d.cts} +1 -1
- package/dist/vector/index.cjs +2698 -1674
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +390 -72
- package/dist/vector/index.d.ts +390 -72
- package/dist/vector/index.js +1665 -641
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.d.cts +7 -4
- package/dist/video-editor/index.d.ts +7 -4
- package/dist/{warp-Ceqdz7kj.d.cts → warp-DTOp0lON.d.cts} +1 -1
- package/dist/{warp-C1gwu2G_.d.ts → warp-pd7hrH4T.d.ts} +1 -1
- package/package.json +1 -1
- package/skills/pixerate-vector/SKILL.md +22 -0
- package/dist/brushstrokeRender-JNHVEUFG.cjs.map +0 -1
- package/dist/chunk-64PYNEHJ.js +0 -340
- package/dist/chunk-64PYNEHJ.js.map +0 -1
- package/dist/chunk-6GFRKLLS.cjs.map +0 -1
- package/dist/chunk-7QN76ESJ.js +0 -323
- package/dist/chunk-7QN76ESJ.js.map +0 -1
- package/dist/chunk-BR7EKQUP.js.map +0 -1
- package/dist/chunk-DCLJNVZS.cjs +0 -323
- package/dist/chunk-DCLJNVZS.cjs.map +0 -1
- package/dist/chunk-EM3FMJWE.js.map +0 -1
- package/dist/chunk-HHTCDFZC.js.map +0 -1
- package/dist/chunk-J5BA3BQ6.cjs.map +0 -1
- package/dist/chunk-YAFS2QFZ.cjs.map +0 -1
- package/dist/chunk-Z2H7KECK.cjs.map +0 -1
- package/dist/chunk-Z6OUCS2K.cjs +0 -340
- package/dist/chunk-Z6OUCS2K.cjs.map +0 -1
- package/dist/rand-BszBST4s.d.ts +0 -2140
- package/dist/rand-DOH_aMvm.d.cts +0 -2140
- /package/dist/{chunk-62XUO5LB.js.map → chunk-3X6IAJUQ.js.map} +0 -0
- /package/dist/{chunk-7RJ6P7MI.js.map → chunk-6S6362D2.js.map} +0 -0
- /package/dist/{chunk-SVYE5HIM.js.map → chunk-EQQMGO42.js.map} +0 -0
- /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
- /package/dist/{chunk-UYQUPUR6.js.map → chunk-HUO3TI4C.js.map} +0 -0
- /package/dist/{chunk-2HC4DRF4.js.map → chunk-LLFHCSU2.js.map} +0 -0
- /package/dist/{chunk-ILYFOJUN.js.map → chunk-OIBIRXRG.js.map} +0 -0
- /package/dist/{chunk-FWEO3HSL.js.map → chunk-PQQF5KOW.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-FHPVDTI2.cjs","../src/paint/pigment-tools.ts","../src/paint/wet/model.ts","../src/paint/wet/film.ts","../src/paint/wet/kernel.ts","../src/paint/wet/wasm.ts","../src/paint/wet/world.ts","../src/paint/wet/flow.ts","../src/paint/wet/medium.ts","../src/paint/wet/gpu-kernels.ts","../src/paint/wet/gpu.ts","../src/paint/pointer.ts"],"names":["rgb","OPP","S","off","scratch","adapter"],"mappings":"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,EAAA;AACb,IAAA;AACG,IAAA;AACA,IAAA;AACb,IAAA;AACc,IAAA;AACC,IAAA;AACH,IAAA;AACN,IAAA;AACE,IAAA;AACL,IAAA;AACT,EAAA;AAAA;AAGsB,EAAA;AACD,IAAA;AACrB,EAAA;AAEgB,EAAA;AACG,IAAA;AACG,IAAA;AACtB,EAAA;AACF;AVokFwB;AACA;AWr+FR;AACQ,EAAA;AACf,EAAA;AACT;AAGgB;AACM,EAAA;AACqB,EAAA;AAC5B,EAAA;AACS,EAAA;AACP,IAAA;AACI,MAAA;AACD,MAAA;AACH,IAAA;AACC,MAAA;AACA,MAAA;AACd,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAMgB;AACG,EAAA;AACF,EAAA;AACjB;AXg+FwB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-FHPVDTI2.cjs","sourcesContent":[null,"import type { AgentTool } from '../tools/registry.js';\nimport { createPigment, mixPigments, type Pigment } from './pigment';\n\nconst HEX = /^#?([0-9a-f]{6})$/i;\n\nfunction parseHex(value: unknown, index: number): [number, number, number] {\n const m = typeof value === 'string' ? HEX.exec(value.trim()) : null;\n if (!m) throw new Error(`colors[${index}].color is ${JSON.stringify(value)}; use #rrggbb, e.g. \"#1e40af\".`);\n const n = parseInt(m[1], 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n}\n\nfunction toHex(rgb: readonly number[]): string {\n return '#' + rgb.map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Agent tools for pigment mixing (`@pixerate/editor/paint`). `mix_colors` is read-only: it\n * predicts what paints mixed in given amounts look like, for choosing a brush or fill colour.\n */\nexport function createPigmentTools(): AgentTool[] {\n const mixColors: AgentTool = {\n name: 'mix_colors',\n title: 'Mix colours like paint',\n description:\n 'Mixes colours as paint would (model pigment, the default: Kubelka-Munk mixing over reflectance spectra, so blue and yellow make green and white lightens a colour into a tint instead of greying it), or as light on screen (model rgb: the weighted RGB average). Changes nothing. Returns mixed (#rrggbb, by the chosen model), the other model\\'s result for comparison (rgbLerp and pigment), the normalised weights and the model.',\n inputSchema: {\n type: 'object',\n properties: {\n colors: {\n type: 'array',\n minItems: 1,\n maxItems: 16,\n description: 'The paints to mix (1 to 16).',\n items: {\n type: 'object',\n properties: {\n color: { type: 'string', description: 'Paint colour #rrggbb.' },\n weight: { type: 'number', minimum: 0, description: 'Parts of this paint, any scale (e.g. 1 and 3 for a 1:3 mix). At least one weight must be above 0.' },\n strength: {\n type: 'number',\n exclusiveMinimum: 0,\n maximum: 100,\n description: 'Tinting strength (default 1): each part counts as this many, so a strong dark paint (e.g. 4) tints a lot of white.',\n },\n },\n required: ['color', 'weight'],\n additionalProperties: false,\n },\n },\n model: {\n type: 'string',\n enum: ['pigment', 'rgb'],\n description: 'pigment (default): mix like paint (Kubelka-Munk), as the pigment blend mode, Mixer Brush and mixing pad do; rgb: average the RGB values, as normal blending and rgb mixing brushes do (strength is ignored).',\n },\n },\n required: ['colors'],\n additionalProperties: false,\n },\n annotations: { title: 'Mix colours like paint', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n handler: (args) => {\n const items = args.colors as { color: string; weight: number; strength?: number }[];\n const rgbs = items.map((item, i) => parseHex(item.color, i));\n const total = items.reduce((sum, item) => sum + item.weight, 0);\n if (!(total > 0)) throw new Error('Every weight is 0; give at least one colour a weight above 0.');\n const pigments: Pigment[] = rgbs.map((rgb, i) => createPigment(rgb, { strength: items[i].strength }));\n const mixed = mixPigments(pigments, items.map((item) => item.weight));\n const lerp = [0, 1, 2].map((c) => rgbs.reduce((sum, rgb, i) => sum + rgb[c] * items[i].weight, 0) / total);\n const rgb = args.model === 'rgb';\n return {\n mixed: toHex(rgb ? lerp : mixed),\n rgbLerp: toHex(lerp),\n pigment: toHex(mixed),\n weights: items.map((item) => item.weight / total),\n model: rgb ? 'rgb' : 'kubelka-munk',\n };\n },\n };\n return [mixColors];\n}\n","/**\n * The wet-media model: water and pigment on paper, simulated per cell on 256 px tiles.\n *\n * Written from the published literature only (no code, presets or textures from any product):\n *\n * - **Water** is a D2Q9 lattice Boltzmann fluid with BGK collision, τ = 3ν + ½ (any LBM text, e.g.\n * Krüger et al., *The Lattice Boltzmann Method*, 2017). Streaming uses partial bounce-back with a\n * blocking factor from the paper fibres, and the wet front is *pinned* until the water behind it\n * is deep enough: Chu & Tai, \"MoXi: Real-Time Ink Dispersion in Absorbent Paper\", SIGGRAPH 2005.\n * Tilt and flow maps are a velocity-shift force, with |u| capped at `U_MAX` cells per step.\n * - **Paper** soaks water up until it holds its capacity, and damp paper stops pinning the front\n * (wet-in-wet). Water evaporates faster in a band along the wet front (an \"edge\" field, 1 at the\n * front and fading over a few cells inwards, as Curtis et al. blur the wet-area mask), so water\n * flows out to the edge and carries pigment there: edge darkening.\n * - **Pigment** (Curtis et al., \"Computer-Generated Watercolor\", SIGGRAPH 1997) is suspended in the\n * water, advected with a first-order upwind finite-volume flux (it conserves pigment and never\n * goes negative while |u| ≤ ¼), spreads a little between wet cells (bleed), settles into the\n * paper (more in grain valleys: granulation; more at the wet edge: edge darkening), is lifted\n * back by water (more where water arrives: blooms), and settles completely where a cell dries.\n * - **Colour** is Kubelka-Munk: each cell carries pigment as absorption `K` per channel (linear\n * R, G, B) plus one scattering `S`, so mixes are exactly linear (two-constant KM, `K = Σ cᵢKᵢ`,\n * `S = Σ cᵢSᵢ`) and transparent washes multiply like glazes. A colour becomes `K` and `S` with the\n * same two-flux formulas as the shipped pigment model (`K/S = (1 − R)² / 2R`).\n *\n * `stepCellsTs` in `kernel.ts` is the specification of one step, in exact f32 arithmetic. The\n * WebAssembly SIMD kernel (`assembly/wet.ts`) is a lane-for-lane port of it and gives the same bits,\n * so the simulation is deterministic across browsers, kernels and worker counts.\n */\n\n/** Tile side in cells (the raster tile size). */\nexport const WET_TILE = 256;\n/** A tile slot's side: the tile plus a one-cell halo on each side. */\nexport const SLOT_SIDE = 258;\n/** Floats per plane of a slot. */\nexport const PLANE = SLOT_SIDE * SLOT_SIDE;\nexport const PLANE_BYTES = PLANE * 4;\n\n/** Planes in each ping-ponged set: f0..f8, depth, velocity, paper water, 4 pigment channels, edge. */\nexport const SET_PLANES = 18;\nexport const P_RHO = 9;\nexport const P_UX = 10;\nexport const P_UY = 11;\n/** Water held in the paper. */\nexport const P_SW = 12;\n/** Suspended pigment: K red, K green, K blue, S. */\nexport const P_P0 = 13;\n/** Edge: 1 at the wet front, fading over a few cells into the wet area (0 where dry). */\nexport const P_EDGE = 17;\n/** Single (not ping-ponged) planes, after the two sets. */\nexport const P_D0 = 2 * SET_PLANES; // 36..39: deposited pigment K r, g, b, S\nexport const P_H = P_D0 + 4; // 40: paper height (−1 marks the off-canvas halo)\nexport const P_FX = P_H + 1; // 41: flow map x\nexport const P_FY = P_H + 2; // 42: flow map y\nexport const SLOT_PLANES = P_FY + 1; // 43\nexport const SLOT_BYTES = SLOT_PLANES * PLANE_BYTES;\n/** Pigment channels per cell. */\nexport const PIGMENT_CHANNELS = 4;\n\n/** D2Q9 lattice velocities: 0 rest, 1–4 axis (E, S, W, N in screen space), 5–8 diagonals. */\nexport const EX = [0, 1, 0, -1, 0, 1, -1, -1, 1] as const;\nexport const EY = [0, 0, 1, 0, -1, 1, 1, -1, -1] as const;\nexport const OPP = [0, 3, 4, 1, 2, 7, 8, 5, 6] as const;\nexport const W9 = [4 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 36, 1 / 36, 1 / 36, 1 / 36] as const;\n\n/** Water shallower than this counts as dry. */\nexport const DRY_EPS = 1e-3;\n/** Fluid speed cap in cells per step: keeps the LBM low-Mach and the pigment flux CFL-stable. */\nexport const U_MAX = 0.25;\n/** A tile's wet cells within this many cells of an edge wake the neighbouring tile. */\nexport const STRIP = 64;\n/** Steps per batch at most: the wake-up strip stays ahead of anything that moves a cell a step. */\nexport const MAX_BATCH = 32;\n/** Dry tiles are baked and freed only on steps that are multiples of this (so it is deterministic). */\nexport const FREE_INTERVAL = 32;\n\n/** Per-tile flag bits a step returns. */\nexport const FLAG_ALIVE = 1; // some cell holds water (surface or paper)\nexport const FLAG_LEFT = 2;\nexport const FLAG_RIGHT = 4;\nexport const FLAG_TOP = 8;\nexport const FLAG_BOTTOM = 16;\nexport const FLAG_WET = 32; // some cell is wet (surface water at least DRY_EPS deep)\n\n/** f32 parameters per lane (one per wet layer). */\nexport const PARAM_FLOATS = 32;\n\n/** Index of each packed parameter (the kernels read these offsets). */\nexport const PARAM = {\n omega: 0,\n tau: 1,\n evap: 2,\n edgeEvap: 3, // times the edge field\n mobility: 4, // half the pigment mobility (the face flux uses the sum of two velocities)\n depRate: 5,\n pickup: 6,\n absorption: 7,\n invCap: 8,\n blockScale: 9,\n rough: 10,\n pinT: 11,\n gx: 12,\n gy: 13,\n flowK: 14,\n granulation: 15,\n edgeDep: 16, // times the edge field\n bloom: 17,\n paperEvap: 18,\n hasFlow: 19,\n bleed: 20,\n} as const;\n\n/**\n * A wet layer's settings, each 0..1 unless noted. The paper's absorption, permeability and\n * roughness come from the paper, not from here.\n */\nexport interface WetParams {\n /** How thick the water is: 0 runny (ink) .. 1 very thick (oil). Default 0.3 (watercolour). */\n viscosity: number;\n /** How fast the water dries: 0 never .. 1 very fast. Default 0.45. */\n evaporation: number;\n /** Darker, crisper edges where a wash dries: 0 none .. 1 strong. Default 0.5. */\n edgeDarkening: number;\n /** How heavy the pigment is: heavy pigment travels less and settles sooner. Default 0.3. */\n pigmentWeight: number;\n /** How much pigment collects in the paper's valleys. Default 0.4. */\n granulation: number;\n /** How readily water lifts settled pigment back up (re-wetting). Default 0.2. */\n pickup: number;\n /** How fast suspended pigment settles into the paper (staining). Default 0.2. */\n fixture: number;\n /** Blooms (backruns): water flowing into a drying wash pushes its pigment out. Default 0.4. */\n bloom: number;\n /** Colour bleed: pigment spreading between touching wet areas. Default 0.3. */\n bleed: number;\n}\n\nexport const DEFAULT_WET_PARAMS: Readonly<WetParams> = {\n viscosity: 0.3,\n evaporation: 0.45,\n edgeDarkening: 0.5,\n pigmentWeight: 0.3,\n granulation: 0.4,\n pickup: 0.2,\n fixture: 0.2,\n bloom: 0.4,\n bleed: 0.3,\n};\n\nexport const WET_PARAM_KEYS = Object.keys(DEFAULT_WET_PARAMS) as (keyof WetParams)[];\n\n/** The paper as wet media read it (all 0..1; from the paint editor's paper settings). */\nexport interface WetPaper {\n absorption: number;\n permeability: number;\n roughness: number;\n}\n\nexport const DEFAULT_WET_PAPER: Readonly<WetPaper> = { absorption: 0.7, permeability: 0.5, roughness: 0.6 };\n\n/** Canvas tilt (shared by every wet layer): water runs downhill. */\nexport interface WetTilt {\n /** Degrees from flat, 0 (flat) .. 90 (upright). */\n angle: number;\n /** Which way is downhill, degrees clockwise from canvas down (0 = towards the bottom edge). */\n direction: number;\n}\n\nexport const FLAT: Readonly<WetTilt> = { angle: 0, direction: 0 };\n\nconst unit = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : d);\n\n/** Settings with every field in range; missing fields come from `base`. */\nexport function normalizeWetParams(raw: Partial<WetParams> = {}, base: WetParams = DEFAULT_WET_PARAMS): WetParams {\n const out = {} as WetParams;\n for (const k of WET_PARAM_KEYS) out[k] = unit(raw[k], base[k]);\n return out;\n}\n\nexport function normalizeTilt(raw: Partial<WetTilt> = {}, base: WetTilt = FLAT): WetTilt {\n const angle = typeof raw.angle === 'number' && Number.isFinite(raw.angle) ? Math.min(90, Math.max(0, raw.angle)) : base.angle;\n let direction = typeof raw.direction === 'number' && Number.isFinite(raw.direction) ? raw.direction : base.direction;\n direction = ((direction % 360) + 360) % 360;\n return { angle, direction };\n}\n\n/** Kinematic viscosity (lattice units) for `viscosity` 0..1: 0.02 .. 1.5, exponential. */\nexport function latticeViscosity(v: number): number {\n return 0.02 * Math.pow(75, v);\n}\n\n/** Water a cell of paper holds when saturated, in depth units. */\nexport const PAPER_CAPACITY = 0.08;\n\n/** Largest tilt acceleration (cells per step²), at 90°. */\nexport const MAX_TILT_ACCEL = 0.025;\n\n/** Packs a lane's settings into the f32 block the kernels read. `flowStrength` 0 turns the flow map off. */\nexport function packWetParams(params: WetParams, paper: WetPaper, tilt: WetTilt, flowStrength: number, out = new Float32Array(PARAM_FLOATS)): Float32Array {\n const nu = latticeViscosity(params.viscosity);\n const tau = 3 * nu + 0.5;\n const g = MAX_TILT_ACCEL * Math.sin((tilt.angle * Math.PI) / 180);\n const dir = (tilt.direction * Math.PI) / 180;\n out.fill(0);\n out[PARAM.omega] = 1 / tau;\n out[PARAM.tau] = tau;\n out[PARAM.evap] = 1e-3 * params.evaporation * params.evaporation;\n out[PARAM.edgeEvap] = params.edgeDarkening * 12; // the edge band dries much faster, so water (and pigment) flows out to it\n out[PARAM.mobility] = 0.5 * (1 - 0.5 * params.pigmentWeight);\n out[PARAM.depRate] = 0.019 * params.fixture * (0.5 + params.pigmentWeight);\n out[PARAM.pickup] = 0.01 * params.pickup;\n out[PARAM.absorption] = 0.0015 * paper.absorption;\n out[PARAM.invCap] = 1 / PAPER_CAPACITY;\n out[PARAM.blockScale] = 0.05 * (1 - paper.permeability);\n out[PARAM.rough] = 0.15 * paper.roughness;\n out[PARAM.pinT] = 0.2;\n out[PARAM.gx] = -g * Math.sin(dir);\n out[PARAM.gy] = g * Math.cos(dir);\n out[PARAM.flowK] = flowStrength;\n out[PARAM.granulation] = 1.2 * params.granulation * paper.roughness;\n out[PARAM.edgeDep] = params.edgeDarkening * 3;\n out[PARAM.bloom] = 60 * params.bloom;\n out[PARAM.paperEvap] = 0.5e-3 * params.evaporation * params.evaporation;\n out[PARAM.hasFlow] = flowStrength !== 0 ? 1 : 0;\n out[PARAM.bleed] = 0.05 * params.bleed;\n return out;\n}\n\n/** Flag bits for a wet (or alive) cell at tile-local (lx, ly): which neighbours it wakes. */\nexport function edgeBits(lx: number, ly: number): number {\n let b = 0;\n if (lx < STRIP) b |= FLAG_LEFT;\n if (lx >= WET_TILE - STRIP) b |= FLAG_RIGHT;\n if (ly < STRIP) b |= FLAG_TOP;\n if (ly >= WET_TILE - STRIP) b |= FLAG_BOTTOM;\n return b;\n}\n","/**\n * How wet-layer pigment looks, and how it bakes into 8-bit pixels.\n *\n * A cell carries pigment as Kubelka-Munk absorption `K` per channel (linear R, G, B) and one\n * scattering `S`, in mass units where `PIGMENT_UNIT` of a colour's pigment is a full-strength wash.\n * Over what is below it (`below`, linear), the film reflects\n *\n * film = hide·R∞ + (1 − hide)·T·below, T = e^(−2K), hide = 1 − e^(−HIDE·S),\n * R∞ = 1 + K/S − √((K/S)² + 2·K/S) (the shipped pigment model's two-flux formula)\n *\n * so transparent washes (S ≈ 0) multiply like glazes and opaque paint (gouache, oil) hides.\n *\n * The bake is a pure function of the f32 state and the 8-bit pixels, computed with deterministic\n * maths only (`dexp`, `dlog`, `sqrt`, + − × ÷ in f64; never `Math.exp` / `Math.pow`, whose last\n * bits differ between JavaScript engines), so \"dry on save\" gives the same pixels everywhere.\n * The layer pixel is the film expressed as colour plus alpha over the paper colour (exact over the\n * paper, a normal-blend approximation over other layers), with alpha never below the pixel's own.\n */\n\n/** Pigment mass of a full-strength wash of a colour. */\nexport const PIGMENT_UNIT = 0.25;\n/** Hiding per unit of scattering. */\nexport const HIDE = 1.5;\n/** Scattering of fully opaque paint (`body` 1), per `PIGMENT_UNIT` of mass. */\nexport const BODY_SCATTER = 3;\n/** Smallest reflectance a colour maps to (so black has finite K). */\nconst R_MIN = 1e-3;\n\n// ---------------------------------------------------------------------------\n// Deterministic maths\n// ---------------------------------------------------------------------------\n\nconst f64 = new Float64Array(1);\nconst u32 = new Uint32Array(f64.buffer);\nconst LITTLE = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\nconst HI = LITTLE ? 1 : 0;\nconst LN2 = 0.6931471805599453;\n\n/** 2^k for an integer k in −1022..1023, built from its bits. */\nfunction pow2(k: number): number {\n u32[HI] = (k + 1023) << 20;\n u32[1 - HI] = 0;\n return f64[0];\n}\n\n/**\n * e^x with + − × ÷ only: x = k·ln2 + r with |r| ≤ ln2/2, then a degree-11 Taylor polynomial\n * (error below 1e-15). The same bits in every JavaScript engine.\n */\nexport function dexp(x: number): number {\n if (!(x > -700)) return x !== x ? x : 0;\n if (x > 700) return Infinity;\n const k = Math.round(x / LN2);\n const r = x - k * LN2;\n let p = 1 / 39916800;\n p = p * r + 1 / 3628800;\n p = p * r + 1 / 362880;\n p = p * r + 1 / 40320;\n p = p * r + 1 / 5040;\n p = p * r + 1 / 720;\n p = p * r + 1 / 120;\n p = p * r + 1 / 24;\n p = p * r + 1 / 6;\n p = p * r + 0.5;\n p = p * r + 1;\n p = p * r + 1;\n return p * pow2(k);\n}\n\n/** ln x for x > 0 with + − × ÷ only: x = m·2^e, ln m by the atanh series. */\nexport function dlog(x: number): number {\n if (!(x > 0)) return x === 0 ? -Infinity : NaN;\n f64[0] = x;\n let e = ((u32[HI] >>> 20) & 0x7ff) - 1023;\n if (e === -1023) {\n // subnormal: scale up first\n return dlog(x * 18014398509481984) - 54 * LN2;\n }\n u32[HI] = (u32[HI] & 0x800fffff) | (1023 << 20);\n let m = f64[0];\n if (m > 1.4142135623730951) {\n m /= 2;\n e += 1;\n }\n const s = (m - 1) / (m + 1);\n const s2 = s * s;\n let t = s2;\n let sum = 1;\n for (let i = 3; i < 40; i += 2) {\n sum += t / i;\n t *= s2;\n }\n return 2 * s * sum + e * LN2;\n}\n\n/** x^y for x ≥ 0, deterministically. */\nexport function dpow(x: number, y: number): number {\n if (x <= 0) return 0;\n return dexp(y * dlog(x));\n}\n\n// ---------------------------------------------------------------------------\n// sRGB tables (built with the deterministic maths)\n// ---------------------------------------------------------------------------\n\n/** sRGB byte → linear. */\nexport const SRGB_TO_LINEAR = new Float64Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n SRGB_TO_LINEAR[i] = v <= 0.04045 ? v / 12.92 : dpow((v + 0.055) / 1.055, 2.4);\n}\n\n/** sRGB value 0..255 (not necessarily whole) → linear, interpolating the byte table. */\nexport function srgbByteToLinear(v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 255) return 1;\n const i = Math.floor(v);\n return SRGB_TO_LINEAR[i] + (SRGB_TO_LINEAR[i + 1] - SRGB_TO_LINEAR[i]) * (v - i);\n}\n\n/** Entries of the linear → sRGB byte table. */\nconst ENC_STEPS = 16384;\nconst ENCODE = new Uint8Array(ENC_STEPS + 1);\nfor (let i = 0; i <= ENC_STEPS; i++) {\n const v = i / ENC_STEPS;\n const e = v <= 0.0031308 ? 12.92 * v : 1.055 * dpow(v, 1 / 2.4) - 0.055;\n ENCODE[i] = Math.min(255, Math.max(0, Math.round(e * 255)));\n}\n\n/** Linear 0..1 → sRGB byte (16384-step table). */\nexport function linearToSrgb8(v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 1) return 255;\n return ENCODE[Math.round(v * ENC_STEPS)];\n}\n\n// ---------------------------------------------------------------------------\n// Colour ↔ pigment\n// ---------------------------------------------------------------------------\n\n/**\n * The pigment (K r, g, b, S per unit of mass) of an sRGB colour (0..1) at `body` 0 (a transparent\n * watercolour: K = −ln R / 2 so a full wash over white shows the colour) .. 1 (opaque paint:\n * `K/S = (1 − R)² / 2R` at `BODY_SCATTER`).\n */\nexport function pigmentOf(rgb: readonly [number, number, number] | readonly number[], body: number, out: Float64Array | number[] = new Float64Array(4)): Float64Array | number[] {\n const b = Math.min(1, Math.max(0, body));\n const s = (b * BODY_SCATTER) / PIGMENT_UNIT;\n for (let c = 0; c < 3; c++) {\n const v = Math.min(255, Math.max(0, Math.round(rgb[c] * 255)));\n const r = Math.max(R_MIN, SRGB_TO_LINEAR[v]);\n const kt = -dlog(r) / 2 / PIGMENT_UNIT;\n const ko = ((1 - r) * (1 - r)) / (2 * r) * s;\n out[c] = (1 - b) * kt + b * ko;\n }\n out[3] = s;\n return out;\n}\n\n/** e^(−x) for x ≥ 0 from a table (1/256 steps, linear interpolation; relative error below 3e-6). */\nconst EXP_RES = 256;\nconst EXP_MAX = 24;\nconst EXP_TABLE = new Float64Array(EXP_MAX * EXP_RES + 2);\nfor (let i = 0; i < EXP_TABLE.length; i++) EXP_TABLE[i] = dexp(-i / EXP_RES);\n\n/** e^(−x) for x ≥ 0 (deterministic: a table built with `dexp`, interpolated with + − ×). */\nexport function expNeg(x: number): number {\n if (!(x > 0)) return 1;\n if (x >= EXP_MAX) return 0;\n const t = x * EXP_RES;\n const i = Math.floor(t);\n const fr = t - i;\n return EXP_TABLE[i] + (EXP_TABLE[i + 1] - EXP_TABLE[i]) * fr;\n}\n\n/** Linear reflectance of a film of pigment `k` (3) and `s` over `below` (linear) into `out`. */\nexport function filmReflectance(k0: number, k1: number, k2: number, s: number, b0: number, b1: number, b2: number, out: Float64Array | number[]): void {\n const hide = s > 0 ? 1 - expNeg(HIDE * s) : 0;\n const keep = 1 - hide;\n const inv = s > 1e-9 ? 1 / s : 0;\n out[0] = (hide > 0 ? hide * rinf(k0 * inv) : 0) + keep * expNeg(2 * k0) * b0;\n out[1] = (hide > 0 ? hide * rinf(k1 * inv) : 0) + keep * expNeg(2 * k1) * b1;\n out[2] = (hide > 0 ? hide * rinf(k2 * inv) : 0) + keep * expNeg(2 * k2) * b2;\n}\n\n/** Kubelka-Munk reflectance of an infinitely thick layer with absorption over scattering `ks`. */\nfunction rinf(ks: number): number {\n return 1 + ks - Math.sqrt(ks * ks + 2 * ks);\n}\n\n/** The sRGB colour (0..1) of pigment `k`, `s` over white: what a brush picking it up sees. */\nexport function pigmentColor(k0: number, k1: number, k2: number, s: number, out: number[] = [0, 0, 0]): number[] {\n const lin = [0, 0, 0];\n filmReflectance(k0, k1, k2, s, 1, 1, 1, lin);\n for (let c = 0; c < 3; c++) out[c] = linearToSrgb8(lin[c]) / 255;\n return out;\n}\n\nconst scratch = new Float64Array(3);\n\n/**\n * Bakes one pixel: pigment `k0..k2`, `s` laid over layer pixel `px[i..i+3]` (straight sRGB) on paper\n * `paper` (sRGB bytes). `wet` (0..1) darkens wet paper slightly (display only; 0 for a bake).\n * Writes the new layer pixel into `out[o..o+3]`.\n */\nexport function filmPixel(\n k0: number,\n k1: number,\n k2: number,\n s: number,\n px: ArrayLike<number>,\n i: number,\n paper: ArrayLike<number>,\n wet: number,\n out: Uint8ClampedArray,\n o: number\n): void {\n const pa = px[i + 3];\n if (!(k0 > 1e-7 || k1 > 1e-7 || k2 > 1e-7 || s > 1e-7) && wet <= 0) {\n out[o] = px[i];\n out[o + 1] = px[i + 1];\n out[o + 2] = px[i + 2];\n out[o + 3] = pa;\n return;\n }\n const a = pa / 255;\n const p0 = paper[0];\n const p1 = paper[1];\n const p2 = paper[2];\n // What is below the film: the pixel over the paper as the compositor blends it (encoded), then linear.\n const b0 = srgbByteToLinear(a * px[i] + (1 - a) * p0);\n const b1 = srgbByteToLinear(a * px[i + 1] + (1 - a) * p1);\n const b2 = srgbByteToLinear(a * px[i + 2] + (1 - a) * p2);\n filmReflectance(k0, k1, k2, s, b0, b1, b2, scratch);\n const dark = 1 - 0.07 * wet;\n // The film as an encoded colour, then as colour + alpha over the encoded paper colour.\n const e0 = linearToSrgb8(scratch[0] * dark);\n const e1 = linearToSrgb8(scratch[1] * dark);\n const e2 = linearToSrgb8(scratch[2] * dark);\n let alpha = a;\n alpha = needAlpha(e0, p0, alpha);\n alpha = needAlpha(e1, p1, alpha);\n alpha = needAlpha(e2, p2, alpha);\n if (alpha <= 0) {\n out[o] = px[i];\n out[o + 1] = px[i + 1];\n out[o + 2] = px[i + 2];\n out[o + 3] = 0;\n return;\n }\n const a8 = Math.max(Math.round(Math.min(1, alpha) * 255), pa);\n const al = a8 / 255;\n const inv = 1 / al;\n const k = 1 - al;\n out[o] = Math.round(Math.min(255, Math.max(0, (e0 - k * p0) * inv)));\n out[o + 1] = Math.round(Math.min(255, Math.max(0, (e1 - k * p1) * inv)));\n out[o + 2] = Math.round(Math.min(255, Math.max(0, (e2 - k * p2) * inv)));\n out[o + 3] = a8;\n}\n\n/** The alpha an encoded film value `e` needs over paper value `p` (bytes), at least `alpha`. */\nfunction needAlpha(e: number, p: number, alpha: number): number {\n if (e < p) return Math.max(alpha, 1 - e / p);\n if (e > p) return Math.max(alpha, (e - p) / (255 - p));\n return alpha;\n}\n\n/**\n * The pigment a layer pixel holds over the paper, as a transparent film (`K = −ln(below/paper)/2`,\n * `S` 0): what re-wetting lifts back into the water. Writes K r, g, b, S into `out`.\n */\nexport function pixelPigment(px: ArrayLike<number>, i: number, paper: ArrayLike<number>, out: Float64Array | number[]): void {\n const a = px[i + 3] / 255;\n for (let c = 0; c < 3; c++) {\n const p = Math.max(R_MIN, SRGB_TO_LINEAR[paper[c]]);\n const below = Math.max(R_MIN, srgbByteToLinear(a * px[i + c] + (1 - a) * paper[c]));\n out[c] = below < p ? -dlog(below / p) / 2 : 0;\n }\n out[3] = 0;\n}\n\n/**\n * `filmPixel` over a whole tile, specialised for speed (same results, pixel for pixel). Reads the\n * slot's planes from `f`: settled pigment at `d` (4 planes, `plane` floats apart), suspended pigment\n * at `p` (or −1 to leave it out), surface and paper water at `rho` / `sw` (or −1: no wet darkening).\n * Cell (x, y) of the tile is at offset `(y + 1)·side + x + 1` of each plane. `src` is the base tile\n * (or `null` for transparent); writes `out` (a copy of `src` where nothing changes). Returns\n * whether any pixel was shaded.\n */\nexport function shadeTile(\n f: Float32Array,\n plane: number,\n side: number,\n d: number,\n p: number,\n rho: number,\n sw: number,\n src: Uint8ClampedArray | null,\n out: Uint8ClampedArray,\n w: number,\n h: number,\n paper: Uint8Array\n): boolean {\n const p0 = paper[0];\n const p1 = paper[1];\n const p2 = paper[2];\n const lp0 = SRGB_TO_LINEAR[p0];\n const lp1 = SRGB_TO_LINEAR[p1];\n const lp2 = SRGB_TO_LINEAR[p2];\n const tab = EXP_TABLE;\n const enc = ENCODE;\n let any = false;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const c = (y + 1) * side + x + 1;\n let k0 = f[d + c];\n let k1 = f[d + plane + c];\n let k2 = f[d + 2 * plane + c];\n let s = f[d + 3 * plane + c];\n if (p >= 0) {\n k0 += f[p + c];\n k1 += f[p + plane + c];\n k2 += f[p + 2 * plane + c];\n s += f[p + 3 * plane + c];\n }\n let wet = 0;\n if (rho >= 0) {\n wet = f[rho + c] * 4 + f[sw + c];\n if (wet > 1) wet = 1;\n }\n if (!(k0 > 1e-7 || k1 > 1e-7 || k2 > 1e-7 || s > 1e-7) && wet <= 0) continue;\n any = true;\n const i = (y * 256 + x) * 4;\n const pa = src ? src[i + 3] : 0;\n const a = pa / 255;\n const na = 1 - a;\n const b0 = src ? srgbByteToLinear(a * src[i] + na * p0) : lp0;\n const b1 = src ? srgbByteToLinear(a * src[i + 1] + na * p1) : lp1;\n const b2 = src ? srgbByteToLinear(a * src[i + 2] + na * p2) : lp2;\n // filmReflectance, inlined\n let hide = 0;\n let x0: number;\n if (s > 0) {\n x0 = HIDE * s;\n hide = 1 - (x0 >= EXP_MAX ? 0 : interp(tab, x0 * EXP_RES));\n }\n const keep = 1 - hide;\n const inv = s > 1e-9 ? 1 / s : 0;\n let r0 = keep * expT(tab, 2 * k0) * b0;\n let r1 = keep * expT(tab, 2 * k1) * b1;\n let r2 = keep * expT(tab, 2 * k2) * b2;\n if (hide > 0) {\n r0 += hide * rinf(k0 * inv);\n r1 += hide * rinf(k1 * inv);\n r2 += hide * rinf(k2 * inv);\n }\n const dark = 1 - 0.07 * wet;\n const e0 = encode(enc, r0 * dark);\n const e1 = encode(enc, r1 * dark);\n const e2 = encode(enc, r2 * dark);\n let alpha = a;\n alpha = needAlpha(e0, p0, alpha);\n alpha = needAlpha(e1, p1, alpha);\n alpha = needAlpha(e2, p2, alpha);\n if (alpha <= 0) {\n out[i + 3] = 0;\n continue;\n }\n const a8 = Math.max(Math.round(Math.min(1, alpha) * 255), pa);\n const al = a8 / 255;\n const ia = 1 / al;\n const k = 1 - al;\n out[i] = Math.round(Math.min(255, Math.max(0, (e0 - k * p0) * ia)));\n out[i + 1] = Math.round(Math.min(255, Math.max(0, (e1 - k * p1) * ia)));\n out[i + 2] = Math.round(Math.min(255, Math.max(0, (e2 - k * p2) * ia)));\n out[i + 3] = a8;\n }\n }\n return any;\n}\n\nfunction interp(tab: Float64Array, t: number): number {\n const i = Math.floor(t);\n return tab[i] + (tab[i + 1] - tab[i]) * (t - i);\n}\n\nfunction expT(tab: Float64Array, x: number): number {\n if (!(x > 0)) return 1;\n if (x >= EXP_MAX) return 0;\n return interp(tab, x * EXP_RES);\n}\n\nfunction encode(enc: Uint8Array, v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 1) return 255;\n return enc[Math.round(v * ENC_STEPS)];\n}\n","/**\n * One wet-media step for the 256 × 256 interior of a tile slot, in plain TypeScript: the\n * specification of the model. Every intermediate is rounded to f32 (`F`) in the same order as the\n * WebAssembly SIMD kernel (`assembly/wet.ts`), so the two give identical bits: computing an f32\n * `+ − × ÷ √` in f64 and rounding once is exactly the f32 operation. Keep the two in step; the\n * kernel test compares them bit for bit.\n *\n * A slot is `SLOT_PLANES` planes of 258 × 258 f32 (the tile plus a one-cell halo, filled from the\n * neighbouring slots after each step). The step reads set `parity` (and the single planes) and\n * writes the interior of the other set, the deposit planes in place, and returns the tile's flags.\n *\n * Per cell x:\n * 1. Streaming with partial bounce-back: for each direction i, the source is n = x − eᵢ and the\n * blocking is b = max(κ(x), κ(n)), κ = blockScale·h. b = 1 off the canvas (h < 0) and where the\n * front is pinned: one side dry and the other shallower than the pin threshold\n * (pinT + rough·h)·(1 − paperWater/capacity) of the dry side, so damp paper does not pin.\n * Off-canvas cells (h < 0, in the halo or past a canvas edge inside a tile) only bounce back.\n * Symmetric in x and n, so water is conserved: fᵢ(x) = (1 − b)·f*ᵢ(n) + b·f*ₒₚₚ₍ᵢ₎(x).\n * 2. Depth and velocity; tilt plus the flow map shift the velocity (u += τ·g), capped at U_MAX.\n * 3. Absorption into the paper until it holds its capacity, and evaporation (faster in the edge\n * band); the collided populations are scaled by the depth ratio.\n * 4. BGK collision towards the D2Q9 equilibrium.\n * 5. Pigment (4 channels): upwind flux through the 4 faces with the previous step's velocities,\n * plus bleed (diffusion) between wet cells; never below 0.\n * 6. Deposition (more in valleys and in the edge band) and pickup (more where water arrives);\n * where a cell dries, all its suspended pigment settles.\n * 7. The edge field: max(dry neighbours / 4, 0.99 × the mean of the 4 neighbours' edge), at most\n * 1, and 0 where the cell is dry.\n */\n\nimport {\n DRY_EPS,\n FLAG_ALIVE,\n FLAG_WET,\n P_D0,\n P_EDGE,\n P_FX,\n P_FY,\n P_H,\n P_P0,\n P_RHO,\n P_SW,\n P_UX,\n P_UY,\n PARAM,\n PLANE,\n SET_PLANES,\n SLOT_SIDE,\n U_MAX,\n edgeBits,\n} from './model';\n\nconst F = Math.fround;\nconst S = SLOT_SIDE;\nconst EPS = F(DRY_EPS);\nconst UMAX2 = F(U_MAX * U_MAX);\nconst UMAXF = F(U_MAX);\nconst W0 = F(4 / 9);\nconst W1 = F(1 / 9);\nconst W2 = F(1 / 36);\nconst TINY = F(1e-9);\n/** The edge field's fall-off per cell (an f32 constant, as in the SIMD kernel). */\nconst DECAY = F(0.99);\n\n/** Neighbour n = x − eₖ as a float offset, k = 1..8 (the order of `EX` / `EY`). */\nconst NB = [0, -1, -S, 1, S, -S - 1, -S + 1, S + 1, S - 1];\nconst OPP = [0, 3, 4, 1, 2, 7, 8, 5, 6];\n\nconst fin = new Float32Array(9);\nconst pNew = new Float32Array(4);\n\n/**\n * Steps one slot. `f` views the whole memory; `base` is the slot's first float; `prm` is the\n * lane's packed parameters (`packWetParams`). Returns the tile's flag bits.\n */\nexport function stepSlotTs(f: Float32Array, base: number, parity: number, prm: Float32Array): number {\n const src = base + parity * SET_PLANES * PLANE;\n const dst = base + (1 - parity) * SET_PLANES * PLANE;\n const hP = base + P_H * PLANE;\n const dP = base + P_D0 * PLANE;\n const rhoS = src + P_RHO * PLANE;\n const uxS = src + P_UX * PLANE;\n const uyS = src + P_UY * PLANE;\n const swS = src + P_SW * PLANE;\n const pS = src + P_P0 * PLANE;\n const eS = src + P_EDGE * PLANE;\n\n const omega = prm[PARAM.omega];\n const tau = prm[PARAM.tau];\n const evap = prm[PARAM.evap];\n const edgeEvap = prm[PARAM.edgeEvap];\n const mobility = prm[PARAM.mobility];\n const depRate = prm[PARAM.depRate];\n const pickup = prm[PARAM.pickup];\n const absorption = prm[PARAM.absorption];\n const invCap = prm[PARAM.invCap];\n const blockScale = prm[PARAM.blockScale];\n const rough = prm[PARAM.rough];\n const pinT = prm[PARAM.pinT];\n const gx0 = prm[PARAM.gx];\n const gy0 = prm[PARAM.gy];\n const flowK = prm[PARAM.flowK];\n const gran = prm[PARAM.granulation];\n const edgeDep = prm[PARAM.edgeDep];\n const bloom = prm[PARAM.bloom];\n const paperEvap = prm[PARAM.paperEvap];\n const hasFlow = prm[PARAM.hasFlow] !== 0;\n const bleed = prm[PARAM.bleed];\n\n let flags = 0;\n for (let y = 1; y <= 256; y++) {\n for (let x = 1; x <= 256; x++) {\n const c = y * S + x;\n const hx = f[hP + c];\n const kx = F(blockScale * hx);\n const rx = f[rhoS + c];\n const sx = f[swS + c];\n const damp = Math.max(0, F(1 - F(sx * invCap)));\n const pinX = F(F(pinT + F(rough * hx)) * damp);\n const rxDry = rx < EPS;\n const xWall = hx < 0;\n\n // 1. streaming with partial bounce-back and pinning\n fin[0] = f[src + c];\n let dryNb = 0;\n for (let k = 1; k <= 8; k++) {\n const n = c + NB[k];\n const hn = f[hP + n];\n const rn = f[rhoS + n];\n const sn = f[swS + n];\n const wall = hn < 0;\n const rnDry = rn < EPS;\n // dry neighbours count for the edge as far as their paper is dry too (damp paper is no edge)\n const dampN = Math.max(0, F(1 - F(sn * invCap)));\n if (rnDry && !wall) dryNb = F(dryNb + dampN);\n let b = Math.max(kx, F(blockScale * hn));\n const pinN = F(F(pinT + F(rough * hn)) * dampN);\n if (wall || xWall || (rxDry && rn < pinX) || (rnDry && rx < pinN)) b = 1;\n fin[k] = F(F(F(1 - b) * f[src + k * PLANE + n]) + F(b * f[src + OPP[k] * PLANE + c]));\n }\n\n // 2. depth, velocity, forcing\n const rho = F(F(F(F(F(F(F(F(fin[0] + fin[1]) + fin[2]) + fin[3]) + fin[4]) + fin[5]) + fin[6]) + fin[7]) + fin[8]);\n const mx = F(F(F(F(F(fin[1] - fin[3]) + fin[5]) - fin[6]) - fin[7]) + fin[8]);\n const my = F(F(F(F(F(fin[2] - fin[4]) + fin[5]) + fin[6]) - fin[7]) - fin[8]);\n let gx = gx0;\n let gy = gy0;\n if (hasFlow) {\n gx = F(gx + F(flowK * f[base + P_FX * PLANE + c]));\n gy = F(gy + F(flowK * f[base + P_FY * PLANE + c]));\n }\n let ux = 0;\n let uy = 0;\n if (rho > EPS) {\n ux = F(F(mx / rho) + F(tau * gx));\n uy = F(F(my / rho) + F(tau * gy));\n }\n const sp2 = F(F(ux * ux) + F(uy * uy));\n if (sp2 > UMAX2) {\n const sc = F(UMAXF / F(Math.sqrt(sp2)));\n ux = F(ux * sc);\n uy = F(uy * sc);\n }\n\n // 3. absorption and evaporation\n const absorbed = Math.min(rho, F(F(F(absorption * F(1 - F(0.5 * hx))) * rho) * damp));\n const ex = f[eS + c];\n const ev = rho > 0 ? F(evap * F(1 + F(edgeEvap * ex))) : 0;\n const rhoNew = Math.max(0, F(F(rho - absorbed) - ev));\n const scale = rho > TINY ? F(rhoNew / rho) : 0;\n const sNew = Math.max(0, F(F(sx + absorbed) - (sx > 0 ? paperEvap : 0)));\n f[dst + P_SW * PLANE + c] = sNew;\n\n // 4. collision, then scale\n const usq = F(1.5 * F(F(ux * ux) + F(uy * uy)));\n const wr0 = F(W0 * rho);\n const wr1 = F(W1 * rho);\n const wr2 = F(W2 * rho);\n let feq = F(wr0 * F(1 - usq));\n f[dst + c] = F(F(fin[0] + F(omega * F(feq - fin[0]))) * scale);\n for (let k = 1; k <= 8; k++) {\n let eu: number;\n let wr = wr1;\n switch (k) {\n case 1: eu = ux; break;\n case 2: eu = uy; break;\n case 3: eu = -ux; break;\n case 4: eu = -uy; break;\n case 5: eu = F(ux + uy); wr = wr2; break;\n case 6: eu = F(uy - ux); wr = wr2; break;\n case 7: eu = -F(ux + uy); wr = wr2; break;\n default: eu = F(ux - uy); wr = wr2; break;\n }\n feq = F(wr * F(F(F(1 + F(3 * eu)) + F(F(4.5 * eu) * eu)) - usq));\n f[dst + k * PLANE + c] = F(F(fin[k] + F(omega * F(feq - fin[k]))) * scale);\n }\n\n // 5. pigment: upwind advection with the last step's velocities, plus bleed\n const rxWet = !rxDry;\n const uxc = f[uxS + c];\n const uyc = f[uyS + c];\n for (let q = 0; q < 4; q++) pNew[q] = f[pS + q * PLANE + c];\n // east, west, south (y + 1), north (y − 1)\n for (let face = 0; face < 4; face++) {\n const nb = c + (face === 0 ? 1 : face === 1 ? -1 : face === 2 ? S : -S);\n const open = rxWet && f[rhoS + nb] >= EPS;\n const uf = face === 0 ? F(mobility * F(uxc + f[uxS + nb])) : face === 1 ? F(mobility * F(f[uxS + nb] + uxc)) : face === 2 ? F(mobility * F(uyc + f[uyS + nb])) : F(mobility * F(f[uyS + nb] + uyc));\n const out = face === 0 || face === 2;\n for (let q = 0; q < 4; q++) {\n const pc = f[pS + q * PLANE + c];\n const pn = f[pS + q * PLANE + nb];\n // outgoing faces (east, south): flux = uf > 0 ? uf·pc : uf·pn, subtracted;\n // incoming faces (west, north): flux = uf > 0 ? uf·pn : uf·pc, added.\n const flux = out ? (uf > 0 ? F(uf * pc) : F(uf * pn)) : uf > 0 ? F(uf * pn) : F(uf * pc);\n const diff = F(bleed * F(pn - pc));\n const v = out ? F(F(pNew[q] - flux) + diff) : F(F(pNew[q] + flux) + diff);\n pNew[q] = open ? v : pNew[q];\n }\n }\n\n // 6. deposition and pickup\n const dryNow = rhoNew < EPS;\n const rate = F(F(depRate * F(1 + F(gran * F(1 - hx)))) * F(1 + F(edgeDep * ex)));\n const lift = dryNow ? 0 : F(F(pickup * Math.min(rhoNew, 1)) * F(1 + F(bloom * Math.max(0, F(rhoNew - rx)))));\n for (let q = 0; q < 4; q++) {\n const pq = Math.max(0, pNew[q]);\n const dq = f[dP + q * PLANE + c];\n const dep = dryNow ? pq : Math.min(pq, F(pq * rate));\n const lq = F(dq * lift);\n f[dst + (P_P0 + q) * PLANE + c] = F(F(pq - dep) + lq);\n f[dP + q * PLANE + c] = F(F(dq + dep) - lq);\n }\n // the edge field: 1 next to dry paper, spreading inwards at 0.99 per cell; 0 where dry\n const mean4 = F(F(F(F(f[eS + c + 1] + f[eS + c - 1]) + f[eS + c + S]) + f[eS + c - S]) * 0.25);\n const eNew = Math.min(1, Math.max(Math.min(1, F(dryNb * 0.25)), F(DECAY * mean4)));\n f[dst + P_EDGE * PLANE + c] = dryNow ? 0 : eNew;\n f[dst + P_RHO * PLANE + c] = rhoNew;\n f[dst + P_UX * PLANE + c] = dryNow ? 0 : ux;\n f[dst + P_UY * PLANE + c] = dryNow ? 0 : uy;\n const alive = rhoNew > 0 || sNew > 0;\n if (alive) flags |= FLAG_ALIVE | edgeBits(x - 1, y - 1);\n if (!dryNow) flags |= FLAG_WET;\n }\n }\n return flags;\n}\n","/**\n * Loading the wet-media WebAssembly kernel and its Web Workers.\n *\n * - The kernel is two small modules (shared memory for workers, ordinary memory for one thread),\n * embedded base64 in `kernel-wasm.ts`, which is only ever imported dynamically, so bundlers split\n * it into its own chunk and nothing loads until the first wet stroke.\n * - Workers run from a Blob URL of `wetWorkerMain`'s source: no extra file for the host to serve\n * and no bundler configuration. They share one `WebAssembly.Memory`, which needs\n * `SharedArrayBuffer`, which browsers only give cross-origin isolated pages (COOP `same-origin`\n * plus COEP `require-corp` or `credentialless`). Without it the kernel runs on one thread.\n * - Everything here is optional: without WebAssembly SIMD the TypeScript kernel runs, with the same\n * results (only slower).\n */\n\n/** What the wet engine can use here, and why not when it cannot. */\nexport interface WetSupport {\n /** WebAssembly with SIMD. */\n simd: boolean;\n /** `SharedArrayBuffer` and shared wasm memory (cross-origin isolation in browsers). */\n sharedMemory: boolean;\n /** Web Workers. */\n workers: boolean;\n /** Logical cores reported (`navigator.hardwareConcurrency`, 1 when unknown). */\n cores: number;\n /** A sentence for the user when wet paint will run slower than it could, else `null`. */\n message: string | null;\n}\n\nlet modules: { shared?: Promise<WebAssembly.Module>; single?: Promise<WebAssembly.Module> } = {};\n\nfunction decode(base64: string): Uint8Array {\n const g = globalThis as { atob?: (s: string) => string; Buffer?: { from(s: string, e: string): Uint8Array } };\n if (g.Buffer) return new Uint8Array(g.Buffer.from(base64, 'base64'));\n const bin = g.atob!(base64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** Compiles the kernel (`shared`: the shared-memory variant). Cached; loads the chunk once. */\nexport function loadWetKernel(shared: boolean): Promise<WebAssembly.Module> {\n const key = shared ? 'shared' : 'single';\n let p = modules[key];\n if (!p) {\n p = import('./kernel-wasm').then((m) => WebAssembly.compile(decode(shared ? m.WET_KERNEL_SHARED : m.WET_KERNEL_SINGLE) as BufferSource));\n p.catch(() => {\n modules = { ...modules, [key]: undefined };\n });\n modules[key] = p;\n }\n return p;\n}\n\n/** Whether shared wasm memory can be made here. */\nexport function canShareMemory(): boolean {\n const g = globalThis as { SharedArrayBuffer?: unknown; crossOriginIsolated?: boolean };\n if (typeof g.SharedArrayBuffer !== 'function') return false;\n if (g.crossOriginIsolated === false) return false;\n try {\n new WebAssembly.Memory({ initial: 1, maximum: 1, shared: true });\n return true;\n } catch {\n return false;\n }\n}\n\nlet simdCache: boolean | null = null;\n\n/** Whether this runtime validates WebAssembly SIMD (checked against the kernel itself). */\nexport async function wetSimdSupported(): Promise<boolean> {\n if (simdCache !== null) return simdCache;\n if (typeof WebAssembly === 'undefined') return (simdCache = false);\n try {\n await loadWetKernel(false);\n simdCache = true;\n } catch {\n simdCache = false;\n }\n return simdCache;\n}\n\n/** What the wet engine can use (SIMD is only known after `wetSimdSupported`). */\nexport function wetSupport(simd = simdCache ?? typeof WebAssembly !== 'undefined'): WetSupport {\n const g = globalThis as { Worker?: unknown; navigator?: { hardwareConcurrency?: number } };\n const sharedMemory = canShareMemory();\n const workers = typeof g.Worker === 'function' && typeof Blob === 'function' && typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function';\n const cores = Math.max(1, Math.floor(g.navigator?.hardwareConcurrency ?? 1));\n let message: string | null = null;\n if (!simd) message = 'This browser has no WebAssembly SIMD, so wet paint runs in plain JavaScript: it flows much more slowly (the results are the same).';\n else if (workers && !sharedMemory)\n message =\n 'Wet paint runs on one thread because this page is not cross-origin isolated, so it flows more slowly. Serve the page with \"Cross-Origin-Opener-Policy: same-origin\" and \"Cross-Origin-Embedder-Policy: require-corp\" (or \"credentialless\") to use every core.';\n return { simd, sharedMemory, workers, cores, message };\n}\n\n/**\n * The worker's whole program. It is turned into source with `toString()`, so it must not use\n * anything from outside its own body: every constant arrives in the `init` message.\n */\nfunction wetWorkerMain(): void {\n type Exports = {\n step: (base: number, parity: number, prm: number) => number;\n halo: (table: number, slots: number, key: number, perLane: number, tilesX: number, tilesY: number, set: number) => void;\n };\n type Layout = { ctl: number; params: number; table: number; list: number; flags: number; last: number; slots: number; slotBytes: number; perLane: number; tilesX: number; tilesY: number; keys: number };\n const scope = self as unknown as { onmessage: ((e: MessageEvent) => void) | null; postMessage(m: unknown): void };\n let exports: Exports | null = null;\n let memory: WebAssembly.Memory | null = null;\n let L: Layout | null = null;\n let id = 0;\n\n function barrier(ctl: Int32Array, n: number): void {\n const gen = Atomics.load(ctl, 1);\n if (Atomics.add(ctl, 0, 1) === n - 1) {\n Atomics.store(ctl, 0, 0);\n Atomics.add(ctl, 1, 1);\n Atomics.notify(ctl, 1);\n } else {\n while (Atomics.load(ctl, 1) === gen) Atomics.wait(ctl, 1, gen);\n }\n }\n\n function run(steps: number, n: number): void {\n const ex = exports!;\n const l = L!;\n const buf = memory!.buffer;\n const ctl = new Int32Array(buf, l.ctl, 16);\n const table = new Int32Array(buf, l.table, l.keys);\n const list = new Int32Array(buf, l.list, l.keys);\n const flags = new Uint32Array(buf, l.flags, l.keys);\n const last = new Uint32Array(buf, l.last, l.keys);\n const count = ctl[4];\n let parity = ctl[5];\n for (let s = 0; s < steps; s++) {\n for (;;) {\n const a = Atomics.add(ctl, 2, 1);\n if (a >= count) break;\n const key = list[a];\n const lane = (key / l.perLane) | 0;\n const f = ex.step(l.slots + table[key] * l.slotBytes, parity, l.params + lane * 128);\n flags[key] |= f;\n last[key] = f;\n }\n if (id === 0) Atomics.store(ctl, 3, 0);\n barrier(ctl, n);\n for (;;) {\n const a = Atomics.add(ctl, 3, 1);\n if (a >= count) break;\n ex.halo(l.table, l.slots, list[a], l.perLane, l.tilesX, l.tilesY, 1 - parity);\n }\n if (id === 0) Atomics.store(ctl, 2, 0);\n barrier(ctl, n);\n parity = 1 - parity;\n }\n }\n\n scope.onmessage = (e: MessageEvent) => {\n const m = e.data as { type: string; module?: WebAssembly.Module; memory?: WebAssembly.Memory; layout?: Layout; id?: number; steps?: number; workers?: number };\n if (m.type === 'init') {\n memory = m.memory!;\n L = m.layout!;\n id = m.id!;\n WebAssembly.instantiate(m.module!, { env: { memory } }).then(\n (inst) => {\n exports = inst.exports as unknown as Exports;\n scope.postMessage({ type: 'ready', id });\n },\n (err: unknown) => scope.postMessage({ type: 'error', id, message: String(err) })\n );\n } else if (m.type === 'layout') {\n L = m.layout!;\n } else if (m.type === 'run') {\n try {\n run(m.steps!, m.workers!);\n scope.postMessage({ type: 'done', id });\n } catch (err) {\n scope.postMessage({ type: 'error', id, message: String(err) });\n }\n }\n };\n}\n\n/** The layout numbers a worker needs. */\nexport interface WetWorkerLayout {\n ctl: number;\n params: number;\n table: number;\n list: number;\n flags: number;\n last: number;\n slots: number;\n slotBytes: number;\n perLane: number;\n tilesX: number;\n tilesY: number;\n keys: number;\n}\n\n/** A pool of workers stepping one shared memory together. */\nexport class WetWorkerPool {\n private constructor(\n private readonly workers: Worker[],\n private readonly url: string\n ) {}\n\n get size(): number {\n return this.workers.length;\n }\n\n /** Starts `count` workers on `memory` (shared) with the shared kernel. Rejects if any fails. */\n static async create(count: number, module: WebAssembly.Module, memory: WebAssembly.Memory, layout: WetWorkerLayout): Promise<WetWorkerPool> {\n const source = `(${wetWorkerMain.toString()})();`;\n const url = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n const workers: Worker[] = [];\n try {\n const ready: Promise<void>[] = [];\n for (let i = 0; i < count; i++) {\n const w = new Worker(url);\n workers.push(w);\n ready.push(\n new Promise<void>((resolve, reject) => {\n w.onmessage = (e: MessageEvent) => {\n if (e.data?.type === 'ready') resolve();\n else if (e.data?.type === 'error') reject(new Error(e.data.message));\n };\n w.onerror = (e) => reject(new Error(e.message || 'The wet-media worker failed to start.'));\n })\n );\n w.postMessage({ type: 'init', module, memory, layout, id: i });\n }\n await Promise.all(ready);\n } catch (e) {\n for (const w of workers) w.terminate();\n URL.revokeObjectURL(url);\n throw e;\n }\n return new WetWorkerPool(workers, url);\n }\n\n /** Runs `steps` steps over the active list in shared memory; resolves when every worker is done. */\n run(steps: number): Promise<void> {\n const n = this.workers.length;\n return Promise.all(\n this.workers.map(\n (w, i) =>\n new Promise<void>((resolve, reject) => {\n w.onmessage = (e: MessageEvent) => {\n if (e.data?.type === 'done') resolve();\n else if (e.data?.type === 'error') reject(new Error(e.data.message));\n };\n w.postMessage({ type: 'run', steps, workers: n, id: i });\n })\n )\n ).then(() => undefined);\n }\n\n destroy(): void {\n for (const w of this.workers) w.terminate();\n URL.revokeObjectURL(this.url);\n }\n}\n","/**\n * `WetWorld`: the wet-media simulation of one canvas. It holds up to `MAX_WET_LANES` wet layers\n * (\"lanes\"), each a sparse set of 256 px tile slots in one `WebAssembly.Memory`, and steps all of\n * them together.\n *\n * - **Kernels.** It starts on the TypeScript kernel at once and switches to the WebAssembly SIMD\n * kernel (in Web Workers when the page is cross-origin isolated, else on this thread) as soon as\n * that has loaded. The kernels give identical bits, so the switch never changes the painting.\n * - **Determinism.** Time is counted in steps (`clock`), never in wall time. Batches never cross a\n * multiple of `FREE_INTERVAL` and are at most `MAX_BATCH` steps, tiles wake up when anything\n * alive comes within `STRIP` cells of their edge (so earlier or later wake-ups change nothing),\n * and dry tiles are baked and freed only on multiples of `FREE_INTERVAL`, judged by their state\n * at that step. So the result depends only on the edits and the steps at which they were made,\n * not on frame rate, batch sizes, worker counts or the browser.\n * - **Edits** (dabs, water, drying, blowing, blending, smudging, blotting, re-wetting) run on this\n * thread between batches; while a batch runs (`busy`) they throw, so callers queue them.\n * - **Display.** Each lane has a `base` surface: the layer's pixels under the wet paint. `display`\n * gives the base with every live tile shaded (`filmPixel`), as an ordinary RGBA surface for the\n * compositor. Tiles that dry are baked into the base and their slots freed.\n * - **Engine B (WebGPU).** With a GPU engine attached (`attachGpu`) and at least `gpuMinTiles` live\n * tiles, the GPU keeps a mirror of the slots: each edit uploads the rows it changed, each batch\n * runs on the GPU too, and `displayGpu` shades every stale tile there at once. In lead mode\n * (between strokes) the GPU steps a batch frame by frame while the CPU computes it (`gpuLead`).\n * The CPU state stays the authority (edits, reads, drying, snapshots, baking); the GPU's copy\n * only feeds the display.\n */\n\nimport { TILE, TiledSurface, finishTile, tileKey, type RasterRect, type Tile } from '../../raster/surface';\nimport { filmPixel, pixelPigment, shadeTile } from './film';\nimport { stepSlotTs } from './kernel';\nimport {\n DEFAULT_WET_PAPER,\n DEFAULT_WET_PARAMS,\n DRY_EPS,\n EX,\n EY,\n FLAG_ALIVE,\n FLAG_BOTTOM,\n FLAG_LEFT,\n FLAG_RIGHT,\n FLAG_TOP,\n FLAT,\n FREE_INTERVAL,\n MAX_BATCH,\n P_D0,\n P_FX,\n P_FY,\n P_H,\n P_P0,\n P_RHO,\n P_SW,\n P_UX,\n P_UY,\n PARAM_FLOATS,\n PLANE,\n SET_PLANES,\n SLOT_BYTES,\n SLOT_PLANES,\n SLOT_SIDE,\n STRIP,\n W9,\n WET_TILE,\n normalizeTilt,\n PAPER_CAPACITY,\n normalizeWetParams,\n packWetParams,\n type WetPaper,\n type WetParams,\n type WetTilt,\n} from './model';\nimport { canShareMemory, loadWetKernel, wetSimdSupported, wetSupport, WetWorkerPool, type WetSupport, type WetWorkerLayout } from './wasm';\nimport type { WetGpuEngine, WetGpuJob } from './gpu';\n\n/** Wet layers a world can hold at once. */\nexport const MAX_WET_LANES = 8;\n/** Tile slots at most (about 3.8 GB, inside wasm32's 4 GB). Water reaching a tile past this is lost. */\nexport const MAX_WET_SLOTS = 352;\n/** Floats per slot. */\nconst SLOT_FLOATS = SLOT_PLANES * PLANE;\nconst S = SLOT_SIDE;\n/** Planes a snapshot keeps per slot: the current set and the deposit. */\nconst SNAP_PLANES = SET_PLANES + 4;\n\n/** A flow map: a vector per document pixel, in cells per step² at strength 1. */\nexport type WetFlowField = (x: number, y: number) => readonly [number, number];\n\n/** The paper as the simulation reads it. */\nexport interface WetPaperInput extends WetPaper {\n /** Grain height 0..1 at a document position (the paper's wet height map). */\n heightAt(x: number, y: number): number;\n /** Paper colour, sRGB bytes. */\n color: readonly [number, number, number];\n}\n\nexport type WetKernelKind = 'typescript' | 'wasm' | 'wasm-threads';\n\nexport interface WetBackendInfo {\n kind: WetKernelKind;\n /** Threads stepping the simulation. */\n threads: number;\n /** Why it runs slower than it could, or `null`. */\n message: string | null;\n}\n\nexport interface WetWorldOptions {\n /** Which kernel: `auto` (default: the fastest available), or force `typescript` / `wasm` (one thread). */\n kernel?: 'auto' | 'typescript' | 'wasm';\n /** Worker threads for the wasm kernel: `auto` (default: cores − 1, at most 10) or a number (0: none). */\n threads?: number | 'auto';\n}\n\nexport interface WetLaneOptions {\n params?: Partial<WetParams>;\n /** The layer's pixels under the wet paint (default empty). */\n base?: TiledSurface;\n flow?: WetFlowField | null;\n /** Flow map strength (default 1 when a flow map is given). */\n flowStrength?: number;\n}\n\ninterface Lane {\n id: string;\n index: number;\n params: WetParams;\n flow: WetFlowField | null;\n flowStrength: number;\n base: TiledSurface;\n /** Shaded display tiles by tile key, with the stamp they were shaded at. */\n shaded: Map<number, { stamp: number; tile: Tile }>;\n /** Tile keys edited since they were last shaded (shaded first). */\n urgent: Set<number>;\n /** Changes whenever its pixels (display) may have changed. */\n stamp: number;\n display: TiledSurface | null;\n /** Bumped whenever `shaded` changes; with the base id it keys the cached display. */\n shadedVersion: number;\n displayKey: string;\n}\n\n/** Totals for one wet layer. */\nexport interface WetLaneStats {\n /** Tiles being simulated. */\n activeTiles: number;\n /** Cells with surface water (at least `DRY_EPS` deep). */\n wetCells: number;\n /** Water on the surface plus in the paper, in cell-depth units. */\n water: number;\n /** Suspended plus settled pigment mass (sum of the four channels). */\n pigment: number;\n /** Document rectangle of the wet cells, or `null` when nothing is wet. */\n wetBounds: RasterRect | null;\n}\n\n/** A copy of the whole simulation (for undo). */\nexport interface WetSnapshot {\n readonly clock: number;\n readonly tilt: WetTilt;\n readonly lanes: ReadonlyArray<{ id: string; index: number; params: WetParams; flow: WetFlowField | null; flowStrength: number; base: TiledSurface }>;\n /** Per active key: the current set and the deposit planes; and its last flags. */\n readonly slots: ReadonlyMap<number, { planes: Float32Array; last: number }>;\n /** Bytes held. */\n readonly bytes: number;\n}\n\n/** Thrown for edits while a batch is running, and for bad arguments. */\nexport class WetWorldError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WetWorldError';\n }\n}\n\ninterface Layout extends WetWorkerLayout {\n width: number;\n height: number;\n}\n\nfunction makeLayout(width: number, height: number): Layout {\n const tilesX = Math.ceil(width / WET_TILE);\n const tilesY = Math.ceil(height / WET_TILE);\n const perLane = tilesX * tilesY;\n const keys = perLane * MAX_WET_LANES;\n const ctl = 0;\n const params = 1024;\n const table = params + MAX_WET_LANES * PARAM_FLOATS * 4;\n const list = table + keys * 4;\n const flags = list + keys * 4;\n const last = flags + keys * 4;\n const slots = Math.ceil((last + keys * 4) / 65536) * 65536;\n return { width, height, tilesX, tilesY, perLane, keys, ctl, params, table, list, flags, last, slots, slotBytes: SLOT_BYTES };\n}\n\n/** Rounds a height to 1/65536 so tiny floating-point differences in the grain never reach the simulation. */\nfunction quantizeHeight(v: number): number {\n return Math.round(Math.min(1, Math.max(0, v)) * 65536) / 65536;\n}\n\nexport class WetWorld {\n readonly width: number;\n readonly height: number;\n readonly layout: Layout;\n /** Steps simulated so far. */\n clock = 0;\n /** Messages for the user (slots ran out, a backend failed). */\n readonly warnings: string[] = [];\n private memory: WebAssembly.Memory;\n private readonly shared: boolean;\n private f32!: Float32Array;\n private i32!: Int32Array;\n private u32!: Uint32Array;\n private slotCount = 0;\n private readonly freeSlots: number[] = [];\n private readonly active: number[] = [];\n private parity = 0;\n private readonly lanes: (Lane | null)[] = new Array(MAX_WET_LANES).fill(null);\n private tilt: WetTilt = { ...FLAT };\n private paper: WetPaperInput;\n private paperBytes = new Uint8Array(3);\n private kind: WetKernelKind = 'typescript';\n private wasm: { step: (base: number, parity: number, prm: number) => number; halo: (table: number, slots: number, key: number, perLane: number, tilesX: number, tilesY: number, set: number) => void } | null = null;\n private pool: WetWorkerPool | null = null;\n private busyFlag = false;\n private destroyed = false;\n private support: WetSupport;\n private readonly prm = new Float32Array(PARAM_FLOATS);\n // Engine B: the GPU mirror (see `attachGpu`).\n private gpu: WetGpuEngine | null = null;\n /** Live tiles at which the GPU takes over the display (default 16: a fully wet 1024² canvas). */\n gpuMinTiles = 16;\n private gpuLive = false;\n private gpuFailure: string | null = null;\n /** Slot → rows (1..256, inclusive) to upload; `[0, 257]` means the whole slot. */\n private readonly gpuDirty = new Map<number, [number, number]>();\n private gpuParamsDirty = true;\n /**\n * Lead mode (between strokes): a batch is not sent to the GPU all at once; `gpuLead` steps it\n * frame by frame while the CPU works through it, so the display moves on before the CPU is done.\n */\n gpuLeadMode = false;\n /** The batch the GPU is working through in lead mode. */\n private gpuPlan: { jobs: WetGpuJob[]; parity: number; total: number; done: number } | null = null;\n /** Resolves when the fastest available kernel is running (it may stay `typescript`). */\n readonly ready: Promise<WetBackendInfo>;\n\n constructor(width: number, height: number, paper: WetPaperInput, options: WetWorldOptions = {}) {\n if (!(width >= 1 && height >= 1 && width <= 16384 && height <= 16384)) throw new WetWorldError(`A wet canvas must be 1..16384 pixels per side, not ${width}×${height}.`);\n this.width = Math.round(width);\n this.height = Math.round(height);\n this.paper = paper;\n this.paperBytes.set(paper.color);\n this.layout = makeLayout(this.width, this.height);\n const wantKernel = options.kernel ?? 'auto';\n const threads = options.threads ?? 'auto';\n this.shared = wantKernel === 'auto' && threads !== 0 && canShareMemory();\n const pages = this.layout.slots / 65536 + Math.ceil((2 * SLOT_BYTES) / 65536);\n const maxPages = Math.min(65536, Math.ceil((this.layout.slots + MAX_WET_SLOTS * SLOT_BYTES) / 65536));\n this.memory = this.shared ? new WebAssembly.Memory({ initial: pages, maximum: maxPages, shared: true }) : new WebAssembly.Memory({ initial: pages });\n this.views();\n new Int32Array(this.memory.buffer, this.layout.table, this.layout.keys).fill(-1);\n this.support = wetSupport(true);\n this.ready = wantKernel === 'typescript' ? Promise.resolve(this.backend()) : this.start(threads);\n }\n\n // --- Backends ------------------------------------------------------------------\n\n private views(): void {\n const buf = this.memory.buffer;\n this.f32 = new Float32Array(buf);\n this.i32 = new Int32Array(buf);\n this.u32 = new Uint32Array(buf);\n }\n\n private async start(threads: number | 'auto'): Promise<WetBackendInfo> {\n try {\n const simd = await wetSimdSupported();\n this.support = wetSupport(simd);\n if (!simd || this.destroyed) return this.backend();\n const module = await loadWetKernel(this.shared);\n const inst = await WebAssembly.instantiate(module, { env: { memory: this.memory } });\n if (this.destroyed) return this.backend();\n this.wasm = inst.exports as unknown as NonNullable<WetWorld['wasm']>;\n this.kind = 'wasm';\n const n = threads === 'auto' ? Math.max(1, Math.min(10, this.support.cores - 1)) : Math.max(0, Math.floor(threads));\n if (this.shared && this.support.workers && n >= 2) {\n try {\n const pool = await WetWorkerPool.create(n, module, this.memory, this.layout);\n if (this.destroyed) pool.destroy();\n else {\n this.pool = pool;\n this.kind = 'wasm-threads';\n }\n } catch (e) {\n this.warnings.push(`Wet paint could not start its worker threads (${(e as Error).message}); it runs on one thread.`);\n }\n }\n } catch (e) {\n this.warnings.push(`The WebAssembly wet-media kernel did not load (${(e as Error).message}); wet paint runs in plain JavaScript.`);\n }\n return this.backend();\n }\n\n /** The kernel in use and why it is not faster. */\n backend(): WetBackendInfo {\n const threads = this.pool?.size ?? 1;\n let message = this.support.message;\n if (this.kind === 'typescript' && !message) message = this.wasm ? null : 'Wet paint runs in plain JavaScript until the WebAssembly kernel has loaded.';\n if (this.kind === 'wasm-threads') message = null;\n return { kind: this.kind, threads, message };\n }\n\n /** Whether a batch is running (edits throw until it ends). */\n get busy(): boolean {\n return this.busyFlag;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.pool?.destroy();\n this.pool = null;\n }\n\n // --- Lanes ---------------------------------------------------------------------\n\n private laneOf(id: string): Lane {\n const l = this.lanes.find((x) => x?.id === id);\n if (!l) throw new WetWorldError(`There is no wet layer \"${id}\".`);\n return l;\n }\n\n hasLane(id: string): boolean {\n return this.lanes.some((x) => x?.id === id);\n }\n\n laneIds(): string[] {\n return this.lanes.filter((l): l is Lane => Boolean(l)).map((l) => l.id);\n }\n\n /** Adds a wet layer (or returns it). Throws when `MAX_WET_LANES` are in use. */\n ensureLane(id: string, options: WetLaneOptions = {}): void {\n this.requireIdle();\n const existing = this.lanes.find((x) => x?.id === id);\n if (existing) {\n if (options.params) this.setParams(id, options.params);\n if (options.base) this.setBase(id, options.base);\n return;\n }\n const index = this.lanes.indexOf(null);\n if (index < 0) throw new WetWorldError(`At most ${MAX_WET_LANES} layers can hold wet paint at once; dry one (dry_paint) first.`);\n this.lanes[index] = {\n id,\n index,\n params: normalizeWetParams(options.params ?? {}, DEFAULT_WET_PARAMS),\n flow: options.flow ?? null,\n flowStrength: options.flow ? (options.flowStrength ?? 1) : 0,\n base: options.base ?? new TiledSurface(4, new Map(), 0),\n shaded: new Map(),\n urgent: new Set(),\n stamp: 1,\n display: null,\n shadedVersion: 0,\n displayKey: '',\n };\n this.pack(this.lanes[index]!);\n }\n\n /** Drops a wet layer and its wet paint (nothing is baked). */\n removeLane(id: string): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n for (const key of [...this.active]) if (this.laneIndexOf(key) === lane.index) this.free(key);\n this.lanes[lane.index] = null;\n }\n\n getParams(id: string): WetParams {\n return { ...this.laneOf(id).params };\n }\n\n setParams(id: string, params: Partial<WetParams>): WetParams {\n this.requireIdle();\n const lane = this.laneOf(id);\n lane.params = normalizeWetParams(params, lane.params);\n this.pack(lane);\n return { ...lane.params };\n }\n\n getTilt(): WetTilt {\n return { ...this.tilt };\n }\n\n setTilt(tilt: Partial<WetTilt>): WetTilt {\n this.requireIdle();\n this.tilt = normalizeTilt(tilt, this.tilt);\n for (const l of this.lanes) if (l) this.pack(l);\n return { ...this.tilt };\n }\n\n /** Changes the paper: heights of live tiles are refilled, rates repacked. */\n setPaper(paper: WetPaperInput): void {\n this.requireIdle();\n this.paper = paper;\n this.paperBytes.set(paper.color);\n for (const key of this.active) this.fillPaper(key);\n for (const l of this.lanes) {\n if (!l) continue;\n this.pack(l);\n this.touchAll(l);\n }\n this.refreshHalos();\n }\n\n /** Sets a layer's flow map (`null` removes it). */\n setFlow(id: string, flow: WetFlowField | null, strength = 1): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n lane.flow = flow;\n lane.flowStrength = flow ? strength : 0;\n this.pack(lane);\n for (const key of this.active) if (this.laneIndexOf(key) === lane.index) this.fillFlow(key);\n }\n\n hasFlow(id: string): boolean {\n return Boolean(this.laneOf(id).flow);\n }\n\n /** The pixels under a layer's wet paint. */\n getBase(id: string): TiledSurface {\n return this.laneOf(id).base;\n }\n\n /** Replaces the pixels under a layer's wet paint. */\n setBase(id: string, base: TiledSurface): void {\n const lane = this.laneOf(id);\n if (base === lane.base) return;\n lane.base = base;\n lane.shaded.clear();\n lane.shadedVersion++;\n lane.stamp++;\n }\n\n private pack(lane: Lane): void {\n packWetParams(lane.params, this.paper ?? DEFAULT_WET_PAPER, this.tilt, lane.flowStrength, this.prm);\n this.f32.set(this.prm, (this.layout.params + lane.index * PARAM_FLOATS * 4) >> 2);\n this.gpuParamsDirty = true;\n }\n\n private touchAll(lane: Lane): void {\n lane.stamp++;\n }\n\n // --- Slots ---------------------------------------------------------------------\n\n private laneIndexOf(key: number): number {\n return Math.floor(key / this.layout.perLane);\n }\n\n private slotOf(key: number): number {\n return this.i32[(this.layout.table >> 2) + key];\n }\n\n private slotBase(slot: number): number {\n return (this.layout.slots >> 2) + slot * SLOT_FLOATS;\n }\n\n private requireIdle(): void {\n if (this.busyFlag) throw new WetWorldError('The wet simulation is mid-step; wait for it (whenIdle) before changing it.');\n }\n\n /** Writes the active list into memory for the kernels. */\n private syncList(): void {\n const base = this.layout.list >> 2;\n this.active.sort((a, b) => a - b);\n for (let i = 0; i < this.active.length; i++) this.i32[base + i] = this.active[i];\n this.i32[(this.layout.ctl >> 2) + 4] = this.active.length;\n }\n\n private grow(slots: number): boolean {\n const need = this.layout.slots + slots * SLOT_BYTES;\n const have = this.memory.buffer.byteLength;\n if (need <= have) return true;\n try {\n this.memory.grow(Math.ceil((need - have) / 65536));\n } catch {\n return false;\n }\n this.views();\n return true;\n }\n\n /** Activates a tile of a lane. Returns false when no slot can be had. */\n private activate(key: number): boolean {\n if (this.slotOf(key) >= 0) return true;\n let slot = this.freeSlots.pop();\n if (slot === undefined) {\n if (this.slotCount >= MAX_WET_SLOTS || !this.grow(this.slotCount + 1)) {\n const msg = `Wet paint reached its memory limit (${MAX_WET_SLOTS} tiles of 256 px); water spreading further is lost. Dry some paint (dry_paint) to free memory.`;\n if (!this.warnings.includes(msg)) this.warnings.push(msg);\n return false;\n }\n slot = this.slotCount++;\n }\n const base = this.slotBase(slot);\n this.f32.fill(0, base, base + SLOT_FLOATS);\n this.i32[(this.layout.table >> 2) + key] = slot;\n this.u32[(this.layout.flags >> 2) + key] = 0;\n this.u32[(this.layout.last >> 2) + key] = 0;\n this.active.push(key);\n this.fillPaper(key);\n this.fillFlow(key);\n return true;\n }\n\n private free(key: number): void {\n const slot = this.slotOf(key);\n if (slot < 0) return;\n this.i32[(this.layout.table >> 2) + key] = -1;\n this.freeSlots.push(slot);\n const i = this.active.indexOf(key);\n if (i >= 0) this.active.splice(i, 1);\n const lane = this.lanes[this.laneIndexOf(key)];\n if (lane) {\n if (lane.shaded.delete(this.tileKeyOf(key))) lane.shadedVersion++;\n lane.stamp++;\n }\n }\n\n private tileXY(key: number): [number, number] {\n const t = key % this.layout.perLane;\n return [t % this.layout.tilesX, Math.floor(t / this.layout.tilesX)];\n }\n\n private tileKeyOf(key: number): number {\n const [tx, ty] = this.tileXY(key);\n return tileKey(tx, ty);\n }\n\n private fillPaper(key: number): void {\n this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n const [tx, ty] = this.tileXY(key);\n const h = this.slotBase(this.slotOf(key)) + P_H * PLANE;\n const { width, height } = this;\n for (let y = 0; y < S; y++) {\n const gy = ty * WET_TILE + y - 1;\n for (let x = 0; x < S; x++) {\n const gx = tx * WET_TILE + x - 1;\n this.f32[h + y * S + x] = gx < 0 || gy < 0 || gx >= width || gy >= height ? -1 : quantizeHeight(this.paper.heightAt(gx + 0.5, gy + 0.5));\n }\n }\n }\n\n private fillFlow(key: number): void {\n this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n const lane = this.lanes[this.laneIndexOf(key)]!;\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const fx = b + P_FX * PLANE;\n const fy = b + P_FY * PLANE;\n for (let y = 1; y <= WET_TILE; y++) {\n for (let x = 1; x <= WET_TILE; x++) {\n const v = lane.flow ? lane.flow(tx * WET_TILE + x - 1 + 0.5, ty * WET_TILE + y - 1 + 0.5) : null;\n this.f32[fx + y * S + x] = v ? Math.fround(v[0]) : 0;\n this.f32[fy + y * S + x] = v ? Math.fround(v[1]) : 0;\n }\n }\n }\n\n /** Activates every tile of a lane within `STRIP` cells of a document rectangle. */\n private wake(lane: Lane, x0: number, y0: number, x1: number, y1: number): void {\n const { tilesX, tilesY, perLane } = this.layout;\n const tx0 = Math.max(0, Math.floor((x0 - STRIP) / WET_TILE));\n const ty0 = Math.max(0, Math.floor((y0 - STRIP) / WET_TILE));\n const tx1 = Math.min(tilesX - 1, Math.floor((x1 + STRIP) / WET_TILE));\n const ty1 = Math.min(tilesY - 1, Math.floor((y1 + STRIP) / WET_TILE));\n let added = false;\n for (let ty = ty0; ty <= ty1; ty++) for (let tx = tx0; tx <= tx1; tx++) added = this.activate(lane.index * perLane + ty * tilesX + tx) || added;\n if (added) this.syncList();\n }\n\n /** Fills one slot's halo in the current set from its neighbours (TypeScript). */\n private haloTs(key: number, set: number): void {\n const { tilesX, tilesY, perLane } = this.layout;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const f = this.f32;\n const nb = (dx: number, dy: number) => {\n const x = tx + dx;\n const y = ty + dy;\n if (x < 0 || y < 0 || x >= tilesX || y >= tilesY) return -1;\n return this.slotOf(laneBase + y * tilesX + x);\n };\n const me = this.slotBase(this.slotOf(key)) + set * SET_PLANES * PLANE;\n const n = nb(0, -1);\n const s = nb(0, 1);\n const w = nb(-1, 0);\n const e = nb(1, 0);\n const nw = nb(-1, -1);\n const ne = nb(1, -1);\n const sw = nb(-1, 1);\n const se = nb(1, 1);\n const off = set * SET_PLANES * PLANE;\n for (let k = 0; k < SET_PLANES; k++) {\n const mp = me + k * PLANE;\n const o = off + k * PLANE;\n if (n >= 0) f.copyWithin(mp + 1, this.slotBase(n) + o + 256 * S + 1, this.slotBase(n) + o + 256 * S + 257);\n if (s >= 0) f.copyWithin(mp + 257 * S + 1, this.slotBase(s) + o + S + 1, this.slotBase(s) + o + S + 257);\n if (w >= 0) for (let y = 1; y <= 256; y++) f[mp + y * S] = f[this.slotBase(w) + o + y * S + 256];\n if (e >= 0) for (let y = 1; y <= 256; y++) f[mp + y * S + 257] = f[this.slotBase(e) + o + y * S + 1];\n if (nw >= 0) f[mp] = f[this.slotBase(nw) + o + 256 * S + 256];\n if (ne >= 0) f[mp + 257] = f[this.slotBase(ne) + o + 256 * S + 1];\n if (sw >= 0) f[mp + 257 * S] = f[this.slotBase(sw) + o + S + 256];\n if (se >= 0) f[mp + 257 * S + 257] = f[this.slotBase(se) + o + S + 1];\n }\n }\n\n private halo(key: number, set: number): void {\n if (this.wasm) {\n const l = this.layout;\n this.wasm.halo(l.table, l.slots, key, l.perLane, l.tilesX, l.tilesY, set);\n } else this.haloTs(key, set);\n }\n\n /** Refills every live slot's halo in the current set (after edits or wake-ups). */\n private refreshHalos(): void {\n for (const key of this.active) this.halo(key, this.parity);\n }\n\n // --- Stepping ------------------------------------------------------------------\n\n /** Whether anything is being simulated (in `id`, or any layer). */\n isActive(id?: string): boolean {\n if (id === undefined) return this.active.length > 0;\n const lane = this.laneOf(id);\n return this.active.some((k) => this.laneIndexOf(k) === lane.index);\n }\n\n /** Steps until the next batch boundary: at most `want`, `MAX_BATCH`, and the next free check. */\n private batchSize(want: number): number {\n const toFree = FREE_INTERVAL - (this.clock % FREE_INTERVAL);\n return Math.max(1, Math.min(want, MAX_BATCH, toFree));\n }\n\n /** Runs `n` steps on this thread (TypeScript or wasm kernel). */\n private runHere(n: number): void {\n const l = this.layout;\n const flagsBase = l.flags >> 2;\n const lastBase = l.last >> 2;\n const prmBase = l.params >> 2;\n for (let s = 0; s < n; s++) {\n for (const key of this.active) {\n const slot = this.slotOf(key);\n const lane = this.laneIndexOf(key);\n let fl: number;\n if (this.wasm) fl = this.wasm.step(l.slots + slot * SLOT_BYTES, this.parity, l.params + lane * PARAM_FLOATS * 4);\n else fl = stepSlotTs(this.f32, this.slotBase(slot), this.parity, this.f32.subarray(prmBase + lane * PARAM_FLOATS, prmBase + (lane + 1) * PARAM_FLOATS));\n this.u32[flagsBase + key] |= fl;\n this.u32[lastBase + key] = fl;\n }\n for (const key of this.active) this.halo(key, 1 - this.parity);\n this.parity = 1 - this.parity;\n }\n }\n\n /** After a batch: wake neighbours from the flags, free dead tiles on a free step, restamp. */\n private afterBatch(n: number): void {\n this.clock += n;\n const l = this.layout;\n const flagsBase = l.flags >> 2;\n const lastBase = l.last >> 2;\n const { tilesX, tilesY, perLane } = l;\n const wakeups: number[] = [];\n for (const key of this.active) {\n const fl = this.u32[flagsBase + key];\n this.u32[flagsBase + key] = 0;\n if (!(fl & FLAG_ALIVE)) continue;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const L = fl & FLAG_LEFT;\n const R = fl & FLAG_RIGHT;\n const T = fl & FLAG_TOP;\n const B = fl & FLAG_BOTTOM;\n const push = (x: number, y: number) => {\n if (x >= 0 && y >= 0 && x < tilesX && y < tilesY && this.slotOf(laneBase + y * tilesX + x) < 0) wakeups.push(laneBase + y * tilesX + x);\n };\n if (L) push(tx - 1, ty);\n if (R) push(tx + 1, ty);\n if (T) push(tx, ty - 1);\n if (B) push(tx, ty + 1);\n if (L && T) push(tx - 1, ty - 1);\n if (R && T) push(tx + 1, ty - 1);\n if (L && B) push(tx - 1, ty + 1);\n if (R && B) push(tx + 1, ty + 1);\n }\n let woke = false;\n for (const key of wakeups) woke = this.activate(key) || woke;\n if (this.clock % FREE_INTERVAL === 0) {\n const dead = this.active.filter((key) => {\n if (this.u32[lastBase + key] & FLAG_ALIVE) return false;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n for (let dy = -1; dy <= 1; dy++)\n for (let dx = -1; dx <= 1; dx++) {\n const x = tx + dx;\n const y = ty + dy;\n if ((dx || dy) && x >= 0 && y >= 0 && x < tilesX && y < tilesY) {\n const nk = laneBase + y * tilesX + x;\n if (this.slotOf(nk) >= 0 && this.u32[lastBase + nk] & FLAG_ALIVE) return false;\n }\n }\n return true;\n });\n for (const key of dead) {\n this.bakeKey(key, false);\n this.free(key);\n }\n if (dead.length) woke = true;\n }\n if (woke) {\n this.syncList();\n this.refreshHalos();\n }\n for (const lane of this.lanes) if (lane) lane.stamp++;\n }\n\n /**\n * Steps the simulation `steps` times on this thread (the TypeScript or single-thread wasm\n * kernel). Throws while worker threads are in use; use `step` there.\n */\n stepSync(steps: number): number {\n this.requireIdle();\n if (this.pool) throw new WetWorldError('This wet world steps in worker threads; call step (async) instead.');\n let left = Math.max(0, Math.floor(steps));\n while (left > 0) {\n if (!this.active.length) {\n this.clock += left;\n break;\n }\n const n = this.batchSize(left);\n this.gpuBatch(n);\n this.runHere(n);\n this.afterBatch(n);\n left -= n;\n }\n return this.clock;\n }\n\n /** Steps the simulation `steps` times (in worker threads when there are any). */\n async step(steps: number): Promise<number> {\n this.requireIdle();\n if (!this.pool) return this.stepSync(steps);\n let left = Math.max(0, Math.floor(steps));\n while (left > 0) {\n if (!this.active.length) {\n this.clock += left;\n break;\n }\n const n = this.batchSize(left);\n this.gpuBatch(n);\n const ctl = this.layout.ctl >> 2;\n this.i32[ctl + 2] = 0;\n this.i32[ctl + 3] = 0;\n this.i32[ctl + 5] = this.parity;\n this.busyFlag = true;\n try {\n await this.pool.run(n);\n } finally {\n this.busyFlag = false;\n }\n this.parity = (this.parity + n) % 2;\n this.afterBatch(n);\n left -= n;\n }\n return this.clock;\n }\n\n /** Steps until nothing is wet or `maxSteps` have run. Returns the steps run. */\n async stepUntilDry(maxSteps: number): Promise<number> {\n const start = this.clock;\n while (this.active.length && this.clock - start < maxSteps) await this.step(Math.min(FREE_INTERVAL, maxSteps - (this.clock - start)));\n return this.clock - start;\n }\n\n /**\n * Steps only the live tiles that touch `region` (canvas pixels): a viewport, say, so a huge wet\n * canvas costs what is on screen. The other live tiles hold still (no flow, no drying) until a\n * later step reaches them, and water flowing out of the region stops at their edge; tiles the\n * region's water wakes up are stepped as usual. Holding tiles makes the result depend on the\n * regions, so a replay is only bit-identical with the same regions. Returns the clock.\n */\n async stepRegion(steps: number, region: RasterRect): Promise<number> {\n const release = this.hold(region);\n try {\n return await this.step(steps);\n } finally {\n release();\n }\n }\n\n /** `stepRegion` on this thread (throws while worker threads are in use, like `stepSync`). */\n stepRegionSync(steps: number, region: RasterRect): number {\n const release = this.hold(region);\n try {\n return this.stepSync(steps);\n } finally {\n release();\n }\n }\n\n /**\n * Takes the live tiles that miss `region` out of the active list until the returned release\n * is called. Their state is copied into the other ping-pong set first, so they read the same\n * whichever set is current when they come back.\n */\n private hold(region: RasterRect): () => void {\n this.requireIdle();\n const x0 = Math.floor(region.x / WET_TILE);\n const y0 = Math.floor(region.y / WET_TILE);\n const x1 = Math.floor((region.x + Math.max(0, region.width) - 1) / WET_TILE);\n const y1 = Math.floor((region.y + Math.max(0, region.height) - 1) / WET_TILE);\n const held = this.active.filter((key) => {\n const [tx, ty] = this.tileXY(key);\n return tx < x0 || tx > x1 || ty < y0 || ty > y1;\n });\n if (!held.length) return () => {};\n const setFloats = SET_PLANES * PLANE;\n for (const key of held) {\n const base = this.slotBase(this.slotOf(key));\n const src = base + this.parity * setFloats;\n this.f32.copyWithin(base + (1 - this.parity) * setFloats, src, src + setFloats);\n }\n const heldSet = new Set(held);\n this.active.splice(0, this.active.length, ...this.active.filter((k) => !heldSet.has(k)));\n this.syncList();\n return () => {\n for (const key of held) if (this.slotOf(key) >= 0 && !this.active.includes(key)) this.active.push(key);\n this.syncList();\n this.refreshHalos();\n };\n }\n\n // --- Edits ---------------------------------------------------------------------\n\n /** Float index of a cell's plane-0 value in the current set, or −1 (inactive / off the canvas). */\n private cell(lane: Lane, x: number, y: number): number {\n if (x < 0 || y < 0 || x >= this.width || y >= this.height) return -1;\n const { tilesX, perLane } = this.layout;\n const slot = this.slotOf(lane.index * perLane + (y >> 8) * tilesX + (x >> 8));\n if (slot < 0) return -1;\n return this.slotBase(slot) + this.parity * SET_PLANES * PLANE + ((y & 255) + 1) * S + (x & 255) + 1;\n }\n\n /** Index of the same cell in the single (deposit, height, flow) planes, given `cell`. */\n private single(c: number): number {\n return c - this.parity * SET_PLANES * PLANE;\n }\n\n /**\n * Runs `fn` for every cell of a footprint (`cov` over `rect`, document cells) on a lane, waking\n * the tiles around it first, then refreshes halos. `fn` gets the cell index and its coverage.\n */\n private footprint(id: string, rect: RasterRect, cov: ArrayLike<number> | null, fn: (c: number, w: number, x: number, y: number) => void, wake = true): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n const x0 = Math.max(0, rect.x);\n const y0 = Math.max(0, rect.y);\n const x1 = Math.min(this.width, rect.x + rect.width);\n const y1 = Math.min(this.height, rect.y + rect.height);\n if (x1 <= x0 || y1 <= y0) return;\n if (wake) this.wake(lane, x0, y0, x1 - 1, y1 - 1);\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const w = cov ? cov[(y - rect.y) * rect.width + (x - rect.x)] : 1;\n if (!(w > 0)) continue;\n const c = this.cell(lane, x, y);\n if (c >= 0) fn(c, w, x, y);\n }\n }\n this.markEdited(lane, x0, y0, x1, y1);\n this.refreshHalos();\n }\n\n private markEdited(lane: Lane, x0: number, y0: number, x1: number, y1: number): void {\n const { tilesX, perLane } = this.layout;\n for (let ty = y0 >> 8; ty <= (y1 - 1) >> 8; ty++)\n for (let tx = x0 >> 8; tx <= (x1 - 1) >> 8; tx++) {\n lane.urgent.add(tileKey(tx, ty));\n const slot = this.slotOf(lane.index * perLane + ty * tilesX + tx);\n if (slot >= 0) this.gpuDirtySlot(slot, Math.max(1, y0 - ty * WET_TILE + 1), Math.min(WET_TILE, y1 - ty * WET_TILE));\n }\n lane.stamp++;\n }\n\n /** Adds water (depth units) at rest. */\n private addWaterAt(c: number, dw: number): void {\n const f = this.f32;\n for (let k = 0; k < 9; k++) f[c + k * PLANE] += W9[k] * dw;\n f[c + P_RHO * PLANE] += dw;\n }\n\n /**\n * Lays paint: `water` depth and pigment mass `pigment` (K r, g, b, S) per unit of coverage, or\n * per pixel from `field` (4 values per pixel of `rect`). Pigment without water lands straight in\n * the paper (settled).\n */\n paint(id: string, rect: RasterRect, cov: ArrayLike<number> | null, water: number, pigment: ArrayLike<number> | null, field: ArrayLike<number> | null = null): void {\n if (!(water >= 0)) throw new WetWorldError(`water ${water} must be 0 or more.`);\n this.footprint(id, rect, cov, (c, w, x, y) => {\n const dw = Math.fround(water * w);\n if (dw > 0) this.addWaterAt(c, dw);\n const into = dw > 0 ? c + P_P0 * PLANE : this.single(c) + P_D0 * PLANE;\n if (field) {\n const o = ((y - rect.y) * rect.width + (x - rect.x)) * 4;\n for (let q = 0; q < 4; q++) this.f32[into + q * PLANE] += field[o + q] * w;\n } else if (pigment) for (let q = 0; q < 4; q++) this.f32[into + q * PLANE] += pigment[q] * w;\n });\n }\n\n /** Damp paper: fills the paper's water towards its capacity by `amount` (0..1) × coverage, plus a thin film of surface water. */\n wetPaper(id: string, rect: RasterRect, cov: ArrayLike<number> | null, amount: number): void {\n const capacity = PAPER_CAPACITY;\n this.footprint(id, rect, cov, (c, w) => {\n const a = Math.min(1, Math.max(0, amount * w));\n const s = c + P_SW * PLANE;\n this.f32[s] = Math.max(this.f32[s], Math.fround(capacity * a));\n this.addWaterAt(c, Math.fround(0.03 * a));\n });\n }\n\n /**\n * Takes water (and suspended pigment, and settled pigment) away: `water`, `suspended`,\n * `settled` are fractions 0..1 × coverage. A hair dryer takes water only (the pigment stays and\n * settles); blotting takes all three.\n */\n remove(id: string, rect: RasterRect, cov: ArrayLike<number> | null, water: number, suspended: number, settled: number, paperWater = water): void {\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n const f = this.f32;\n const kw = 1 - Math.min(1, Math.max(0, water * w));\n const kp = 1 - Math.min(1, Math.max(0, suspended * w));\n const kd = 1 - Math.min(1, Math.max(0, settled * w));\n const ks = 1 - Math.min(1, Math.max(0, paperWater * w));\n if (kw < 1) {\n for (let k = 0; k < 9; k++) f[c + k * PLANE] *= kw;\n f[c + P_RHO * PLANE] *= kw;\n }\n if (ks < 1) f[c + P_SW * PLANE] *= ks;\n if (kp < 1) for (let q = 0; q < 4; q++) f[c + (P_P0 + q) * PLANE] *= kp;\n if (kd < 1) {\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) f[d + q * PLANE] *= kd;\n }\n },\n false\n );\n }\n\n /** Pushes the water: adds velocity (`ux`, `uy` cells per step, each at most 0.1) × coverage. */\n push(id: string, rect: RasterRect, cov: ArrayLike<number> | null, ux: number, uy: number): void {\n const cap = 0.1;\n const sp = Math.hypot(ux, uy);\n if (sp > cap) {\n ux *= cap / sp;\n uy *= cap / sp;\n }\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n const f = this.f32;\n const rho = f[c + P_RHO * PLANE];\n if (!(rho >= DRY_EPS)) return;\n for (let k = 1; k < 9; k++) {\n const eu = EX[k] * ux * w + EY[k] * uy * w;\n f[c + k * PLANE] = Math.max(0, f[c + k * PLANE] + 3 * W9[k] * rho * eu);\n }\n },\n false\n );\n }\n\n /** Blends wet paint: each wet cell's suspended pigment moves `strength` × coverage towards the footprint's mean. */\n blend(id: string, rect: RasterRect, cov: ArrayLike<number> | null, strength: number): void {\n const lane = this.laneOf(id);\n const sums = [0, 0, 0, 0];\n let wsum = 0;\n const cells: Array<[number, number]> = [];\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n if (!(this.f32[c + P_RHO * PLANE] >= DRY_EPS)) return;\n cells.push([c, w]);\n wsum += w;\n for (let q = 0; q < 4; q++) sums[q] += this.f32[c + (P_P0 + q) * PLANE] * w;\n },\n false\n );\n if (!(wsum > 0)) return;\n const k = Math.min(1, Math.max(0, strength));\n for (const [c, w] of cells) for (let q = 0; q < 4; q++) {\n const i = c + (P_P0 + q) * PLANE;\n this.f32[i] += k * w * (sums[q] / wsum - this.f32[i]);\n }\n lane.stamp++;\n this.refreshHalos();\n }\n\n /**\n * Drags wet paint by (`dx`, `dy`) cells: each footprint cell takes `strength` × coverage of the\n * water and suspended pigment of the cell it came from (a smudge through wet paint).\n */\n drag(id: string, rect: RasterRect, cov: ArrayLike<number> | null, dx: number, dy: number, strength: number): void {\n const lane = this.laneOf(id);\n const sx = Math.round(dx);\n const sy = Math.round(dy);\n if (!sx && !sy) return;\n const moves: Array<[number, number, number]> = [];\n this.footprint(\n id,\n rect,\n cov,\n (c, w, x, y) => {\n const from = this.cell(lane, x - sx, y - sy);\n if (from < 0) return;\n moves.push([from, c, Math.min(1, Math.max(0, strength * w))]);\n },\n true\n );\n const f = this.f32;\n // Take from the sources first (so a chain of moves never moves paint twice), then lay it down.\n const taken = moves.map(([from, , a]) => {\n const t = new Float32Array(14);\n for (let k = 0; k < 9; k++) {\n t[k] = f[from + k * PLANE] * a;\n f[from + k * PLANE] -= t[k];\n }\n t[9] = f[from + P_RHO * PLANE] * a;\n f[from + P_RHO * PLANE] -= t[9];\n for (let q = 0; q < 4; q++) {\n t[10 + q] = f[from + (P_P0 + q) * PLANE] * a;\n f[from + (P_P0 + q) * PLANE] -= t[10 + q];\n }\n return t;\n });\n moves.forEach(([, to], i) => {\n const t = taken[i];\n // Arriving water carries the drag direction a little.\n for (let k = 0; k < 9; k++) f[to + k * PLANE] += t[k];\n f[to + P_RHO * PLANE] += t[9];\n for (let q = 0; q < 4; q++) f[to + (P_P0 + q) * PLANE] += t[10 + q];\n });\n this.refreshHalos();\n }\n\n /**\n * Re-wetting: lifts `amount` × coverage of the dried paint in the layer's pixels (`base`) back into\n * the paper as settled pigment, so water can move it again. Only where there is surface water.\n */\n rewet(id: string, rect: RasterRect, cov: ArrayLike<number> | null, amount: number, paper: readonly [number, number, number]): void {\n const lane = this.laneOf(id);\n const pig = [0, 0, 0, 0];\n const tiles = new Map(lane.base.tiles);\n const written = new Set<number>();\n const scratch = new Uint8ClampedArray(4);\n this.footprint(\n id,\n rect,\n cov,\n (c, w, x, y) => {\n if (!(this.f32[c + P_RHO * PLANE] >= DRY_EPS)) return;\n const a = Math.min(1, Math.max(0, amount * w));\n if (!(a > 0)) return;\n const key = tileKey(x >> 8, y >> 8);\n let tile = tiles.get(key);\n if (!tile) return;\n if (!written.has(key)) {\n tile = { data: new Uint8ClampedArray(tile.data), uniform: null };\n tiles.set(key, tile);\n written.add(key);\n }\n const i = ((y & 255) * TILE + (x & 255)) * 4;\n if (tile.data[i + 3] === 0) return;\n pixelPigment(tile.data, i, paper, pig);\n if (!(pig[0] > 0 || pig[1] > 0 || pig[2] > 0)) return;\n // What stays: (1 − a) of the film over the paper, as a pixel; what is lifted goes to the deposit.\n const clear = new Uint8ClampedArray([0, 0, 0, 0]);\n filmPixel(pig[0] * (1 - a), pig[1] * (1 - a), pig[2] * (1 - a), 0, clear, 0, paper, 0, scratch, 0);\n tile.data.set(scratch, i);\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 3; q++) this.f32[d + q * PLANE] += Math.fround(pig[q] * a);\n },\n false\n );\n if (written.size) {\n for (const key of written) {\n const t = finishTile(tiles.get(key)!.data, 4, 0);\n if (t) tiles.set(key, t);\n else tiles.delete(key);\n }\n this.setBase(id, new TiledSurface(4, tiles, 0));\n }\n }\n\n /**\n * Dries wet paint at once (everything settles where it is, the water goes): in `rect`, or the\n * whole layer. Whole tiles that end up dry are baked into the base and freed. Returns the\n * document rectangle that changed, or `null`.\n */\n dry(id: string, rect?: RasterRect): RasterRect | null {\n this.requireIdle();\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n if (!keys.length) return null;\n let bounds: RasterRect | null = null;\n const area = rect ?? { x: 0, y: 0, width: this.width, height: this.height };\n for (const key of keys) {\n const [tx, ty] = this.tileXY(key);\n const tr = { x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE };\n const x0 = Math.max(area.x, tr.x);\n const y0 = Math.max(area.y, tr.y);\n const x1 = Math.min(area.x + area.width, tr.x + tr.width, this.width);\n const y1 = Math.min(area.y + area.height, tr.y + tr.height, this.height);\n if (x1 <= x0 || y1 <= y0) continue;\n const whole = x0 === tr.x && y0 === tr.y && x1 >= Math.min(tr.x + WET_TILE, this.width) && y1 >= Math.min(tr.y + WET_TILE, this.height);\n if (whole) {\n if (this.bakeKey(key, true)) bounds = unionRect(bounds, { x: tr.x, y: tr.y, width: Math.min(WET_TILE, this.width - tr.x), height: Math.min(WET_TILE, this.height - tr.y) });\n this.free(key);\n continue;\n }\n const f = this.f32;\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const c = this.cell(lane, x, y);\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) {\n f[d + q * PLANE] += f[c + (P_P0 + q) * PLANE];\n f[c + (P_P0 + q) * PLANE] = 0;\n }\n for (let k = 0; k < 9; k++) f[c + k * PLANE] = 0;\n f[c + P_RHO * PLANE] = 0;\n f[c + P_UX * PLANE] = 0;\n f[c + P_UY * PLANE] = 0;\n f[c + P_SW * PLANE] = 0;\n }\n }\n bounds = unionRect(bounds, { x: x0, y: y0, width: x1 - x0, height: y1 - y0 });\n this.markEdited(lane, x0, y0, x1, y1);\n }\n this.syncList();\n this.refreshHalos();\n lane.stamp++;\n return bounds;\n }\n\n /**\n * Bakes a slot's pigment into its lane's base (settling suspended pigment too when `all`).\n * Returns whether any pixel changed.\n */\n private bakeKey(key: number, all: boolean): boolean {\n const lane = this.lanes[this.laneIndexOf(key)]!;\n const [tx, ty] = this.tileXY(key);\n const tk = tileKey(tx, ty);\n const src = lane.base.tiles.get(tk)?.data ?? null;\n const out = this.shadeSlot(key, src, all ? 'bake-all' : 'bake');\n if (!out) return false;\n const tiles = new Map(lane.base.tiles);\n const t = finishTile(out, 4, 0);\n if (t) tiles.set(tk, t);\n else tiles.delete(tk);\n this.setBase(lane.id, new TiledSurface(4, tiles, 0));\n return true;\n }\n\n /**\n * Shades one slot over a base tile. `display`: the wet look (suspended + settled, wet paper a\n * little darker); `bake`: settled pigment only; `bake-all`: suspended and settled (dry now).\n * Returns `null` when nothing would change the base.\n */\n private shadeSlot(key: number, src: Uint8ClampedArray | null, mode: 'display' | 'bake' | 'bake-all'): Uint8ClampedArray | null {\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const cur = b + this.parity * SET_PLANES * PLANE;\n const out = src ? new Uint8ClampedArray(src) : new Uint8ClampedArray(TILE * TILE * 4);\n const w = Math.min(WET_TILE, this.width - tx * WET_TILE);\n const h = Math.min(WET_TILE, this.height - ty * WET_TILE);\n const changed = shadeTile(\n this.f32,\n PLANE,\n S,\n b + P_D0 * PLANE,\n mode === 'bake' ? -1 : cur + P_P0 * PLANE,\n mode === 'display' ? cur + P_RHO * PLANE : -1,\n cur + P_SW * PLANE,\n src,\n out,\n w,\n h,\n this.paperBytes\n );\n return changed ? out : null;\n }\n\n /** The layer's pixels with all its wet paint dried where it is (the bake of \"dry on save\"); changes nothing. */\n bakedSurface(id: string): TiledSurface {\n this.requireIdle();\n const lane = this.laneOf(id);\n const tiles = new Map(lane.base.tiles);\n for (const key of this.active) {\n if (this.laneIndexOf(key) !== lane.index) continue;\n const tk = this.tileKeyOf(key);\n const out = this.shadeSlot(key, lane.base.tiles.get(tk)?.data ?? null, 'bake-all');\n if (!out) continue;\n const t = finishTile(out, 4, 0);\n if (t) tiles.set(tk, t);\n else tiles.delete(tk);\n }\n return new TiledSurface(4, tiles, 0);\n }\n\n // --- Reading -------------------------------------------------------------------\n\n /**\n * Sums over a footprint of a lane, weighted by coverage: `weight` (coverage), `water` (surface\n * depth), `wet` (coverage of wet cells), `pigment` (suspended, 4 channels), `settled` (4 channels).\n */\n sample(id: string, rect: RasterRect, cov: ArrayLike<number> | null): { weight: number; water: number; wet: number; pigment: number[]; settled: number[] } {\n const lane = this.laneOf(id);\n const r = { weight: 0, water: 0, wet: 0, pigment: [0, 0, 0, 0], settled: [0, 0, 0, 0] };\n const x0 = Math.max(0, rect.x);\n const y0 = Math.max(0, rect.y);\n const x1 = Math.min(this.width, rect.x + rect.width);\n const y1 = Math.min(this.height, rect.y + rect.height);\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const w = cov ? cov[(y - rect.y) * rect.width + (x - rect.x)] : 1;\n if (!(w > 0)) continue;\n r.weight += w;\n const c = this.cell(lane, x, y);\n if (c < 0) continue;\n const rho = this.f32[c + P_RHO * PLANE];\n r.water += rho * w;\n if (rho >= DRY_EPS) r.wet += w;\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) {\n r.pigment[q] += this.f32[c + (P_P0 + q) * PLANE] * w;\n r.settled[q] += this.f32[d + q * PLANE] * w;\n }\n }\n }\n return r;\n }\n\n /** Surface water depth at a document cell (0 where nothing is simulated). */\n waterAt(id: string, x: number, y: number): number {\n const c = this.cell(this.laneOf(id), Math.floor(x), Math.floor(y));\n return c < 0 ? 0 : this.f32[c + P_RHO * PLANE];\n }\n\n /** Totals for a layer (scans its live tiles). */\n stats(id: string): WetLaneStats {\n const lane = this.laneOf(id);\n const out: WetLaneStats = { activeTiles: 0, wetCells: 0, water: 0, pigment: 0, wetBounds: null };\n let bx0 = Infinity;\n let by0 = Infinity;\n let bx1 = -Infinity;\n let by1 = -Infinity;\n const f = this.f32;\n for (const key of this.active) {\n if (this.laneIndexOf(key) !== lane.index) continue;\n out.activeTiles++;\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const cur = b + this.parity * SET_PLANES * PLANE;\n for (let y = 1; y <= 256; y++) {\n for (let x = 1; x <= 256; x++) {\n const c = y * S + x;\n const rho = f[cur + P_RHO * PLANE + c];\n out.water += rho + f[cur + P_SW * PLANE + c];\n for (let q = 0; q < 4; q++) out.pigment += f[cur + (P_P0 + q) * PLANE + c] + f[b + (P_D0 + q) * PLANE + c];\n if (rho >= DRY_EPS) {\n out.wetCells++;\n const gx = tx * WET_TILE + x - 1;\n const gy = ty * WET_TILE + y - 1;\n if (gx < bx0) bx0 = gx;\n if (gy < by0) by0 = gy;\n if (gx > bx1) bx1 = gx;\n if (gy > by1) by1 = gy;\n }\n }\n }\n }\n if (out.wetCells) out.wetBounds = { x: bx0, y: by0, width: bx1 - bx0 + 1, height: by1 - by0 + 1 };\n return out;\n }\n\n /** Whether a layer (or any) has surface water anywhere. */\n isWet(id?: string): boolean {\n const ids = id === undefined ? this.laneIds() : [id];\n return ids.some((x) => this.isActive(x));\n }\n\n /** Document rectangles of a layer's live tiles. */\n activeRects(id: string): RasterRect[] {\n const lane = this.laneOf(id);\n return this.active\n .filter((k) => this.laneIndexOf(k) === lane.index)\n .map((k) => {\n const [tx, ty] = this.tileXY(k);\n return { x: tx * WET_TILE, y: ty * WET_TILE, width: Math.min(WET_TILE, this.width - tx * WET_TILE), height: Math.min(WET_TILE, this.height - ty * WET_TILE) };\n });\n }\n\n // --- Display -------------------------------------------------------------------\n\n /** A number that changes whenever a layer's display may have changed. */\n stamp(id: string): number {\n return this.laneOf(id).stamp;\n }\n\n /**\n * The layer's pixels with its wet paint shaded in: the base with each live tile shaded over it.\n * At most `maxTiles` stale tiles are reshaded per call (edited tiles first); the rest keep their\n * last shading until the next call. Returns the surface and the tiles reshaded.\n */\n display(id: string, maxTiles = Infinity): { surface: TiledSurface; changed: RasterRect[]; pending: number } {\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n const stale = keys.filter((k) => lane.shaded.get(this.tileKeyOf(k))?.stamp !== lane.stamp);\n stale.sort((a, b) => Number(lane.urgent.has(this.tileKeyOf(b))) - Number(lane.urgent.has(this.tileKeyOf(a))) || (lane.shaded.get(this.tileKeyOf(a))?.stamp ?? 0) - (lane.shaded.get(this.tileKeyOf(b))?.stamp ?? 0));\n const changed: RasterRect[] = [];\n let done = 0;\n for (const key of stale) {\n if (done >= maxTiles) break;\n const tk = this.tileKeyOf(key);\n const src = lane.base.tiles.get(tk)?.data ?? null;\n const out = this.shadeSlot(key, src, 'display');\n const tile = out ? finishTile(out, 4, 0) : (lane.base.tiles.get(tk) ?? null);\n lane.shaded.set(tk, { stamp: lane.stamp, tile: tile ?? { data: new Uint8ClampedArray(0), uniform: 0 } });\n lane.shadedVersion++;\n lane.urgent.delete(tk);\n const [tx, ty] = this.tileXY(key);\n changed.push({ x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE });\n done++;\n }\n // Shaded tiles of freed slots are gone; drop leftovers.\n const live = new Set(keys.map((k) => this.tileKeyOf(k)));\n for (const tk of [...lane.shaded.keys()]) if (!live.has(tk) && lane.shaded.delete(tk)) lane.shadedVersion++;\n const displayKey = `${lane.base.id}:${lane.shadedVersion}`;\n if (lane.display && lane.displayKey === displayKey) return { surface: lane.display, changed, pending: stale.length - done };\n const tiles = new Map(lane.base.tiles);\n for (const [tk, { tile }] of lane.shaded) {\n if (tile.data.length === 0) tiles.delete(tk);\n else tiles.set(tk, tile);\n }\n lane.display = new TiledSurface(4, tiles, 0);\n lane.displayKey = displayKey;\n return { surface: lane.display, changed, pending: stale.length - done };\n }\n\n /**\n * The water as an overlay tile (RGBA, blue, alpha from surface depth and damp paper) for a\n * document tile, or `null` where nothing is wet.\n */\n waterOverlay(id: string, tx: number, ty: number): Uint8ClampedArray | null {\n const lane = this.laneOf(id);\n const { tilesX, tilesY, perLane } = this.layout;\n if (tx < 0 || ty < 0 || tx >= tilesX || ty >= tilesY) return null;\n const slot = this.slotOf(lane.index * perLane + ty * tilesX + tx);\n if (slot < 0) return null;\n const cur = this.slotBase(slot) + this.parity * SET_PLANES * PLANE;\n const out = new Uint8ClampedArray(TILE * TILE * 4);\n let any = false;\n for (let y = 0; y < WET_TILE; y++) {\n for (let x = 0; x < WET_TILE; x++) {\n const c = (y + 1) * S + x + 1;\n const rho = this.f32[cur + P_RHO * PLANE + c];\n const sw = this.f32[cur + P_SW * PLANE + c];\n const a = Math.min(1, rho * 2.5) * 0.7 + Math.min(1, sw * 4) * 0.2;\n if (a <= 0.004) continue;\n const i = (y * TILE + x) * 4;\n out[i] = 40;\n out[i + 1] = 120;\n out[i + 2] = 255;\n out[i + 3] = Math.round(a * 255);\n any = true;\n }\n }\n return any ? out : null;\n }\n\n // --- Engine B (WebGPU mirror) ---------------------------------------------------\n\n /**\n * Attaches a GPU engine (or `null` to detach). From then on, whenever at least `gpuMinTiles` tiles\n * are live, the GPU mirrors the slots and `displayGpu` shades on it. The CPU stays the authority.\n */\n attachGpu(engine: WetGpuEngine | null): void {\n this.gpu = engine;\n this.gpuLive = false;\n this.gpuFailure = null;\n }\n\n /** The attached GPU engine, if any. */\n get gpuEngine(): WetGpuEngine | null {\n return this.gpu;\n }\n\n /** Whether the GPU mirror is in use now (an engine is attached and the wet area is large). */\n get gpuActive(): boolean {\n return this.gpuLive;\n }\n\n /** Why the GPU stopped (a lost device, out of GPU memory), or `null`. */\n get gpuError(): string | null {\n return this.gpuFailure;\n }\n\n private gpuDirtySlot(slot: number, y0: number, y1: number): void {\n if (!this.gpuLive || slot < 0) return;\n const d = this.gpuDirty.get(slot);\n this.gpuDirty.set(slot, d ? [Math.min(d[0], y0), Math.max(d[1], y1)] : [y0, y1]);\n }\n\n private gpuStop(reason: string | null): void {\n this.gpuLive = false;\n this.gpuPlan = null;\n this.gpuDirty.clear();\n if (reason) {\n this.gpuFailure = reason;\n this.gpu = null;\n if (!this.warnings.includes(reason)) this.warnings.push(reason);\n }\n }\n\n /** Turns the mirror on or off for the current wet area. Returns whether it is on. */\n private gpuDecide(): boolean {\n // On at gpuMinTiles, off below half of it (so it does not flip at the threshold).\n const want = Boolean(this.gpu) && this.active.length >= (this.gpuLive ? Math.ceil(this.gpuMinTiles / 2) : this.gpuMinTiles);\n if (want && !this.gpuLive) {\n const gpu = this.gpu!;\n if (gpu.lostReason) {\n this.gpuStop(`The GPU was lost (${gpu.lostReason}); wet paint runs on the CPU.`);\n return false;\n }\n if (!gpu.ensureSlots(this.slotCount)) return false;\n this.gpuLive = true;\n this.gpuParamsDirty = true;\n for (const key of this.active) this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n } else if (!want && this.gpuLive) this.gpuStop(null);\n return this.gpuLive;\n }\n\n /** Sends the rest of a lead batch to the GPU (before anything else touches its state). */\n private gpuFinishPlan(): void {\n const plan = this.gpuPlan;\n this.gpuPlan = null;\n if (!plan || plan.done >= plan.total || !this.gpu) return;\n this.gpu.step(plan.jobs, (plan.parity + plan.done) & 1, plan.total - plan.done).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n }\n\n /**\n * Lead mode: steps the GPU up to `steps` further into the batch the CPU is running (never past\n * it, so the GPU is never ahead of the CPU's next edit). Returns the steps taken.\n */\n gpuLead(steps: number): number {\n const plan = this.gpuPlan;\n if (!plan || !this.gpu || !this.gpuLive) return 0;\n const n = Math.max(0, Math.min(Math.floor(steps), plan.total - plan.done));\n if (!n) return 0;\n this.gpu.step(plan.jobs, (plan.parity + plan.done) & 1, n).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n plan.done += n;\n return n;\n }\n\n /** Steps the GPU is ahead of the CPU's last finished batch (lead mode), 0 otherwise. */\n get gpuAhead(): number {\n return this.gpuPlan && this.busyFlag ? this.gpuPlan.done : 0;\n }\n\n /** Whether the GPU can show steps the CPU has not finished (a lead batch is running). */\n get gpuLeading(): boolean {\n return Boolean(this.gpuLive && this.gpuPlan && this.busyFlag && this.gpuPlan.done < this.gpuPlan.total);\n }\n\n /** Uploads what the CPU changed since the last upload (the current set and deposits; whole slots on wake-up). */\n private gpuSync(): void {\n this.gpuFinishPlan();\n const gpu = this.gpu!;\n if (!gpu.ensureSlots(this.slotCount)) {\n this.gpuStop(null);\n return;\n }\n if (this.gpuParamsDirty) {\n for (const lane of this.lanes) if (lane) gpu.setParams(lane.index, this.f32.subarray((this.layout.params >> 2) + lane.index * PARAM_FLOATS, (this.layout.params >> 2) + (lane.index + 1) * PARAM_FLOATS));\n this.gpuParamsDirty = false;\n }\n if (!this.gpuDirty.size) return;\n for (const [slot, [y0, y1]] of this.gpuDirty) {\n const b = this.slotBase(slot);\n if (y0 === 0 && y1 === SLOT_SIDE - 1) {\n gpu.writeSlot(slot, 0, this.f32.subarray(b, b + SLOT_FLOATS));\n continue;\n }\n const from = y0 * SLOT_SIDE;\n const to = (y1 + 1) * SLOT_SIDE;\n const planes = [...Array(SET_PLANES).keys()].map((k) => this.parity * SET_PLANES + k).concat([P_D0, P_D0 + 1, P_D0 + 2, P_D0 + 3]);\n for (const plane of planes) gpu.writeSlot(slot, plane * PLANE + from, this.f32.subarray(b + plane * PLANE + from, b + plane * PLANE + to));\n }\n this.gpuDirty.clear();\n // The GPU refills halos from the uploaded interiors.\n gpu.refreshHalos(this.gpuJobs(this.active), this.parity);\n }\n\n private gpuJobs(keys: readonly number[]): WetGpuJob[] {\n const { tilesX, tilesY, perLane } = this.layout;\n return keys.map((key) => {\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const at = (dx: number, dy: number) => {\n const x = tx + dx;\n const y = ty + dy;\n return x < 0 || y < 0 || x >= tilesX || y >= tilesY ? -1 : this.slotOf(laneBase + y * tilesX + x);\n };\n return {\n slot: this.slotOf(key),\n lane: this.laneIndexOf(key),\n neighbours: [at(0, -1), at(0, 1), at(-1, 0), at(1, 0), at(-1, -1), at(1, -1), at(-1, 1), at(1, 1)],\n width: Math.min(WET_TILE, this.width - tx * WET_TILE),\n height: Math.min(WET_TILE, this.height - ty * WET_TILE),\n };\n });\n }\n\n /** Runs the coming CPU batch of `n` steps on the GPU mirror too. */\n private gpuBatch(n: number): void {\n if (!this.gpu || !this.gpuDecide()) return;\n try {\n this.gpuSync();\n if (!this.gpuLive) return;\n const jobs = this.gpuJobs(this.active);\n if (this.gpuLeadMode) this.gpuPlan = { jobs, parity: this.parity, total: n, done: 0 };\n else this.gpu.step(jobs, this.parity, n).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n } catch (e) {\n this.gpuStop(`Wet paint stopped using the GPU (${(e as Error).message}).`);\n }\n }\n\n /**\n * Like `display`, but shades every stale tile on the GPU at once (when the mirror is in use;\n * otherwise, or when the world changed while the GPU worked, it is `display(id, maxCpuTiles)`).\n * Call between batches.\n */\n async displayGpu(id: string, maxCpuTiles = Infinity, lead = this.busyFlag): Promise<{ surface: TiledSurface; changed: RasterRect[]; pending: number; gpu: boolean }> {\n // Leading: the CPU is mid-batch and the GPU is partway through it; show the GPU's step.\n const plan = lead && this.gpuLive ? this.gpuPlan : null;\n if (!this.gpu || (this.busyFlag && !plan) || (!plan && !this.gpuDecide())) return { ...this.display(id, maxCpuTiles), gpu: false };\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n const stale = plan ? keys : keys.filter((k) => lane.shaded.get(this.tileKeyOf(k))?.stamp !== lane.stamp);\n if (!stale.length) return { ...this.display(id, 0), gpu: true };\n let tiles: Uint8ClampedArray[];\n const stamp = lane.stamp;\n const base = lane.base;\n try {\n if (!plan) this.gpuSync();\n const parity = plan ? (plan.parity + plan.done) & 1 : this.parity;\n tiles = await this.gpu.shade(this.gpuJobs(stale), parity, stale.map((k) => base.tiles.get(this.tileKeyOf(k))?.data ?? null), [this.paperBytes[0], this.paperBytes[1], this.paperBytes[2]]);\n } catch (e) {\n this.gpuStop(`Wet paint stopped using the GPU (${(e as Error).message}).`);\n return { ...this.display(id, maxCpuTiles), gpu: false };\n }\n // The world may have moved on while the GPU worked (an edit, a step): keep the result only if nothing changed.\n if (lane.stamp !== stamp || lane.base !== base || this.lanes[lane.index] !== lane) return { ...this.display(id, maxCpuTiles), gpu: false };\n const changed: RasterRect[] = [];\n stale.forEach((key, i) => {\n const tk = this.tileKeyOf(key);\n const tile = finishTile(new Uint8ClampedArray(tiles[i]), 4, 0);\n lane.shaded.set(tk, { stamp: lane.stamp, tile: tile ?? { data: new Uint8ClampedArray(0), uniform: 0 } });\n lane.urgent.delete(tk);\n const [tx, ty] = this.tileXY(key);\n changed.push({ x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE });\n });\n lane.shadedVersion++;\n const d = this.display(id, 0);\n return { surface: d.surface, changed, pending: 0, gpu: true };\n }\n\n // --- Snapshots -----------------------------------------------------------------\n\n /** A copy of everything (for undo): live slots, layers, clock and tilt. */\n snapshot(): WetSnapshot {\n this.requireIdle();\n const slots = new Map<number, { planes: Float32Array; last: number }>();\n let bytes = 0;\n for (const key of this.active) {\n const b = this.slotBase(this.slotOf(key));\n const planes = new Float32Array(SNAP_PLANES * PLANE);\n planes.set(this.f32.subarray(b + this.parity * SET_PLANES * PLANE, b + (this.parity + 1) * SET_PLANES * PLANE), 0);\n planes.set(this.f32.subarray(b + P_D0 * PLANE, b + (P_D0 + 4) * PLANE), SET_PLANES * PLANE);\n slots.set(key, { planes, last: this.u32[(this.layout.last >> 2) + key] });\n bytes += planes.byteLength;\n }\n const lanes = this.lanes.filter((l): l is Lane => Boolean(l)).map((l) => ({ id: l.id, index: l.index, params: { ...l.params }, flow: l.flow, flowStrength: l.flowStrength, base: l.base }));\n return { clock: this.clock, tilt: { ...this.tilt }, lanes, slots, bytes };\n }\n\n /** Puts a snapshot back exactly (the simulation then continues as it would have). */\n restore(snap: WetSnapshot): void {\n this.requireIdle();\n for (const key of [...this.active]) this.free(key);\n this.lanes.fill(null);\n this.tilt = { ...snap.tilt };\n for (const l of snap.lanes) {\n this.lanes[l.index] = { id: l.id, index: l.index, params: { ...l.params }, flow: l.flow, flowStrength: l.flowStrength, base: l.base, shaded: new Map(), urgent: new Set(), stamp: 1, display: null, shadedVersion: 0, displayKey: '' };\n this.pack(this.lanes[l.index]!);\n }\n for (const [key, { planes, last }] of snap.slots) {\n if (!this.activate(key)) continue;\n const b = this.slotBase(this.slotOf(key));\n this.f32.set(planes.subarray(0, SET_PLANES * PLANE), b + this.parity * SET_PLANES * PLANE);\n this.f32.set(planes.subarray(SET_PLANES * PLANE), b + P_D0 * PLANE);\n this.u32[(this.layout.last >> 2) + key] = last;\n }\n this.clock = snap.clock;\n this.syncList();\n this.refreshHalos();\n for (const key of this.active) this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n }\n\n /** Bytes of wasm memory held. */\n memoryBytes(): number {\n return this.memory.buffer.byteLength;\n }\n\n /** Live tiles across all layers. */\n activeTiles(): number {\n return this.active.length;\n }\n\n /** Memory for tests and tools: the raw f32 view (read only, please). */\n get rawFloats(): Float32Array {\n return this.f32;\n }\n\n /** The current set's parity (tests). */\n get currentParity(): number {\n return this.parity;\n }\n\n /** Float index of a slot's first plane (tests). */\n slotIndex(id: string, tx: number, ty: number): number {\n const lane = this.laneOf(id);\n const slot = this.slotOf(lane.index * this.layout.perLane + ty * this.layout.tilesX + tx);\n return slot < 0 ? -1 : this.slotBase(slot);\n }\n}\n\nfunction unionRect(a: RasterRect | null, b: RasterRect): RasterRect {\n if (!a) return { ...b };\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.max(a.x + a.width, b.x + b.width) - x, height: Math.max(a.y + a.height, b.y + b.height) - y };\n}\n\n","/**\n * Flow maps: a push on the water at every cell (cells per step², like tilt), from a few generated\n * patterns. Every pattern is computed with + − × ÷ only, so it is the same in every engine.\n */\n\nimport type { WetFlowField } from './world';\n\nexport type WetFlowKind = 'none' | 'linear' | 'swirl' | 'radial' | 'turbulent';\n\nexport const WET_FLOW_KINDS: readonly WetFlowKind[] = ['none', 'linear', 'swirl', 'radial', 'turbulent'];\n\n/** A flow map as settings (saved with the document). */\nexport interface WetFlowSpec {\n kind: WetFlowKind;\n /** 0..1: how hard it pushes (1 is about as strong as a 25° tilt). */\n strength: number;\n /** `linear`: direction in degrees clockwise from canvas down. */\n angle: number;\n /** `swirl` / `radial`: centre in document pixels (default the canvas centre). */\n center?: { x: number; y: number };\n /** `swirl`: true turns clockwise. */\n clockwise: boolean;\n /** `turbulent`: eddy size in pixels (8..1024). */\n scale: number;\n seed: number;\n}\n\nexport const DEFAULT_FLOW: Readonly<WetFlowSpec> = { kind: 'none', strength: 0.5, angle: 0, clockwise: true, scale: 120, seed: 1 };\n\n/** Acceleration of a flow map at strength 1, cells per step². */\nconst FLOW_ACCEL = 0.01;\n\n/** sin and cos of an angle in radians, by range reduction and Taylor series (deterministic). */\nexport function dsincos(a: number): [number, number] {\n const twoPi = 6.283185307179586;\n let x = a - Math.round(a / twoPi) * twoPi;\n // reduce to [−π/4, π/4] by quadrant\n const q = Math.round(x / (twoPi / 4));\n x -= q * (twoPi / 4);\n const x2 = x * x;\n let s = x;\n let c = 1;\n let ts = x;\n let tc = 1;\n for (let i = 1; i < 12; i++) {\n ts *= -x2 / ((2 * i) * (2 * i + 1));\n tc *= -x2 / ((2 * i - 1) * (2 * i));\n s += ts;\n c += tc;\n }\n switch (((q % 4) + 4) % 4) {\n case 0:\n return [s, c];\n case 1:\n return [c, -s];\n case 2:\n return [-s, -c];\n default:\n return [-c, s];\n }\n}\n\nfunction hash(x: number, y: number, seed: number): number {\n let h = (Math.imul(x | 0, 374761393) + Math.imul(y | 0, 668265263) + Math.imul(seed | 0, 1442695041)) | 0;\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n h ^= h >>> 16;\n return (h >>> 0) / 4294967296;\n}\n\nfunction valueNoise(x: number, y: number, seed: number): number {\n const x0 = Math.floor(x);\n const y0 = Math.floor(y);\n const fx = x - x0;\n const fy = y - y0;\n const sx = fx * fx * (3 - 2 * fx);\n const sy = fy * fy * (3 - 2 * fy);\n const a = hash(x0, y0, seed);\n const b = hash(x0 + 1, y0, seed);\n const c = hash(x0, y0 + 1, seed);\n const d = hash(x0 + 1, y0 + 1, seed);\n return a + (b - a) * sx + (c - a) * sy + (a - b - c + d) * sx * sy;\n}\n\n/** Settings with every field in range. */\nexport function normalizeFlow(raw: Partial<WetFlowSpec> = {}, base: WetFlowSpec = DEFAULT_FLOW): WetFlowSpec {\n const num = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\n const kind = WET_FLOW_KINDS.includes(raw.kind as WetFlowKind) ? (raw.kind as WetFlowKind) : base.kind;\n const center = raw.center && Number.isFinite(raw.center.x) && Number.isFinite(raw.center.y) ? { x: raw.center.x, y: raw.center.y } : base.center;\n return {\n kind,\n strength: Math.min(1, Math.max(0, num(raw.strength, base.strength))),\n angle: ((num(raw.angle, base.angle) % 360) + 360) % 360,\n ...(center ? { center } : {}),\n clockwise: typeof raw.clockwise === 'boolean' ? raw.clockwise : base.clockwise,\n scale: Math.min(1024, Math.max(8, num(raw.scale, base.scale))),\n seed: Math.abs(Math.round(num(raw.seed, base.seed))) % 2147483647,\n };\n}\n\n/** The flow field of a spec on a canvas, or `null` for `none` (strength is applied by the world). */\nexport function flowField(spec: WetFlowSpec, width: number, height: number): WetFlowField | null {\n const k = FLOW_ACCEL;\n const cx = spec.center?.x ?? width / 2;\n const cy = spec.center?.y ?? height / 2;\n const r0 = Math.max(width, height) / 2;\n switch (spec.kind) {\n case 'none':\n return null;\n case 'linear': {\n const [s, c] = dsincos((spec.angle * Math.PI) / 180);\n const v = [-s * k, c * k] as const;\n return () => v;\n }\n case 'swirl': {\n const sign = spec.clockwise ? 1 : -1;\n return (x, y) => [(-(y - cy) / r0) * k * sign, ((x - cx) / r0) * k * sign];\n }\n case 'radial':\n return (x, y) => [((x - cx) / r0) * k, ((y - cy) / r0) * k];\n case 'turbulent': {\n // The curl of value noise: divergence-free eddies.\n const sc = spec.scale;\n const e = 0.5;\n return (x, y) => {\n const u = x / sc;\n const v = y / sc;\n const dndy = (valueNoise(u, v + e / sc, spec.seed) - valueNoise(u, v - e / sc, spec.seed)) * sc;\n const dndx = (valueNoise(u + e / sc, v, spec.seed) - valueNoise(u - e / sc, v, spec.seed)) * sc;\n return [dndy * k * 0.5, -dndx * k * 0.5];\n };\n }\n }\n}\n","/**\n * The wet layer as a `PaintMedium`: the canvas side of the shared pick-up / mix exchange\n * (`PaintExchange`), so wet brushes pick up and mix paint the same way the Mixer Brush and the\n * phase 2 dab brushes do.\n *\n * - `sample` sees only wet paint (pigment still suspended in surface water): what a brush can\n * lift. Its colour is the suspended pigment's hue at full strength; contact is how much of the\n * footprint is wet with pigment in it.\n * - `deposit` lays water and pigment: the colour becomes Kubelka-Munk pigment (`pigmentOf` at the\n * brush's body), at `mass` per unit of coverage, with `water` depth.\n */\n\nimport type { PaintMedium, PaintSample, RgbTriple } from '../exchange';\nimport type { Pigment } from '../pigment';\nimport type { RasterRect } from '../../raster/surface';\nimport { pigmentColor, pigmentOf } from './film';\nimport type { WetWorld } from './world';\n\nexport interface WetMediumOptions {\n /** Water depth laid per unit of coverage (at deposit weight 1). */\n water: number;\n /** Pigment mass laid per unit of coverage (at deposit weight 1). */\n mass: number;\n /** 0 transparent watercolour .. 1 opaque gouache. */\n body: number;\n}\n\n/** The strongest absorption (K) a sampled colour is scaled to: its hue at full strength. */\nconst SAMPLE_K = 3;\n\nexport class WetMedium implements PaintMedium {\n private readonly pig = new Float64Array(4);\n\n constructor(\n readonly world: WetWorld,\n readonly laneId: string,\n public options: WetMediumOptions\n ) {}\n\n sample(rect: RasterRect, cov: ArrayLike<number>): PaintSample | null {\n const s = this.world.sample(this.laneId, rect, cov);\n if (!(s.wet > 0) || !(s.weight > 0)) return null;\n const k = s.pigment;\n const kmax = Math.max(k[0], k[1], k[2]);\n if (!(kmax > 1e-9)) return null;\n const f = SAMPLE_K / kmax;\n const rgb = pigmentColor(k[0] * f, k[1] * f, k[2] * f, k[3] * f) as RgbTriple;\n // Mass per wet cell, against a moderate wash (0.02 of K per cell).\n const density = Math.min(1, (k[0] + k[1] + k[2]) / s.wet / 0.06);\n return { rgb, contact: (s.wet / s.weight) * density };\n }\n\n deposit(rect: RasterRect, cov: ArrayLike<number>, dep: number, paint: Readonly<RgbTriple>, _pigment: Pigment | null, field: Float32Array | null = null): void {\n const { water, mass, body } = this.options;\n if (field) {\n const n = rect.width * rect.height;\n const out = new Float32Array(n * 4);\n const one = this.pig;\n for (let p = 0; p < n; p++) {\n pigmentOf([field[p * 3], field[p * 3 + 1], field[p * 3 + 2]], body, one);\n for (let q = 0; q < 4; q++) out[p * 4 + q] = one[q] * mass * dep;\n }\n this.world.paint(this.laneId, rect, cov, water * dep, null, out);\n return;\n }\n pigmentOf(paint, body, this.pig);\n const pig = [0, 1, 2, 3].map((q) => this.pig[q] * mass * dep);\n this.world.paint(this.laneId, rect, cov, water * dep, mass > 0 ? pig : null);\n }\n}\n","/**\n * WGSL compute kernels of the WebGPU wet-media engine (\"Engine B\"): a port of the step in\n * `kernel.ts` (the specification), the halo exchange of `WetWorld`, and the display shading of\n * `film.ts`, on the same slot layout as the CPU engine (a slot is `SLOT_PLANES` planes of 258 × 258\n * f32 at a float offset), so CPU state uploads as it is.\n *\n * The GPU does not give the CPU's bits: shader compilers may fuse multiply-adds and use their own\n * `exp` / `pow`, and two browsers on one GPU already differ. It stays within about 1/255 of the CPU\n * in the shaded pixels, which is what a display needs. Nothing saved is computed here.\n */\n\nimport { DRY_EPS, P_D0, P_EDGE, P_FX, P_FY, P_H, P_P0, P_RHO, P_SW, P_UX, P_UY, PARAM, PARAM_FLOATS, PLANE, SET_PLANES, SLOT_SIDE, STRIP, U_MAX } from './model';\nimport { HIDE } from './film';\n\n/** Words per job record: slot base (float offset), lane, the 8 neighbour bases, tile width and height, base tile index. */\nexport const GPU_JOB_WORDS = 16;\n/** `0xffffffff`: no neighbour / no base tile. */\nexport const GPU_NONE = 0xffffffff;\n/** Neighbour order in a job record. */\nexport const GPU_NB = ['n', 's', 'w', 'e', 'nw', 'ne', 'sw', 'se'] as const;\n\nconst common = /* wgsl */ `\nconst S: u32 = ${SLOT_SIDE}u;\nconst PL: u32 = ${PLANE}u;\nconst SETP: u32 = ${SET_PLANES}u;\nconst NONE: u32 = 0xffffffffu;\nstruct Job {\n base: u32,\n lane: u32,\n nb: array<u32, 8>,\n w: u32,\n h: u32,\n src: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n};\nstruct Uni {\n parity: u32,\n mode: u32,\n paper: u32,\n pad: u32,\n};\n`;\n\nconst NBO = [0, -1, -SLOT_SIDE, 1, SLOT_SIDE, -SLOT_SIDE - 1, -SLOT_SIDE + 1, SLOT_SIDE + 1, SLOT_SIDE - 1];\nconst OPPK = [0, 3, 4, 1, 2, 7, 8, 5, 6];\nconst off = (o: number) => (o < 0 ? `c - ${-o}u` : `c + ${o}u`);\n\n/** Streaming, unrolled (dynamic indexing of private arrays is slow on GPUs). */\nfunction stream(): string {\n let out = '';\n for (let k = 1; k <= 8; k++) {\n const n = off(NBO[k]);\n out += `\n let hn${k} = st[hP + ${n}];\n let rn${k} = st[rhoS + ${n}];\n let dampN${k} = max(0.0, 1.0 - st[swS + ${n}] * invCap);\n if (rn${k} < EPS && !(hn${k} < 0.0)) { dryNb = dryNb + dampN${k}; }\n var b${k} = max(kx, blockScale * hn${k});\n if (hn${k} < 0.0 || xWall || (rxDry && rn${k} < pinX) || (rn${k} < EPS && rx < (pinT + rough * hn${k}) * dampN${k})) { b${k} = 1.0; }\n let f${k} = (1.0 - b${k}) * st[src + ${k}u * PL + ${n}] + b${k} * st[src + ${OPPK[k]}u * PL + c];`;\n }\n return out;\n}\n\n/** Collision, unrolled. */\nfunction collide(): string {\n const eu = ['', 'ux', 'uy', '-ux', '-uy', '(ux + uy)', '(uy - ux)', '-(ux + uy)', '(ux - uy)'];\n let out = '';\n for (let k = 1; k <= 8; k++) {\n out += `\n { let eu = ${eu[k]}; let feq = ${k < 5 ? 'wr1' : 'wr2'} * (1.0 + 3.0 * eu + 4.5 * eu * eu - usq); st[dst + ${k}u * PL + c] = (f${k} + omega * (feq - f${k})) * scale; }`;\n }\n return out;\n}\n\n/** Pigment faces (east, west, south, north), unrolled. */\nfunction faces(): string {\n const nbs = ['c + 1u', 'c - 1u', 'c + S', 'c - S'];\n let out = '';\n nbs.forEach((nb, face) => {\n const outF = face === 0 || face === 2;\n const uf = face < 2 ? `mobility * (uxc + st[uxS + ${nb}])` : `mobility * (uyc + st[uyS + ${nb}])`;\n out += `\n {\n let nb = ${nb};\n let uf = ${uf};\n let pn = vec4<f32>(st[pS + nb], st[pS + PL + nb], st[pS + 2u * PL + nb], st[pS + 3u * PL + nb]);\n let flux = ${outF ? 'select(uf * pn, uf * pc, uf > 0.0)' : 'select(uf * pc, uf * pn, uf > 0.0)'};\n let v = pNew ${outF ? '-' : '+'} flux + bleed * (pn - pc);\n if (rxWet && st[rhoS + nb] >= EPS) { pNew = v; }\n }`;\n });\n return out;\n}\n\n/** One step of every job's tile: `dispatchWorkgroups(16, 16, jobs)`. */\nexport const WGSL_STEP = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read_write> st: array<f32>;\n@group(0) @binding(1) var<storage, read> prm: array<f32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(3) var<storage, read_write> flags: array<atomic<u32>>;\n@group(0) @binding(4) var<uniform> u: Uni;\nvar<workgroup> wflags: atomic<u32>;\n\nconst EPS: f32 = ${DRY_EPS};\nconst UMAX: f32 = ${U_MAX};\nconst W0: f32 = ${4 / 9};\nconst W1: f32 = ${1 / 9};\nconst W2: f32 = ${1 / 36};\nconst TINY: f32 = 1e-9;\nconst DECAY: f32 = 0.99;\nconst STRIP: u32 = ${STRIP}u;\n\nfn P(i: u32, lane: u32) -> f32 { return prm[lane * ${PARAM_FLOATS}u + i]; }\n\n@compute @workgroup_size(16, 16, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>, @builtin(local_invocation_index) li: u32) {\n if (li == 0u) { atomicStore(&wflags, 0u); }\n workgroupBarrier();\n let job = jobs[gid.z];\n let x = gid.x + 1u;\n let y = gid.y + 1u;\n let c = y * S + x;\n let base = job.base;\n let src = base + u.parity * SETP * PL;\n let dst = base + (1u - u.parity) * SETP * PL;\n let hP = base + ${P_H}u * PL;\n let dP = base + ${P_D0}u * PL;\n let rhoS = src + ${P_RHO}u * PL;\n let swS = src + ${P_SW}u * PL;\n let uxS = src + ${P_UX}u * PL;\n let uyS = src + ${P_UY}u * PL;\n let pS = src + ${P_P0}u * PL;\n let eS = src + ${P_EDGE}u * PL;\n let L = job.lane;\n let omega = P(${PARAM.omega}u, L);\n let tau = P(${PARAM.tau}u, L);\n let evap = P(${PARAM.evap}u, L);\n let edgeEvap = P(${PARAM.edgeEvap}u, L);\n let mobility = P(${PARAM.mobility}u, L);\n let depRate = P(${PARAM.depRate}u, L);\n let pickup = P(${PARAM.pickup}u, L);\n let absorption = P(${PARAM.absorption}u, L);\n let invCap = P(${PARAM.invCap}u, L);\n let blockScale = P(${PARAM.blockScale}u, L);\n let rough = P(${PARAM.rough}u, L);\n let pinT = P(${PARAM.pinT}u, L);\n let flowK = P(${PARAM.flowK}u, L);\n let gran = P(${PARAM.granulation}u, L);\n let edgeDep = P(${PARAM.edgeDep}u, L);\n let bloom = P(${PARAM.bloom}u, L);\n let paperEvap = P(${PARAM.paperEvap}u, L);\n let hasFlow = P(${PARAM.hasFlow}u, L) != 0.0;\n let bleed = P(${PARAM.bleed}u, L);\n\n let hx = st[hP + c];\n let kx = blockScale * hx;\n let rx = st[rhoS + c];\n let sx = st[swS + c];\n let damp = max(0.0, 1.0 - sx * invCap);\n let pinX = (pinT + rough * hx) * damp;\n let rxDry = rx < EPS;\n let xWall = hx < 0.0;\n\n // 1. streaming with partial bounce-back and pinning (n = x − e_k)\n var dryNb = 0.0;\n let f0 = st[src + c];\n${stream()}\n // 2. depth, velocity, forcing\n let rho = f0 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8;\n let mx = f1 - f3 + f5 - f6 - f7 + f8;\n let my = f2 - f4 + f5 + f6 - f7 - f8;\n var gx = P(${PARAM.gx}u, L);\n var gy = P(${PARAM.gy}u, L);\n if (hasFlow) {\n gx = gx + flowK * st[base + ${P_FX}u * PL + c];\n gy = gy + flowK * st[base + ${P_FY}u * PL + c];\n }\n var ux = 0.0;\n var uy = 0.0;\n if (rho > EPS) {\n ux = mx / rho + tau * gx;\n uy = my / rho + tau * gy;\n }\n let sp2 = ux * ux + uy * uy;\n if (sp2 > UMAX * UMAX) {\n let sc = UMAX / sqrt(sp2);\n ux = ux * sc;\n uy = uy * sc;\n }\n\n // 3. absorption and evaporation\n let absorbed = min(rho, absorption * (1.0 - 0.5 * hx) * rho * damp);\n let ex = st[eS + c];\n var ev = 0.0;\n if (rho > 0.0) { ev = evap * (1.0 + edgeEvap * ex); }\n let rhoNew = max(0.0, rho - absorbed - ev);\n var scale = 0.0;\n if (rho > TINY) { scale = rhoNew / rho; }\n var sEv = 0.0;\n if (sx > 0.0) { sEv = paperEvap; }\n let sNew = max(0.0, sx + absorbed - sEv);\n st[dst + ${P_SW}u * PL + c] = sNew;\n\n // 4. collision, then scale\n let usq = 1.5 * (ux * ux + uy * uy);\n let wr0 = W0 * rho;\n let wr1 = W1 * rho;\n let wr2 = W2 * rho;\n st[dst + c] = (f0 + omega * (wr0 * (1.0 - usq) - f0)) * scale;\n${collide()}\n\n // 5. pigment: upwind advection with the last step's velocities, plus bleed\n let rxWet = !rxDry;\n let uxc = st[uxS + c];\n let uyc = st[uyS + c];\n var pNew = vec4<f32>(st[pS + c], st[pS + PL + c], st[pS + 2u * PL + c], st[pS + 3u * PL + c]);\n let pc = pNew;\n${faces()}\n\n // 6. deposition and pickup\n let dryNow = rhoNew < EPS;\n let rate = depRate * (1.0 + gran * (1.0 - hx)) * (1.0 + edgeDep * ex);\n var lift = 0.0;\n if (!dryNow) { lift = pickup * min(rhoNew, 1.0) * (1.0 + bloom * max(0.0, rhoNew - rx)); }\n for (var q = 0u; q < 4u; q++) {\n let pq = max(0.0, pNew[q]);\n let dq = st[dP + q * PL + c];\n var dep = min(pq, pq * rate);\n if (dryNow) { dep = pq; }\n let lq = dq * lift;\n st[dst + (${P_P0}u + q) * PL + c] = pq - dep + lq;\n st[dP + q * PL + c] = dq + dep - lq;\n }\n let mean4 = (st[eS + c + 1u] + st[eS + c - 1u] + st[eS + c + S] + st[eS + c - S]) * 0.25;\n let eNew = min(1.0, max(min(1.0, dryNb * 0.25), DECAY * mean4));\n st[dst + ${P_EDGE}u * PL + c] = select(eNew, 0.0, dryNow);\n st[dst + ${P_RHO}u * PL + c] = rhoNew;\n st[dst + ${P_UX}u * PL + c] = select(ux, 0.0, dryNow);\n st[dst + ${P_UY}u * PL + c] = select(uy, 0.0, dryNow);\n var fl = 0u;\n if (rhoNew > 0.0 || sNew > 0.0) {\n fl = 1u;\n let lx = gid.x;\n let ly = gid.y;\n if (lx < STRIP) { fl = fl | 2u; }\n if (lx >= 256u - STRIP) { fl = fl | 4u; }\n if (ly < STRIP) { fl = fl | 8u; }\n if (ly >= 256u - STRIP) { fl = fl | 16u; }\n }\n if (!dryNow) { fl = fl | 32u; }\n if (fl != 0u) { atomicOr(&wflags, fl); }\n workgroupBarrier();\n if (li == 0u) {\n let wf = atomicLoad(&wflags);\n if (wf != 0u) { atomicOr(&flags[gid.z], wf); }\n }\n}\n`;\n\n/**\n * Fills each job's halo in set `parity` (the set just written) from its neighbours, as\n * `WetWorld.haloTs` does: `dispatchWorkgroups(17, SET_PLANES, jobs)`. A missing neighbour leaves\n * the halo as it is.\n */\nexport const WGSL_HALO = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read_write> st: array<f32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(4) var<uniform> u: Uni;\n\n@compute @workgroup_size(64, 1, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let i = gid.x;\n if (i >= 4u * S) { return; }\n let job = jobs[gid.z];\n let side = i / S;\n let j = i % S;\n let off = u.parity * SETP * PL + gid.y * PL;\n var srcSlot = NONE;\n var fc = 0u;\n var tc = 0u;\n if (side == 0u) {\n tc = j;\n if (j == 0u) { srcSlot = job.nb[4]; fc = 256u * S + 256u; }\n else if (j == S - 1u) { srcSlot = job.nb[5]; fc = 256u * S + 1u; }\n else { srcSlot = job.nb[0]; fc = 256u * S + j; }\n } else if (side == 1u) {\n tc = (S - 1u) * S + j;\n if (j == 0u) { srcSlot = job.nb[6]; fc = S + 256u; }\n else if (j == S - 1u) { srcSlot = job.nb[7]; fc = S + 1u; }\n else { srcSlot = job.nb[1]; fc = S + j; }\n } else if (side == 2u) {\n if (j == 0u || j == S - 1u) { return; }\n tc = j * S;\n srcSlot = job.nb[2];\n fc = j * S + 256u;\n } else {\n if (j == 0u || j == S - 1u) { return; }\n tc = j * S + S - 1u;\n srcSlot = job.nb[3];\n fc = j * S + 1u;\n }\n if (srcSlot == NONE) { return; }\n st[job.base + off + tc] = st[srcSlot + off + fc];\n}\n`;\n\n/**\n * Shades each job's tile for display over its base tile (or transparent), as `film.ts`'s\n * `shadeTile` does in 'display' mode (mode 0) or 'bake-all' (mode 1, a preview of drying):\n * `dispatchWorkgroups(16, 16, jobs)`. Writes RGBA8 (packed little-endian u32) per pixel.\n */\nexport const WGSL_SHADE = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read> st: array<f32>;\n@group(0) @binding(1) var<storage, read> srcTiles: array<u32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(3) var<storage, read_write> outTiles: array<u32>;\n@group(0) @binding(4) var<uniform> u: Uni;\n\nconst HIDE: f32 = ${HIDE};\n\nfn toLinear(v: f32) -> f32 {\n let x = clamp(v / 255.0, 0.0, 1.0);\n return select(pow((x + 0.055) / 1.055, 2.4), x / 12.92, x <= 0.04045);\n}\nfn toByte(v: f32) -> f32 {\n let x = clamp(v, 0.0, 1.0);\n let e = select(1.055 * pow(x, 1.0 / 2.4) - 0.055, 12.92 * x, x <= 0.0031308);\n return clamp(round(e * 255.0), 0.0, 255.0);\n}\nfn rinf(ks: f32) -> f32 { return 1.0 + ks - sqrt(ks * ks + 2.0 * ks); }\nfn needAlpha(e: f32, p: f32, a: f32) -> f32 {\n if (e < p) { return max(a, 1.0 - e / p); }\n if (e > p) { return max(a, (e - p) / (255.0 - p)); }\n return a;\n}\n\n@compute @workgroup_size(16, 16, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let job = jobs[gid.z];\n let x = gid.x;\n let y = gid.y;\n let o = gid.z * 65536u + y * 256u + x;\n var px = 0u;\n if (job.src != NONE) { px = srcTiles[job.src * 65536u + y * 256u + x]; }\n if (x >= job.w || y >= job.h) { outTiles[o] = px; return; }\n let c = (y + 1u) * S + x + 1u;\n let cur = job.base + u.parity * SETP * PL;\n let d = job.base + ${P_D0}u * PL;\n let p = cur + ${P_P0}u * PL;\n var k = vec4<f32>(st[d + c], st[d + PL + c], st[d + 2u * PL + c], st[d + 3u * PL + c]);\n k = k + vec4<f32>(st[p + c], st[p + PL + c], st[p + 2u * PL + c], st[p + 3u * PL + c]);\n var wet = 0.0;\n if (u.mode == 0u) { wet = min(1.0, st[cur + ${P_RHO}u * PL + c] * 4.0 + st[cur + ${P_SW}u * PL + c]); }\n if (!(k.x > 1e-7 || k.y > 1e-7 || k.z > 1e-7 || k.w > 1e-7) && wet <= 0.0) { outTiles[o] = px; return; }\n let paper = vec3<f32>(f32(u.paper & 255u), f32((u.paper >> 8u) & 255u), f32((u.paper >> 16u) & 255u));\n let pr = vec4<f32>(f32(px & 255u), f32((px >> 8u) & 255u), f32((px >> 16u) & 255u), f32(px >> 24u));\n let a = pr.w / 255.0;\n let below = vec3<f32>(toLinear(a * pr.x + (1.0 - a) * paper.x), toLinear(a * pr.y + (1.0 - a) * paper.y), toLinear(a * pr.z + (1.0 - a) * paper.z));\n let s = k.w;\n var hide = 0.0;\n if (s > 0.0) { hide = 1.0 - exp(-HIDE * s); }\n let keep = 1.0 - hide;\n var inv = 0.0;\n if (s > 1e-9) { inv = 1.0 / s; }\n var film = keep * exp(-2.0 * k.xyz) * below;\n if (hide > 0.0) { film = film + hide * vec3<f32>(rinf(k.x * inv), rinf(k.y * inv), rinf(k.z * inv)); }\n let dark = 1.0 - 0.07 * wet;\n let e = vec3<f32>(toByte(film.x * dark), toByte(film.y * dark), toByte(film.z * dark));\n var alpha = a;\n alpha = needAlpha(e.x, paper.x, alpha);\n alpha = needAlpha(e.y, paper.y, alpha);\n alpha = needAlpha(e.z, paper.z, alpha);\n if (alpha <= 0.0) { outTiles[o] = px & 0x00ffffffu; return; }\n let a8 = max(round(min(1.0, alpha) * 255.0), pr.w);\n let al = a8 / 255.0;\n let kk = 1.0 - al;\n let rgb = clamp(round((e - kk * paper) / al), vec3<f32>(0.0), vec3<f32>(255.0));\n outTiles[o] = u32(rgb.x) | (u32(rgb.y) << 8u) | (u32(rgb.z) << 16u) | (u32(a8) << 24u);\n}\n`;\n","/**\n * Engine B: the wet-media step and display shading on WebGPU, an accelerator for large wet areas.\n *\n * The CPU engine (`WetWorld`, WebAssembly SIMD) stays the authority: it owns the clock, edits,\n * drying, save, export and replay, and gives the same bits everywhere. This engine mirrors the CPU\n * state on the GPU (same slot layout, uploaded region by region as the CPU edits it), steps it and\n * shades it into RGBA8 tiles for display. Its results stay within about 1/255 of the CPU's but are\n * not bit-identical (shader compilers differ), so nothing it computes is ever saved.\n *\n * DOM-free and dependency-free: it takes a `navigator.gpu`-like object (or finds one) and uses\n * only the WebGPU API. Without one, `createWetGpuEngine` says why and the CPU does everything.\n */\n\nimport { GPU_JOB_WORDS, GPU_NONE, WGSL_HALO, WGSL_SHADE, WGSL_STEP } from './gpu-kernels';\nimport { MAX_WET_LANES, MAX_WET_SLOTS } from './world';\nimport { PARAM_FLOATS, SET_PLANES, SLOT_BYTES, SLOT_PLANES, PLANE } from './model';\n\n/** Floats per slot. */\nconst SLOT_FLOATS = SLOT_PLANES * PLANE;\nconst TILE_WORDS = 256 * 256;\n\n// WebGPU constants (GPUBufferUsage, GPUMapMode), so this runs without the globals.\nconst MAP_READ = 0x1;\nconst COPY_SRC = 0x4;\nconst COPY_DST = 0x8;\nconst UNIFORM = 0x40;\nconst STORAGE = 0x80;\n\n/* Just the WebGPU surface this engine uses (the repo has no @webgpu/types). */\ninterface GBuffer {\n readonly size: number;\n destroy(): void;\n mapAsync(mode: number, offset?: number, size?: number): Promise<void>;\n getMappedRange(offset?: number, size?: number): ArrayBuffer;\n unmap(): void;\n}\ninterface GPass {\n setPipeline(p: unknown): void;\n setBindGroup(i: number, g: unknown): void;\n dispatchWorkgroups(x: number, y?: number, z?: number): void;\n end(): void;\n}\ninterface GEncoder {\n beginComputePass(): GPass;\n copyBufferToBuffer(src: GBuffer, so: number, dst: GBuffer, d: number, size: number): void;\n clearBuffer(b: GBuffer, offset?: number, size?: number): void;\n finish(): unknown;\n}\ninterface GQueue {\n writeBuffer(b: GBuffer, offset: number, data: ArrayBufferView | ArrayBufferLike, dataOffset?: number, size?: number): void;\n submit(cmds: unknown[]): void;\n onSubmittedWorkDone(): Promise<void>;\n}\ninterface GPipeline {\n getBindGroupLayout(i: number): unknown;\n}\ninterface GDevice {\n readonly queue: GQueue;\n readonly limits: Record<string, number>;\n readonly lost?: Promise<{ message?: string; reason?: string }>;\n createBuffer(d: { size: number; usage: number; label?: string }): GBuffer;\n createShaderModule(d: { code: string; label?: string }): unknown;\n createComputePipeline(d: { layout: 'auto'; compute: { module: unknown; entryPoint: string }; label?: string }): GPipeline;\n createComputePipelineAsync?(d: { layout: 'auto'; compute: { module: unknown; entryPoint: string }; label?: string }): Promise<GPipeline>;\n createBindGroup(d: { layout: unknown; entries: { binding: number; resource: { buffer: GBuffer; offset?: number; size?: number } }[] }): unknown;\n createCommandEncoder(): GEncoder;\n pushErrorScope?(filter: string): void;\n popErrorScope?(): Promise<{ message: string } | null>;\n destroy(): void;\n}\ninterface GAdapter {\n readonly limits: Record<string, number>;\n readonly info?: { vendor?: string; architecture?: string; description?: string };\n requestDevice(d?: { requiredLimits?: Record<string, number>; label?: string }): Promise<GDevice>;\n}\n/** A `navigator.gpu`-like object. */\nexport interface WetGpuProvider {\n requestAdapter(options?: { powerPreference?: 'high-performance' | 'low-power' }): Promise<unknown>;\n}\n\n/** Whether Engine B can run here, and if not, why. */\nexport interface WetGpuSupport {\n supported: boolean;\n /** Why not (no WebGPU, no adapter, too little buffer space, the device failed), or `null`. */\n reason: string | null;\n /** The GPU's vendor and architecture, when known. */\n adapter: string | null;\n /** Most wet tiles (256 px, all layers) the GPU can hold. */\n maxSlots: number;\n}\n\n/** A tile to step or shade: its slot, lane, the slots of its 8 neighbours, and its size on the canvas. */\nexport interface WetGpuJob {\n slot: number;\n lane: number;\n /** Neighbour slots in the order n, s, w, e, nw, ne, sw, se; −1 for none. */\n neighbours: readonly number[];\n /** Pixels of the tile on the canvas (256 except at the right and bottom edges). */\n width: number;\n height: number;\n}\n\n/** The `navigator.gpu` of this context, if any. */\nexport function findWebGpu(): WetGpuProvider | null {\n const nav = (globalThis as { navigator?: { gpu?: WetGpuProvider } }).navigator;\n return nav?.gpu ?? null;\n}\n\n/**\n * Starts Engine B on `gpu` (default `navigator.gpu`). Resolves with the engine, or `null` and the\n * reason it cannot run (no WebGPU, no adapter, too little storage-buffer space, a failed device).\n */\nexport async function createWetGpuEngine(gpu: WetGpuProvider | null = findWebGpu()): Promise<{ engine: WetGpuEngine | null; support: WetGpuSupport }> {\n const no = (reason: string, adapter: string | null = null) => ({ engine: null, support: { supported: false, reason, adapter, maxSlots: 0 } });\n if (!gpu || typeof gpu.requestAdapter !== 'function') return no('This browser has no WebGPU (navigator.gpu); wet paint runs on the CPU.');\n let adapter: GAdapter | null;\n try {\n adapter = (await gpu.requestAdapter({ powerPreference: 'high-performance' })) as GAdapter | null;\n } catch (e) {\n return no(`WebGPU gave no adapter (${(e as Error).message}); wet paint runs on the CPU.`);\n }\n if (!adapter) return no('WebGPU gave no adapter (the GPU may be blocklisted); wet paint runs on the CPU.');\n const name = [adapter.info?.vendor, adapter.info?.architecture].filter(Boolean).join(' ') || null;\n const binding = Math.min(adapter.limits.maxStorageBufferBindingSize ?? 0, adapter.limits.maxBufferSize ?? 0);\n const maxSlots = Math.min(MAX_WET_SLOTS, Math.floor(binding / SLOT_BYTES));\n if (maxSlots < 4) return no(`The GPU's storage buffers hold ${Math.max(0, maxSlots)} wet tiles; at least 4 are needed. Wet paint runs on the CPU.`, name);\n let device: GDevice;\n try {\n device = await adapter.requestDevice({\n label: 'pixerate wet media',\n requiredLimits: {\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n },\n });\n } catch (e) {\n return no(`The WebGPU device did not start (${(e as Error).message}); wet paint runs on the CPU.`, name);\n }\n try {\n const engine = await WetGpuEngine.start(device, maxSlots, name);\n return { engine, support: { supported: true, reason: null, adapter: name, maxSlots } };\n } catch (e) {\n device.destroy?.();\n return no(`The wet-media shaders did not compile on this GPU (${(e as Error).message}); wet paint runs on the CPU.`, name);\n }\n}\n\n/** Whether Engine B can run here (starts and stops a device). */\nexport async function wetGpuSupport(gpu: WetGpuProvider | null = findWebGpu()): Promise<WetGpuSupport> {\n const { engine, support } = await createWetGpuEngine(gpu);\n engine?.destroy();\n return support;\n}\n\nasync function pipeline(device: GDevice, code: string, label: string): Promise<GPipeline> {\n device.pushErrorScope?.('validation');\n const module = device.createShaderModule({ code, label }) as { getCompilationInfo?: () => Promise<{ messages: readonly { type: string; message: string; lineNum: number }[] }> };\n const info = await module.getCompilationInfo?.();\n const errors = info?.messages.filter((m) => m.type === 'error') ?? [];\n if (errors.length) {\n await device.popErrorScope?.();\n throw new Error(`${label}: ${errors.map((m) => `line ${m.lineNum}: ${m.message}`).join('; ')}`);\n }\n const desc = { layout: 'auto' as const, compute: { module, entryPoint: 'main' }, label };\n const p = device.createComputePipelineAsync ? await device.createComputePipelineAsync(desc) : device.createComputePipeline(desc);\n const err = await device.popErrorScope?.();\n if (err) throw new Error(`${label}: ${err.message}`);\n return p;\n}\n\n/** The engine on a started device. Make one with `createWetGpuEngine`. */\nexport class WetGpuEngine {\n /** Steps run on the GPU so far (for stats). */\n steps = 0;\n /** Set once the device is lost; the engine does nothing after that. */\n lostReason: string | null = null;\n private state: GBuffer;\n private slots = 0;\n private readonly params: GBuffer;\n private jobs: GBuffer;\n private jobCap = 0;\n private flags: GBuffer;\n private flagsRead: GBuffer;\n private readonly uni: GBuffer[];\n private readonly shadeUni: GBuffer;\n private srcTiles: GBuffer | null = null;\n private outTiles: GBuffer | null = null;\n private outRead: GBuffer | null = null;\n private tileCap = 0;\n private groups: { step: unknown[]; halo: unknown[] } | null = null;\n\n private constructor(\n private readonly device: GDevice,\n /** Most tiles the GPU can hold. */\n readonly maxSlots: number,\n /** The GPU, when known. */\n readonly adapter: string | null,\n private readonly stepPipe: GPipeline,\n private readonly haloPipe: GPipeline,\n private readonly shadePipe: GPipeline\n ) {\n const d = device;\n this.state = d.createBuffer({ size: SLOT_BYTES, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet state' });\n this.slots = 1;\n this.params = d.createBuffer({ size: MAX_WET_LANES * PARAM_FLOATS * 4, usage: STORAGE | COPY_DST, label: 'wet params' });\n this.jobs = d.createBuffer({ size: 64 * GPU_JOB_WORDS * 4, usage: STORAGE | COPY_DST, label: 'wet jobs' });\n this.jobCap = 64;\n this.flags = d.createBuffer({ size: 64 * 4, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet flags' });\n this.flagsRead = d.createBuffer({ size: 64 * 4, usage: MAP_READ | COPY_DST, label: 'wet flags read' });\n this.uni = [0, 1].map((p) => {\n const b = d.createBuffer({ size: 16, usage: UNIFORM | COPY_DST, label: `wet parity ${p}` });\n d.queue.writeBuffer(b, 0, new Uint32Array([p, 0, 0, 0]));\n return b;\n });\n this.shadeUni = d.createBuffer({ size: 16, usage: UNIFORM | COPY_DST, label: 'wet shade' });\n void device.lost?.then((info) => {\n this.lostReason = info?.message || info?.reason || 'the GPU device was lost';\n });\n }\n\n /** @internal Compiles the kernels; use `createWetGpuEngine`. */\n static async start(device: GDevice, maxSlots: number, adapter: string | null): Promise<WetGpuEngine> {\n const [step, halo, shade] = await Promise.all([pipeline(device, WGSL_STEP, 'wet step'), pipeline(device, WGSL_HALO, 'wet halo'), pipeline(device, WGSL_SHADE, 'wet shade')]);\n return new WetGpuEngine(device, maxSlots, adapter, step, halo, shade);\n }\n\n /** Bytes of GPU memory in use. */\n memoryBytes(): number {\n return this.state.size + this.jobs.size + (this.srcTiles?.size ?? 0) + (this.outTiles?.size ?? 0) * 2;\n }\n\n /** Slots the state buffer holds now. */\n get capacity(): number {\n return this.slots;\n }\n\n /** Grows the state buffer to hold `n` slots (keeping its contents). Returns false past `maxSlots`. */\n ensureSlots(n: number): boolean {\n if (n <= this.slots) return true;\n if (n > this.maxSlots) return false;\n const want = Math.min(this.maxSlots, Math.max(n, Math.ceil(this.slots * 1.5)));\n const next = this.device.createBuffer({ size: want * SLOT_BYTES, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet state' });\n const enc = this.device.createCommandEncoder();\n enc.copyBufferToBuffer(this.state, 0, next, 0, this.slots * SLOT_BYTES);\n this.device.queue.submit([enc.finish()]);\n this.state.destroy();\n this.state = next;\n this.slots = want;\n this.groups = null;\n return true;\n }\n\n /** Writes floats into a slot (`offset` floats from the slot's start). */\n writeSlot(slot: number, offset: number, data: Float32Array): void {\n if (slot >= this.slots) throw new Error(`Slot ${slot} is past the GPU's ${this.slots}; call ensureSlots first.`);\n this.device.queue.writeBuffer(this.state, (slot * SLOT_FLOATS + offset) * 4, data.buffer, data.byteOffset, data.byteLength);\n }\n\n /** Sets a lane's packed parameters (`packWetParams`). */\n setParams(lane: number, prm: Float32Array): void {\n this.device.queue.writeBuffer(this.params, lane * PARAM_FLOATS * 4, prm.buffer, prm.byteOffset, PARAM_FLOATS * 4);\n }\n\n private writeJobs(jobs: readonly WetGpuJob[], src?: readonly number[]): void {\n if (jobs.length > this.jobCap) {\n this.jobs.destroy();\n this.flags.destroy();\n this.flagsRead.destroy();\n this.jobCap = Math.max(jobs.length, this.jobCap * 2);\n this.jobs = this.device.createBuffer({ size: this.jobCap * GPU_JOB_WORDS * 4, usage: STORAGE | COPY_DST, label: 'wet jobs' });\n this.flags = this.device.createBuffer({ size: this.jobCap * 4, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet flags' });\n this.flagsRead = this.device.createBuffer({ size: this.jobCap * 4, usage: MAP_READ | COPY_DST, label: 'wet flags read' });\n this.groups = null;\n }\n const words = new Uint32Array(jobs.length * GPU_JOB_WORDS);\n jobs.forEach((j, i) => {\n if (j.slot < 0 || j.slot >= this.slots) throw new Error(`Job ${i} is on slot ${j.slot}, past the GPU's ${this.slots}.`);\n const o = i * GPU_JOB_WORDS;\n words[o] = j.slot * SLOT_FLOATS;\n words[o + 1] = j.lane;\n for (let k = 0; k < 8; k++) {\n const n = j.neighbours[k] ?? -1;\n words[o + 2 + k] = n >= 0 ? n * SLOT_FLOATS : GPU_NONE;\n }\n words[o + 10] = j.width;\n words[o + 11] = j.height;\n words[o + 12] = src && src[i] >= 0 ? src[i] : GPU_NONE;\n });\n this.device.queue.writeBuffer(this.jobs, 0, words);\n }\n\n private bindGroups(): { step: unknown[]; halo: unknown[] } {\n if (this.groups) return this.groups;\n const d = this.device;\n const step = [0, 1].map((p) =>\n d.createBindGroup({\n layout: this.stepPipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 1, resource: { buffer: this.params } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 3, resource: { buffer: this.flags } },\n { binding: 4, resource: { buffer: this.uni[p] } },\n ],\n })\n );\n const halo = [0, 1].map((p) =>\n d.createBindGroup({\n layout: this.haloPipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 4, resource: { buffer: this.uni[p] } },\n ],\n })\n );\n this.groups = { step, halo };\n return this.groups;\n }\n\n /**\n * Runs `steps` steps of `jobs` from set `parity` (as the CPU's `runHere`: each step, then each\n * tile's halo in the new set). With `readFlags`, resolves with each job's flag bits OR-ed over\n * the steps (`FLAG_*`); otherwise once the work is submitted.\n */\n async step(jobs: readonly WetGpuJob[], parity: number, steps: number, readFlags = false): Promise<Uint32Array | null> {\n if (this.lostReason) throw new Error(`The GPU is gone (${this.lostReason}).`);\n if (!jobs.length || steps <= 0) return readFlags ? new Uint32Array(jobs.length) : null;\n this.writeJobs(jobs);\n const g = this.bindGroups();\n const enc = this.device.createCommandEncoder();\n enc.clearBuffer(this.flags, 0, jobs.length * 4);\n let p = parity & 1;\n for (let s = 0; s < steps; s++) {\n const a = enc.beginComputePass();\n a.setPipeline(this.stepPipe);\n a.setBindGroup(0, g.step[p]);\n a.dispatchWorkgroups(16, 16, jobs.length);\n a.end();\n const b = enc.beginComputePass();\n b.setPipeline(this.haloPipe);\n b.setBindGroup(0, g.halo[1 - p]);\n b.dispatchWorkgroups(Math.ceil((4 * 258) / 64), SET_PLANES, jobs.length);\n b.end();\n p = 1 - p;\n }\n if (readFlags) enc.copyBufferToBuffer(this.flags, 0, this.flagsRead, 0, jobs.length * 4);\n this.device.queue.submit([enc.finish()]);\n this.steps += steps;\n if (!readFlags) return null;\n await this.flagsRead.mapAsync(MAP_READ, 0, jobs.length * 4);\n const out = new Uint32Array(this.flagsRead.getMappedRange(0, jobs.length * 4).slice(0));\n this.flagsRead.unmap();\n return out;\n }\n\n /** Refills each job's halo in set `parity` from its neighbours (after uploads). */\n refreshHalos(jobs: readonly WetGpuJob[], parity: number): void {\n if (this.lostReason || !jobs.length) return;\n this.writeJobs(jobs);\n const g = this.bindGroups();\n const enc = this.device.createCommandEncoder();\n const b = enc.beginComputePass();\n b.setPipeline(this.haloPipe);\n b.setBindGroup(0, g.halo[parity & 1]);\n b.dispatchWorkgroups(Math.ceil((4 * 258) / 64), SET_PLANES, jobs.length);\n b.end();\n this.device.queue.submit([enc.finish()]);\n }\n\n /**\n * Shades `jobs` (set `parity`) over their base tiles (`src[i]`: RGBA8 256 × 256, or `null` for\n * transparent) on paper `paper` (sRGB bytes). `mode` 'display' darkens wet paper a little;\n * 'dried' shows the paint as it would dry. Resolves with one RGBA8 tile per job.\n */\n async shade(jobs: readonly WetGpuJob[], parity: number, src: readonly (Uint8ClampedArray | null)[], paper: readonly [number, number, number], mode: 'display' | 'dried' = 'display'): Promise<Uint8ClampedArray[]> {\n if (this.lostReason) throw new Error(`The GPU is gone (${this.lostReason}).`);\n if (!jobs.length) return [];\n const n = jobs.length;\n const srcIndex: number[] = [];\n let srcCount = 0;\n for (const s of src) srcIndex.push(s ? srcCount++ : -1);\n this.writeJobs(jobs, srcIndex);\n const d = this.device;\n const tileBytes = TILE_WORDS * 4;\n if (n > this.tileCap || !this.outTiles || !this.outRead || !this.srcTiles) {\n this.srcTiles?.destroy();\n this.outTiles?.destroy();\n this.outRead?.destroy();\n this.tileCap = Math.max(n, this.tileCap * 2, 4);\n this.srcTiles = d.createBuffer({ size: this.tileCap * tileBytes, usage: STORAGE | COPY_DST, label: 'wet base tiles' });\n this.outTiles = d.createBuffer({ size: this.tileCap * tileBytes, usage: STORAGE | COPY_SRC, label: 'wet shaded tiles' });\n this.outRead = d.createBuffer({ size: this.tileCap * tileBytes, usage: MAP_READ | COPY_DST, label: 'wet shaded read' });\n }\n src.forEach((s, i) => {\n if (s) d.queue.writeBuffer(this.srcTiles!, srcIndex[i] * tileBytes, s.buffer, s.byteOffset, tileBytes);\n });\n d.queue.writeBuffer(this.shadeUni, 0, new Uint32Array([parity & 1, mode === 'display' ? 0 : 1, paper[0] | (paper[1] << 8) | (paper[2] << 16), 0]));\n const group = d.createBindGroup({\n layout: this.shadePipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 1, resource: { buffer: this.srcTiles } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 3, resource: { buffer: this.outTiles } },\n { binding: 4, resource: { buffer: this.shadeUni } },\n ],\n });\n const enc = d.createCommandEncoder();\n const pass = enc.beginComputePass();\n pass.setPipeline(this.shadePipe);\n pass.setBindGroup(0, group);\n pass.dispatchWorkgroups(16, 16, n);\n pass.end();\n enc.copyBufferToBuffer(this.outTiles, 0, this.outRead, 0, n * tileBytes);\n d.queue.submit([enc.finish()]);\n const read = this.outRead;\n await read.mapAsync(MAP_READ, 0, n * tileBytes);\n const all = new Uint8ClampedArray(read.getMappedRange(0, n * tileBytes).slice(0));\n read.unmap();\n const out: Uint8ClampedArray[] = [];\n for (let i = 0; i < n; i++) out.push(all.subarray(i * tileBytes, (i + 1) * tileBytes));\n return out;\n }\n\n /** Reads floats back from a slot (tests and diagnostics). */\n async readSlot(slot: number, offset: number, count: number): Promise<Float32Array> {\n const bytes = count * 4;\n const buf = this.device.createBuffer({ size: Math.ceil(bytes / 4) * 4, usage: MAP_READ | COPY_DST, label: 'wet read' });\n const enc = this.device.createCommandEncoder();\n enc.copyBufferToBuffer(this.state, (slot * SLOT_FLOATS + offset) * 4, buf, 0, bytes);\n this.device.queue.submit([enc.finish()]);\n await buf.mapAsync(MAP_READ, 0, bytes);\n const out = new Float32Array(buf.getMappedRange(0, bytes).slice(0));\n buf.unmap();\n buf.destroy();\n return out;\n }\n\n /** Waits for submitted work. */\n idle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const b of [this.state, this.params, this.jobs, this.flags, this.flagsRead, ...this.uni, this.shadeUni, this.srcTiles, this.outTiles, this.outRead]) b?.destroy();\n this.device.destroy();\n }\n}\n","/**\n * Pointer Events to stroke samples, for any host: pressure and tilt from pens, coalesced events\n * for the full pen rate, positions mapped to the host's coordinates (world units on an infinite\n * canvas) by a function it passes. Structurally typed: no DOM import.\n */\n\nimport type { PathSample } from './path-stroke';\n\n/** The Pointer Event fields read here. */\nexport interface PointerEventLike {\n clientX: number;\n clientY: number;\n pointerType?: string;\n pressure?: number;\n tiltX?: number;\n tiltY?: number;\n /** Radians (Pointer Events Level 3). */\n altitudeAngle?: number;\n azimuthAngle?: number;\n timeStamp?: number;\n getCoalescedEvents?: () => PointerEventLike[];\n}\n\n/** A stroke sample with the event time (milliseconds). */\nexport interface PointerStrokeSample extends PathSample {\n t?: number;\n}\n\n/**\n * Pressure of a pointer sample: pens report it; mice report 0.5 while pressed and pens 0 on\n * `pointerup`, both of which mean \"use full\".\n */\nexport function pointerPressure(e: Pick<PointerEventLike, 'pointerType' | 'pressure'>): number {\n if (e.pointerType === 'pen' && typeof e.pressure === 'number' && e.pressure > 0) return Math.min(1, e.pressure);\n return 1;\n}\n\n/** One pointer event as a stroke sample at `toPoint(clientX, clientY)`. Only pens carry tilt. */\nexport function pointerStrokeSample(e: PointerEventLike, toPoint: (clientX: number, clientY: number) => { x: number; y: number }): PointerStrokeSample {\n const p = toPoint(e.clientX, e.clientY);\n const s: PointerStrokeSample = { x: p.x, y: p.y, pressure: pointerPressure(e) };\n if (typeof e.timeStamp === 'number' && Number.isFinite(e.timeStamp)) s.t = e.timeStamp;\n if (e.pointerType === 'pen') {\n if (typeof e.altitudeAngle === 'number' && e.altitudeAngle < Math.PI / 2 - 1e-6) {\n s.altitude = e.altitudeAngle;\n s.azimuth = e.azimuthAngle ?? 0;\n } else if (e.tiltX || e.tiltY) {\n s.tiltX = e.tiltX ?? 0;\n s.tiltY = e.tiltY ?? 0;\n }\n }\n return s;\n}\n\n/**\n * The stroke samples of a `pointermove` (its coalesced events when the browser gives them, else\n * the event itself), mapped by `toPoint`. Feed them to a stroke in order.\n */\nexport function pointerStrokeSamples(e: PointerEventLike, toPoint: (clientX: number, clientY: number) => { x: number; y: number }): PointerStrokeSample[] {\n const events = e.getCoalescedEvents?.() ?? [];\n return (events.length ? events : [e]).map((ev) => pointerStrokeSample(ev, toPoint));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-F2Y4E4GU.cjs","../src/paint/pigment-tools.ts","../src/paint/wet/model.ts","../src/paint/wet/film.ts","../src/paint/wet/kernel.ts","../src/paint/wet/wasm.ts","../src/paint/wet/world.ts","../src/paint/wet/flow.ts","../src/paint/wet/medium.ts","../src/paint/wet/gpu-kernels.ts","../src/paint/wet/gpu.ts","../src/paint/pointer.ts"],"names":["rgb","OPP","S","off","scratch","adapter"],"mappings":"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,EAAA;AACb,IAAA;AACG,IAAA;AACA,IAAA;AACb,IAAA;AACc,IAAA;AACC,IAAA;AACH,IAAA;AACN,IAAA;AACE,IAAA;AACL,IAAA;AACT,EAAA;AAAA;AAGsB,EAAA;AACD,IAAA;AACrB,EAAA;AAEgB,EAAA;AACG,IAAA;AACG,IAAA;AACtB,EAAA;AACF;AVokFwB;AACA;AWr+FR;AACQ,EAAA;AACf,EAAA;AACT;AAGgB;AACM,EAAA;AACqB,EAAA;AAC5B,EAAA;AACS,EAAA;AACP,IAAA;AACI,MAAA;AACD,MAAA;AACH,IAAA;AACC,MAAA;AACA,MAAA;AACd,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAMgB;AACG,EAAA;AACF,EAAA;AACjB;AXg+FwB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-F2Y4E4GU.cjs","sourcesContent":[null,"import type { AgentTool } from '../tools/registry.js';\nimport { createPigment, mixPigments, type Pigment } from './pigment';\n\nconst HEX = /^#?([0-9a-f]{6})$/i;\n\nfunction parseHex(value: unknown, index: number): [number, number, number] {\n const m = typeof value === 'string' ? HEX.exec(value.trim()) : null;\n if (!m) throw new Error(`colors[${index}].color is ${JSON.stringify(value)}; use #rrggbb, e.g. \"#1e40af\".`);\n const n = parseInt(m[1], 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n}\n\nfunction toHex(rgb: readonly number[]): string {\n return '#' + rgb.map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Agent tools for pigment mixing (`@pixerate/editor/paint`). `mix_colors` is read-only: it\n * predicts what paints mixed in given amounts look like, for choosing a brush or fill colour.\n */\nexport function createPigmentTools(): AgentTool[] {\n const mixColors: AgentTool = {\n name: 'mix_colors',\n title: 'Mix colours like paint',\n description:\n 'Mixes colours as paint would (model pigment, the default: Kubelka-Munk mixing over reflectance spectra, so blue and yellow make green and white lightens a colour into a tint instead of greying it), or as light on screen (model rgb: the weighted RGB average). Changes nothing. Returns mixed (#rrggbb, by the chosen model), the other model\\'s result for comparison (rgbLerp and pigment), the normalised weights and the model.',\n inputSchema: {\n type: 'object',\n properties: {\n colors: {\n type: 'array',\n minItems: 1,\n maxItems: 16,\n description: 'The paints to mix (1 to 16).',\n items: {\n type: 'object',\n properties: {\n color: { type: 'string', description: 'Paint colour #rrggbb.' },\n weight: { type: 'number', minimum: 0, description: 'Parts of this paint, any scale (e.g. 1 and 3 for a 1:3 mix). At least one weight must be above 0.' },\n strength: {\n type: 'number',\n exclusiveMinimum: 0,\n maximum: 100,\n description: 'Tinting strength (default 1): each part counts as this many, so a strong dark paint (e.g. 4) tints a lot of white.',\n },\n },\n required: ['color', 'weight'],\n additionalProperties: false,\n },\n },\n model: {\n type: 'string',\n enum: ['pigment', 'rgb'],\n description: 'pigment (default): mix like paint (Kubelka-Munk), as the pigment blend mode, Mixer Brush and mixing pad do; rgb: average the RGB values, as normal blending and rgb mixing brushes do (strength is ignored).',\n },\n },\n required: ['colors'],\n additionalProperties: false,\n },\n annotations: { title: 'Mix colours like paint', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n handler: (args) => {\n const items = args.colors as { color: string; weight: number; strength?: number }[];\n const rgbs = items.map((item, i) => parseHex(item.color, i));\n const total = items.reduce((sum, item) => sum + item.weight, 0);\n if (!(total > 0)) throw new Error('Every weight is 0; give at least one colour a weight above 0.');\n const pigments: Pigment[] = rgbs.map((rgb, i) => createPigment(rgb, { strength: items[i].strength }));\n const mixed = mixPigments(pigments, items.map((item) => item.weight));\n const lerp = [0, 1, 2].map((c) => rgbs.reduce((sum, rgb, i) => sum + rgb[c] * items[i].weight, 0) / total);\n const rgb = args.model === 'rgb';\n return {\n mixed: toHex(rgb ? lerp : mixed),\n rgbLerp: toHex(lerp),\n pigment: toHex(mixed),\n weights: items.map((item) => item.weight / total),\n model: rgb ? 'rgb' : 'kubelka-munk',\n };\n },\n };\n return [mixColors];\n}\n","/**\n * The wet-media model: water and pigment on paper, simulated per cell on 256 px tiles.\n *\n * Written from the published literature only (no code, presets or textures from any product):\n *\n * - **Water** is a D2Q9 lattice Boltzmann fluid with BGK collision, τ = 3ν + ½ (any LBM text, e.g.\n * Krüger et al., *The Lattice Boltzmann Method*, 2017). Streaming uses partial bounce-back with a\n * blocking factor from the paper fibres, and the wet front is *pinned* until the water behind it\n * is deep enough: Chu & Tai, \"MoXi: Real-Time Ink Dispersion in Absorbent Paper\", SIGGRAPH 2005.\n * Tilt and flow maps are a velocity-shift force, with |u| capped at `U_MAX` cells per step.\n * - **Paper** soaks water up until it holds its capacity, and damp paper stops pinning the front\n * (wet-in-wet). Water evaporates faster in a band along the wet front (an \"edge\" field, 1 at the\n * front and fading over a few cells inwards, as Curtis et al. blur the wet-area mask), so water\n * flows out to the edge and carries pigment there: edge darkening.\n * - **Pigment** (Curtis et al., \"Computer-Generated Watercolor\", SIGGRAPH 1997) is suspended in the\n * water, advected with a first-order upwind finite-volume flux (it conserves pigment and never\n * goes negative while |u| ≤ ¼), spreads a little between wet cells (bleed), settles into the\n * paper (more in grain valleys: granulation; more at the wet edge: edge darkening), is lifted\n * back by water (more where water arrives: blooms), and settles completely where a cell dries.\n * - **Colour** is Kubelka-Munk: each cell carries pigment as absorption `K` per channel (linear\n * R, G, B) plus one scattering `S`, so mixes are exactly linear (two-constant KM, `K = Σ cᵢKᵢ`,\n * `S = Σ cᵢSᵢ`) and transparent washes multiply like glazes. A colour becomes `K` and `S` with the\n * same two-flux formulas as the shipped pigment model (`K/S = (1 − R)² / 2R`).\n *\n * `stepCellsTs` in `kernel.ts` is the specification of one step, in exact f32 arithmetic. The\n * WebAssembly SIMD kernel (`assembly/wet.ts`) is a lane-for-lane port of it and gives the same bits,\n * so the simulation is deterministic across browsers, kernels and worker counts.\n */\n\n/** Tile side in cells (the raster tile size). */\nexport const WET_TILE = 256;\n/** A tile slot's side: the tile plus a one-cell halo on each side. */\nexport const SLOT_SIDE = 258;\n/** Floats per plane of a slot. */\nexport const PLANE = SLOT_SIDE * SLOT_SIDE;\nexport const PLANE_BYTES = PLANE * 4;\n\n/** Planes in each ping-ponged set: f0..f8, depth, velocity, paper water, 4 pigment channels, edge. */\nexport const SET_PLANES = 18;\nexport const P_RHO = 9;\nexport const P_UX = 10;\nexport const P_UY = 11;\n/** Water held in the paper. */\nexport const P_SW = 12;\n/** Suspended pigment: K red, K green, K blue, S. */\nexport const P_P0 = 13;\n/** Edge: 1 at the wet front, fading over a few cells into the wet area (0 where dry). */\nexport const P_EDGE = 17;\n/** Single (not ping-ponged) planes, after the two sets. */\nexport const P_D0 = 2 * SET_PLANES; // 36..39: deposited pigment K r, g, b, S\nexport const P_H = P_D0 + 4; // 40: paper height (−1 marks the off-canvas halo)\nexport const P_FX = P_H + 1; // 41: flow map x\nexport const P_FY = P_H + 2; // 42: flow map y\nexport const SLOT_PLANES = P_FY + 1; // 43\nexport const SLOT_BYTES = SLOT_PLANES * PLANE_BYTES;\n/** Pigment channels per cell. */\nexport const PIGMENT_CHANNELS = 4;\n\n/** D2Q9 lattice velocities: 0 rest, 1–4 axis (E, S, W, N in screen space), 5–8 diagonals. */\nexport const EX = [0, 1, 0, -1, 0, 1, -1, -1, 1] as const;\nexport const EY = [0, 0, 1, 0, -1, 1, 1, -1, -1] as const;\nexport const OPP = [0, 3, 4, 1, 2, 7, 8, 5, 6] as const;\nexport const W9 = [4 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 36, 1 / 36, 1 / 36, 1 / 36] as const;\n\n/** Water shallower than this counts as dry. */\nexport const DRY_EPS = 1e-3;\n/** Fluid speed cap in cells per step: keeps the LBM low-Mach and the pigment flux CFL-stable. */\nexport const U_MAX = 0.25;\n/** A tile's wet cells within this many cells of an edge wake the neighbouring tile. */\nexport const STRIP = 64;\n/** Steps per batch at most: the wake-up strip stays ahead of anything that moves a cell a step. */\nexport const MAX_BATCH = 32;\n/** Dry tiles are baked and freed only on steps that are multiples of this (so it is deterministic). */\nexport const FREE_INTERVAL = 32;\n\n/** Per-tile flag bits a step returns. */\nexport const FLAG_ALIVE = 1; // some cell holds water (surface or paper)\nexport const FLAG_LEFT = 2;\nexport const FLAG_RIGHT = 4;\nexport const FLAG_TOP = 8;\nexport const FLAG_BOTTOM = 16;\nexport const FLAG_WET = 32; // some cell is wet (surface water at least DRY_EPS deep)\n\n/** f32 parameters per lane (one per wet layer). */\nexport const PARAM_FLOATS = 32;\n\n/** Index of each packed parameter (the kernels read these offsets). */\nexport const PARAM = {\n omega: 0,\n tau: 1,\n evap: 2,\n edgeEvap: 3, // times the edge field\n mobility: 4, // half the pigment mobility (the face flux uses the sum of two velocities)\n depRate: 5,\n pickup: 6,\n absorption: 7,\n invCap: 8,\n blockScale: 9,\n rough: 10,\n pinT: 11,\n gx: 12,\n gy: 13,\n flowK: 14,\n granulation: 15,\n edgeDep: 16, // times the edge field\n bloom: 17,\n paperEvap: 18,\n hasFlow: 19,\n bleed: 20,\n} as const;\n\n/**\n * A wet layer's settings, each 0..1 unless noted. The paper's absorption, permeability and\n * roughness come from the paper, not from here.\n */\nexport interface WetParams {\n /** How thick the water is: 0 runny (ink) .. 1 very thick (oil). Default 0.3 (watercolour). */\n viscosity: number;\n /** How fast the water dries: 0 never .. 1 very fast. Default 0.45. */\n evaporation: number;\n /** Darker, crisper edges where a wash dries: 0 none .. 1 strong. Default 0.5. */\n edgeDarkening: number;\n /** How heavy the pigment is: heavy pigment travels less and settles sooner. Default 0.3. */\n pigmentWeight: number;\n /** How much pigment collects in the paper's valleys. Default 0.4. */\n granulation: number;\n /** How readily water lifts settled pigment back up (re-wetting). Default 0.2. */\n pickup: number;\n /** How fast suspended pigment settles into the paper (staining). Default 0.2. */\n fixture: number;\n /** Blooms (backruns): water flowing into a drying wash pushes its pigment out. Default 0.4. */\n bloom: number;\n /** Colour bleed: pigment spreading between touching wet areas. Default 0.3. */\n bleed: number;\n}\n\nexport const DEFAULT_WET_PARAMS: Readonly<WetParams> = {\n viscosity: 0.3,\n evaporation: 0.45,\n edgeDarkening: 0.5,\n pigmentWeight: 0.3,\n granulation: 0.4,\n pickup: 0.2,\n fixture: 0.2,\n bloom: 0.4,\n bleed: 0.3,\n};\n\nexport const WET_PARAM_KEYS = Object.keys(DEFAULT_WET_PARAMS) as (keyof WetParams)[];\n\n/** The paper as wet media read it (all 0..1; from the paint editor's paper settings). */\nexport interface WetPaper {\n absorption: number;\n permeability: number;\n roughness: number;\n}\n\nexport const DEFAULT_WET_PAPER: Readonly<WetPaper> = { absorption: 0.7, permeability: 0.5, roughness: 0.6 };\n\n/** Canvas tilt (shared by every wet layer): water runs downhill. */\nexport interface WetTilt {\n /** Degrees from flat, 0 (flat) .. 90 (upright). */\n angle: number;\n /** Which way is downhill, degrees clockwise from canvas down (0 = towards the bottom edge). */\n direction: number;\n}\n\nexport const FLAT: Readonly<WetTilt> = { angle: 0, direction: 0 };\n\nconst unit = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : d);\n\n/** Settings with every field in range; missing fields come from `base`. */\nexport function normalizeWetParams(raw: Partial<WetParams> = {}, base: WetParams = DEFAULT_WET_PARAMS): WetParams {\n const out = {} as WetParams;\n for (const k of WET_PARAM_KEYS) out[k] = unit(raw[k], base[k]);\n return out;\n}\n\nexport function normalizeTilt(raw: Partial<WetTilt> = {}, base: WetTilt = FLAT): WetTilt {\n const angle = typeof raw.angle === 'number' && Number.isFinite(raw.angle) ? Math.min(90, Math.max(0, raw.angle)) : base.angle;\n let direction = typeof raw.direction === 'number' && Number.isFinite(raw.direction) ? raw.direction : base.direction;\n direction = ((direction % 360) + 360) % 360;\n return { angle, direction };\n}\n\n/** Kinematic viscosity (lattice units) for `viscosity` 0..1: 0.02 .. 1.5, exponential. */\nexport function latticeViscosity(v: number): number {\n return 0.02 * Math.pow(75, v);\n}\n\n/** Water a cell of paper holds when saturated, in depth units. */\nexport const PAPER_CAPACITY = 0.08;\n\n/** Largest tilt acceleration (cells per step²), at 90°. */\nexport const MAX_TILT_ACCEL = 0.025;\n\n/** Packs a lane's settings into the f32 block the kernels read. `flowStrength` 0 turns the flow map off. */\nexport function packWetParams(params: WetParams, paper: WetPaper, tilt: WetTilt, flowStrength: number, out = new Float32Array(PARAM_FLOATS)): Float32Array {\n const nu = latticeViscosity(params.viscosity);\n const tau = 3 * nu + 0.5;\n const g = MAX_TILT_ACCEL * Math.sin((tilt.angle * Math.PI) / 180);\n const dir = (tilt.direction * Math.PI) / 180;\n out.fill(0);\n out[PARAM.omega] = 1 / tau;\n out[PARAM.tau] = tau;\n out[PARAM.evap] = 1e-3 * params.evaporation * params.evaporation;\n out[PARAM.edgeEvap] = params.edgeDarkening * 12; // the edge band dries much faster, so water (and pigment) flows out to it\n out[PARAM.mobility] = 0.5 * (1 - 0.5 * params.pigmentWeight);\n out[PARAM.depRate] = 0.019 * params.fixture * (0.5 + params.pigmentWeight);\n out[PARAM.pickup] = 0.01 * params.pickup;\n out[PARAM.absorption] = 0.0015 * paper.absorption;\n out[PARAM.invCap] = 1 / PAPER_CAPACITY;\n out[PARAM.blockScale] = 0.05 * (1 - paper.permeability);\n out[PARAM.rough] = 0.15 * paper.roughness;\n out[PARAM.pinT] = 0.2;\n out[PARAM.gx] = -g * Math.sin(dir);\n out[PARAM.gy] = g * Math.cos(dir);\n out[PARAM.flowK] = flowStrength;\n out[PARAM.granulation] = 1.2 * params.granulation * paper.roughness;\n out[PARAM.edgeDep] = params.edgeDarkening * 3;\n out[PARAM.bloom] = 60 * params.bloom;\n out[PARAM.paperEvap] = 0.5e-3 * params.evaporation * params.evaporation;\n out[PARAM.hasFlow] = flowStrength !== 0 ? 1 : 0;\n out[PARAM.bleed] = 0.05 * params.bleed;\n return out;\n}\n\n/** Flag bits for a wet (or alive) cell at tile-local (lx, ly): which neighbours it wakes. */\nexport function edgeBits(lx: number, ly: number): number {\n let b = 0;\n if (lx < STRIP) b |= FLAG_LEFT;\n if (lx >= WET_TILE - STRIP) b |= FLAG_RIGHT;\n if (ly < STRIP) b |= FLAG_TOP;\n if (ly >= WET_TILE - STRIP) b |= FLAG_BOTTOM;\n return b;\n}\n","/**\n * How wet-layer pigment looks, and how it bakes into 8-bit pixels.\n *\n * A cell carries pigment as Kubelka-Munk absorption `K` per channel (linear R, G, B) and one\n * scattering `S`, in mass units where `PIGMENT_UNIT` of a colour's pigment is a full-strength wash.\n * Over what is below it (`below`, linear), the film reflects\n *\n * film = hide·R∞ + (1 − hide)·T·below, T = e^(−2K), hide = 1 − e^(−HIDE·S),\n * R∞ = 1 + K/S − √((K/S)² + 2·K/S) (the shipped pigment model's two-flux formula)\n *\n * so transparent washes (S ≈ 0) multiply like glazes and opaque paint (gouache, oil) hides.\n *\n * The bake is a pure function of the f32 state and the 8-bit pixels, computed with deterministic\n * maths only (`dexp`, `dlog`, `sqrt`, + − × ÷ in f64; never `Math.exp` / `Math.pow`, whose last\n * bits differ between JavaScript engines), so \"dry on save\" gives the same pixels everywhere.\n * The layer pixel is the film expressed as colour plus alpha over the paper colour (exact over the\n * paper, a normal-blend approximation over other layers), with alpha never below the pixel's own.\n */\n\n/** Pigment mass of a full-strength wash of a colour. */\nexport const PIGMENT_UNIT = 0.25;\n/** Hiding per unit of scattering. */\nexport const HIDE = 1.5;\n/** Scattering of fully opaque paint (`body` 1), per `PIGMENT_UNIT` of mass. */\nexport const BODY_SCATTER = 3;\n/** Smallest reflectance a colour maps to (so black has finite K). */\nconst R_MIN = 1e-3;\n\n// ---------------------------------------------------------------------------\n// Deterministic maths\n// ---------------------------------------------------------------------------\n\nconst f64 = new Float64Array(1);\nconst u32 = new Uint32Array(f64.buffer);\nconst LITTLE = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\nconst HI = LITTLE ? 1 : 0;\nconst LN2 = 0.6931471805599453;\n\n/** 2^k for an integer k in −1022..1023, built from its bits. */\nfunction pow2(k: number): number {\n u32[HI] = (k + 1023) << 20;\n u32[1 - HI] = 0;\n return f64[0];\n}\n\n/**\n * e^x with + − × ÷ only: x = k·ln2 + r with |r| ≤ ln2/2, then a degree-11 Taylor polynomial\n * (error below 1e-15). The same bits in every JavaScript engine.\n */\nexport function dexp(x: number): number {\n if (!(x > -700)) return x !== x ? x : 0;\n if (x > 700) return Infinity;\n const k = Math.round(x / LN2);\n const r = x - k * LN2;\n let p = 1 / 39916800;\n p = p * r + 1 / 3628800;\n p = p * r + 1 / 362880;\n p = p * r + 1 / 40320;\n p = p * r + 1 / 5040;\n p = p * r + 1 / 720;\n p = p * r + 1 / 120;\n p = p * r + 1 / 24;\n p = p * r + 1 / 6;\n p = p * r + 0.5;\n p = p * r + 1;\n p = p * r + 1;\n return p * pow2(k);\n}\n\n/** ln x for x > 0 with + − × ÷ only: x = m·2^e, ln m by the atanh series. */\nexport function dlog(x: number): number {\n if (!(x > 0)) return x === 0 ? -Infinity : NaN;\n f64[0] = x;\n let e = ((u32[HI] >>> 20) & 0x7ff) - 1023;\n if (e === -1023) {\n // subnormal: scale up first\n return dlog(x * 18014398509481984) - 54 * LN2;\n }\n u32[HI] = (u32[HI] & 0x800fffff) | (1023 << 20);\n let m = f64[0];\n if (m > 1.4142135623730951) {\n m /= 2;\n e += 1;\n }\n const s = (m - 1) / (m + 1);\n const s2 = s * s;\n let t = s2;\n let sum = 1;\n for (let i = 3; i < 40; i += 2) {\n sum += t / i;\n t *= s2;\n }\n return 2 * s * sum + e * LN2;\n}\n\n/** x^y for x ≥ 0, deterministically. */\nexport function dpow(x: number, y: number): number {\n if (x <= 0) return 0;\n return dexp(y * dlog(x));\n}\n\n// ---------------------------------------------------------------------------\n// sRGB tables (built with the deterministic maths)\n// ---------------------------------------------------------------------------\n\n/** sRGB byte → linear. */\nexport const SRGB_TO_LINEAR = new Float64Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n SRGB_TO_LINEAR[i] = v <= 0.04045 ? v / 12.92 : dpow((v + 0.055) / 1.055, 2.4);\n}\n\n/** sRGB value 0..255 (not necessarily whole) → linear, interpolating the byte table. */\nexport function srgbByteToLinear(v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 255) return 1;\n const i = Math.floor(v);\n return SRGB_TO_LINEAR[i] + (SRGB_TO_LINEAR[i + 1] - SRGB_TO_LINEAR[i]) * (v - i);\n}\n\n/** Entries of the linear → sRGB byte table. */\nconst ENC_STEPS = 16384;\nconst ENCODE = new Uint8Array(ENC_STEPS + 1);\nfor (let i = 0; i <= ENC_STEPS; i++) {\n const v = i / ENC_STEPS;\n const e = v <= 0.0031308 ? 12.92 * v : 1.055 * dpow(v, 1 / 2.4) - 0.055;\n ENCODE[i] = Math.min(255, Math.max(0, Math.round(e * 255)));\n}\n\n/** Linear 0..1 → sRGB byte (16384-step table). */\nexport function linearToSrgb8(v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 1) return 255;\n return ENCODE[Math.round(v * ENC_STEPS)];\n}\n\n// ---------------------------------------------------------------------------\n// Colour ↔ pigment\n// ---------------------------------------------------------------------------\n\n/**\n * The pigment (K r, g, b, S per unit of mass) of an sRGB colour (0..1) at `body` 0 (a transparent\n * watercolour: K = −ln R / 2 so a full wash over white shows the colour) .. 1 (opaque paint:\n * `K/S = (1 − R)² / 2R` at `BODY_SCATTER`).\n */\nexport function pigmentOf(rgb: readonly [number, number, number] | readonly number[], body: number, out: Float64Array | number[] = new Float64Array(4)): Float64Array | number[] {\n const b = Math.min(1, Math.max(0, body));\n const s = (b * BODY_SCATTER) / PIGMENT_UNIT;\n for (let c = 0; c < 3; c++) {\n const v = Math.min(255, Math.max(0, Math.round(rgb[c] * 255)));\n const r = Math.max(R_MIN, SRGB_TO_LINEAR[v]);\n const kt = -dlog(r) / 2 / PIGMENT_UNIT;\n const ko = ((1 - r) * (1 - r)) / (2 * r) * s;\n out[c] = (1 - b) * kt + b * ko;\n }\n out[3] = s;\n return out;\n}\n\n/** e^(−x) for x ≥ 0 from a table (1/256 steps, linear interpolation; relative error below 3e-6). */\nconst EXP_RES = 256;\nconst EXP_MAX = 24;\nconst EXP_TABLE = new Float64Array(EXP_MAX * EXP_RES + 2);\nfor (let i = 0; i < EXP_TABLE.length; i++) EXP_TABLE[i] = dexp(-i / EXP_RES);\n\n/** e^(−x) for x ≥ 0 (deterministic: a table built with `dexp`, interpolated with + − ×). */\nexport function expNeg(x: number): number {\n if (!(x > 0)) return 1;\n if (x >= EXP_MAX) return 0;\n const t = x * EXP_RES;\n const i = Math.floor(t);\n const fr = t - i;\n return EXP_TABLE[i] + (EXP_TABLE[i + 1] - EXP_TABLE[i]) * fr;\n}\n\n/** Linear reflectance of a film of pigment `k` (3) and `s` over `below` (linear) into `out`. */\nexport function filmReflectance(k0: number, k1: number, k2: number, s: number, b0: number, b1: number, b2: number, out: Float64Array | number[]): void {\n const hide = s > 0 ? 1 - expNeg(HIDE * s) : 0;\n const keep = 1 - hide;\n const inv = s > 1e-9 ? 1 / s : 0;\n out[0] = (hide > 0 ? hide * rinf(k0 * inv) : 0) + keep * expNeg(2 * k0) * b0;\n out[1] = (hide > 0 ? hide * rinf(k1 * inv) : 0) + keep * expNeg(2 * k1) * b1;\n out[2] = (hide > 0 ? hide * rinf(k2 * inv) : 0) + keep * expNeg(2 * k2) * b2;\n}\n\n/** Kubelka-Munk reflectance of an infinitely thick layer with absorption over scattering `ks`. */\nfunction rinf(ks: number): number {\n return 1 + ks - Math.sqrt(ks * ks + 2 * ks);\n}\n\n/** The sRGB colour (0..1) of pigment `k`, `s` over white: what a brush picking it up sees. */\nexport function pigmentColor(k0: number, k1: number, k2: number, s: number, out: number[] = [0, 0, 0]): number[] {\n const lin = [0, 0, 0];\n filmReflectance(k0, k1, k2, s, 1, 1, 1, lin);\n for (let c = 0; c < 3; c++) out[c] = linearToSrgb8(lin[c]) / 255;\n return out;\n}\n\nconst scratch = new Float64Array(3);\n\n/**\n * Bakes one pixel: pigment `k0..k2`, `s` laid over layer pixel `px[i..i+3]` (straight sRGB) on paper\n * `paper` (sRGB bytes). `wet` (0..1) darkens wet paper slightly (display only; 0 for a bake).\n * Writes the new layer pixel into `out[o..o+3]`.\n */\nexport function filmPixel(\n k0: number,\n k1: number,\n k2: number,\n s: number,\n px: ArrayLike<number>,\n i: number,\n paper: ArrayLike<number>,\n wet: number,\n out: Uint8ClampedArray,\n o: number\n): void {\n const pa = px[i + 3];\n if (!(k0 > 1e-7 || k1 > 1e-7 || k2 > 1e-7 || s > 1e-7) && wet <= 0) {\n out[o] = px[i];\n out[o + 1] = px[i + 1];\n out[o + 2] = px[i + 2];\n out[o + 3] = pa;\n return;\n }\n const a = pa / 255;\n const p0 = paper[0];\n const p1 = paper[1];\n const p2 = paper[2];\n // What is below the film: the pixel over the paper as the compositor blends it (encoded), then linear.\n const b0 = srgbByteToLinear(a * px[i] + (1 - a) * p0);\n const b1 = srgbByteToLinear(a * px[i + 1] + (1 - a) * p1);\n const b2 = srgbByteToLinear(a * px[i + 2] + (1 - a) * p2);\n filmReflectance(k0, k1, k2, s, b0, b1, b2, scratch);\n const dark = 1 - 0.07 * wet;\n // The film as an encoded colour, then as colour + alpha over the encoded paper colour.\n const e0 = linearToSrgb8(scratch[0] * dark);\n const e1 = linearToSrgb8(scratch[1] * dark);\n const e2 = linearToSrgb8(scratch[2] * dark);\n let alpha = a;\n alpha = needAlpha(e0, p0, alpha);\n alpha = needAlpha(e1, p1, alpha);\n alpha = needAlpha(e2, p2, alpha);\n if (alpha <= 0) {\n out[o] = px[i];\n out[o + 1] = px[i + 1];\n out[o + 2] = px[i + 2];\n out[o + 3] = 0;\n return;\n }\n const a8 = Math.max(Math.round(Math.min(1, alpha) * 255), pa);\n const al = a8 / 255;\n const inv = 1 / al;\n const k = 1 - al;\n out[o] = Math.round(Math.min(255, Math.max(0, (e0 - k * p0) * inv)));\n out[o + 1] = Math.round(Math.min(255, Math.max(0, (e1 - k * p1) * inv)));\n out[o + 2] = Math.round(Math.min(255, Math.max(0, (e2 - k * p2) * inv)));\n out[o + 3] = a8;\n}\n\n/** The alpha an encoded film value `e` needs over paper value `p` (bytes), at least `alpha`. */\nfunction needAlpha(e: number, p: number, alpha: number): number {\n if (e < p) return Math.max(alpha, 1 - e / p);\n if (e > p) return Math.max(alpha, (e - p) / (255 - p));\n return alpha;\n}\n\n/**\n * The pigment a layer pixel holds over the paper, as a transparent film (`K = −ln(below/paper)/2`,\n * `S` 0): what re-wetting lifts back into the water. Writes K r, g, b, S into `out`.\n */\nexport function pixelPigment(px: ArrayLike<number>, i: number, paper: ArrayLike<number>, out: Float64Array | number[]): void {\n const a = px[i + 3] / 255;\n for (let c = 0; c < 3; c++) {\n const p = Math.max(R_MIN, SRGB_TO_LINEAR[paper[c]]);\n const below = Math.max(R_MIN, srgbByteToLinear(a * px[i + c] + (1 - a) * paper[c]));\n out[c] = below < p ? -dlog(below / p) / 2 : 0;\n }\n out[3] = 0;\n}\n\n/**\n * `filmPixel` over a whole tile, specialised for speed (same results, pixel for pixel). Reads the\n * slot's planes from `f`: settled pigment at `d` (4 planes, `plane` floats apart), suspended pigment\n * at `p` (or −1 to leave it out), surface and paper water at `rho` / `sw` (or −1: no wet darkening).\n * Cell (x, y) of the tile is at offset `(y + 1)·side + x + 1` of each plane. `src` is the base tile\n * (or `null` for transparent); writes `out` (a copy of `src` where nothing changes). Returns\n * whether any pixel was shaded.\n */\nexport function shadeTile(\n f: Float32Array,\n plane: number,\n side: number,\n d: number,\n p: number,\n rho: number,\n sw: number,\n src: Uint8ClampedArray | null,\n out: Uint8ClampedArray,\n w: number,\n h: number,\n paper: Uint8Array\n): boolean {\n const p0 = paper[0];\n const p1 = paper[1];\n const p2 = paper[2];\n const lp0 = SRGB_TO_LINEAR[p0];\n const lp1 = SRGB_TO_LINEAR[p1];\n const lp2 = SRGB_TO_LINEAR[p2];\n const tab = EXP_TABLE;\n const enc = ENCODE;\n let any = false;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const c = (y + 1) * side + x + 1;\n let k0 = f[d + c];\n let k1 = f[d + plane + c];\n let k2 = f[d + 2 * plane + c];\n let s = f[d + 3 * plane + c];\n if (p >= 0) {\n k0 += f[p + c];\n k1 += f[p + plane + c];\n k2 += f[p + 2 * plane + c];\n s += f[p + 3 * plane + c];\n }\n let wet = 0;\n if (rho >= 0) {\n wet = f[rho + c] * 4 + f[sw + c];\n if (wet > 1) wet = 1;\n }\n if (!(k0 > 1e-7 || k1 > 1e-7 || k2 > 1e-7 || s > 1e-7) && wet <= 0) continue;\n any = true;\n const i = (y * 256 + x) * 4;\n const pa = src ? src[i + 3] : 0;\n const a = pa / 255;\n const na = 1 - a;\n const b0 = src ? srgbByteToLinear(a * src[i] + na * p0) : lp0;\n const b1 = src ? srgbByteToLinear(a * src[i + 1] + na * p1) : lp1;\n const b2 = src ? srgbByteToLinear(a * src[i + 2] + na * p2) : lp2;\n // filmReflectance, inlined\n let hide = 0;\n let x0: number;\n if (s > 0) {\n x0 = HIDE * s;\n hide = 1 - (x0 >= EXP_MAX ? 0 : interp(tab, x0 * EXP_RES));\n }\n const keep = 1 - hide;\n const inv = s > 1e-9 ? 1 / s : 0;\n let r0 = keep * expT(tab, 2 * k0) * b0;\n let r1 = keep * expT(tab, 2 * k1) * b1;\n let r2 = keep * expT(tab, 2 * k2) * b2;\n if (hide > 0) {\n r0 += hide * rinf(k0 * inv);\n r1 += hide * rinf(k1 * inv);\n r2 += hide * rinf(k2 * inv);\n }\n const dark = 1 - 0.07 * wet;\n const e0 = encode(enc, r0 * dark);\n const e1 = encode(enc, r1 * dark);\n const e2 = encode(enc, r2 * dark);\n let alpha = a;\n alpha = needAlpha(e0, p0, alpha);\n alpha = needAlpha(e1, p1, alpha);\n alpha = needAlpha(e2, p2, alpha);\n if (alpha <= 0) {\n out[i + 3] = 0;\n continue;\n }\n const a8 = Math.max(Math.round(Math.min(1, alpha) * 255), pa);\n const al = a8 / 255;\n const ia = 1 / al;\n const k = 1 - al;\n out[i] = Math.round(Math.min(255, Math.max(0, (e0 - k * p0) * ia)));\n out[i + 1] = Math.round(Math.min(255, Math.max(0, (e1 - k * p1) * ia)));\n out[i + 2] = Math.round(Math.min(255, Math.max(0, (e2 - k * p2) * ia)));\n out[i + 3] = a8;\n }\n }\n return any;\n}\n\nfunction interp(tab: Float64Array, t: number): number {\n const i = Math.floor(t);\n return tab[i] + (tab[i + 1] - tab[i]) * (t - i);\n}\n\nfunction expT(tab: Float64Array, x: number): number {\n if (!(x > 0)) return 1;\n if (x >= EXP_MAX) return 0;\n return interp(tab, x * EXP_RES);\n}\n\nfunction encode(enc: Uint8Array, v: number): number {\n if (!(v > 0)) return 0;\n if (v >= 1) return 255;\n return enc[Math.round(v * ENC_STEPS)];\n}\n","/**\n * One wet-media step for the 256 × 256 interior of a tile slot, in plain TypeScript: the\n * specification of the model. Every intermediate is rounded to f32 (`F`) in the same order as the\n * WebAssembly SIMD kernel (`assembly/wet.ts`), so the two give identical bits: computing an f32\n * `+ − × ÷ √` in f64 and rounding once is exactly the f32 operation. Keep the two in step; the\n * kernel test compares them bit for bit.\n *\n * A slot is `SLOT_PLANES` planes of 258 × 258 f32 (the tile plus a one-cell halo, filled from the\n * neighbouring slots after each step). The step reads set `parity` (and the single planes) and\n * writes the interior of the other set, the deposit planes in place, and returns the tile's flags.\n *\n * Per cell x:\n * 1. Streaming with partial bounce-back: for each direction i, the source is n = x − eᵢ and the\n * blocking is b = max(κ(x), κ(n)), κ = blockScale·h. b = 1 off the canvas (h < 0) and where the\n * front is pinned: one side dry and the other shallower than the pin threshold\n * (pinT + rough·h)·(1 − paperWater/capacity) of the dry side, so damp paper does not pin.\n * Off-canvas cells (h < 0, in the halo or past a canvas edge inside a tile) only bounce back.\n * Symmetric in x and n, so water is conserved: fᵢ(x) = (1 − b)·f*ᵢ(n) + b·f*ₒₚₚ₍ᵢ₎(x).\n * 2. Depth and velocity; tilt plus the flow map shift the velocity (u += τ·g), capped at U_MAX.\n * 3. Absorption into the paper until it holds its capacity, and evaporation (faster in the edge\n * band); the collided populations are scaled by the depth ratio.\n * 4. BGK collision towards the D2Q9 equilibrium.\n * 5. Pigment (4 channels): upwind flux through the 4 faces with the previous step's velocities,\n * plus bleed (diffusion) between wet cells; never below 0.\n * 6. Deposition (more in valleys and in the edge band) and pickup (more where water arrives);\n * where a cell dries, all its suspended pigment settles.\n * 7. The edge field: max(dry neighbours / 4, 0.99 × the mean of the 4 neighbours' edge), at most\n * 1, and 0 where the cell is dry.\n */\n\nimport {\n DRY_EPS,\n FLAG_ALIVE,\n FLAG_WET,\n P_D0,\n P_EDGE,\n P_FX,\n P_FY,\n P_H,\n P_P0,\n P_RHO,\n P_SW,\n P_UX,\n P_UY,\n PARAM,\n PLANE,\n SET_PLANES,\n SLOT_SIDE,\n U_MAX,\n edgeBits,\n} from './model';\n\nconst F = Math.fround;\nconst S = SLOT_SIDE;\nconst EPS = F(DRY_EPS);\nconst UMAX2 = F(U_MAX * U_MAX);\nconst UMAXF = F(U_MAX);\nconst W0 = F(4 / 9);\nconst W1 = F(1 / 9);\nconst W2 = F(1 / 36);\nconst TINY = F(1e-9);\n/** The edge field's fall-off per cell (an f32 constant, as in the SIMD kernel). */\nconst DECAY = F(0.99);\n\n/** Neighbour n = x − eₖ as a float offset, k = 1..8 (the order of `EX` / `EY`). */\nconst NB = [0, -1, -S, 1, S, -S - 1, -S + 1, S + 1, S - 1];\nconst OPP = [0, 3, 4, 1, 2, 7, 8, 5, 6];\n\nconst fin = new Float32Array(9);\nconst pNew = new Float32Array(4);\n\n/**\n * Steps one slot. `f` views the whole memory; `base` is the slot's first float; `prm` is the\n * lane's packed parameters (`packWetParams`). Returns the tile's flag bits.\n */\nexport function stepSlotTs(f: Float32Array, base: number, parity: number, prm: Float32Array): number {\n const src = base + parity * SET_PLANES * PLANE;\n const dst = base + (1 - parity) * SET_PLANES * PLANE;\n const hP = base + P_H * PLANE;\n const dP = base + P_D0 * PLANE;\n const rhoS = src + P_RHO * PLANE;\n const uxS = src + P_UX * PLANE;\n const uyS = src + P_UY * PLANE;\n const swS = src + P_SW * PLANE;\n const pS = src + P_P0 * PLANE;\n const eS = src + P_EDGE * PLANE;\n\n const omega = prm[PARAM.omega];\n const tau = prm[PARAM.tau];\n const evap = prm[PARAM.evap];\n const edgeEvap = prm[PARAM.edgeEvap];\n const mobility = prm[PARAM.mobility];\n const depRate = prm[PARAM.depRate];\n const pickup = prm[PARAM.pickup];\n const absorption = prm[PARAM.absorption];\n const invCap = prm[PARAM.invCap];\n const blockScale = prm[PARAM.blockScale];\n const rough = prm[PARAM.rough];\n const pinT = prm[PARAM.pinT];\n const gx0 = prm[PARAM.gx];\n const gy0 = prm[PARAM.gy];\n const flowK = prm[PARAM.flowK];\n const gran = prm[PARAM.granulation];\n const edgeDep = prm[PARAM.edgeDep];\n const bloom = prm[PARAM.bloom];\n const paperEvap = prm[PARAM.paperEvap];\n const hasFlow = prm[PARAM.hasFlow] !== 0;\n const bleed = prm[PARAM.bleed];\n\n let flags = 0;\n for (let y = 1; y <= 256; y++) {\n for (let x = 1; x <= 256; x++) {\n const c = y * S + x;\n const hx = f[hP + c];\n const kx = F(blockScale * hx);\n const rx = f[rhoS + c];\n const sx = f[swS + c];\n const damp = Math.max(0, F(1 - F(sx * invCap)));\n const pinX = F(F(pinT + F(rough * hx)) * damp);\n const rxDry = rx < EPS;\n const xWall = hx < 0;\n\n // 1. streaming with partial bounce-back and pinning\n fin[0] = f[src + c];\n let dryNb = 0;\n for (let k = 1; k <= 8; k++) {\n const n = c + NB[k];\n const hn = f[hP + n];\n const rn = f[rhoS + n];\n const sn = f[swS + n];\n const wall = hn < 0;\n const rnDry = rn < EPS;\n // dry neighbours count for the edge as far as their paper is dry too (damp paper is no edge)\n const dampN = Math.max(0, F(1 - F(sn * invCap)));\n if (rnDry && !wall) dryNb = F(dryNb + dampN);\n let b = Math.max(kx, F(blockScale * hn));\n const pinN = F(F(pinT + F(rough * hn)) * dampN);\n if (wall || xWall || (rxDry && rn < pinX) || (rnDry && rx < pinN)) b = 1;\n fin[k] = F(F(F(1 - b) * f[src + k * PLANE + n]) + F(b * f[src + OPP[k] * PLANE + c]));\n }\n\n // 2. depth, velocity, forcing\n const rho = F(F(F(F(F(F(F(F(fin[0] + fin[1]) + fin[2]) + fin[3]) + fin[4]) + fin[5]) + fin[6]) + fin[7]) + fin[8]);\n const mx = F(F(F(F(F(fin[1] - fin[3]) + fin[5]) - fin[6]) - fin[7]) + fin[8]);\n const my = F(F(F(F(F(fin[2] - fin[4]) + fin[5]) + fin[6]) - fin[7]) - fin[8]);\n let gx = gx0;\n let gy = gy0;\n if (hasFlow) {\n gx = F(gx + F(flowK * f[base + P_FX * PLANE + c]));\n gy = F(gy + F(flowK * f[base + P_FY * PLANE + c]));\n }\n let ux = 0;\n let uy = 0;\n if (rho > EPS) {\n ux = F(F(mx / rho) + F(tau * gx));\n uy = F(F(my / rho) + F(tau * gy));\n }\n const sp2 = F(F(ux * ux) + F(uy * uy));\n if (sp2 > UMAX2) {\n const sc = F(UMAXF / F(Math.sqrt(sp2)));\n ux = F(ux * sc);\n uy = F(uy * sc);\n }\n\n // 3. absorption and evaporation\n const absorbed = Math.min(rho, F(F(F(absorption * F(1 - F(0.5 * hx))) * rho) * damp));\n const ex = f[eS + c];\n const ev = rho > 0 ? F(evap * F(1 + F(edgeEvap * ex))) : 0;\n const rhoNew = Math.max(0, F(F(rho - absorbed) - ev));\n const scale = rho > TINY ? F(rhoNew / rho) : 0;\n const sNew = Math.max(0, F(F(sx + absorbed) - (sx > 0 ? paperEvap : 0)));\n f[dst + P_SW * PLANE + c] = sNew;\n\n // 4. collision, then scale\n const usq = F(1.5 * F(F(ux * ux) + F(uy * uy)));\n const wr0 = F(W0 * rho);\n const wr1 = F(W1 * rho);\n const wr2 = F(W2 * rho);\n let feq = F(wr0 * F(1 - usq));\n f[dst + c] = F(F(fin[0] + F(omega * F(feq - fin[0]))) * scale);\n for (let k = 1; k <= 8; k++) {\n let eu: number;\n let wr = wr1;\n switch (k) {\n case 1: eu = ux; break;\n case 2: eu = uy; break;\n case 3: eu = -ux; break;\n case 4: eu = -uy; break;\n case 5: eu = F(ux + uy); wr = wr2; break;\n case 6: eu = F(uy - ux); wr = wr2; break;\n case 7: eu = -F(ux + uy); wr = wr2; break;\n default: eu = F(ux - uy); wr = wr2; break;\n }\n feq = F(wr * F(F(F(1 + F(3 * eu)) + F(F(4.5 * eu) * eu)) - usq));\n f[dst + k * PLANE + c] = F(F(fin[k] + F(omega * F(feq - fin[k]))) * scale);\n }\n\n // 5. pigment: upwind advection with the last step's velocities, plus bleed\n const rxWet = !rxDry;\n const uxc = f[uxS + c];\n const uyc = f[uyS + c];\n for (let q = 0; q < 4; q++) pNew[q] = f[pS + q * PLANE + c];\n // east, west, south (y + 1), north (y − 1)\n for (let face = 0; face < 4; face++) {\n const nb = c + (face === 0 ? 1 : face === 1 ? -1 : face === 2 ? S : -S);\n const open = rxWet && f[rhoS + nb] >= EPS;\n const uf = face === 0 ? F(mobility * F(uxc + f[uxS + nb])) : face === 1 ? F(mobility * F(f[uxS + nb] + uxc)) : face === 2 ? F(mobility * F(uyc + f[uyS + nb])) : F(mobility * F(f[uyS + nb] + uyc));\n const out = face === 0 || face === 2;\n for (let q = 0; q < 4; q++) {\n const pc = f[pS + q * PLANE + c];\n const pn = f[pS + q * PLANE + nb];\n // outgoing faces (east, south): flux = uf > 0 ? uf·pc : uf·pn, subtracted;\n // incoming faces (west, north): flux = uf > 0 ? uf·pn : uf·pc, added.\n const flux = out ? (uf > 0 ? F(uf * pc) : F(uf * pn)) : uf > 0 ? F(uf * pn) : F(uf * pc);\n const diff = F(bleed * F(pn - pc));\n const v = out ? F(F(pNew[q] - flux) + diff) : F(F(pNew[q] + flux) + diff);\n pNew[q] = open ? v : pNew[q];\n }\n }\n\n // 6. deposition and pickup\n const dryNow = rhoNew < EPS;\n const rate = F(F(depRate * F(1 + F(gran * F(1 - hx)))) * F(1 + F(edgeDep * ex)));\n const lift = dryNow ? 0 : F(F(pickup * Math.min(rhoNew, 1)) * F(1 + F(bloom * Math.max(0, F(rhoNew - rx)))));\n for (let q = 0; q < 4; q++) {\n const pq = Math.max(0, pNew[q]);\n const dq = f[dP + q * PLANE + c];\n const dep = dryNow ? pq : Math.min(pq, F(pq * rate));\n const lq = F(dq * lift);\n f[dst + (P_P0 + q) * PLANE + c] = F(F(pq - dep) + lq);\n f[dP + q * PLANE + c] = F(F(dq + dep) - lq);\n }\n // the edge field: 1 next to dry paper, spreading inwards at 0.99 per cell; 0 where dry\n const mean4 = F(F(F(F(f[eS + c + 1] + f[eS + c - 1]) + f[eS + c + S]) + f[eS + c - S]) * 0.25);\n const eNew = Math.min(1, Math.max(Math.min(1, F(dryNb * 0.25)), F(DECAY * mean4)));\n f[dst + P_EDGE * PLANE + c] = dryNow ? 0 : eNew;\n f[dst + P_RHO * PLANE + c] = rhoNew;\n f[dst + P_UX * PLANE + c] = dryNow ? 0 : ux;\n f[dst + P_UY * PLANE + c] = dryNow ? 0 : uy;\n const alive = rhoNew > 0 || sNew > 0;\n if (alive) flags |= FLAG_ALIVE | edgeBits(x - 1, y - 1);\n if (!dryNow) flags |= FLAG_WET;\n }\n }\n return flags;\n}\n","/**\n * Loading the wet-media WebAssembly kernel and its Web Workers.\n *\n * - The kernel is two small modules (shared memory for workers, ordinary memory for one thread),\n * embedded base64 in `kernel-wasm.ts`, which is only ever imported dynamically, so bundlers split\n * it into its own chunk and nothing loads until the first wet stroke.\n * - Workers run from a Blob URL of `wetWorkerMain`'s source: no extra file for the host to serve\n * and no bundler configuration. They share one `WebAssembly.Memory`, which needs\n * `SharedArrayBuffer`, which browsers only give cross-origin isolated pages (COOP `same-origin`\n * plus COEP `require-corp` or `credentialless`). Without it the kernel runs on one thread.\n * - Everything here is optional: without WebAssembly SIMD the TypeScript kernel runs, with the same\n * results (only slower).\n */\n\n/** What the wet engine can use here, and why not when it cannot. */\nexport interface WetSupport {\n /** WebAssembly with SIMD. */\n simd: boolean;\n /** `SharedArrayBuffer` and shared wasm memory (cross-origin isolation in browsers). */\n sharedMemory: boolean;\n /** Web Workers. */\n workers: boolean;\n /** Logical cores reported (`navigator.hardwareConcurrency`, 1 when unknown). */\n cores: number;\n /** A sentence for the user when wet paint will run slower than it could, else `null`. */\n message: string | null;\n}\n\nlet modules: { shared?: Promise<WebAssembly.Module>; single?: Promise<WebAssembly.Module> } = {};\n\nfunction decode(base64: string): Uint8Array {\n const g = globalThis as { atob?: (s: string) => string; Buffer?: { from(s: string, e: string): Uint8Array } };\n if (g.Buffer) return new Uint8Array(g.Buffer.from(base64, 'base64'));\n const bin = g.atob!(base64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** Compiles the kernel (`shared`: the shared-memory variant). Cached; loads the chunk once. */\nexport function loadWetKernel(shared: boolean): Promise<WebAssembly.Module> {\n const key = shared ? 'shared' : 'single';\n let p = modules[key];\n if (!p) {\n p = import('./kernel-wasm').then((m) => WebAssembly.compile(decode(shared ? m.WET_KERNEL_SHARED : m.WET_KERNEL_SINGLE) as BufferSource));\n p.catch(() => {\n modules = { ...modules, [key]: undefined };\n });\n modules[key] = p;\n }\n return p;\n}\n\n/** Whether shared wasm memory can be made here. */\nexport function canShareMemory(): boolean {\n const g = globalThis as { SharedArrayBuffer?: unknown; crossOriginIsolated?: boolean };\n if (typeof g.SharedArrayBuffer !== 'function') return false;\n if (g.crossOriginIsolated === false) return false;\n try {\n new WebAssembly.Memory({ initial: 1, maximum: 1, shared: true });\n return true;\n } catch {\n return false;\n }\n}\n\nlet simdCache: boolean | null = null;\n\n/** Whether this runtime validates WebAssembly SIMD (checked against the kernel itself). */\nexport async function wetSimdSupported(): Promise<boolean> {\n if (simdCache !== null) return simdCache;\n if (typeof WebAssembly === 'undefined') return (simdCache = false);\n try {\n await loadWetKernel(false);\n simdCache = true;\n } catch {\n simdCache = false;\n }\n return simdCache;\n}\n\n/** What the wet engine can use (SIMD is only known after `wetSimdSupported`). */\nexport function wetSupport(simd = simdCache ?? typeof WebAssembly !== 'undefined'): WetSupport {\n const g = globalThis as { Worker?: unknown; navigator?: { hardwareConcurrency?: number } };\n const sharedMemory = canShareMemory();\n const workers = typeof g.Worker === 'function' && typeof Blob === 'function' && typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function';\n const cores = Math.max(1, Math.floor(g.navigator?.hardwareConcurrency ?? 1));\n let message: string | null = null;\n if (!simd) message = 'This browser has no WebAssembly SIMD, so wet paint runs in plain JavaScript: it flows much more slowly (the results are the same).';\n else if (workers && !sharedMemory)\n message =\n 'Wet paint runs on one thread because this page is not cross-origin isolated, so it flows more slowly. Serve the page with \"Cross-Origin-Opener-Policy: same-origin\" and \"Cross-Origin-Embedder-Policy: require-corp\" (or \"credentialless\") to use every core.';\n return { simd, sharedMemory, workers, cores, message };\n}\n\n/**\n * The worker's whole program. It is turned into source with `toString()`, so it must not use\n * anything from outside its own body: every constant arrives in the `init` message.\n */\nfunction wetWorkerMain(): void {\n type Exports = {\n step: (base: number, parity: number, prm: number) => number;\n halo: (table: number, slots: number, key: number, perLane: number, tilesX: number, tilesY: number, set: number) => void;\n };\n type Layout = { ctl: number; params: number; table: number; list: number; flags: number; last: number; slots: number; slotBytes: number; perLane: number; tilesX: number; tilesY: number; keys: number };\n const scope = self as unknown as { onmessage: ((e: MessageEvent) => void) | null; postMessage(m: unknown): void };\n let exports: Exports | null = null;\n let memory: WebAssembly.Memory | null = null;\n let L: Layout | null = null;\n let id = 0;\n\n function barrier(ctl: Int32Array, n: number): void {\n const gen = Atomics.load(ctl, 1);\n if (Atomics.add(ctl, 0, 1) === n - 1) {\n Atomics.store(ctl, 0, 0);\n Atomics.add(ctl, 1, 1);\n Atomics.notify(ctl, 1);\n } else {\n while (Atomics.load(ctl, 1) === gen) Atomics.wait(ctl, 1, gen);\n }\n }\n\n function run(steps: number, n: number): void {\n const ex = exports!;\n const l = L!;\n const buf = memory!.buffer;\n const ctl = new Int32Array(buf, l.ctl, 16);\n const table = new Int32Array(buf, l.table, l.keys);\n const list = new Int32Array(buf, l.list, l.keys);\n const flags = new Uint32Array(buf, l.flags, l.keys);\n const last = new Uint32Array(buf, l.last, l.keys);\n const count = ctl[4];\n let parity = ctl[5];\n for (let s = 0; s < steps; s++) {\n for (;;) {\n const a = Atomics.add(ctl, 2, 1);\n if (a >= count) break;\n const key = list[a];\n const lane = (key / l.perLane) | 0;\n const f = ex.step(l.slots + table[key] * l.slotBytes, parity, l.params + lane * 128);\n flags[key] |= f;\n last[key] = f;\n }\n if (id === 0) Atomics.store(ctl, 3, 0);\n barrier(ctl, n);\n for (;;) {\n const a = Atomics.add(ctl, 3, 1);\n if (a >= count) break;\n ex.halo(l.table, l.slots, list[a], l.perLane, l.tilesX, l.tilesY, 1 - parity);\n }\n if (id === 0) Atomics.store(ctl, 2, 0);\n barrier(ctl, n);\n parity = 1 - parity;\n }\n }\n\n scope.onmessage = (e: MessageEvent) => {\n const m = e.data as { type: string; module?: WebAssembly.Module; memory?: WebAssembly.Memory; layout?: Layout; id?: number; steps?: number; workers?: number };\n if (m.type === 'init') {\n memory = m.memory!;\n L = m.layout!;\n id = m.id!;\n WebAssembly.instantiate(m.module!, { env: { memory } }).then(\n (inst) => {\n exports = inst.exports as unknown as Exports;\n scope.postMessage({ type: 'ready', id });\n },\n (err: unknown) => scope.postMessage({ type: 'error', id, message: String(err) })\n );\n } else if (m.type === 'layout') {\n L = m.layout!;\n } else if (m.type === 'run') {\n try {\n run(m.steps!, m.workers!);\n scope.postMessage({ type: 'done', id });\n } catch (err) {\n scope.postMessage({ type: 'error', id, message: String(err) });\n }\n }\n };\n}\n\n/** The layout numbers a worker needs. */\nexport interface WetWorkerLayout {\n ctl: number;\n params: number;\n table: number;\n list: number;\n flags: number;\n last: number;\n slots: number;\n slotBytes: number;\n perLane: number;\n tilesX: number;\n tilesY: number;\n keys: number;\n}\n\n/** A pool of workers stepping one shared memory together. */\nexport class WetWorkerPool {\n private constructor(\n private readonly workers: Worker[],\n private readonly url: string\n ) {}\n\n get size(): number {\n return this.workers.length;\n }\n\n /** Starts `count` workers on `memory` (shared) with the shared kernel. Rejects if any fails. */\n static async create(count: number, module: WebAssembly.Module, memory: WebAssembly.Memory, layout: WetWorkerLayout): Promise<WetWorkerPool> {\n const source = `(${wetWorkerMain.toString()})();`;\n const url = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n const workers: Worker[] = [];\n try {\n const ready: Promise<void>[] = [];\n for (let i = 0; i < count; i++) {\n const w = new Worker(url);\n workers.push(w);\n ready.push(\n new Promise<void>((resolve, reject) => {\n w.onmessage = (e: MessageEvent) => {\n if (e.data?.type === 'ready') resolve();\n else if (e.data?.type === 'error') reject(new Error(e.data.message));\n };\n w.onerror = (e) => reject(new Error(e.message || 'The wet-media worker failed to start.'));\n })\n );\n w.postMessage({ type: 'init', module, memory, layout, id: i });\n }\n await Promise.all(ready);\n } catch (e) {\n for (const w of workers) w.terminate();\n URL.revokeObjectURL(url);\n throw e;\n }\n return new WetWorkerPool(workers, url);\n }\n\n /** Runs `steps` steps over the active list in shared memory; resolves when every worker is done. */\n run(steps: number): Promise<void> {\n const n = this.workers.length;\n return Promise.all(\n this.workers.map(\n (w, i) =>\n new Promise<void>((resolve, reject) => {\n w.onmessage = (e: MessageEvent) => {\n if (e.data?.type === 'done') resolve();\n else if (e.data?.type === 'error') reject(new Error(e.data.message));\n };\n w.postMessage({ type: 'run', steps, workers: n, id: i });\n })\n )\n ).then(() => undefined);\n }\n\n destroy(): void {\n for (const w of this.workers) w.terminate();\n URL.revokeObjectURL(this.url);\n }\n}\n","/**\n * `WetWorld`: the wet-media simulation of one canvas. It holds up to `MAX_WET_LANES` wet layers\n * (\"lanes\"), each a sparse set of 256 px tile slots in one `WebAssembly.Memory`, and steps all of\n * them together.\n *\n * - **Kernels.** It starts on the TypeScript kernel at once and switches to the WebAssembly SIMD\n * kernel (in Web Workers when the page is cross-origin isolated, else on this thread) as soon as\n * that has loaded. The kernels give identical bits, so the switch never changes the painting.\n * - **Determinism.** Time is counted in steps (`clock`), never in wall time. Batches never cross a\n * multiple of `FREE_INTERVAL` and are at most `MAX_BATCH` steps, tiles wake up when anything\n * alive comes within `STRIP` cells of their edge (so earlier or later wake-ups change nothing),\n * and dry tiles are baked and freed only on multiples of `FREE_INTERVAL`, judged by their state\n * at that step. So the result depends only on the edits and the steps at which they were made,\n * not on frame rate, batch sizes, worker counts or the browser.\n * - **Edits** (dabs, water, drying, blowing, blending, smudging, blotting, re-wetting) run on this\n * thread between batches; while a batch runs (`busy`) they throw, so callers queue them.\n * - **Display.** Each lane has a `base` surface: the layer's pixels under the wet paint. `display`\n * gives the base with every live tile shaded (`filmPixel`), as an ordinary RGBA surface for the\n * compositor. Tiles that dry are baked into the base and their slots freed.\n * - **Engine B (WebGPU).** With a GPU engine attached (`attachGpu`) and at least `gpuMinTiles` live\n * tiles, the GPU keeps a mirror of the slots: each edit uploads the rows it changed, each batch\n * runs on the GPU too, and `displayGpu` shades every stale tile there at once. In lead mode\n * (between strokes) the GPU steps a batch frame by frame while the CPU computes it (`gpuLead`).\n * The CPU state stays the authority (edits, reads, drying, snapshots, baking); the GPU's copy\n * only feeds the display.\n */\n\nimport { TILE, TiledSurface, finishTile, tileKey, type RasterRect, type Tile } from '../../raster/surface';\nimport { filmPixel, pixelPigment, shadeTile } from './film';\nimport { stepSlotTs } from './kernel';\nimport {\n DEFAULT_WET_PAPER,\n DEFAULT_WET_PARAMS,\n DRY_EPS,\n EX,\n EY,\n FLAG_ALIVE,\n FLAG_BOTTOM,\n FLAG_LEFT,\n FLAG_RIGHT,\n FLAG_TOP,\n FLAT,\n FREE_INTERVAL,\n MAX_BATCH,\n P_D0,\n P_FX,\n P_FY,\n P_H,\n P_P0,\n P_RHO,\n P_SW,\n P_UX,\n P_UY,\n PARAM_FLOATS,\n PLANE,\n SET_PLANES,\n SLOT_BYTES,\n SLOT_PLANES,\n SLOT_SIDE,\n STRIP,\n W9,\n WET_TILE,\n normalizeTilt,\n PAPER_CAPACITY,\n normalizeWetParams,\n packWetParams,\n type WetPaper,\n type WetParams,\n type WetTilt,\n} from './model';\nimport { canShareMemory, loadWetKernel, wetSimdSupported, wetSupport, WetWorkerPool, type WetSupport, type WetWorkerLayout } from './wasm';\nimport type { WetGpuEngine, WetGpuJob } from './gpu';\n\n/** Wet layers a world can hold at once. */\nexport const MAX_WET_LANES = 8;\n/** Tile slots at most (about 3.8 GB, inside wasm32's 4 GB). Water reaching a tile past this is lost. */\nexport const MAX_WET_SLOTS = 352;\n/** Floats per slot. */\nconst SLOT_FLOATS = SLOT_PLANES * PLANE;\nconst S = SLOT_SIDE;\n/** Planes a snapshot keeps per slot: the current set and the deposit. */\nconst SNAP_PLANES = SET_PLANES + 4;\n\n/** A flow map: a vector per document pixel, in cells per step² at strength 1. */\nexport type WetFlowField = (x: number, y: number) => readonly [number, number];\n\n/** The paper as the simulation reads it. */\nexport interface WetPaperInput extends WetPaper {\n /** Grain height 0..1 at a document position (the paper's wet height map). */\n heightAt(x: number, y: number): number;\n /** Paper colour, sRGB bytes. */\n color: readonly [number, number, number];\n}\n\nexport type WetKernelKind = 'typescript' | 'wasm' | 'wasm-threads';\n\nexport interface WetBackendInfo {\n kind: WetKernelKind;\n /** Threads stepping the simulation. */\n threads: number;\n /** Why it runs slower than it could, or `null`. */\n message: string | null;\n}\n\nexport interface WetWorldOptions {\n /** Which kernel: `auto` (default: the fastest available), or force `typescript` / `wasm` (one thread). */\n kernel?: 'auto' | 'typescript' | 'wasm';\n /** Worker threads for the wasm kernel: `auto` (default: cores − 1, at most 10) or a number (0: none). */\n threads?: number | 'auto';\n}\n\nexport interface WetLaneOptions {\n params?: Partial<WetParams>;\n /** The layer's pixels under the wet paint (default empty). */\n base?: TiledSurface;\n flow?: WetFlowField | null;\n /** Flow map strength (default 1 when a flow map is given). */\n flowStrength?: number;\n}\n\ninterface Lane {\n id: string;\n index: number;\n params: WetParams;\n flow: WetFlowField | null;\n flowStrength: number;\n base: TiledSurface;\n /** Shaded display tiles by tile key, with the stamp they were shaded at. */\n shaded: Map<number, { stamp: number; tile: Tile }>;\n /** Tile keys edited since they were last shaded (shaded first). */\n urgent: Set<number>;\n /** Changes whenever its pixels (display) may have changed. */\n stamp: number;\n display: TiledSurface | null;\n /** Bumped whenever `shaded` changes; with the base id it keys the cached display. */\n shadedVersion: number;\n displayKey: string;\n}\n\n/** Totals for one wet layer. */\nexport interface WetLaneStats {\n /** Tiles being simulated. */\n activeTiles: number;\n /** Cells with surface water (at least `DRY_EPS` deep). */\n wetCells: number;\n /** Water on the surface plus in the paper, in cell-depth units. */\n water: number;\n /** Suspended plus settled pigment mass (sum of the four channels). */\n pigment: number;\n /** Document rectangle of the wet cells, or `null` when nothing is wet. */\n wetBounds: RasterRect | null;\n}\n\n/** A copy of the whole simulation (for undo). */\nexport interface WetSnapshot {\n readonly clock: number;\n readonly tilt: WetTilt;\n readonly lanes: ReadonlyArray<{ id: string; index: number; params: WetParams; flow: WetFlowField | null; flowStrength: number; base: TiledSurface }>;\n /** Per active key: the current set and the deposit planes; and its last flags. */\n readonly slots: ReadonlyMap<number, { planes: Float32Array; last: number }>;\n /** Bytes held. */\n readonly bytes: number;\n}\n\n/** Thrown for edits while a batch is running, and for bad arguments. */\nexport class WetWorldError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WetWorldError';\n }\n}\n\ninterface Layout extends WetWorkerLayout {\n width: number;\n height: number;\n}\n\nfunction makeLayout(width: number, height: number): Layout {\n const tilesX = Math.ceil(width / WET_TILE);\n const tilesY = Math.ceil(height / WET_TILE);\n const perLane = tilesX * tilesY;\n const keys = perLane * MAX_WET_LANES;\n const ctl = 0;\n const params = 1024;\n const table = params + MAX_WET_LANES * PARAM_FLOATS * 4;\n const list = table + keys * 4;\n const flags = list + keys * 4;\n const last = flags + keys * 4;\n const slots = Math.ceil((last + keys * 4) / 65536) * 65536;\n return { width, height, tilesX, tilesY, perLane, keys, ctl, params, table, list, flags, last, slots, slotBytes: SLOT_BYTES };\n}\n\n/** Rounds a height to 1/65536 so tiny floating-point differences in the grain never reach the simulation. */\nfunction quantizeHeight(v: number): number {\n return Math.round(Math.min(1, Math.max(0, v)) * 65536) / 65536;\n}\n\nexport class WetWorld {\n readonly width: number;\n readonly height: number;\n readonly layout: Layout;\n /** Steps simulated so far. */\n clock = 0;\n /** Messages for the user (slots ran out, a backend failed). */\n readonly warnings: string[] = [];\n private memory: WebAssembly.Memory;\n private readonly shared: boolean;\n private f32!: Float32Array;\n private i32!: Int32Array;\n private u32!: Uint32Array;\n private slotCount = 0;\n private readonly freeSlots: number[] = [];\n private readonly active: number[] = [];\n private parity = 0;\n private readonly lanes: (Lane | null)[] = new Array(MAX_WET_LANES).fill(null);\n private tilt: WetTilt = { ...FLAT };\n private paper: WetPaperInput;\n private paperBytes = new Uint8Array(3);\n private kind: WetKernelKind = 'typescript';\n private wasm: { step: (base: number, parity: number, prm: number) => number; halo: (table: number, slots: number, key: number, perLane: number, tilesX: number, tilesY: number, set: number) => void } | null = null;\n private pool: WetWorkerPool | null = null;\n private busyFlag = false;\n private destroyed = false;\n private support: WetSupport;\n private readonly prm = new Float32Array(PARAM_FLOATS);\n // Engine B: the GPU mirror (see `attachGpu`).\n private gpu: WetGpuEngine | null = null;\n /** Live tiles at which the GPU takes over the display (default 16: a fully wet 1024² canvas). */\n gpuMinTiles = 16;\n private gpuLive = false;\n private gpuFailure: string | null = null;\n /** Slot → rows (1..256, inclusive) to upload; `[0, 257]` means the whole slot. */\n private readonly gpuDirty = new Map<number, [number, number]>();\n private gpuParamsDirty = true;\n /**\n * Lead mode (between strokes): a batch is not sent to the GPU all at once; `gpuLead` steps it\n * frame by frame while the CPU works through it, so the display moves on before the CPU is done.\n */\n gpuLeadMode = false;\n /** The batch the GPU is working through in lead mode. */\n private gpuPlan: { jobs: WetGpuJob[]; parity: number; total: number; done: number } | null = null;\n /** Resolves when the fastest available kernel is running (it may stay `typescript`). */\n readonly ready: Promise<WetBackendInfo>;\n\n constructor(width: number, height: number, paper: WetPaperInput, options: WetWorldOptions = {}) {\n if (!(width >= 1 && height >= 1 && width <= 16384 && height <= 16384)) throw new WetWorldError(`A wet canvas must be 1..16384 pixels per side, not ${width}×${height}.`);\n this.width = Math.round(width);\n this.height = Math.round(height);\n this.paper = paper;\n this.paperBytes.set(paper.color);\n this.layout = makeLayout(this.width, this.height);\n const wantKernel = options.kernel ?? 'auto';\n const threads = options.threads ?? 'auto';\n this.shared = wantKernel === 'auto' && threads !== 0 && canShareMemory();\n const pages = this.layout.slots / 65536 + Math.ceil((2 * SLOT_BYTES) / 65536);\n const maxPages = Math.min(65536, Math.ceil((this.layout.slots + MAX_WET_SLOTS * SLOT_BYTES) / 65536));\n this.memory = this.shared ? new WebAssembly.Memory({ initial: pages, maximum: maxPages, shared: true }) : new WebAssembly.Memory({ initial: pages });\n this.views();\n new Int32Array(this.memory.buffer, this.layout.table, this.layout.keys).fill(-1);\n this.support = wetSupport(true);\n this.ready = wantKernel === 'typescript' ? Promise.resolve(this.backend()) : this.start(threads);\n }\n\n // --- Backends ------------------------------------------------------------------\n\n private views(): void {\n const buf = this.memory.buffer;\n this.f32 = new Float32Array(buf);\n this.i32 = new Int32Array(buf);\n this.u32 = new Uint32Array(buf);\n }\n\n private async start(threads: number | 'auto'): Promise<WetBackendInfo> {\n try {\n const simd = await wetSimdSupported();\n this.support = wetSupport(simd);\n if (!simd || this.destroyed) return this.backend();\n const module = await loadWetKernel(this.shared);\n const inst = await WebAssembly.instantiate(module, { env: { memory: this.memory } });\n if (this.destroyed) return this.backend();\n this.wasm = inst.exports as unknown as NonNullable<WetWorld['wasm']>;\n this.kind = 'wasm';\n const n = threads === 'auto' ? Math.max(1, Math.min(10, this.support.cores - 1)) : Math.max(0, Math.floor(threads));\n if (this.shared && this.support.workers && n >= 2) {\n try {\n const pool = await WetWorkerPool.create(n, module, this.memory, this.layout);\n if (this.destroyed) pool.destroy();\n else {\n this.pool = pool;\n this.kind = 'wasm-threads';\n }\n } catch (e) {\n this.warnings.push(`Wet paint could not start its worker threads (${(e as Error).message}); it runs on one thread.`);\n }\n }\n } catch (e) {\n this.warnings.push(`The WebAssembly wet-media kernel did not load (${(e as Error).message}); wet paint runs in plain JavaScript.`);\n }\n return this.backend();\n }\n\n /** The kernel in use and why it is not faster. */\n backend(): WetBackendInfo {\n const threads = this.pool?.size ?? 1;\n let message = this.support.message;\n if (this.kind === 'typescript' && !message) message = this.wasm ? null : 'Wet paint runs in plain JavaScript until the WebAssembly kernel has loaded.';\n if (this.kind === 'wasm-threads') message = null;\n return { kind: this.kind, threads, message };\n }\n\n /** Whether a batch is running (edits throw until it ends). */\n get busy(): boolean {\n return this.busyFlag;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.pool?.destroy();\n this.pool = null;\n }\n\n // --- Lanes ---------------------------------------------------------------------\n\n private laneOf(id: string): Lane {\n const l = this.lanes.find((x) => x?.id === id);\n if (!l) throw new WetWorldError(`There is no wet layer \"${id}\".`);\n return l;\n }\n\n hasLane(id: string): boolean {\n return this.lanes.some((x) => x?.id === id);\n }\n\n laneIds(): string[] {\n return this.lanes.filter((l): l is Lane => Boolean(l)).map((l) => l.id);\n }\n\n /** Adds a wet layer (or returns it). Throws when `MAX_WET_LANES` are in use. */\n ensureLane(id: string, options: WetLaneOptions = {}): void {\n this.requireIdle();\n const existing = this.lanes.find((x) => x?.id === id);\n if (existing) {\n if (options.params) this.setParams(id, options.params);\n if (options.base) this.setBase(id, options.base);\n return;\n }\n const index = this.lanes.indexOf(null);\n if (index < 0) throw new WetWorldError(`At most ${MAX_WET_LANES} layers can hold wet paint at once; dry one (dry_paint) first.`);\n this.lanes[index] = {\n id,\n index,\n params: normalizeWetParams(options.params ?? {}, DEFAULT_WET_PARAMS),\n flow: options.flow ?? null,\n flowStrength: options.flow ? (options.flowStrength ?? 1) : 0,\n base: options.base ?? new TiledSurface(4, new Map(), 0),\n shaded: new Map(),\n urgent: new Set(),\n stamp: 1,\n display: null,\n shadedVersion: 0,\n displayKey: '',\n };\n this.pack(this.lanes[index]!);\n }\n\n /** Drops a wet layer and its wet paint (nothing is baked). */\n removeLane(id: string): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n for (const key of [...this.active]) if (this.laneIndexOf(key) === lane.index) this.free(key);\n this.lanes[lane.index] = null;\n }\n\n getParams(id: string): WetParams {\n return { ...this.laneOf(id).params };\n }\n\n setParams(id: string, params: Partial<WetParams>): WetParams {\n this.requireIdle();\n const lane = this.laneOf(id);\n lane.params = normalizeWetParams(params, lane.params);\n this.pack(lane);\n return { ...lane.params };\n }\n\n getTilt(): WetTilt {\n return { ...this.tilt };\n }\n\n setTilt(tilt: Partial<WetTilt>): WetTilt {\n this.requireIdle();\n this.tilt = normalizeTilt(tilt, this.tilt);\n for (const l of this.lanes) if (l) this.pack(l);\n return { ...this.tilt };\n }\n\n /** Changes the paper: heights of live tiles are refilled, rates repacked. */\n setPaper(paper: WetPaperInput): void {\n this.requireIdle();\n this.paper = paper;\n this.paperBytes.set(paper.color);\n for (const key of this.active) this.fillPaper(key);\n for (const l of this.lanes) {\n if (!l) continue;\n this.pack(l);\n this.touchAll(l);\n }\n this.refreshHalos();\n }\n\n /** Sets a layer's flow map (`null` removes it). */\n setFlow(id: string, flow: WetFlowField | null, strength = 1): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n lane.flow = flow;\n lane.flowStrength = flow ? strength : 0;\n this.pack(lane);\n for (const key of this.active) if (this.laneIndexOf(key) === lane.index) this.fillFlow(key);\n }\n\n hasFlow(id: string): boolean {\n return Boolean(this.laneOf(id).flow);\n }\n\n /** The pixels under a layer's wet paint. */\n getBase(id: string): TiledSurface {\n return this.laneOf(id).base;\n }\n\n /** Replaces the pixels under a layer's wet paint. */\n setBase(id: string, base: TiledSurface): void {\n const lane = this.laneOf(id);\n if (base === lane.base) return;\n lane.base = base;\n lane.shaded.clear();\n lane.shadedVersion++;\n lane.stamp++;\n }\n\n private pack(lane: Lane): void {\n packWetParams(lane.params, this.paper ?? DEFAULT_WET_PAPER, this.tilt, lane.flowStrength, this.prm);\n this.f32.set(this.prm, (this.layout.params + lane.index * PARAM_FLOATS * 4) >> 2);\n this.gpuParamsDirty = true;\n }\n\n private touchAll(lane: Lane): void {\n lane.stamp++;\n }\n\n // --- Slots ---------------------------------------------------------------------\n\n private laneIndexOf(key: number): number {\n return Math.floor(key / this.layout.perLane);\n }\n\n private slotOf(key: number): number {\n return this.i32[(this.layout.table >> 2) + key];\n }\n\n private slotBase(slot: number): number {\n return (this.layout.slots >> 2) + slot * SLOT_FLOATS;\n }\n\n private requireIdle(): void {\n if (this.busyFlag) throw new WetWorldError('The wet simulation is mid-step; wait for it (whenIdle) before changing it.');\n }\n\n /** Writes the active list into memory for the kernels. */\n private syncList(): void {\n const base = this.layout.list >> 2;\n this.active.sort((a, b) => a - b);\n for (let i = 0; i < this.active.length; i++) this.i32[base + i] = this.active[i];\n this.i32[(this.layout.ctl >> 2) + 4] = this.active.length;\n }\n\n private grow(slots: number): boolean {\n const need = this.layout.slots + slots * SLOT_BYTES;\n const have = this.memory.buffer.byteLength;\n if (need <= have) return true;\n try {\n this.memory.grow(Math.ceil((need - have) / 65536));\n } catch {\n return false;\n }\n this.views();\n return true;\n }\n\n /** Activates a tile of a lane. Returns false when no slot can be had. */\n private activate(key: number): boolean {\n if (this.slotOf(key) >= 0) return true;\n let slot = this.freeSlots.pop();\n if (slot === undefined) {\n if (this.slotCount >= MAX_WET_SLOTS || !this.grow(this.slotCount + 1)) {\n const msg = `Wet paint reached its memory limit (${MAX_WET_SLOTS} tiles of 256 px); water spreading further is lost. Dry some paint (dry_paint) to free memory.`;\n if (!this.warnings.includes(msg)) this.warnings.push(msg);\n return false;\n }\n slot = this.slotCount++;\n }\n const base = this.slotBase(slot);\n this.f32.fill(0, base, base + SLOT_FLOATS);\n this.i32[(this.layout.table >> 2) + key] = slot;\n this.u32[(this.layout.flags >> 2) + key] = 0;\n this.u32[(this.layout.last >> 2) + key] = 0;\n this.active.push(key);\n this.fillPaper(key);\n this.fillFlow(key);\n return true;\n }\n\n private free(key: number): void {\n const slot = this.slotOf(key);\n if (slot < 0) return;\n this.i32[(this.layout.table >> 2) + key] = -1;\n this.freeSlots.push(slot);\n const i = this.active.indexOf(key);\n if (i >= 0) this.active.splice(i, 1);\n const lane = this.lanes[this.laneIndexOf(key)];\n if (lane) {\n if (lane.shaded.delete(this.tileKeyOf(key))) lane.shadedVersion++;\n lane.stamp++;\n }\n }\n\n private tileXY(key: number): [number, number] {\n const t = key % this.layout.perLane;\n return [t % this.layout.tilesX, Math.floor(t / this.layout.tilesX)];\n }\n\n private tileKeyOf(key: number): number {\n const [tx, ty] = this.tileXY(key);\n return tileKey(tx, ty);\n }\n\n private fillPaper(key: number): void {\n this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n const [tx, ty] = this.tileXY(key);\n const h = this.slotBase(this.slotOf(key)) + P_H * PLANE;\n const { width, height } = this;\n for (let y = 0; y < S; y++) {\n const gy = ty * WET_TILE + y - 1;\n for (let x = 0; x < S; x++) {\n const gx = tx * WET_TILE + x - 1;\n this.f32[h + y * S + x] = gx < 0 || gy < 0 || gx >= width || gy >= height ? -1 : quantizeHeight(this.paper.heightAt(gx + 0.5, gy + 0.5));\n }\n }\n }\n\n private fillFlow(key: number): void {\n this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n const lane = this.lanes[this.laneIndexOf(key)]!;\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const fx = b + P_FX * PLANE;\n const fy = b + P_FY * PLANE;\n for (let y = 1; y <= WET_TILE; y++) {\n for (let x = 1; x <= WET_TILE; x++) {\n const v = lane.flow ? lane.flow(tx * WET_TILE + x - 1 + 0.5, ty * WET_TILE + y - 1 + 0.5) : null;\n this.f32[fx + y * S + x] = v ? Math.fround(v[0]) : 0;\n this.f32[fy + y * S + x] = v ? Math.fround(v[1]) : 0;\n }\n }\n }\n\n /** Activates every tile of a lane within `STRIP` cells of a document rectangle. */\n private wake(lane: Lane, x0: number, y0: number, x1: number, y1: number): void {\n const { tilesX, tilesY, perLane } = this.layout;\n const tx0 = Math.max(0, Math.floor((x0 - STRIP) / WET_TILE));\n const ty0 = Math.max(0, Math.floor((y0 - STRIP) / WET_TILE));\n const tx1 = Math.min(tilesX - 1, Math.floor((x1 + STRIP) / WET_TILE));\n const ty1 = Math.min(tilesY - 1, Math.floor((y1 + STRIP) / WET_TILE));\n let added = false;\n for (let ty = ty0; ty <= ty1; ty++) for (let tx = tx0; tx <= tx1; tx++) added = this.activate(lane.index * perLane + ty * tilesX + tx) || added;\n if (added) this.syncList();\n }\n\n /** Fills one slot's halo in the current set from its neighbours (TypeScript). */\n private haloTs(key: number, set: number): void {\n const { tilesX, tilesY, perLane } = this.layout;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const f = this.f32;\n const nb = (dx: number, dy: number) => {\n const x = tx + dx;\n const y = ty + dy;\n if (x < 0 || y < 0 || x >= tilesX || y >= tilesY) return -1;\n return this.slotOf(laneBase + y * tilesX + x);\n };\n const me = this.slotBase(this.slotOf(key)) + set * SET_PLANES * PLANE;\n const n = nb(0, -1);\n const s = nb(0, 1);\n const w = nb(-1, 0);\n const e = nb(1, 0);\n const nw = nb(-1, -1);\n const ne = nb(1, -1);\n const sw = nb(-1, 1);\n const se = nb(1, 1);\n const off = set * SET_PLANES * PLANE;\n for (let k = 0; k < SET_PLANES; k++) {\n const mp = me + k * PLANE;\n const o = off + k * PLANE;\n if (n >= 0) f.copyWithin(mp + 1, this.slotBase(n) + o + 256 * S + 1, this.slotBase(n) + o + 256 * S + 257);\n if (s >= 0) f.copyWithin(mp + 257 * S + 1, this.slotBase(s) + o + S + 1, this.slotBase(s) + o + S + 257);\n if (w >= 0) for (let y = 1; y <= 256; y++) f[mp + y * S] = f[this.slotBase(w) + o + y * S + 256];\n if (e >= 0) for (let y = 1; y <= 256; y++) f[mp + y * S + 257] = f[this.slotBase(e) + o + y * S + 1];\n if (nw >= 0) f[mp] = f[this.slotBase(nw) + o + 256 * S + 256];\n if (ne >= 0) f[mp + 257] = f[this.slotBase(ne) + o + 256 * S + 1];\n if (sw >= 0) f[mp + 257 * S] = f[this.slotBase(sw) + o + S + 256];\n if (se >= 0) f[mp + 257 * S + 257] = f[this.slotBase(se) + o + S + 1];\n }\n }\n\n private halo(key: number, set: number): void {\n if (this.wasm) {\n const l = this.layout;\n this.wasm.halo(l.table, l.slots, key, l.perLane, l.tilesX, l.tilesY, set);\n } else this.haloTs(key, set);\n }\n\n /** Refills every live slot's halo in the current set (after edits or wake-ups). */\n private refreshHalos(): void {\n for (const key of this.active) this.halo(key, this.parity);\n }\n\n // --- Stepping ------------------------------------------------------------------\n\n /** Whether anything is being simulated (in `id`, or any layer). */\n isActive(id?: string): boolean {\n if (id === undefined) return this.active.length > 0;\n const lane = this.laneOf(id);\n return this.active.some((k) => this.laneIndexOf(k) === lane.index);\n }\n\n /** Steps until the next batch boundary: at most `want`, `MAX_BATCH`, and the next free check. */\n private batchSize(want: number): number {\n const toFree = FREE_INTERVAL - (this.clock % FREE_INTERVAL);\n return Math.max(1, Math.min(want, MAX_BATCH, toFree));\n }\n\n /** Runs `n` steps on this thread (TypeScript or wasm kernel). */\n private runHere(n: number): void {\n const l = this.layout;\n const flagsBase = l.flags >> 2;\n const lastBase = l.last >> 2;\n const prmBase = l.params >> 2;\n for (let s = 0; s < n; s++) {\n for (const key of this.active) {\n const slot = this.slotOf(key);\n const lane = this.laneIndexOf(key);\n let fl: number;\n if (this.wasm) fl = this.wasm.step(l.slots + slot * SLOT_BYTES, this.parity, l.params + lane * PARAM_FLOATS * 4);\n else fl = stepSlotTs(this.f32, this.slotBase(slot), this.parity, this.f32.subarray(prmBase + lane * PARAM_FLOATS, prmBase + (lane + 1) * PARAM_FLOATS));\n this.u32[flagsBase + key] |= fl;\n this.u32[lastBase + key] = fl;\n }\n for (const key of this.active) this.halo(key, 1 - this.parity);\n this.parity = 1 - this.parity;\n }\n }\n\n /** After a batch: wake neighbours from the flags, free dead tiles on a free step, restamp. */\n private afterBatch(n: number): void {\n this.clock += n;\n const l = this.layout;\n const flagsBase = l.flags >> 2;\n const lastBase = l.last >> 2;\n const { tilesX, tilesY, perLane } = l;\n const wakeups: number[] = [];\n for (const key of this.active) {\n const fl = this.u32[flagsBase + key];\n this.u32[flagsBase + key] = 0;\n if (!(fl & FLAG_ALIVE)) continue;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const L = fl & FLAG_LEFT;\n const R = fl & FLAG_RIGHT;\n const T = fl & FLAG_TOP;\n const B = fl & FLAG_BOTTOM;\n const push = (x: number, y: number) => {\n if (x >= 0 && y >= 0 && x < tilesX && y < tilesY && this.slotOf(laneBase + y * tilesX + x) < 0) wakeups.push(laneBase + y * tilesX + x);\n };\n if (L) push(tx - 1, ty);\n if (R) push(tx + 1, ty);\n if (T) push(tx, ty - 1);\n if (B) push(tx, ty + 1);\n if (L && T) push(tx - 1, ty - 1);\n if (R && T) push(tx + 1, ty - 1);\n if (L && B) push(tx - 1, ty + 1);\n if (R && B) push(tx + 1, ty + 1);\n }\n let woke = false;\n for (const key of wakeups) woke = this.activate(key) || woke;\n if (this.clock % FREE_INTERVAL === 0) {\n const dead = this.active.filter((key) => {\n if (this.u32[lastBase + key] & FLAG_ALIVE) return false;\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n for (let dy = -1; dy <= 1; dy++)\n for (let dx = -1; dx <= 1; dx++) {\n const x = tx + dx;\n const y = ty + dy;\n if ((dx || dy) && x >= 0 && y >= 0 && x < tilesX && y < tilesY) {\n const nk = laneBase + y * tilesX + x;\n if (this.slotOf(nk) >= 0 && this.u32[lastBase + nk] & FLAG_ALIVE) return false;\n }\n }\n return true;\n });\n for (const key of dead) {\n this.bakeKey(key, false);\n this.free(key);\n }\n if (dead.length) woke = true;\n }\n if (woke) {\n this.syncList();\n this.refreshHalos();\n }\n for (const lane of this.lanes) if (lane) lane.stamp++;\n }\n\n /**\n * Steps the simulation `steps` times on this thread (the TypeScript or single-thread wasm\n * kernel). Throws while worker threads are in use; use `step` there.\n */\n stepSync(steps: number): number {\n this.requireIdle();\n if (this.pool) throw new WetWorldError('This wet world steps in worker threads; call step (async) instead.');\n let left = Math.max(0, Math.floor(steps));\n while (left > 0) {\n if (!this.active.length) {\n this.clock += left;\n break;\n }\n const n = this.batchSize(left);\n this.gpuBatch(n);\n this.runHere(n);\n this.afterBatch(n);\n left -= n;\n }\n return this.clock;\n }\n\n /** Steps the simulation `steps` times (in worker threads when there are any). */\n async step(steps: number): Promise<number> {\n this.requireIdle();\n if (!this.pool) return this.stepSync(steps);\n let left = Math.max(0, Math.floor(steps));\n while (left > 0) {\n if (!this.active.length) {\n this.clock += left;\n break;\n }\n const n = this.batchSize(left);\n this.gpuBatch(n);\n const ctl = this.layout.ctl >> 2;\n this.i32[ctl + 2] = 0;\n this.i32[ctl + 3] = 0;\n this.i32[ctl + 5] = this.parity;\n this.busyFlag = true;\n try {\n await this.pool.run(n);\n } finally {\n this.busyFlag = false;\n }\n this.parity = (this.parity + n) % 2;\n this.afterBatch(n);\n left -= n;\n }\n return this.clock;\n }\n\n /** Steps until nothing is wet or `maxSteps` have run. Returns the steps run. */\n async stepUntilDry(maxSteps: number): Promise<number> {\n const start = this.clock;\n while (this.active.length && this.clock - start < maxSteps) await this.step(Math.min(FREE_INTERVAL, maxSteps - (this.clock - start)));\n return this.clock - start;\n }\n\n /**\n * Steps only the live tiles that touch `region` (canvas pixels): a viewport, say, so a huge wet\n * canvas costs what is on screen. The other live tiles hold still (no flow, no drying) until a\n * later step reaches them, and water flowing out of the region stops at their edge; tiles the\n * region's water wakes up are stepped as usual. Holding tiles makes the result depend on the\n * regions, so a replay is only bit-identical with the same regions. Returns the clock.\n */\n async stepRegion(steps: number, region: RasterRect): Promise<number> {\n const release = this.hold(region);\n try {\n return await this.step(steps);\n } finally {\n release();\n }\n }\n\n /** `stepRegion` on this thread (throws while worker threads are in use, like `stepSync`). */\n stepRegionSync(steps: number, region: RasterRect): number {\n const release = this.hold(region);\n try {\n return this.stepSync(steps);\n } finally {\n release();\n }\n }\n\n /**\n * Takes the live tiles that miss `region` out of the active list until the returned release\n * is called. Their state is copied into the other ping-pong set first, so they read the same\n * whichever set is current when they come back.\n */\n private hold(region: RasterRect): () => void {\n this.requireIdle();\n const x0 = Math.floor(region.x / WET_TILE);\n const y0 = Math.floor(region.y / WET_TILE);\n const x1 = Math.floor((region.x + Math.max(0, region.width) - 1) / WET_TILE);\n const y1 = Math.floor((region.y + Math.max(0, region.height) - 1) / WET_TILE);\n const held = this.active.filter((key) => {\n const [tx, ty] = this.tileXY(key);\n return tx < x0 || tx > x1 || ty < y0 || ty > y1;\n });\n if (!held.length) return () => {};\n const setFloats = SET_PLANES * PLANE;\n for (const key of held) {\n const base = this.slotBase(this.slotOf(key));\n const src = base + this.parity * setFloats;\n this.f32.copyWithin(base + (1 - this.parity) * setFloats, src, src + setFloats);\n }\n const heldSet = new Set(held);\n this.active.splice(0, this.active.length, ...this.active.filter((k) => !heldSet.has(k)));\n this.syncList();\n return () => {\n for (const key of held) if (this.slotOf(key) >= 0 && !this.active.includes(key)) this.active.push(key);\n this.syncList();\n this.refreshHalos();\n };\n }\n\n // --- Edits ---------------------------------------------------------------------\n\n /** Float index of a cell's plane-0 value in the current set, or −1 (inactive / off the canvas). */\n private cell(lane: Lane, x: number, y: number): number {\n if (x < 0 || y < 0 || x >= this.width || y >= this.height) return -1;\n const { tilesX, perLane } = this.layout;\n const slot = this.slotOf(lane.index * perLane + (y >> 8) * tilesX + (x >> 8));\n if (slot < 0) return -1;\n return this.slotBase(slot) + this.parity * SET_PLANES * PLANE + ((y & 255) + 1) * S + (x & 255) + 1;\n }\n\n /** Index of the same cell in the single (deposit, height, flow) planes, given `cell`. */\n private single(c: number): number {\n return c - this.parity * SET_PLANES * PLANE;\n }\n\n /**\n * Runs `fn` for every cell of a footprint (`cov` over `rect`, document cells) on a lane, waking\n * the tiles around it first, then refreshes halos. `fn` gets the cell index and its coverage.\n */\n private footprint(id: string, rect: RasterRect, cov: ArrayLike<number> | null, fn: (c: number, w: number, x: number, y: number) => void, wake = true): void {\n this.requireIdle();\n const lane = this.laneOf(id);\n const x0 = Math.max(0, rect.x);\n const y0 = Math.max(0, rect.y);\n const x1 = Math.min(this.width, rect.x + rect.width);\n const y1 = Math.min(this.height, rect.y + rect.height);\n if (x1 <= x0 || y1 <= y0) return;\n if (wake) this.wake(lane, x0, y0, x1 - 1, y1 - 1);\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const w = cov ? cov[(y - rect.y) * rect.width + (x - rect.x)] : 1;\n if (!(w > 0)) continue;\n const c = this.cell(lane, x, y);\n if (c >= 0) fn(c, w, x, y);\n }\n }\n this.markEdited(lane, x0, y0, x1, y1);\n this.refreshHalos();\n }\n\n private markEdited(lane: Lane, x0: number, y0: number, x1: number, y1: number): void {\n const { tilesX, perLane } = this.layout;\n for (let ty = y0 >> 8; ty <= (y1 - 1) >> 8; ty++)\n for (let tx = x0 >> 8; tx <= (x1 - 1) >> 8; tx++) {\n lane.urgent.add(tileKey(tx, ty));\n const slot = this.slotOf(lane.index * perLane + ty * tilesX + tx);\n if (slot >= 0) this.gpuDirtySlot(slot, Math.max(1, y0 - ty * WET_TILE + 1), Math.min(WET_TILE, y1 - ty * WET_TILE));\n }\n lane.stamp++;\n }\n\n /** Adds water (depth units) at rest. */\n private addWaterAt(c: number, dw: number): void {\n const f = this.f32;\n for (let k = 0; k < 9; k++) f[c + k * PLANE] += W9[k] * dw;\n f[c + P_RHO * PLANE] += dw;\n }\n\n /**\n * Lays paint: `water` depth and pigment mass `pigment` (K r, g, b, S) per unit of coverage, or\n * per pixel from `field` (4 values per pixel of `rect`). Pigment without water lands straight in\n * the paper (settled).\n */\n paint(id: string, rect: RasterRect, cov: ArrayLike<number> | null, water: number, pigment: ArrayLike<number> | null, field: ArrayLike<number> | null = null): void {\n if (!(water >= 0)) throw new WetWorldError(`water ${water} must be 0 or more.`);\n this.footprint(id, rect, cov, (c, w, x, y) => {\n const dw = Math.fround(water * w);\n if (dw > 0) this.addWaterAt(c, dw);\n const into = dw > 0 ? c + P_P0 * PLANE : this.single(c) + P_D0 * PLANE;\n if (field) {\n const o = ((y - rect.y) * rect.width + (x - rect.x)) * 4;\n for (let q = 0; q < 4; q++) this.f32[into + q * PLANE] += field[o + q] * w;\n } else if (pigment) for (let q = 0; q < 4; q++) this.f32[into + q * PLANE] += pigment[q] * w;\n });\n }\n\n /** Damp paper: fills the paper's water towards its capacity by `amount` (0..1) × coverage, plus a thin film of surface water. */\n wetPaper(id: string, rect: RasterRect, cov: ArrayLike<number> | null, amount: number): void {\n const capacity = PAPER_CAPACITY;\n this.footprint(id, rect, cov, (c, w) => {\n const a = Math.min(1, Math.max(0, amount * w));\n const s = c + P_SW * PLANE;\n this.f32[s] = Math.max(this.f32[s], Math.fround(capacity * a));\n this.addWaterAt(c, Math.fround(0.03 * a));\n });\n }\n\n /**\n * Takes water (and suspended pigment, and settled pigment) away: `water`, `suspended`,\n * `settled` are fractions 0..1 × coverage. A hair dryer takes water only (the pigment stays and\n * settles); blotting takes all three.\n */\n remove(id: string, rect: RasterRect, cov: ArrayLike<number> | null, water: number, suspended: number, settled: number, paperWater = water): void {\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n const f = this.f32;\n const kw = 1 - Math.min(1, Math.max(0, water * w));\n const kp = 1 - Math.min(1, Math.max(0, suspended * w));\n const kd = 1 - Math.min(1, Math.max(0, settled * w));\n const ks = 1 - Math.min(1, Math.max(0, paperWater * w));\n if (kw < 1) {\n for (let k = 0; k < 9; k++) f[c + k * PLANE] *= kw;\n f[c + P_RHO * PLANE] *= kw;\n }\n if (ks < 1) f[c + P_SW * PLANE] *= ks;\n if (kp < 1) for (let q = 0; q < 4; q++) f[c + (P_P0 + q) * PLANE] *= kp;\n if (kd < 1) {\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) f[d + q * PLANE] *= kd;\n }\n },\n false\n );\n }\n\n /** Pushes the water: adds velocity (`ux`, `uy` cells per step, each at most 0.1) × coverage. */\n push(id: string, rect: RasterRect, cov: ArrayLike<number> | null, ux: number, uy: number): void {\n const cap = 0.1;\n const sp = Math.hypot(ux, uy);\n if (sp > cap) {\n ux *= cap / sp;\n uy *= cap / sp;\n }\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n const f = this.f32;\n const rho = f[c + P_RHO * PLANE];\n if (!(rho >= DRY_EPS)) return;\n for (let k = 1; k < 9; k++) {\n const eu = EX[k] * ux * w + EY[k] * uy * w;\n f[c + k * PLANE] = Math.max(0, f[c + k * PLANE] + 3 * W9[k] * rho * eu);\n }\n },\n false\n );\n }\n\n /** Blends wet paint: each wet cell's suspended pigment moves `strength` × coverage towards the footprint's mean. */\n blend(id: string, rect: RasterRect, cov: ArrayLike<number> | null, strength: number): void {\n const lane = this.laneOf(id);\n const sums = [0, 0, 0, 0];\n let wsum = 0;\n const cells: Array<[number, number]> = [];\n this.footprint(\n id,\n rect,\n cov,\n (c, w) => {\n if (!(this.f32[c + P_RHO * PLANE] >= DRY_EPS)) return;\n cells.push([c, w]);\n wsum += w;\n for (let q = 0; q < 4; q++) sums[q] += this.f32[c + (P_P0 + q) * PLANE] * w;\n },\n false\n );\n if (!(wsum > 0)) return;\n const k = Math.min(1, Math.max(0, strength));\n for (const [c, w] of cells) for (let q = 0; q < 4; q++) {\n const i = c + (P_P0 + q) * PLANE;\n this.f32[i] += k * w * (sums[q] / wsum - this.f32[i]);\n }\n lane.stamp++;\n this.refreshHalos();\n }\n\n /**\n * Drags wet paint by (`dx`, `dy`) cells: each footprint cell takes `strength` × coverage of the\n * water and suspended pigment of the cell it came from (a smudge through wet paint).\n */\n drag(id: string, rect: RasterRect, cov: ArrayLike<number> | null, dx: number, dy: number, strength: number): void {\n const lane = this.laneOf(id);\n const sx = Math.round(dx);\n const sy = Math.round(dy);\n if (!sx && !sy) return;\n const moves: Array<[number, number, number]> = [];\n this.footprint(\n id,\n rect,\n cov,\n (c, w, x, y) => {\n const from = this.cell(lane, x - sx, y - sy);\n if (from < 0) return;\n moves.push([from, c, Math.min(1, Math.max(0, strength * w))]);\n },\n true\n );\n const f = this.f32;\n // Take from the sources first (so a chain of moves never moves paint twice), then lay it down.\n const taken = moves.map(([from, , a]) => {\n const t = new Float32Array(14);\n for (let k = 0; k < 9; k++) {\n t[k] = f[from + k * PLANE] * a;\n f[from + k * PLANE] -= t[k];\n }\n t[9] = f[from + P_RHO * PLANE] * a;\n f[from + P_RHO * PLANE] -= t[9];\n for (let q = 0; q < 4; q++) {\n t[10 + q] = f[from + (P_P0 + q) * PLANE] * a;\n f[from + (P_P0 + q) * PLANE] -= t[10 + q];\n }\n return t;\n });\n moves.forEach(([, to], i) => {\n const t = taken[i];\n // Arriving water carries the drag direction a little.\n for (let k = 0; k < 9; k++) f[to + k * PLANE] += t[k];\n f[to + P_RHO * PLANE] += t[9];\n for (let q = 0; q < 4; q++) f[to + (P_P0 + q) * PLANE] += t[10 + q];\n });\n this.refreshHalos();\n }\n\n /**\n * Re-wetting: lifts `amount` × coverage of the dried paint in the layer's pixels (`base`) back into\n * the paper as settled pigment, so water can move it again. Only where there is surface water.\n */\n rewet(id: string, rect: RasterRect, cov: ArrayLike<number> | null, amount: number, paper: readonly [number, number, number]): void {\n const lane = this.laneOf(id);\n const pig = [0, 0, 0, 0];\n const tiles = new Map(lane.base.tiles);\n const written = new Set<number>();\n const scratch = new Uint8ClampedArray(4);\n this.footprint(\n id,\n rect,\n cov,\n (c, w, x, y) => {\n if (!(this.f32[c + P_RHO * PLANE] >= DRY_EPS)) return;\n const a = Math.min(1, Math.max(0, amount * w));\n if (!(a > 0)) return;\n const key = tileKey(x >> 8, y >> 8);\n let tile = tiles.get(key);\n if (!tile) return;\n if (!written.has(key)) {\n tile = { data: new Uint8ClampedArray(tile.data), uniform: null };\n tiles.set(key, tile);\n written.add(key);\n }\n const i = ((y & 255) * TILE + (x & 255)) * 4;\n if (tile.data[i + 3] === 0) return;\n pixelPigment(tile.data, i, paper, pig);\n if (!(pig[0] > 0 || pig[1] > 0 || pig[2] > 0)) return;\n // What stays: (1 − a) of the film over the paper, as a pixel; what is lifted goes to the deposit.\n const clear = new Uint8ClampedArray([0, 0, 0, 0]);\n filmPixel(pig[0] * (1 - a), pig[1] * (1 - a), pig[2] * (1 - a), 0, clear, 0, paper, 0, scratch, 0);\n tile.data.set(scratch, i);\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 3; q++) this.f32[d + q * PLANE] += Math.fround(pig[q] * a);\n },\n false\n );\n if (written.size) {\n for (const key of written) {\n const t = finishTile(tiles.get(key)!.data, 4, 0);\n if (t) tiles.set(key, t);\n else tiles.delete(key);\n }\n this.setBase(id, new TiledSurface(4, tiles, 0));\n }\n }\n\n /**\n * Dries wet paint at once (everything settles where it is, the water goes): in `rect`, or the\n * whole layer. Whole tiles that end up dry are baked into the base and freed. Returns the\n * document rectangle that changed, or `null`.\n */\n dry(id: string, rect?: RasterRect): RasterRect | null {\n this.requireIdle();\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n if (!keys.length) return null;\n let bounds: RasterRect | null = null;\n const area = rect ?? { x: 0, y: 0, width: this.width, height: this.height };\n for (const key of keys) {\n const [tx, ty] = this.tileXY(key);\n const tr = { x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE };\n const x0 = Math.max(area.x, tr.x);\n const y0 = Math.max(area.y, tr.y);\n const x1 = Math.min(area.x + area.width, tr.x + tr.width, this.width);\n const y1 = Math.min(area.y + area.height, tr.y + tr.height, this.height);\n if (x1 <= x0 || y1 <= y0) continue;\n const whole = x0 === tr.x && y0 === tr.y && x1 >= Math.min(tr.x + WET_TILE, this.width) && y1 >= Math.min(tr.y + WET_TILE, this.height);\n if (whole) {\n if (this.bakeKey(key, true)) bounds = unionRect(bounds, { x: tr.x, y: tr.y, width: Math.min(WET_TILE, this.width - tr.x), height: Math.min(WET_TILE, this.height - tr.y) });\n this.free(key);\n continue;\n }\n const f = this.f32;\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const c = this.cell(lane, x, y);\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) {\n f[d + q * PLANE] += f[c + (P_P0 + q) * PLANE];\n f[c + (P_P0 + q) * PLANE] = 0;\n }\n for (let k = 0; k < 9; k++) f[c + k * PLANE] = 0;\n f[c + P_RHO * PLANE] = 0;\n f[c + P_UX * PLANE] = 0;\n f[c + P_UY * PLANE] = 0;\n f[c + P_SW * PLANE] = 0;\n }\n }\n bounds = unionRect(bounds, { x: x0, y: y0, width: x1 - x0, height: y1 - y0 });\n this.markEdited(lane, x0, y0, x1, y1);\n }\n this.syncList();\n this.refreshHalos();\n lane.stamp++;\n return bounds;\n }\n\n /**\n * Bakes a slot's pigment into its lane's base (settling suspended pigment too when `all`).\n * Returns whether any pixel changed.\n */\n private bakeKey(key: number, all: boolean): boolean {\n const lane = this.lanes[this.laneIndexOf(key)]!;\n const [tx, ty] = this.tileXY(key);\n const tk = tileKey(tx, ty);\n const src = lane.base.tiles.get(tk)?.data ?? null;\n const out = this.shadeSlot(key, src, all ? 'bake-all' : 'bake');\n if (!out) return false;\n const tiles = new Map(lane.base.tiles);\n const t = finishTile(out, 4, 0);\n if (t) tiles.set(tk, t);\n else tiles.delete(tk);\n this.setBase(lane.id, new TiledSurface(4, tiles, 0));\n return true;\n }\n\n /**\n * Shades one slot over a base tile. `display`: the wet look (suspended + settled, wet paper a\n * little darker); `bake`: settled pigment only; `bake-all`: suspended and settled (dry now).\n * Returns `null` when nothing would change the base.\n */\n private shadeSlot(key: number, src: Uint8ClampedArray | null, mode: 'display' | 'bake' | 'bake-all'): Uint8ClampedArray | null {\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const cur = b + this.parity * SET_PLANES * PLANE;\n const out = src ? new Uint8ClampedArray(src) : new Uint8ClampedArray(TILE * TILE * 4);\n const w = Math.min(WET_TILE, this.width - tx * WET_TILE);\n const h = Math.min(WET_TILE, this.height - ty * WET_TILE);\n const changed = shadeTile(\n this.f32,\n PLANE,\n S,\n b + P_D0 * PLANE,\n mode === 'bake' ? -1 : cur + P_P0 * PLANE,\n mode === 'display' ? cur + P_RHO * PLANE : -1,\n cur + P_SW * PLANE,\n src,\n out,\n w,\n h,\n this.paperBytes\n );\n return changed ? out : null;\n }\n\n /** The layer's pixels with all its wet paint dried where it is (the bake of \"dry on save\"); changes nothing. */\n bakedSurface(id: string): TiledSurface {\n this.requireIdle();\n const lane = this.laneOf(id);\n const tiles = new Map(lane.base.tiles);\n for (const key of this.active) {\n if (this.laneIndexOf(key) !== lane.index) continue;\n const tk = this.tileKeyOf(key);\n const out = this.shadeSlot(key, lane.base.tiles.get(tk)?.data ?? null, 'bake-all');\n if (!out) continue;\n const t = finishTile(out, 4, 0);\n if (t) tiles.set(tk, t);\n else tiles.delete(tk);\n }\n return new TiledSurface(4, tiles, 0);\n }\n\n // --- Reading -------------------------------------------------------------------\n\n /**\n * Sums over a footprint of a lane, weighted by coverage: `weight` (coverage), `water` (surface\n * depth), `wet` (coverage of wet cells), `pigment` (suspended, 4 channels), `settled` (4 channels).\n */\n sample(id: string, rect: RasterRect, cov: ArrayLike<number> | null): { weight: number; water: number; wet: number; pigment: number[]; settled: number[] } {\n const lane = this.laneOf(id);\n const r = { weight: 0, water: 0, wet: 0, pigment: [0, 0, 0, 0], settled: [0, 0, 0, 0] };\n const x0 = Math.max(0, rect.x);\n const y0 = Math.max(0, rect.y);\n const x1 = Math.min(this.width, rect.x + rect.width);\n const y1 = Math.min(this.height, rect.y + rect.height);\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n const w = cov ? cov[(y - rect.y) * rect.width + (x - rect.x)] : 1;\n if (!(w > 0)) continue;\n r.weight += w;\n const c = this.cell(lane, x, y);\n if (c < 0) continue;\n const rho = this.f32[c + P_RHO * PLANE];\n r.water += rho * w;\n if (rho >= DRY_EPS) r.wet += w;\n const d = this.single(c) + P_D0 * PLANE;\n for (let q = 0; q < 4; q++) {\n r.pigment[q] += this.f32[c + (P_P0 + q) * PLANE] * w;\n r.settled[q] += this.f32[d + q * PLANE] * w;\n }\n }\n }\n return r;\n }\n\n /** Surface water depth at a document cell (0 where nothing is simulated). */\n waterAt(id: string, x: number, y: number): number {\n const c = this.cell(this.laneOf(id), Math.floor(x), Math.floor(y));\n return c < 0 ? 0 : this.f32[c + P_RHO * PLANE];\n }\n\n /** Totals for a layer (scans its live tiles). */\n stats(id: string): WetLaneStats {\n const lane = this.laneOf(id);\n const out: WetLaneStats = { activeTiles: 0, wetCells: 0, water: 0, pigment: 0, wetBounds: null };\n let bx0 = Infinity;\n let by0 = Infinity;\n let bx1 = -Infinity;\n let by1 = -Infinity;\n const f = this.f32;\n for (const key of this.active) {\n if (this.laneIndexOf(key) !== lane.index) continue;\n out.activeTiles++;\n const [tx, ty] = this.tileXY(key);\n const b = this.slotBase(this.slotOf(key));\n const cur = b + this.parity * SET_PLANES * PLANE;\n for (let y = 1; y <= 256; y++) {\n for (let x = 1; x <= 256; x++) {\n const c = y * S + x;\n const rho = f[cur + P_RHO * PLANE + c];\n out.water += rho + f[cur + P_SW * PLANE + c];\n for (let q = 0; q < 4; q++) out.pigment += f[cur + (P_P0 + q) * PLANE + c] + f[b + (P_D0 + q) * PLANE + c];\n if (rho >= DRY_EPS) {\n out.wetCells++;\n const gx = tx * WET_TILE + x - 1;\n const gy = ty * WET_TILE + y - 1;\n if (gx < bx0) bx0 = gx;\n if (gy < by0) by0 = gy;\n if (gx > bx1) bx1 = gx;\n if (gy > by1) by1 = gy;\n }\n }\n }\n }\n if (out.wetCells) out.wetBounds = { x: bx0, y: by0, width: bx1 - bx0 + 1, height: by1 - by0 + 1 };\n return out;\n }\n\n /** Whether a layer (or any) has surface water anywhere. */\n isWet(id?: string): boolean {\n const ids = id === undefined ? this.laneIds() : [id];\n return ids.some((x) => this.isActive(x));\n }\n\n /** Document rectangles of a layer's live tiles. */\n activeRects(id: string): RasterRect[] {\n const lane = this.laneOf(id);\n return this.active\n .filter((k) => this.laneIndexOf(k) === lane.index)\n .map((k) => {\n const [tx, ty] = this.tileXY(k);\n return { x: tx * WET_TILE, y: ty * WET_TILE, width: Math.min(WET_TILE, this.width - tx * WET_TILE), height: Math.min(WET_TILE, this.height - ty * WET_TILE) };\n });\n }\n\n // --- Display -------------------------------------------------------------------\n\n /** A number that changes whenever a layer's display may have changed. */\n stamp(id: string): number {\n return this.laneOf(id).stamp;\n }\n\n /**\n * The layer's pixels with its wet paint shaded in: the base with each live tile shaded over it.\n * At most `maxTiles` stale tiles are reshaded per call (edited tiles first); the rest keep their\n * last shading until the next call. Returns the surface and the tiles reshaded.\n */\n display(id: string, maxTiles = Infinity): { surface: TiledSurface; changed: RasterRect[]; pending: number } {\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n const stale = keys.filter((k) => lane.shaded.get(this.tileKeyOf(k))?.stamp !== lane.stamp);\n stale.sort((a, b) => Number(lane.urgent.has(this.tileKeyOf(b))) - Number(lane.urgent.has(this.tileKeyOf(a))) || (lane.shaded.get(this.tileKeyOf(a))?.stamp ?? 0) - (lane.shaded.get(this.tileKeyOf(b))?.stamp ?? 0));\n const changed: RasterRect[] = [];\n let done = 0;\n for (const key of stale) {\n if (done >= maxTiles) break;\n const tk = this.tileKeyOf(key);\n const src = lane.base.tiles.get(tk)?.data ?? null;\n const out = this.shadeSlot(key, src, 'display');\n const tile = out ? finishTile(out, 4, 0) : (lane.base.tiles.get(tk) ?? null);\n lane.shaded.set(tk, { stamp: lane.stamp, tile: tile ?? { data: new Uint8ClampedArray(0), uniform: 0 } });\n lane.shadedVersion++;\n lane.urgent.delete(tk);\n const [tx, ty] = this.tileXY(key);\n changed.push({ x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE });\n done++;\n }\n // Shaded tiles of freed slots are gone; drop leftovers.\n const live = new Set(keys.map((k) => this.tileKeyOf(k)));\n for (const tk of [...lane.shaded.keys()]) if (!live.has(tk) && lane.shaded.delete(tk)) lane.shadedVersion++;\n const displayKey = `${lane.base.id}:${lane.shadedVersion}`;\n if (lane.display && lane.displayKey === displayKey) return { surface: lane.display, changed, pending: stale.length - done };\n const tiles = new Map(lane.base.tiles);\n for (const [tk, { tile }] of lane.shaded) {\n if (tile.data.length === 0) tiles.delete(tk);\n else tiles.set(tk, tile);\n }\n lane.display = new TiledSurface(4, tiles, 0);\n lane.displayKey = displayKey;\n return { surface: lane.display, changed, pending: stale.length - done };\n }\n\n /**\n * The water as an overlay tile (RGBA, blue, alpha from surface depth and damp paper) for a\n * document tile, or `null` where nothing is wet.\n */\n waterOverlay(id: string, tx: number, ty: number): Uint8ClampedArray | null {\n const lane = this.laneOf(id);\n const { tilesX, tilesY, perLane } = this.layout;\n if (tx < 0 || ty < 0 || tx >= tilesX || ty >= tilesY) return null;\n const slot = this.slotOf(lane.index * perLane + ty * tilesX + tx);\n if (slot < 0) return null;\n const cur = this.slotBase(slot) + this.parity * SET_PLANES * PLANE;\n const out = new Uint8ClampedArray(TILE * TILE * 4);\n let any = false;\n for (let y = 0; y < WET_TILE; y++) {\n for (let x = 0; x < WET_TILE; x++) {\n const c = (y + 1) * S + x + 1;\n const rho = this.f32[cur + P_RHO * PLANE + c];\n const sw = this.f32[cur + P_SW * PLANE + c];\n const a = Math.min(1, rho * 2.5) * 0.7 + Math.min(1, sw * 4) * 0.2;\n if (a <= 0.004) continue;\n const i = (y * TILE + x) * 4;\n out[i] = 40;\n out[i + 1] = 120;\n out[i + 2] = 255;\n out[i + 3] = Math.round(a * 255);\n any = true;\n }\n }\n return any ? out : null;\n }\n\n // --- Engine B (WebGPU mirror) ---------------------------------------------------\n\n /**\n * Attaches a GPU engine (or `null` to detach). From then on, whenever at least `gpuMinTiles` tiles\n * are live, the GPU mirrors the slots and `displayGpu` shades on it. The CPU stays the authority.\n */\n attachGpu(engine: WetGpuEngine | null): void {\n this.gpu = engine;\n this.gpuLive = false;\n this.gpuFailure = null;\n }\n\n /** The attached GPU engine, if any. */\n get gpuEngine(): WetGpuEngine | null {\n return this.gpu;\n }\n\n /** Whether the GPU mirror is in use now (an engine is attached and the wet area is large). */\n get gpuActive(): boolean {\n return this.gpuLive;\n }\n\n /** Why the GPU stopped (a lost device, out of GPU memory), or `null`. */\n get gpuError(): string | null {\n return this.gpuFailure;\n }\n\n private gpuDirtySlot(slot: number, y0: number, y1: number): void {\n if (!this.gpuLive || slot < 0) return;\n const d = this.gpuDirty.get(slot);\n this.gpuDirty.set(slot, d ? [Math.min(d[0], y0), Math.max(d[1], y1)] : [y0, y1]);\n }\n\n private gpuStop(reason: string | null): void {\n this.gpuLive = false;\n this.gpuPlan = null;\n this.gpuDirty.clear();\n if (reason) {\n this.gpuFailure = reason;\n this.gpu = null;\n if (!this.warnings.includes(reason)) this.warnings.push(reason);\n }\n }\n\n /** Turns the mirror on or off for the current wet area. Returns whether it is on. */\n private gpuDecide(): boolean {\n // On at gpuMinTiles, off below half of it (so it does not flip at the threshold).\n const want = Boolean(this.gpu) && this.active.length >= (this.gpuLive ? Math.ceil(this.gpuMinTiles / 2) : this.gpuMinTiles);\n if (want && !this.gpuLive) {\n const gpu = this.gpu!;\n if (gpu.lostReason) {\n this.gpuStop(`The GPU was lost (${gpu.lostReason}); wet paint runs on the CPU.`);\n return false;\n }\n if (!gpu.ensureSlots(this.slotCount)) return false;\n this.gpuLive = true;\n this.gpuParamsDirty = true;\n for (const key of this.active) this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n } else if (!want && this.gpuLive) this.gpuStop(null);\n return this.gpuLive;\n }\n\n /** Sends the rest of a lead batch to the GPU (before anything else touches its state). */\n private gpuFinishPlan(): void {\n const plan = this.gpuPlan;\n this.gpuPlan = null;\n if (!plan || plan.done >= plan.total || !this.gpu) return;\n this.gpu.step(plan.jobs, (plan.parity + plan.done) & 1, plan.total - plan.done).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n }\n\n /**\n * Lead mode: steps the GPU up to `steps` further into the batch the CPU is running (never past\n * it, so the GPU is never ahead of the CPU's next edit). Returns the steps taken.\n */\n gpuLead(steps: number): number {\n const plan = this.gpuPlan;\n if (!plan || !this.gpu || !this.gpuLive) return 0;\n const n = Math.max(0, Math.min(Math.floor(steps), plan.total - plan.done));\n if (!n) return 0;\n this.gpu.step(plan.jobs, (plan.parity + plan.done) & 1, n).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n plan.done += n;\n return n;\n }\n\n /** Steps the GPU is ahead of the CPU's last finished batch (lead mode), 0 otherwise. */\n get gpuAhead(): number {\n return this.gpuPlan && this.busyFlag ? this.gpuPlan.done : 0;\n }\n\n /** Whether the GPU can show steps the CPU has not finished (a lead batch is running). */\n get gpuLeading(): boolean {\n return Boolean(this.gpuLive && this.gpuPlan && this.busyFlag && this.gpuPlan.done < this.gpuPlan.total);\n }\n\n /** Uploads what the CPU changed since the last upload (the current set and deposits; whole slots on wake-up). */\n private gpuSync(): void {\n this.gpuFinishPlan();\n const gpu = this.gpu!;\n if (!gpu.ensureSlots(this.slotCount)) {\n this.gpuStop(null);\n return;\n }\n if (this.gpuParamsDirty) {\n for (const lane of this.lanes) if (lane) gpu.setParams(lane.index, this.f32.subarray((this.layout.params >> 2) + lane.index * PARAM_FLOATS, (this.layout.params >> 2) + (lane.index + 1) * PARAM_FLOATS));\n this.gpuParamsDirty = false;\n }\n if (!this.gpuDirty.size) return;\n for (const [slot, [y0, y1]] of this.gpuDirty) {\n const b = this.slotBase(slot);\n if (y0 === 0 && y1 === SLOT_SIDE - 1) {\n gpu.writeSlot(slot, 0, this.f32.subarray(b, b + SLOT_FLOATS));\n continue;\n }\n const from = y0 * SLOT_SIDE;\n const to = (y1 + 1) * SLOT_SIDE;\n const planes = [...Array(SET_PLANES).keys()].map((k) => this.parity * SET_PLANES + k).concat([P_D0, P_D0 + 1, P_D0 + 2, P_D0 + 3]);\n for (const plane of planes) gpu.writeSlot(slot, plane * PLANE + from, this.f32.subarray(b + plane * PLANE + from, b + plane * PLANE + to));\n }\n this.gpuDirty.clear();\n // The GPU refills halos from the uploaded interiors.\n gpu.refreshHalos(this.gpuJobs(this.active), this.parity);\n }\n\n private gpuJobs(keys: readonly number[]): WetGpuJob[] {\n const { tilesX, tilesY, perLane } = this.layout;\n return keys.map((key) => {\n const laneBase = this.laneIndexOf(key) * perLane;\n const [tx, ty] = this.tileXY(key);\n const at = (dx: number, dy: number) => {\n const x = tx + dx;\n const y = ty + dy;\n return x < 0 || y < 0 || x >= tilesX || y >= tilesY ? -1 : this.slotOf(laneBase + y * tilesX + x);\n };\n return {\n slot: this.slotOf(key),\n lane: this.laneIndexOf(key),\n neighbours: [at(0, -1), at(0, 1), at(-1, 0), at(1, 0), at(-1, -1), at(1, -1), at(-1, 1), at(1, 1)],\n width: Math.min(WET_TILE, this.width - tx * WET_TILE),\n height: Math.min(WET_TILE, this.height - ty * WET_TILE),\n };\n });\n }\n\n /** Runs the coming CPU batch of `n` steps on the GPU mirror too. */\n private gpuBatch(n: number): void {\n if (!this.gpu || !this.gpuDecide()) return;\n try {\n this.gpuSync();\n if (!this.gpuLive) return;\n const jobs = this.gpuJobs(this.active);\n if (this.gpuLeadMode) this.gpuPlan = { jobs, parity: this.parity, total: n, done: 0 };\n else this.gpu.step(jobs, this.parity, n).catch((e: Error) => this.gpuStop(`Wet paint stopped using the GPU (${e.message}).`));\n } catch (e) {\n this.gpuStop(`Wet paint stopped using the GPU (${(e as Error).message}).`);\n }\n }\n\n /**\n * Like `display`, but shades every stale tile on the GPU at once (when the mirror is in use;\n * otherwise, or when the world changed while the GPU worked, it is `display(id, maxCpuTiles)`).\n * Call between batches.\n */\n async displayGpu(id: string, maxCpuTiles = Infinity, lead = this.busyFlag): Promise<{ surface: TiledSurface; changed: RasterRect[]; pending: number; gpu: boolean }> {\n // Leading: the CPU is mid-batch and the GPU is partway through it; show the GPU's step.\n const plan = lead && this.gpuLive ? this.gpuPlan : null;\n if (!this.gpu || (this.busyFlag && !plan) || (!plan && !this.gpuDecide())) return { ...this.display(id, maxCpuTiles), gpu: false };\n const lane = this.laneOf(id);\n const keys = this.active.filter((k) => this.laneIndexOf(k) === lane.index);\n const stale = plan ? keys : keys.filter((k) => lane.shaded.get(this.tileKeyOf(k))?.stamp !== lane.stamp);\n if (!stale.length) return { ...this.display(id, 0), gpu: true };\n let tiles: Uint8ClampedArray[];\n const stamp = lane.stamp;\n const base = lane.base;\n try {\n if (!plan) this.gpuSync();\n const parity = plan ? (plan.parity + plan.done) & 1 : this.parity;\n tiles = await this.gpu.shade(this.gpuJobs(stale), parity, stale.map((k) => base.tiles.get(this.tileKeyOf(k))?.data ?? null), [this.paperBytes[0], this.paperBytes[1], this.paperBytes[2]]);\n } catch (e) {\n this.gpuStop(`Wet paint stopped using the GPU (${(e as Error).message}).`);\n return { ...this.display(id, maxCpuTiles), gpu: false };\n }\n // The world may have moved on while the GPU worked (an edit, a step): keep the result only if nothing changed.\n if (lane.stamp !== stamp || lane.base !== base || this.lanes[lane.index] !== lane) return { ...this.display(id, maxCpuTiles), gpu: false };\n const changed: RasterRect[] = [];\n stale.forEach((key, i) => {\n const tk = this.tileKeyOf(key);\n const tile = finishTile(new Uint8ClampedArray(tiles[i]), 4, 0);\n lane.shaded.set(tk, { stamp: lane.stamp, tile: tile ?? { data: new Uint8ClampedArray(0), uniform: 0 } });\n lane.urgent.delete(tk);\n const [tx, ty] = this.tileXY(key);\n changed.push({ x: tx * WET_TILE, y: ty * WET_TILE, width: WET_TILE, height: WET_TILE });\n });\n lane.shadedVersion++;\n const d = this.display(id, 0);\n return { surface: d.surface, changed, pending: 0, gpu: true };\n }\n\n // --- Snapshots -----------------------------------------------------------------\n\n /** A copy of everything (for undo): live slots, layers, clock and tilt. */\n snapshot(): WetSnapshot {\n this.requireIdle();\n const slots = new Map<number, { planes: Float32Array; last: number }>();\n let bytes = 0;\n for (const key of this.active) {\n const b = this.slotBase(this.slotOf(key));\n const planes = new Float32Array(SNAP_PLANES * PLANE);\n planes.set(this.f32.subarray(b + this.parity * SET_PLANES * PLANE, b + (this.parity + 1) * SET_PLANES * PLANE), 0);\n planes.set(this.f32.subarray(b + P_D0 * PLANE, b + (P_D0 + 4) * PLANE), SET_PLANES * PLANE);\n slots.set(key, { planes, last: this.u32[(this.layout.last >> 2) + key] });\n bytes += planes.byteLength;\n }\n const lanes = this.lanes.filter((l): l is Lane => Boolean(l)).map((l) => ({ id: l.id, index: l.index, params: { ...l.params }, flow: l.flow, flowStrength: l.flowStrength, base: l.base }));\n return { clock: this.clock, tilt: { ...this.tilt }, lanes, slots, bytes };\n }\n\n /** Puts a snapshot back exactly (the simulation then continues as it would have). */\n restore(snap: WetSnapshot): void {\n this.requireIdle();\n for (const key of [...this.active]) this.free(key);\n this.lanes.fill(null);\n this.tilt = { ...snap.tilt };\n for (const l of snap.lanes) {\n this.lanes[l.index] = { id: l.id, index: l.index, params: { ...l.params }, flow: l.flow, flowStrength: l.flowStrength, base: l.base, shaded: new Map(), urgent: new Set(), stamp: 1, display: null, shadedVersion: 0, displayKey: '' };\n this.pack(this.lanes[l.index]!);\n }\n for (const [key, { planes, last }] of snap.slots) {\n if (!this.activate(key)) continue;\n const b = this.slotBase(this.slotOf(key));\n this.f32.set(planes.subarray(0, SET_PLANES * PLANE), b + this.parity * SET_PLANES * PLANE);\n this.f32.set(planes.subarray(SET_PLANES * PLANE), b + P_D0 * PLANE);\n this.u32[(this.layout.last >> 2) + key] = last;\n }\n this.clock = snap.clock;\n this.syncList();\n this.refreshHalos();\n for (const key of this.active) this.gpuDirtySlot(this.slotOf(key), 0, SLOT_SIDE - 1);\n }\n\n /** Bytes of wasm memory held. */\n memoryBytes(): number {\n return this.memory.buffer.byteLength;\n }\n\n /** Live tiles across all layers. */\n activeTiles(): number {\n return this.active.length;\n }\n\n /** Memory for tests and tools: the raw f32 view (read only, please). */\n get rawFloats(): Float32Array {\n return this.f32;\n }\n\n /** The current set's parity (tests). */\n get currentParity(): number {\n return this.parity;\n }\n\n /** Float index of a slot's first plane (tests). */\n slotIndex(id: string, tx: number, ty: number): number {\n const lane = this.laneOf(id);\n const slot = this.slotOf(lane.index * this.layout.perLane + ty * this.layout.tilesX + tx);\n return slot < 0 ? -1 : this.slotBase(slot);\n }\n}\n\nfunction unionRect(a: RasterRect | null, b: RasterRect): RasterRect {\n if (!a) return { ...b };\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.max(a.x + a.width, b.x + b.width) - x, height: Math.max(a.y + a.height, b.y + b.height) - y };\n}\n\n","/**\n * Flow maps: a push on the water at every cell (cells per step², like tilt), from a few generated\n * patterns. Every pattern is computed with + − × ÷ only, so it is the same in every engine.\n */\n\nimport type { WetFlowField } from './world';\n\nexport type WetFlowKind = 'none' | 'linear' | 'swirl' | 'radial' | 'turbulent';\n\nexport const WET_FLOW_KINDS: readonly WetFlowKind[] = ['none', 'linear', 'swirl', 'radial', 'turbulent'];\n\n/** A flow map as settings (saved with the document). */\nexport interface WetFlowSpec {\n kind: WetFlowKind;\n /** 0..1: how hard it pushes (1 is about as strong as a 25° tilt). */\n strength: number;\n /** `linear`: direction in degrees clockwise from canvas down. */\n angle: number;\n /** `swirl` / `radial`: centre in document pixels (default the canvas centre). */\n center?: { x: number; y: number };\n /** `swirl`: true turns clockwise. */\n clockwise: boolean;\n /** `turbulent`: eddy size in pixels (8..1024). */\n scale: number;\n seed: number;\n}\n\nexport const DEFAULT_FLOW: Readonly<WetFlowSpec> = { kind: 'none', strength: 0.5, angle: 0, clockwise: true, scale: 120, seed: 1 };\n\n/** Acceleration of a flow map at strength 1, cells per step². */\nconst FLOW_ACCEL = 0.01;\n\n/** sin and cos of an angle in radians, by range reduction and Taylor series (deterministic). */\nexport function dsincos(a: number): [number, number] {\n const twoPi = 6.283185307179586;\n let x = a - Math.round(a / twoPi) * twoPi;\n // reduce to [−π/4, π/4] by quadrant\n const q = Math.round(x / (twoPi / 4));\n x -= q * (twoPi / 4);\n const x2 = x * x;\n let s = x;\n let c = 1;\n let ts = x;\n let tc = 1;\n for (let i = 1; i < 12; i++) {\n ts *= -x2 / ((2 * i) * (2 * i + 1));\n tc *= -x2 / ((2 * i - 1) * (2 * i));\n s += ts;\n c += tc;\n }\n switch (((q % 4) + 4) % 4) {\n case 0:\n return [s, c];\n case 1:\n return [c, -s];\n case 2:\n return [-s, -c];\n default:\n return [-c, s];\n }\n}\n\nfunction hash(x: number, y: number, seed: number): number {\n let h = (Math.imul(x | 0, 374761393) + Math.imul(y | 0, 668265263) + Math.imul(seed | 0, 1442695041)) | 0;\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n h ^= h >>> 16;\n return (h >>> 0) / 4294967296;\n}\n\nfunction valueNoise(x: number, y: number, seed: number): number {\n const x0 = Math.floor(x);\n const y0 = Math.floor(y);\n const fx = x - x0;\n const fy = y - y0;\n const sx = fx * fx * (3 - 2 * fx);\n const sy = fy * fy * (3 - 2 * fy);\n const a = hash(x0, y0, seed);\n const b = hash(x0 + 1, y0, seed);\n const c = hash(x0, y0 + 1, seed);\n const d = hash(x0 + 1, y0 + 1, seed);\n return a + (b - a) * sx + (c - a) * sy + (a - b - c + d) * sx * sy;\n}\n\n/** Settings with every field in range. */\nexport function normalizeFlow(raw: Partial<WetFlowSpec> = {}, base: WetFlowSpec = DEFAULT_FLOW): WetFlowSpec {\n const num = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\n const kind = WET_FLOW_KINDS.includes(raw.kind as WetFlowKind) ? (raw.kind as WetFlowKind) : base.kind;\n const center = raw.center && Number.isFinite(raw.center.x) && Number.isFinite(raw.center.y) ? { x: raw.center.x, y: raw.center.y } : base.center;\n return {\n kind,\n strength: Math.min(1, Math.max(0, num(raw.strength, base.strength))),\n angle: ((num(raw.angle, base.angle) % 360) + 360) % 360,\n ...(center ? { center } : {}),\n clockwise: typeof raw.clockwise === 'boolean' ? raw.clockwise : base.clockwise,\n scale: Math.min(1024, Math.max(8, num(raw.scale, base.scale))),\n seed: Math.abs(Math.round(num(raw.seed, base.seed))) % 2147483647,\n };\n}\n\n/** The flow field of a spec on a canvas, or `null` for `none` (strength is applied by the world). */\nexport function flowField(spec: WetFlowSpec, width: number, height: number): WetFlowField | null {\n const k = FLOW_ACCEL;\n const cx = spec.center?.x ?? width / 2;\n const cy = spec.center?.y ?? height / 2;\n const r0 = Math.max(width, height) / 2;\n switch (spec.kind) {\n case 'none':\n return null;\n case 'linear': {\n const [s, c] = dsincos((spec.angle * Math.PI) / 180);\n const v = [-s * k, c * k] as const;\n return () => v;\n }\n case 'swirl': {\n const sign = spec.clockwise ? 1 : -1;\n return (x, y) => [(-(y - cy) / r0) * k * sign, ((x - cx) / r0) * k * sign];\n }\n case 'radial':\n return (x, y) => [((x - cx) / r0) * k, ((y - cy) / r0) * k];\n case 'turbulent': {\n // The curl of value noise: divergence-free eddies.\n const sc = spec.scale;\n const e = 0.5;\n return (x, y) => {\n const u = x / sc;\n const v = y / sc;\n const dndy = (valueNoise(u, v + e / sc, spec.seed) - valueNoise(u, v - e / sc, spec.seed)) * sc;\n const dndx = (valueNoise(u + e / sc, v, spec.seed) - valueNoise(u - e / sc, v, spec.seed)) * sc;\n return [dndy * k * 0.5, -dndx * k * 0.5];\n };\n }\n }\n}\n","/**\n * The wet layer as a `PaintMedium`: the canvas side of the shared pick-up / mix exchange\n * (`PaintExchange`), so wet brushes pick up and mix paint the same way the Mixer Brush and the\n * phase 2 dab brushes do.\n *\n * - `sample` sees only wet paint (pigment still suspended in surface water): what a brush can\n * lift. Its colour is the suspended pigment's hue at full strength; contact is how much of the\n * footprint is wet with pigment in it.\n * - `deposit` lays water and pigment: the colour becomes Kubelka-Munk pigment (`pigmentOf` at the\n * brush's body), at `mass` per unit of coverage, with `water` depth.\n */\n\nimport type { PaintMedium, PaintSample, RgbTriple } from '../exchange';\nimport type { Pigment } from '../pigment';\nimport type { RasterRect } from '../../raster/surface';\nimport { pigmentColor, pigmentOf } from './film';\nimport type { WetWorld } from './world';\n\nexport interface WetMediumOptions {\n /** Water depth laid per unit of coverage (at deposit weight 1). */\n water: number;\n /** Pigment mass laid per unit of coverage (at deposit weight 1). */\n mass: number;\n /** 0 transparent watercolour .. 1 opaque gouache. */\n body: number;\n}\n\n/** The strongest absorption (K) a sampled colour is scaled to: its hue at full strength. */\nconst SAMPLE_K = 3;\n\nexport class WetMedium implements PaintMedium {\n private readonly pig = new Float64Array(4);\n\n constructor(\n readonly world: WetWorld,\n readonly laneId: string,\n public options: WetMediumOptions\n ) {}\n\n sample(rect: RasterRect, cov: ArrayLike<number>): PaintSample | null {\n const s = this.world.sample(this.laneId, rect, cov);\n if (!(s.wet > 0) || !(s.weight > 0)) return null;\n const k = s.pigment;\n const kmax = Math.max(k[0], k[1], k[2]);\n if (!(kmax > 1e-9)) return null;\n const f = SAMPLE_K / kmax;\n const rgb = pigmentColor(k[0] * f, k[1] * f, k[2] * f, k[3] * f) as RgbTriple;\n // Mass per wet cell, against a moderate wash (0.02 of K per cell).\n const density = Math.min(1, (k[0] + k[1] + k[2]) / s.wet / 0.06);\n return { rgb, contact: (s.wet / s.weight) * density };\n }\n\n deposit(rect: RasterRect, cov: ArrayLike<number>, dep: number, paint: Readonly<RgbTriple>, _pigment: Pigment | null, field: Float32Array | null = null): void {\n const { water, mass, body } = this.options;\n if (field) {\n const n = rect.width * rect.height;\n const out = new Float32Array(n * 4);\n const one = this.pig;\n for (let p = 0; p < n; p++) {\n pigmentOf([field[p * 3], field[p * 3 + 1], field[p * 3 + 2]], body, one);\n for (let q = 0; q < 4; q++) out[p * 4 + q] = one[q] * mass * dep;\n }\n this.world.paint(this.laneId, rect, cov, water * dep, null, out);\n return;\n }\n pigmentOf(paint, body, this.pig);\n const pig = [0, 1, 2, 3].map((q) => this.pig[q] * mass * dep);\n this.world.paint(this.laneId, rect, cov, water * dep, mass > 0 ? pig : null);\n }\n}\n","/**\n * WGSL compute kernels of the WebGPU wet-media engine (\"Engine B\"): a port of the step in\n * `kernel.ts` (the specification), the halo exchange of `WetWorld`, and the display shading of\n * `film.ts`, on the same slot layout as the CPU engine (a slot is `SLOT_PLANES` planes of 258 × 258\n * f32 at a float offset), so CPU state uploads as it is.\n *\n * The GPU does not give the CPU's bits: shader compilers may fuse multiply-adds and use their own\n * `exp` / `pow`, and two browsers on one GPU already differ. It stays within about 1/255 of the CPU\n * in the shaded pixels, which is what a display needs. Nothing saved is computed here.\n */\n\nimport { DRY_EPS, P_D0, P_EDGE, P_FX, P_FY, P_H, P_P0, P_RHO, P_SW, P_UX, P_UY, PARAM, PARAM_FLOATS, PLANE, SET_PLANES, SLOT_SIDE, STRIP, U_MAX } from './model';\nimport { HIDE } from './film';\n\n/** Words per job record: slot base (float offset), lane, the 8 neighbour bases, tile width and height, base tile index. */\nexport const GPU_JOB_WORDS = 16;\n/** `0xffffffff`: no neighbour / no base tile. */\nexport const GPU_NONE = 0xffffffff;\n/** Neighbour order in a job record. */\nexport const GPU_NB = ['n', 's', 'w', 'e', 'nw', 'ne', 'sw', 'se'] as const;\n\nconst common = /* wgsl */ `\nconst S: u32 = ${SLOT_SIDE}u;\nconst PL: u32 = ${PLANE}u;\nconst SETP: u32 = ${SET_PLANES}u;\nconst NONE: u32 = 0xffffffffu;\nstruct Job {\n base: u32,\n lane: u32,\n nb: array<u32, 8>,\n w: u32,\n h: u32,\n src: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n};\nstruct Uni {\n parity: u32,\n mode: u32,\n paper: u32,\n pad: u32,\n};\n`;\n\nconst NBO = [0, -1, -SLOT_SIDE, 1, SLOT_SIDE, -SLOT_SIDE - 1, -SLOT_SIDE + 1, SLOT_SIDE + 1, SLOT_SIDE - 1];\nconst OPPK = [0, 3, 4, 1, 2, 7, 8, 5, 6];\nconst off = (o: number) => (o < 0 ? `c - ${-o}u` : `c + ${o}u`);\n\n/** Streaming, unrolled (dynamic indexing of private arrays is slow on GPUs). */\nfunction stream(): string {\n let out = '';\n for (let k = 1; k <= 8; k++) {\n const n = off(NBO[k]);\n out += `\n let hn${k} = st[hP + ${n}];\n let rn${k} = st[rhoS + ${n}];\n let dampN${k} = max(0.0, 1.0 - st[swS + ${n}] * invCap);\n if (rn${k} < EPS && !(hn${k} < 0.0)) { dryNb = dryNb + dampN${k}; }\n var b${k} = max(kx, blockScale * hn${k});\n if (hn${k} < 0.0 || xWall || (rxDry && rn${k} < pinX) || (rn${k} < EPS && rx < (pinT + rough * hn${k}) * dampN${k})) { b${k} = 1.0; }\n let f${k} = (1.0 - b${k}) * st[src + ${k}u * PL + ${n}] + b${k} * st[src + ${OPPK[k]}u * PL + c];`;\n }\n return out;\n}\n\n/** Collision, unrolled. */\nfunction collide(): string {\n const eu = ['', 'ux', 'uy', '-ux', '-uy', '(ux + uy)', '(uy - ux)', '-(ux + uy)', '(ux - uy)'];\n let out = '';\n for (let k = 1; k <= 8; k++) {\n out += `\n { let eu = ${eu[k]}; let feq = ${k < 5 ? 'wr1' : 'wr2'} * (1.0 + 3.0 * eu + 4.5 * eu * eu - usq); st[dst + ${k}u * PL + c] = (f${k} + omega * (feq - f${k})) * scale; }`;\n }\n return out;\n}\n\n/** Pigment faces (east, west, south, north), unrolled. */\nfunction faces(): string {\n const nbs = ['c + 1u', 'c - 1u', 'c + S', 'c - S'];\n let out = '';\n nbs.forEach((nb, face) => {\n const outF = face === 0 || face === 2;\n const uf = face < 2 ? `mobility * (uxc + st[uxS + ${nb}])` : `mobility * (uyc + st[uyS + ${nb}])`;\n out += `\n {\n let nb = ${nb};\n let uf = ${uf};\n let pn = vec4<f32>(st[pS + nb], st[pS + PL + nb], st[pS + 2u * PL + nb], st[pS + 3u * PL + nb]);\n let flux = ${outF ? 'select(uf * pn, uf * pc, uf > 0.0)' : 'select(uf * pc, uf * pn, uf > 0.0)'};\n let v = pNew ${outF ? '-' : '+'} flux + bleed * (pn - pc);\n if (rxWet && st[rhoS + nb] >= EPS) { pNew = v; }\n }`;\n });\n return out;\n}\n\n/** One step of every job's tile: `dispatchWorkgroups(16, 16, jobs)`. */\nexport const WGSL_STEP = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read_write> st: array<f32>;\n@group(0) @binding(1) var<storage, read> prm: array<f32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(3) var<storage, read_write> flags: array<atomic<u32>>;\n@group(0) @binding(4) var<uniform> u: Uni;\nvar<workgroup> wflags: atomic<u32>;\n\nconst EPS: f32 = ${DRY_EPS};\nconst UMAX: f32 = ${U_MAX};\nconst W0: f32 = ${4 / 9};\nconst W1: f32 = ${1 / 9};\nconst W2: f32 = ${1 / 36};\nconst TINY: f32 = 1e-9;\nconst DECAY: f32 = 0.99;\nconst STRIP: u32 = ${STRIP}u;\n\nfn P(i: u32, lane: u32) -> f32 { return prm[lane * ${PARAM_FLOATS}u + i]; }\n\n@compute @workgroup_size(16, 16, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>, @builtin(local_invocation_index) li: u32) {\n if (li == 0u) { atomicStore(&wflags, 0u); }\n workgroupBarrier();\n let job = jobs[gid.z];\n let x = gid.x + 1u;\n let y = gid.y + 1u;\n let c = y * S + x;\n let base = job.base;\n let src = base + u.parity * SETP * PL;\n let dst = base + (1u - u.parity) * SETP * PL;\n let hP = base + ${P_H}u * PL;\n let dP = base + ${P_D0}u * PL;\n let rhoS = src + ${P_RHO}u * PL;\n let swS = src + ${P_SW}u * PL;\n let uxS = src + ${P_UX}u * PL;\n let uyS = src + ${P_UY}u * PL;\n let pS = src + ${P_P0}u * PL;\n let eS = src + ${P_EDGE}u * PL;\n let L = job.lane;\n let omega = P(${PARAM.omega}u, L);\n let tau = P(${PARAM.tau}u, L);\n let evap = P(${PARAM.evap}u, L);\n let edgeEvap = P(${PARAM.edgeEvap}u, L);\n let mobility = P(${PARAM.mobility}u, L);\n let depRate = P(${PARAM.depRate}u, L);\n let pickup = P(${PARAM.pickup}u, L);\n let absorption = P(${PARAM.absorption}u, L);\n let invCap = P(${PARAM.invCap}u, L);\n let blockScale = P(${PARAM.blockScale}u, L);\n let rough = P(${PARAM.rough}u, L);\n let pinT = P(${PARAM.pinT}u, L);\n let flowK = P(${PARAM.flowK}u, L);\n let gran = P(${PARAM.granulation}u, L);\n let edgeDep = P(${PARAM.edgeDep}u, L);\n let bloom = P(${PARAM.bloom}u, L);\n let paperEvap = P(${PARAM.paperEvap}u, L);\n let hasFlow = P(${PARAM.hasFlow}u, L) != 0.0;\n let bleed = P(${PARAM.bleed}u, L);\n\n let hx = st[hP + c];\n let kx = blockScale * hx;\n let rx = st[rhoS + c];\n let sx = st[swS + c];\n let damp = max(0.0, 1.0 - sx * invCap);\n let pinX = (pinT + rough * hx) * damp;\n let rxDry = rx < EPS;\n let xWall = hx < 0.0;\n\n // 1. streaming with partial bounce-back and pinning (n = x − e_k)\n var dryNb = 0.0;\n let f0 = st[src + c];\n${stream()}\n // 2. depth, velocity, forcing\n let rho = f0 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8;\n let mx = f1 - f3 + f5 - f6 - f7 + f8;\n let my = f2 - f4 + f5 + f6 - f7 - f8;\n var gx = P(${PARAM.gx}u, L);\n var gy = P(${PARAM.gy}u, L);\n if (hasFlow) {\n gx = gx + flowK * st[base + ${P_FX}u * PL + c];\n gy = gy + flowK * st[base + ${P_FY}u * PL + c];\n }\n var ux = 0.0;\n var uy = 0.0;\n if (rho > EPS) {\n ux = mx / rho + tau * gx;\n uy = my / rho + tau * gy;\n }\n let sp2 = ux * ux + uy * uy;\n if (sp2 > UMAX * UMAX) {\n let sc = UMAX / sqrt(sp2);\n ux = ux * sc;\n uy = uy * sc;\n }\n\n // 3. absorption and evaporation\n let absorbed = min(rho, absorption * (1.0 - 0.5 * hx) * rho * damp);\n let ex = st[eS + c];\n var ev = 0.0;\n if (rho > 0.0) { ev = evap * (1.0 + edgeEvap * ex); }\n let rhoNew = max(0.0, rho - absorbed - ev);\n var scale = 0.0;\n if (rho > TINY) { scale = rhoNew / rho; }\n var sEv = 0.0;\n if (sx > 0.0) { sEv = paperEvap; }\n let sNew = max(0.0, sx + absorbed - sEv);\n st[dst + ${P_SW}u * PL + c] = sNew;\n\n // 4. collision, then scale\n let usq = 1.5 * (ux * ux + uy * uy);\n let wr0 = W0 * rho;\n let wr1 = W1 * rho;\n let wr2 = W2 * rho;\n st[dst + c] = (f0 + omega * (wr0 * (1.0 - usq) - f0)) * scale;\n${collide()}\n\n // 5. pigment: upwind advection with the last step's velocities, plus bleed\n let rxWet = !rxDry;\n let uxc = st[uxS + c];\n let uyc = st[uyS + c];\n var pNew = vec4<f32>(st[pS + c], st[pS + PL + c], st[pS + 2u * PL + c], st[pS + 3u * PL + c]);\n let pc = pNew;\n${faces()}\n\n // 6. deposition and pickup\n let dryNow = rhoNew < EPS;\n let rate = depRate * (1.0 + gran * (1.0 - hx)) * (1.0 + edgeDep * ex);\n var lift = 0.0;\n if (!dryNow) { lift = pickup * min(rhoNew, 1.0) * (1.0 + bloom * max(0.0, rhoNew - rx)); }\n for (var q = 0u; q < 4u; q++) {\n let pq = max(0.0, pNew[q]);\n let dq = st[dP + q * PL + c];\n var dep = min(pq, pq * rate);\n if (dryNow) { dep = pq; }\n let lq = dq * lift;\n st[dst + (${P_P0}u + q) * PL + c] = pq - dep + lq;\n st[dP + q * PL + c] = dq + dep - lq;\n }\n let mean4 = (st[eS + c + 1u] + st[eS + c - 1u] + st[eS + c + S] + st[eS + c - S]) * 0.25;\n let eNew = min(1.0, max(min(1.0, dryNb * 0.25), DECAY * mean4));\n st[dst + ${P_EDGE}u * PL + c] = select(eNew, 0.0, dryNow);\n st[dst + ${P_RHO}u * PL + c] = rhoNew;\n st[dst + ${P_UX}u * PL + c] = select(ux, 0.0, dryNow);\n st[dst + ${P_UY}u * PL + c] = select(uy, 0.0, dryNow);\n var fl = 0u;\n if (rhoNew > 0.0 || sNew > 0.0) {\n fl = 1u;\n let lx = gid.x;\n let ly = gid.y;\n if (lx < STRIP) { fl = fl | 2u; }\n if (lx >= 256u - STRIP) { fl = fl | 4u; }\n if (ly < STRIP) { fl = fl | 8u; }\n if (ly >= 256u - STRIP) { fl = fl | 16u; }\n }\n if (!dryNow) { fl = fl | 32u; }\n if (fl != 0u) { atomicOr(&wflags, fl); }\n workgroupBarrier();\n if (li == 0u) {\n let wf = atomicLoad(&wflags);\n if (wf != 0u) { atomicOr(&flags[gid.z], wf); }\n }\n}\n`;\n\n/**\n * Fills each job's halo in set `parity` (the set just written) from its neighbours, as\n * `WetWorld.haloTs` does: `dispatchWorkgroups(17, SET_PLANES, jobs)`. A missing neighbour leaves\n * the halo as it is.\n */\nexport const WGSL_HALO = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read_write> st: array<f32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(4) var<uniform> u: Uni;\n\n@compute @workgroup_size(64, 1, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let i = gid.x;\n if (i >= 4u * S) { return; }\n let job = jobs[gid.z];\n let side = i / S;\n let j = i % S;\n let off = u.parity * SETP * PL + gid.y * PL;\n var srcSlot = NONE;\n var fc = 0u;\n var tc = 0u;\n if (side == 0u) {\n tc = j;\n if (j == 0u) { srcSlot = job.nb[4]; fc = 256u * S + 256u; }\n else if (j == S - 1u) { srcSlot = job.nb[5]; fc = 256u * S + 1u; }\n else { srcSlot = job.nb[0]; fc = 256u * S + j; }\n } else if (side == 1u) {\n tc = (S - 1u) * S + j;\n if (j == 0u) { srcSlot = job.nb[6]; fc = S + 256u; }\n else if (j == S - 1u) { srcSlot = job.nb[7]; fc = S + 1u; }\n else { srcSlot = job.nb[1]; fc = S + j; }\n } else if (side == 2u) {\n if (j == 0u || j == S - 1u) { return; }\n tc = j * S;\n srcSlot = job.nb[2];\n fc = j * S + 256u;\n } else {\n if (j == 0u || j == S - 1u) { return; }\n tc = j * S + S - 1u;\n srcSlot = job.nb[3];\n fc = j * S + 1u;\n }\n if (srcSlot == NONE) { return; }\n st[job.base + off + tc] = st[srcSlot + off + fc];\n}\n`;\n\n/**\n * Shades each job's tile for display over its base tile (or transparent), as `film.ts`'s\n * `shadeTile` does in 'display' mode (mode 0) or 'bake-all' (mode 1, a preview of drying):\n * `dispatchWorkgroups(16, 16, jobs)`. Writes RGBA8 (packed little-endian u32) per pixel.\n */\nexport const WGSL_SHADE = /* wgsl */ `${common}\n@group(0) @binding(0) var<storage, read> st: array<f32>;\n@group(0) @binding(1) var<storage, read> srcTiles: array<u32>;\n@group(0) @binding(2) var<storage, read> jobs: array<Job>;\n@group(0) @binding(3) var<storage, read_write> outTiles: array<u32>;\n@group(0) @binding(4) var<uniform> u: Uni;\n\nconst HIDE: f32 = ${HIDE};\n\nfn toLinear(v: f32) -> f32 {\n let x = clamp(v / 255.0, 0.0, 1.0);\n return select(pow((x + 0.055) / 1.055, 2.4), x / 12.92, x <= 0.04045);\n}\nfn toByte(v: f32) -> f32 {\n let x = clamp(v, 0.0, 1.0);\n let e = select(1.055 * pow(x, 1.0 / 2.4) - 0.055, 12.92 * x, x <= 0.0031308);\n return clamp(round(e * 255.0), 0.0, 255.0);\n}\nfn rinf(ks: f32) -> f32 { return 1.0 + ks - sqrt(ks * ks + 2.0 * ks); }\nfn needAlpha(e: f32, p: f32, a: f32) -> f32 {\n if (e < p) { return max(a, 1.0 - e / p); }\n if (e > p) { return max(a, (e - p) / (255.0 - p)); }\n return a;\n}\n\n@compute @workgroup_size(16, 16, 1)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let job = jobs[gid.z];\n let x = gid.x;\n let y = gid.y;\n let o = gid.z * 65536u + y * 256u + x;\n var px = 0u;\n if (job.src != NONE) { px = srcTiles[job.src * 65536u + y * 256u + x]; }\n if (x >= job.w || y >= job.h) { outTiles[o] = px; return; }\n let c = (y + 1u) * S + x + 1u;\n let cur = job.base + u.parity * SETP * PL;\n let d = job.base + ${P_D0}u * PL;\n let p = cur + ${P_P0}u * PL;\n var k = vec4<f32>(st[d + c], st[d + PL + c], st[d + 2u * PL + c], st[d + 3u * PL + c]);\n k = k + vec4<f32>(st[p + c], st[p + PL + c], st[p + 2u * PL + c], st[p + 3u * PL + c]);\n var wet = 0.0;\n if (u.mode == 0u) { wet = min(1.0, st[cur + ${P_RHO}u * PL + c] * 4.0 + st[cur + ${P_SW}u * PL + c]); }\n if (!(k.x > 1e-7 || k.y > 1e-7 || k.z > 1e-7 || k.w > 1e-7) && wet <= 0.0) { outTiles[o] = px; return; }\n let paper = vec3<f32>(f32(u.paper & 255u), f32((u.paper >> 8u) & 255u), f32((u.paper >> 16u) & 255u));\n let pr = vec4<f32>(f32(px & 255u), f32((px >> 8u) & 255u), f32((px >> 16u) & 255u), f32(px >> 24u));\n let a = pr.w / 255.0;\n let below = vec3<f32>(toLinear(a * pr.x + (1.0 - a) * paper.x), toLinear(a * pr.y + (1.0 - a) * paper.y), toLinear(a * pr.z + (1.0 - a) * paper.z));\n let s = k.w;\n var hide = 0.0;\n if (s > 0.0) { hide = 1.0 - exp(-HIDE * s); }\n let keep = 1.0 - hide;\n var inv = 0.0;\n if (s > 1e-9) { inv = 1.0 / s; }\n var film = keep * exp(-2.0 * k.xyz) * below;\n if (hide > 0.0) { film = film + hide * vec3<f32>(rinf(k.x * inv), rinf(k.y * inv), rinf(k.z * inv)); }\n let dark = 1.0 - 0.07 * wet;\n let e = vec3<f32>(toByte(film.x * dark), toByte(film.y * dark), toByte(film.z * dark));\n var alpha = a;\n alpha = needAlpha(e.x, paper.x, alpha);\n alpha = needAlpha(e.y, paper.y, alpha);\n alpha = needAlpha(e.z, paper.z, alpha);\n if (alpha <= 0.0) { outTiles[o] = px & 0x00ffffffu; return; }\n let a8 = max(round(min(1.0, alpha) * 255.0), pr.w);\n let al = a8 / 255.0;\n let kk = 1.0 - al;\n let rgb = clamp(round((e - kk * paper) / al), vec3<f32>(0.0), vec3<f32>(255.0));\n outTiles[o] = u32(rgb.x) | (u32(rgb.y) << 8u) | (u32(rgb.z) << 16u) | (u32(a8) << 24u);\n}\n`;\n","/**\n * Engine B: the wet-media step and display shading on WebGPU, an accelerator for large wet areas.\n *\n * The CPU engine (`WetWorld`, WebAssembly SIMD) stays the authority: it owns the clock, edits,\n * drying, save, export and replay, and gives the same bits everywhere. This engine mirrors the CPU\n * state on the GPU (same slot layout, uploaded region by region as the CPU edits it), steps it and\n * shades it into RGBA8 tiles for display. Its results stay within about 1/255 of the CPU's but are\n * not bit-identical (shader compilers differ), so nothing it computes is ever saved.\n *\n * DOM-free and dependency-free: it takes a `navigator.gpu`-like object (or finds one) and uses\n * only the WebGPU API. Without one, `createWetGpuEngine` says why and the CPU does everything.\n */\n\nimport { GPU_JOB_WORDS, GPU_NONE, WGSL_HALO, WGSL_SHADE, WGSL_STEP } from './gpu-kernels';\nimport { MAX_WET_LANES, MAX_WET_SLOTS } from './world';\nimport { PARAM_FLOATS, SET_PLANES, SLOT_BYTES, SLOT_PLANES, PLANE } from './model';\n\n/** Floats per slot. */\nconst SLOT_FLOATS = SLOT_PLANES * PLANE;\nconst TILE_WORDS = 256 * 256;\n\n// WebGPU constants (GPUBufferUsage, GPUMapMode), so this runs without the globals.\nconst MAP_READ = 0x1;\nconst COPY_SRC = 0x4;\nconst COPY_DST = 0x8;\nconst UNIFORM = 0x40;\nconst STORAGE = 0x80;\n\n/* Just the WebGPU surface this engine uses (the repo has no @webgpu/types). */\ninterface GBuffer {\n readonly size: number;\n destroy(): void;\n mapAsync(mode: number, offset?: number, size?: number): Promise<void>;\n getMappedRange(offset?: number, size?: number): ArrayBuffer;\n unmap(): void;\n}\ninterface GPass {\n setPipeline(p: unknown): void;\n setBindGroup(i: number, g: unknown): void;\n dispatchWorkgroups(x: number, y?: number, z?: number): void;\n end(): void;\n}\ninterface GEncoder {\n beginComputePass(): GPass;\n copyBufferToBuffer(src: GBuffer, so: number, dst: GBuffer, d: number, size: number): void;\n clearBuffer(b: GBuffer, offset?: number, size?: number): void;\n finish(): unknown;\n}\ninterface GQueue {\n writeBuffer(b: GBuffer, offset: number, data: ArrayBufferView | ArrayBufferLike, dataOffset?: number, size?: number): void;\n submit(cmds: unknown[]): void;\n onSubmittedWorkDone(): Promise<void>;\n}\ninterface GPipeline {\n getBindGroupLayout(i: number): unknown;\n}\ninterface GDevice {\n readonly queue: GQueue;\n readonly limits: Record<string, number>;\n readonly lost?: Promise<{ message?: string; reason?: string }>;\n createBuffer(d: { size: number; usage: number; label?: string }): GBuffer;\n createShaderModule(d: { code: string; label?: string }): unknown;\n createComputePipeline(d: { layout: 'auto'; compute: { module: unknown; entryPoint: string }; label?: string }): GPipeline;\n createComputePipelineAsync?(d: { layout: 'auto'; compute: { module: unknown; entryPoint: string }; label?: string }): Promise<GPipeline>;\n createBindGroup(d: { layout: unknown; entries: { binding: number; resource: { buffer: GBuffer; offset?: number; size?: number } }[] }): unknown;\n createCommandEncoder(): GEncoder;\n pushErrorScope?(filter: string): void;\n popErrorScope?(): Promise<{ message: string } | null>;\n destroy(): void;\n}\ninterface GAdapter {\n readonly limits: Record<string, number>;\n readonly info?: { vendor?: string; architecture?: string; description?: string };\n requestDevice(d?: { requiredLimits?: Record<string, number>; label?: string }): Promise<GDevice>;\n}\n/** A `navigator.gpu`-like object. */\nexport interface WetGpuProvider {\n requestAdapter(options?: { powerPreference?: 'high-performance' | 'low-power' }): Promise<unknown>;\n}\n\n/** Whether Engine B can run here, and if not, why. */\nexport interface WetGpuSupport {\n supported: boolean;\n /** Why not (no WebGPU, no adapter, too little buffer space, the device failed), or `null`. */\n reason: string | null;\n /** The GPU's vendor and architecture, when known. */\n adapter: string | null;\n /** Most wet tiles (256 px, all layers) the GPU can hold. */\n maxSlots: number;\n}\n\n/** A tile to step or shade: its slot, lane, the slots of its 8 neighbours, and its size on the canvas. */\nexport interface WetGpuJob {\n slot: number;\n lane: number;\n /** Neighbour slots in the order n, s, w, e, nw, ne, sw, se; −1 for none. */\n neighbours: readonly number[];\n /** Pixels of the tile on the canvas (256 except at the right and bottom edges). */\n width: number;\n height: number;\n}\n\n/** The `navigator.gpu` of this context, if any. */\nexport function findWebGpu(): WetGpuProvider | null {\n const nav = (globalThis as { navigator?: { gpu?: WetGpuProvider } }).navigator;\n return nav?.gpu ?? null;\n}\n\n/**\n * Starts Engine B on `gpu` (default `navigator.gpu`). Resolves with the engine, or `null` and the\n * reason it cannot run (no WebGPU, no adapter, too little storage-buffer space, a failed device).\n */\nexport async function createWetGpuEngine(gpu: WetGpuProvider | null = findWebGpu()): Promise<{ engine: WetGpuEngine | null; support: WetGpuSupport }> {\n const no = (reason: string, adapter: string | null = null) => ({ engine: null, support: { supported: false, reason, adapter, maxSlots: 0 } });\n if (!gpu || typeof gpu.requestAdapter !== 'function') return no('This browser has no WebGPU (navigator.gpu); wet paint runs on the CPU.');\n let adapter: GAdapter | null;\n try {\n adapter = (await gpu.requestAdapter({ powerPreference: 'high-performance' })) as GAdapter | null;\n } catch (e) {\n return no(`WebGPU gave no adapter (${(e as Error).message}); wet paint runs on the CPU.`);\n }\n if (!adapter) return no('WebGPU gave no adapter (the GPU may be blocklisted); wet paint runs on the CPU.');\n const name = [adapter.info?.vendor, adapter.info?.architecture].filter(Boolean).join(' ') || null;\n const binding = Math.min(adapter.limits.maxStorageBufferBindingSize ?? 0, adapter.limits.maxBufferSize ?? 0);\n const maxSlots = Math.min(MAX_WET_SLOTS, Math.floor(binding / SLOT_BYTES));\n if (maxSlots < 4) return no(`The GPU's storage buffers hold ${Math.max(0, maxSlots)} wet tiles; at least 4 are needed. Wet paint runs on the CPU.`, name);\n let device: GDevice;\n try {\n device = await adapter.requestDevice({\n label: 'pixerate wet media',\n requiredLimits: {\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n },\n });\n } catch (e) {\n return no(`The WebGPU device did not start (${(e as Error).message}); wet paint runs on the CPU.`, name);\n }\n try {\n const engine = await WetGpuEngine.start(device, maxSlots, name);\n return { engine, support: { supported: true, reason: null, adapter: name, maxSlots } };\n } catch (e) {\n device.destroy?.();\n return no(`The wet-media shaders did not compile on this GPU (${(e as Error).message}); wet paint runs on the CPU.`, name);\n }\n}\n\n/** Whether Engine B can run here (starts and stops a device). */\nexport async function wetGpuSupport(gpu: WetGpuProvider | null = findWebGpu()): Promise<WetGpuSupport> {\n const { engine, support } = await createWetGpuEngine(gpu);\n engine?.destroy();\n return support;\n}\n\nasync function pipeline(device: GDevice, code: string, label: string): Promise<GPipeline> {\n device.pushErrorScope?.('validation');\n const module = device.createShaderModule({ code, label }) as { getCompilationInfo?: () => Promise<{ messages: readonly { type: string; message: string; lineNum: number }[] }> };\n const info = await module.getCompilationInfo?.();\n const errors = info?.messages.filter((m) => m.type === 'error') ?? [];\n if (errors.length) {\n await device.popErrorScope?.();\n throw new Error(`${label}: ${errors.map((m) => `line ${m.lineNum}: ${m.message}`).join('; ')}`);\n }\n const desc = { layout: 'auto' as const, compute: { module, entryPoint: 'main' }, label };\n const p = device.createComputePipelineAsync ? await device.createComputePipelineAsync(desc) : device.createComputePipeline(desc);\n const err = await device.popErrorScope?.();\n if (err) throw new Error(`${label}: ${err.message}`);\n return p;\n}\n\n/** The engine on a started device. Make one with `createWetGpuEngine`. */\nexport class WetGpuEngine {\n /** Steps run on the GPU so far (for stats). */\n steps = 0;\n /** Set once the device is lost; the engine does nothing after that. */\n lostReason: string | null = null;\n private state: GBuffer;\n private slots = 0;\n private readonly params: GBuffer;\n private jobs: GBuffer;\n private jobCap = 0;\n private flags: GBuffer;\n private flagsRead: GBuffer;\n private readonly uni: GBuffer[];\n private readonly shadeUni: GBuffer;\n private srcTiles: GBuffer | null = null;\n private outTiles: GBuffer | null = null;\n private outRead: GBuffer | null = null;\n private tileCap = 0;\n private groups: { step: unknown[]; halo: unknown[] } | null = null;\n\n private constructor(\n private readonly device: GDevice,\n /** Most tiles the GPU can hold. */\n readonly maxSlots: number,\n /** The GPU, when known. */\n readonly adapter: string | null,\n private readonly stepPipe: GPipeline,\n private readonly haloPipe: GPipeline,\n private readonly shadePipe: GPipeline\n ) {\n const d = device;\n this.state = d.createBuffer({ size: SLOT_BYTES, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet state' });\n this.slots = 1;\n this.params = d.createBuffer({ size: MAX_WET_LANES * PARAM_FLOATS * 4, usage: STORAGE | COPY_DST, label: 'wet params' });\n this.jobs = d.createBuffer({ size: 64 * GPU_JOB_WORDS * 4, usage: STORAGE | COPY_DST, label: 'wet jobs' });\n this.jobCap = 64;\n this.flags = d.createBuffer({ size: 64 * 4, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet flags' });\n this.flagsRead = d.createBuffer({ size: 64 * 4, usage: MAP_READ | COPY_DST, label: 'wet flags read' });\n this.uni = [0, 1].map((p) => {\n const b = d.createBuffer({ size: 16, usage: UNIFORM | COPY_DST, label: `wet parity ${p}` });\n d.queue.writeBuffer(b, 0, new Uint32Array([p, 0, 0, 0]));\n return b;\n });\n this.shadeUni = d.createBuffer({ size: 16, usage: UNIFORM | COPY_DST, label: 'wet shade' });\n void device.lost?.then((info) => {\n this.lostReason = info?.message || info?.reason || 'the GPU device was lost';\n });\n }\n\n /** @internal Compiles the kernels; use `createWetGpuEngine`. */\n static async start(device: GDevice, maxSlots: number, adapter: string | null): Promise<WetGpuEngine> {\n const [step, halo, shade] = await Promise.all([pipeline(device, WGSL_STEP, 'wet step'), pipeline(device, WGSL_HALO, 'wet halo'), pipeline(device, WGSL_SHADE, 'wet shade')]);\n return new WetGpuEngine(device, maxSlots, adapter, step, halo, shade);\n }\n\n /** Bytes of GPU memory in use. */\n memoryBytes(): number {\n return this.state.size + this.jobs.size + (this.srcTiles?.size ?? 0) + (this.outTiles?.size ?? 0) * 2;\n }\n\n /** Slots the state buffer holds now. */\n get capacity(): number {\n return this.slots;\n }\n\n /** Grows the state buffer to hold `n` slots (keeping its contents). Returns false past `maxSlots`. */\n ensureSlots(n: number): boolean {\n if (n <= this.slots) return true;\n if (n > this.maxSlots) return false;\n const want = Math.min(this.maxSlots, Math.max(n, Math.ceil(this.slots * 1.5)));\n const next = this.device.createBuffer({ size: want * SLOT_BYTES, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet state' });\n const enc = this.device.createCommandEncoder();\n enc.copyBufferToBuffer(this.state, 0, next, 0, this.slots * SLOT_BYTES);\n this.device.queue.submit([enc.finish()]);\n this.state.destroy();\n this.state = next;\n this.slots = want;\n this.groups = null;\n return true;\n }\n\n /** Writes floats into a slot (`offset` floats from the slot's start). */\n writeSlot(slot: number, offset: number, data: Float32Array): void {\n if (slot >= this.slots) throw new Error(`Slot ${slot} is past the GPU's ${this.slots}; call ensureSlots first.`);\n this.device.queue.writeBuffer(this.state, (slot * SLOT_FLOATS + offset) * 4, data.buffer, data.byteOffset, data.byteLength);\n }\n\n /** Sets a lane's packed parameters (`packWetParams`). */\n setParams(lane: number, prm: Float32Array): void {\n this.device.queue.writeBuffer(this.params, lane * PARAM_FLOATS * 4, prm.buffer, prm.byteOffset, PARAM_FLOATS * 4);\n }\n\n private writeJobs(jobs: readonly WetGpuJob[], src?: readonly number[]): void {\n if (jobs.length > this.jobCap) {\n this.jobs.destroy();\n this.flags.destroy();\n this.flagsRead.destroy();\n this.jobCap = Math.max(jobs.length, this.jobCap * 2);\n this.jobs = this.device.createBuffer({ size: this.jobCap * GPU_JOB_WORDS * 4, usage: STORAGE | COPY_DST, label: 'wet jobs' });\n this.flags = this.device.createBuffer({ size: this.jobCap * 4, usage: STORAGE | COPY_DST | COPY_SRC, label: 'wet flags' });\n this.flagsRead = this.device.createBuffer({ size: this.jobCap * 4, usage: MAP_READ | COPY_DST, label: 'wet flags read' });\n this.groups = null;\n }\n const words = new Uint32Array(jobs.length * GPU_JOB_WORDS);\n jobs.forEach((j, i) => {\n if (j.slot < 0 || j.slot >= this.slots) throw new Error(`Job ${i} is on slot ${j.slot}, past the GPU's ${this.slots}.`);\n const o = i * GPU_JOB_WORDS;\n words[o] = j.slot * SLOT_FLOATS;\n words[o + 1] = j.lane;\n for (let k = 0; k < 8; k++) {\n const n = j.neighbours[k] ?? -1;\n words[o + 2 + k] = n >= 0 ? n * SLOT_FLOATS : GPU_NONE;\n }\n words[o + 10] = j.width;\n words[o + 11] = j.height;\n words[o + 12] = src && src[i] >= 0 ? src[i] : GPU_NONE;\n });\n this.device.queue.writeBuffer(this.jobs, 0, words);\n }\n\n private bindGroups(): { step: unknown[]; halo: unknown[] } {\n if (this.groups) return this.groups;\n const d = this.device;\n const step = [0, 1].map((p) =>\n d.createBindGroup({\n layout: this.stepPipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 1, resource: { buffer: this.params } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 3, resource: { buffer: this.flags } },\n { binding: 4, resource: { buffer: this.uni[p] } },\n ],\n })\n );\n const halo = [0, 1].map((p) =>\n d.createBindGroup({\n layout: this.haloPipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 4, resource: { buffer: this.uni[p] } },\n ],\n })\n );\n this.groups = { step, halo };\n return this.groups;\n }\n\n /**\n * Runs `steps` steps of `jobs` from set `parity` (as the CPU's `runHere`: each step, then each\n * tile's halo in the new set). With `readFlags`, resolves with each job's flag bits OR-ed over\n * the steps (`FLAG_*`); otherwise once the work is submitted.\n */\n async step(jobs: readonly WetGpuJob[], parity: number, steps: number, readFlags = false): Promise<Uint32Array | null> {\n if (this.lostReason) throw new Error(`The GPU is gone (${this.lostReason}).`);\n if (!jobs.length || steps <= 0) return readFlags ? new Uint32Array(jobs.length) : null;\n this.writeJobs(jobs);\n const g = this.bindGroups();\n const enc = this.device.createCommandEncoder();\n enc.clearBuffer(this.flags, 0, jobs.length * 4);\n let p = parity & 1;\n for (let s = 0; s < steps; s++) {\n const a = enc.beginComputePass();\n a.setPipeline(this.stepPipe);\n a.setBindGroup(0, g.step[p]);\n a.dispatchWorkgroups(16, 16, jobs.length);\n a.end();\n const b = enc.beginComputePass();\n b.setPipeline(this.haloPipe);\n b.setBindGroup(0, g.halo[1 - p]);\n b.dispatchWorkgroups(Math.ceil((4 * 258) / 64), SET_PLANES, jobs.length);\n b.end();\n p = 1 - p;\n }\n if (readFlags) enc.copyBufferToBuffer(this.flags, 0, this.flagsRead, 0, jobs.length * 4);\n this.device.queue.submit([enc.finish()]);\n this.steps += steps;\n if (!readFlags) return null;\n await this.flagsRead.mapAsync(MAP_READ, 0, jobs.length * 4);\n const out = new Uint32Array(this.flagsRead.getMappedRange(0, jobs.length * 4).slice(0));\n this.flagsRead.unmap();\n return out;\n }\n\n /** Refills each job's halo in set `parity` from its neighbours (after uploads). */\n refreshHalos(jobs: readonly WetGpuJob[], parity: number): void {\n if (this.lostReason || !jobs.length) return;\n this.writeJobs(jobs);\n const g = this.bindGroups();\n const enc = this.device.createCommandEncoder();\n const b = enc.beginComputePass();\n b.setPipeline(this.haloPipe);\n b.setBindGroup(0, g.halo[parity & 1]);\n b.dispatchWorkgroups(Math.ceil((4 * 258) / 64), SET_PLANES, jobs.length);\n b.end();\n this.device.queue.submit([enc.finish()]);\n }\n\n /**\n * Shades `jobs` (set `parity`) over their base tiles (`src[i]`: RGBA8 256 × 256, or `null` for\n * transparent) on paper `paper` (sRGB bytes). `mode` 'display' darkens wet paper a little;\n * 'dried' shows the paint as it would dry. Resolves with one RGBA8 tile per job.\n */\n async shade(jobs: readonly WetGpuJob[], parity: number, src: readonly (Uint8ClampedArray | null)[], paper: readonly [number, number, number], mode: 'display' | 'dried' = 'display'): Promise<Uint8ClampedArray[]> {\n if (this.lostReason) throw new Error(`The GPU is gone (${this.lostReason}).`);\n if (!jobs.length) return [];\n const n = jobs.length;\n const srcIndex: number[] = [];\n let srcCount = 0;\n for (const s of src) srcIndex.push(s ? srcCount++ : -1);\n this.writeJobs(jobs, srcIndex);\n const d = this.device;\n const tileBytes = TILE_WORDS * 4;\n if (n > this.tileCap || !this.outTiles || !this.outRead || !this.srcTiles) {\n this.srcTiles?.destroy();\n this.outTiles?.destroy();\n this.outRead?.destroy();\n this.tileCap = Math.max(n, this.tileCap * 2, 4);\n this.srcTiles = d.createBuffer({ size: this.tileCap * tileBytes, usage: STORAGE | COPY_DST, label: 'wet base tiles' });\n this.outTiles = d.createBuffer({ size: this.tileCap * tileBytes, usage: STORAGE | COPY_SRC, label: 'wet shaded tiles' });\n this.outRead = d.createBuffer({ size: this.tileCap * tileBytes, usage: MAP_READ | COPY_DST, label: 'wet shaded read' });\n }\n src.forEach((s, i) => {\n if (s) d.queue.writeBuffer(this.srcTiles!, srcIndex[i] * tileBytes, s.buffer, s.byteOffset, tileBytes);\n });\n d.queue.writeBuffer(this.shadeUni, 0, new Uint32Array([parity & 1, mode === 'display' ? 0 : 1, paper[0] | (paper[1] << 8) | (paper[2] << 16), 0]));\n const group = d.createBindGroup({\n layout: this.shadePipe.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.state } },\n { binding: 1, resource: { buffer: this.srcTiles } },\n { binding: 2, resource: { buffer: this.jobs } },\n { binding: 3, resource: { buffer: this.outTiles } },\n { binding: 4, resource: { buffer: this.shadeUni } },\n ],\n });\n const enc = d.createCommandEncoder();\n const pass = enc.beginComputePass();\n pass.setPipeline(this.shadePipe);\n pass.setBindGroup(0, group);\n pass.dispatchWorkgroups(16, 16, n);\n pass.end();\n enc.copyBufferToBuffer(this.outTiles, 0, this.outRead, 0, n * tileBytes);\n d.queue.submit([enc.finish()]);\n const read = this.outRead;\n await read.mapAsync(MAP_READ, 0, n * tileBytes);\n const all = new Uint8ClampedArray(read.getMappedRange(0, n * tileBytes).slice(0));\n read.unmap();\n const out: Uint8ClampedArray[] = [];\n for (let i = 0; i < n; i++) out.push(all.subarray(i * tileBytes, (i + 1) * tileBytes));\n return out;\n }\n\n /** Reads floats back from a slot (tests and diagnostics). */\n async readSlot(slot: number, offset: number, count: number): Promise<Float32Array> {\n const bytes = count * 4;\n const buf = this.device.createBuffer({ size: Math.ceil(bytes / 4) * 4, usage: MAP_READ | COPY_DST, label: 'wet read' });\n const enc = this.device.createCommandEncoder();\n enc.copyBufferToBuffer(this.state, (slot * SLOT_FLOATS + offset) * 4, buf, 0, bytes);\n this.device.queue.submit([enc.finish()]);\n await buf.mapAsync(MAP_READ, 0, bytes);\n const out = new Float32Array(buf.getMappedRange(0, bytes).slice(0));\n buf.unmap();\n buf.destroy();\n return out;\n }\n\n /** Waits for submitted work. */\n idle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const b of [this.state, this.params, this.jobs, this.flags, this.flagsRead, ...this.uni, this.shadeUni, this.srcTiles, this.outTiles, this.outRead]) b?.destroy();\n this.device.destroy();\n }\n}\n","/**\n * Pointer Events to stroke samples, for any host: pressure and tilt from pens, coalesced events\n * for the full pen rate, positions mapped to the host's coordinates (world units on an infinite\n * canvas) by a function it passes. Structurally typed: no DOM import.\n */\n\nimport type { PathSample } from './path-stroke';\n\n/** The Pointer Event fields read here. */\nexport interface PointerEventLike {\n clientX: number;\n clientY: number;\n pointerType?: string;\n pressure?: number;\n tiltX?: number;\n tiltY?: number;\n /** Radians (Pointer Events Level 3). */\n altitudeAngle?: number;\n azimuthAngle?: number;\n timeStamp?: number;\n getCoalescedEvents?: () => PointerEventLike[];\n}\n\n/** A stroke sample with the event time (milliseconds). */\nexport interface PointerStrokeSample extends PathSample {\n t?: number;\n}\n\n/**\n * Pressure of a pointer sample: pens report it; mice report 0.5 while pressed and pens 0 on\n * `pointerup`, both of which mean \"use full\".\n */\nexport function pointerPressure(e: Pick<PointerEventLike, 'pointerType' | 'pressure'>): number {\n if (e.pointerType === 'pen' && typeof e.pressure === 'number' && e.pressure > 0) return Math.min(1, e.pressure);\n return 1;\n}\n\n/** One pointer event as a stroke sample at `toPoint(clientX, clientY)`. Only pens carry tilt. */\nexport function pointerStrokeSample(e: PointerEventLike, toPoint: (clientX: number, clientY: number) => { x: number; y: number }): PointerStrokeSample {\n const p = toPoint(e.clientX, e.clientY);\n const s: PointerStrokeSample = { x: p.x, y: p.y, pressure: pointerPressure(e) };\n if (typeof e.timeStamp === 'number' && Number.isFinite(e.timeStamp)) s.t = e.timeStamp;\n if (e.pointerType === 'pen') {\n if (typeof e.altitudeAngle === 'number' && e.altitudeAngle < Math.PI / 2 - 1e-6) {\n s.altitude = e.altitudeAngle;\n s.azimuth = e.azimuthAngle ?? 0;\n } else if (e.tiltX || e.tiltY) {\n s.tiltX = e.tiltX ?? 0;\n s.tiltY = e.tiltY ?? 0;\n }\n }\n return s;\n}\n\n/**\n * The stroke samples of a `pointermove` (its coalesced events when the browser gives them, else\n * the event itself), mapped by `toPoint`. Feed them to a stroke in order.\n */\nexport function pointerStrokeSamples(e: PointerEventLike, toPoint: (clientX: number, clientY: number) => { x: number; y: number }): PointerStrokeSample[] {\n const events = e.getCoalescedEvents?.() ?? [];\n return (events.length ? events : [e]).map((ev) => pointerStrokeSample(ev, toPoint));\n}\n"]}
|