shadertown 0.19.1 → 0.20.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/CHANGELOG.md +9 -0
- package/dist/generated/sources.d.ts +4 -1
- package/dist/generated/sources.d.ts.map +1 -1
- package/dist/generated/sources.js +4 -0
- package/dist/generated/sources.js.map +1 -1
- package/dist/graph.d.ts +3 -3
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +3 -0
- package/dist/graph.js.map +1 -1
- package/dist/miniature.d.ts +5 -0
- package/dist/miniature.d.ts.map +1 -0
- package/dist/miniature.js +54 -0
- package/dist/miniature.js.map +1 -0
- package/dist/registry.d.ts +206 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +49 -1
- package/dist/registry.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,15 @@ deploys, not by this file.
|
|
|
6
6
|
This project follows [semantic versioning](https://semver.org). Before 1.0 the
|
|
7
7
|
minor number carries breaking changes, so pin it if that matters to you.
|
|
8
8
|
|
|
9
|
+
## 0.20.0 — 2026-09-10
|
|
10
|
+
|
|
11
|
+
- Add `chromatic-city`, colorful stepped columns with cast shadows, contact
|
|
12
|
+
shading, and individual eased height changes.
|
|
13
|
+
- Seed terrain, towers, and square widths, with curated randomization ranges
|
|
14
|
+
and four palettes. Tune the camera, relief, terrace count, and block gaps.
|
|
15
|
+
- Add a two-pass miniature renderer with adjustable top and bottom blur and
|
|
16
|
+
a sharp central focus band. Set size variation or blur to zero to disable it.
|
|
17
|
+
|
|
9
18
|
## 0.19.1 — 2026-09-09
|
|
10
19
|
|
|
11
20
|
- Brighten Strata’s shelf surfaces and edge lighting while retaining dark
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type GeneratedShaderName = "alloy" | "archipelago" | "ascii" | "aurora" | "basalt" | "beacon" | "billow" | "bloom" | "blossom" | "blueprint" | "bokeh" | "caldera" | "caustics" | "chladni" | "cloth" | "cumulus" | "dither" | "dunes" | "duotone" | "edges" | "eyes" | "ferro" | "filament" | "film-grain" | "flow" | "fluid" | "glass" | "gossamer" | "gravity" | "halftone" | "hills" | "island" | "julia" | "kaleidoscope" | "lagoon" | "lens" | "liquid-light" | "liquid-metal" | "louvres" | "lumen" | "maelstrom" | "magnet" | "meadow" | "melt" | "mesh-gradient" | "mosaic" | "neon-grid" | "neon-sign" | "orb" | "parallax" | "particles" | "pixel-clouds" | "pixel-fire" | "pixel-isle" | "pixel-rain" | "pixel-sea" | "plasma" | "pulsar" | "radiance" | "reveal" | "ripple" | "shafts" | "shatter" | "shockwave" | "shore" | "silk" | "spectra" | "starfield" | "strata" | "swell" | "swirl" | "tesla" | "torch" | "truchet" | "tunnel" | "voronoi";
|
|
1
|
+
export type GeneratedShaderName = "alloy" | "archipelago" | "ascii" | "aurora" | "basalt" | "beacon" | "billow" | "bloom" | "blossom" | "blueprint" | "bokeh" | "caldera" | "caustics" | "chladni" | "chromatic-city" | "cloth" | "cumulus" | "dither" | "dunes" | "duotone" | "edges" | "eyes" | "ferro" | "filament" | "film-grain" | "flow" | "fluid" | "glass" | "gossamer" | "gravity" | "halftone" | "hills" | "island" | "julia" | "kaleidoscope" | "lagoon" | "lens" | "liquid-light" | "liquid-metal" | "louvres" | "lumen" | "maelstrom" | "magnet" | "meadow" | "melt" | "mesh-gradient" | "mosaic" | "neon-grid" | "neon-sign" | "orb" | "parallax" | "particles" | "pixel-clouds" | "pixel-fire" | "pixel-isle" | "pixel-rain" | "pixel-sea" | "plasma" | "pulsar" | "radiance" | "reveal" | "ripple" | "shafts" | "shatter" | "shockwave" | "shore" | "silk" | "spectra" | "starfield" | "strata" | "swell" | "swirl" | "tesla" | "torch" | "truchet" | "tunnel" | "voronoi";
|
|
2
2
|
export declare const shaderSources: Readonly<Record<GeneratedShaderName, string>>;
|
|
3
3
|
/** Whether a shader invents its picture or reads one from a bound texture. */
|
|
4
4
|
export declare const shaderKinds: {
|
|
@@ -16,6 +16,7 @@ export declare const shaderKinds: {
|
|
|
16
16
|
readonly caldera: "generative";
|
|
17
17
|
readonly caustics: "generative";
|
|
18
18
|
readonly chladni: "graph";
|
|
19
|
+
readonly "chromatic-city": "graph";
|
|
19
20
|
readonly cloth: "compute";
|
|
20
21
|
readonly cumulus: "generative";
|
|
21
22
|
readonly dither: "generative";
|
|
@@ -98,6 +99,7 @@ export declare const shaderReadsSource: {
|
|
|
98
99
|
readonly caldera: false;
|
|
99
100
|
readonly caustics: false;
|
|
100
101
|
readonly chladni: false;
|
|
102
|
+
readonly "chromatic-city": false;
|
|
101
103
|
readonly cloth: false;
|
|
102
104
|
readonly cumulus: false;
|
|
103
105
|
readonly dither: false;
|
|
@@ -168,6 +170,7 @@ export declare const shaderGraphs: {
|
|
|
168
170
|
readonly billow: "glow";
|
|
169
171
|
readonly blueprint: "drafting";
|
|
170
172
|
readonly chladni: "particles";
|
|
173
|
+
readonly "chromatic-city": "miniature";
|
|
171
174
|
readonly dunes: "particles";
|
|
172
175
|
readonly ferro: "particles";
|
|
173
176
|
readonly filament: "glow";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,aAAa,GACb,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,GACT,WAAW,GACX,OAAO,GACP,SAAS,GACT,UAAU,GACV,SAAS,GACT,OAAO,GACP,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,GACP,UAAU,GACV,YAAY,GACZ,MAAM,GACN,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,OAAO,GACP,cAAc,GACd,QAAQ,GACR,MAAM,GACN,cAAc,GACd,cAAc,GACd,SAAS,GACT,OAAO,GACP,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,eAAe,GACf,QAAQ,GACR,WAAW,GACX,WAAW,GACX,KAAK,GACL,UAAU,GACV,WAAW,GACX,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,OAAO,GACP,MAAM,GACN,SAAS,GACT,WAAW,GACX,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,QAAQ,GACR,SAAS,CAAC;AAId,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,aAAa,GACb,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,GACT,WAAW,GACX,OAAO,GACP,SAAS,GACT,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,GACP,UAAU,GACV,YAAY,GACZ,MAAM,GACN,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,OAAO,GACP,cAAc,GACd,QAAQ,GACR,MAAM,GACN,cAAc,GACd,cAAc,GACd,SAAS,GACT,OAAO,GACP,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,eAAe,GACf,QAAQ,GACR,WAAW,GACX,WAAW,GACX,KAAK,GACL,UAAU,GACV,WAAW,GACX,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,OAAO,GACP,MAAM,GACN,SAAS,GACT,WAAW,GACX,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,QAAQ,GACR,SAAS,CAAC;AAId,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CA8EvE,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Ed,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EpB,CAAC;AAEX,4EAA4E;AAC5E,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;CAiBf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -18,6 +18,7 @@ export const shaderSources = {
|
|
|
18
18
|
"caldera": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// caldera\n// ---------------------------------------------------------------------------\n\n// Caldera — a volcanic island at night, lit by its own veins.\n//\n// The island is the usual fbm-minus-falloff, but the light source is inside\n// it: the valleys of a ridged field read as lava channels radiating from the\n// crater, brightest at the pool and cooling as they run out. Everything else\n// — basalt, the sea, the surf line that draws the coast — is lit by that\n// glow and a little moonlight.\n\nfn terrain(p : vec2f) -> f32 {\n return st_fbm2(p * 2.1 + vec2f(3.1, 7.7), 4) - smoothstep(0.1, 1.1, length(p)) * 0.9;\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let t = st_time();\n let p = st_centered(uv) * params.scale * 2.2;\n\n let h = terrain(p) - 0.14;\n let r = length(p);\n let craterR = 0.16 * params.a;\n\n // Moonlit sea: dark, but alive, and paler near the coast so the island\n // silhouette always reads.\n let swell = st_fbm2(p * 5.0 + vec2f(t * 0.1, -t * 0.07), 3);\n var col = vec3f(0.05, 0.07, 0.13) * (0.7 + swell * 0.6);\n col = col + vec3f(0.10, 0.13, 0.20) * exp(min(h, 0.0) * 9.0);\n\n let land = smoothstep(0.0, 0.015, h);\n\n // A thin surf line draws the coast in the dark.\n let coast = smoothstep(0.02, 0.0, abs(h)) * smoothstep(0.4, 0.8, st_fbm2(p * 12.0 + t * 0.25, 3));\n col = mix(col, vec3f(0.35, 0.42, 0.50), coast * 0.6);\n\n // Basalt: moon-grey shoulders, brighter with height so the cone shows.\n let rock = mix(vec3f(0.10, 0.10, 0.14), vec3f(0.24, 0.22, 0.27), smoothstep(0.0, 0.45, h))\n * (0.7 + 0.5 * st_fbm2(p * 7.0, 3));\n col = mix(col, rock, land);\n\n // Lava rivers: thin runs at fixed angles off the pool, meandering more\n // the further they fall, each pulsing outward — downhill — as it goes.\n // The angular multiplier is an integer, so the runs close over the seam.\n let ang = atan2(p.y, p.x);\n let meander = (st_fbm2(p * 2.6 + vec2f(7.7, 1.3), 3) - 0.5) * (2.2 + r * 4.5) * params.warp;\n let runs = abs(sin(ang * 3.0 + meander));\n let width = 0.22 * (0.4 + clamp(params.b, 0.0, 1.5)) / (1.0 + r * 2.5);\n let vein = smoothstep(width, width * 0.2, runs);\n let reach = smoothstep(craterR + mix(0.35, 1.0, clamp(params.b, 0.0, 1.5) / 1.5), craterR * 0.5, r);\n let pulse = 0.85 + 0.15 * sin(t * 1.1 + r * 5.0);\n let downhill = 0.7 + 0.3 * sin(r * 15.0 - t * 2.2 + meander);\n var lava = vein * reach * land * downhill;\n\n // The crater pool: a dark cooling crust floating on the bright melt.\n let crust = smoothstep(0.45, 0.75, st_fbm2(p * 9.0 + vec2f(0.0, t * 0.12), 3));\n let pool = smoothstep(craterR, craterR * 0.5, r) * (1.0 - crust * 0.55);\n lava = max(lava, pool);\n\n // Heat colours from the shared ramp: colorB the running orange, colorC\n // the white heart.\n let heat = st_palette(clamp(lava * 1.3, 0.0, 1.0));\n col = mix(col, heat, smoothstep(0.10, 0.45, lava));\n\n // The glow the mountain throws: veins light their own banks, the crater\n // lights the summit, and both tint the smoke of the night air.\n col = col + params.colorB.rgb * lava * lava * 1.4;\n col = col + params.colorB.rgb * exp(-abs(r - craterR * 0.7) * 9.0) * 0.25 * params.c * pulse;\n col = col + params.colorB.rgb * vein * reach * 0.22 * params.c;\n\n // Embers: a handful of soft sparks climbing off the crater, not pixels.\n for (var i = 0; i < 5; i = i + 1) {\n let fi = f32(i);\n let cycle = fract(t * (0.11 + st_hash11(fi) * 0.07) + st_hash11(fi * 3.7));\n let emberPos = vec2f(\n (st_hash11(fi * 7.3) - 0.5) * 0.5 + sin(t * 0.8 + fi * 2.2) * 0.06 + cycle * 0.3,\n -cycle * 0.9 + 0.1,\n );\n let fadeIn = smoothstep(0.0, 0.1, cycle) * smoothstep(1.0, 0.55, cycle);\n col = col + params.colorC.rgb * exp(-length(p - emberPos) * 90.0) * fadeIn * params.d * 0.8;\n }\n\n return st_post(st_tonemap(col * params.intensity), uv);\n}\n",
|
|
19
19
|
"caustics": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// caustics\n// ---------------------------------------------------------------------------\n\n// Caustics — light focused through a moving water surface onto a pool floor.\n\nfn causticField(p : vec2f, t : f32, sharpness : f32) -> f32 {\n var acc = 0.0;\n var q = p;\n // Stacked, counter-rotating cell fields approximate the focusing pattern.\n for (var i = 0; i < 3; i = i + 1) {\n let fi = f32(i);\n let rotated = st_rot(fi * 1.1 + t * 0.05 * (fi + 1.0)) * q;\n let wave = sin(rotated.x * 6.0 + t * (1.1 + fi * 0.3))\n + sin(rotated.y * 6.0 - t * (0.9 + fi * 0.2))\n + sin((rotated.x + rotated.y) * 4.0 + t * 0.7);\n acc = acc + abs(wave) / 3.0;\n q = q * 1.35;\n }\n let v = 1.0 - clamp(acc / 3.0, 0.0, 1.0);\n return pow(v, 1.0 + sharpness * 14.0);\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let t = st_time();\n var p = st_centered(uv) * params.scale * 2.0;\n\n // Surface ripple displaces the floor lookup.\n let ripple = vec2f(st_fbm2(p * 1.5 + t * 0.1, 3), st_fbm2(p * 1.5 + 4.2 - t * 0.08, 3));\n p = p + (ripple - 0.5) * params.warp;\n\n let light = causticField(p, t, params.a);\n\n // Chromatic split — the three wavelengths focus at slightly different depths.\n let split = params.b * 0.03;\n let r = causticField(p + vec2f(split, 0.0), t, params.a);\n let b = causticField(p - vec2f(split, 0.0), t, params.a);\n\n let floorTone = mix(params.colorA.rgb, params.colorB.rgb, clamp(st_fbm2(p * 0.8, 3), 0.0, 1.0)) * 0.35;\n var col = floorTone;\n col = col + params.colorC.rgb * vec3f(r, light, b) * params.intensity * 2.2;\n\n // Depth falloff towards the pool edges.\n col = col * (0.55 + 0.45 * smoothstep(1.1, 0.1, length(st_centered(uv)) * params.c));\n\n return st_post(st_tonemap(col), uv);\n}\n",
|
|
20
20
|
"chladni": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// shadertown graph prelude — prepended (after the shared prelude) to every\n// graph shader at build time, whatever its flavour.\n//\n// A graph shader is not one pass but a whole render graph in a single module,\n// each pass its own entry point, and the runtime (src/graph.ts) drives them\n// with `draw()` and explicit entry names. This file carries the part every\n// flavour shares: the full-screen vertex stage, the present pass, and an\n// Unreal-style bloom chain that reads whatever HDR scene the flavour drew.\n// `effect()` picks the first vertex and fragment entries, which is why\n// `vs_fullscreen` and `fs_main` (the present pass) are declared first.\n//\n// The flavour prelude that follows this one (src/shaders/graph/<flavour>/)\n// declares the passes that draw the scene, and the variant file below that\n// supplies the functions the flavour asks for:\n//\n// particles a displacement field, normals, an instanced particle draw\n// drafting a source layer measured, distance-fielded and drawn as a plate\n// glow one scene pass of light on dark, bloomed\n// studio sculpted meshes, ray-traced glass, depth of field and bloom\n// masonry a floor of slabs as instanced boxes, depth of field and bloom\n//\n// Bindings are declared once for the whole module; vgpu builds layouts per\n// entry point, so each pass only owes the bindings it actually reads. The\n// shared passes bind from 20 upward, leaving 1 to 19 to the flavour — the\n// drafting flavour spends 1 to 3 on the source prelude.\n//\n// The bloom chain and present pass are ported from the vgpu `fft-ocean`\n// (\"Particles ocean\") example and keep its behaviour: five blurred octaves\n// recombined, linear to sRGB on the way out.\n\nstruct BlurUniforms {\n direction : vec2f,\n invSize : vec2f,\n coeffs0 : vec4f,\n coeffs1 : vec4f,\n coeffs2 : vec4f,\n coeffs3 : vec4f,\n coeffs4 : vec4f,\n coeffs5 : vec4f,\n}\n\nstruct BloomUniforms {\n threshold : f32,\n smoothWidth : f32,\n strength : f32,\n radius : f32,\n factors0 : vec4f,\n factors1 : vec4f,\n}\n\n@group(0) @binding(20) var<uniform> blurU : BlurUniforms;\n@group(0) @binding(21) var<uniform> bloomU : BloomUniforms;\n@group(0) @binding(22) var t_scene : texture_2d<f32>;\n@group(0) @binding(23) var t_input : texture_2d<f32>;\n@group(0) @binding(24) var t_blur1 : texture_2d<f32>;\n@group(0) @binding(25) var t_blur2 : texture_2d<f32>;\n@group(0) @binding(26) var t_blur3 : texture_2d<f32>;\n@group(0) @binding(27) var t_blur4 : texture_2d<f32>;\n@group(0) @binding(28) var t_blur5 : texture_2d<f32>;\n@group(0) @binding(29) var t_bloom : texture_2d<f32>;\n@group(0) @binding(30) var linearSampler : sampler;\n\nstruct FullscreenOut {\n @builtin(position) position : vec4f,\n @location(0) uv : vec2f,\n}\n\n// Same triangle and uv orientation vgpu generates for a plain effect, so the\n// fullscreen fragment entries below read uv exactly like every other shader.\n@vertex fn vs_fullscreen(@builtin(vertex_index) vi : u32) -> FullscreenOut {\n var pos = array<vec2f, 3>(vec2f(-1.0, -1.0), vec2f(3.0, -1.0), vec2f(-1.0, 3.0));\n var uv = array<vec2f, 3>(vec2f(0.0, 1.0), vec2f(2.0, 1.0), vec2f(0.0, -1.0));\n var out : FullscreenOut;\n out.position = vec4f(pos[vi], 0.0, 1.0);\n out.uv = uv[vi];\n return out;\n}\n\n/** sRGB well to linear light, so the present pass's sRGB step undoes it. */\nfn st_toLinear(c : vec3f) -> vec3f {\n return pow(max(c, vec3f(0.0)), vec3f(2.2));\n}\n\n// --- present ---------------------------------------------------------------\n// First fragment entry on purpose: the runtime's `effect()` for this shader\n// resolves to it, and the Stage drives it like any other shader's fragment.\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let scene = textureSample(t_scene, linearSampler, uv);\n let bloom = textureSample(t_bloom, linearSampler, uv);\n // The generator supplies an identity hook unless the flavour opts into\n // tone mapping. Existing emissive graphs retain their original response.\n let linear = max(st_graphTone(scene.rgb + bloom.rgb), vec3f(0.0));\n let lt = linear * 12.92;\n let gt = 1.055 * pow(linear, vec3f(0.41666)) - vec3f(0.055);\n let srgb = select(gt, lt, linear <= vec3f(0.0031308));\n return st_post(srgb, uv);\n}\n\n// --- bloom -------------------------------------------------------------------\n\nfn st_luminance(rgb : vec3f) -> f32 {\n return dot(rgb, vec3f(0.299, 0.587, 0.114));\n}\n\n@fragment fn fs_bright(@location(0) uv : vec2f) -> @location(0) vec4f {\n // LuminosityHighPassShader, as ported by the fft-ocean example.\n let texel = textureSample(t_scene, linearSampler, uv);\n let gate = smoothstep(bloomU.threshold, bloomU.threshold + bloomU.smoothWidth, st_luminance(texel.xyz));\n return mix(vec4f(vec3f(0.0), 0.0), texel, gate);\n}\n\n/**\n * The bloom gate for a scene that says itself what is light: its alpha. A\n * pale mat or a bright ground would otherwise bloom as a whole.\n */\n@fragment fn fs_brightAlpha(@location(0) uv : vec2f) -> @location(0) vec4f {\n let texel = textureSample(t_scene, linearSampler, uv);\n return vec4f(texel.rgb * texel.a, texel.a);\n}\n\nconst ST_BLUR_RADIUS : u32 = 22u;\n\nfn st_blurCoefficient(i : u32) -> f32 {\n let packed = array<vec4f, 6>(\n blurU.coeffs0, blurU.coeffs1, blurU.coeffs2,\n blurU.coeffs3, blurU.coeffs4, blurU.coeffs5,\n );\n return packed[i / 4u][i % 4u];\n}\n\n@fragment fn fs_blur(@location(0) uv : vec2f) -> @location(0) vec4f {\n // UnrealBloomPass separable blur: coefficients past each level's radius are\n // zero, so one fixed loop serves all five levels.\n var weightSum = st_blurCoefficient(0u);\n var diffuseSum = textureSample(t_input, linearSampler, uv).rgb * weightSum;\n for (var i = 1u; i < ST_BLUR_RADIUS; i = i + 1u) {\n let w = st_blurCoefficient(i);\n let offset = blurU.direction * blurU.invSize * f32(i);\n let s1 = textureSample(t_input, linearSampler, uv + offset).rgb;\n let s2 = textureSample(t_input, linearSampler, uv - offset).rgb;\n diffuseSum = diffuseSum + (s1 + s2) * w;\n }\n return vec4f(diffuseSum, 1.0);\n}\n\nfn st_bloomFactor(i : u32) -> f32 {\n let v = array<f32, 8>(\n bloomU.factors0.x, bloomU.factors0.y, bloomU.factors0.z, bloomU.factors0.w,\n bloomU.factors1.x, bloomU.factors1.y, bloomU.factors1.z, bloomU.factors1.w,\n );\n let mirror = 1.2 - v[i];\n return mix(v[i], mirror, bloomU.radius);\n}\n\n@fragment fn fs_composite(@location(0) uv : vec2f) -> @location(0) vec4f {\n // UnrealBloomPass composite, tint colours all white.\n let bloom = 3.0 * bloomU.strength * (\n st_bloomFactor(0u) * textureSample(t_blur1, linearSampler, uv).rgb +\n st_bloomFactor(1u) * textureSample(t_blur2, linearSampler, uv).rgb +\n st_bloomFactor(2u) * textureSample(t_blur3, linearSampler, uv).rgb +\n st_bloomFactor(3u) * textureSample(t_blur4, linearSampler, uv).rgb +\n st_bloomFactor(4u) * textureSample(t_blur5, linearSampler, uv).rgb\n );\n return vec4f(bloom, max(bloom.r, max(bloom.g, bloom.b)));\n}\n\nfn st_graphTone(c : vec3f) -> vec3f { return c; }\n\n// shadertown particles prelude — prepended (after the shared and graph\n// preludes) to every shader in src/shaders/graph/particles/.\n//\n// The passes: a displacement field, a normal pass, and an instanced particle\n// draw into the HDR scene the shared bloom chain then reads. The variant file\n// below this prelude supplies exactly one function:\n//\n// fn st_field(p : vec2f, t : f32) -> vec4f\n//\n// `p` is the world-space position of a grid cell (±worldSize/2), `t` is\n// `st_time()`. The return value is displacement xyz in field units (scaled to\n// world units by `gu.world.y`) plus an aux channel in w — the shader's own\n// meaning of \"foam\": whatever the accent colour should land on.\n//\n// The pass structure and camera are ported from the vgpu `fft-ocean`\n// (\"Particles ocean\") example: additive particles into an HDR scene under a\n// fixed cinematic camera.\n\nstruct GraphUniforms {\n view : mat4x4f,\n projection : mat4x4f,\n // canvas width, canvas height, point scale, grid resolution\n viewport : vec4f,\n // world size, height scale, point size, texel spacing (world / grid)\n world : vec4f,\n // fade near, fade far, fade power, unused\n fade : vec4f,\n // eye y, eye z, view pitch (radians), projection focal (1 / tan(fov / 2))\n camera : vec4f,\n}\n\n@group(0) @binding(1) var<uniform> gu : GraphUniforms;\n@group(0) @binding(4) var t_field : texture_2d<f32>;\n@group(0) @binding(5) var t_normal : texture_2d<f32>;\n\n// --- the pointer, in the world --------------------------------------------\n// The camera is fixed, so the pointer can be unprojected analytically: undo\n// the projection's focal scaling, undo the view's pitch, and the uv the\n// runtime delivers becomes a ray from the eye into the scene. Variants\n// intersect it with whatever surface they draw on.\n\nstruct PointerRay {\n origin : vec3f,\n dir : vec3f,\n}\n\n// The ray through any point of the frame, uv in 0..1 from the top left. Taking\n// the position rather than reading `params.pointer` lets a variant aim at a\n// place in the frame it picks itself.\nfn st_screenRay(uv : vec2f) -> PointerRay {\n let aspect = gu.viewport.x / max(gu.viewport.y, 1.0);\n let f = gu.camera.w;\n let ndc = vec2f(uv.x * 2.0 - 1.0, (1.0 - uv.y) * 2.0 - 1.0);\n let viewDir = normalize(vec3f(ndc.x * aspect / f, ndc.y / f, -1.0));\n // The view rotates the world by `camera.z` about x; the ray rotates back.\n let c = cos(gu.camera.z);\n let s = sin(gu.camera.z);\n var ray : PointerRay;\n ray.origin = vec3f(0.0, gu.camera.x, gu.camera.y);\n ray.dir = vec3f(viewDir.x, c * viewDir.y + s * viewDir.z, -s * viewDir.y + c * viewDir.z);\n return ray;\n}\n\nfn st_pointerRay() -> PointerRay {\n return st_screenRay(params.pointer);\n}\n\n// Where a point of the frame lands on the y = 0 water plane, in world xz.\nfn st_screenOnPlane(uv : vec2f) -> vec2f {\n let ray = st_screenRay(uv);\n let t = -ray.origin.y / min(ray.dir.y, -0.02);\n let hit = ray.origin + ray.dir * t;\n let half = gu.world.x * 0.5;\n return clamp(hit.xz, vec2f(-half), vec2f(half));\n}\n\n// Where the pointer lands on the y = 0 water plane, in world xz.\nfn st_pointerOnPlane() -> vec2f {\n return st_screenOnPlane(params.pointer);\n}\n\n// Where the pointer lands on the vertical plane z = depth, in world xy.\nfn st_pointerOnDepth(depth : f32) -> vec2f {\n let ray = st_pointerRay();\n let t = (depth - ray.origin.z) / min(ray.dir.z, -0.02);\n let hit = ray.origin + ray.dir * t;\n let half = gu.world.x * 0.5;\n return vec2f(clamp(hit.x, -half, half), clamp(hit.y, -20.0, 120.0));\n}\n\n// --- displacement field ------------------------------------------------------\n\n@fragment fn fs_field(@location(0) uv : vec2f) -> @location(0) vec4f {\n let p = (uv - vec2f(0.5)) * gu.world.x;\n return st_field(p, st_time());\n}\n\n// --- normals ----------------------------------------------------------------\n\nfn st_loadField(coord : vec2i) -> vec4f {\n let n = i32(gu.viewport.w);\n let c = clamp(coord, vec2i(0), vec2i(n - 1, n - 1));\n return textureLoad(t_field, c, 0);\n}\n\n@fragment fn fs_normals(@builtin(position) position : vec4f) -> @location(0) vec4f {\n let coord = vec2i(position.xy - vec2f(0.5));\n let dx = gu.world.w;\n let s = gu.world.y;\n let r = st_loadField(coord + vec2i(1, 0));\n let l = st_loadField(coord - vec2i(1, 0));\n let t = st_loadField(coord + vec2i(0, 1));\n let b = st_loadField(coord - vec2i(0, 1));\n let dhdx = (r.y - l.y) * s / (2.0 * dx);\n let dhdz = (t.y - b.y) * s / (2.0 * dx);\n let normal = normalize(vec3f(-dhdx, 1.0, -dhdz));\n return vec4f(normal, st_loadField(coord).w);\n}\n\n// --- particles ----------------------------------------------------------------\n\nstruct ParticleOut {\n @builtin(position) position : vec4f,\n @location(0) pointCoord : vec2f,\n @location(1) aux : f32,\n @location(2) normal : vec3f,\n @location(3) viewDir : vec3f,\n @location(4) height : f32,\n @location(5) fade : f32,\n}\n\nfn st_quadCorner(vertexIndex : u32) -> vec2f {\n var corners = array<u32, 6>(0u, 1u, 2u, 2u, 1u, 3u);\n let cornerIndex = corners[vertexIndex % 6u];\n switch (cornerIndex) {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n@vertex fn vs_particles(\n @builtin(vertex_index) vertexIndex : u32,\n @builtin(instance_index) instanceIndex : u32,\n) -> ParticleOut {\n let resolution = max(1u, u32(gu.viewport.w));\n let i = instanceIndex % resolution;\n let j = instanceIndex / resolution;\n let particleRef = vec2f(f32(i), f32(j)) / f32(resolution);\n let texCoord = vec2u(i, j);\n\n let raw = textureLoad(t_field, texCoord, 0);\n let disp = raw.xyz * gu.world.y;\n let nf = textureLoad(t_normal, texCoord, 0);\n\n let halfWorld = gu.world.x * 0.5;\n let base = vec3f(\n particleRef.x * gu.world.x - halfWorld,\n 0.0,\n particleRef.y * gu.world.x - halfWorld,\n );\n let pos = base + disp;\n\n let mv = gu.view * vec4f(pos, 1.0);\n let viewDir = -mv.xyz;\n let dist = -mv.z;\n let f = 1.0 - smoothstep(gu.fade.x, gu.fade.y, dist);\n let fade = pow(clamp(f, 0.0, 1.0), gu.fade.z);\n\n let projected = gu.projection * mv;\n let ndc = projected.xy / projected.w;\n\n let corner = st_quadCorner(vertexIndex);\n let pointSizePx = 2.0 * gu.world.z * gu.viewport.z;\n let clipOffset = corner * (pointSizePx / gu.viewport.xy) * projected.w;\n let clip = vec4f(ndc * projected.w + clipOffset, projected.z, projected.w);\n\n var out : ParticleOut;\n out.position = clip;\n out.pointCoord = corner * 0.5 + vec2f(0.5);\n out.aux = nf.w;\n out.normal = nf.xyz;\n out.viewDir = viewDir;\n out.height = raw.y;\n out.fade = fade;\n return out;\n}\n\n@fragment fn fs_particles(in : ParticleOut) -> @location(0) vec4f {\n let cc = in.pointCoord - vec2f(0.5);\n if (dot(cc, cc) > 0.25) { discard; }\n\n let n = normalize(in.normal);\n let v = normalize(in.viewDir);\n let fresnel = pow(1.0 - clamp(dot(n, v), 0.0, 1.0), 5.0);\n\n let aux = clamp(in.aux, 0.0, 1.0);\n let crest = smoothstep(-0.5, 1.5, in.height);\n\n var color = params.colorA.rgb * 0.5;\n color = color + params.colorB.rgb * crest * 0.5;\n color = color + params.colorB.rgb * fresnel * 0.15;\n color = mix(color, params.colorC.rgb, aux);\n\n // The source example exposed 512² splats; this grid is 256², so each of the\n // quarter as many splats carries four times the weight to match.\n var alpha = (0.02 + crest * 0.06 + fresnel * 0.04) * 4.0;\n alpha = mix(alpha, 1.0, aux);\n color = color * in.fade * params.intensity;\n alpha = clamp(alpha * in.fade, 0.0, 1.0);\n return vec4f(color, alpha);\n}\n\n// ---------------------------------------------------------------------------\n// chladni\n// ---------------------------------------------------------------------------\n\n// Chladni — a singing plate, and the sand that maps its silence.\n//\n// The height is a pair of square-plate standing waves, the classic\n// cos(mπx)cos(nπy) figures, beating in time. The aux channel is the inverse:\n// where the figure crosses zero the plate never moves, and that is where the\n// accent colour gathers — the same reason sand walks to the nodal lines of a\n// real vibrating plate. Sweep drifts the mode numbers continuously, so the\n// figure re-solves itself into the next one instead of cutting.\n\nfn chladniFigure(q : vec2f, m : f32, n : f32) -> f32 {\n // The difference of the two orderings is what draws the diagonals; the sum\n // alone would be a plain checkerboard of humps.\n return cos(m * PI * q.x) * cos(n * PI * q.y) - cos(n * PI * q.x) * cos(m * PI * q.y);\n}\n\nfn st_field(p : vec2f, t : f32) -> vec4f {\n // q spans roughly ±1 across the plate; scale zooms the figure.\n let q = p * (params.scale / (gu.world.x * 0.5));\n\n // Sweep walks both mode numbers on incommensurate clocks, so the figure\n // never repeats a loop the eye can catch.\n let m = params.a + params.d * (0.5 + 0.5 * sin(t * 0.21));\n let n = params.b + params.d * (0.5 + 0.5 * sin(t * 0.13 + 2.1));\n let figure = chladniFigure(q, m, n);\n\n // The plate rings: the whole figure oscillates through zero, which is what\n // separates a vibration from a relief map of one.\n var h = figure * 0.4 * cos(t * 2.6);\n\n // A travelling ripple from the driver at the centre, fading toward the rim.\n let r = length(q);\n h = h + params.warp * 0.18 * sin(r * 22.0 - t * 3.0) * exp(-r * 1.6);\n\n // Sand: bright exactly where the figure is silent. The vibration term does\n // not gate it — nodes hold still at every phase, so the lines hold steady\n // while the plate rings around them.\n let node = 1.0 - smoothstep(0.0, 0.22, abs(figure));\n let aux = clamp(node * params.c * 0.85, 0.0, 1.0);\n\n return vec4f(0.0, h, 0.0, aux);\n}\n",
|
|
21
|
+
"chromatic-city": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\nfn st_graphTone(c : vec3f) -> vec3f { return c; }\n\n// @standalone\n// Render the city once, then apply tilt-shift blur in screen space.\n@group(0) @binding(1) var t_city : texture_2d<f32>;\n@group(0) @binding(2) var citySampler : sampler;\n\nstruct CityVertex {\n @builtin(position) position : vec4f,\n @location(0) uv : vec2f,\n}\n\n@vertex fn vs_fullscreen(@builtin(vertex_index) index : u32) -> CityVertex {\n let positions = array<vec2f, 3>(vec2f(-1.0, -1.0), vec2f(3.0, -1.0), vec2f(-1.0, 3.0));\n let uvs = array<vec2f, 3>(vec2f(0.0, 1.0), vec2f(2.0, 1.0), vec2f(0.0, -1.0));\n return CityVertex(vec4f(positions[index], 0.0, 1.0), uvs[index]);\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let band = params.k * 0.5;\n let falloff = smoothstep(band, 0.5, abs(uv.y - 0.5));\n let radius = params.j * falloff * 0.018;\n let center = textureSampleLevel(t_city, citySampler, uv, 0.0).rgb;\n if (radius * params.resolution.y < 0.3) { return st_post(center, uv); }\n var sum = center;\n var weights = 1.0;\n let count = st_steps(48);\n for (var i = 0; i < count; i += 1) {\n let fraction = (f32(i) + 0.5) / f32(count);\n let angle = f32(i) * 2.399963;\n let offset = vec2f(cos(angle) / st_aspect(), sin(angle)) * sqrt(fraction) * radius;\n let weight = exp(-fraction * 2.0);\n sum += textureSampleLevel(t_city, citySampler, uv + offset, 0.0).rgb * weight;\n weights += weight;\n }\n return st_post(sum / weights, uv);\n}\n\n// ---------------------------------------------------------------------------\n// chromatic-city\n// ---------------------------------------------------------------------------\n\nfn cityInset(cell : vec2f) -> f32 {\n return 0.5 * (params.h + params.i * st_hash21(cell + vec2f(params.a, 71.3)));\n}\n\nfn cityHeight(cell : vec2f) -> f32 {\n let seed = st_hash22(vec2f(params.a, params.a + 17.0)) * 200.0;\n let q = cell * params.c + seed;\n let drift = vec2f(sin(st_time() * 0.12), cos(st_time() * 0.09)) * 0.35;\n let broad = st_noise2(q + drift);\n let detail = st_noise2(q * 2.13 + vec2f(31.7, 9.2));\n let field = clamp((broad * 0.78 + detail * 0.22 - 0.23) * 1.7, 0.0, 1.0);\n let level = field * params.d;\n // Hold each terrace, then ease to the next before the integer boundary.\n let terraces = (floor(level) + smoothstep(0.75, 1.0, fract(level))) / params.d;\n let tower = pow(st_hash21(cell + seed), 12.0) * params.e;\n return 0.3 + (terraces + tower) * params.b;\n}\n\n// Follow the light through grid cells, including the gaps between columns.\nfn cityShadow(p : vec3f, light : vec3f) -> f32 {\n var cell = floor(p.xz);\n let direction = sign(light.xz);\n let delta = 1.0 / abs(light.xz);\n var boundary = (select(cell, cell + 1.0, light.xz > vec2f(0.0)) - p.xz) / light.xz;\n var shadow = 1.0;\n var travel = 0.0;\n let ceiling = 0.3 + (1.0 + params.e) * params.b;\n for (var i = 0; i < st_steps(48); i += 1) {\n let gap = cityInset(cell);\n let a = (cell + gap - p.xz) / light.xz;\n let b = (cell + 1.0 - gap - p.xz) / light.xz;\n let near = min(a, b);\n let far = max(a, b);\n let enter = max(0.02, max(near.x, near.y));\n let leave = min(far.x, far.y);\n if (enter < leave) {\n let clearance = p.y + light.y * enter - cityHeight(cell);\n if (clearance < 0.0) { return 0.0; }\n shadow = min(shadow, clamp(clearance * 5.0 / max(enter, 0.1), 0.0, 1.0));\n }\n if (boundary.x < boundary.y) {\n travel = boundary.x;\n boundary.x += delta.x;\n cell.x += direction.x;\n } else {\n travel = boundary.y;\n boundary.y += delta.y;\n cell.y += direction.y;\n }\n if (p.y + travel * light.y > ceiling) { break; }\n }\n return shadow;\n}\n\nfn cityOcclusion(p : vec3f, cell : vec2f) -> f32 {\n let local = p.xz - cell;\n let distances = vec4f(local.x, 1.0 - local.x, local.y, 1.0 - local.y);\n let heights = vec4f(\n cityHeight(cell - vec2f(1.0, 0.0)), cityHeight(cell + vec2f(1.0, 0.0)),\n cityHeight(cell - vec2f(0.0, 1.0)), cityHeight(cell + vec2f(0.0, 1.0)),\n );\n let walls = max(heights - p.y, vec4f(0.0));\n let shade = walls / (walls + 0.7) * exp(-max(distances, vec4f(0.0)) * 2.5);\n return exp(-dot(shade, vec4f(0.65)));\n}\n\nfn cityColor(height : f32) -> vec3f {\n let t = clamp((height - 0.3) / params.b, 0.0, 1.0);\n let violet = mix(params.colorA.rgb, params.colorB.rgb, 0.65) * vec3f(0.65, 0.4, 1.0);\n var col = mix(params.colorA.rgb, violet, smoothstep(0.05, 0.35, t));\n col = mix(col, params.colorB.rgb, smoothstep(0.32, 0.6, t));\n return mix(col, params.colorC.rgb, smoothstep(0.6, 0.95, t));\n}\n\n@fragment fn fs_scene(@location(0) uv : vec2f) -> @location(0) vec4f {\n let yaw = params.f;\n let pitch = params.g;\n let rd = vec3f(sin(yaw) * cos(pitch), -sin(pitch), cos(yaw) * cos(pitch));\n let right = vec3f(cos(yaw), 0.0, -sin(yaw));\n let up = cross(rd, right);\n let screen = st_centered(uv) * params.scale;\n let focus = vec3f(params.pointer.x - 0.5, 0.0, params.pointer.y - 0.5) * 2.0;\n let origin = focus - rd * 40.0 + right * screen.x - up * screen.y;\n let ceiling = 0.3 + (1.0 + params.e) * params.b + 0.01;\n var travel = (ceiling - origin.y) / rd.y;\n let start = origin + rd * travel;\n var cell = floor(start.xz);\n let direction = sign(rd.xz);\n let delta = 1.0 / max(abs(rd.xz), vec2f(0.00001));\n var boundary = travel + (select(cell, cell + 1.0, rd.xz > vec2f(0.0)) - start.xz) / rd.xz;\n var col = params.colorA.rgb * 0.12;\n\n // Visit cells in ray order; intersect each box exactly so thin tops cannot be skipped.\n for (var i = 0; i < st_steps(128); i = i + 1) {\n let height = cityHeight(cell);\n let gap = cityInset(cell);\n let lo = vec3f(cell.x + gap, -0.5, cell.y + gap);\n let hi = vec3f(cell.x + 1.0 - gap, height, cell.y + 1.0 - gap);\n let a = (lo - origin) / rd;\n let b = (hi - origin) / rd;\n let near = min(a, b);\n let far = max(a, b);\n let enter = max(near.x, max(near.y, near.z));\n let leave = min(far.x, min(far.y, far.z));\n if (enter <= leave && leave >= travel - 0.001) {\n let p = origin + rd * enter;\n var normal = vec3f(0.0, 1.0, 0.0);\n if (near.x > near.y && near.x > near.z) { normal = vec3f(-sign(rd.x), 0.0, 0.0); }\n if (near.z > near.y && near.z >= near.x) { normal = vec3f(0.0, 0.0, -sign(rd.z)); }\n let light = normalize(vec3f(-0.8, 1.0, 0.3));\n let diffuse = max(dot(normal, light), 0.0);\n var shadow = 0.0;\n if (diffuse > 0.0) { shadow = cityShadow(p + normal * 0.025, light); }\n let occlusion = cityOcclusion(p, cell);\n let rise = clamp(p.y / height, 0.0, 1.0);\n let sideShade = select(0.5 + 0.5 * smoothstep(0.0, 1.0, rise), 1.0, normal.y > 0.5);\n let local = p.xz - cell;\n let edge = min(min(local.x - gap, 1.0 - gap - local.x), min(local.y - gap, 1.0 - gap - local.y));\n let rim = (1.0 - smoothstep(0.0, 0.035, edge)) * max(normal.y, 0.0);\n let ambient = vec3f(0.34, 0.4, 0.58) * occlusion;\n let direct = vec3f(1.0, 0.91, 0.78) * diffuse * shadow;\n col = cityColor(height) * (ambient + direct) * sideShade;\n col = col * (0.92 + 0.08 * st_hash21(cell + params.a));\n col = col + vec3f(0.06, 0.055, 0.05) * rim * shadow;\n break;\n }\n if (boundary.x < boundary.y) {\n travel = boundary.x;\n boundary.x += delta.x;\n cell.x += direction.x;\n } else {\n travel = boundary.y;\n boundary.y += delta.y;\n cell.y += direction.y;\n }\n if ((origin + rd * travel).y < -0.5) { break; }\n }\n return vec4f(col * params.intensity, 1.0);\n}\n",
|
|
21
22
|
"cloth": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// cloth\n// ---------------------------------------------------------------------------\n\n// Cloth — a sheet of silk pinned by its top edge, and the pointer is a hand.\n//\n// The simulation is Jakobsen's (2001): points remember where they were last\n// step instead of carrying a velocity, so integration is one subtraction and\n// constraints are enforced by simply moving points — no forces, no springs,\n// no stiffness explosion. Every point holds twelve distance constraints\n// (structural, shear, bend) and the solver is Jacobi rather than Gauss-Seidel\n// because thousands of points relax in parallel; ten sweeps a frame is\n// enough for fabric that stretches like cloth and not like rubber. The\n// pointer carries an invisible sphere the constraints drape around.\n//\n// Drawing it is the unusual part. There is no vertex pipeline here, so the\n// cloth rasterises itself: each cell of the grid splats its own little patch\n// of surface into a G-buffer with atomicMin — depth rides the high bits and\n// the cell and its local uv ride the low ones, so one atomic is both the\n// z-test and the write. The fragment stage rebuilds the exact point on the\n// sheet from the simulation buffers and shades it there: smooth normals, a\n// thread-direction sheen, and a shadow thrown on the wall behind.\n\nstruct SimUniforms {\n // Seconds this step advances the simulation. 0 redraws without moving.\n dt : f32,\n aspect : f32,\n // How far the pointer moved this frame, in uv per second.\n pointerVel : vec2f,\n // The raster the cloth draws itself into.\n rasterW : f32,\n rasterH : f32,\n // How awake the pointer's sphere is. It wakes the moment the hand moves\n // and falls asleep after a few still seconds, so an untouched canvas shows\n // a sheet, not a sheet with a mysterious dent where a cursor happens to be.\n grab : f32,\n}\n\n@group(0) @binding(1) var<uniform> sim : SimUniforms;\n\n// Cloth grid. Positions ping-pong through the Jacobi sweeps; `prev` is the\n// verlet memory of where each point was one step ago.\nconst NX : i32 = 64;\nconst NY : i32 = 44;\n\n@group(0) @binding(2) var<storage, read> ptsIn : array<vec4f>;\n@group(0) @binding(3) var<storage, read_write> ptsOut : array<vec4f>;\n@group(0) @binding(4) var<storage, read_write> prevPts : array<vec4f>;\n@group(0) @binding(5) var<storage, read_write> norms : array<vec4f>;\n@group(0) @binding(6) var<storage, read_write> gbuf : array<atomic<u32>>;\n\n// The fragment stage reads the same state through read-only bindings.\n@group(0) @binding(8) var<storage, read> ptsView : array<vec4f>;\n@group(0) @binding(9) var<storage, read> normsView : array<vec4f>;\n@group(0) @binding(10) var<storage, read> gbufView : array<u32>;\n\n// Rest dimensions of the sheet, in world units. y grows downward like uv.\nconst CLOTH_W : f32 = 1.16;\nconst CLOTH_H : f32 = 1.04;\nconst PIN_Y : f32 = -0.46;\nconst REST_X : f32 = CLOTH_W / f32(NX - 1);\nconst REST_Y : f32 = CLOTH_H / f32(NY - 1);\nconst DIAG : f32 = 1.4142135;\nconst EMPTY : u32 = 0xffffffffu;\n\nfn pinAt(col : i32) -> vec3f {\n return vec3f(-CLOTH_W * 0.5 + f32(col) * REST_X, PIN_Y, 0.0);\n}\n\n// A mild perspective: z away from the viewer shrinks, z toward grows.\nfn project(p : vec3f) -> vec3f {\n let zoom = 0.82 * clamp(params.scale, 0.3, 2.5);\n let persp = 1.0 / (1.0 + p.z * 0.68);\n let s = p.xy * zoom * persp;\n return vec3f((0.5 + s.x / sim.aspect) * sim.rasterW, (0.5 + s.y) * sim.rasterH, p.z);\n}\n\n// Where the pointer sits on the cloth's plane, inverted from the projection.\nfn pointerWorld() -> vec3f {\n let zoom = 0.82 * clamp(params.scale, 0.3, 2.5);\n return vec3f(\n (params.pointer.x - 0.5) * sim.aspect / zoom,\n (params.pointer.y - 0.5) / zoom,\n 0.0,\n );\n}\n\nfn windAt(p : vec3f, t : f32) -> vec3f {\n // Two rates: a slow breathe that swings the whole sheet, and finer gusts\n // that ripple across it. Most of the wind blows in z — the billow is what\n // reads as depth.\n let breeze = 0.14 + params.warp * 0.2;\n let gust = params.warp;\n let n1 = st_fbm3(vec3f(p.x * 1.4, p.y * 1.4, t * 0.35), 2) - 0.5;\n let n2 = st_fbm3(vec3f(p.x * 2.3 + 11.0, p.y * 2.1, t * 0.8), 2) - 0.5;\n let slow = sin(t * 0.5 + p.y * 1.8) * 0.5 + 0.5;\n return vec3f(\n breeze * (0.4 + 0.6 * slow) + n2 * gust * 0.5,\n n1 * gust * 0.24,\n n1 * (gust * 1.2 + breeze * 0.6) + sin(t * 0.43 + p.x * 2.2) * breeze * 0.7,\n );\n}\n\n// --- passes ------------------------------------------------------------------\n\n@compute @workgroup_size(64)\nfn cs_integrate(@builtin(global_invocation_id) gid : vec3u) {\n let i = i32(gid.x);\n if (i >= NX * NY) { return; }\n let col = i % NX;\n let row = i / NX;\n\n // Read the verlet memory before overwriting it — this thread is the only\n // writer of its own slot, so the order within the function is the hazard.\n let p = ptsIn[i].xyz;\n let prev = prevPts[i].xyz;\n prevPts[i] = vec4f(p, 0.0);\n if (row == 0) {\n ptsOut[i] = vec4f(pinAt(col), 0.0);\n return;\n }\n\n let t = params.time * params.speed;\n let h = sim.dt;\n // params.d is Drape: heavy velvet at 2, weightless chiffon near 0.\n let gravity = vec3f(0.0, 0.75 + params.d * 0.8, 0.0);\n let acc = gravity + windAt(p, t) * (2.6 / max(0.4 + params.d, 0.4));\n\n let inertia = (p - prev) * 0.972;\n ptsOut[i] = vec4f(p + inertia + acc * h * h, 0.0);\n}\n\n@compute @workgroup_size(64)\nfn cs_constrain(@builtin(global_invocation_id) gid : vec3u) {\n let i = i32(gid.x);\n if (i >= NX * NY) { return; }\n let col = i % NX;\n let row = i / NX;\n\n if (row == 0) {\n ptsOut[i] = vec4f(pinAt(col), 0.0);\n return;\n }\n\n let p = ptsIn[i].xyz;\n var sum = vec3f(0.0);\n var weight = 0.0;\n\n // Twelve constraints in three rings. Structural holds the weave together,\n // shear stops it collapsing into a parallelogram, bend resists creasing.\n for (var k = 0; k < 12; k = k + 1) {\n var off : vec2i;\n var rest : f32;\n var stiff : f32;\n switch (k) {\n case 0: { off = vec2i(-1, 0); rest = REST_X; stiff = 1.0; }\n case 1: { off = vec2i(1, 0); rest = REST_X; stiff = 1.0; }\n case 2: { off = vec2i(0, -1); rest = REST_Y; stiff = 1.0; }\n case 3: { off = vec2i(0, 1); rest = REST_Y; stiff = 1.0; }\n case 4: { off = vec2i(-1, -1); rest = length(vec2f(REST_X, REST_Y)); stiff = 0.82; }\n case 5: { off = vec2i(1, -1); rest = length(vec2f(REST_X, REST_Y)); stiff = 0.82; }\n case 6: { off = vec2i(-1, 1); rest = length(vec2f(REST_X, REST_Y)); stiff = 0.82; }\n case 7: { off = vec2i(1, 1); rest = length(vec2f(REST_X, REST_Y)); stiff = 0.82; }\n case 8: { off = vec2i(-2, 0); rest = REST_X * 2.0; stiff = 0.45; }\n case 9: { off = vec2i(2, 0); rest = REST_X * 2.0; stiff = 0.45; }\n case 10: { off = vec2i(0, -2); rest = REST_Y * 2.0; stiff = 0.45; }\n default: { off = vec2i(0, 2); rest = REST_Y * 2.0; stiff = 0.45; }\n }\n let nc = col + off.x;\n let nr = row + off.y;\n if (nc < 0 || nc >= NX || nr < 0 || nr >= NY) { continue; }\n let q = ptsIn[nr * NX + nc].xyz;\n let d = p - q;\n let len = max(length(d), 0.00001);\n // Each endpoint owns half the error; Jacobi applies the average below.\n sum = sum + d * ((rest - len) / len) * 0.5 * stiff;\n weight = weight + stiff;\n }\n\n // Jacobi needs over-relaxation to converge in a dozen sweeps — 2.2 over\n // the summed stiffness is the strongest value that stays stable here.\n var next = p + sum * (2.2 / max(weight, 1.0));\n\n // The pointer's sphere. Pure projection — the constraints above turn the\n // shove into folds that travel across the whole sheet.\n let sphereR = (0.05 + params.c * 0.13) * sim.grab;\n let toP = next - pointerWorld();\n let dist = length(toP);\n if (dist < sphereR) {\n next = pointerWorld() + toP * (sphereR / max(dist, 0.0001));\n // A moving hand drags as well as blocks — a whisper of it per sweep.\n next = next + vec3f(sim.pointerVel * sim.dt * 0.1, 0.0);\n }\n\n ptsOut[i] = vec4f(next, 0.0);\n}\n\n@compute @workgroup_size(64)\nfn cs_normals(@builtin(global_invocation_id) gid : vec3u) {\n let i = i32(gid.x);\n if (i >= NX * NY) { return; }\n let col = i % NX;\n let row = i / NX;\n let l = ptsIn[row * NX + max(col - 1, 0)].xyz;\n let r = ptsIn[row * NX + min(col + 1, NX - 1)].xyz;\n let b = ptsIn[max(row - 1, 0) * NX + col].xyz;\n let t = ptsIn[min(row + 1, NY - 1) * NX + col].xyz;\n norms[i] = vec4f(normalize(cross(r - l, t - b)), 0.0);\n}\n\n@compute @workgroup_size(256)\nfn cs_clear(@builtin(global_invocation_id) gid : vec3u) {\n let cells = u32(sim.rasterW) * u32(sim.rasterH);\n if (gid.x >= cells) { return; }\n atomicStore(&gbuf[gid.x], EMPTY);\n}\n\n// One thread per cell of the cloth: estimate the patch's footprint on the\n// raster and splat enough samples to cover it without holes. Each sample is\n// one atomicMin: twelve depth bits up top so nearer wins, then the cell and\n// its local uv, so the winning write already carries everything the fragment\n// stage needs — no second pass, and no bit-exact recomputation to trust.\n@compute @workgroup_size(64)\nfn cs_raster(@builtin(global_invocation_id) gid : vec3u) {\n let cell = i32(gid.x);\n if (cell >= (NX - 1) * (NY - 1)) { return; }\n let cx = cell % (NX - 1);\n let cy = cell / (NX - 1);\n let p00 = ptsIn[cy * NX + cx].xyz;\n let p10 = ptsIn[cy * NX + cx + 1].xyz;\n let p01 = ptsIn[(cy + 1) * NX + cx].xyz;\n let p11 = ptsIn[(cy + 1) * NX + cx + 1].xyz;\n\n let s00 = project(p00);\n let s10 = project(p10);\n let s01 = project(p01);\n let s11 = project(p11);\n\n let lo = min(min(s00.xy, s10.xy), min(s01.xy, s11.xy));\n let hi = max(max(s00.xy, s10.xy), max(s01.xy, s11.xy));\n let span = hi - lo;\n // Nearly two samples per pixel of the widest axis: oversampled enough that\n // the bilinear patch leaves no gaps even mid-stretch, capped so a torn\n // cell cannot stall.\n let k = clamp(i32(max(span.x, span.y) * 1.9) + 1, 2, 36);\n\n let w = i32(sim.rasterW);\n let h = i32(sim.rasterH);\n for (var j = 0; j < k; j = j + 1) {\n for (var s = 0; s < k; s = s + 1) {\n let u = (f32(s) + 0.5) / f32(k);\n let v = (f32(j) + 0.5) / f32(k);\n let pos = mix(mix(p00, p10, u), mix(p01, p11, u), v);\n let scr = project(pos);\n let px = vec2i(scr.xy);\n if (px.x < 0 || px.x >= w || px.y < 0 || px.y >= h) { continue; }\n // 4094 rather than 4095, so a full G-buffer word can never collide\n // with the EMPTY sentinel.\n let depth = u32(clamp((scr.z + 2.0) * 1024.0, 0.0, 4094.0));\n let word = (depth << 20u) | (u32(cell) << 8u) | (u32(u * 15.99) << 4u) | u32(v * 15.99);\n atomicMin(&gbuf[px.y * w + px.x], word);\n }\n }\n}\n\n// --- the picture -------------------------------------------------------------\n\nfn coveredAt(px : vec2i) -> f32 {\n let w = i32(sim.rasterW);\n let h = i32(sim.rasterH);\n let c = vec2i(clamp(px.x, 0, w - 1), clamp(px.y, 0, h - 1));\n return select(1.0, 0.0, gbufView[c.y * w + c.x] == EMPTY);\n}\n\nfn backdrop(uv : vec2f) -> vec3f {\n // A wall behind the sheet, lit from the same corner as the cloth.\n let glow = 1.0 - length(vec2f((uv.x - 0.5) * sim.aspect, uv.y - 0.36)) * 0.9;\n return params.colorA.rgb * (0.16 + 0.3 * clamp(glow, 0.0, 1.0));\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let rs = vec2f(sim.rasterW, sim.rasterH);\n let pxf = uv * rs - 0.5;\n let base = vec2i(floor(pxf));\n let f = pxf - floor(pxf);\n\n // Coverage sampled bilinearly is the antialiasing: the silhouette fades\n // over one raster texel instead of stepping.\n let cov = mix(\n mix(coveredAt(base), coveredAt(base + vec2i(1, 0)), f.x),\n mix(coveredAt(base + vec2i(0, 1)), coveredAt(base + vec2i(1, 1)), f.x),\n f.y,\n );\n\n // The wall, with the sheet's shadow thrown down-right of it.\n var wall = backdrop(uv);\n let shadowPx = vec2i(pxf - vec2f(rs.x * -0.018, rs.y * -0.03));\n let shade = (coveredAt(shadowPx) + coveredAt(shadowPx + vec2i(2, 3)) + coveredAt(shadowPx - vec2i(2, 1))) / 3.0;\n wall = wall * (1.0 - shade * 0.45);\n\n if (cov < 0.001) {\n return st_post(st_tonemap(wall * params.intensity), uv);\n }\n\n // Take the G-buffer word of the nearest covered texel.\n var px = base;\n if (coveredAt(px) < 0.5) { px = base + vec2i(1, 0); }\n if (coveredAt(px) < 0.5) { px = base + vec2i(0, 1); }\n if (coveredAt(px) < 0.5) { px = base + vec2i(1, 1); }\n let w = i32(sim.rasterW);\n let word = gbufView[clamp(px.y, 0, i32(sim.rasterH) - 1) * w + clamp(px.x, 0, w - 1)];\n\n let cell = i32((word >> 8u) & 0xfffu);\n let cu = f32((word >> 4u) & 0xfu) / 15.0;\n let cv = f32(word & 0xfu) / 15.0;\n let cx = cell % (NX - 1);\n let cy = cell / (NX - 1);\n\n // Rebuild the exact point on the sheet from the simulation buffers — the\n // shading is computed on the true surface, not on raster texels.\n let i00 = cy * NX + cx;\n let n = normalize(mix(\n mix(normsView[i00].xyz, normsView[i00 + 1].xyz, cu),\n mix(normsView[i00 + NX].xyz, normsView[i00 + NX + 1].xyz, cu),\n cv,\n ));\n\n // The thread direction: the x axis laid onto the surface. Deriving it from\n // the smooth normal keeps the sheen continuous across cell boundaries,\n // where a per-cell edge vector would band.\n let tangent = normalize(vec3f(1.0, 0.0, 0.0) - n * n.x);\n\n let lightDir = normalize(vec3f(-0.45, -0.55, -0.7));\n let viewDir = vec3f(0.0, 0.0, -1.0);\n\n // Cloth is lit from both sides — a sheet has no inside.\n let diffuse = abs(dot(n, lightDir));\n\n // Kajiya-Kay: silk highlights run along the threads, not around a point.\n let th = dot(tangent, normalize(lightDir + viewDir));\n let sheen = pow(max(1.0 - th * th, 0.0), 48.0);\n\n // Grazing angles catch the light — the fresnel rim that reads as sheen.\n let rim = pow(1.0 - abs(dot(n, viewDir)), 2.6);\n\n // A steep diffuse curve: the folds go genuinely dark, which is where the\n // sense of weight comes from.\n var col = mix(params.colorA.rgb * 0.45, params.colorB.rgb, 0.10 + 0.90 * diffuse * diffuse);\n col = col + params.colorC.rgb * (sheen * 0.7 + rim * 0.45) * params.b;\n\n col = mix(wall, col, cov);\n return st_post(st_tonemap(col * params.intensity), uv);\n}\n",
|
|
22
23
|
"cumulus": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// cumulus\n// ---------------------------------------------------------------------------\n\n// Cumulus — a sky of fair-weather cloud, shaded by one cheat.\n//\n// The clouds are fbm on a plane overhead, warped once so they cauliflower.\n// Their lighting is a single extra sample toward the sun: where density\n// falls off in that direction the cloud face is lit, where it rises the\n// face is in its own shadow. God rays are the same field again, sampled a\n// few times along the screen-space line to the sun.\n\nfn cloudDensity(q : vec2f, t : f32) -> f32 {\n let w = st_fbm2(q * 2.0 + vec2f(t * 0.03, 0.0), 3);\n return st_fbm2(q + (w - 0.5) * 0.8 + vec2f(t * 0.05, t * 0.012), 5);\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let t = st_time();\n let p = st_centered(uv);\n let yUp = -p.y;\n\n let look = (params.pointer - vec2f(0.5)) * 0.15;\n\n let rd = normalize(vec3f(p.x + look.x * 0.2, yUp + 0.32 + look.y * 0.2, 1.0));\n let sunDir = normalize(vec3f(0.45, 0.16 + 0.4 * params.c, 0.65));\n let sunAmt = clamp(dot(rd, sunDir), 0.0, 1.0);\n\n // Sky: colorA overhead falling to a bright horizon, sun in colorC.\n var col = mix(mix(params.colorA.rgb, vec3f(1.0), 0.6), params.colorA.rgb, smoothstep(0.0, 0.4, rd.y));\n col = col + params.colorC.rgb * pow(sunAmt, 700.0) * 2.5;\n col = col + params.colorC.rgb * pow(sunAmt, 12.0) * 0.3;\n\n if (rd.y > 0.015) {\n // Project onto the cloud deck.\n let q = rd.xz / rd.y * 0.6 * params.scale;\n let fade = smoothstep(0.015, 0.14, rd.y);\n\n let den = cloudDensity(q, t);\n let cover = mix(0.72, 0.42, clamp(params.a, 0.0, 1.5) / 1.5);\n let body = smoothstep(cover, cover + 0.17 * params.b, den);\n\n // The one-sample cheat: density falling toward the sun means lit.\n let toward = cloudDensity(q + sunDir.xz * 0.14, t);\n let lit = clamp((den - toward) * 4.0 + 0.45, 0.0, 1.0);\n let shade = mix(params.colorB.rgb * 0.72, vec3f(1.03, 1.01, 0.98), lit);\n\n col = mix(col, shade, body * fade * 0.96);\n\n // Silver lining where a cloud edge crosses the sun's halo.\n let edge = smoothstep(cover, cover + 0.08, den) * (1.0 - smoothstep(cover + 0.1, cover + 0.3, den));\n col = col + params.colorC.rgb * edge * pow(sunAmt, 6.0) * 0.8 * fade;\n }\n\n // God rays: the cloud field re-read a few times along the line to the sun\n // in screen space — pure math, the \"mask\" is the same analytic function.\n let sunScreen = vec2f(0.32 - look.x * 0.3, 0.05 + 0.28 * params.c);\n var ray = 0.0;\n var weight = 0.55;\n let toSun = sunScreen - vec2f(p.x, yUp);\n let samples = st_steps(8);\n for (var i = 1; i <= samples; i = i + 1) {\n let sp = vec2f(p.x, yUp) + toSun * (f32(i) / f32(samples));\n let sr = normalize(vec3f(sp.x, sp.y + 0.32, 1.0));\n if (sr.y < 0.02) { continue; }\n let sq = sr.xz / sr.y * 0.6 * params.scale;\n let open = 1.0 - smoothstep(0.5, 0.72, cloudDensity(sq, t));\n ray = ray + open * weight;\n weight = weight * 0.82;\n }\n let towardSun = clamp(1.0 - length(toSun) * 0.9, 0.0, 1.0);\n col = col + params.colorC.rgb * ray * 0.05 * params.d * towardSun;\n\n return st_post(st_tonemap(col * params.intensity), uv);\n}\n",
|
|
23
24
|
"dither": "// shadertown shared prelude — prepended to every shader at build time.\n// One uniform block is the whole ABI: every shader reads the same struct,\n// so the runtime can swap shaders without changing a binding.\n\nstruct Params {\n resolution : vec2f,\n pointer : vec2f,\n time : f32,\n speed : f32,\n scale : f32,\n intensity : f32,\n vibrancy : f32,\n grain : f32,\n vignette : f32,\n warp : f32,\n a : f32,\n b : f32,\n c : f32,\n d : f32,\n // 1 on the High tier, 0 on Low. Read it through st_steps, not directly.\n quality : f32,\n e : f32,\n f : f32,\n g : f32,\n colorA : vec4f,\n colorB : vec4f,\n colorC : vec4f,\n // Appended so existing controls and colors keep their byte offsets.\n h : f32,\n i : f32,\n j : f32,\n k : f32,\n l : f32,\n m : f32,\n n : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n\nconst PI : f32 = 3.141592653589793;\nconst TAU : f32 = 6.283185307179586;\n\nfn st_time() -> f32 {\n return params.time * params.speed;\n}\n\n// Centred, aspect-corrected coordinates. y stays in [-0.5, 0.5].\nfn st_centered(uv : vec2f) -> vec2f {\n let aspect = params.resolution.x / max(params.resolution.y, 1.0);\n return vec2f((uv.x - 0.5) * aspect, uv.y - 0.5);\n}\n\nfn st_aspect() -> f32 {\n return params.resolution.x / max(params.resolution.y, 1.0);\n}\n\nfn st_rot(angle : f32) -> mat2x2f {\n let s = sin(angle);\n let c = cos(angle);\n return mat2x2f(c, -s, s, c);\n}\n\n// The device-pixel size of one virtual cell, for pixel-art shaders. Cells\n// must be a whole number of device pixels: dividing the canvas by the\n// requested count directly leaves some cells one pixel fatter than others,\n// which the eye reads instantly as a broken grid. Use as:\n// let px = st_pixelSize(params.a);\n// let cell = floor(uv * params.resolution / px);\n// let puv = (cell + 0.5) * px / params.resolution;\nfn st_pixelSize(pixels : f32) -> f32 {\n return max(round(params.resolution.y / max(pixels, 8.0)), 1.0);\n}\n\n// --- quality ---------------------------------------------------------------\n// The runtime draws Low at a device pixel ratio of 1, which is most of the\n// saving. These are how a shader halves its own work per pixel as well, so\n// that the shaders whose cost is a loop — a march, a fan of rays, a spiral of\n// taps — cost half on Low and not merely a quarter of the pixels.\n\n// Whether the runtime asked for the cheaper picture.\nfn st_low() -> bool {\n return params.quality < 0.5;\n}\n\n// An iteration count for the current tier: n on High, about half on Low, and\n// never under three unless n itself is. Give it the bound of every loop whose\n// length is cost rather than look. A loop of three curtains or five layers is\n// the picture; a loop of ninety-six march steps is the price of it.\nfn st_steps(n : i32) -> i32 {\n if (!st_low()) { return n; }\n return max(i32(ceil(f32(n) * 0.5)), min(n, 3));\n}\n\n// --- hashing ---------------------------------------------------------------\n\nfn st_hash11(x : f32) -> f32 {\n var p = fract(x * 0.1031);\n p = p * (p + 33.33);\n return fract(p * (p + p));\n}\n\nfn st_hash21(p : vec2f) -> f32 {\n var p3 = fract(vec3f(p.xyx) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn st_hash22(p : vec2f) -> vec2f {\n var p3 = fract(vec3f(p.xyx) * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nfn st_hash33(p : vec3f) -> vec3f {\n var p3 = fract(p * vec3f(0.1031, 0.1030, 0.0973));\n p3 = p3 + dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yxx) * p3.zyx);\n}\n\n// --- noise -----------------------------------------------------------------\n\nfn st_noise2(p : vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = st_hash21(i);\n let b = st_hash21(i + vec2f(1.0, 0.0));\n let c = st_hash21(i + vec2f(0.0, 1.0));\n let d = st_hash21(i + vec2f(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn st_noise3(p : vec3f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let n000 = st_hash33(i + vec3f(0.0, 0.0, 0.0)).x;\n let n100 = st_hash33(i + vec3f(1.0, 0.0, 0.0)).x;\n let n010 = st_hash33(i + vec3f(0.0, 1.0, 0.0)).x;\n let n110 = st_hash33(i + vec3f(1.0, 1.0, 0.0)).x;\n let n001 = st_hash33(i + vec3f(0.0, 0.0, 1.0)).x;\n let n101 = st_hash33(i + vec3f(1.0, 0.0, 1.0)).x;\n let n011 = st_hash33(i + vec3f(0.0, 1.0, 1.0)).x;\n let n111 = st_hash33(i + vec3f(1.0, 1.0, 1.0)).x;\n let x00 = mix(n000, n100, u.x);\n let x10 = mix(n010, n110, u.x);\n let x01 = mix(n001, n101, u.x);\n let x11 = mix(n011, n111, u.x);\n return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);\n}\n\nfn st_fbm2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.5);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise2(shifted);\n shifted = rotation * shifted * 2.02;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\nfn st_fbm3(p : vec3f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n value = value + amplitude * st_noise3(shifted);\n shifted = shifted * 2.03;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// Ridged noise — sharp crests instead of soft hills.\nfn st_ridge2(p : vec2f, octaves : i32) -> f32 {\n var value = 0.0;\n var amplitude = 0.5;\n var shifted = p;\n let rotation = st_rot(0.7);\n let count = st_steps(octaves);\n for (var i = 0; i < count; i = i + 1) {\n let n = 1.0 - abs(st_noise2(shifted) * 2.0 - 1.0);\n value = value + amplitude * n * n;\n shifted = rotation * shifted * 2.11;\n amplitude = amplitude * 0.5;\n }\n return value;\n}\n\n// --- colour ----------------------------------------------------------------\n\n// Three-stop ramp built from the user's colours. t is clamped to [0, 1].\nfn st_palette(t : f32) -> vec3f {\n let x = clamp(t, 0.0, 1.0);\n let low = mix(params.colorA.rgb, params.colorB.rgb, smoothstep(0.0, 0.5, x));\n return mix(low, params.colorC.rgb, smoothstep(0.5, 1.0, x));\n}\n\n// Same ramp, but wrapping — good for cycling and polar shaders.\nfn st_paletteCyclic(t : f32) -> vec3f {\n let x = fract(t);\n let tri = 1.0 - abs(x * 2.0 - 1.0);\n return st_palette(tri);\n}\n\nfn st_luma(c : vec3f) -> f32 {\n return dot(c, vec3f(0.2126, 0.7152, 0.0722));\n}\n\nfn st_saturation(c : vec3f, amount : f32) -> vec3f {\n return mix(vec3f(st_luma(c)), c, amount);\n}\n\nfn st_tonemap(c : vec3f) -> vec3f {\n let x = max(c, vec3f(0.0));\n return (x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14);\n}\n\n// --- shared post chain -----------------------------------------------------\n// Every shader ends here, so vibrancy / grain / vignette behave identically\n// across the whole catalogue.\nfn st_post(color : vec3f, uv : vec2f) -> vec4f {\n var c = st_saturation(max(color, vec3f(0.0)), params.vibrancy);\n\n if (params.grain > 0.0) {\n let seed = uv * params.resolution + vec2f(params.time * 61.7, params.time * 37.3);\n let n = st_hash21(floor(seed));\n c = c + (n - 0.5) * params.grain;\n }\n\n if (params.vignette > 0.0) {\n let d = length(uv - vec2f(0.5)) * 1.41421356;\n c = c * (1.0 - params.vignette * smoothstep(0.22, 1.0, d));\n }\n\n return vec4f(clamp(c, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// dither\n// ---------------------------------------------------------------------------\n\n// Dither — a smooth field quantised through an 8x8 Bayer matrix.\n// Deliberately low-fi: flat colour, a visible pattern, no antialiasing.\n\n// Ordered-dither threshold, built by interleaving the bits of y and x^y.\nfn bayer8(coord : vec2f) -> f32 {\n let x = i32(coord.x) & 7;\n let y = i32(coord.y) & 7;\n var index = 0;\n for (var i = 0u; i < 3u; i = i + 1u) {\n let shift = 2u - i;\n index = (index << 1u) | ((y >> shift) & 1);\n index = (index << 1u) | (((x ^ y) >> shift) & 1);\n }\n return f32(index) / 64.0;\n}\n\n@fragment fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {\n let t = st_time();\n let p = st_centered(uv) * params.scale;\n\n // Centred on 0.5 so every quantisation level gets used. Biasing the source\n // upwards instead just crushes the image to the top level.\n let field = st_fbm2(p * 2.0 + vec2f(t * 0.10, t * 0.06), 5);\n let sweep = clamp((field - 0.5) * 1.7 + (0.5 - uv.y) * params.c + 0.5, 0.0, 1.0);\n\n // Pixelate first, so the pattern reads the same at any resolution.\n let pixel = max(params.a, 1.0);\n let screenPos = floor(uv * params.resolution / pixel);\n let threshold = (bayer8(screenPos) - 0.5) / max(floor(params.b), 2.0);\n\n let levels = max(floor(params.b), 2.0);\n let stepped = min(floor(clamp(sweep + threshold * params.d * 2.0, 0.0, 1.0) * levels), levels - 1.0);\n let quantised = stepped / (levels - 1.0);\n\n let col = st_palette(quantised) * params.intensity;\n return st_post(col, uv);\n}\n",
|
|
@@ -97,6 +98,7 @@ export const shaderKinds = {
|
|
|
97
98
|
"caldera": "generative",
|
|
98
99
|
"caustics": "generative",
|
|
99
100
|
"chladni": "graph",
|
|
101
|
+
"chromatic-city": "graph",
|
|
100
102
|
"cloth": "compute",
|
|
101
103
|
"cumulus": "generative",
|
|
102
104
|
"dither": "generative",
|
|
@@ -179,6 +181,7 @@ export const shaderReadsSource = {
|
|
|
179
181
|
"caldera": false,
|
|
180
182
|
"caustics": false,
|
|
181
183
|
"chladni": false,
|
|
184
|
+
"chromatic-city": false,
|
|
182
185
|
"cloth": false,
|
|
183
186
|
"cumulus": false,
|
|
184
187
|
"dither": false,
|
|
@@ -249,6 +252,7 @@ export const shaderGraphs = {
|
|
|
249
252
|
"billow": "glow",
|
|
250
253
|
"blueprint": "drafting",
|
|
251
254
|
"chladni": "particles",
|
|
255
|
+
"chromatic-city": "miniature",
|
|
252
256
|
"dunes": "particles",
|
|
253
257
|
"ferro": "particles",
|
|
254
258
|
"filament": "glow",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,4EAA4E;AAC5E,oEAAoE;
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"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"}
|
package/dist/graph.d.ts
CHANGED
|
@@ -12,15 +12,15 @@ import type { ResolvedUniforms } from "./types.js";
|
|
|
12
12
|
* surface afterwards — same command buffer, same ordering, and the shared
|
|
13
13
|
* `Params` post chain on the way out.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
15
|
+
* Eight flavours share this shape. The particle graphs (ported from the vgpu
|
|
16
16
|
* `fft-ocean` example) draw a displacement field as additive points into an
|
|
17
17
|
* HDR scene; the drafting graphs measure a source layer, build a distance
|
|
18
18
|
* field from its ink and draw it up as a plate; the glow graphs draw one
|
|
19
19
|
* scene pass of light on dark; studio graphs render meshes and ray-traced
|
|
20
20
|
* glass with depth of field; masonry graphs draw instanced slabs; landscapes
|
|
21
21
|
* combine terrain, trees and grass; dielectric graphs layer a backdrop and
|
|
22
|
-
* ray-marched glass.
|
|
23
|
-
*
|
|
22
|
+
* ray-marched glass. These share the bloom chain and present pass. Miniature
|
|
23
|
+
* graphs instead finish with a tilt-shift blur over the rendered scene.
|
|
24
24
|
*/
|
|
25
25
|
export interface ShaderGraph {
|
|
26
26
|
/** The final pass; the Stage binds `params` and draws it like any shader. */
|
package/dist/graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,2EAA2E;IAC3E,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACvC;AAKD,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,WAAW,CAUb;AAwCD,UAAU,WAAW;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAAC;CACjD;AA6BD,UAAU,UAAU;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC7D,0EAA0E;IAC1E,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,GAClB,UAAU,CAwIZ"}
|
package/dist/graph.js
CHANGED
|
@@ -3,6 +3,7 @@ import { shaderGraphs, shaderSources } from "./generated/sources.js";
|
|
|
3
3
|
import { blankCanvas, createImageTexture, sourceSampler } from "./source.js";
|
|
4
4
|
import { createLandscapeGraph } from "./landscape.js";
|
|
5
5
|
import { createStudioGraph } from "./studio.js";
|
|
6
|
+
import { createMiniatureGraph } from "./miniature.js";
|
|
6
7
|
import { createMasonryGraph } from "./masonry.js";
|
|
7
8
|
import { createDielectricGraph } from "./dielectric.js";
|
|
8
9
|
const HDR_FORMAT = "rgba16float";
|
|
@@ -17,6 +18,8 @@ export function createGraph(stage, name, width, height) {
|
|
|
17
18
|
return createLandscapeGraph(stage, name, width, height);
|
|
18
19
|
if (flavour === "studio")
|
|
19
20
|
return createStudioGraph(stage, name, width, height);
|
|
21
|
+
if (flavour === "miniature")
|
|
22
|
+
return createMiniatureGraph(stage, name, width, height);
|
|
20
23
|
if (flavour === "masonry")
|
|
21
24
|
return createMasonryGraph(stage, name, width, height);
|
|
22
25
|
if (flavour === "dielectric")
|
package/dist/graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ShaderGraph } from "./graph.js";
|
|
2
|
+
import type { ShaderName } from "./registry.js";
|
|
3
|
+
import type { Stage } from "./stage.js";
|
|
4
|
+
export declare function createMiniatureGraph(stage: Stage, name: ShaderName, width: number, height: number): ShaderGraph;
|
|
5
|
+
//# sourceMappingURL=miniature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miniature.d.ts","sourceRoot":"","sources":["../src/miniature.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CA8C/G"}
|