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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/cli/cli.mjs +341 -0
  4. package/cli/shadertown.mjs +8 -0
  5. package/dist/config.d.ts +29 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +8 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/export.d.ts +30 -0
  10. package/dist/export.d.ts.map +1 -0
  11. package/dist/export.js +234 -0
  12. package/dist/export.js.map +1 -0
  13. package/dist/generated/sources.d.ts +22 -0
  14. package/dist/generated/sources.d.ts.map +1 -0
  15. package/dist/generated/sources.js +24 -0
  16. package/dist/generated/sources.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +8 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/params.d.ts +24 -0
  22. package/dist/params.d.ts.map +1 -0
  23. package/dist/params.js +105 -0
  24. package/dist/params.js.map +1 -0
  25. package/dist/react.d.ts +41 -0
  26. package/dist/react.d.ts.map +1 -0
  27. package/dist/react.js +127 -0
  28. package/dist/react.js.map +1 -0
  29. package/dist/registry.d.ts +1930 -0
  30. package/dist/registry.d.ts.map +1 -0
  31. package/dist/registry.js +1067 -0
  32. package/dist/registry.js.map +1 -0
  33. package/dist/renderer.d.ts +31 -0
  34. package/dist/renderer.d.ts.map +1 -0
  35. package/dist/renderer.js +144 -0
  36. package/dist/renderer.js.map +1 -0
  37. package/dist/stage.d.ts +39 -0
  38. package/dist/stage.d.ts.map +1 -0
  39. package/dist/stage.js +79 -0
  40. package/dist/stage.js.map +1 -0
  41. package/dist/types.d.ts +71 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +2 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +85 -0
@@ -0,0 +1,1930 @@
1
+ import type { ColorControl } from "./types.js";
2
+ export declare const shaderRegistry: {
3
+ readonly aurora: {
4
+ readonly name: "Aurora";
5
+ readonly tagline: "Layered curtains of light over a night sky";
6
+ readonly 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.";
7
+ readonly family: "organic";
8
+ readonly tags: readonly ["ambient", "hero", "dark"];
9
+ readonly cost: "medium";
10
+ readonly controls: {
11
+ readonly speed: {
12
+ readonly default: 0.45;
13
+ readonly max: 2;
14
+ readonly slot: "speed";
15
+ readonly label: "Speed";
16
+ readonly min: 0;
17
+ readonly step: 0.01;
18
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
19
+ };
20
+ readonly scale: {
21
+ readonly default: 1.1;
22
+ readonly slot: "scale";
23
+ readonly label: "Scale";
24
+ readonly min: 0.2;
25
+ readonly max: 3;
26
+ readonly step: 0.01;
27
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
28
+ };
29
+ readonly intensity: {
30
+ readonly default: 0.95;
31
+ readonly slot: "intensity";
32
+ readonly label: "Strength";
33
+ readonly min: 0;
34
+ readonly max: 2.5;
35
+ readonly step: 0.01;
36
+ readonly hint: "Overall brightness of the effect before the post chain.";
37
+ };
38
+ readonly vignette: {
39
+ readonly default: 0.45;
40
+ readonly slot: "vignette";
41
+ readonly label: "Vignette";
42
+ readonly min: 0;
43
+ readonly max: 1;
44
+ readonly step: 0.01;
45
+ readonly hint: "Darkening towards the edges of the frame.";
46
+ };
47
+ readonly warp: {
48
+ readonly default: 0.7;
49
+ readonly max: 2.5;
50
+ readonly slot: "warp";
51
+ readonly label: "Warp";
52
+ readonly min: 0;
53
+ readonly step: 0.01;
54
+ readonly hint: "How far the field is pushed around before it is sampled.";
55
+ };
56
+ readonly exposure: {
57
+ readonly slot: "a";
58
+ readonly label: "Exposure";
59
+ readonly min: 0.2;
60
+ readonly max: 3;
61
+ readonly step: 0.01;
62
+ readonly default: 1.2;
63
+ readonly hint: "Feeds the tonemapper. Push it for blown-out, bloomy ribbons.";
64
+ };
65
+ readonly bloom: {
66
+ readonly slot: "b";
67
+ readonly label: "Bloom";
68
+ readonly min: 0;
69
+ readonly max: 2;
70
+ readonly step: 0.01;
71
+ readonly default: 0.8;
72
+ readonly hint: "Extra glow around the densest part of each curtain.";
73
+ };
74
+ readonly stars: {
75
+ readonly slot: "d";
76
+ readonly label: "Stars";
77
+ readonly min: 0;
78
+ readonly max: 2;
79
+ readonly step: 0.01;
80
+ readonly default: 0.8;
81
+ readonly hint: "Brightness of the background star field.";
82
+ };
83
+ readonly vibrancy: {
84
+ readonly slot: "vibrancy";
85
+ readonly label: "Vibrancy";
86
+ readonly min: 0;
87
+ readonly max: 2;
88
+ readonly step: 0.01;
89
+ readonly default: 1;
90
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
91
+ };
92
+ readonly grain: {
93
+ readonly slot: "grain";
94
+ readonly label: "Grain";
95
+ readonly min: 0;
96
+ readonly max: 0.35;
97
+ readonly step: 0.005;
98
+ readonly default: 0.03;
99
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
100
+ };
101
+ };
102
+ readonly colors: {
103
+ readonly colorA: ColorControl;
104
+ readonly colorB: ColorControl;
105
+ readonly colorC: ColorControl;
106
+ };
107
+ };
108
+ readonly "mesh-gradient": {
109
+ readonly name: "Mesh Gradient";
110
+ readonly tagline: "Soft colour centres orbiting behind frosted glass";
111
+ readonly 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.";
112
+ readonly family: "gradient";
113
+ readonly tags: readonly ["ambient", "background", "soft"];
114
+ readonly cost: "light";
115
+ readonly controls: {
116
+ readonly speed: {
117
+ readonly default: 0.55;
118
+ readonly max: 2;
119
+ readonly slot: "speed";
120
+ readonly label: "Speed";
121
+ readonly min: 0;
122
+ readonly step: 0.01;
123
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
124
+ };
125
+ readonly scale: {
126
+ readonly default: 0.85;
127
+ readonly slot: "scale";
128
+ readonly label: "Scale";
129
+ readonly min: 0.2;
130
+ readonly max: 3;
131
+ readonly step: 0.01;
132
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
133
+ };
134
+ readonly vibrancy: {
135
+ readonly default: 1.05;
136
+ readonly slot: "vibrancy";
137
+ readonly label: "Vibrancy";
138
+ readonly min: 0;
139
+ readonly max: 2;
140
+ readonly step: 0.01;
141
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
142
+ };
143
+ readonly vignette: {
144
+ readonly default: 0.15;
145
+ readonly slot: "vignette";
146
+ readonly label: "Vignette";
147
+ readonly min: 0;
148
+ readonly max: 1;
149
+ readonly step: 0.01;
150
+ readonly hint: "Darkening towards the edges of the frame.";
151
+ };
152
+ readonly warp: {
153
+ readonly default: 0.35;
154
+ readonly max: 1.5;
155
+ readonly slot: "warp";
156
+ readonly label: "Warp";
157
+ readonly min: 0;
158
+ readonly step: 0.01;
159
+ readonly hint: "How far the field is pushed around before it is sampled.";
160
+ };
161
+ readonly softness: {
162
+ readonly slot: "a";
163
+ readonly label: "Softness";
164
+ readonly min: 0.1;
165
+ readonly max: 1.2;
166
+ readonly step: 0.01;
167
+ readonly default: 0.55;
168
+ readonly hint: "Radius of each colour well. Larger means a flatter blend.";
169
+ };
170
+ readonly spread: {
171
+ readonly slot: "b";
172
+ readonly label: "Spread";
173
+ readonly min: 0;
174
+ readonly max: 1;
175
+ readonly step: 0.01;
176
+ readonly default: 0.4;
177
+ readonly hint: "How far the wells travel from the centre.";
178
+ };
179
+ readonly coverage: {
180
+ readonly slot: "c";
181
+ readonly label: "Coverage";
182
+ readonly min: 0.2;
183
+ readonly max: 4;
184
+ readonly step: 0.01;
185
+ readonly default: 1.6;
186
+ readonly hint: "How much of the dark backdrop the colour hides.";
187
+ };
188
+ readonly intensity: {
189
+ readonly slot: "intensity";
190
+ readonly label: "Strength";
191
+ readonly min: 0;
192
+ readonly max: 2.5;
193
+ readonly step: 0.01;
194
+ readonly default: 1;
195
+ readonly hint: "Overall brightness of the effect before the post chain.";
196
+ };
197
+ readonly grain: {
198
+ readonly slot: "grain";
199
+ readonly label: "Grain";
200
+ readonly min: 0;
201
+ readonly max: 0.35;
202
+ readonly step: 0.005;
203
+ readonly default: 0.03;
204
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
205
+ };
206
+ };
207
+ readonly colors: {
208
+ readonly colorA: ColorControl;
209
+ readonly colorB: ColorControl;
210
+ readonly colorC: ColorControl;
211
+ };
212
+ };
213
+ readonly plasma: {
214
+ readonly name: "Plasma";
215
+ readonly tagline: "Stacked sine fields, the oldest trick in the demoscene";
216
+ readonly 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.";
217
+ readonly family: "geometric";
218
+ readonly tags: readonly ["retro", "loud", "cycling"];
219
+ readonly cost: "light";
220
+ readonly controls: {
221
+ readonly speed: {
222
+ readonly default: 0.7;
223
+ readonly slot: "speed";
224
+ readonly label: "Speed";
225
+ readonly min: 0;
226
+ readonly max: 3;
227
+ readonly step: 0.01;
228
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
229
+ };
230
+ readonly scale: {
231
+ readonly default: 0.55;
232
+ readonly min: 0.1;
233
+ readonly max: 2;
234
+ readonly slot: "scale";
235
+ readonly label: "Scale";
236
+ readonly step: 0.01;
237
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
238
+ };
239
+ readonly vibrancy: {
240
+ readonly default: 1.25;
241
+ readonly slot: "vibrancy";
242
+ readonly label: "Vibrancy";
243
+ readonly min: 0;
244
+ readonly max: 2;
245
+ readonly step: 0.01;
246
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
247
+ };
248
+ readonly vignette: {
249
+ readonly default: 0.3;
250
+ readonly slot: "vignette";
251
+ readonly label: "Vignette";
252
+ readonly min: 0;
253
+ readonly max: 1;
254
+ readonly step: 0.01;
255
+ readonly hint: "Darkening towards the edges of the frame.";
256
+ };
257
+ readonly radial: {
258
+ readonly slot: "a";
259
+ readonly label: "Radial";
260
+ readonly min: 0;
261
+ readonly max: 3;
262
+ readonly step: 0.01;
263
+ readonly default: 1;
264
+ readonly hint: "Weight of the concentric ring field.";
265
+ };
266
+ readonly swirl: {
267
+ readonly slot: "b";
268
+ readonly label: "Swirl";
269
+ readonly min: 0;
270
+ readonly max: 3;
271
+ readonly step: 0.01;
272
+ readonly default: 1;
273
+ readonly hint: "Rotation rate of the secondary interference field.";
274
+ };
275
+ readonly interference: {
276
+ readonly slot: "c";
277
+ readonly label: "Interference";
278
+ readonly min: 0;
279
+ readonly max: 2;
280
+ readonly step: 0.01;
281
+ readonly default: 0.8;
282
+ readonly hint: "How strongly the rotating field beats against the rest.";
283
+ };
284
+ readonly cycles: {
285
+ readonly slot: "d";
286
+ readonly label: "Colour cycles";
287
+ readonly min: 0.2;
288
+ readonly max: 4;
289
+ readonly step: 0.01;
290
+ readonly default: 1;
291
+ readonly hint: "Number of times the palette repeats across the field.";
292
+ };
293
+ readonly intensity: {
294
+ readonly slot: "intensity";
295
+ readonly label: "Strength";
296
+ readonly min: 0;
297
+ readonly max: 2.5;
298
+ readonly step: 0.01;
299
+ readonly default: 1;
300
+ readonly hint: "Overall brightness of the effect before the post chain.";
301
+ };
302
+ readonly grain: {
303
+ readonly slot: "grain";
304
+ readonly label: "Grain";
305
+ readonly min: 0;
306
+ readonly max: 0.35;
307
+ readonly step: 0.005;
308
+ readonly default: 0.03;
309
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
310
+ };
311
+ };
312
+ readonly colors: {
313
+ readonly colorA: ColorControl;
314
+ readonly colorB: ColorControl;
315
+ readonly colorC: ColorControl;
316
+ };
317
+ };
318
+ readonly voronoi: {
319
+ readonly name: "Voronoi";
320
+ readonly tagline: "Animated cells with lit edges";
321
+ readonly 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.";
322
+ readonly family: "geometric";
323
+ readonly tags: readonly ["cells", "crystal", "structured"];
324
+ readonly cost: "medium";
325
+ readonly controls: {
326
+ readonly speed: {
327
+ readonly default: 0.5;
328
+ readonly slot: "speed";
329
+ readonly label: "Speed";
330
+ readonly min: 0;
331
+ readonly max: 3;
332
+ readonly step: 0.01;
333
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
334
+ };
335
+ readonly scale: {
336
+ readonly default: 0.55;
337
+ readonly min: 0.15;
338
+ readonly max: 2;
339
+ readonly slot: "scale";
340
+ readonly label: "Scale";
341
+ readonly step: 0.01;
342
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
343
+ };
344
+ readonly vignette: {
345
+ readonly default: 0.35;
346
+ readonly slot: "vignette";
347
+ readonly label: "Vignette";
348
+ readonly min: 0;
349
+ readonly max: 1;
350
+ readonly step: 0.01;
351
+ readonly hint: "Darkening towards the edges of the frame.";
352
+ };
353
+ readonly jitter: {
354
+ readonly slot: "a";
355
+ readonly label: "Jitter";
356
+ readonly min: 0;
357
+ readonly max: 1;
358
+ readonly step: 0.01;
359
+ readonly default: 0.85;
360
+ readonly hint: "How far each seed wanders. 0 gives a rigid grid.";
361
+ };
362
+ readonly edge: {
363
+ readonly slot: "b";
364
+ readonly label: "Edge width";
365
+ readonly min: 0.005;
366
+ readonly max: 0.3;
367
+ readonly step: 0.005;
368
+ readonly default: 0.06;
369
+ readonly hint: "Thickness of the lit ridge between neighbouring cells.";
370
+ };
371
+ readonly depth: {
372
+ readonly slot: "c";
373
+ readonly label: "Cell depth";
374
+ readonly min: 0;
375
+ readonly max: 1;
376
+ readonly step: 0.01;
377
+ readonly default: 0.7;
378
+ readonly hint: "Darkening from the seed outwards. Makes the cells read as facets.";
379
+ };
380
+ readonly drift: {
381
+ readonly slot: "d";
382
+ readonly label: "Hue drift";
383
+ readonly min: 0;
384
+ readonly max: 3;
385
+ readonly step: 0.01;
386
+ readonly default: 1;
387
+ readonly hint: "Speed at which cell tints walk along the palette.";
388
+ };
389
+ readonly intensity: {
390
+ readonly slot: "intensity";
391
+ readonly label: "Strength";
392
+ readonly min: 0;
393
+ readonly max: 2.5;
394
+ readonly step: 0.01;
395
+ readonly default: 1;
396
+ readonly hint: "Overall brightness of the effect before the post chain.";
397
+ };
398
+ readonly vibrancy: {
399
+ readonly slot: "vibrancy";
400
+ readonly label: "Vibrancy";
401
+ readonly min: 0;
402
+ readonly max: 2;
403
+ readonly step: 0.01;
404
+ readonly default: 1;
405
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
406
+ };
407
+ readonly grain: {
408
+ readonly slot: "grain";
409
+ readonly label: "Grain";
410
+ readonly min: 0;
411
+ readonly max: 0.35;
412
+ readonly step: 0.005;
413
+ readonly default: 0.03;
414
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
415
+ };
416
+ };
417
+ readonly colors: {
418
+ readonly colorA: ColorControl;
419
+ readonly colorB: ColorControl;
420
+ readonly colorC: ColorControl;
421
+ };
422
+ };
423
+ readonly "liquid-metal": {
424
+ readonly name: "Liquid Metal";
425
+ readonly tagline: "A warped height field lit like polished chrome";
426
+ readonly 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.";
427
+ readonly family: "organic";
428
+ readonly tags: readonly ["chrome", "reflective", "premium"];
429
+ readonly cost: "heavy";
430
+ readonly controls: {
431
+ readonly speed: {
432
+ readonly default: 0.4;
433
+ readonly max: 2;
434
+ readonly slot: "speed";
435
+ readonly label: "Speed";
436
+ readonly min: 0;
437
+ readonly step: 0.01;
438
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
439
+ };
440
+ readonly scale: {
441
+ readonly default: 0.9;
442
+ readonly slot: "scale";
443
+ readonly label: "Scale";
444
+ readonly min: 0.2;
445
+ readonly max: 3;
446
+ readonly step: 0.01;
447
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
448
+ };
449
+ readonly vibrancy: {
450
+ readonly default: 0.85;
451
+ readonly slot: "vibrancy";
452
+ readonly label: "Vibrancy";
453
+ readonly min: 0;
454
+ readonly max: 2;
455
+ readonly step: 0.01;
456
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
457
+ };
458
+ readonly vignette: {
459
+ readonly default: 0.4;
460
+ readonly slot: "vignette";
461
+ readonly label: "Vignette";
462
+ readonly min: 0;
463
+ readonly max: 1;
464
+ readonly step: 0.01;
465
+ readonly hint: "Darkening towards the edges of the frame.";
466
+ };
467
+ readonly warp: {
468
+ readonly default: 0.5;
469
+ readonly max: 2;
470
+ readonly slot: "warp";
471
+ readonly label: "Warp";
472
+ readonly min: 0;
473
+ readonly step: 0.01;
474
+ readonly hint: "How far the field is pushed around before it is sampled.";
475
+ };
476
+ readonly relief: {
477
+ readonly slot: "a";
478
+ readonly label: "Relief";
479
+ readonly min: 0.05;
480
+ readonly max: 3;
481
+ readonly step: 0.01;
482
+ readonly default: 1;
483
+ readonly hint: "Steepness of the surface. High values give a boiling, molten look.";
484
+ };
485
+ readonly polish: {
486
+ readonly slot: "b";
487
+ readonly label: "Polish";
488
+ readonly min: 0;
489
+ readonly max: 1;
490
+ readonly step: 0.01;
491
+ readonly default: 0.55;
492
+ readonly hint: "Tightness of the specular highlight.";
493
+ };
494
+ readonly body: {
495
+ readonly slot: "c";
496
+ readonly label: "Body";
497
+ readonly min: 0;
498
+ readonly max: 2;
499
+ readonly step: 0.01;
500
+ readonly default: 0.9;
501
+ readonly hint: "Weight of the environment reflection under the highlight.";
502
+ };
503
+ readonly rim: {
504
+ readonly slot: "d";
505
+ readonly label: "Rim";
506
+ readonly min: 0;
507
+ readonly max: 2;
508
+ readonly step: 0.01;
509
+ readonly default: 0.5;
510
+ readonly hint: "Fresnel glow at grazing angles.";
511
+ };
512
+ readonly intensity: {
513
+ readonly slot: "intensity";
514
+ readonly label: "Strength";
515
+ readonly min: 0;
516
+ readonly max: 2.5;
517
+ readonly step: 0.01;
518
+ readonly default: 1;
519
+ readonly hint: "Overall brightness of the effect before the post chain.";
520
+ };
521
+ readonly grain: {
522
+ readonly slot: "grain";
523
+ readonly label: "Grain";
524
+ readonly min: 0;
525
+ readonly max: 0.35;
526
+ readonly step: 0.005;
527
+ readonly default: 0.03;
528
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
529
+ };
530
+ };
531
+ readonly colors: {
532
+ readonly colorA: ColorControl;
533
+ readonly colorB: ColorControl;
534
+ readonly colorC: ColorControl;
535
+ };
536
+ };
537
+ readonly starfield: {
538
+ readonly name: "Starfield";
539
+ readonly tagline: "A warp corridor of depth-sorted stars";
540
+ readonly 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.";
541
+ readonly family: "spatial";
542
+ readonly tags: readonly ["space", "motion", "dark"];
543
+ readonly cost: "medium";
544
+ readonly controls: {
545
+ readonly speed: {
546
+ readonly default: 1;
547
+ readonly max: 4;
548
+ readonly slot: "speed";
549
+ readonly label: "Speed";
550
+ readonly min: 0;
551
+ readonly step: 0.01;
552
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
553
+ };
554
+ readonly scale: {
555
+ readonly default: 1;
556
+ readonly slot: "scale";
557
+ readonly label: "Scale";
558
+ readonly min: 0.2;
559
+ readonly max: 3;
560
+ readonly step: 0.01;
561
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
562
+ };
563
+ readonly vignette: {
564
+ readonly default: 0.5;
565
+ readonly slot: "vignette";
566
+ readonly label: "Vignette";
567
+ readonly min: 0;
568
+ readonly max: 1;
569
+ readonly step: 0.01;
570
+ readonly hint: "Darkening towards the edges of the frame.";
571
+ };
572
+ readonly brightness: {
573
+ readonly slot: "a";
574
+ readonly label: "Star size";
575
+ readonly min: 0.1;
576
+ readonly max: 3;
577
+ readonly step: 0.01;
578
+ readonly default: 1;
579
+ readonly hint: "Radius of each star's falloff.";
580
+ };
581
+ readonly streak: {
582
+ readonly slot: "b";
583
+ readonly label: "Streak";
584
+ readonly min: 0;
585
+ readonly max: 1;
586
+ readonly step: 0.01;
587
+ readonly default: 0.25;
588
+ readonly hint: "Radial motion blur. 0 is a still sky, 1 is warp speed.";
589
+ };
590
+ readonly core: {
591
+ readonly slot: "c";
592
+ readonly label: "Core glow";
593
+ readonly min: 0;
594
+ readonly max: 3;
595
+ readonly step: 0.01;
596
+ readonly default: 0.8;
597
+ readonly hint: "Light at the vanishing point.";
598
+ };
599
+ readonly roll: {
600
+ readonly slot: "d";
601
+ readonly label: "Roll";
602
+ readonly min: -3;
603
+ readonly max: 3;
604
+ readonly step: 0.01;
605
+ readonly default: 0.6;
606
+ readonly hint: "Camera roll around the direction of travel.";
607
+ };
608
+ readonly intensity: {
609
+ readonly slot: "intensity";
610
+ readonly label: "Strength";
611
+ readonly min: 0;
612
+ readonly max: 2.5;
613
+ readonly step: 0.01;
614
+ readonly default: 1;
615
+ readonly hint: "Overall brightness of the effect before the post chain.";
616
+ };
617
+ readonly vibrancy: {
618
+ readonly slot: "vibrancy";
619
+ readonly label: "Vibrancy";
620
+ readonly min: 0;
621
+ readonly max: 2;
622
+ readonly step: 0.01;
623
+ readonly default: 1;
624
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
625
+ };
626
+ readonly grain: {
627
+ readonly slot: "grain";
628
+ readonly label: "Grain";
629
+ readonly min: 0;
630
+ readonly max: 0.35;
631
+ readonly step: 0.005;
632
+ readonly default: 0.03;
633
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
634
+ };
635
+ };
636
+ readonly colors: {
637
+ readonly colorA: ColorControl;
638
+ readonly colorB: ColorControl;
639
+ readonly colorC: ColorControl;
640
+ };
641
+ };
642
+ readonly ripple: {
643
+ readonly name: "Ripple";
644
+ readonly tagline: "Interference between travelling circular waves";
645
+ readonly 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.";
646
+ readonly family: "organic";
647
+ readonly tags: readonly ["water", "interference", "calm"];
648
+ readonly cost: "medium";
649
+ readonly controls: {
650
+ readonly speed: {
651
+ readonly default: 0.6;
652
+ readonly slot: "speed";
653
+ readonly label: "Speed";
654
+ readonly min: 0;
655
+ readonly max: 3;
656
+ readonly step: 0.01;
657
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
658
+ };
659
+ readonly scale: {
660
+ readonly default: 1;
661
+ readonly slot: "scale";
662
+ readonly label: "Scale";
663
+ readonly min: 0.2;
664
+ readonly max: 3;
665
+ readonly step: 0.01;
666
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
667
+ };
668
+ readonly vignette: {
669
+ readonly default: 0.3;
670
+ readonly slot: "vignette";
671
+ readonly label: "Vignette";
672
+ readonly min: 0;
673
+ readonly max: 1;
674
+ readonly step: 0.01;
675
+ readonly hint: "Darkening towards the edges of the frame.";
676
+ };
677
+ readonly frequency: {
678
+ readonly slot: "a";
679
+ readonly label: "Frequency";
680
+ readonly min: 0.2;
681
+ readonly max: 3;
682
+ readonly step: 0.01;
683
+ readonly default: 1;
684
+ readonly hint: "Wavelength of every source. High values give fine ripples.";
685
+ };
686
+ readonly spread: {
687
+ readonly slot: "b";
688
+ readonly label: "Source spread";
689
+ readonly min: 0;
690
+ readonly max: 2;
691
+ readonly step: 0.01;
692
+ readonly default: 1;
693
+ readonly hint: "How far the sources orbit from the centre.";
694
+ };
695
+ readonly refraction: {
696
+ readonly slot: "c";
697
+ readonly label: "Refraction";
698
+ readonly min: 0;
699
+ readonly max: 3;
700
+ readonly step: 0.01;
701
+ readonly default: 1;
702
+ readonly hint: "How much the wave slope bends the colour lookup.";
703
+ };
704
+ readonly caustics: {
705
+ readonly slot: "d";
706
+ readonly label: "Caustics";
707
+ readonly min: 0;
708
+ readonly max: 2;
709
+ readonly step: 0.01;
710
+ readonly default: 0.5;
711
+ readonly hint: "Bright highlights where wavefronts cancel.";
712
+ };
713
+ readonly intensity: {
714
+ readonly slot: "intensity";
715
+ readonly label: "Strength";
716
+ readonly min: 0;
717
+ readonly max: 2.5;
718
+ readonly step: 0.01;
719
+ readonly default: 1;
720
+ readonly hint: "Overall brightness of the effect before the post chain.";
721
+ };
722
+ readonly vibrancy: {
723
+ readonly slot: "vibrancy";
724
+ readonly label: "Vibrancy";
725
+ readonly min: 0;
726
+ readonly max: 2;
727
+ readonly step: 0.01;
728
+ readonly default: 1;
729
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
730
+ };
731
+ readonly grain: {
732
+ readonly slot: "grain";
733
+ readonly label: "Grain";
734
+ readonly min: 0;
735
+ readonly max: 0.35;
736
+ readonly step: 0.005;
737
+ readonly default: 0.03;
738
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
739
+ };
740
+ };
741
+ readonly colors: {
742
+ readonly colorA: ColorControl;
743
+ readonly colorB: ColorControl;
744
+ readonly colorC: ColorControl;
745
+ };
746
+ };
747
+ readonly "film-grain": {
748
+ readonly name: "Film Grain";
749
+ readonly tagline: "Stock grain, halation and scanlines over a slow wash";
750
+ readonly 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.";
751
+ readonly family: "texture";
752
+ readonly tags: readonly ["analog", "overlay", "noise"];
753
+ readonly cost: "light";
754
+ readonly controls: {
755
+ readonly speed: {
756
+ readonly default: 0.5;
757
+ readonly slot: "speed";
758
+ readonly label: "Speed";
759
+ readonly min: 0;
760
+ readonly max: 3;
761
+ readonly step: 0.01;
762
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
763
+ };
764
+ readonly scale: {
765
+ readonly default: 1.2;
766
+ readonly slot: "scale";
767
+ readonly label: "Scale";
768
+ readonly min: 0.2;
769
+ readonly max: 3;
770
+ readonly step: 0.01;
771
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
772
+ };
773
+ readonly intensity: {
774
+ readonly default: 0.7;
775
+ readonly slot: "intensity";
776
+ readonly label: "Strength";
777
+ readonly min: 0;
778
+ readonly max: 2.5;
779
+ readonly step: 0.01;
780
+ readonly hint: "Overall brightness of the effect before the post chain.";
781
+ };
782
+ readonly vibrancy: {
783
+ readonly default: 0.8;
784
+ readonly slot: "vibrancy";
785
+ readonly label: "Vibrancy";
786
+ readonly min: 0;
787
+ readonly max: 2;
788
+ readonly step: 0.01;
789
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
790
+ };
791
+ readonly grain: {
792
+ readonly default: 0;
793
+ readonly slot: "grain";
794
+ readonly label: "Grain";
795
+ readonly min: 0;
796
+ readonly max: 0.35;
797
+ readonly step: 0.005;
798
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
799
+ };
800
+ readonly vignette: {
801
+ readonly default: 0.55;
802
+ readonly slot: "vignette";
803
+ readonly label: "Vignette";
804
+ readonly min: 0;
805
+ readonly max: 1;
806
+ readonly step: 0.01;
807
+ readonly hint: "Darkening towards the edges of the frame.";
808
+ };
809
+ readonly stock: {
810
+ readonly slot: "a";
811
+ readonly label: "Stock grain";
812
+ readonly min: 0;
813
+ readonly max: 0.6;
814
+ readonly step: 0.005;
815
+ readonly default: 0.14;
816
+ readonly hint: "The main grain amount. This is the point of the shader.";
817
+ };
818
+ readonly scanlines: {
819
+ readonly slot: "b";
820
+ readonly label: "Scanlines";
821
+ readonly min: 0;
822
+ readonly max: 0.6;
823
+ readonly step: 0.005;
824
+ readonly default: 0.08;
825
+ readonly hint: "Horizontal line darkening.";
826
+ };
827
+ readonly aberration: {
828
+ readonly slot: "c";
829
+ readonly label: "Aberration";
830
+ readonly min: 0;
831
+ readonly max: 2;
832
+ readonly step: 0.01;
833
+ readonly default: 0.5;
834
+ readonly hint: "Lateral split between the red and blue channels.";
835
+ };
836
+ readonly "grain-size": {
837
+ readonly slot: "d";
838
+ readonly label: "Grain size";
839
+ readonly min: 0.5;
840
+ readonly max: 6;
841
+ readonly step: 0.1;
842
+ readonly default: 1.5;
843
+ readonly hint: "Physical size of one grain cell, in device pixels.";
844
+ };
845
+ };
846
+ readonly colors: {
847
+ readonly colorA: ColorControl;
848
+ readonly colorB: ColorControl;
849
+ readonly colorC: ColorControl;
850
+ };
851
+ };
852
+ readonly truchet: {
853
+ readonly name: "Truchet";
854
+ readonly tagline: "Quarter-arc tiles that flip in place";
855
+ readonly 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.";
856
+ readonly family: "geometric";
857
+ readonly tags: readonly ["lines", "pattern", "graphic"];
858
+ readonly cost: "light";
859
+ readonly controls: {
860
+ readonly speed: {
861
+ readonly default: 0.5;
862
+ readonly slot: "speed";
863
+ readonly label: "Speed";
864
+ readonly min: 0;
865
+ readonly max: 3;
866
+ readonly step: 0.01;
867
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
868
+ };
869
+ readonly scale: {
870
+ readonly default: 0.5;
871
+ readonly min: 0.1;
872
+ readonly max: 2;
873
+ readonly slot: "scale";
874
+ readonly label: "Scale";
875
+ readonly step: 0.01;
876
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
877
+ };
878
+ readonly vibrancy: {
879
+ readonly default: 1.1;
880
+ readonly slot: "vibrancy";
881
+ readonly label: "Vibrancy";
882
+ readonly min: 0;
883
+ readonly max: 2;
884
+ readonly step: 0.01;
885
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
886
+ };
887
+ readonly vignette: {
888
+ readonly default: 0.35;
889
+ readonly slot: "vignette";
890
+ readonly label: "Vignette";
891
+ readonly min: 0;
892
+ readonly max: 1;
893
+ readonly step: 0.01;
894
+ readonly hint: "Darkening towards the edges of the frame.";
895
+ };
896
+ readonly weight: {
897
+ readonly slot: "a";
898
+ readonly label: "Stroke weight";
899
+ readonly min: 0.1;
900
+ readonly max: 2;
901
+ readonly step: 0.01;
902
+ readonly default: 0.5;
903
+ readonly hint: "Thickness of each arc.";
904
+ };
905
+ readonly flip: {
906
+ readonly slot: "b";
907
+ readonly label: "Flip chance";
908
+ readonly min: 0;
909
+ readonly max: 2;
910
+ readonly step: 0.01;
911
+ readonly default: 1;
912
+ readonly hint: "How often tiles change orientation. 0 freezes the maze.";
913
+ };
914
+ readonly pan: {
915
+ readonly slot: "c";
916
+ readonly label: "Pan";
917
+ readonly min: -3;
918
+ readonly max: 3;
919
+ readonly step: 0.01;
920
+ readonly default: 1;
921
+ readonly hint: "Sideways drift of the whole tiling.";
922
+ };
923
+ readonly rotate: {
924
+ readonly slot: "d";
925
+ readonly label: "Rotate";
926
+ readonly min: -3;
927
+ readonly max: 3;
928
+ readonly step: 0.01;
929
+ readonly default: 0.5;
930
+ readonly hint: "Slow rotation of the tile grid.";
931
+ };
932
+ readonly intensity: {
933
+ readonly slot: "intensity";
934
+ readonly label: "Strength";
935
+ readonly min: 0;
936
+ readonly max: 2.5;
937
+ readonly step: 0.01;
938
+ readonly default: 1;
939
+ readonly hint: "Overall brightness of the effect before the post chain.";
940
+ };
941
+ readonly grain: {
942
+ readonly slot: "grain";
943
+ readonly label: "Grain";
944
+ readonly min: 0;
945
+ readonly max: 0.35;
946
+ readonly step: 0.005;
947
+ readonly default: 0.03;
948
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
949
+ };
950
+ };
951
+ readonly colors: {
952
+ readonly colorA: ColorControl;
953
+ readonly colorB: ColorControl;
954
+ readonly colorC: ColorControl;
955
+ };
956
+ };
957
+ readonly kaleidoscope: {
958
+ readonly name: "Kaleidoscope";
959
+ readonly tagline: "Polar mirror folding over a drifting field";
960
+ readonly 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.";
961
+ readonly family: "geometric";
962
+ readonly tags: readonly ["symmetry", "polar", "hypnotic"];
963
+ readonly cost: "medium";
964
+ readonly controls: {
965
+ readonly speed: {
966
+ readonly default: 0.5;
967
+ readonly slot: "speed";
968
+ readonly label: "Speed";
969
+ readonly min: 0;
970
+ readonly max: 3;
971
+ readonly step: 0.01;
972
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
973
+ };
974
+ readonly scale: {
975
+ readonly default: 1;
976
+ readonly slot: "scale";
977
+ readonly label: "Scale";
978
+ readonly min: 0.2;
979
+ readonly max: 3;
980
+ readonly step: 0.01;
981
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
982
+ };
983
+ readonly vignette: {
984
+ readonly default: 0.4;
985
+ readonly slot: "vignette";
986
+ readonly label: "Vignette";
987
+ readonly min: 0;
988
+ readonly max: 1;
989
+ readonly step: 0.01;
990
+ readonly hint: "Darkening towards the edges of the frame.";
991
+ };
992
+ readonly warp: {
993
+ readonly default: 0.3;
994
+ readonly max: 1.5;
995
+ readonly slot: "warp";
996
+ readonly label: "Warp";
997
+ readonly min: 0;
998
+ readonly step: 0.01;
999
+ readonly hint: "How far the field is pushed around before it is sampled.";
1000
+ };
1001
+ readonly segments: {
1002
+ readonly slot: "a";
1003
+ readonly label: "Segments";
1004
+ readonly min: 2;
1005
+ readonly max: 24;
1006
+ readonly step: 1;
1007
+ readonly default: 8;
1008
+ readonly hint: "Number of mirrored wedges. Even counts feel more ordered.";
1009
+ };
1010
+ readonly rings: {
1011
+ readonly slot: "b";
1012
+ readonly label: "Rings";
1013
+ readonly min: 0;
1014
+ readonly max: 3;
1015
+ readonly step: 0.01;
1016
+ readonly default: 1;
1017
+ readonly hint: "Frequency of the concentric ring pattern.";
1018
+ };
1019
+ readonly blend: {
1020
+ readonly slot: "c";
1021
+ readonly label: "Ring blend";
1022
+ readonly min: 0;
1023
+ readonly max: 2;
1024
+ readonly step: 0.01;
1025
+ readonly default: 0.6;
1026
+ readonly hint: "How strongly the rings modulate the palette lookup.";
1027
+ };
1028
+ readonly spin: {
1029
+ readonly slot: "d";
1030
+ readonly label: "Spin";
1031
+ readonly min: -3;
1032
+ readonly max: 3;
1033
+ readonly step: 0.01;
1034
+ readonly default: 1;
1035
+ readonly hint: "Rotation of the whole kaleidoscope.";
1036
+ };
1037
+ readonly intensity: {
1038
+ readonly slot: "intensity";
1039
+ readonly label: "Strength";
1040
+ readonly min: 0;
1041
+ readonly max: 2.5;
1042
+ readonly step: 0.01;
1043
+ readonly default: 1;
1044
+ readonly hint: "Overall brightness of the effect before the post chain.";
1045
+ };
1046
+ readonly vibrancy: {
1047
+ readonly slot: "vibrancy";
1048
+ readonly label: "Vibrancy";
1049
+ readonly min: 0;
1050
+ readonly max: 2;
1051
+ readonly step: 0.01;
1052
+ readonly default: 1;
1053
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1054
+ };
1055
+ readonly grain: {
1056
+ readonly slot: "grain";
1057
+ readonly label: "Grain";
1058
+ readonly min: 0;
1059
+ readonly max: 0.35;
1060
+ readonly step: 0.005;
1061
+ readonly default: 0.03;
1062
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1063
+ };
1064
+ };
1065
+ readonly colors: {
1066
+ readonly colorA: ColorControl;
1067
+ readonly colorB: ColorControl;
1068
+ readonly colorC: ColorControl;
1069
+ };
1070
+ };
1071
+ readonly halftone: {
1072
+ readonly name: "Halftone";
1073
+ readonly tagline: "A duotone image reproduced as a rotated dot screen";
1074
+ readonly 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.";
1075
+ readonly family: "texture";
1076
+ readonly tags: readonly ["print", "duotone", "editorial"];
1077
+ readonly cost: "light";
1078
+ readonly controls: {
1079
+ readonly speed: {
1080
+ readonly default: 0.4;
1081
+ readonly slot: "speed";
1082
+ readonly label: "Speed";
1083
+ readonly min: 0;
1084
+ readonly max: 3;
1085
+ readonly step: 0.01;
1086
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1087
+ };
1088
+ readonly scale: {
1089
+ readonly default: 1;
1090
+ readonly slot: "scale";
1091
+ readonly label: "Scale";
1092
+ readonly min: 0.2;
1093
+ readonly max: 3;
1094
+ readonly step: 0.01;
1095
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1096
+ };
1097
+ readonly grain: {
1098
+ readonly default: 0;
1099
+ readonly slot: "grain";
1100
+ readonly label: "Grain";
1101
+ readonly min: 0;
1102
+ readonly max: 0.35;
1103
+ readonly step: 0.005;
1104
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1105
+ };
1106
+ readonly vignette: {
1107
+ readonly default: 0.2;
1108
+ readonly slot: "vignette";
1109
+ readonly label: "Vignette";
1110
+ readonly min: 0;
1111
+ readonly max: 1;
1112
+ readonly step: 0.01;
1113
+ readonly hint: "Darkening towards the edges of the frame.";
1114
+ };
1115
+ readonly pitch: {
1116
+ readonly slot: "a";
1117
+ readonly label: "Dot pitch";
1118
+ readonly min: 3;
1119
+ readonly max: 40;
1120
+ readonly step: 0.5;
1121
+ readonly default: 9;
1122
+ readonly hint: "Distance between dot centres, in device pixels.";
1123
+ };
1124
+ readonly softness: {
1125
+ readonly slot: "b";
1126
+ readonly label: "Dot softness";
1127
+ readonly min: 0.005;
1128
+ readonly max: 0.4;
1129
+ readonly step: 0.005;
1130
+ readonly default: 0.03;
1131
+ readonly hint: "Edge blur on each dot. Keep low for a real print look.";
1132
+ };
1133
+ readonly angle: {
1134
+ readonly slot: "c";
1135
+ readonly label: "Screen angle";
1136
+ readonly min: 0;
1137
+ readonly max: 1;
1138
+ readonly step: 0.005;
1139
+ readonly default: 0.25;
1140
+ readonly hint: "Rotation of the screen, in half-turns.";
1141
+ };
1142
+ readonly gamma: {
1143
+ readonly slot: "d";
1144
+ readonly label: "Ink gamma";
1145
+ readonly min: 0.2;
1146
+ readonly max: 3;
1147
+ readonly step: 0.01;
1148
+ readonly default: 1;
1149
+ readonly hint: "Bias of the coverage curve — how quickly dots fill in.";
1150
+ };
1151
+ readonly intensity: {
1152
+ readonly slot: "intensity";
1153
+ readonly label: "Strength";
1154
+ readonly min: 0;
1155
+ readonly max: 2.5;
1156
+ readonly step: 0.01;
1157
+ readonly default: 1;
1158
+ readonly hint: "Overall brightness of the effect before the post chain.";
1159
+ };
1160
+ readonly vibrancy: {
1161
+ readonly slot: "vibrancy";
1162
+ readonly label: "Vibrancy";
1163
+ readonly min: 0;
1164
+ readonly max: 2;
1165
+ readonly step: 0.01;
1166
+ readonly default: 1;
1167
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1168
+ };
1169
+ };
1170
+ readonly colors: {
1171
+ readonly colorA: ColorControl;
1172
+ readonly colorB: ColorControl;
1173
+ readonly colorC: ColorControl;
1174
+ };
1175
+ };
1176
+ readonly tunnel: {
1177
+ readonly name: "Tunnel";
1178
+ readonly tagline: "A raymarched corridor with emissive rings";
1179
+ readonly 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.";
1180
+ readonly family: "spatial";
1181
+ readonly tags: readonly ["raymarching", "3d", "motion"];
1182
+ readonly cost: "heavy";
1183
+ readonly controls: {
1184
+ readonly speed: {
1185
+ readonly default: 0.6;
1186
+ readonly max: 3;
1187
+ readonly slot: "speed";
1188
+ readonly label: "Speed";
1189
+ readonly min: 0;
1190
+ readonly step: 0.01;
1191
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1192
+ };
1193
+ readonly scale: {
1194
+ readonly default: 1;
1195
+ readonly min: 0.4;
1196
+ readonly max: 2.2;
1197
+ readonly slot: "scale";
1198
+ readonly label: "Scale";
1199
+ readonly step: 0.01;
1200
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1201
+ };
1202
+ readonly vignette: {
1203
+ readonly default: 0.45;
1204
+ readonly slot: "vignette";
1205
+ readonly label: "Vignette";
1206
+ readonly min: 0;
1207
+ readonly max: 1;
1208
+ readonly step: 0.01;
1209
+ readonly hint: "Darkening towards the edges of the frame.";
1210
+ };
1211
+ readonly radius: {
1212
+ readonly slot: "a";
1213
+ readonly label: "Radius";
1214
+ readonly min: 0.3;
1215
+ readonly max: 2.5;
1216
+ readonly step: 0.01;
1217
+ readonly default: 1;
1218
+ readonly hint: "Width of the corridor.";
1219
+ };
1220
+ readonly ribs: {
1221
+ readonly slot: "b";
1222
+ readonly label: "Ribs";
1223
+ readonly min: 0;
1224
+ readonly max: 3;
1225
+ readonly step: 0.01;
1226
+ readonly default: 1;
1227
+ readonly hint: "Corrugation of the tunnel wall.";
1228
+ };
1229
+ readonly rings: {
1230
+ readonly slot: "c";
1231
+ readonly label: "Ring light";
1232
+ readonly min: 0;
1233
+ readonly max: 2;
1234
+ readonly step: 0.01;
1235
+ readonly default: 0.5;
1236
+ readonly hint: "Brightness of the emissive rings passing by.";
1237
+ };
1238
+ readonly fog: {
1239
+ readonly slot: "d";
1240
+ readonly label: "Fog";
1241
+ readonly min: 0;
1242
+ readonly max: 1;
1243
+ readonly step: 0.01;
1244
+ readonly default: 0.35;
1245
+ readonly hint: "How quickly the far end of the corridor disappears.";
1246
+ };
1247
+ readonly intensity: {
1248
+ readonly slot: "intensity";
1249
+ readonly label: "Strength";
1250
+ readonly min: 0;
1251
+ readonly max: 2.5;
1252
+ readonly step: 0.01;
1253
+ readonly default: 1;
1254
+ readonly hint: "Overall brightness of the effect before the post chain.";
1255
+ };
1256
+ readonly vibrancy: {
1257
+ readonly slot: "vibrancy";
1258
+ readonly label: "Vibrancy";
1259
+ readonly min: 0;
1260
+ readonly max: 2;
1261
+ readonly step: 0.01;
1262
+ readonly default: 1;
1263
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1264
+ };
1265
+ readonly grain: {
1266
+ readonly slot: "grain";
1267
+ readonly label: "Grain";
1268
+ readonly min: 0;
1269
+ readonly max: 0.35;
1270
+ readonly step: 0.005;
1271
+ readonly default: 0.03;
1272
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1273
+ };
1274
+ };
1275
+ readonly colors: {
1276
+ readonly colorA: ColorControl;
1277
+ readonly colorB: ColorControl;
1278
+ readonly colorC: ColorControl;
1279
+ };
1280
+ };
1281
+ readonly julia: {
1282
+ readonly name: "Julia";
1283
+ readonly tagline: "Escape-time fractal with orbit-trap colouring";
1284
+ readonly 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.";
1285
+ readonly family: "fractal";
1286
+ readonly tags: readonly ["mathematical", "detail", "zoom"];
1287
+ readonly cost: "heavy";
1288
+ readonly controls: {
1289
+ readonly speed: {
1290
+ readonly default: 0.35;
1291
+ readonly max: 2;
1292
+ readonly slot: "speed";
1293
+ readonly label: "Speed";
1294
+ readonly min: 0;
1295
+ readonly step: 0.01;
1296
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1297
+ };
1298
+ readonly scale: {
1299
+ readonly default: 1.15;
1300
+ readonly min: 0.2;
1301
+ readonly max: 6;
1302
+ readonly slot: "scale";
1303
+ readonly label: "Scale";
1304
+ readonly step: 0.01;
1305
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1306
+ };
1307
+ readonly intensity: {
1308
+ readonly default: 1.45;
1309
+ readonly slot: "intensity";
1310
+ readonly label: "Strength";
1311
+ readonly min: 0;
1312
+ readonly max: 2.5;
1313
+ readonly step: 0.01;
1314
+ readonly hint: "Overall brightness of the effect before the post chain.";
1315
+ };
1316
+ readonly vignette: {
1317
+ readonly default: 0.35;
1318
+ readonly slot: "vignette";
1319
+ readonly label: "Vignette";
1320
+ readonly min: 0;
1321
+ readonly max: 1;
1322
+ readonly step: 0.01;
1323
+ readonly hint: "Darkening towards the edges of the frame.";
1324
+ };
1325
+ readonly seed: {
1326
+ readonly slot: "a";
1327
+ readonly label: "Seed radius";
1328
+ readonly min: 0.6;
1329
+ readonly max: 1.25;
1330
+ readonly step: 0.005;
1331
+ readonly default: 0.86;
1332
+ readonly hint: "Distance of the orbiting seed from the origin. Near 1 is the interesting band.";
1333
+ };
1334
+ readonly bias: {
1335
+ readonly slot: "b";
1336
+ readonly label: "Seed bias";
1337
+ readonly min: 0;
1338
+ readonly max: 1;
1339
+ readonly step: 0.005;
1340
+ readonly default: 0.5;
1341
+ readonly hint: "Shifts the seed along the real axis, changing the family of shapes.";
1342
+ };
1343
+ readonly banding: {
1344
+ readonly slot: "c";
1345
+ readonly label: "Banding";
1346
+ readonly min: 0.1;
1347
+ readonly max: 4;
1348
+ readonly step: 0.01;
1349
+ readonly default: 1;
1350
+ readonly hint: "How many colour bands the escape count is spread across.";
1351
+ };
1352
+ readonly rotate: {
1353
+ readonly slot: "d";
1354
+ readonly label: "Rotate";
1355
+ readonly min: -3;
1356
+ readonly max: 3;
1357
+ readonly step: 0.01;
1358
+ readonly default: 0.5;
1359
+ readonly hint: "Rotation of the viewing plane.";
1360
+ };
1361
+ readonly vibrancy: {
1362
+ readonly slot: "vibrancy";
1363
+ readonly label: "Vibrancy";
1364
+ readonly min: 0;
1365
+ readonly max: 2;
1366
+ readonly step: 0.01;
1367
+ readonly default: 1;
1368
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1369
+ };
1370
+ readonly grain: {
1371
+ readonly slot: "grain";
1372
+ readonly label: "Grain";
1373
+ readonly min: 0;
1374
+ readonly max: 0.35;
1375
+ readonly step: 0.005;
1376
+ readonly default: 0.03;
1377
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1378
+ };
1379
+ };
1380
+ readonly colors: {
1381
+ readonly colorA: ColorControl;
1382
+ readonly colorB: ColorControl;
1383
+ readonly colorC: ColorControl;
1384
+ };
1385
+ };
1386
+ readonly silk: {
1387
+ readonly name: "Silk";
1388
+ readonly tagline: "Anisotropic sheen across warped fibre lines";
1389
+ readonly 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.";
1390
+ readonly family: "organic";
1391
+ readonly tags: readonly ["fabric", "soft", "luxury"];
1392
+ readonly cost: "medium";
1393
+ readonly controls: {
1394
+ readonly speed: {
1395
+ readonly default: 0.35;
1396
+ readonly max: 2;
1397
+ readonly slot: "speed";
1398
+ readonly label: "Speed";
1399
+ readonly min: 0;
1400
+ readonly step: 0.01;
1401
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1402
+ };
1403
+ readonly scale: {
1404
+ readonly default: 0.9;
1405
+ readonly slot: "scale";
1406
+ readonly label: "Scale";
1407
+ readonly min: 0.2;
1408
+ readonly max: 3;
1409
+ readonly step: 0.01;
1410
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1411
+ };
1412
+ readonly vibrancy: {
1413
+ readonly default: 0.95;
1414
+ readonly slot: "vibrancy";
1415
+ readonly label: "Vibrancy";
1416
+ readonly min: 0;
1417
+ readonly max: 2;
1418
+ readonly step: 0.01;
1419
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1420
+ };
1421
+ readonly vignette: {
1422
+ readonly default: 0.35;
1423
+ readonly slot: "vignette";
1424
+ readonly label: "Vignette";
1425
+ readonly min: 0;
1426
+ readonly max: 1;
1427
+ readonly step: 0.01;
1428
+ readonly hint: "Darkening towards the edges of the frame.";
1429
+ };
1430
+ readonly warp: {
1431
+ readonly default: 0.45;
1432
+ readonly max: 1.5;
1433
+ readonly slot: "warp";
1434
+ readonly label: "Warp";
1435
+ readonly min: 0;
1436
+ readonly step: 0.01;
1437
+ readonly hint: "How far the field is pushed around before it is sampled.";
1438
+ };
1439
+ readonly weave: {
1440
+ readonly slot: "a";
1441
+ readonly label: "Weave";
1442
+ readonly min: 0.1;
1443
+ readonly max: 3;
1444
+ readonly step: 0.01;
1445
+ readonly default: 1;
1446
+ readonly hint: "Density of the fibre lines.";
1447
+ };
1448
+ readonly bend: {
1449
+ readonly slot: "b";
1450
+ readonly label: "Bend";
1451
+ readonly min: 0;
1452
+ readonly max: 2;
1453
+ readonly step: 0.01;
1454
+ readonly default: 1;
1455
+ readonly hint: "How far the folds displace the fibres.";
1456
+ };
1457
+ readonly sheen: {
1458
+ readonly slot: "c";
1459
+ readonly label: "Sheen";
1460
+ readonly min: 0;
1461
+ readonly max: 2;
1462
+ readonly step: 0.01;
1463
+ readonly default: 0.6;
1464
+ readonly hint: "Strength of the directional highlight.";
1465
+ };
1466
+ readonly crease: {
1467
+ readonly slot: "d";
1468
+ readonly label: "Crease";
1469
+ readonly min: 0;
1470
+ readonly max: 1.5;
1471
+ readonly step: 0.01;
1472
+ readonly default: 0.5;
1473
+ readonly hint: "Darkening in the valleys of the fold.";
1474
+ };
1475
+ readonly intensity: {
1476
+ readonly slot: "intensity";
1477
+ readonly label: "Strength";
1478
+ readonly min: 0;
1479
+ readonly max: 2.5;
1480
+ readonly step: 0.01;
1481
+ readonly default: 1;
1482
+ readonly hint: "Overall brightness of the effect before the post chain.";
1483
+ };
1484
+ readonly grain: {
1485
+ readonly slot: "grain";
1486
+ readonly label: "Grain";
1487
+ readonly min: 0;
1488
+ readonly max: 0.35;
1489
+ readonly step: 0.005;
1490
+ readonly default: 0.03;
1491
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1492
+ };
1493
+ };
1494
+ readonly colors: {
1495
+ readonly colorA: ColorControl;
1496
+ readonly colorB: ColorControl;
1497
+ readonly colorC: ColorControl;
1498
+ };
1499
+ };
1500
+ readonly "neon-grid": {
1501
+ readonly name: "Neon Grid";
1502
+ readonly tagline: "Perspective floor, banded sun, horizon haze";
1503
+ readonly 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.";
1504
+ readonly family: "spatial";
1505
+ readonly tags: readonly ["synthwave", "retro", "horizon"];
1506
+ readonly cost: "light";
1507
+ readonly controls: {
1508
+ readonly speed: {
1509
+ readonly default: 0.7;
1510
+ readonly max: 3;
1511
+ readonly slot: "speed";
1512
+ readonly label: "Speed";
1513
+ readonly min: 0;
1514
+ readonly step: 0.01;
1515
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1516
+ };
1517
+ readonly scale: {
1518
+ readonly default: 1;
1519
+ readonly slot: "scale";
1520
+ readonly label: "Scale";
1521
+ readonly min: 0.2;
1522
+ readonly max: 3;
1523
+ readonly step: 0.01;
1524
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1525
+ };
1526
+ readonly vibrancy: {
1527
+ readonly default: 1.15;
1528
+ readonly slot: "vibrancy";
1529
+ readonly label: "Vibrancy";
1530
+ readonly min: 0;
1531
+ readonly max: 2;
1532
+ readonly step: 0.01;
1533
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1534
+ };
1535
+ readonly vignette: {
1536
+ readonly default: 0.4;
1537
+ readonly slot: "vignette";
1538
+ readonly label: "Vignette";
1539
+ readonly min: 0;
1540
+ readonly max: 1;
1541
+ readonly step: 0.01;
1542
+ readonly hint: "Darkening towards the edges of the frame.";
1543
+ };
1544
+ readonly density: {
1545
+ readonly slot: "a";
1546
+ readonly label: "Grid density";
1547
+ readonly min: 0.2;
1548
+ readonly max: 4;
1549
+ readonly step: 0.01;
1550
+ readonly default: 1;
1551
+ readonly hint: "Number of grid cells across the floor.";
1552
+ };
1553
+ readonly travel: {
1554
+ readonly slot: "b";
1555
+ readonly label: "Travel";
1556
+ readonly min: -4;
1557
+ readonly max: 4;
1558
+ readonly step: 0.01;
1559
+ readonly default: 1;
1560
+ readonly hint: "Speed the floor moves towards you. Negative reverses it.";
1561
+ };
1562
+ readonly haze: {
1563
+ readonly slot: "c";
1564
+ readonly label: "Haze";
1565
+ readonly min: 0;
1566
+ readonly max: 2;
1567
+ readonly step: 0.01;
1568
+ readonly default: 0.5;
1569
+ readonly hint: "Glow along the horizon line.";
1570
+ };
1571
+ readonly sun: {
1572
+ readonly slot: "d";
1573
+ readonly label: "Sun glow";
1574
+ readonly min: 0;
1575
+ readonly max: 3;
1576
+ readonly step: 0.01;
1577
+ readonly default: 1;
1578
+ readonly hint: "Bloom around the sun disc.";
1579
+ };
1580
+ readonly intensity: {
1581
+ readonly slot: "intensity";
1582
+ readonly label: "Strength";
1583
+ readonly min: 0;
1584
+ readonly max: 2.5;
1585
+ readonly step: 0.01;
1586
+ readonly default: 1;
1587
+ readonly hint: "Overall brightness of the effect before the post chain.";
1588
+ };
1589
+ readonly grain: {
1590
+ readonly slot: "grain";
1591
+ readonly label: "Grain";
1592
+ readonly min: 0;
1593
+ readonly max: 0.35;
1594
+ readonly step: 0.005;
1595
+ readonly default: 0.03;
1596
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1597
+ };
1598
+ };
1599
+ readonly colors: {
1600
+ readonly colorA: ColorControl;
1601
+ readonly colorB: ColorControl;
1602
+ readonly colorC: ColorControl;
1603
+ };
1604
+ };
1605
+ readonly bokeh: {
1606
+ readonly name: "Bokeh";
1607
+ readonly tagline: "Out-of-focus lights drifting through depth";
1608
+ readonly 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.";
1609
+ readonly family: "spatial";
1610
+ readonly tags: readonly ["lights", "depth", "festive"];
1611
+ readonly cost: "medium";
1612
+ readonly controls: {
1613
+ readonly speed: {
1614
+ readonly default: 0.5;
1615
+ readonly max: 2;
1616
+ readonly slot: "speed";
1617
+ readonly label: "Speed";
1618
+ readonly min: 0;
1619
+ readonly step: 0.01;
1620
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1621
+ };
1622
+ readonly scale: {
1623
+ readonly default: 1;
1624
+ readonly slot: "scale";
1625
+ readonly label: "Scale";
1626
+ readonly min: 0.2;
1627
+ readonly max: 3;
1628
+ readonly step: 0.01;
1629
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1630
+ };
1631
+ readonly vignette: {
1632
+ readonly default: 0.45;
1633
+ readonly slot: "vignette";
1634
+ readonly label: "Vignette";
1635
+ readonly min: 0;
1636
+ readonly max: 1;
1637
+ readonly step: 0.01;
1638
+ readonly hint: "Darkening towards the edges of the frame.";
1639
+ };
1640
+ readonly size: {
1641
+ readonly slot: "a";
1642
+ readonly label: "Aperture";
1643
+ readonly min: 0.2;
1644
+ readonly max: 3;
1645
+ readonly step: 0.01;
1646
+ readonly default: 1;
1647
+ readonly hint: "Size of every out-of-focus disc.";
1648
+ };
1649
+ readonly edge: {
1650
+ readonly slot: "b";
1651
+ readonly label: "Edge";
1652
+ readonly min: 0.02;
1653
+ readonly max: 1;
1654
+ readonly step: 0.01;
1655
+ readonly default: 0.35;
1656
+ readonly hint: "How soft the disc edge is. Low values give hard, ringed bokeh.";
1657
+ };
1658
+ readonly rim: {
1659
+ readonly slot: "c";
1660
+ readonly label: "Rim";
1661
+ readonly min: 0;
1662
+ readonly max: 2;
1663
+ readonly step: 0.01;
1664
+ readonly default: 0.8;
1665
+ readonly hint: "Brightness of the ring at the edge of each disc.";
1666
+ };
1667
+ readonly density: {
1668
+ readonly slot: "d";
1669
+ readonly label: "Density";
1670
+ readonly min: 0;
1671
+ readonly max: 2;
1672
+ readonly step: 0.01;
1673
+ readonly default: 1;
1674
+ readonly hint: "Overall weight of every layer.";
1675
+ };
1676
+ readonly intensity: {
1677
+ readonly slot: "intensity";
1678
+ readonly label: "Strength";
1679
+ readonly min: 0;
1680
+ readonly max: 2.5;
1681
+ readonly step: 0.01;
1682
+ readonly default: 1;
1683
+ readonly hint: "Overall brightness of the effect before the post chain.";
1684
+ };
1685
+ readonly vibrancy: {
1686
+ readonly slot: "vibrancy";
1687
+ readonly label: "Vibrancy";
1688
+ readonly min: 0;
1689
+ readonly max: 2;
1690
+ readonly step: 0.01;
1691
+ readonly default: 1;
1692
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1693
+ };
1694
+ readonly grain: {
1695
+ readonly slot: "grain";
1696
+ readonly label: "Grain";
1697
+ readonly min: 0;
1698
+ readonly max: 0.35;
1699
+ readonly step: 0.005;
1700
+ readonly default: 0.03;
1701
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1702
+ };
1703
+ };
1704
+ readonly colors: {
1705
+ readonly colorA: ColorControl;
1706
+ readonly colorB: ColorControl;
1707
+ readonly colorC: ColorControl;
1708
+ };
1709
+ };
1710
+ readonly dither: {
1711
+ readonly name: "Dither";
1712
+ readonly tagline: "A smooth field quantised through an 8×8 Bayer matrix";
1713
+ readonly 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.";
1714
+ readonly family: "texture";
1715
+ readonly tags: readonly ["lofi", "pixel", "poster"];
1716
+ readonly cost: "light";
1717
+ readonly controls: {
1718
+ readonly speed: {
1719
+ readonly default: 0.5;
1720
+ readonly slot: "speed";
1721
+ readonly label: "Speed";
1722
+ readonly min: 0;
1723
+ readonly max: 3;
1724
+ readonly step: 0.01;
1725
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1726
+ };
1727
+ readonly scale: {
1728
+ readonly default: 1;
1729
+ readonly slot: "scale";
1730
+ readonly label: "Scale";
1731
+ readonly min: 0.2;
1732
+ readonly max: 3;
1733
+ readonly step: 0.01;
1734
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1735
+ };
1736
+ readonly grain: {
1737
+ readonly default: 0;
1738
+ readonly slot: "grain";
1739
+ readonly label: "Grain";
1740
+ readonly min: 0;
1741
+ readonly max: 0.35;
1742
+ readonly step: 0.005;
1743
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1744
+ };
1745
+ readonly vignette: {
1746
+ readonly default: 0.15;
1747
+ readonly slot: "vignette";
1748
+ readonly label: "Vignette";
1749
+ readonly min: 0;
1750
+ readonly max: 1;
1751
+ readonly step: 0.01;
1752
+ readonly hint: "Darkening towards the edges of the frame.";
1753
+ };
1754
+ readonly pixel: {
1755
+ readonly slot: "a";
1756
+ readonly label: "Pixel size";
1757
+ readonly min: 1;
1758
+ readonly max: 12;
1759
+ readonly step: 1;
1760
+ readonly default: 3;
1761
+ readonly hint: "Size of one output pixel, in device pixels.";
1762
+ };
1763
+ readonly levels: {
1764
+ readonly slot: "b";
1765
+ readonly label: "Levels";
1766
+ readonly min: 2;
1767
+ readonly max: 12;
1768
+ readonly step: 1;
1769
+ readonly default: 4;
1770
+ readonly hint: "How many tones survive quantisation.";
1771
+ };
1772
+ readonly sweep: {
1773
+ readonly slot: "c";
1774
+ readonly label: "Sweep";
1775
+ readonly min: -2;
1776
+ readonly max: 2;
1777
+ readonly step: 0.01;
1778
+ readonly default: 0.8;
1779
+ readonly hint: "Vertical gradient added to the source image.";
1780
+ };
1781
+ readonly spread: {
1782
+ readonly slot: "d";
1783
+ readonly label: "Dither spread";
1784
+ readonly min: 0;
1785
+ readonly max: 2;
1786
+ readonly step: 0.01;
1787
+ readonly default: 1;
1788
+ readonly hint: "Weight of the Bayer threshold. 0 gives hard banding.";
1789
+ };
1790
+ readonly intensity: {
1791
+ readonly slot: "intensity";
1792
+ readonly label: "Strength";
1793
+ readonly min: 0;
1794
+ readonly max: 2.5;
1795
+ readonly step: 0.01;
1796
+ readonly default: 1;
1797
+ readonly hint: "Overall brightness of the effect before the post chain.";
1798
+ };
1799
+ readonly vibrancy: {
1800
+ readonly slot: "vibrancy";
1801
+ readonly label: "Vibrancy";
1802
+ readonly min: 0;
1803
+ readonly max: 2;
1804
+ readonly step: 0.01;
1805
+ readonly default: 1;
1806
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1807
+ };
1808
+ };
1809
+ readonly colors: {
1810
+ readonly colorA: ColorControl;
1811
+ readonly colorB: ColorControl;
1812
+ readonly colorC: ColorControl;
1813
+ };
1814
+ };
1815
+ readonly caustics: {
1816
+ readonly name: "Caustics";
1817
+ readonly tagline: "Light focused through a moving water surface";
1818
+ readonly 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.";
1819
+ readonly family: "organic";
1820
+ readonly tags: readonly ["water", "light", "pool"];
1821
+ readonly cost: "medium";
1822
+ readonly controls: {
1823
+ readonly speed: {
1824
+ readonly default: 0.6;
1825
+ readonly slot: "speed";
1826
+ readonly label: "Speed";
1827
+ readonly min: 0;
1828
+ readonly max: 3;
1829
+ readonly step: 0.01;
1830
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
1831
+ };
1832
+ readonly scale: {
1833
+ readonly default: 0.7;
1834
+ readonly slot: "scale";
1835
+ readonly label: "Scale";
1836
+ readonly min: 0.2;
1837
+ readonly max: 3;
1838
+ readonly step: 0.01;
1839
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1840
+ };
1841
+ readonly vignette: {
1842
+ readonly default: 0.3;
1843
+ readonly slot: "vignette";
1844
+ readonly label: "Vignette";
1845
+ readonly min: 0;
1846
+ readonly max: 1;
1847
+ readonly step: 0.01;
1848
+ readonly hint: "Darkening towards the edges of the frame.";
1849
+ };
1850
+ readonly warp: {
1851
+ readonly default: 0.4;
1852
+ readonly max: 1.5;
1853
+ readonly slot: "warp";
1854
+ readonly label: "Warp";
1855
+ readonly min: 0;
1856
+ readonly step: 0.01;
1857
+ readonly hint: "How far the field is pushed around before it is sampled.";
1858
+ };
1859
+ readonly sharpness: {
1860
+ readonly slot: "a";
1861
+ readonly label: "Sharpness";
1862
+ readonly min: 0;
1863
+ readonly max: 1;
1864
+ readonly step: 0.01;
1865
+ readonly default: 0.45;
1866
+ readonly hint: "How tightly the light focuses. Low is a glow, high is a web.";
1867
+ };
1868
+ readonly dispersion: {
1869
+ readonly slot: "b";
1870
+ readonly label: "Dispersion";
1871
+ readonly min: 0;
1872
+ readonly max: 2;
1873
+ readonly step: 0.01;
1874
+ readonly default: 0.6;
1875
+ readonly hint: "Split between the red and blue focal depths.";
1876
+ };
1877
+ readonly falloff: {
1878
+ readonly slot: "c";
1879
+ readonly label: "Falloff";
1880
+ readonly min: 0.2;
1881
+ readonly max: 3;
1882
+ readonly step: 0.01;
1883
+ readonly default: 1;
1884
+ readonly hint: "How quickly the pool darkens towards the edges.";
1885
+ };
1886
+ readonly intensity: {
1887
+ readonly slot: "intensity";
1888
+ readonly label: "Strength";
1889
+ readonly min: 0;
1890
+ readonly max: 2.5;
1891
+ readonly step: 0.01;
1892
+ readonly default: 1;
1893
+ readonly hint: "Overall brightness of the effect before the post chain.";
1894
+ };
1895
+ readonly vibrancy: {
1896
+ readonly slot: "vibrancy";
1897
+ readonly label: "Vibrancy";
1898
+ readonly min: 0;
1899
+ readonly max: 2;
1900
+ readonly step: 0.01;
1901
+ readonly default: 1;
1902
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
1903
+ };
1904
+ readonly grain: {
1905
+ readonly slot: "grain";
1906
+ readonly label: "Grain";
1907
+ readonly min: 0;
1908
+ readonly max: 0.35;
1909
+ readonly step: 0.005;
1910
+ readonly default: 0.03;
1911
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1912
+ };
1913
+ };
1914
+ readonly colors: {
1915
+ readonly colorA: ColorControl;
1916
+ readonly colorB: ColorControl;
1917
+ readonly colorC: ColorControl;
1918
+ };
1919
+ };
1920
+ };
1921
+ export type ShaderRegistry = typeof shaderRegistry;
1922
+ export type ShaderName = keyof ShaderRegistry;
1923
+ export declare const shaderNames: ShaderName[];
1924
+ export declare function getShader<K extends ShaderName>(name: K): ShaderRegistry[K];
1925
+ export declare function isShaderName(value: string): value is ShaderName;
1926
+ /** Every control name a given shader exposes. */
1927
+ export type ControlName<K extends ShaderName> = keyof ShaderRegistry[K]["controls"];
1928
+ /** The params object a user writes in a config for shader `K`. */
1929
+ export type ShaderParams<K extends ShaderName> = Partial<Record<ControlName<K>, number> & Record<"colorA" | "colorB" | "colorC", string>>;
1930
+ //# sourceMappingURL=registry.d.ts.map