@paper-design/shaders 0.0.32 → 0.0.33

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 (76) hide show
  1. package/dist/get-shader-color-from-string.js +93 -0
  2. package/dist/get-shader-color-from-string.js.map +7 -0
  3. package/dist/get-shader-noise-texture.js +23 -0
  4. package/dist/get-shader-noise-texture.js.map +7 -0
  5. package/dist/index.d.ts +25 -23
  6. package/dist/index.js +118 -0
  7. package/dist/index.js.map +7 -0
  8. package/dist/shader-color-spaces.js +96 -0
  9. package/dist/shader-color-spaces.js.map +7 -0
  10. package/dist/shader-mount.js +582 -0
  11. package/dist/shader-mount.js.map +7 -0
  12. package/dist/shader-sizing.js +193 -0
  13. package/dist/shader-sizing.js.map +7 -0
  14. package/dist/shader-utils.d.ts +1 -0
  15. package/dist/shader-utils.js +74 -0
  16. package/dist/shader-utils.js.map +7 -0
  17. package/dist/shaders/color-panels.d.ts +47 -0
  18. package/dist/shaders/color-panels.js +210 -0
  19. package/dist/shaders/color-panels.js.map +7 -0
  20. package/dist/shaders/dithering.d.ts +24 -29
  21. package/dist/shaders/dithering.js +221 -0
  22. package/dist/shaders/dithering.js.map +7 -0
  23. package/dist/shaders/dot-grid.d.ts +16 -14
  24. package/dist/shaders/dot-grid.js +108 -0
  25. package/dist/shaders/dot-grid.js.map +7 -0
  26. package/dist/shaders/dot-orbit.d.ts +14 -13
  27. package/dist/shaders/dot-orbit.js +124 -0
  28. package/dist/shaders/dot-orbit.js.map +7 -0
  29. package/dist/shaders/god-rays.d.ts +18 -19
  30. package/dist/shaders/god-rays.js +118 -0
  31. package/dist/shaders/god-rays.js.map +7 -0
  32. package/dist/shaders/grain-gradient.d.ts +24 -4
  33. package/dist/shaders/grain-gradient.js +226 -0
  34. package/dist/shaders/grain-gradient.js.map +7 -0
  35. package/dist/shaders/liquid-metal.d.ts +44 -12
  36. package/dist/shaders/liquid-metal.js +221 -0
  37. package/dist/shaders/liquid-metal.js.map +7 -0
  38. package/dist/shaders/mesh-gradient.d.ts +10 -10
  39. package/dist/shaders/mesh-gradient.js +97 -0
  40. package/dist/shaders/mesh-gradient.js.map +7 -0
  41. package/dist/shaders/metaballs.d.ts +13 -10
  42. package/dist/shaders/metaballs.js +110 -0
  43. package/dist/shaders/metaballs.js.map +7 -0
  44. package/dist/shaders/neuro-noise.d.ts +13 -9
  45. package/dist/shaders/neuro-noise.js +81 -0
  46. package/dist/shaders/neuro-noise.js.map +7 -0
  47. package/dist/shaders/perlin-noise.d.ts +15 -19
  48. package/dist/shaders/perlin-noise.js +201 -0
  49. package/dist/shaders/perlin-noise.js.map +7 -0
  50. package/dist/shaders/pulsing-border.d.ts +17 -18
  51. package/dist/shaders/pulsing-border.js +211 -0
  52. package/dist/shaders/pulsing-border.js.map +7 -0
  53. package/dist/shaders/simplex-noise.d.ts +10 -12
  54. package/dist/shaders/simplex-noise.js +103 -0
  55. package/dist/shaders/simplex-noise.js.map +7 -0
  56. package/dist/shaders/smoke-ring.d.ts +11 -14
  57. package/dist/shaders/smoke-ring.js +124 -0
  58. package/dist/shaders/smoke-ring.js.map +7 -0
  59. package/dist/shaders/spiral.d.ts +16 -22
  60. package/dist/shaders/spiral.js +84 -0
  61. package/dist/shaders/spiral.js.map +7 -0
  62. package/dist/shaders/swirl.d.ts +15 -3
  63. package/dist/shaders/swirl.js +89 -0
  64. package/dist/shaders/swirl.js.map +7 -0
  65. package/dist/shaders/voronoi.d.ts +20 -20
  66. package/dist/shaders/voronoi.js +143 -0
  67. package/dist/shaders/voronoi.js.map +7 -0
  68. package/dist/shaders/warp.d.ts +15 -17
  69. package/dist/shaders/warp.js +108 -0
  70. package/dist/shaders/warp.js.map +7 -0
  71. package/dist/shaders/waves.d.ts +18 -21
  72. package/dist/shaders/waves.js +68 -0
  73. package/dist/shaders/waves.js.map +7 -0
  74. package/dist/types.js +6 -0
  75. package/dist/types.js.map +7 -0
  76. package/package.json +2 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/dot-grid.ts"],
4
+ "sourcesContent": ["import { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareSimplexNoise } from '../shader-utils.js';\n\n/**\n * Static grid pattern\n *\n * Uniforms:\n * - u_colorBack, u_colorFill, u_colorStroke (vec4 RGBA)\n * - u_dotSize (px): base shape size\n * - u_sizeRange (0..1): randomizes the size of shape between 0 and u_dotSize\n * - u_strokeWidth (px): the stroke (to be added to u_dotSize)\n * - u_gapX, u_gapY (px): pattern spacing\n * - u_opacityRange (0..1): variety of shape opacity\n * - u_shape (float used as integer):\n * ---- 1: circle\n * ---- 2: square\n * ---- 3: triangle\n * ---- 4: diamond\n * ---- 5: cross\n *\n */\n\nexport const dotGridFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorFill;\nuniform vec4 u_colorStroke;\nuniform float u_dotSize;\nuniform float u_gapX;\nuniform float u_gapY;\nuniform float u_strokeWidth;\nuniform float u_sizeRange;\nuniform float u_opacityRange;\nuniform float u_shape;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareSimplexNoise}\n\nfloat polygon(vec2 p, float N, float rot) {\n float a = atan(p.x, p.y) + rot;\n float r = TWO_PI / float(N);\n\n return cos(floor(.5 + a / r) * r - a) * length(p);\n}\n\nvoid main() {\n\n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n\n vec2 grid = fract(shape_uv / vec2(u_gapX, u_gapY)) + 1e-4;\n vec2 grid_idx = floor(shape_uv / vec2(u_gapX, u_gapY));\n float sizeRandomizer = .5 + .8 * snoise(2. * vec2(grid_idx.x * 100., grid_idx.y));\n float opacity_randomizer = .5 + .7 * snoise(2. * vec2(grid_idx.y, grid_idx.x));\n\n vec2 center = vec2(0.5) - 1e-3;\n vec2 p = (grid - center) * vec2(u_gapX, u_gapY);\n\n float baseSize = u_dotSize * (1. - sizeRandomizer * u_sizeRange);\n float strokeWidth = u_strokeWidth * (1. - sizeRandomizer * u_sizeRange);\n\n float dist;\n if (u_shape < 0.5) {\n // Circle\n dist = length(p);\n } else if (u_shape < 1.5) {\n // Diamond\n strokeWidth *= 1.5;\n dist = polygon(1.5 * p, 4., .25 * PI);\n } else if (u_shape < 2.5) {\n // Square\n dist = polygon(1.03 * p, 4., 1e-3);\n } else {\n // Triangle\n strokeWidth *= 1.5;\n p = p * 2. - 1.;\n p *= .9;\n p.y = 1. - p.y;\n p.y -= .75 * baseSize;\n dist = polygon(p, 3., 1e-3);\n }\n\n float edgeWidth = fwidth(dist);\n float shapeOuter = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist - strokeWidth);\n float shapeInner = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist);\n float stroke = shapeOuter - shapeInner;\n\n float dotOpacity = max(0., 1. - opacity_randomizer * u_opacityRange);\n stroke *= dotOpacity;\n shapeInner *= dotOpacity;\n\n stroke *= u_colorStroke.a;\n shapeInner *= u_colorFill.a;\n\n vec3 color = vec3(0.);\n color += stroke * u_colorStroke.rgb;\n color += shapeInner * u_colorFill.rgb;\n color += (1. - shapeInner - stroke) * u_colorBack.rgb * u_colorBack.a;\n\n float opacity = 0.;\n opacity += stroke;\n opacity += shapeInner;\n opacity += (1. - opacity) * u_colorBack.a;\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotGridUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colorFill: [number, number, number, number];\n u_colorStroke: [number, number, number, number];\n u_dotSize: number;\n u_gapX: number;\n u_gapY: number;\n u_strokeWidth: number;\n u_sizeRange: number;\n u_opacityRange: number;\n u_shape: (typeof DotGridShapes)[DotGridShape];\n}\n\nexport interface DotGridParams extends ShaderSizingParams {\n colorBack?: string;\n colorFill?: string;\n colorStroke?: string;\n size?: number;\n gapX?: number;\n gapY?: number;\n strokeWidth?: number;\n sizeRange?: number;\n opacityRange?: number;\n shape?: DotGridShape;\n}\n\nexport const DotGridShapes = {\n circle: 0,\n diamond: 1,\n square: 2,\n triangle: 3,\n} as const;\n\nexport type DotGridShape = keyof typeof DotGridShapes;\n"],
5
+ "mappings": ";;;;;AAAA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,2BAA2B;AAqBxC,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc3C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkGd,MAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;",
6
+ "names": []
7
+ }
@@ -1,24 +1,24 @@
1
- import type { vec4 } from '../types';
2
- import type { ShaderMotionParams } from '../shader-mount';
3
- import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
1
+ import type { vec4 } from '../types.js';
2
+ import type { ShaderMotionParams } from '../shader-mount.js';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
4
4
  export declare const dotOrbitMeta: {
5
5
  readonly maxColorCount: 10;
6
6
  };
7
7
  /**
8
- * Dot Pattern with dot moving around their grid position
9
- * The artwork by Ksenia Kondrashova
10
- * Renders a dot pattern with dot placed in the center of each cell of animated Voronoi diagram
8
+ * Animated dot pattern with dots orbiting around their grid positions
9
+ *
10
+ * Uniforms:
11
+ * - u_colorBack (RGBA)
12
+ * - u_colors (vec4[]), u_colorsCount (float used as integer)
13
+ * - u_stepsPerColor: discrete color steps between u_colors
14
+ * - u_size (0..1): dot radius (relative to cell size)
15
+ * - u_sizeRange (0..1): randomizes dot radius between 0 and u_size
16
+ * - u_spreading (0..1): max orbit distance of each dot around the cell center
11
17
  *
12
- * Uniforms include:
13
- * - u_colors (vec4[]): Input RGBA colors
14
- * - u_colorsCount (float): Number of active colors (`u_colors` length)
15
- * - u_stepsPerColor (float): Discretization of the color transition
16
- * - u_size (float, 0 .. 1): Base dot radius (relative to cell size)
17
- * - u_sizeRange (float, 0 .. 1): Dot radius to vary between the cells
18
- * - u_spreading (float, 0 .. 1): the distance each dot can move around the regular grid
19
18
  */
20
19
  export declare const dotOrbitFragmentShader: string;
21
20
  export interface DotOrbitUniforms extends ShaderSizingUniforms {
21
+ u_colorBack: [number, number, number, number];
22
22
  u_colors: vec4[];
23
23
  u_colorsCount: number;
24
24
  u_size: number;
@@ -27,6 +27,7 @@ export interface DotOrbitUniforms extends ShaderSizingUniforms {
27
27
  u_stepsPerColor: number;
28
28
  }
29
29
  export interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {
30
+ colorBack?: string;
30
31
  colors?: string[];
31
32
  size?: number;
32
33
  sizeRange?: number;
@@ -0,0 +1,124 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing.js";
7
+ import { declarePI, declareRandom, declareRotate } from "../shader-utils.js";
8
+ const dotOrbitMeta = {
9
+ maxColorCount: 10
10
+ };
11
+ const dotOrbitFragmentShader = `#version 300 es
12
+ precision mediump float;
13
+
14
+ uniform float u_time;
15
+
16
+ uniform vec4 u_colorBack;
17
+ uniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];
18
+ uniform float u_colorsCount;
19
+ uniform float u_stepsPerColor;
20
+ uniform float u_size;
21
+ uniform float u_sizeRange;
22
+ uniform float u_spreading;
23
+
24
+ ${sizingVariablesDeclaration}
25
+
26
+ out vec4 fragColor;
27
+
28
+ ${declarePI}
29
+ ${declareRandom}
30
+ ${declareRotate}
31
+
32
+ vec2 random2(vec2 p) {
33
+ return vec2(random(p), random(200. * p));
34
+ }
35
+
36
+ vec3 voronoiShape(vec2 uv, float time) {
37
+ vec2 i_uv = floor(uv);
38
+ vec2 f_uv = fract(uv);
39
+
40
+ float spreading = .25 * clamp(u_spreading, 0., 1.);
41
+
42
+ float minDist = 1.;
43
+ vec2 randomizer = vec2(0.);
44
+ for (int y = -1; y <= 1; y++) {
45
+ for (int x = -1; x <= 1; x++) {
46
+ vec2 tileOffset = vec2(float(x), float(y));
47
+ vec2 rand = random2(i_uv + tileOffset);
48
+ vec2 cellCenter = vec2(.5 + 1e-4);
49
+ cellCenter += spreading * cos(time + TWO_PI * rand);
50
+ cellCenter -= .5;
51
+ cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);
52
+ cellCenter += .5;
53
+ float dist = length(tileOffset + cellCenter - f_uv);
54
+ if (dist < minDist) {
55
+ minDist = dist;
56
+ randomizer = rand;
57
+ }
58
+ minDist = min(minDist, dist);
59
+ }
60
+ }
61
+
62
+ return vec3(minDist, randomizer);
63
+ }
64
+
65
+ void main() {
66
+
67
+ vec2 shape_uv = v_patternUV;
68
+ shape_uv += .5;
69
+ shape_uv *= .015;
70
+
71
+ float t = u_time;
72
+
73
+ vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;
74
+
75
+ float radius = .25 * clamp(u_size, 0., 1.) - .5 * clamp(u_sizeRange, 0., 1.) * voronoi[2];
76
+ float dist = voronoi[0];
77
+ float edgeWidth = fwidth(dist);
78
+ float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);
79
+
80
+ float shape = voronoi[1];
81
+
82
+ float mixer = shape * (u_colorsCount - 1.);
83
+ mixer = (shape - .5 / u_colorsCount) * u_colorsCount;
84
+ float steps = max(1., u_stepsPerColor);
85
+
86
+ vec4 gradient = u_colors[0];
87
+ gradient.rgb *= gradient.a;
88
+ for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {
89
+ if (i >= int(u_colorsCount)) break;
90
+ float localT = clamp(mixer - float(i - 1), 0.0, 1.0);
91
+ localT = round(localT * steps) / steps;
92
+ vec4 c = u_colors[i];
93
+ c.rgb *= c.a;
94
+ gradient = mix(gradient, c, localT);
95
+ }
96
+
97
+ if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {
98
+ float localT = mixer + 1.;
99
+ if (mixer > (u_colorsCount - 1.)) {
100
+ localT = mixer - (u_colorsCount - 1.);
101
+ }
102
+ localT = round(localT * steps) / steps;
103
+ vec4 cFst = u_colors[0];
104
+ cFst.rgb *= cFst.a;
105
+ vec4 cLast = u_colors[int(u_colorsCount - 1.)];
106
+ cLast.rgb *= cLast.a;
107
+ gradient = mix(cLast, cFst, localT);
108
+ }
109
+
110
+ vec3 color = gradient.rgb * dots;
111
+ float opacity = gradient.a * dots;
112
+
113
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
114
+ color = color + bgColor * (1. - opacity);
115
+ opacity = opacity + u_colorBack.a * (1. - opacity);
116
+
117
+ fragColor = vec4(color, opacity);
118
+ }
119
+ `;
120
+ export {
121
+ dotOrbitFragmentShader,
122
+ dotOrbitMeta
123
+ };
124
+ //# sourceMappingURL=dot-orbit.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/dot-orbit.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareRandom, declareRotate } from '../shader-utils.js';\n\nexport const dotOrbitMeta = {\n maxColorCount: 10,\n} as const;\n\n/**\n * Animated dot pattern with dots orbiting around their grid positions\n *\n * Uniforms:\n * - u_colorBack (RGBA)\n * - u_colors (vec4[]), u_colorsCount (float used as integer)\n * - u_stepsPerColor: discrete color steps between u_colors\n * - u_size (0..1): dot radius (relative to cell size)\n * - u_sizeRange (0..1): randomizes dot radius between 0 and u_size\n * - u_spreading (0..1): max orbit distance of each dot around the cell center\n *\n */\n\nexport const dotOrbitFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_stepsPerColor;\nuniform float u_size;\nuniform float u_sizeRange;\nuniform float u_spreading;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n\nvec2 random2(vec2 p) {\n return vec2(random(p), random(200. * p));\n}\n\nvec3 voronoiShape(vec2 uv, float time) {\n vec2 i_uv = floor(uv);\n vec2 f_uv = fract(uv);\n\n float spreading = .25 * clamp(u_spreading, 0., 1.);\n\n float minDist = 1.;\n vec2 randomizer = vec2(0.);\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 tileOffset = vec2(float(x), float(y));\n vec2 rand = random2(i_uv + tileOffset);\n vec2 cellCenter = vec2(.5 + 1e-4);\n cellCenter += spreading * cos(time + TWO_PI * rand);\n cellCenter -= .5;\n cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);\n cellCenter += .5;\n float dist = length(tileOffset + cellCenter - f_uv);\n if (dist < minDist) {\n minDist = dist;\n randomizer = rand;\n }\n minDist = min(minDist, dist);\n }\n }\n\n return vec3(minDist, randomizer);\n}\n\nvoid main() {\n\n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n shape_uv *= .015;\n\n float t = u_time;\n\n vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;\n\n float radius = .25 * clamp(u_size, 0., 1.) - .5 * clamp(u_sizeRange, 0., 1.) * voronoi[2];\n float dist = voronoi[0];\n float edgeWidth = fwidth(dist);\n float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);\n\n float shape = voronoi[1];\n\n float mixer = shape * (u_colorsCount - 1.);\n mixer = (shape - .5 / u_colorsCount) * u_colorsCount;\n float steps = max(1., u_stepsPerColor);\n\n vec4 gradient = u_colors[0];\n gradient.rgb *= gradient.a;\n for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n float localT = clamp(mixer - float(i - 1), 0.0, 1.0);\n localT = round(localT * steps) / steps;\n vec4 c = u_colors[i];\n c.rgb *= c.a;\n gradient = mix(gradient, c, localT);\n }\n\n if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {\n float localT = mixer + 1.;\n if (mixer > (u_colorsCount - 1.)) {\n localT = mixer - (u_colorsCount - 1.);\n }\n localT = round(localT * steps) / steps;\n vec4 cFst = u_colors[0];\n cFst.rgb *= cFst.a;\n vec4 cLast = u_colors[int(u_colorsCount - 1.)];\n cLast.rgb *= cLast.a;\n gradient = mix(cLast, cFst, localT);\n }\n\n vec3 color = gradient.rgb * dots;\n float opacity = gradient.a * dots;\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n color = color + bgColor * (1. - opacity);\n opacity = opacity + u_colorBack.a * (1. - opacity);\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotOrbitUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_size: number;\n u_sizeRange: number;\n u_spreading: number;\n u_stepsPerColor: number;\n}\n\nexport interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colors?: string[];\n size?: number;\n sizeRange?: number;\n spreading?: number;\n stepsPerColor?: number;\n}\n"],
5
+ "mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,qBAAqB;AAEjD,MAAM,eAAe;AAAA,EAC1B,eAAe;AACjB;AAeO,MAAM,yBAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMtB,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBA0DS,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -1,44 +1,43 @@
1
- import type { vec4 } from '../types';
2
- import type { ShaderMotionParams } from '../shader-mount';
3
- import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
1
+ import type { vec4 } from '../types.js';
2
+ import type { ShaderMotionParams } from '../shader-mount.js';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
4
4
  export declare const godRaysMeta: {
5
5
  readonly maxColorCount: 5;
6
6
  };
7
7
  /**
8
- * GodRays pattern
9
- * The artwork by Ksenia Kondrashova
10
- * Renders a number of circular shapes with gooey effect applied
8
+ * Radial rays animated from center
11
9
  *
12
- * Uniforms include:
10
+ * Uniforms:
11
+ * - u_colorBack, u_colorBloom (RGBA)
12
+ * - u_colors (vec4[]), u_colorsCount (float used as integer)
13
+ * - u_density: frequency of sector shapes
14
+ * - u_intensity: rays visibility within sectors
15
+ * - u_spotty: density of spots on the ray (higher = more spots)
16
+ * - u_midSize, u_midIntensity: central shape over the rays
17
+ * - u_bloom (0..1): normal to additive blending mix
13
18
  *
14
- * - u_colorBack: background RGBA color
15
- * - uColors (vec4[]): Input RGBA colors
16
- * - u_frequency: the frequency of rays (the number of sectors)
17
- * - u_spotty: the density of spots in the rings (higher = more spots)
18
- * - u_midSize: the size of the central shape within the rings
19
- * - u_midIntensity: the influence of the central shape on the rings
20
- * - u_density (0 .. 1): the number of visible rays
21
- * - u_blending (0 .. 1): normal / additive blending
22
19
  */
23
20
  export declare const godRaysFragmentShader: string;
24
21
  export interface GodRaysUniforms extends ShaderSizingUniforms {
25
22
  u_colorBack: [number, number, number, number];
23
+ u_colorBloom: [number, number, number, number];
26
24
  u_colors: vec4[];
27
25
  u_colorsCount: number;
28
26
  u_spotty: number;
29
27
  u_midSize: number;
30
28
  u_midIntensity: number;
31
- u_frequency: number;
32
29
  u_density: number;
33
- u_blending: number;
30
+ u_intensity: number;
31
+ u_bloom: number;
34
32
  }
35
33
  export interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {
36
34
  colorBack?: string;
35
+ colorBloom?: string;
37
36
  colors?: string[];
38
37
  spotty?: number;
39
38
  midSize?: number;
40
39
  midIntensity?: number;
41
- frequency?: number;
42
40
  density?: number;
43
- blending?: number;
41
+ intensity?: number;
42
+ bloom?: number;
44
43
  }
@@ -0,0 +1,118 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing.js";
7
+ import { declarePI, declareRandom, declareRotate, declareValueNoise, colorBandingFix } from "../shader-utils.js";
8
+ const godRaysMeta = {
9
+ maxColorCount: 5
10
+ };
11
+ const godRaysFragmentShader = `#version 300 es
12
+ precision mediump float;
13
+
14
+ uniform float u_time;
15
+
16
+ uniform vec4 u_colorBack;
17
+ uniform vec4 u_colorBloom;
18
+ uniform vec4 u_colors[${godRaysMeta.maxColorCount}];
19
+ uniform float u_colorsCount;
20
+
21
+ uniform float u_density;
22
+ uniform float u_spotty;
23
+ uniform float u_midSize;
24
+ uniform float u_midIntensity;
25
+ uniform float u_intensity;
26
+ uniform float u_bloom;
27
+
28
+ ${sizingVariablesDeclaration}
29
+
30
+ out vec4 fragColor;
31
+
32
+ ${declarePI}
33
+ ${declareRandom}
34
+ ${declareRotate}
35
+ ${declareValueNoise}
36
+
37
+ float hash(float n) {
38
+ return fract(sin(n * 43758.5453123) * 43758.5453123);
39
+ }
40
+
41
+ float raysShape(vec2 uv, float r, float freq, float intensity, float radius) {
42
+ float a = atan(uv.y, uv.x);
43
+ vec2 left = vec2(a * freq, r);
44
+ vec2 right = vec2(mod(a, TWO_PI) * freq, r);
45
+ float n_left = pow(valueNoise(left), intensity);
46
+ float n_right = pow(valueNoise(right), intensity);
47
+ float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));
48
+ return shape;
49
+ }
50
+
51
+ void main() {
52
+ vec2 shape_uv = v_objectUV;
53
+
54
+ float t = .2 * u_time;
55
+
56
+ float radius = length(shape_uv);
57
+ float spots = 5. * abs(u_spotty);
58
+
59
+ float intensity = 4. - 3. * clamp(u_intensity, 0., 1.);
60
+
61
+ float delta = 1. - smoothstep(0., 1., radius);
62
+
63
+ float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);
64
+ middleShape = pow(middleShape, 5.0);
65
+
66
+ vec3 accumColor = vec3(0.0);
67
+ float accumAlpha = 0.0;
68
+
69
+ for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {
70
+ if (i >= int(u_colorsCount)) break;
71
+
72
+ vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);
73
+
74
+ float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;
75
+ float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;
76
+ float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_density;
77
+
78
+ float ray = raysShape(rotatedUV, r1, 5.0 * f, intensity, radius);
79
+ ray *= raysShape(rotatedUV, r2, 4.0 * f, intensity, radius);
80
+ ray += (1. + 4. * ray) * middleShape;
81
+ ray = clamp(ray, 0.0, 1.0);
82
+
83
+ float srcAlpha = u_colors[i].a * ray;
84
+ vec3 srcColor = u_colors[i].rgb * srcAlpha;
85
+
86
+ vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;
87
+ float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;
88
+
89
+ vec3 addBlendColor = accumColor + srcColor;
90
+ float addBlendAlpha = accumAlpha + srcAlpha;
91
+
92
+ accumColor = mix(alphaBlendColor, addBlendColor, u_bloom);
93
+ accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_bloom);
94
+ }
95
+
96
+ float overlayAlpha = u_colorBloom.a;
97
+ vec3 overlayColor = u_colorBloom.rgb * overlayAlpha;
98
+
99
+ vec3 colorWithOverlay = accumColor + accumAlpha * overlayColor;
100
+ accumColor = mix(accumColor, colorWithOverlay, u_bloom);
101
+
102
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
103
+
104
+ vec3 color = accumColor + (1. - accumAlpha) * bgColor;
105
+ float opacity = accumAlpha + (1. - accumAlpha) * u_colorBack.a;
106
+ color = clamp(color, 0., 1.);
107
+ opacity = clamp(opacity, 0., 1.);
108
+
109
+ ${colorBandingFix}
110
+
111
+ fragColor = vec4(color, opacity);
112
+ }
113
+ `;
114
+ export {
115
+ godRaysFragmentShader,
116
+ godRaysMeta
117
+ };
118
+ //# sourceMappingURL=god-rays.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/god-rays.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareRandom, declareRotate, declareValueNoise, colorBandingFix } from '../shader-utils.js';\n\nexport const godRaysMeta = {\n maxColorCount: 5,\n} as const;\n\n/**\n * Radial rays animated from center\n *\n * Uniforms:\n * - u_colorBack, u_colorBloom (RGBA)\n * - u_colors (vec4[]), u_colorsCount (float used as integer)\n * - u_density: frequency of sector shapes\n * - u_intensity: rays visibility within sectors\n * - u_spotty: density of spots on the ray (higher = more spots)\n * - u_midSize, u_midIntensity: central shape over the rays\n * - u_bloom (0..1): normal to additive blending mix\n *\n */\n\nexport const godRaysFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorBloom;\nuniform vec4 u_colors[${godRaysMeta.maxColorCount}];\nuniform float u_colorsCount;\n\nuniform float u_density;\nuniform float u_spotty;\nuniform float u_midSize;\nuniform float u_midIntensity;\nuniform float u_intensity;\nuniform float u_bloom;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n${declareValueNoise}\n\nfloat hash(float n) {\n return fract(sin(n * 43758.5453123) * 43758.5453123);\n}\n\nfloat raysShape(vec2 uv, float r, float freq, float intensity, float radius) {\n float a = atan(uv.y, uv.x);\n vec2 left = vec2(a * freq, r);\n vec2 right = vec2(mod(a, TWO_PI) * freq, r);\n float n_left = pow(valueNoise(left), intensity);\n float n_right = pow(valueNoise(right), intensity);\n float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));\n return shape;\n}\n\nvoid main() {\n vec2 shape_uv = v_objectUV;\n\n float t = .2 * u_time;\n\n float radius = length(shape_uv);\n float spots = 5. * abs(u_spotty);\n\n float intensity = 4. - 3. * clamp(u_intensity, 0., 1.);\n\n float delta = 1. - smoothstep(0., 1., radius);\n\n float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);\n middleShape = pow(middleShape, 5.0);\n\n vec3 accumColor = vec3(0.0);\n float accumAlpha = 0.0;\n\n for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n\n vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);\n\n float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;\n float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;\n float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_density;\n\n float ray = raysShape(rotatedUV, r1, 5.0 * f, intensity, radius);\n ray *= raysShape(rotatedUV, r2, 4.0 * f, intensity, radius);\n ray += (1. + 4. * ray) * middleShape;\n ray = clamp(ray, 0.0, 1.0);\n\n float srcAlpha = u_colors[i].a * ray;\n vec3 srcColor = u_colors[i].rgb * srcAlpha;\n\n vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;\n float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;\n\n vec3 addBlendColor = accumColor + srcColor;\n float addBlendAlpha = accumAlpha + srcAlpha;\n\n accumColor = mix(alphaBlendColor, addBlendColor, u_bloom);\n accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_bloom);\n }\n\n float overlayAlpha = u_colorBloom.a;\n vec3 overlayColor = u_colorBloom.rgb * overlayAlpha;\n\n vec3 colorWithOverlay = accumColor + accumAlpha * overlayColor;\n accumColor = mix(accumColor, colorWithOverlay, u_bloom);\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n\n vec3 color = accumColor + (1. - accumAlpha) * bgColor;\n float opacity = accumAlpha + (1. - accumAlpha) * u_colorBack.a;\n color = clamp(color, 0., 1.);\n opacity = clamp(opacity, 0., 1.);\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface GodRaysUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colorBloom: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_spotty: number;\n u_midSize: number;\n u_midIntensity: number;\n u_density: number;\n u_intensity: number;\n u_bloom: number;\n}\n\nexport interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colorBloom?: string;\n colors?: string[];\n spotty?: number;\n midSize?: number;\n midIntensity?: number;\n density?: number;\n intensity?: number;\n bloom?: number;\n}\n"],
5
+ "mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,eAAe,mBAAmB,uBAAuB;AAErF,MAAM,cAAc;AAAA,EACzB,eAAe;AACjB;AAgBO,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOrB,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAkCK,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwC7C,eAAe;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -1,14 +1,33 @@
1
- import type { vec4 } from '../types';
2
- import type { ShaderMotionParams } from '../shader-mount';
3
- import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
1
+ import type { vec4 } from '../types.js';
2
+ import type { ShaderMotionParams } from '../shader-mount.js';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
4
4
  export declare const grainGradientMeta: {
5
5
  readonly maxColorCount: 7;
6
6
  };
7
7
  /**
8
- * Grainy Gradient Ksenia Kondrashova
8
+ * Multi-color gradient with noise & grain over animated abstract shapes
9
+ *
10
+ * Uniforms:
11
+ * - u_colorBack (RGBA)
12
+ * - u_colors (vec4[]), u_colorsCount (float used as integer)
13
+ * - u_softness (0..1): blur between color bands
14
+ * - u_intensity (0..1): distortion between color bands
15
+ * - u_noise (0..1): grainy noise independent of softness
16
+ * - u_shape (float used as integer):
17
+ * ---- 1: single sine wave
18
+ * ---- 2: dots pattern
19
+ * ---- 3: truchet pattern
20
+ * ---- 4: corners (2 rounded rectangles)
21
+ * ---- 5: ripple
22
+ * ---- 6: blob (metaballs)
23
+ * ---- 7: circle imitating 3d look
24
+ *
25
+ * Note: grains are calculated using gl_FragCoord & u_resolution, meaning grains don't react to scaling and fit
26
+ *
9
27
  */
10
28
  export declare const grainGradientFragmentShader: string;
11
29
  export interface GrainGradientUniforms extends ShaderSizingUniforms {
30
+ u_colorBack: [number, number, number, number];
12
31
  u_colors: vec4[];
13
32
  u_colorsCount: number;
14
33
  u_softness: number;
@@ -17,6 +36,7 @@ export interface GrainGradientUniforms extends ShaderSizingUniforms {
17
36
  u_shape: (typeof GrainGradientShapes)[GrainGradientShape];
18
37
  }
19
38
  export interface GrainGradientParams extends ShaderSizingParams, ShaderMotionParams {
39
+ colorBack?: string;
20
40
  colors?: string[];
21
41
  softness?: number;
22
42
  intensity?: number;
@@ -0,0 +1,226 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing.js";
7
+ import { declareSimplexNoise, declarePI, declareRandom, declareValueNoise, colorBandingFix } from "../shader-utils.js";
8
+ const grainGradientMeta = {
9
+ maxColorCount: 7
10
+ };
11
+ const grainGradientFragmentShader = `#version 300 es
12
+ precision mediump float;
13
+
14
+ uniform float u_time;
15
+ uniform vec2 u_resolution;
16
+ uniform float u_pixelRatio;
17
+
18
+ uniform vec4 u_colorBack;
19
+ uniform vec4 u_colors[${grainGradientMeta.maxColorCount}];
20
+ uniform float u_colorsCount;
21
+ uniform float u_softness;
22
+ uniform float u_intensity;
23
+ uniform float u_noise;
24
+ uniform float u_shape;
25
+
26
+ ${sizingVariablesDeclaration}
27
+
28
+ out vec4 fragColor;
29
+
30
+ ${declarePI}
31
+ ${declareSimplexNoise}
32
+ ${declareRandom}
33
+ ${declareValueNoise}
34
+
35
+
36
+ float rand(vec2 n) {
37
+ return fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);
38
+ }
39
+ float noise(vec2 n) {
40
+ const vec2 d = vec2(0.0, 1.0);
41
+ vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n));
42
+ return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
43
+ }
44
+ float fbm_4(vec2 n) {
45
+ float total = 0.0, amplitude = .2;
46
+ for (int i = 0; i < 4; i++) {
47
+ total += noise(n) * amplitude;
48
+ n += n;
49
+ amplitude *= 0.6;
50
+ }
51
+ return total;
52
+ }
53
+
54
+
55
+ vec2 truchet(vec2 uv, float idx){
56
+ idx = fract(((idx - .5) * 2.));
57
+ if (idx > 0.75) {
58
+ uv = vec2(1.0) - uv;
59
+ } else if (idx > 0.5) {
60
+ uv = vec2(1.0 - uv.x, uv.y);
61
+ } else if (idx > 0.25) {
62
+ uv = 1.0 - vec2(1.0 - uv.x, uv.y);
63
+ }
64
+ return uv;
65
+ }
66
+
67
+ void main() {
68
+
69
+ float t = .1 * u_time;
70
+
71
+ vec2 grain_uv = (gl_FragCoord.xy - .5 * u_resolution) / u_pixelRatio;
72
+ vec2 shape_uv = v_objectUV;
73
+ if (u_shape < 3.5) {
74
+ shape_uv = v_patternUV * .005;
75
+ }
76
+
77
+
78
+ float shape = 0.;
79
+
80
+ if (u_shape < 1.5) {
81
+ // Sine wave
82
+
83
+ float wave = cos(.5 * shape_uv.x - 2. * t) * sin(1.5 * shape_uv.x + t) * (.75 + .25 * cos(3. * t));
84
+ shape = 1. - smoothstep(-1., 1., shape_uv.y + wave);
85
+
86
+ } else if (u_shape < 2.5) {
87
+ // Grid (dots)
88
+
89
+ float stripeIdx = floor(2. * shape_uv.x / TWO_PI);
90
+ float rand = fract(sin(stripeIdx * 12.9898) * 43758.5453);
91
+
92
+ float speed = sign(rand - .5) * ceil(2. + rand);
93
+ shape = sin(shape_uv.x) * cos(shape_uv.y + speed * t);
94
+ shape = pow(shape, 4.);
95
+
96
+ } else if (u_shape < 3.5) {
97
+ // Truchet pattern
98
+
99
+ float n2 = valueNoise(shape_uv * .4 - 2.5 * t);
100
+ shape_uv.x += 10.;
101
+ shape_uv *= .6;
102
+
103
+ vec2 tile = truchet(fract(shape_uv), random(floor(shape_uv)));
104
+
105
+ float distance1 = length(tile);
106
+ float distance2 = length(tile - vec2(1.));
107
+
108
+ n2 -= .5;
109
+ n2 *= .1;
110
+ shape = smoothstep(.2, .55, distance1 + n2) * smoothstep(.8, .45, distance1 - n2);
111
+ shape += smoothstep(.2, .55, distance2 + n2) * smoothstep(.8, .45, distance2 - n2);
112
+
113
+ shape = pow(shape, 1.5);
114
+
115
+ } else if (u_shape < 4.5) {
116
+ // Corners
117
+
118
+ shape_uv *= .6;
119
+ vec2 outer = vec2(.5);
120
+
121
+ vec2 bl = smoothstep(vec2(0.), outer, shape_uv + vec2(.1 + .1 * sin(2. * t), .2 - .1 * sin(3. * t)));
122
+ vec2 tr = smoothstep(vec2(0.), outer, 1. - shape_uv);
123
+ shape = 1. - bl.x * bl.y * tr.x * tr.y;
124
+
125
+ shape_uv = -shape_uv;
126
+ bl = smoothstep(vec2(0.), outer, shape_uv + vec2(.1 + .1 * sin(2. * t), .2 - .1 * cos(3. * t)));
127
+ tr = smoothstep(vec2(0.), outer, 1. - shape_uv);
128
+ shape -= bl.x * bl.y * tr.x * tr.y;
129
+
130
+ shape = 1. - smoothstep(0., 1., shape);
131
+
132
+ } else if (u_shape < 5.5) {
133
+ // Ripple
134
+
135
+ shape_uv *= 2.;
136
+ float dist = length(.4 * shape_uv);
137
+ float waves = sin(pow(dist, 1.2) * 5. - 3. * t) * .5 + .5;
138
+ shape = waves;
139
+
140
+ } else if (u_shape < 6.5) {
141
+ // Blob
142
+
143
+ t *= 2.;
144
+
145
+ vec2 f1_traj = .25 * vec2(1.3 * sin(t), .2 + 1.3 * cos(.6 * t + 4.));
146
+ vec2 f2_traj = .2 * vec2(1.2 * sin(-t), 1.3 * sin(1.6 * t));
147
+ vec2 f3_traj = .25 * vec2(1.7 * cos(-.6 * t), cos(-1.6 * t));
148
+ vec2 f4_traj = .3 * vec2(1.4 * cos(.8 * t), 1.2 * sin(-.6 * t - 3.));
149
+
150
+ shape = .5 * pow(1. - clamp(0., 1., length(shape_uv + f1_traj)), 5.);
151
+ shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f2_traj)), 5.);
152
+ shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f3_traj)), 5.);
153
+ shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f4_traj)), 5.);
154
+
155
+ shape = smoothstep(.0, .9, shape);
156
+ float edge = smoothstep(.25, .3, shape);
157
+ shape = mix(.0, shape, edge);
158
+
159
+ } else {
160
+ // Sphere
161
+
162
+ shape_uv *= 2.;
163
+ float d = length(shape_uv);
164
+ float z = sqrt(1.0 - clamp(pow(d, 2.0), 0.0, 1.0));
165
+ vec3 pos = vec3(shape_uv, z);
166
+ vec3 lightPos = normalize(vec3(cos(3. * t), 0.8, sin(2.5 * t)));
167
+ float lighting = dot(lightPos, pos);
168
+ float edge = smoothstep(1., .97, d);
169
+ shape = mix(.1, .5 + .5 * lighting, edge);
170
+ }
171
+
172
+ float snoise05 = snoise(grain_uv * .5);
173
+ float grainDist = snoise(grain_uv * .2) * snoise05 - fbm_4(.002 * grain_uv + 10.) - fbm_4(.003 * grain_uv);
174
+ float noise = clamp(.6 * snoise05 - fbm_4(.4 * grain_uv) - fbm_4(.001 * grain_uv), 0., 1.);
175
+
176
+ shape += u_intensity * 2. / u_colorsCount * (grainDist + .5);
177
+ shape += u_noise * 10. / u_colorsCount * noise;
178
+
179
+ float edge_w = fwidth(shape);
180
+
181
+ float mixer = shape * (u_colorsCount + 1.) / u_colorsCount;
182
+ vec4 gradient = u_colors[0];
183
+ gradient.rgb *= gradient.a;
184
+
185
+ for (int i = 1; i < ${grainGradientMeta.maxColorCount}; i++) {
186
+ if (i > int(u_colorsCount) - 1) break;
187
+
188
+ vec2 borders = vec2(float(i + 1) - u_softness - edge_w, float(i + 1) + u_softness + edge_w) / u_colorsCount;
189
+ float localT = smoothstep(borders[0], borders[1], mixer);
190
+ vec4 c = u_colors[i];
191
+ c.rgb *= c.a;
192
+ gradient = mix(gradient, c, localT);
193
+ }
194
+
195
+ vec2 borders = vec2(2. / (u_colorsCount - 1.));
196
+ borders = vec2(borders[0] - u_softness - edge_w, borders[1] + u_softness + edge_w) / u_colorsCount;
197
+ borders[0] = max(0., borders[0]);
198
+ float gradientShape = smoothstep(borders[0], borders[1], mixer);
199
+
200
+ vec3 color = gradient.rgb * gradientShape;
201
+ float opacity = gradient.a * gradientShape;
202
+
203
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
204
+ color = color + bgColor * (1.0 - opacity);
205
+ opacity = opacity + u_colorBack.a * (1.0 - opacity);
206
+
207
+ ${colorBandingFix}
208
+
209
+ fragColor = vec4(color, opacity);
210
+ }
211
+ `;
212
+ const GrainGradientShapes = {
213
+ wave: 1,
214
+ dots: 2,
215
+ truchet: 3,
216
+ corners: 4,
217
+ ripple: 5,
218
+ blob: 6,
219
+ sphere: 7
220
+ };
221
+ export {
222
+ GrainGradientShapes,
223
+ grainGradientFragmentShader,
224
+ grainGradientMeta
225
+ };
226
+ //# sourceMappingURL=grain-gradient.js.map