shadertown 0.1.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/LICENSE +21 -0
- package/README.md +20 -0
- package/cli/cli.mjs +341 -0
- package/cli/shadertown.mjs +8 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -0
- package/dist/export.d.ts +30 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +234 -0
- package/dist/export.js.map +1 -0
- package/dist/generated/sources.d.ts +22 -0
- package/dist/generated/sources.d.ts.map +1 -0
- package/dist/generated/sources.js +24 -0
- package/dist/generated/sources.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/params.d.ts +24 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +105 -0
- package/dist/params.js.map +1 -0
- package/dist/react.d.ts +41 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +127 -0
- package/dist/react.js.map +1 -0
- package/dist/registry.d.ts +1930 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +1067 -0
- package/dist/registry.js.map +1 -0
- package/dist/renderer.d.ts +31 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +144 -0
- package/dist/renderer.js.map +1 -0
- package/dist/stage.d.ts +39 -0
- package/dist/stage.d.ts.map +1 -0
- package/dist/stage.js +79 -0
- package/dist/stage.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,1067 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controls that behave identically in every shader. Each entry is spread into
|
|
3
|
+
* a shader's control map and then overridden where that shader wants a
|
|
4
|
+
* different range or starting point.
|
|
5
|
+
*/
|
|
6
|
+
const base = {
|
|
7
|
+
speed: {
|
|
8
|
+
slot: "speed",
|
|
9
|
+
label: "Speed",
|
|
10
|
+
min: 0,
|
|
11
|
+
max: 3,
|
|
12
|
+
step: 0.01,
|
|
13
|
+
default: 1,
|
|
14
|
+
hint: "Time multiplier. 0 freezes the shader on its current frame.",
|
|
15
|
+
},
|
|
16
|
+
scale: {
|
|
17
|
+
slot: "scale",
|
|
18
|
+
label: "Scale",
|
|
19
|
+
min: 0.2,
|
|
20
|
+
max: 3,
|
|
21
|
+
step: 0.01,
|
|
22
|
+
default: 1,
|
|
23
|
+
hint: "Zoom of the underlying field. Lower is bigger, softer shapes.",
|
|
24
|
+
},
|
|
25
|
+
intensity: {
|
|
26
|
+
slot: "intensity",
|
|
27
|
+
label: "Strength",
|
|
28
|
+
min: 0,
|
|
29
|
+
max: 2.5,
|
|
30
|
+
step: 0.01,
|
|
31
|
+
default: 1,
|
|
32
|
+
hint: "Overall brightness of the effect before the post chain.",
|
|
33
|
+
},
|
|
34
|
+
vibrancy: {
|
|
35
|
+
slot: "vibrancy",
|
|
36
|
+
label: "Vibrancy",
|
|
37
|
+
min: 0,
|
|
38
|
+
max: 2,
|
|
39
|
+
step: 0.01,
|
|
40
|
+
default: 1,
|
|
41
|
+
hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.",
|
|
42
|
+
},
|
|
43
|
+
grain: {
|
|
44
|
+
slot: "grain",
|
|
45
|
+
label: "Grain",
|
|
46
|
+
min: 0,
|
|
47
|
+
max: 0.35,
|
|
48
|
+
step: 0.005,
|
|
49
|
+
default: 0.03,
|
|
50
|
+
hint: "Per-pixel noise. A little hides banding on flat gradients.",
|
|
51
|
+
},
|
|
52
|
+
vignette: {
|
|
53
|
+
slot: "vignette",
|
|
54
|
+
label: "Vignette",
|
|
55
|
+
min: 0,
|
|
56
|
+
max: 1,
|
|
57
|
+
step: 0.01,
|
|
58
|
+
default: 0.25,
|
|
59
|
+
hint: "Darkening towards the edges of the frame.",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const warp = {
|
|
63
|
+
slot: "warp",
|
|
64
|
+
label: "Warp",
|
|
65
|
+
min: 0,
|
|
66
|
+
max: 2,
|
|
67
|
+
step: 0.01,
|
|
68
|
+
default: 0.6,
|
|
69
|
+
hint: "How far the field is pushed around before it is sampled.",
|
|
70
|
+
};
|
|
71
|
+
const color = (label, value, hint) => ({
|
|
72
|
+
label,
|
|
73
|
+
default: value,
|
|
74
|
+
hint,
|
|
75
|
+
});
|
|
76
|
+
export const shaderRegistry = {
|
|
77
|
+
aurora: {
|
|
78
|
+
name: "Aurora",
|
|
79
|
+
tagline: "Layered curtains of light over a night sky",
|
|
80
|
+
description: "Three domain-warped noise curtains at different depths, drawn over a star field that thins out behind the brightest ribbons. The warp control decides whether it reads as a calm glow or a solar storm.",
|
|
81
|
+
family: "organic",
|
|
82
|
+
tags: ["ambient", "hero", "dark"],
|
|
83
|
+
cost: "medium",
|
|
84
|
+
controls: {
|
|
85
|
+
...base,
|
|
86
|
+
speed: { ...base.speed, default: 0.45, max: 2 },
|
|
87
|
+
scale: { ...base.scale, default: 1.1 },
|
|
88
|
+
intensity: { ...base.intensity, default: 0.95 },
|
|
89
|
+
vignette: { ...base.vignette, default: 0.45 },
|
|
90
|
+
warp: { ...warp, default: 0.7, max: 2.5 },
|
|
91
|
+
exposure: {
|
|
92
|
+
slot: "a",
|
|
93
|
+
label: "Exposure",
|
|
94
|
+
min: 0.2,
|
|
95
|
+
max: 3,
|
|
96
|
+
step: 0.01,
|
|
97
|
+
default: 1.2,
|
|
98
|
+
hint: "Feeds the tonemapper. Push it for blown-out, bloomy ribbons.",
|
|
99
|
+
},
|
|
100
|
+
bloom: {
|
|
101
|
+
slot: "b",
|
|
102
|
+
label: "Bloom",
|
|
103
|
+
min: 0,
|
|
104
|
+
max: 2,
|
|
105
|
+
step: 0.01,
|
|
106
|
+
default: 0.8,
|
|
107
|
+
hint: "Extra glow around the densest part of each curtain.",
|
|
108
|
+
},
|
|
109
|
+
stars: {
|
|
110
|
+
slot: "d",
|
|
111
|
+
label: "Stars",
|
|
112
|
+
min: 0,
|
|
113
|
+
max: 2,
|
|
114
|
+
step: 0.01,
|
|
115
|
+
default: 0.8,
|
|
116
|
+
hint: "Brightness of the background star field.",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
colors: {
|
|
120
|
+
colorA: color("Low", "#0b3d2e", "The base of each curtain, nearest the horizon."),
|
|
121
|
+
colorB: color("Mid", "#22d3a7", "The body of the aurora."),
|
|
122
|
+
colorC: color("Crest", "#a78bfa", "The brightest tips and the bloom."),
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
"mesh-gradient": {
|
|
126
|
+
name: "Mesh Gradient",
|
|
127
|
+
tagline: "Soft colour centres orbiting behind frosted glass",
|
|
128
|
+
description: "Four gaussian colour wells drift on independent orbits and blend by weight, with a gentle domain warp so the result never collapses into obvious radial gradients. The default for marketing surfaces and card backgrounds.",
|
|
129
|
+
family: "gradient",
|
|
130
|
+
tags: ["ambient", "background", "soft"],
|
|
131
|
+
cost: "light",
|
|
132
|
+
controls: {
|
|
133
|
+
...base,
|
|
134
|
+
speed: { ...base.speed, default: 0.55, max: 2 },
|
|
135
|
+
scale: { ...base.scale, default: 0.85 },
|
|
136
|
+
vibrancy: { ...base.vibrancy, default: 1.05 },
|
|
137
|
+
vignette: { ...base.vignette, default: 0.15 },
|
|
138
|
+
warp: { ...warp, default: 0.35, max: 1.5 },
|
|
139
|
+
softness: {
|
|
140
|
+
slot: "a",
|
|
141
|
+
label: "Softness",
|
|
142
|
+
min: 0.1,
|
|
143
|
+
max: 1.2,
|
|
144
|
+
step: 0.01,
|
|
145
|
+
default: 0.55,
|
|
146
|
+
hint: "Radius of each colour well. Larger means a flatter blend.",
|
|
147
|
+
},
|
|
148
|
+
spread: {
|
|
149
|
+
slot: "b",
|
|
150
|
+
label: "Spread",
|
|
151
|
+
min: 0,
|
|
152
|
+
max: 1,
|
|
153
|
+
step: 0.01,
|
|
154
|
+
default: 0.4,
|
|
155
|
+
hint: "How far the wells travel from the centre.",
|
|
156
|
+
},
|
|
157
|
+
coverage: {
|
|
158
|
+
slot: "c",
|
|
159
|
+
label: "Coverage",
|
|
160
|
+
min: 0.2,
|
|
161
|
+
max: 4,
|
|
162
|
+
step: 0.01,
|
|
163
|
+
default: 1.6,
|
|
164
|
+
hint: "How much of the dark backdrop the colour hides.",
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
colors: {
|
|
168
|
+
colorA: color("First", "#ff5f6d", "Warm anchor colour."),
|
|
169
|
+
colorB: color("Second", "#845ec2", "Mid tone that bridges the other two."),
|
|
170
|
+
colorC: color("Third", "#00c9a7", "Cool accent."),
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
plasma: {
|
|
174
|
+
name: "Plasma",
|
|
175
|
+
tagline: "Stacked sine fields, the oldest trick in the demoscene",
|
|
176
|
+
description: "Four interfering sine fields plus a rotating fifth, coloured through a cycling ramp and cut by iso-contours. Loud on purpose — it is the counterweight to the quiet gradients in this catalogue.",
|
|
177
|
+
family: "geometric",
|
|
178
|
+
tags: ["retro", "loud", "cycling"],
|
|
179
|
+
cost: "light",
|
|
180
|
+
controls: {
|
|
181
|
+
...base,
|
|
182
|
+
speed: { ...base.speed, default: 0.7 },
|
|
183
|
+
scale: { ...base.scale, default: 0.55, min: 0.1, max: 2 },
|
|
184
|
+
vibrancy: { ...base.vibrancy, default: 1.25 },
|
|
185
|
+
vignette: { ...base.vignette, default: 0.3 },
|
|
186
|
+
radial: {
|
|
187
|
+
slot: "a",
|
|
188
|
+
label: "Radial",
|
|
189
|
+
min: 0,
|
|
190
|
+
max: 3,
|
|
191
|
+
step: 0.01,
|
|
192
|
+
default: 1,
|
|
193
|
+
hint: "Weight of the concentric ring field.",
|
|
194
|
+
},
|
|
195
|
+
swirl: {
|
|
196
|
+
slot: "b",
|
|
197
|
+
label: "Swirl",
|
|
198
|
+
min: 0,
|
|
199
|
+
max: 3,
|
|
200
|
+
step: 0.01,
|
|
201
|
+
default: 1,
|
|
202
|
+
hint: "Rotation rate of the secondary interference field.",
|
|
203
|
+
},
|
|
204
|
+
interference: {
|
|
205
|
+
slot: "c",
|
|
206
|
+
label: "Interference",
|
|
207
|
+
min: 0,
|
|
208
|
+
max: 2,
|
|
209
|
+
step: 0.01,
|
|
210
|
+
default: 0.8,
|
|
211
|
+
hint: "How strongly the rotating field beats against the rest.",
|
|
212
|
+
},
|
|
213
|
+
cycles: {
|
|
214
|
+
slot: "d",
|
|
215
|
+
label: "Colour cycles",
|
|
216
|
+
min: 0.2,
|
|
217
|
+
max: 4,
|
|
218
|
+
step: 0.01,
|
|
219
|
+
default: 1,
|
|
220
|
+
hint: "Number of times the palette repeats across the field.",
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
colors: {
|
|
224
|
+
colorA: color("Low", "#120458", "Darkest band of the ramp."),
|
|
225
|
+
colorB: color("Mid", "#e0245e", "The dominant colour."),
|
|
226
|
+
colorC: color("High", "#fdd835", "Peaks of the field."),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
voronoi: {
|
|
230
|
+
name: "Voronoi",
|
|
231
|
+
tagline: "Animated cells with lit edges",
|
|
232
|
+
description: "A jittered Voronoi diagram where every seed moves on its own circle. Cells are tinted by hash, shaded by distance to their seed, and separated by a controllable ridge — crystalline rather than organic.",
|
|
233
|
+
family: "geometric",
|
|
234
|
+
tags: ["cells", "crystal", "structured"],
|
|
235
|
+
cost: "medium",
|
|
236
|
+
controls: {
|
|
237
|
+
...base,
|
|
238
|
+
speed: { ...base.speed, default: 0.5 },
|
|
239
|
+
scale: { ...base.scale, default: 0.55, min: 0.15, max: 2 },
|
|
240
|
+
vignette: { ...base.vignette, default: 0.35 },
|
|
241
|
+
jitter: {
|
|
242
|
+
slot: "a",
|
|
243
|
+
label: "Jitter",
|
|
244
|
+
min: 0,
|
|
245
|
+
max: 1,
|
|
246
|
+
step: 0.01,
|
|
247
|
+
default: 0.85,
|
|
248
|
+
hint: "How far each seed wanders. 0 gives a rigid grid.",
|
|
249
|
+
},
|
|
250
|
+
edge: {
|
|
251
|
+
slot: "b",
|
|
252
|
+
label: "Edge width",
|
|
253
|
+
min: 0.005,
|
|
254
|
+
max: 0.3,
|
|
255
|
+
step: 0.005,
|
|
256
|
+
default: 0.06,
|
|
257
|
+
hint: "Thickness of the lit ridge between neighbouring cells.",
|
|
258
|
+
},
|
|
259
|
+
depth: {
|
|
260
|
+
slot: "c",
|
|
261
|
+
label: "Cell depth",
|
|
262
|
+
min: 0,
|
|
263
|
+
max: 1,
|
|
264
|
+
step: 0.01,
|
|
265
|
+
default: 0.7,
|
|
266
|
+
hint: "Darkening from the seed outwards. Makes the cells read as facets.",
|
|
267
|
+
},
|
|
268
|
+
drift: {
|
|
269
|
+
slot: "d",
|
|
270
|
+
label: "Hue drift",
|
|
271
|
+
min: 0,
|
|
272
|
+
max: 3,
|
|
273
|
+
step: 0.01,
|
|
274
|
+
default: 1,
|
|
275
|
+
hint: "Speed at which cell tints walk along the palette.",
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
colors: {
|
|
279
|
+
colorA: color("Shadow", "#08131f", "Deepest cell interiors."),
|
|
280
|
+
colorB: color("Body", "#1d6fa5", "Average cell tint."),
|
|
281
|
+
colorC: color("Edge", "#9be7ff", "The ridge light."),
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
"liquid-metal": {
|
|
285
|
+
name: "Liquid Metal",
|
|
286
|
+
tagline: "A warped height field lit like polished chrome",
|
|
287
|
+
description: "Noise is warped into a height field, differentiated into a normal, then lit with a moving key light and a banded environment. The banding is what separates metal from plastic, so turn Polish up before you turn Strength up.",
|
|
288
|
+
family: "organic",
|
|
289
|
+
tags: ["chrome", "reflective", "premium"],
|
|
290
|
+
cost: "heavy",
|
|
291
|
+
controls: {
|
|
292
|
+
...base,
|
|
293
|
+
speed: { ...base.speed, default: 0.4, max: 2 },
|
|
294
|
+
scale: { ...base.scale, default: 0.9 },
|
|
295
|
+
vibrancy: { ...base.vibrancy, default: 0.85 },
|
|
296
|
+
vignette: { ...base.vignette, default: 0.4 },
|
|
297
|
+
warp: { ...warp, default: 0.5, max: 2 },
|
|
298
|
+
relief: {
|
|
299
|
+
slot: "a",
|
|
300
|
+
label: "Relief",
|
|
301
|
+
min: 0.05,
|
|
302
|
+
max: 3,
|
|
303
|
+
step: 0.01,
|
|
304
|
+
default: 1,
|
|
305
|
+
hint: "Steepness of the surface. High values give a boiling, molten look.",
|
|
306
|
+
},
|
|
307
|
+
polish: {
|
|
308
|
+
slot: "b",
|
|
309
|
+
label: "Polish",
|
|
310
|
+
min: 0,
|
|
311
|
+
max: 1,
|
|
312
|
+
step: 0.01,
|
|
313
|
+
default: 0.55,
|
|
314
|
+
hint: "Tightness of the specular highlight.",
|
|
315
|
+
},
|
|
316
|
+
body: {
|
|
317
|
+
slot: "c",
|
|
318
|
+
label: "Body",
|
|
319
|
+
min: 0,
|
|
320
|
+
max: 2,
|
|
321
|
+
step: 0.01,
|
|
322
|
+
default: 0.9,
|
|
323
|
+
hint: "Weight of the environment reflection under the highlight.",
|
|
324
|
+
},
|
|
325
|
+
rim: {
|
|
326
|
+
slot: "d",
|
|
327
|
+
label: "Rim",
|
|
328
|
+
min: 0,
|
|
329
|
+
max: 2,
|
|
330
|
+
step: 0.01,
|
|
331
|
+
default: 0.5,
|
|
332
|
+
hint: "Fresnel glow at grazing angles.",
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
colors: {
|
|
336
|
+
colorA: color("Steel", "#141821", "The dark side of the environment."),
|
|
337
|
+
colorB: color("Sheen", "#7d8ba1", "Mid reflection."),
|
|
338
|
+
colorC: color("Hot", "#ffd6a5", "Brightest reflection and rim light."),
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
starfield: {
|
|
342
|
+
name: "Starfield",
|
|
343
|
+
tagline: "A warp corridor of depth-sorted stars",
|
|
344
|
+
description: "Six depth slices of hashed star points, each scaled and faded by its distance, with radial motion blur that turns points into streaks. Push Streak and it goes from a calm night sky to a jump to lightspeed.",
|
|
345
|
+
family: "spatial",
|
|
346
|
+
tags: ["space", "motion", "dark"],
|
|
347
|
+
cost: "medium",
|
|
348
|
+
controls: {
|
|
349
|
+
...base,
|
|
350
|
+
speed: { ...base.speed, default: 1, max: 4 },
|
|
351
|
+
scale: { ...base.scale, default: 1 },
|
|
352
|
+
vignette: { ...base.vignette, default: 0.5 },
|
|
353
|
+
brightness: {
|
|
354
|
+
slot: "a",
|
|
355
|
+
label: "Star size",
|
|
356
|
+
min: 0.1,
|
|
357
|
+
max: 3,
|
|
358
|
+
step: 0.01,
|
|
359
|
+
default: 1,
|
|
360
|
+
hint: "Radius of each star's falloff.",
|
|
361
|
+
},
|
|
362
|
+
streak: {
|
|
363
|
+
slot: "b",
|
|
364
|
+
label: "Streak",
|
|
365
|
+
min: 0,
|
|
366
|
+
max: 1,
|
|
367
|
+
step: 0.01,
|
|
368
|
+
default: 0.25,
|
|
369
|
+
hint: "Radial motion blur. 0 is a still sky, 1 is warp speed.",
|
|
370
|
+
},
|
|
371
|
+
core: {
|
|
372
|
+
slot: "c",
|
|
373
|
+
label: "Core glow",
|
|
374
|
+
min: 0,
|
|
375
|
+
max: 3,
|
|
376
|
+
step: 0.01,
|
|
377
|
+
default: 0.8,
|
|
378
|
+
hint: "Light at the vanishing point.",
|
|
379
|
+
},
|
|
380
|
+
roll: {
|
|
381
|
+
slot: "d",
|
|
382
|
+
label: "Roll",
|
|
383
|
+
min: -3,
|
|
384
|
+
max: 3,
|
|
385
|
+
step: 0.01,
|
|
386
|
+
default: 0.6,
|
|
387
|
+
hint: "Camera roll around the direction of travel.",
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
colors: {
|
|
391
|
+
colorA: color("Cold", "#5b8cff", "Bluest stars."),
|
|
392
|
+
colorB: color("Neutral", "#f4f4f5", "Most of the field."),
|
|
393
|
+
colorC: color("Warm", "#ffb46b", "Warmest stars and the core glow."),
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
ripple: {
|
|
397
|
+
name: "Ripple",
|
|
398
|
+
tagline: "Interference between travelling circular waves",
|
|
399
|
+
description: "Five wave sources orbit the frame; their sum is read as a height field and its slope is used to refract the palette, with a separate caustic term where the wavefronts focus. Genuinely physical, not a stack of sine stripes.",
|
|
400
|
+
family: "organic",
|
|
401
|
+
tags: ["water", "interference", "calm"],
|
|
402
|
+
cost: "medium",
|
|
403
|
+
controls: {
|
|
404
|
+
...base,
|
|
405
|
+
speed: { ...base.speed, default: 0.6 },
|
|
406
|
+
scale: { ...base.scale, default: 1 },
|
|
407
|
+
vignette: { ...base.vignette, default: 0.3 },
|
|
408
|
+
frequency: {
|
|
409
|
+
slot: "a",
|
|
410
|
+
label: "Frequency",
|
|
411
|
+
min: 0.2,
|
|
412
|
+
max: 3,
|
|
413
|
+
step: 0.01,
|
|
414
|
+
default: 1,
|
|
415
|
+
hint: "Wavelength of every source. High values give fine ripples.",
|
|
416
|
+
},
|
|
417
|
+
spread: {
|
|
418
|
+
slot: "b",
|
|
419
|
+
label: "Source spread",
|
|
420
|
+
min: 0,
|
|
421
|
+
max: 2,
|
|
422
|
+
step: 0.01,
|
|
423
|
+
default: 1,
|
|
424
|
+
hint: "How far the sources orbit from the centre.",
|
|
425
|
+
},
|
|
426
|
+
refraction: {
|
|
427
|
+
slot: "c",
|
|
428
|
+
label: "Refraction",
|
|
429
|
+
min: 0,
|
|
430
|
+
max: 3,
|
|
431
|
+
step: 0.01,
|
|
432
|
+
default: 1,
|
|
433
|
+
hint: "How much the wave slope bends the colour lookup.",
|
|
434
|
+
},
|
|
435
|
+
caustics: {
|
|
436
|
+
slot: "d",
|
|
437
|
+
label: "Caustics",
|
|
438
|
+
min: 0,
|
|
439
|
+
max: 2,
|
|
440
|
+
step: 0.01,
|
|
441
|
+
default: 0.5,
|
|
442
|
+
hint: "Bright highlights where wavefronts cancel.",
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
colors: {
|
|
446
|
+
colorA: color("Deep", "#04121f", "Troughs."),
|
|
447
|
+
colorB: color("Water", "#1f7a8c", "Mid water tone."),
|
|
448
|
+
colorC: color("Foam", "#e8f7ff", "Crests and caustics."),
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
"film-grain": {
|
|
452
|
+
name: "Film Grain",
|
|
453
|
+
tagline: "Stock grain, halation and scanlines over a slow wash",
|
|
454
|
+
description: "A texture pass rather than a picture: a slow noise wash read through three chromatically offset channels, then buried in resolution-independent grain, scanlines and halation. Sits well behind text at low Strength.",
|
|
455
|
+
family: "texture",
|
|
456
|
+
tags: ["analog", "overlay", "noise"],
|
|
457
|
+
cost: "light",
|
|
458
|
+
controls: {
|
|
459
|
+
...base,
|
|
460
|
+
speed: { ...base.speed, default: 0.5 },
|
|
461
|
+
scale: { ...base.scale, default: 1.2 },
|
|
462
|
+
intensity: { ...base.intensity, default: 0.7 },
|
|
463
|
+
vibrancy: { ...base.vibrancy, default: 0.8 },
|
|
464
|
+
grain: { ...base.grain, default: 0 },
|
|
465
|
+
vignette: { ...base.vignette, default: 0.55 },
|
|
466
|
+
stock: {
|
|
467
|
+
slot: "a",
|
|
468
|
+
label: "Stock grain",
|
|
469
|
+
min: 0,
|
|
470
|
+
max: 0.6,
|
|
471
|
+
step: 0.005,
|
|
472
|
+
default: 0.14,
|
|
473
|
+
hint: "The main grain amount. This is the point of the shader.",
|
|
474
|
+
},
|
|
475
|
+
scanlines: {
|
|
476
|
+
slot: "b",
|
|
477
|
+
label: "Scanlines",
|
|
478
|
+
min: 0,
|
|
479
|
+
max: 0.6,
|
|
480
|
+
step: 0.005,
|
|
481
|
+
default: 0.08,
|
|
482
|
+
hint: "Horizontal line darkening.",
|
|
483
|
+
},
|
|
484
|
+
aberration: {
|
|
485
|
+
slot: "c",
|
|
486
|
+
label: "Aberration",
|
|
487
|
+
min: 0,
|
|
488
|
+
max: 2,
|
|
489
|
+
step: 0.01,
|
|
490
|
+
default: 0.5,
|
|
491
|
+
hint: "Lateral split between the red and blue channels.",
|
|
492
|
+
},
|
|
493
|
+
"grain-size": {
|
|
494
|
+
slot: "d",
|
|
495
|
+
label: "Grain size",
|
|
496
|
+
min: 0.5,
|
|
497
|
+
max: 6,
|
|
498
|
+
step: 0.1,
|
|
499
|
+
default: 1.5,
|
|
500
|
+
hint: "Physical size of one grain cell, in device pixels.",
|
|
501
|
+
},
|
|
502
|
+
},
|
|
503
|
+
colors: {
|
|
504
|
+
colorA: color("Shadow", "#0d0b0a", "Darkest part of the wash."),
|
|
505
|
+
colorB: color("Base", "#6b5b4a", "The body of the frame."),
|
|
506
|
+
colorC: color("Highlight", "#f0e2c8", "Halation colour."),
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
truchet: {
|
|
510
|
+
name: "Truchet",
|
|
511
|
+
tagline: "Quarter-arc tiles that flip in place",
|
|
512
|
+
description: "A Truchet tiling where each tile decides its own orientation on its own clock, so the maze continuously rewires itself while the whole field pans and rotates. Hard-edged line art with no noise wash anywhere.",
|
|
513
|
+
family: "geometric",
|
|
514
|
+
tags: ["lines", "pattern", "graphic"],
|
|
515
|
+
cost: "light",
|
|
516
|
+
controls: {
|
|
517
|
+
...base,
|
|
518
|
+
speed: { ...base.speed, default: 0.5 },
|
|
519
|
+
scale: { ...base.scale, default: 0.5, min: 0.1, max: 2 },
|
|
520
|
+
vibrancy: { ...base.vibrancy, default: 1.1 },
|
|
521
|
+
vignette: { ...base.vignette, default: 0.35 },
|
|
522
|
+
weight: {
|
|
523
|
+
slot: "a",
|
|
524
|
+
label: "Stroke weight",
|
|
525
|
+
min: 0.1,
|
|
526
|
+
max: 2,
|
|
527
|
+
step: 0.01,
|
|
528
|
+
default: 0.5,
|
|
529
|
+
hint: "Thickness of each arc.",
|
|
530
|
+
},
|
|
531
|
+
flip: {
|
|
532
|
+
slot: "b",
|
|
533
|
+
label: "Flip chance",
|
|
534
|
+
min: 0,
|
|
535
|
+
max: 2,
|
|
536
|
+
step: 0.01,
|
|
537
|
+
default: 1,
|
|
538
|
+
hint: "How often tiles change orientation. 0 freezes the maze.",
|
|
539
|
+
},
|
|
540
|
+
pan: {
|
|
541
|
+
slot: "c",
|
|
542
|
+
label: "Pan",
|
|
543
|
+
min: -3,
|
|
544
|
+
max: 3,
|
|
545
|
+
step: 0.01,
|
|
546
|
+
default: 1,
|
|
547
|
+
hint: "Sideways drift of the whole tiling.",
|
|
548
|
+
},
|
|
549
|
+
rotate: {
|
|
550
|
+
slot: "d",
|
|
551
|
+
label: "Rotate",
|
|
552
|
+
min: -3,
|
|
553
|
+
max: 3,
|
|
554
|
+
step: 0.01,
|
|
555
|
+
default: 0.5,
|
|
556
|
+
hint: "Slow rotation of the tile grid.",
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
colors: {
|
|
560
|
+
colorA: color("Paper", "#0a0a0f", "Background between the strokes."),
|
|
561
|
+
colorB: color("Ink", "#e94f37", "Main stroke colour."),
|
|
562
|
+
colorC: color("Accent", "#f6c667", "Second stroke colour."),
|
|
563
|
+
},
|
|
564
|
+
},
|
|
565
|
+
kaleidoscope: {
|
|
566
|
+
name: "Kaleidoscope",
|
|
567
|
+
tagline: "Polar mirror folding over a drifting field",
|
|
568
|
+
description: "The angle around the centre is folded into one wedge and mirrored, then a warped noise field and a ring pattern are read through it. Segments is the control that changes the character entirely.",
|
|
569
|
+
family: "geometric",
|
|
570
|
+
tags: ["symmetry", "polar", "hypnotic"],
|
|
571
|
+
cost: "medium",
|
|
572
|
+
controls: {
|
|
573
|
+
...base,
|
|
574
|
+
speed: { ...base.speed, default: 0.5 },
|
|
575
|
+
scale: { ...base.scale, default: 1 },
|
|
576
|
+
vignette: { ...base.vignette, default: 0.4 },
|
|
577
|
+
warp: { ...warp, default: 0.3, max: 1.5 },
|
|
578
|
+
segments: {
|
|
579
|
+
slot: "a",
|
|
580
|
+
label: "Segments",
|
|
581
|
+
min: 2,
|
|
582
|
+
max: 24,
|
|
583
|
+
step: 1,
|
|
584
|
+
default: 8,
|
|
585
|
+
hint: "Number of mirrored wedges. Even counts feel more ordered.",
|
|
586
|
+
},
|
|
587
|
+
rings: {
|
|
588
|
+
slot: "b",
|
|
589
|
+
label: "Rings",
|
|
590
|
+
min: 0,
|
|
591
|
+
max: 3,
|
|
592
|
+
step: 0.01,
|
|
593
|
+
default: 1,
|
|
594
|
+
hint: "Frequency of the concentric ring pattern.",
|
|
595
|
+
},
|
|
596
|
+
blend: {
|
|
597
|
+
slot: "c",
|
|
598
|
+
label: "Ring blend",
|
|
599
|
+
min: 0,
|
|
600
|
+
max: 2,
|
|
601
|
+
step: 0.01,
|
|
602
|
+
default: 0.6,
|
|
603
|
+
hint: "How strongly the rings modulate the palette lookup.",
|
|
604
|
+
},
|
|
605
|
+
spin: {
|
|
606
|
+
slot: "d",
|
|
607
|
+
label: "Spin",
|
|
608
|
+
min: -3,
|
|
609
|
+
max: 3,
|
|
610
|
+
step: 0.01,
|
|
611
|
+
default: 1,
|
|
612
|
+
hint: "Rotation of the whole kaleidoscope.",
|
|
613
|
+
},
|
|
614
|
+
},
|
|
615
|
+
colors: {
|
|
616
|
+
colorA: color("Rim", "#1a0b2e", "The outer, darker ring."),
|
|
617
|
+
colorB: color("Body", "#7b2cbf", "Most of the pattern."),
|
|
618
|
+
colorC: color("Core", "#ffd166", "The bright centre."),
|
|
619
|
+
},
|
|
620
|
+
},
|
|
621
|
+
halftone: {
|
|
622
|
+
name: "Halftone",
|
|
623
|
+
tagline: "A duotone image reproduced as a rotated dot screen",
|
|
624
|
+
description: "A continuous noise image is screened through a rotated grid of dots whose radius tracks local ink coverage — the way an actual halftone plate works. Screen angle and dot pitch matter more than any colour choice here.",
|
|
625
|
+
family: "texture",
|
|
626
|
+
tags: ["print", "duotone", "editorial"],
|
|
627
|
+
cost: "light",
|
|
628
|
+
controls: {
|
|
629
|
+
...base,
|
|
630
|
+
speed: { ...base.speed, default: 0.4 },
|
|
631
|
+
scale: { ...base.scale, default: 1 },
|
|
632
|
+
grain: { ...base.grain, default: 0 },
|
|
633
|
+
vignette: { ...base.vignette, default: 0.2 },
|
|
634
|
+
pitch: {
|
|
635
|
+
slot: "a",
|
|
636
|
+
label: "Dot pitch",
|
|
637
|
+
min: 3,
|
|
638
|
+
max: 40,
|
|
639
|
+
step: 0.5,
|
|
640
|
+
default: 9,
|
|
641
|
+
hint: "Distance between dot centres, in device pixels.",
|
|
642
|
+
},
|
|
643
|
+
softness: {
|
|
644
|
+
slot: "b",
|
|
645
|
+
label: "Dot softness",
|
|
646
|
+
min: 0.005,
|
|
647
|
+
max: 0.4,
|
|
648
|
+
step: 0.005,
|
|
649
|
+
default: 0.03,
|
|
650
|
+
hint: "Edge blur on each dot. Keep low for a real print look.",
|
|
651
|
+
},
|
|
652
|
+
angle: {
|
|
653
|
+
slot: "c",
|
|
654
|
+
label: "Screen angle",
|
|
655
|
+
min: 0,
|
|
656
|
+
max: 1,
|
|
657
|
+
step: 0.005,
|
|
658
|
+
default: 0.25,
|
|
659
|
+
hint: "Rotation of the screen, in half-turns.",
|
|
660
|
+
},
|
|
661
|
+
gamma: {
|
|
662
|
+
slot: "d",
|
|
663
|
+
label: "Ink gamma",
|
|
664
|
+
min: 0.2,
|
|
665
|
+
max: 3,
|
|
666
|
+
step: 0.01,
|
|
667
|
+
default: 1,
|
|
668
|
+
hint: "Bias of the coverage curve — how quickly dots fill in.",
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
colors: {
|
|
672
|
+
colorA: color("Paper", "#f4f1ea", "The unprinted surface."),
|
|
673
|
+
colorB: color("Ink", "#12100e", "Primary ink."),
|
|
674
|
+
colorC: color("Spot", "#d7263d", "Second ink in the densest areas."),
|
|
675
|
+
},
|
|
676
|
+
},
|
|
677
|
+
tunnel: {
|
|
678
|
+
name: "Tunnel",
|
|
679
|
+
tagline: "A raymarched corridor with emissive rings",
|
|
680
|
+
description: "A real sphere-traced scene: the camera flies down a curving corrugated tube, the wall is textured in tunnel space, and lit rings pass overhead at fixed intervals. The most expensive shader here, and the only one with actual depth.",
|
|
681
|
+
family: "spatial",
|
|
682
|
+
tags: ["raymarching", "3d", "motion"],
|
|
683
|
+
cost: "heavy",
|
|
684
|
+
controls: {
|
|
685
|
+
...base,
|
|
686
|
+
speed: { ...base.speed, default: 0.6, max: 3 },
|
|
687
|
+
scale: { ...base.scale, default: 1, min: 0.4, max: 2.2 },
|
|
688
|
+
vignette: { ...base.vignette, default: 0.45 },
|
|
689
|
+
radius: {
|
|
690
|
+
slot: "a",
|
|
691
|
+
label: "Radius",
|
|
692
|
+
min: 0.3,
|
|
693
|
+
max: 2.5,
|
|
694
|
+
step: 0.01,
|
|
695
|
+
default: 1,
|
|
696
|
+
hint: "Width of the corridor.",
|
|
697
|
+
},
|
|
698
|
+
ribs: {
|
|
699
|
+
slot: "b",
|
|
700
|
+
label: "Ribs",
|
|
701
|
+
min: 0,
|
|
702
|
+
max: 3,
|
|
703
|
+
step: 0.01,
|
|
704
|
+
default: 1,
|
|
705
|
+
hint: "Corrugation of the tunnel wall.",
|
|
706
|
+
},
|
|
707
|
+
rings: {
|
|
708
|
+
slot: "c",
|
|
709
|
+
label: "Ring light",
|
|
710
|
+
min: 0,
|
|
711
|
+
max: 2,
|
|
712
|
+
step: 0.01,
|
|
713
|
+
default: 0.5,
|
|
714
|
+
hint: "Brightness of the emissive rings passing by.",
|
|
715
|
+
},
|
|
716
|
+
fog: {
|
|
717
|
+
slot: "d",
|
|
718
|
+
label: "Fog",
|
|
719
|
+
min: 0,
|
|
720
|
+
max: 1,
|
|
721
|
+
step: 0.01,
|
|
722
|
+
default: 0.35,
|
|
723
|
+
hint: "How quickly the far end of the corridor disappears.",
|
|
724
|
+
},
|
|
725
|
+
},
|
|
726
|
+
colors: {
|
|
727
|
+
colorA: color("Far", "#0a0f1f", "Deep wall shadow."),
|
|
728
|
+
colorB: color("Wall", "#2f6690", "Main wall tone."),
|
|
729
|
+
colorC: color("Ring", "#ff6b35", "The emissive rings."),
|
|
730
|
+
},
|
|
731
|
+
},
|
|
732
|
+
julia: {
|
|
733
|
+
name: "Julia",
|
|
734
|
+
tagline: "Escape-time fractal with orbit-trap colouring",
|
|
735
|
+
description: "A Julia set whose seed walks a circle near the cardioid edge, so the shape morphs between connected and dust-like without ever being static. Colour comes from a smoothed iteration count plus a distance-to-unit-circle orbit trap.",
|
|
736
|
+
family: "fractal",
|
|
737
|
+
tags: ["mathematical", "detail", "zoom"],
|
|
738
|
+
cost: "heavy",
|
|
739
|
+
controls: {
|
|
740
|
+
...base,
|
|
741
|
+
speed: { ...base.speed, default: 0.35, max: 2 },
|
|
742
|
+
scale: { ...base.scale, default: 1.15, min: 0.2, max: 6 },
|
|
743
|
+
intensity: { ...base.intensity, default: 1.45 },
|
|
744
|
+
vignette: { ...base.vignette, default: 0.35 },
|
|
745
|
+
seed: {
|
|
746
|
+
slot: "a",
|
|
747
|
+
label: "Seed radius",
|
|
748
|
+
min: 0.6,
|
|
749
|
+
max: 1.25,
|
|
750
|
+
step: 0.005,
|
|
751
|
+
default: 0.86,
|
|
752
|
+
hint: "Distance of the orbiting seed from the origin. Near 1 is the interesting band.",
|
|
753
|
+
},
|
|
754
|
+
bias: {
|
|
755
|
+
slot: "b",
|
|
756
|
+
label: "Seed bias",
|
|
757
|
+
min: 0,
|
|
758
|
+
max: 1,
|
|
759
|
+
step: 0.005,
|
|
760
|
+
default: 0.5,
|
|
761
|
+
hint: "Shifts the seed along the real axis, changing the family of shapes.",
|
|
762
|
+
},
|
|
763
|
+
banding: {
|
|
764
|
+
slot: "c",
|
|
765
|
+
label: "Banding",
|
|
766
|
+
min: 0.1,
|
|
767
|
+
max: 4,
|
|
768
|
+
step: 0.01,
|
|
769
|
+
default: 1,
|
|
770
|
+
hint: "How many colour bands the escape count is spread across.",
|
|
771
|
+
},
|
|
772
|
+
rotate: {
|
|
773
|
+
slot: "d",
|
|
774
|
+
label: "Rotate",
|
|
775
|
+
min: -3,
|
|
776
|
+
max: 3,
|
|
777
|
+
step: 0.01,
|
|
778
|
+
default: 0.5,
|
|
779
|
+
hint: "Rotation of the viewing plane.",
|
|
780
|
+
},
|
|
781
|
+
},
|
|
782
|
+
colors: {
|
|
783
|
+
colorA: color("Interior", "#10002b", "Points that never escape."),
|
|
784
|
+
colorB: color("Band", "#c77dff", "The main escape bands."),
|
|
785
|
+
colorC: color("Edge", "#e0fbfc", "Fastest-escaping points."),
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
silk: {
|
|
789
|
+
name: "Silk",
|
|
790
|
+
tagline: "Anisotropic sheen across warped fibre lines",
|
|
791
|
+
description: "Two stages of domain warp fold the plane, then dense parallel fibres are bent along the folds and given a directional sheen. Creases darken, ridges catch the light — cloth rather than liquid.",
|
|
792
|
+
family: "organic",
|
|
793
|
+
tags: ["fabric", "soft", "luxury"],
|
|
794
|
+
cost: "medium",
|
|
795
|
+
controls: {
|
|
796
|
+
...base,
|
|
797
|
+
speed: { ...base.speed, default: 0.35, max: 2 },
|
|
798
|
+
scale: { ...base.scale, default: 0.9 },
|
|
799
|
+
vibrancy: { ...base.vibrancy, default: 0.95 },
|
|
800
|
+
vignette: { ...base.vignette, default: 0.35 },
|
|
801
|
+
warp: { ...warp, default: 0.45, max: 1.5 },
|
|
802
|
+
weave: {
|
|
803
|
+
slot: "a",
|
|
804
|
+
label: "Weave",
|
|
805
|
+
min: 0.1,
|
|
806
|
+
max: 3,
|
|
807
|
+
step: 0.01,
|
|
808
|
+
default: 1,
|
|
809
|
+
hint: "Density of the fibre lines.",
|
|
810
|
+
},
|
|
811
|
+
bend: {
|
|
812
|
+
slot: "b",
|
|
813
|
+
label: "Bend",
|
|
814
|
+
min: 0,
|
|
815
|
+
max: 2,
|
|
816
|
+
step: 0.01,
|
|
817
|
+
default: 1,
|
|
818
|
+
hint: "How far the folds displace the fibres.",
|
|
819
|
+
},
|
|
820
|
+
sheen: {
|
|
821
|
+
slot: "c",
|
|
822
|
+
label: "Sheen",
|
|
823
|
+
min: 0,
|
|
824
|
+
max: 2,
|
|
825
|
+
step: 0.01,
|
|
826
|
+
default: 0.6,
|
|
827
|
+
hint: "Strength of the directional highlight.",
|
|
828
|
+
},
|
|
829
|
+
crease: {
|
|
830
|
+
slot: "d",
|
|
831
|
+
label: "Crease",
|
|
832
|
+
min: 0,
|
|
833
|
+
max: 1.5,
|
|
834
|
+
step: 0.01,
|
|
835
|
+
default: 0.5,
|
|
836
|
+
hint: "Darkening in the valleys of the fold.",
|
|
837
|
+
},
|
|
838
|
+
},
|
|
839
|
+
colors: {
|
|
840
|
+
colorA: color("Shadow", "#2b1332", "Deepest creases."),
|
|
841
|
+
colorB: color("Cloth", "#a3325f", "The body of the fabric."),
|
|
842
|
+
colorC: color("Sheen", "#ffd9e8", "The highlight along the fibres."),
|
|
843
|
+
},
|
|
844
|
+
},
|
|
845
|
+
"neon-grid": {
|
|
846
|
+
name: "Neon Grid",
|
|
847
|
+
tagline: "Perspective floor, banded sun, horizon haze",
|
|
848
|
+
description: "A projected floor grid with analytic line width, a horizontal-banded sun sitting on the horizon, and a haze band welding the two together. Synthwave, executed straight rather than ironically.",
|
|
849
|
+
family: "spatial",
|
|
850
|
+
tags: ["synthwave", "retro", "horizon"],
|
|
851
|
+
cost: "light",
|
|
852
|
+
controls: {
|
|
853
|
+
...base,
|
|
854
|
+
speed: { ...base.speed, default: 0.7, max: 3 },
|
|
855
|
+
scale: { ...base.scale, default: 1 },
|
|
856
|
+
vibrancy: { ...base.vibrancy, default: 1.15 },
|
|
857
|
+
vignette: { ...base.vignette, default: 0.4 },
|
|
858
|
+
density: {
|
|
859
|
+
slot: "a",
|
|
860
|
+
label: "Grid density",
|
|
861
|
+
min: 0.2,
|
|
862
|
+
max: 4,
|
|
863
|
+
step: 0.01,
|
|
864
|
+
default: 1,
|
|
865
|
+
hint: "Number of grid cells across the floor.",
|
|
866
|
+
},
|
|
867
|
+
travel: {
|
|
868
|
+
slot: "b",
|
|
869
|
+
label: "Travel",
|
|
870
|
+
min: -4,
|
|
871
|
+
max: 4,
|
|
872
|
+
step: 0.01,
|
|
873
|
+
default: 1,
|
|
874
|
+
hint: "Speed the floor moves towards you. Negative reverses it.",
|
|
875
|
+
},
|
|
876
|
+
haze: {
|
|
877
|
+
slot: "c",
|
|
878
|
+
label: "Haze",
|
|
879
|
+
min: 0,
|
|
880
|
+
max: 2,
|
|
881
|
+
step: 0.01,
|
|
882
|
+
default: 0.5,
|
|
883
|
+
hint: "Glow along the horizon line.",
|
|
884
|
+
},
|
|
885
|
+
sun: {
|
|
886
|
+
slot: "d",
|
|
887
|
+
label: "Sun glow",
|
|
888
|
+
min: 0,
|
|
889
|
+
max: 3,
|
|
890
|
+
step: 0.01,
|
|
891
|
+
default: 1,
|
|
892
|
+
hint: "Bloom around the sun disc.",
|
|
893
|
+
},
|
|
894
|
+
},
|
|
895
|
+
colors: {
|
|
896
|
+
colorA: color("Sky", "#2a1a5e", "Upper sky."),
|
|
897
|
+
colorB: color("Grid", "#00f5d4", "The grid lines and the haze."),
|
|
898
|
+
colorC: color("Sun", "#ff206e", "Top of the sun disc."),
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
bokeh: {
|
|
902
|
+
name: "Bokeh",
|
|
903
|
+
tagline: "Out-of-focus lights drifting through depth",
|
|
904
|
+
description: "Four depth layers of hashed light points, each rendered as a disc with a bright rim — how a real lens renders a defocused highlight. Nearer layers are larger and brighter, so the field reads as depth rather than as flat circles.",
|
|
905
|
+
family: "spatial",
|
|
906
|
+
tags: ["lights", "depth", "festive"],
|
|
907
|
+
cost: "medium",
|
|
908
|
+
controls: {
|
|
909
|
+
...base,
|
|
910
|
+
speed: { ...base.speed, default: 0.5, max: 2 },
|
|
911
|
+
scale: { ...base.scale, default: 1 },
|
|
912
|
+
vignette: { ...base.vignette, default: 0.45 },
|
|
913
|
+
size: {
|
|
914
|
+
slot: "a",
|
|
915
|
+
label: "Aperture",
|
|
916
|
+
min: 0.2,
|
|
917
|
+
max: 3,
|
|
918
|
+
step: 0.01,
|
|
919
|
+
default: 1,
|
|
920
|
+
hint: "Size of every out-of-focus disc.",
|
|
921
|
+
},
|
|
922
|
+
edge: {
|
|
923
|
+
slot: "b",
|
|
924
|
+
label: "Edge",
|
|
925
|
+
min: 0.02,
|
|
926
|
+
max: 1,
|
|
927
|
+
step: 0.01,
|
|
928
|
+
default: 0.35,
|
|
929
|
+
hint: "How soft the disc edge is. Low values give hard, ringed bokeh.",
|
|
930
|
+
},
|
|
931
|
+
rim: {
|
|
932
|
+
slot: "c",
|
|
933
|
+
label: "Rim",
|
|
934
|
+
min: 0,
|
|
935
|
+
max: 2,
|
|
936
|
+
step: 0.01,
|
|
937
|
+
default: 0.8,
|
|
938
|
+
hint: "Brightness of the ring at the edge of each disc.",
|
|
939
|
+
},
|
|
940
|
+
density: {
|
|
941
|
+
slot: "d",
|
|
942
|
+
label: "Density",
|
|
943
|
+
min: 0,
|
|
944
|
+
max: 2,
|
|
945
|
+
step: 0.01,
|
|
946
|
+
default: 1,
|
|
947
|
+
hint: "Overall weight of every layer.",
|
|
948
|
+
},
|
|
949
|
+
},
|
|
950
|
+
colors: {
|
|
951
|
+
colorA: color("Cool", "#3a86ff", "Coolest lights."),
|
|
952
|
+
colorB: color("Warm", "#ffbe0b", "Most of the field."),
|
|
953
|
+
colorC: color("Hot", "#fb5607", "Warmest, nearest lights."),
|
|
954
|
+
},
|
|
955
|
+
},
|
|
956
|
+
dither: {
|
|
957
|
+
name: "Dither",
|
|
958
|
+
tagline: "A smooth field quantised through an 8×8 Bayer matrix",
|
|
959
|
+
description: "The source image is pixelated, offset by an ordered-dither threshold, then crushed to a handful of levels. Deliberately low-fi: flat colour, a visible pattern, and no antialiasing anywhere.",
|
|
960
|
+
family: "texture",
|
|
961
|
+
tags: ["lofi", "pixel", "poster"],
|
|
962
|
+
cost: "light",
|
|
963
|
+
controls: {
|
|
964
|
+
...base,
|
|
965
|
+
speed: { ...base.speed, default: 0.5 },
|
|
966
|
+
scale: { ...base.scale, default: 1 },
|
|
967
|
+
grain: { ...base.grain, default: 0 },
|
|
968
|
+
vignette: { ...base.vignette, default: 0.15 },
|
|
969
|
+
pixel: {
|
|
970
|
+
slot: "a",
|
|
971
|
+
label: "Pixel size",
|
|
972
|
+
min: 1,
|
|
973
|
+
max: 12,
|
|
974
|
+
step: 1,
|
|
975
|
+
default: 3,
|
|
976
|
+
hint: "Size of one output pixel, in device pixels.",
|
|
977
|
+
},
|
|
978
|
+
levels: {
|
|
979
|
+
slot: "b",
|
|
980
|
+
label: "Levels",
|
|
981
|
+
min: 2,
|
|
982
|
+
max: 12,
|
|
983
|
+
step: 1,
|
|
984
|
+
default: 4,
|
|
985
|
+
hint: "How many tones survive quantisation.",
|
|
986
|
+
},
|
|
987
|
+
sweep: {
|
|
988
|
+
slot: "c",
|
|
989
|
+
label: "Sweep",
|
|
990
|
+
min: -2,
|
|
991
|
+
max: 2,
|
|
992
|
+
step: 0.01,
|
|
993
|
+
default: 0.8,
|
|
994
|
+
hint: "Vertical gradient added to the source image.",
|
|
995
|
+
},
|
|
996
|
+
spread: {
|
|
997
|
+
slot: "d",
|
|
998
|
+
label: "Dither spread",
|
|
999
|
+
min: 0,
|
|
1000
|
+
max: 2,
|
|
1001
|
+
step: 0.01,
|
|
1002
|
+
default: 1,
|
|
1003
|
+
hint: "Weight of the Bayer threshold. 0 gives hard banding.",
|
|
1004
|
+
},
|
|
1005
|
+
},
|
|
1006
|
+
colors: {
|
|
1007
|
+
colorA: color("Dark", "#1b1b3a", "Lowest level."),
|
|
1008
|
+
colorB: color("Mid", "#693668", "Middle level."),
|
|
1009
|
+
colorC: color("Light", "#f7b32b", "Highest level."),
|
|
1010
|
+
},
|
|
1011
|
+
},
|
|
1012
|
+
caustics: {
|
|
1013
|
+
name: "Caustics",
|
|
1014
|
+
tagline: "Light focused through a moving water surface",
|
|
1015
|
+
description: "Three counter-rotating wave fields are stacked and sharpened into the bright web you see on the floor of a pool, with the three colour channels focusing at slightly different depths. Sharpness is the difference between a glow and a caustic.",
|
|
1016
|
+
family: "organic",
|
|
1017
|
+
tags: ["water", "light", "pool"],
|
|
1018
|
+
cost: "medium",
|
|
1019
|
+
controls: {
|
|
1020
|
+
...base,
|
|
1021
|
+
speed: { ...base.speed, default: 0.6 },
|
|
1022
|
+
scale: { ...base.scale, default: 0.7 },
|
|
1023
|
+
vignette: { ...base.vignette, default: 0.3 },
|
|
1024
|
+
warp: { ...warp, default: 0.4, max: 1.5 },
|
|
1025
|
+
sharpness: {
|
|
1026
|
+
slot: "a",
|
|
1027
|
+
label: "Sharpness",
|
|
1028
|
+
min: 0,
|
|
1029
|
+
max: 1,
|
|
1030
|
+
step: 0.01,
|
|
1031
|
+
default: 0.45,
|
|
1032
|
+
hint: "How tightly the light focuses. Low is a glow, high is a web.",
|
|
1033
|
+
},
|
|
1034
|
+
dispersion: {
|
|
1035
|
+
slot: "b",
|
|
1036
|
+
label: "Dispersion",
|
|
1037
|
+
min: 0,
|
|
1038
|
+
max: 2,
|
|
1039
|
+
step: 0.01,
|
|
1040
|
+
default: 0.6,
|
|
1041
|
+
hint: "Split between the red and blue focal depths.",
|
|
1042
|
+
},
|
|
1043
|
+
falloff: {
|
|
1044
|
+
slot: "c",
|
|
1045
|
+
label: "Falloff",
|
|
1046
|
+
min: 0.2,
|
|
1047
|
+
max: 3,
|
|
1048
|
+
step: 0.01,
|
|
1049
|
+
default: 1,
|
|
1050
|
+
hint: "How quickly the pool darkens towards the edges.",
|
|
1051
|
+
},
|
|
1052
|
+
},
|
|
1053
|
+
colors: {
|
|
1054
|
+
colorA: color("Floor", "#083344", "The pool floor in shadow."),
|
|
1055
|
+
colorB: color("Water", "#0e7490", "Lit floor tone."),
|
|
1056
|
+
colorC: color("Light", "#c9f6ff", "The caustic web itself."),
|
|
1057
|
+
},
|
|
1058
|
+
},
|
|
1059
|
+
};
|
|
1060
|
+
export const shaderNames = Object.keys(shaderRegistry);
|
|
1061
|
+
export function getShader(name) {
|
|
1062
|
+
return shaderRegistry[name];
|
|
1063
|
+
}
|
|
1064
|
+
export function isShaderName(value) {
|
|
1065
|
+
return Object.hasOwn(shaderRegistry, value);
|
|
1066
|
+
}
|
|
1067
|
+
//# sourceMappingURL=registry.js.map
|