shaders-oneshot 0.0.81-shared.1

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 (129) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +7 -0
  4. package/dist/empty-pixel.d.ts +1 -0
  5. package/dist/empty-pixel.js +10 -0
  6. package/dist/empty-pixel.js.map +7 -0
  7. package/dist/get-shader-color-from-string.d.ts +3 -0
  8. package/dist/get-shader-color-from-string.js +101 -0
  9. package/dist/get-shader-color-from-string.js.map +7 -0
  10. package/dist/get-shader-color-from-string.test.d.ts +1 -0
  11. package/dist/get-shader-color-from-string.test.js +69 -0
  12. package/dist/get-shader-noise-texture.d.ts +1 -0
  13. package/dist/get-shader-noise-texture.js +18 -0
  14. package/dist/get-shader-noise-texture.js.map +7 -0
  15. package/dist/index.d.ts +68 -0
  16. package/dist/index.js +194 -0
  17. package/dist/index.js.map +7 -0
  18. package/dist/shader-color-spaces.d.ts +6 -0
  19. package/dist/shader-color-spaces.js +96 -0
  20. package/dist/shader-color-spaces.js.map +7 -0
  21. package/dist/shader-mount.d.ts +199 -0
  22. package/dist/shader-mount.js +735 -0
  23. package/dist/shader-mount.js.map +7 -0
  24. package/dist/shader-sizing.d.ts +30 -0
  25. package/dist/shader-sizing.js +38 -0
  26. package/dist/shader-sizing.js.map +7 -0
  27. package/dist/shader-utils.d.ts +10 -0
  28. package/dist/shader-utils.js +131 -0
  29. package/dist/shader-utils.js.map +7 -0
  30. package/dist/shaders/color-panels.d.ts +70 -0
  31. package/dist/shaders/color-panels.js +224 -0
  32. package/dist/shaders/color-panels.js.map +7 -0
  33. package/dist/shaders/dithering.d.ts +62 -0
  34. package/dist/shaders/dithering.js +271 -0
  35. package/dist/shaders/dithering.js.map +7 -0
  36. package/dist/shaders/dot-grid.d.ts +65 -0
  37. package/dist/shaders/dot-grid.js +110 -0
  38. package/dist/shaders/dot-grid.js.map +7 -0
  39. package/dist/shaders/dot-orbit.d.ts +57 -0
  40. package/dist/shaders/dot-orbit.js +123 -0
  41. package/dist/shaders/dot-orbit.js.map +7 -0
  42. package/dist/shaders/fluted-glass.d.ts +112 -0
  43. package/dist/shaders/fluted-glass.js +361 -0
  44. package/dist/shaders/fluted-glass.js.map +7 -0
  45. package/dist/shaders/gem-smoke.d.ts +96 -0
  46. package/dist/shaders/gem-smoke.js +573 -0
  47. package/dist/shaders/gem-smoke.js.map +7 -0
  48. package/dist/shaders/god-rays.d.ts +67 -0
  49. package/dist/shaders/god-rays.js +133 -0
  50. package/dist/shaders/god-rays.js.map +7 -0
  51. package/dist/shaders/grain-gradient.d.ts +80 -0
  52. package/dist/shaders/grain-gradient.js +301 -0
  53. package/dist/shaders/grain-gradient.js.map +7 -0
  54. package/dist/shaders/halftone-cmyk.d.ts +104 -0
  55. package/dist/shaders/halftone-cmyk.js +295 -0
  56. package/dist/shaders/halftone-cmyk.js.map +7 -0
  57. package/dist/shaders/halftone-dots.d.ts +80 -0
  58. package/dist/shaders/halftone-dots.js +321 -0
  59. package/dist/shaders/halftone-dots.js.map +7 -0
  60. package/dist/shaders/heatmap.d.ts +66 -0
  61. package/dist/shaders/heatmap.js +384 -0
  62. package/dist/shaders/heatmap.js.map +7 -0
  63. package/dist/shaders/image-dithering.d.ts +64 -0
  64. package/dist/shaders/image-dithering.js +199 -0
  65. package/dist/shaders/image-dithering.js.map +7 -0
  66. package/dist/shaders/lens-distortion.d.ts +97 -0
  67. package/dist/shaders/lens-distortion.js +276 -0
  68. package/dist/shaders/lens-distortion.js.map +7 -0
  69. package/dist/shaders/liquid-metal.d.ts +89 -0
  70. package/dist/shaders/liquid-metal.js +633 -0
  71. package/dist/shaders/liquid-metal.js.map +7 -0
  72. package/dist/shaders/mesh-gradient.d.ts +52 -0
  73. package/dist/shaders/mesh-gradient.js +131 -0
  74. package/dist/shaders/mesh-gradient.js.map +7 -0
  75. package/dist/shaders/metaballs.d.ts +51 -0
  76. package/dist/shaders/metaballs.js +111 -0
  77. package/dist/shaders/metaballs.js.map +7 -0
  78. package/dist/shaders/neuro-noise.d.ts +47 -0
  79. package/dist/shaders/neuro-noise.js +77 -0
  80. package/dist/shaders/neuro-noise.js.map +7 -0
  81. package/dist/shaders/paper-texture.d.ts +109 -0
  82. package/dist/shaders/paper-texture.js +527 -0
  83. package/dist/shaders/paper-texture.js.map +7 -0
  84. package/dist/shaders/perlin-noise.d.ts +52 -0
  85. package/dist/shaders/perlin-noise.js +167 -0
  86. package/dist/shaders/perlin-noise.js.map +7 -0
  87. package/dist/shaders/pulsing-border.d.ts +98 -0
  88. package/dist/shaders/pulsing-border.js +239 -0
  89. package/dist/shaders/pulsing-border.js.map +7 -0
  90. package/dist/shaders/simplex-noise.d.ts +45 -0
  91. package/dist/shaders/simplex-noise.js +92 -0
  92. package/dist/shaders/simplex-noise.js.map +7 -0
  93. package/dist/shaders/smoke-ring.d.ts +61 -0
  94. package/dist/shaders/smoke-ring.js +133 -0
  95. package/dist/shaders/smoke-ring.js.map +7 -0
  96. package/dist/shaders/spiral.d.ts +61 -0
  97. package/dist/shaders/spiral.js +83 -0
  98. package/dist/shaders/spiral.js.map +7 -0
  99. package/dist/shaders/static-mesh-gradient.d.ts +63 -0
  100. package/dist/shaders/static-mesh-gradient.js +131 -0
  101. package/dist/shaders/static-mesh-gradient.js.map +7 -0
  102. package/dist/shaders/static-radial-gradient.d.ts +72 -0
  103. package/dist/shaders/static-radial-gradient.js +188 -0
  104. package/dist/shaders/static-radial-gradient.js.map +7 -0
  105. package/dist/shaders/swirl.d.ts +63 -0
  106. package/dist/shaders/swirl.js +104 -0
  107. package/dist/shaders/swirl.js.map +7 -0
  108. package/dist/shaders/voronoi.d.ts +65 -0
  109. package/dist/shaders/voronoi.js +139 -0
  110. package/dist/shaders/voronoi.js.map +7 -0
  111. package/dist/shaders/warp.d.ts +70 -0
  112. package/dist/shaders/warp.js +130 -0
  113. package/dist/shaders/warp.js.map +7 -0
  114. package/dist/shaders/water.d.ts +59 -0
  115. package/dist/shaders/water.js +122 -0
  116. package/dist/shaders/water.js.map +7 -0
  117. package/dist/shaders/waves.d.ts +53 -0
  118. package/dist/shaders/waves.js +66 -0
  119. package/dist/shaders/waves.js.map +7 -0
  120. package/dist/shared-webgl-renderer.d.ts +63 -0
  121. package/dist/shared-webgl-renderer.js +262 -0
  122. package/dist/shared-webgl-renderer.js.map +7 -0
  123. package/dist/types.d.ts +3 -0
  124. package/dist/types.js +6 -0
  125. package/dist/types.js.map +7 -0
  126. package/dist/vertex-shader.d.ts +2 -0
  127. package/dist/vertex-shader.js +160 -0
  128. package/dist/vertex-shader.js.map +7 -0
  129. package/package.json +29 -0
@@ -0,0 +1,131 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import {
7
+ } from "../shader-sizing.js";
8
+ import { declarePI, rotation2, proceduralHash21 } from "../shader-utils.js";
9
+ const staticMeshGradientMeta = {
10
+ maxColorCount: 10
11
+ };
12
+ const staticMeshGradientFragmentShader = `#version 300 es
13
+ precision mediump float;
14
+
15
+ uniform vec4 u_colors[${staticMeshGradientMeta.maxColorCount}];
16
+ uniform float u_colorsCount;
17
+
18
+ uniform float u_positions;
19
+ uniform float u_waveX;
20
+ uniform float u_waveXShift;
21
+ uniform float u_waveY;
22
+ uniform float u_waveYShift;
23
+ uniform float u_mixing;
24
+ uniform float u_grainMixer;
25
+ uniform float u_grainOverlay;
26
+
27
+ in vec2 v_objectUV;
28
+ out vec4 fragColor;
29
+
30
+ ${declarePI}
31
+ ${rotation2}
32
+ ${proceduralHash21}
33
+
34
+ float valueNoise(vec2 st) {
35
+ vec2 i = floor(st);
36
+ vec2 f = fract(st);
37
+ float a = hash21(i);
38
+ float b = hash21(i + vec2(1.0, 0.0));
39
+ float c = hash21(i + vec2(0.0, 1.0));
40
+ float d = hash21(i + vec2(1.0, 1.0));
41
+ vec2 u = f * f * (3.0 - 2.0 * f);
42
+ float x1 = mix(a, b, u.x);
43
+ float x2 = mix(c, d, u.x);
44
+ return mix(x1, x2, u.y);
45
+ }
46
+
47
+ float noise(vec2 n, vec2 seedOffset) {
48
+ return valueNoise(n + seedOffset);
49
+ }
50
+
51
+ vec2 getPosition(int i, float t) {
52
+ float a = float(i) * .37;
53
+ float b = .6 + mod(float(i), 3.) * .3;
54
+ float c = .8 + mod(float(i + 1), 4.) * 0.25;
55
+
56
+ float x = sin(t * b + a);
57
+ float y = cos(t * c + a * 1.5);
58
+
59
+ return .5 + .5 * vec2(x, y);
60
+ }
61
+
62
+ void main() {
63
+ vec2 uv = v_objectUV;
64
+ uv += .5;
65
+ vec2 grainUV = uv * 1000.;
66
+
67
+ float mixerGrain = 0.;
68
+ if (u_grainMixer > 0.) {
69
+ mixerGrain = .4 * u_grainMixer * (noise(grainUV, vec2(0.)) - .5);
70
+ }
71
+
72
+ float radius = smoothstep(0., 1., length(uv - .5));
73
+ float center = 1. - radius;
74
+ for (float i = 1.; i <= 2.; i++) {
75
+ uv.x += u_waveX * center / i * cos(TWO_PI * u_waveXShift + i * 2. * smoothstep(.0, 1., uv.y));
76
+ uv.y += u_waveY * center / i * cos(TWO_PI * u_waveYShift + i * 2. * smoothstep(.0, 1., uv.x));
77
+ }
78
+
79
+ vec3 color = vec3(0.);
80
+ float opacity = 0.;
81
+ float totalWeight = 0.;
82
+ float positionSeed = 25. + .33 * u_positions;
83
+
84
+ for (int i = 0; i < ${staticMeshGradientMeta.maxColorCount}; i++) {
85
+ if (i >= int(u_colorsCount)) break;
86
+
87
+ vec2 pos = getPosition(i, positionSeed) + mixerGrain;
88
+ float dist = length(uv - pos);
89
+
90
+ vec3 colorFraction = u_colors[i].rgb * u_colors[i].a;
91
+ float opacityFraction = u_colors[i].a;
92
+
93
+ float mixing = pow(u_mixing, .7);
94
+ float power = mix(2., 1., mixing);
95
+ dist = pow(dist, power);
96
+
97
+ float w = 1. / (dist + 1e-3);
98
+ float baseSharpness = mix(.0, 8., clamp(w, 0., 1.));
99
+ float sharpness = mix(baseSharpness, 1., mixing);
100
+ w = pow(w, sharpness);
101
+ color += colorFraction * w;
102
+ opacity += opacityFraction * w;
103
+ totalWeight += w;
104
+ }
105
+
106
+ color /= max(1e-4, totalWeight);
107
+ opacity /= max(1e-4, totalWeight);
108
+
109
+ if (u_grainOverlay > 0.) {
110
+ float grainOverlay = valueNoise(rotate(grainUV, 1.) + vec2(3.));
111
+ grainOverlay = mix(grainOverlay, valueNoise(rotate(grainUV, 2.) + vec2(-1.)), .5);
112
+ grainOverlay = pow(grainOverlay, 1.3);
113
+
114
+ float grainOverlayV = grainOverlay * 2. - 1.;
115
+ vec3 grainOverlayColor = vec3(step(0., grainOverlayV));
116
+ float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);
117
+ grainOverlayStrength = pow(grainOverlayStrength, .8);
118
+ color = mix(color, grainOverlayColor, .35 * grainOverlayStrength);
119
+
120
+ opacity += .5 * grainOverlayStrength;
121
+ }
122
+ opacity = clamp(opacity, 0., 1.);
123
+
124
+ fragColor = vec4(color, opacity);
125
+ }
126
+ `;
127
+ export {
128
+ staticMeshGradientFragmentShader,
129
+ staticMeshGradientMeta
130
+ };
131
+ //# sourceMappingURL=static-mesh-gradient.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/static-mesh-gradient.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types.js';\r\nimport type { ShaderMotionParams } from '../shader-mount.js';\r\nimport {\r\n type ShaderSizingParams,\r\n type ShaderSizingUniforms,\r\n} from '../shader-sizing.js';\r\nimport { declarePI, rotation2, proceduralHash21 } from '../shader-utils.js';\r\n\r\nexport const staticMeshGradientMeta = {\r\n maxColorCount: 10,\r\n} as const;\r\n\r\n/**\r\n * Multi-point mesh gradient with up to 10 color spots, enhanced by two-direction warping,\r\n * adjustable blend sharpness, and grain controls.\r\n *\r\n * Fragment shader uniforms:\r\n * - u_colors (vec4[]): Up to 10 gradient colors in RGBA\r\n * - u_colorsCount (float): Number of active colors\r\n * - u_positions (float): Color spots placement seed (0 to 100)\r\n * - u_waveX (float): Strength of sine wave distortion along X axis (0 to 1)\r\n * - u_waveXShift (float): Phase offset applied to the X-axis wave, needs waveX > 0 (0 to 1)\r\n * - u_waveY (float): Strength of sine wave distortion along Y axis (0 to 1)\r\n * - u_waveYShift (float): Phase offset applied to the Y-axis wave, needs waveY > 0 (0 to 1)\r\n * - u_mixing (float): Blending behavior, 0 = hard stripes, 0.5 = smooth, 1 = gradual blend (0 to 1)\r\n * - u_grainMixer (float): Strength of grain distortion applied to shape edges (0 to 1)\r\n * - u_grainOverlay (float): Post-processing black/white grain overlay (0 to 1)\r\n *\r\n * Vertex shader outputs (used in fragment shader):\r\n * - v_objectUV (vec2): Object box UV coordinates with global sizing (scale, rotation, offsets, etc) applied\r\n *\r\n * Vertex shader uniforms:\r\n * - u_resolution (vec2): Canvas resolution in pixels\r\n * - u_pixelRatio (float): Device pixel ratio\r\n * - u_originX (float): Reference point for positioning world width in the canvas (0 to 1)\r\n * - u_originY (float): Reference point for positioning world height in the canvas (0 to 1)\r\n * - u_worldWidth (float): Virtual width of the graphic before it's scaled to fit the canvas\r\n * - u_worldHeight (float): Virtual height of the graphic before it's scaled to fit the canvas\r\n * - u_fit (float): How to fit the rendered shader into the canvas dimensions (0 = none, 1 = contain, 2 = cover)\r\n * - u_scale (float): Overall zoom level of the graphics (0.01 to 4)\r\n * - u_rotation (float): Overall rotation angle of the graphics in degrees (0 to 360)\r\n * - u_offsetX (float): Horizontal offset of the graphics center (-1 to 1)\r\n * - u_offsetY (float): Vertical offset of the graphics center (-1 to 1)\r\n *\r\n */\r\n\r\n// language=GLSL\r\nexport const staticMeshGradientFragmentShader: string = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform vec4 u_colors[${ staticMeshGradientMeta.maxColorCount }];\r\nuniform float u_colorsCount;\r\n\r\nuniform float u_positions;\r\nuniform float u_waveX;\r\nuniform float u_waveXShift;\r\nuniform float u_waveY;\r\nuniform float u_waveYShift;\r\nuniform float u_mixing;\r\nuniform float u_grainMixer;\r\nuniform float u_grainOverlay;\r\n\r\nin vec2 v_objectUV;\r\nout vec4 fragColor;\r\n\r\n${ declarePI }\r\n${ rotation2 }\r\n${ proceduralHash21 }\r\n\r\nfloat valueNoise(vec2 st) {\r\n vec2 i = floor(st);\r\n vec2 f = fract(st);\r\n float a = hash21(i);\r\n float b = hash21(i + vec2(1.0, 0.0));\r\n float c = hash21(i + vec2(0.0, 1.0));\r\n float d = hash21(i + vec2(1.0, 1.0));\r\n vec2 u = f * f * (3.0 - 2.0 * f);\r\n float x1 = mix(a, b, u.x);\r\n float x2 = mix(c, d, u.x);\r\n return mix(x1, x2, u.y);\r\n}\r\n\r\nfloat noise(vec2 n, vec2 seedOffset) {\r\n return valueNoise(n + seedOffset);\r\n}\r\n\r\nvec2 getPosition(int i, float t) {\r\n float a = float(i) * .37;\r\n float b = .6 + mod(float(i), 3.) * .3;\r\n float c = .8 + mod(float(i + 1), 4.) * 0.25;\r\n\r\n float x = sin(t * b + a);\r\n float y = cos(t * c + a * 1.5);\r\n\r\n return .5 + .5 * vec2(x, y);\r\n}\r\n\r\nvoid main() {\r\n vec2 uv = v_objectUV;\r\n uv += .5;\r\n vec2 grainUV = uv * 1000.;\r\n\r\n float mixerGrain = 0.;\r\n if (u_grainMixer > 0.) {\r\n mixerGrain = .4 * u_grainMixer * (noise(grainUV, vec2(0.)) - .5);\r\n }\r\n\r\n float radius = smoothstep(0., 1., length(uv - .5));\r\n float center = 1. - radius;\r\n for (float i = 1.; i <= 2.; i++) {\r\n uv.x += u_waveX * center / i * cos(TWO_PI * u_waveXShift + i * 2. * smoothstep(.0, 1., uv.y));\r\n uv.y += u_waveY * center / i * cos(TWO_PI * u_waveYShift + i * 2. * smoothstep(.0, 1., uv.x));\r\n }\r\n\r\n vec3 color = vec3(0.);\r\n float opacity = 0.;\r\n float totalWeight = 0.;\r\n float positionSeed = 25. + .33 * u_positions;\r\n\r\n for (int i = 0; i < ${ staticMeshGradientMeta.maxColorCount }; i++) {\r\n if (i >= int(u_colorsCount)) break;\r\n\r\n vec2 pos = getPosition(i, positionSeed) + mixerGrain;\r\n float dist = length(uv - pos);\r\n\r\n vec3 colorFraction = u_colors[i].rgb * u_colors[i].a;\r\n float opacityFraction = u_colors[i].a;\r\n\r\n float mixing = pow(u_mixing, .7);\r\n float power = mix(2., 1., mixing);\r\n dist = pow(dist, power);\r\n\r\n float w = 1. / (dist + 1e-3);\r\n float baseSharpness = mix(.0, 8., clamp(w, 0., 1.));\r\n float sharpness = mix(baseSharpness, 1., mixing);\r\n w = pow(w, sharpness);\r\n color += colorFraction * w;\r\n opacity += opacityFraction * w;\r\n totalWeight += w;\r\n }\r\n\r\n color /= max(1e-4, totalWeight);\r\n opacity /= max(1e-4, totalWeight);\r\n\r\n if (u_grainOverlay > 0.) {\r\n float grainOverlay = valueNoise(rotate(grainUV, 1.) + vec2(3.));\r\n grainOverlay = mix(grainOverlay, valueNoise(rotate(grainUV, 2.) + vec2(-1.)), .5);\r\n grainOverlay = pow(grainOverlay, 1.3);\r\n\r\n float grainOverlayV = grainOverlay * 2. - 1.;\r\n vec3 grainOverlayColor = vec3(step(0., grainOverlayV));\r\n float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);\r\n grainOverlayStrength = pow(grainOverlayStrength, .8);\r\n color = mix(color, grainOverlayColor, .35 * grainOverlayStrength);\r\n\r\n opacity += .5 * grainOverlayStrength;\r\n }\r\n opacity = clamp(opacity, 0., 1.);\r\n\r\n fragColor = vec4(color, opacity);\r\n}\r\n`;\r\n\r\nexport interface StaticMeshGradientUniforms extends ShaderSizingUniforms {\r\n u_colors: vec4[];\r\n u_colorsCount: number;\r\n u_positions: number;\r\n u_waveX: number;\r\n u_waveXShift: number;\r\n u_waveY: number;\r\n u_waveYShift: number;\r\n u_mixing: number;\r\n u_grainMixer: number;\r\n u_grainOverlay: number;\r\n}\r\n\r\nexport interface StaticMeshGradientParams extends ShaderSizingParams, ShaderMotionParams {\r\n colors?: string[];\r\n positions?: number;\r\n waveX?: number;\r\n waveXShift?: number;\r\n waveY?: number;\r\n waveYShift?: number;\r\n mixing?: number;\r\n grainMixer?: number;\r\n grainOverlay?: number;\r\n}\r\n"],
5
+ "mappings": ";;;;;AAEA;AAAA,OAGO;AACP,SAAS,WAAW,WAAW,wBAAwB;AAEhD,MAAM,yBAAyB;AAAA,EACpC,eAAe;AACjB;AAqCO,MAAM,mCAA2C;AAAA;AAAA;AAAA,wBAG/B,uBAAuB,aAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe3D,SAAU;AAAA,EACV,SAAU;AAAA,EACV,gBAAiB;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,wBAoDK,uBAAuB,aAAc;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;",
6
+ "names": []
7
+ }
@@ -0,0 +1,72 @@
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
+ export declare const staticRadialGradientMeta: {
5
+ readonly maxColorCount: 10;
6
+ };
7
+ /**
8
+ * Radial gradient with up to 10 blended colors, featuring advanced mixing modes, focal point controls,
9
+ * shape distortion, and grain effects.
10
+ *
11
+ * Fragment shader uniforms:
12
+ * - u_colorBack (vec4): Background color in RGBA
13
+ * - u_colors (vec4[]): Up to 10 gradient colors in RGBA
14
+ * - u_colorsCount (float): Number of active colors
15
+ * - u_radius (float): Size of the shape (0 to 3)
16
+ * - u_focalDistance (float): Distance of the focal point from center (0 to 3)
17
+ * - u_focalAngle (float): Angle of the focal point in degrees, needs focalDistance > 0 (0 to 360)
18
+ * - u_falloff (float): Gradient decay, 0 = equal color distribution (-1 to 1)
19
+ * - u_mixing (float): Blending behavior, 0 = hard stripes, 1 = smooth gradient (0 to 1)
20
+ * - u_distortion (float): Strength of radial distortion (0 to 1)
21
+ * - u_distortionShift (float): Radial distortion offset, needs distortion > 0 (-1 to 1)
22
+ * - u_distortionFreq (float): Radial distortion frequency, needs distortion > 0 (0 to 20)
23
+ * - u_grainMixer (float): Strength of grain distortion applied to shape edges (0 to 1)
24
+ * - u_grainOverlay (float): Post-processing black/white grain overlay (0 to 1)
25
+ *
26
+ * Vertex shader outputs (used in fragment shader):
27
+ * - v_objectUV (vec2): Object box UV coordinates with global sizing (scale, rotation, offsets, etc) applied
28
+ *
29
+ * Vertex shader uniforms:
30
+ * - u_resolution (vec2): Canvas resolution in pixels
31
+ * - u_pixelRatio (float): Device pixel ratio
32
+ * - u_originX (float): Reference point for positioning world width in the canvas (0 to 1)
33
+ * - u_originY (float): Reference point for positioning world height in the canvas (0 to 1)
34
+ * - u_worldWidth (float): Virtual width of the graphic before it's scaled to fit the canvas
35
+ * - u_worldHeight (float): Virtual height of the graphic before it's scaled to fit the canvas
36
+ * - u_fit (float): How to fit the rendered shader into the canvas dimensions (0 = none, 1 = contain, 2 = cover)
37
+ * - u_scale (float): Overall zoom level of the graphics (0.01 to 4)
38
+ * - u_rotation (float): Overall rotation angle of the graphics in degrees (0 to 360)
39
+ * - u_offsetX (float): Horizontal offset of the graphics center (-1 to 1)
40
+ * - u_offsetY (float): Vertical offset of the graphics center (-1 to 1)
41
+ *
42
+ */
43
+ export declare const staticRadialGradientFragmentShader: string;
44
+ export interface StaticRadialGradientUniforms extends ShaderSizingUniforms {
45
+ u_colorBack: [number, number, number, number];
46
+ u_colors: vec4[];
47
+ u_colorsCount: number;
48
+ u_radius: number;
49
+ u_focalDistance: number;
50
+ u_focalAngle: number;
51
+ u_falloff: number;
52
+ u_mixing: number;
53
+ u_distortion: number;
54
+ u_distortionShift: number;
55
+ u_distortionFreq: number;
56
+ u_grainMixer: number;
57
+ u_grainOverlay: number;
58
+ }
59
+ export interface StaticRadialGradientParams extends ShaderSizingParams, ShaderMotionParams {
60
+ colorBack?: string;
61
+ colors?: string[];
62
+ radius?: number;
63
+ focalDistance?: number;
64
+ focalAngle?: number;
65
+ falloff?: number;
66
+ mixing?: number;
67
+ distortion?: number;
68
+ distortionShift?: number;
69
+ distortionFreq?: number;
70
+ grainMixer?: number;
71
+ grainOverlay?: number;
72
+ }
@@ -0,0 +1,188 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import {
7
+ } from "../shader-sizing.js";
8
+ import { declarePI, rotation2, proceduralHash21 } from "../shader-utils.js";
9
+ const staticRadialGradientMeta = {
10
+ maxColorCount: 10
11
+ };
12
+ const staticRadialGradientFragmentShader = `#version 300 es
13
+ precision mediump float;
14
+
15
+ uniform vec4 u_colorBack;
16
+ uniform vec4 u_colors[${staticRadialGradientMeta.maxColorCount}];
17
+ uniform float u_colorsCount;
18
+
19
+ uniform float u_radius;
20
+ uniform float u_focalDistance;
21
+ uniform float u_focalAngle;
22
+ uniform float u_falloff;
23
+ uniform float u_mixing;
24
+ uniform float u_distortion;
25
+ uniform float u_distortionShift;
26
+ uniform float u_distortionFreq;
27
+ uniform float u_grainMixer;
28
+ uniform float u_grainOverlay;
29
+
30
+ in vec2 v_objectUV;
31
+ out vec4 fragColor;
32
+
33
+ ${declarePI}
34
+ ${rotation2}
35
+ ${proceduralHash21}
36
+
37
+ float valueNoise(vec2 st) {
38
+ vec2 i = floor(st);
39
+ vec2 f = fract(st);
40
+ float a = hash21(i);
41
+ float b = hash21(i + vec2(1.0, 0.0));
42
+ float c = hash21(i + vec2(0.0, 1.0));
43
+ float d = hash21(i + vec2(1.0, 1.0));
44
+ vec2 u = f * f * (3.0 - 2.0 * f);
45
+ float x1 = mix(a, b, u.x);
46
+ float x2 = mix(c, d, u.x);
47
+ return mix(x1, x2, u.y);
48
+ }
49
+
50
+ float noise(vec2 n, vec2 seedOffset) {
51
+ return valueNoise(n + seedOffset);
52
+ }
53
+
54
+ vec2 getPosition(int i, float t) {
55
+ float a = float(i) * .37;
56
+ float b = .6 + mod(float(i), 3.) * .3;
57
+ float c = .8 + mod(float(i + 1), 4.) * 0.25;
58
+
59
+ float x = sin(t * b + a);
60
+ float y = cos(t * c + a * 1.5);
61
+
62
+ return .5 + .5 * vec2(x, y);
63
+ }
64
+
65
+ void main() {
66
+ vec2 uv = 2. * v_objectUV;
67
+ vec2 grainUV = uv * 1000.;
68
+
69
+ vec2 center = vec2(0.);
70
+ float angleRad = -radians(u_focalAngle + 90.);
71
+ vec2 focalPoint = vec2(cos(angleRad), sin(angleRad)) * u_focalDistance;
72
+ float radius = u_radius;
73
+
74
+ vec2 c_to_uv = uv - center;
75
+ vec2 f_to_uv = uv - focalPoint;
76
+ vec2 f_to_c = center - focalPoint;
77
+ float r = length(c_to_uv);
78
+
79
+ float fragAngle = atan(c_to_uv.y, c_to_uv.x);
80
+ float angleDiff = fract((fragAngle - angleRad + PI) / TWO_PI) * TWO_PI - PI;
81
+
82
+ float halfAngle = acos(clamp(radius / max(u_focalDistance, 1e-4), 0.0, 1.0));
83
+ float e0 = 0.6 * PI, e1 = halfAngle;
84
+ float lo = min(e0, e1), hi = max(e0, e1);
85
+ float s = smoothstep(lo, hi, abs(angleDiff));
86
+ float isInSector = (e1 >= e0) ? (1.0 - s) : s;
87
+
88
+ float a = dot(f_to_uv, f_to_uv);
89
+ float b = -2.0 * dot(f_to_uv, f_to_c);
90
+ float c = dot(f_to_c, f_to_c) - radius * radius;
91
+
92
+ float discriminant = b * b - 4.0 * a * c;
93
+ float t = 1.0;
94
+
95
+ if (discriminant >= 0.0) {
96
+ float sqrtD = sqrt(discriminant);
97
+ float div = max(1e-4, 2.0 * a);
98
+ float t0 = (-b - sqrtD) / div;
99
+ float t1 = (-b + sqrtD) / div;
100
+ t = max(t0, t1);
101
+ if (t < 0.0) t = 0.0;
102
+ }
103
+
104
+ float dist = length(f_to_uv);
105
+ float normalized = dist / max(1e-4, length(f_to_uv * t));
106
+ float shape = clamp(normalized, 0.0, 1.0);
107
+
108
+ float falloffMapped = mix(.2 + .8 * max(0., u_falloff + 1.), mix(1., 15., u_falloff * u_falloff), step(.0, u_falloff));
109
+
110
+ float falloffExp = mix(falloffMapped, 1., shape);
111
+ shape = pow(shape, falloffExp);
112
+ shape = 1. - clamp(shape, 0., 1.);
113
+
114
+
115
+ float outerMask = .002;
116
+ float outer = 1.0 - smoothstep(radius - outerMask, radius + outerMask, r);
117
+ outer = mix(outer, 1., isInSector);
118
+
119
+ shape = mix(0., shape, outer);
120
+ shape *= 1. - smoothstep(radius - .01, radius, r);
121
+
122
+ float angle = atan(f_to_uv.y, f_to_uv.x);
123
+ shape -= pow(u_distortion, 2.) * shape * pow(abs(sin(PI * clamp(length(f_to_uv) - 0.2 + u_distortionShift, 0.0, 1.0))), 4.0) * (sin(u_distortionFreq * angle) + cos(floor(0.65 * u_distortionFreq) * angle));
124
+
125
+ float mixerGrain = 0.;
126
+ if (u_grainMixer > 0.) {
127
+ mixerGrain = .4 * u_grainMixer * (noise(grainUV, vec2(0.)) - .5);
128
+ }
129
+
130
+ float mixer = shape * u_colorsCount + mixerGrain;
131
+ vec4 gradient = u_colors[0];
132
+ gradient.rgb *= gradient.a;
133
+
134
+ float outerShape = 0.;
135
+ for (int i = 1; i < ${staticRadialGradientMeta.maxColorCount + 1}; i++) {
136
+ if (i > int(u_colorsCount)) break;
137
+ float mLinear = clamp(mixer - float(i - 1), 0.0, 1.0);
138
+
139
+ float aa = fwidth(mLinear);
140
+ float width = min(u_mixing, 0.5);
141
+ float t = clamp((mLinear - (0.5 - width - aa)) / (2. * width + 2. * aa), 0., 1.);
142
+ float p = mix(2., 1., clamp((u_mixing - 0.5) * 2., 0., 1.));
143
+ float m = t < 0.5
144
+ ? 0.5 * pow(2. * t, p)
145
+ : 1. - 0.5 * pow(2. * (1. - t), p);
146
+
147
+ float quadBlend = clamp((u_mixing - 0.5) * 2., 0., 1.);
148
+ m = mix(m, m * m, 0.5 * quadBlend);
149
+
150
+ if (i == 1) {
151
+ outerShape = m;
152
+ }
153
+
154
+ vec4 c = u_colors[i - 1];
155
+ c.rgb *= c.a;
156
+ gradient = mix(gradient, c, m);
157
+ }
158
+
159
+ vec3 color = gradient.rgb * outerShape;
160
+ float opacity = gradient.a * outerShape;
161
+
162
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
163
+ color = color + bgColor * (1.0 - opacity);
164
+ opacity = opacity + u_colorBack.a * (1.0 - opacity);
165
+
166
+ if (u_grainOverlay > 0.) {
167
+ float grainOverlay = valueNoise(rotate(grainUV, 1.) + vec2(3.));
168
+ grainOverlay = mix(grainOverlay, valueNoise(rotate(grainUV, 2.) + vec2(-1.)), .5);
169
+ grainOverlay = pow(grainOverlay, 1.3);
170
+
171
+ float grainOverlayV = grainOverlay * 2. - 1.;
172
+ vec3 grainOverlayColor = vec3(step(0., grainOverlayV));
173
+ float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);
174
+ grainOverlayStrength = pow(grainOverlayStrength, .8);
175
+ color = mix(color, grainOverlayColor, .35 * grainOverlayStrength);
176
+
177
+ opacity += .5 * grainOverlayStrength;
178
+ }
179
+ opacity = clamp(opacity, 0., 1.);
180
+
181
+ fragColor = vec4(color, opacity);
182
+ }
183
+ `;
184
+ export {
185
+ staticRadialGradientFragmentShader,
186
+ staticRadialGradientMeta
187
+ };
188
+ //# sourceMappingURL=static-radial-gradient.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/static-radial-gradient.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types.js';\r\nimport type { ShaderMotionParams } from '../shader-mount.js';\r\nimport {\r\n type ShaderSizingParams,\r\n type ShaderSizingUniforms,\r\n} from '../shader-sizing.js';\r\nimport { declarePI, rotation2, proceduralHash21 } from '../shader-utils.js';\r\n\r\nexport const staticRadialGradientMeta = {\r\n maxColorCount: 10,\r\n} as const;\r\n\r\n/**\r\n * Radial gradient with up to 10 blended colors, featuring advanced mixing modes, focal point controls,\r\n * shape distortion, and grain effects.\r\n *\r\n * Fragment shader uniforms:\r\n * - u_colorBack (vec4): Background color in RGBA\r\n * - u_colors (vec4[]): Up to 10 gradient colors in RGBA\r\n * - u_colorsCount (float): Number of active colors\r\n * - u_radius (float): Size of the shape (0 to 3)\r\n * - u_focalDistance (float): Distance of the focal point from center (0 to 3)\r\n * - u_focalAngle (float): Angle of the focal point in degrees, needs focalDistance > 0 (0 to 360)\r\n * - u_falloff (float): Gradient decay, 0 = equal color distribution (-1 to 1)\r\n * - u_mixing (float): Blending behavior, 0 = hard stripes, 1 = smooth gradient (0 to 1)\r\n * - u_distortion (float): Strength of radial distortion (0 to 1)\r\n * - u_distortionShift (float): Radial distortion offset, needs distortion > 0 (-1 to 1)\r\n * - u_distortionFreq (float): Radial distortion frequency, needs distortion > 0 (0 to 20)\r\n * - u_grainMixer (float): Strength of grain distortion applied to shape edges (0 to 1)\r\n * - u_grainOverlay (float): Post-processing black/white grain overlay (0 to 1)\r\n *\r\n * Vertex shader outputs (used in fragment shader):\r\n * - v_objectUV (vec2): Object box UV coordinates with global sizing (scale, rotation, offsets, etc) applied\r\n *\r\n * Vertex shader uniforms:\r\n * - u_resolution (vec2): Canvas resolution in pixels\r\n * - u_pixelRatio (float): Device pixel ratio\r\n * - u_originX (float): Reference point for positioning world width in the canvas (0 to 1)\r\n * - u_originY (float): Reference point for positioning world height in the canvas (0 to 1)\r\n * - u_worldWidth (float): Virtual width of the graphic before it's scaled to fit the canvas\r\n * - u_worldHeight (float): Virtual height of the graphic before it's scaled to fit the canvas\r\n * - u_fit (float): How to fit the rendered shader into the canvas dimensions (0 = none, 1 = contain, 2 = cover)\r\n * - u_scale (float): Overall zoom level of the graphics (0.01 to 4)\r\n * - u_rotation (float): Overall rotation angle of the graphics in degrees (0 to 360)\r\n * - u_offsetX (float): Horizontal offset of the graphics center (-1 to 1)\r\n * - u_offsetY (float): Vertical offset of the graphics center (-1 to 1)\r\n *\r\n */\r\n\r\n// language=GLSL\r\nexport const staticRadialGradientFragmentShader: string = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform vec4 u_colorBack;\r\nuniform vec4 u_colors[${ staticRadialGradientMeta.maxColorCount }];\r\nuniform float u_colorsCount;\r\n\r\nuniform float u_radius;\r\nuniform float u_focalDistance;\r\nuniform float u_focalAngle;\r\nuniform float u_falloff;\r\nuniform float u_mixing;\r\nuniform float u_distortion;\r\nuniform float u_distortionShift;\r\nuniform float u_distortionFreq;\r\nuniform float u_grainMixer;\r\nuniform float u_grainOverlay;\r\n\r\nin vec2 v_objectUV;\r\nout vec4 fragColor;\r\n\r\n${ declarePI }\r\n${ rotation2 }\r\n${ proceduralHash21 }\r\n\r\nfloat valueNoise(vec2 st) {\r\n vec2 i = floor(st);\r\n vec2 f = fract(st);\r\n float a = hash21(i);\r\n float b = hash21(i + vec2(1.0, 0.0));\r\n float c = hash21(i + vec2(0.0, 1.0));\r\n float d = hash21(i + vec2(1.0, 1.0));\r\n vec2 u = f * f * (3.0 - 2.0 * f);\r\n float x1 = mix(a, b, u.x);\r\n float x2 = mix(c, d, u.x);\r\n return mix(x1, x2, u.y);\r\n}\r\n\r\nfloat noise(vec2 n, vec2 seedOffset) {\r\n return valueNoise(n + seedOffset);\r\n}\r\n\r\nvec2 getPosition(int i, float t) {\r\n float a = float(i) * .37;\r\n float b = .6 + mod(float(i), 3.) * .3;\r\n float c = .8 + mod(float(i + 1), 4.) * 0.25;\r\n\r\n float x = sin(t * b + a);\r\n float y = cos(t * c + a * 1.5);\r\n\r\n return .5 + .5 * vec2(x, y);\r\n}\r\n\r\nvoid main() {\r\n vec2 uv = 2. * v_objectUV;\r\n vec2 grainUV = uv * 1000.;\r\n\r\n vec2 center = vec2(0.);\r\n float angleRad = -radians(u_focalAngle + 90.);\r\n vec2 focalPoint = vec2(cos(angleRad), sin(angleRad)) * u_focalDistance;\r\n float radius = u_radius;\r\n\r\n vec2 c_to_uv = uv - center;\r\n vec2 f_to_uv = uv - focalPoint;\r\n vec2 f_to_c = center - focalPoint;\r\n float r = length(c_to_uv);\r\n\r\n float fragAngle = atan(c_to_uv.y, c_to_uv.x);\r\n float angleDiff = fract((fragAngle - angleRad + PI) / TWO_PI) * TWO_PI - PI;\r\n\r\n float halfAngle = acos(clamp(radius / max(u_focalDistance, 1e-4), 0.0, 1.0));\r\n float e0 = 0.6 * PI, e1 = halfAngle;\r\n float lo = min(e0, e1), hi = max(e0, e1);\r\n float s = smoothstep(lo, hi, abs(angleDiff));\r\n float isInSector = (e1 >= e0) ? (1.0 - s) : s;\r\n\r\n float a = dot(f_to_uv, f_to_uv);\r\n float b = -2.0 * dot(f_to_uv, f_to_c);\r\n float c = dot(f_to_c, f_to_c) - radius * radius;\r\n\r\n float discriminant = b * b - 4.0 * a * c;\r\n float t = 1.0;\r\n\r\n if (discriminant >= 0.0) {\r\n float sqrtD = sqrt(discriminant);\r\n float div = max(1e-4, 2.0 * a);\r\n float t0 = (-b - sqrtD) / div;\r\n float t1 = (-b + sqrtD) / div;\r\n t = max(t0, t1);\r\n if (t < 0.0) t = 0.0;\r\n }\r\n\r\n float dist = length(f_to_uv);\r\n float normalized = dist / max(1e-4, length(f_to_uv * t));\r\n float shape = clamp(normalized, 0.0, 1.0);\r\n\r\n float falloffMapped = mix(.2 + .8 * max(0., u_falloff + 1.), mix(1., 15., u_falloff * u_falloff), step(.0, u_falloff));\r\n\r\n float falloffExp = mix(falloffMapped, 1., shape);\r\n shape = pow(shape, falloffExp);\r\n shape = 1. - clamp(shape, 0., 1.);\r\n\r\n\r\n float outerMask = .002;\r\n float outer = 1.0 - smoothstep(radius - outerMask, radius + outerMask, r);\r\n outer = mix(outer, 1., isInSector);\r\n\r\n shape = mix(0., shape, outer);\r\n shape *= 1. - smoothstep(radius - .01, radius, r);\r\n\r\n float angle = atan(f_to_uv.y, f_to_uv.x);\r\n shape -= pow(u_distortion, 2.) * shape * pow(abs(sin(PI * clamp(length(f_to_uv) - 0.2 + u_distortionShift, 0.0, 1.0))), 4.0) * (sin(u_distortionFreq * angle) + cos(floor(0.65 * u_distortionFreq) * angle));\r\n\r\n float mixerGrain = 0.;\r\n if (u_grainMixer > 0.) {\r\n mixerGrain = .4 * u_grainMixer * (noise(grainUV, vec2(0.)) - .5);\r\n }\r\n\r\n float mixer = shape * u_colorsCount + mixerGrain;\r\n vec4 gradient = u_colors[0];\r\n gradient.rgb *= gradient.a;\r\n\r\n float outerShape = 0.;\r\n for (int i = 1; i < ${ staticRadialGradientMeta.maxColorCount + 1 }; i++) {\r\n if (i > int(u_colorsCount)) break;\r\n float mLinear = clamp(mixer - float(i - 1), 0.0, 1.0);\r\n\r\n float aa = fwidth(mLinear);\r\n float width = min(u_mixing, 0.5);\r\n float t = clamp((mLinear - (0.5 - width - aa)) / (2. * width + 2. * aa), 0., 1.);\r\n float p = mix(2., 1., clamp((u_mixing - 0.5) * 2., 0., 1.));\r\n float m = t < 0.5\r\n ? 0.5 * pow(2. * t, p)\r\n : 1. - 0.5 * pow(2. * (1. - t), p);\r\n\r\n float quadBlend = clamp((u_mixing - 0.5) * 2., 0., 1.);\r\n m = mix(m, m * m, 0.5 * quadBlend);\r\n \r\n if (i == 1) {\r\n outerShape = m;\r\n }\r\n\r\n vec4 c = u_colors[i - 1];\r\n c.rgb *= c.a;\r\n gradient = mix(gradient, c, m);\r\n }\r\n\r\n vec3 color = gradient.rgb * outerShape;\r\n float opacity = gradient.a * outerShape;\r\n\r\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\r\n color = color + bgColor * (1.0 - opacity);\r\n opacity = opacity + u_colorBack.a * (1.0 - opacity);\r\n\r\n if (u_grainOverlay > 0.) {\r\n float grainOverlay = valueNoise(rotate(grainUV, 1.) + vec2(3.));\r\n grainOverlay = mix(grainOverlay, valueNoise(rotate(grainUV, 2.) + vec2(-1.)), .5);\r\n grainOverlay = pow(grainOverlay, 1.3);\r\n\r\n float grainOverlayV = grainOverlay * 2. - 1.;\r\n vec3 grainOverlayColor = vec3(step(0., grainOverlayV));\r\n float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);\r\n grainOverlayStrength = pow(grainOverlayStrength, .8);\r\n color = mix(color, grainOverlayColor, .35 * grainOverlayStrength);\r\n\r\n opacity += .5 * grainOverlayStrength;\r\n }\r\n opacity = clamp(opacity, 0., 1.);\r\n\r\n fragColor = vec4(color, opacity);\r\n}\r\n`;\r\n\r\nexport interface StaticRadialGradientUniforms extends ShaderSizingUniforms {\r\n u_colorBack: [number, number, number, number];\r\n u_colors: vec4[];\r\n u_colorsCount: number;\r\n u_radius: number;\r\n u_focalDistance: number;\r\n u_focalAngle: number;\r\n u_falloff: number;\r\n u_mixing: number;\r\n u_distortion: number;\r\n u_distortionShift: number;\r\n u_distortionFreq: number;\r\n u_grainMixer: number;\r\n u_grainOverlay: number;\r\n}\r\n\r\nexport interface StaticRadialGradientParams extends ShaderSizingParams, ShaderMotionParams {\r\n colorBack?: string;\r\n colors?: string[];\r\n radius?: number;\r\n focalDistance?: number;\r\n focalAngle?: number;\r\n falloff?: number;\r\n mixing?: number;\r\n distortion?: number;\r\n distortionShift?: number;\r\n distortionFreq?: number;\r\n grainMixer?: number;\r\n grainOverlay?: number;\r\n}\r\n"],
5
+ "mappings": ";;;;;AAEA;AAAA,OAGO;AACP,SAAS,WAAW,WAAW,wBAAwB;AAEhD,MAAM,2BAA2B;AAAA,EACtC,eAAe;AACjB;AAwCO,MAAM,qCAA6C;AAAA;AAAA;AAAA;AAAA,wBAIjC,yBAAyB,aAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB7D,SAAU;AAAA,EACV,SAAU;AAAA,EACV,gBAAiB;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;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,wBAoGK,yBAAyB,gBAAgB,CAAE;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;",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
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
+ export declare const swirlMeta: {
5
+ readonly maxColorCount: 10;
6
+ };
7
+ /**
8
+ * Animated bands of color twisting and bending, producing spirals, arcs, and flowing circular patterns.
9
+ *
10
+ * Fragment shader uniforms:
11
+ * - u_time (float): Animation time
12
+ * - u_colorBack (vec4): Background color in RGBA
13
+ * - u_colors (vec4[]): Up to 10 stripe colors in RGBA
14
+ * - u_colorsCount (float): Number of active colors
15
+ * - u_bandCount (float): Number of color bands, 0 = concentric ripples (0 to 15)
16
+ * - u_twist (float): Vortex power, 0 = straight sectoral shapes (0 to 1)
17
+ * - u_center (float): How far from the center the swirl colors begin to appear, needs twist > 0 (0 to 1)
18
+ * - u_proportion (float): Blend point between colors, 0.5 = equal distribution (0 to 1)
19
+ * - u_softness (float): Color transition sharpness, 0 = hard edge, 1 = smooth gradient (0 to 1)
20
+ * - u_noise (float): Strength of noise distortion, needs noiseFrequency > 0 (0 to 1)
21
+ * - u_noiseFrequency (float): Noise frequency, needs noise > 0 (0 to 1)
22
+ *
23
+ * Vertex shader outputs (used in fragment shader):
24
+ * - v_objectUV (vec2): Object box UV coordinates with global sizing (scale, rotation, offsets, etc) applied
25
+ *
26
+ * Vertex shader uniforms:
27
+ * - u_resolution (vec2): Canvas resolution in pixels
28
+ * - u_pixelRatio (float): Device pixel ratio
29
+ * - u_originX (float): Reference point for positioning world width in the canvas (0 to 1)
30
+ * - u_originY (float): Reference point for positioning world height in the canvas (0 to 1)
31
+ * - u_worldWidth (float): Virtual width of the graphic before it's scaled to fit the canvas
32
+ * - u_worldHeight (float): Virtual height of the graphic before it's scaled to fit the canvas
33
+ * - u_fit (float): How to fit the rendered shader into the canvas dimensions (0 = none, 1 = contain, 2 = cover)
34
+ * - u_scale (float): Overall zoom level of the graphics (0.01 to 4)
35
+ * - u_rotation (float): Overall rotation angle of the graphics in degrees (0 to 360)
36
+ * - u_offsetX (float): Horizontal offset of the graphics center (-1 to 1)
37
+ * - u_offsetY (float): Vertical offset of the graphics center (-1 to 1)
38
+ *
39
+ */
40
+ export declare const swirlFragmentShader: string;
41
+ export interface SwirlUniforms extends ShaderSizingUniforms {
42
+ u_colorBack: [number, number, number, number];
43
+ u_colors: vec4[];
44
+ u_colorsCount: number;
45
+ u_bandCount: number;
46
+ u_twist: number;
47
+ u_center: number;
48
+ u_proportion: number;
49
+ u_softness: number;
50
+ u_noiseFrequency: number;
51
+ u_noise: number;
52
+ }
53
+ export interface SwirlParams extends ShaderSizingParams, ShaderMotionParams {
54
+ colorBack?: string;
55
+ colors?: string[];
56
+ bandCount?: number;
57
+ twist?: number;
58
+ center?: number;
59
+ proportion?: number;
60
+ softness?: number;
61
+ noiseFrequency?: number;
62
+ noise?: number;
63
+ }
@@ -0,0 +1,104 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import {} from "../shader-sizing.js";
7
+ import { simplexNoise, declarePI, rotation2, colorBandingFix } from "../shader-utils.js";
8
+ const swirlMeta = {
9
+ maxColorCount: 10
10
+ };
11
+ const swirlFragmentShader = `#version 300 es
12
+ precision mediump float;
13
+
14
+ uniform float u_time;
15
+
16
+ uniform vec4 u_colorBack;
17
+ uniform vec4 u_colors[${swirlMeta.maxColorCount}];
18
+ uniform float u_colorsCount;
19
+ uniform float u_bandCount;
20
+ uniform float u_twist;
21
+ uniform float u_center;
22
+ uniform float u_proportion;
23
+ uniform float u_softness;
24
+ uniform float u_noise;
25
+ uniform float u_noiseFrequency;
26
+
27
+ in vec2 v_objectUV;
28
+
29
+ out vec4 fragColor;
30
+
31
+ ${declarePI}
32
+ ${simplexNoise}
33
+ ${rotation2}
34
+
35
+ void main() {
36
+ vec2 shape_uv = v_objectUV;
37
+
38
+ float l = length(shape_uv);
39
+ l = max(1e-4, l);
40
+
41
+ float t = u_time;
42
+
43
+ float angle = ceil(u_bandCount) * atan(shape_uv.y, shape_uv.x) + t;
44
+ float angle_norm = angle / TWO_PI;
45
+
46
+ float twist = 3. * clamp(u_twist, 0., 1.);
47
+ float offset = pow(l, -twist) + angle_norm;
48
+
49
+ float shape = fract(offset);
50
+ shape = 1. - abs(2. * shape - 1.);
51
+ if (u_noise > 0.) {
52
+ shape += u_noise * snoise(15. * pow(u_noiseFrequency, 2.) * shape_uv);
53
+ }
54
+
55
+ float mid = smoothstep(.2, .2 + .8 * u_center, pow(l, twist));
56
+ shape = mix(0., shape, mid);
57
+
58
+ float proportion = clamp(u_proportion, 0., 1.);
59
+ float exponent = mix(.25, 1., proportion * 2.);
60
+ exponent = mix(exponent, 10., max(0., proportion * 2. - 1.));
61
+ shape = pow(shape, exponent);
62
+
63
+ float mixer = shape * u_colorsCount;
64
+ vec4 gradient = u_colors[0];
65
+ gradient.rgb *= gradient.a;
66
+
67
+ float outerShape = 0.;
68
+ for (int i = 1; i < ${swirlMeta.maxColorCount + 1}; i++) {
69
+ if (i > int(u_colorsCount)) break;
70
+
71
+ float m = clamp(mixer - float(i - 1), 0., 1.);
72
+ float aa = fwidth(m);
73
+ m = smoothstep(.5 - .5 * u_softness - aa, .5 + .5 * u_softness + aa, m);
74
+
75
+ if (i == 1) {
76
+ outerShape = m;
77
+ }
78
+
79
+ vec4 c = u_colors[i - 1];
80
+ c.rgb *= c.a;
81
+ gradient = mix(gradient, c, m);
82
+ }
83
+
84
+ float midAA = .1 * fwidth(pow(l, -twist));
85
+ float outerMid = smoothstep(.2, .2 + midAA, pow(l, twist));
86
+ outerShape = mix(0., outerShape, outerMid);
87
+
88
+ vec3 color = gradient.rgb * outerShape;
89
+ float opacity = gradient.a * outerShape;
90
+
91
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
92
+ color = color + bgColor * (1.0 - opacity);
93
+ opacity = opacity + u_colorBack.a * (1.0 - opacity);
94
+
95
+ ${colorBandingFix}
96
+
97
+ fragColor = vec4(color, opacity);
98
+ }
99
+ `;
100
+ export {
101
+ swirlFragmentShader,
102
+ swirlMeta
103
+ };
104
+ //# sourceMappingURL=swirl.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/swirl.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types.js';\r\nimport type { ShaderMotionParams } from '../shader-mount.js';\r\nimport { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\r\nimport { simplexNoise, declarePI, rotation2, colorBandingFix } from '../shader-utils.js';\r\n\r\nexport const swirlMeta = {\r\n maxColorCount: 10,\r\n} as const;\r\n\r\n/**\r\n * Animated bands of color twisting and bending, producing spirals, arcs, and flowing circular patterns.\r\n *\r\n * Fragment shader uniforms:\r\n * - u_time (float): Animation time\r\n * - u_colorBack (vec4): Background color in RGBA\r\n * - u_colors (vec4[]): Up to 10 stripe colors in RGBA\r\n * - u_colorsCount (float): Number of active colors\r\n * - u_bandCount (float): Number of color bands, 0 = concentric ripples (0 to 15)\r\n * - u_twist (float): Vortex power, 0 = straight sectoral shapes (0 to 1)\r\n * - u_center (float): How far from the center the swirl colors begin to appear, needs twist > 0 (0 to 1)\r\n * - u_proportion (float): Blend point between colors, 0.5 = equal distribution (0 to 1)\r\n * - u_softness (float): Color transition sharpness, 0 = hard edge, 1 = smooth gradient (0 to 1)\r\n * - u_noise (float): Strength of noise distortion, needs noiseFrequency > 0 (0 to 1)\r\n * - u_noiseFrequency (float): Noise frequency, needs noise > 0 (0 to 1)\r\n *\r\n * Vertex shader outputs (used in fragment shader):\r\n * - v_objectUV (vec2): Object box UV coordinates with global sizing (scale, rotation, offsets, etc) applied\r\n *\r\n * Vertex shader uniforms:\r\n * - u_resolution (vec2): Canvas resolution in pixels\r\n * - u_pixelRatio (float): Device pixel ratio\r\n * - u_originX (float): Reference point for positioning world width in the canvas (0 to 1)\r\n * - u_originY (float): Reference point for positioning world height in the canvas (0 to 1)\r\n * - u_worldWidth (float): Virtual width of the graphic before it's scaled to fit the canvas\r\n * - u_worldHeight (float): Virtual height of the graphic before it's scaled to fit the canvas\r\n * - u_fit (float): How to fit the rendered shader into the canvas dimensions (0 = none, 1 = contain, 2 = cover)\r\n * - u_scale (float): Overall zoom level of the graphics (0.01 to 4)\r\n * - u_rotation (float): Overall rotation angle of the graphics in degrees (0 to 360)\r\n * - u_offsetX (float): Horizontal offset of the graphics center (-1 to 1)\r\n * - u_offsetY (float): Vertical offset of the graphics center (-1 to 1)\r\n *\r\n */\r\n\r\n// language=GLSL\r\nexport const swirlFragmentShader: string = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform float u_time;\r\n\r\nuniform vec4 u_colorBack;\r\nuniform vec4 u_colors[${ swirlMeta.maxColorCount }];\r\nuniform float u_colorsCount;\r\nuniform float u_bandCount;\r\nuniform float u_twist;\r\nuniform float u_center;\r\nuniform float u_proportion;\r\nuniform float u_softness;\r\nuniform float u_noise;\r\nuniform float u_noiseFrequency;\r\n\r\nin vec2 v_objectUV;\r\n\r\nout vec4 fragColor;\r\n\r\n${ declarePI }\r\n${ simplexNoise }\r\n${ rotation2 }\r\n\r\nvoid main() {\r\n vec2 shape_uv = v_objectUV;\r\n\r\n float l = length(shape_uv);\r\n l = max(1e-4, l);\r\n\r\n float t = u_time;\r\n\r\n float angle = ceil(u_bandCount) * atan(shape_uv.y, shape_uv.x) + t;\r\n float angle_norm = angle / TWO_PI;\r\n\r\n float twist = 3. * clamp(u_twist, 0., 1.);\r\n float offset = pow(l, -twist) + angle_norm;\r\n\r\n float shape = fract(offset);\r\n shape = 1. - abs(2. * shape - 1.);\r\n if (u_noise > 0.) {\r\n shape += u_noise * snoise(15. * pow(u_noiseFrequency, 2.) * shape_uv);\r\n }\r\n\r\n float mid = smoothstep(.2, .2 + .8 * u_center, pow(l, twist));\r\n shape = mix(0., shape, mid);\r\n\r\n float proportion = clamp(u_proportion, 0., 1.);\r\n float exponent = mix(.25, 1., proportion * 2.);\r\n exponent = mix(exponent, 10., max(0., proportion * 2. - 1.));\r\n shape = pow(shape, exponent);\r\n\r\n float mixer = shape * u_colorsCount;\r\n vec4 gradient = u_colors[0];\r\n gradient.rgb *= gradient.a;\r\n\r\n float outerShape = 0.;\r\n for (int i = 1; i < ${ swirlMeta.maxColorCount + 1 }; i++) {\r\n if (i > int(u_colorsCount)) break;\r\n\r\n float m = clamp(mixer - float(i - 1), 0., 1.);\r\n float aa = fwidth(m);\r\n m = smoothstep(.5 - .5 * u_softness - aa, .5 + .5 * u_softness + aa, m);\r\n\r\n if (i == 1) {\r\n outerShape = m;\r\n }\r\n\r\n vec4 c = u_colors[i - 1];\r\n c.rgb *= c.a;\r\n gradient = mix(gradient, c, m);\r\n }\r\n\r\n float midAA = .1 * fwidth(pow(l, -twist));\r\n float outerMid = smoothstep(.2, .2 + midAA, pow(l, twist));\r\n outerShape = mix(0., outerShape, outerMid);\r\n\r\n vec3 color = gradient.rgb * outerShape;\r\n float opacity = gradient.a * outerShape;\r\n\r\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\r\n color = color + bgColor * (1.0 - opacity);\r\n opacity = opacity + u_colorBack.a * (1.0 - opacity);\r\n\r\n ${ colorBandingFix }\r\n\r\n fragColor = vec4(color, opacity);\r\n}\r\n`;\r\n\r\nexport interface SwirlUniforms extends ShaderSizingUniforms {\r\n u_colorBack: [number, number, number, number];\r\n u_colors: vec4[];\r\n u_colorsCount: number;\r\n u_bandCount: number;\r\n u_twist: number;\r\n u_center: number;\r\n u_proportion: number;\r\n u_softness: number;\r\n u_noiseFrequency: number;\r\n u_noise: number;\r\n}\r\n\r\nexport interface SwirlParams extends ShaderSizingParams, ShaderMotionParams {\r\n colorBack?: string;\r\n colors?: string[];\r\n bandCount?: number;\r\n twist?: number;\r\n center?: number;\r\n proportion?: number;\r\n softness?: number;\r\n noiseFrequency?: number;\r\n noise?: number;\r\n}\r\n"],
5
+ "mappings": ";;;;;AAEA,eAAmE;AACnE,SAAS,cAAc,WAAW,WAAW,uBAAuB;AAE7D,MAAM,YAAY;AAAA,EACvB,eAAe;AACjB;AAqCO,MAAM,sBAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMlB,UAAU,aAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc9C,SAAU;AAAA,EACV,YAAa;AAAA,EACb,SAAU;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,wBAmCY,UAAU,gBAAgB,CAAE;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,IA2BhD,eAAgB;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }