@paper-design/shaders 0.0.0-canary.156ab35

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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/get-empty-pixel.d.ts +1 -0
  4. package/dist/get-empty-pixel.js +19 -0
  5. package/dist/get-empty-pixel.js.map +7 -0
  6. package/dist/get-shader-color-from-string.d.ts +3 -0
  7. package/dist/get-shader-color-from-string.js +93 -0
  8. package/dist/get-shader-color-from-string.js.map +7 -0
  9. package/dist/get-shader-noise-texture.d.ts +1 -0
  10. package/dist/get-shader-noise-texture.js +19 -0
  11. package/dist/get-shader-noise-texture.js.map +7 -0
  12. package/dist/index.d.ts +53 -0
  13. package/dist/index.js +168 -0
  14. package/dist/index.js.map +7 -0
  15. package/dist/shader-color-spaces.d.ts +6 -0
  16. package/dist/shader-color-spaces.js +96 -0
  17. package/dist/shader-color-spaces.js.map +7 -0
  18. package/dist/shader-mount.d.ts +130 -0
  19. package/dist/shader-mount.js +483 -0
  20. package/dist/shader-mount.js.map +7 -0
  21. package/dist/shader-sizing.d.ts +35 -0
  22. package/dist/shader-sizing.js +230 -0
  23. package/dist/shader-sizing.js.map +7 -0
  24. package/dist/shader-utils.d.ts +10 -0
  25. package/dist/shader-utils.js +131 -0
  26. package/dist/shader-utils.js.map +7 -0
  27. package/dist/shaders/color-panels.d.ts +50 -0
  28. package/dist/shaders/color-panels.js +224 -0
  29. package/dist/shaders/color-panels.js.map +7 -0
  30. package/dist/shaders/dithering.d.ts +56 -0
  31. package/dist/shaders/dithering.js +223 -0
  32. package/dist/shaders/dithering.js.map +7 -0
  33. package/dist/shaders/dot-grid.d.ts +51 -0
  34. package/dist/shaders/dot-grid.js +110 -0
  35. package/dist/shaders/dot-grid.js.map +7 -0
  36. package/dist/shaders/dot-orbit.d.ts +39 -0
  37. package/dist/shaders/dot-orbit.js +124 -0
  38. package/dist/shaders/dot-orbit.js.map +7 -0
  39. package/dist/shaders/fluted-glass.d.ts +73 -0
  40. package/dist/shaders/fluted-glass.js +187 -0
  41. package/dist/shaders/fluted-glass.js.map +7 -0
  42. package/dist/shaders/god-rays.d.ts +45 -0
  43. package/dist/shaders/god-rays.js +133 -0
  44. package/dist/shaders/god-rays.js.map +7 -0
  45. package/dist/shaders/grain-gradient.d.ts +58 -0
  46. package/dist/shaders/grain-gradient.js +289 -0
  47. package/dist/shaders/grain-gradient.js.map +7 -0
  48. package/dist/shaders/heatmap.d.ts +31 -0
  49. package/dist/shaders/heatmap.js +303 -0
  50. package/dist/shaders/heatmap.js.map +7 -0
  51. package/dist/shaders/image-dithering.d.ts +49 -0
  52. package/dist/shaders/image-dithering.js +163 -0
  53. package/dist/shaders/image-dithering.js.map +7 -0
  54. package/dist/shaders/image-halftone-dots.d.ts +46 -0
  55. package/dist/shaders/image-halftone-dots.js +337 -0
  56. package/dist/shaders/image-halftone-dots.js.map +7 -0
  57. package/dist/shaders/liquid-metal.d.ts +66 -0
  58. package/dist/shaders/liquid-metal.js +627 -0
  59. package/dist/shaders/liquid-metal.js.map +7 -0
  60. package/dist/shaders/mesh-gradient.d.ts +33 -0
  61. package/dist/shaders/mesh-gradient.js +136 -0
  62. package/dist/shaders/mesh-gradient.js.map +7 -0
  63. package/dist/shaders/metaballs.d.ts +35 -0
  64. package/dist/shaders/metaballs.js +112 -0
  65. package/dist/shaders/metaballs.js.map +7 -0
  66. package/dist/shaders/neuro-noise.d.ts +27 -0
  67. package/dist/shaders/neuro-noise.js +80 -0
  68. package/dist/shaders/neuro-noise.js.map +7 -0
  69. package/dist/shaders/paper-texture.d.ts +53 -0
  70. package/dist/shaders/paper-texture.js +248 -0
  71. package/dist/shaders/paper-texture.js.map +7 -0
  72. package/dist/shaders/perlin-noise.d.ts +33 -0
  73. package/dist/shaders/perlin-noise.js +195 -0
  74. package/dist/shaders/perlin-noise.js.map +7 -0
  75. package/dist/shaders/pulsing-border.d.ts +72 -0
  76. package/dist/shaders/pulsing-border.js +237 -0
  77. package/dist/shaders/pulsing-border.js.map +7 -0
  78. package/dist/shaders/simplex-noise.d.ts +27 -0
  79. package/dist/shaders/simplex-noise.js +100 -0
  80. package/dist/shaders/simplex-noise.js.map +7 -0
  81. package/dist/shaders/smoke-ring.d.ts +39 -0
  82. package/dist/shaders/smoke-ring.js +130 -0
  83. package/dist/shaders/smoke-ring.js.map +7 -0
  84. package/dist/shaders/spiral.d.ts +41 -0
  85. package/dist/shaders/spiral.js +81 -0
  86. package/dist/shaders/spiral.js.map +7 -0
  87. package/dist/shaders/static-mesh-gradient.d.ts +42 -0
  88. package/dist/shaders/static-mesh-gradient.js +139 -0
  89. package/dist/shaders/static-mesh-gradient.js.map +7 -0
  90. package/dist/shaders/static-radial-gradient.d.ts +50 -0
  91. package/dist/shaders/static-radial-gradient.js +195 -0
  92. package/dist/shaders/static-radial-gradient.js.map +7 -0
  93. package/dist/shaders/swirl.d.ts +42 -0
  94. package/dist/shaders/swirl.js +102 -0
  95. package/dist/shaders/swirl.js.map +7 -0
  96. package/dist/shaders/voronoi.d.ts +44 -0
  97. package/dist/shaders/voronoi.js +139 -0
  98. package/dist/shaders/voronoi.js.map +7 -0
  99. package/dist/shaders/warp.d.ts +54 -0
  100. package/dist/shaders/warp.js +132 -0
  101. package/dist/shaders/warp.js.map +7 -0
  102. package/dist/shaders/water.d.ts +39 -0
  103. package/dist/shaders/water.js +120 -0
  104. package/dist/shaders/water.js.map +7 -0
  105. package/dist/shaders/waves.d.ts +38 -0
  106. package/dist/shaders/waves.js +66 -0
  107. package/dist/shaders/waves.js.map +7 -0
  108. package/dist/types.d.ts +3 -0
  109. package/dist/types.js +6 -0
  110. package/dist/types.js.map +7 -0
  111. package/dist/vertex-shader.d.ts +2 -0
  112. package/dist/vertex-shader.js +211 -0
  113. package/dist/vertex-shader.js.map +7 -0
  114. package/package.json +27 -0
@@ -0,0 +1,248 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing.js";
7
+ import { rotation2, declarePI, fiberNoise, textureRandomizerR } from "../shader-utils.js";
8
+ const paperTextureFragmentShader = `#version 300 es
9
+ precision mediump float;
10
+
11
+ uniform vec2 u_resolution;
12
+ uniform float u_pixelRatio;
13
+
14
+ uniform vec4 u_colorFront;
15
+ uniform vec4 u_colorBack;
16
+
17
+ uniform sampler2D u_image;
18
+ uniform float u_imageAspectRatio;
19
+
20
+ uniform float u_contrast;
21
+ uniform float u_roughness;
22
+ uniform float u_fiber;
23
+ uniform float u_fiberSize;
24
+ uniform float u_crumples;
25
+ uniform float u_crumpleSize;
26
+ uniform float u_folds;
27
+ uniform float u_foldCount;
28
+ uniform float u_drops;
29
+ uniform float u_seed;
30
+ uniform float u_fade;
31
+
32
+ uniform sampler2D u_noiseTexture;
33
+
34
+ ${sizingVariablesDeclaration}
35
+
36
+ out vec4 fragColor;
37
+
38
+ float getUvFrame(vec2 uv) {
39
+ float aax = 2. * fwidth(uv.x);
40
+ float aay = 2. * fwidth(uv.y);
41
+
42
+ float left = smoothstep(0., aax, uv.x);
43
+ float right = 1. - smoothstep(1. - aax, 1., uv.x);
44
+ float bottom = smoothstep(0., aay, uv.y);
45
+ float top = 1. - smoothstep(1. - aay, 1., uv.y);
46
+
47
+ return left * right * bottom * top;
48
+ }
49
+
50
+ ${declarePI}
51
+ ${rotation2}
52
+ ${textureRandomizerR}
53
+ float valueNoise(vec2 st) {
54
+ vec2 i = floor(st);
55
+ vec2 f = fract(st);
56
+ float a = randomR(i);
57
+ float b = randomR(i + vec2(1.0, 0.0));
58
+ float c = randomR(i + vec2(0.0, 1.0));
59
+ float d = randomR(i + vec2(1.0, 1.0));
60
+ vec2 u = f * f * (3.0 - 2.0 * f);
61
+ float x1 = mix(a, b, u.x);
62
+ float x2 = mix(c, d, u.x);
63
+ return mix(x1, x2, u.y);
64
+ }
65
+ float fbm(vec2 n) {
66
+ float total = 0.0, amplitude = .4;
67
+ for (int i = 0; i < 3; i++) {
68
+ total += valueNoise(n) * amplitude;
69
+ n *= 1.99;
70
+ amplitude *= 0.65;
71
+ }
72
+ return total;
73
+ }
74
+
75
+
76
+ float randomG(vec2 p) {
77
+ vec2 uv = floor(p) / 50. + .5;
78
+ return texture(u_noiseTexture, fract(uv)).g;
79
+ }
80
+ float roughness(vec2 p) {
81
+ p *= .1;
82
+ float o = 0.;
83
+ for (float i = 0.; ++i < 4.; p *= 2.1) {
84
+ vec4 w = vec4(floor(p), ceil(p));
85
+ vec2 f = fract(p);
86
+ o += mix(
87
+ mix(randomG(w.xy), randomG(w.xw), f.y),
88
+ mix(randomG(w.zy), randomG(w.zw), f.y),
89
+ f.x);
90
+ o += .2 / exp(2. * abs(sin(.2 * p.x + .5 * p.y)));
91
+ }
92
+ return o / 3.;
93
+ }
94
+
95
+ ${fiberNoise}
96
+
97
+ vec2 randomGB(vec2 p) {
98
+ vec2 uv = floor(p) / 50. + .5;
99
+ return texture(u_noiseTexture, fract(uv)).gb;
100
+ }
101
+ float crumpledNoise(vec2 t, float pw) {
102
+ vec2 p = floor(t);
103
+ float wsum = 0.;
104
+ float cl = 0.;
105
+ for (int y = -1; y < 2; y += 1) {
106
+ for (int x = -1; x < 2; x += 1) {
107
+ vec2 b = vec2(float(x), float(y));
108
+ vec2 q = b + p;
109
+ vec2 q2 = q - floor(q / 8.) * 8.;
110
+ vec2 c = q + randomGB(q2);
111
+ vec2 r = c - t;
112
+ float w = pow(smoothstep(0., 1., 1. - abs(r.x)), pw) * pow(smoothstep(0., 1., 1. - abs(r.y)), pw);
113
+ cl += (.5 + .5 * sin((q2.x + q2.y * 5.) * 8.)) * w;
114
+ wsum += w;
115
+ }
116
+ }
117
+ return pow(wsum != 0.0 ? cl / wsum : 0.0, .5) * 2.;
118
+ }
119
+ float crumplesShape(vec2 uv) {
120
+ return crumpledNoise(uv * .25, 16.) * crumpledNoise(uv * .5, 2.);
121
+ }
122
+
123
+
124
+ vec2 folds(vec2 uv) {
125
+ vec3 pp = vec3(0.);
126
+ float l = 9.;
127
+ for (float i = 0.; i < 15.; i++) {
128
+ if (i >= u_foldCount) break;
129
+ vec2 rand = randomGB(vec2(i, i * u_seed));
130
+ float an = rand.x * TWO_PI;
131
+ vec2 p = vec2(cos(an), sin(an)) * rand.y;
132
+ float dist = distance(uv, p);
133
+ l = min(l, dist);
134
+
135
+ if (l == dist) {
136
+ pp.xy = (uv - p.xy);
137
+ pp.z = dist;
138
+ }
139
+ }
140
+ return mix(pp.xy, vec2(0.), pow(pp.z, .25));
141
+ }
142
+
143
+ float drops(vec2 uv) {
144
+ vec2 iDropsUV = floor(uv);
145
+ vec2 fDropsUV = fract(uv);
146
+ float dropsMinDist = 1.;
147
+ for (int j = -1; j <= 1; j++) {
148
+ for (int i = -1; i <= 1; i++) {
149
+ vec2 neighbor = vec2(float(i), float(j));
150
+ vec2 offset = randomGB(iDropsUV + neighbor);
151
+ offset = .5 + .5 * sin(10. * u_seed + TWO_PI * offset);
152
+ vec2 pos = neighbor + offset - fDropsUV;
153
+ float dist = length(pos);
154
+ dropsMinDist = min(dropsMinDist, dropsMinDist*dist);
155
+ }
156
+ }
157
+ return 1. - smoothstep(.05, .09, pow(dropsMinDist, .5));
158
+ }
159
+
160
+ float lst(float edge0, float edge1, float x) {
161
+ return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
162
+ }
163
+
164
+ void main() {
165
+
166
+ vec2 imageUV = v_imageUV;
167
+ vec2 patternUV = v_imageUV - .5;
168
+ patternUV = 5. * (patternUV * vec2(u_imageAspectRatio, 1.));
169
+
170
+ vec2 roughnessUv = 1.5 * (gl_FragCoord.xy - .5 * u_resolution) / u_pixelRatio;
171
+ float roughness = roughness(roughnessUv + vec2(1., 0.)) - roughness(roughnessUv - vec2(1., 0.));
172
+
173
+ vec2 crumplesUV = fract(patternUV * .02 / u_crumpleSize - u_seed) * 32.;
174
+ float crumples = u_crumples * (crumplesShape(crumplesUV + vec2(.05, 0.)) - crumplesShape(crumplesUV));
175
+
176
+ vec2 fiberUV = 2. / u_fiberSize * patternUV;
177
+ float fiber = fiberNoise(fiberUV, vec2(0.));
178
+ fiber = .5 * u_fiber * (fiber - 1.);
179
+
180
+ vec2 normal = vec2(0.);
181
+ vec2 normalImage = vec2(0.);
182
+
183
+ vec2 foldsUV = patternUV * .12;
184
+ foldsUV = rotate(foldsUV, 4. * u_seed);
185
+ vec2 w = folds(foldsUV);
186
+ foldsUV = rotate(foldsUV + .007 * cos(u_seed), .01 * sin(u_seed));
187
+ vec2 w2 = folds(foldsUV);
188
+
189
+ float drops = u_drops * drops(patternUV * 2.);
190
+
191
+ float fade = u_fade * fbm(.17 * patternUV + 10. * u_seed);
192
+ fade = clamp(8. * fade * fade * fade, 0., 1.);
193
+
194
+ w = mix(w, vec2(0.), fade);
195
+ w2 = mix(w2, vec2(0.), fade);
196
+ crumples = mix(crumples, 0., fade);
197
+ drops = mix(drops, 0., fade);
198
+ fiber *= mix(1., .5, fade);
199
+ roughness *= mix(1., .5, fade);
200
+
201
+ normal.xy += u_folds * min(5. * u_contrast, 1.) * 4. * max(vec2(0.), w + w2);
202
+ normalImage.xy += u_folds * 2. * w;
203
+
204
+ normal.xy += crumples;
205
+ normalImage.xy += 1.5 * crumples;
206
+
207
+ normal.xy += 3. * drops;
208
+ normalImage.xy += .2 * drops;
209
+
210
+ normal.xy += u_roughness * 1.5 * roughness;
211
+ normal.xy += fiber;
212
+
213
+ normalImage += u_roughness * .75 * roughness;
214
+ normalImage += .2 * fiber;
215
+
216
+ vec3 lightPos = vec3(1., 2., 1.);
217
+ float res = dot(normalize(vec3(normal, 9.5 - 9. * pow(u_contrast, .1))), normalize(lightPos));
218
+
219
+ vec3 fgColor = u_colorFront.rgb * u_colorFront.a;
220
+ float fgOpacity = u_colorFront.a;
221
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
222
+ float bgOpacity = u_colorBack.a;
223
+
224
+ imageUV += .02 * normalImage;
225
+ float frame = getUvFrame(imageUV);
226
+ vec4 image = texture(u_image, imageUV);
227
+ image.rgb += .6 * pow(u_contrast, .4) * (res - .7);
228
+
229
+ frame *= image.a;
230
+
231
+ vec3 color = fgColor * res;
232
+ float opacity = fgOpacity * res;
233
+
234
+ color += bgColor * (1. - opacity);
235
+ opacity += bgOpacity * (1. - opacity);
236
+ opacity = mix(opacity, 1., frame);
237
+
238
+ color -= .007 * drops;
239
+
240
+ color.rgb = mix(color, image.rgb, frame);
241
+
242
+ fragColor = vec4(color, opacity);
243
+ }
244
+ `;
245
+ export {
246
+ paperTextureFragmentShader
247
+ };
248
+ //# sourceMappingURL=paper-texture.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/paper-texture.ts"],
4
+ "sourcesContent": ["import type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { rotation2, declarePI, fiberNoise, textureRandomizerR } from '../shader-utils.js';\n\n/**\n * Mimicking paper texture with a combination of noises\n *\n * Uniforms:\n * - u_colorFront, u_colorBack (RGBA)\n * - u_contrast - mixing front and back colors\n * - u_roughness - pixel noise, related to canvas => not scalable\n * - u_fiber, u_fiberSize - curly shaped noise\n * - u_crumples, u_crumpleSize - cell-based pattern\n * - u_folds, u_foldCount - lines pattern, 15 max\n * - u_drops - metaballs-like pattern\n * - u_seed - applied to folds, crumples and dots\n * - u_fade - big-scale noise mask applied to everything but roughness\n *\n * - u_noiseTexture (sampler2D): pre-computed randomizer source\n *\n */\n\n// language=GLSL\nexport const paperTextureFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform vec2 u_resolution;\nuniform float u_pixelRatio;\n\nuniform vec4 u_colorFront;\nuniform vec4 u_colorBack;\n\nuniform sampler2D u_image;\nuniform float u_imageAspectRatio;\n\nuniform float u_contrast;\nuniform float u_roughness;\nuniform float u_fiber;\nuniform float u_fiberSize;\nuniform float u_crumples;\nuniform float u_crumpleSize;\nuniform float u_folds;\nuniform float u_foldCount;\nuniform float u_drops;\nuniform float u_seed;\nuniform float u_fade;\n\nuniform sampler2D u_noiseTexture;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\nfloat getUvFrame(vec2 uv) {\n float aax = 2. * fwidth(uv.x);\n float aay = 2. * fwidth(uv.y);\n\n float left = smoothstep(0., aax, uv.x);\n float right = 1. - smoothstep(1. - aax, 1., uv.x);\n float bottom = smoothstep(0., aay, uv.y);\n float top = 1. - smoothstep(1. - aay, 1., uv.y);\n\n return left * right * bottom * top;\n}\n\n${declarePI}\n${rotation2}\n${textureRandomizerR}\nfloat valueNoise(vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n float a = randomR(i);\n float b = randomR(i + vec2(1.0, 0.0));\n float c = randomR(i + vec2(0.0, 1.0));\n float d = randomR(i + vec2(1.0, 1.0));\n vec2 u = f * f * (3.0 - 2.0 * f);\n float x1 = mix(a, b, u.x);\n float x2 = mix(c, d, u.x);\n return mix(x1, x2, u.y);\n}\nfloat fbm(vec2 n) {\n float total = 0.0, amplitude = .4;\n for (int i = 0; i < 3; i++) {\n total += valueNoise(n) * amplitude;\n n *= 1.99;\n amplitude *= 0.65;\n }\n return total;\n}\n\n\nfloat randomG(vec2 p) {\n vec2 uv = floor(p) / 50. + .5;\n return texture(u_noiseTexture, fract(uv)).g;\n}\nfloat roughness(vec2 p) {\n p *= .1;\n float o = 0.;\n for (float i = 0.; ++i < 4.; p *= 2.1) {\n vec4 w = vec4(floor(p), ceil(p));\n vec2 f = fract(p);\n o += mix(\n mix(randomG(w.xy), randomG(w.xw), f.y),\n mix(randomG(w.zy), randomG(w.zw), f.y),\n f.x);\n o += .2 / exp(2. * abs(sin(.2 * p.x + .5 * p.y)));\n }\n return o / 3.;\n}\n\n${fiberNoise}\n\nvec2 randomGB(vec2 p) {\n vec2 uv = floor(p) / 50. + .5;\n return texture(u_noiseTexture, fract(uv)).gb;\n}\nfloat crumpledNoise(vec2 t, float pw) {\n vec2 p = floor(t);\n float wsum = 0.;\n float cl = 0.;\n for (int y = -1; y < 2; y += 1) {\n for (int x = -1; x < 2; x += 1) {\n vec2 b = vec2(float(x), float(y));\n vec2 q = b + p;\n vec2 q2 = q - floor(q / 8.) * 8.;\n vec2 c = q + randomGB(q2);\n vec2 r = c - t;\n float w = pow(smoothstep(0., 1., 1. - abs(r.x)), pw) * pow(smoothstep(0., 1., 1. - abs(r.y)), pw);\n cl += (.5 + .5 * sin((q2.x + q2.y * 5.) * 8.)) * w;\n wsum += w;\n }\n }\n return pow(wsum != 0.0 ? cl / wsum : 0.0, .5) * 2.;\n}\nfloat crumplesShape(vec2 uv) {\n return crumpledNoise(uv * .25, 16.) * crumpledNoise(uv * .5, 2.);\n}\n\n\nvec2 folds(vec2 uv) {\n vec3 pp = vec3(0.);\n float l = 9.;\n for (float i = 0.; i < 15.; i++) {\n if (i >= u_foldCount) break;\n vec2 rand = randomGB(vec2(i, i * u_seed));\n float an = rand.x * TWO_PI;\n vec2 p = vec2(cos(an), sin(an)) * rand.y;\n float dist = distance(uv, p);\n l = min(l, dist);\n\n if (l == dist) {\n pp.xy = (uv - p.xy);\n pp.z = dist;\n }\n }\n return mix(pp.xy, vec2(0.), pow(pp.z, .25));\n}\n\nfloat drops(vec2 uv) {\n vec2 iDropsUV = floor(uv);\n vec2 fDropsUV = fract(uv);\n float dropsMinDist = 1.;\n for (int j = -1; j <= 1; j++) {\n for (int i = -1; i <= 1; i++) {\n vec2 neighbor = vec2(float(i), float(j));\n vec2 offset = randomGB(iDropsUV + neighbor);\n offset = .5 + .5 * sin(10. * u_seed + TWO_PI * offset);\n vec2 pos = neighbor + offset - fDropsUV;\n float dist = length(pos);\n dropsMinDist = min(dropsMinDist, dropsMinDist*dist);\n }\n }\n return 1. - smoothstep(.05, .09, pow(dropsMinDist, .5));\n}\n\nfloat lst(float edge0, float edge1, float x) {\n return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n}\n\nvoid main() {\n\n vec2 imageUV = v_imageUV;\n vec2 patternUV = v_imageUV - .5;\n patternUV = 5. * (patternUV * vec2(u_imageAspectRatio, 1.));\n\n vec2 roughnessUv = 1.5 * (gl_FragCoord.xy - .5 * u_resolution) / u_pixelRatio;\n float roughness = roughness(roughnessUv + vec2(1., 0.)) - roughness(roughnessUv - vec2(1., 0.));\n\n vec2 crumplesUV = fract(patternUV * .02 / u_crumpleSize - u_seed) * 32.;\n float crumples = u_crumples * (crumplesShape(crumplesUV + vec2(.05, 0.)) - crumplesShape(crumplesUV));\n\n vec2 fiberUV = 2. / u_fiberSize * patternUV;\n float fiber = fiberNoise(fiberUV, vec2(0.));\n fiber = .5 * u_fiber * (fiber - 1.);\n\n vec2 normal = vec2(0.);\n vec2 normalImage = vec2(0.);\n\n vec2 foldsUV = patternUV * .12;\n foldsUV = rotate(foldsUV, 4. * u_seed);\n vec2 w = folds(foldsUV);\n foldsUV = rotate(foldsUV + .007 * cos(u_seed), .01 * sin(u_seed));\n vec2 w2 = folds(foldsUV);\n\n float drops = u_drops * drops(patternUV * 2.);\n\n float fade = u_fade * fbm(.17 * patternUV + 10. * u_seed);\n fade = clamp(8. * fade * fade * fade, 0., 1.);\n\n w = mix(w, vec2(0.), fade);\n w2 = mix(w2, vec2(0.), fade);\n crumples = mix(crumples, 0., fade);\n drops = mix(drops, 0., fade);\n fiber *= mix(1., .5, fade);\n roughness *= mix(1., .5, fade);\n\n normal.xy += u_folds * min(5. * u_contrast, 1.) * 4. * max(vec2(0.), w + w2);\n normalImage.xy += u_folds * 2. * w;\n\n normal.xy += crumples;\n normalImage.xy += 1.5 * crumples;\n\n normal.xy += 3. * drops;\n normalImage.xy += .2 * drops;\n\n normal.xy += u_roughness * 1.5 * roughness;\n normal.xy += fiber;\n\n normalImage += u_roughness * .75 * roughness;\n normalImage += .2 * fiber;\n\n vec3 lightPos = vec3(1., 2., 1.);\n float res = dot(normalize(vec3(normal, 9.5 - 9. * pow(u_contrast, .1))), normalize(lightPos));\n\n vec3 fgColor = u_colorFront.rgb * u_colorFront.a;\n float fgOpacity = u_colorFront.a;\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n float bgOpacity = u_colorBack.a;\n\n imageUV += .02 * normalImage;\n float frame = getUvFrame(imageUV);\n vec4 image = texture(u_image, imageUV);\n image.rgb += .6 * pow(u_contrast, .4) * (res - .7);\n\n frame *= image.a;\n\n vec3 color = fgColor * res;\n float opacity = fgOpacity * res;\n\n color += bgColor * (1. - opacity);\n opacity += bgOpacity * (1. - opacity);\n opacity = mix(opacity, 1., frame);\n\n color -= .007 * drops;\n\n color.rgb = mix(color, image.rgb, frame);\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface PaperTextureUniforms extends ShaderSizingUniforms {\n u_image: HTMLImageElement | string | undefined;\n u_noiseTexture?: HTMLImageElement;\n u_colorFront: [number, number, number, number];\n u_colorBack: [number, number, number, number];\n u_contrast: number;\n u_roughness: number;\n u_fiber: number;\n u_fiberSize: number;\n u_crumples: number;\n u_foldCount: number;\n u_folds: number;\n u_fade: number;\n u_crumpleSize: number;\n u_drops: number;\n u_seed: number;\n}\n\nexport interface PaperTextureParams extends ShaderSizingParams, ShaderMotionParams {\n image?: HTMLImageElement | string;\n colorFront?: string;\n colorBack?: string;\n contrast?: number;\n roughness?: number;\n fiber?: number;\n fiberSize?: number;\n crumples?: number;\n foldCount?: number;\n folds?: number;\n fade?: number;\n crumpleSize?: number;\n drops?: number;\n seed?: number;\n}\n"],
5
+ "mappings": ";;;;;AACA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,WAAW,YAAY,0BAA0B;AAqB9D,MAAM,6BAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BhD,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB1B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2ClB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,33 @@
1
+ import type { ShaderMotionParams } from '../shader-mount.js';
2
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
3
+ /**
4
+ * 3d Perlin noise; original algorithm: https://www.shadertoy.com/view/NlSGDz
5
+ *
6
+ * Uniforms:
7
+ * - u_colorBack, u_colorFront (RGBA)
8
+ * - u_proportion: (0..1) blend point between 2 colors (0.5 = equal distribution)
9
+ * - u_softness: color transition sharpness (0 = hard edge, 1 = smooth fade)
10
+ * - u_octaveCount: more octaves => more detailed pattern
11
+ * - u_persistence: roughness, falloff between octaves
12
+ * - u_lacunarity: frequency step, typically around 2, defines how compressed is the pattern
13
+ *
14
+ */
15
+ export declare const perlinNoiseFragmentShader: string;
16
+ export interface PerlinNoiseUniforms extends ShaderSizingUniforms {
17
+ u_colorFront: [number, number, number, number];
18
+ u_colorBack: [number, number, number, number];
19
+ u_proportion: number;
20
+ u_softness: number;
21
+ u_octaveCount: number;
22
+ u_persistence: number;
23
+ u_lacunarity: number;
24
+ }
25
+ export interface PerlinNoiseParams extends ShaderSizingParams, ShaderMotionParams {
26
+ colorFront?: string;
27
+ colorBack?: string;
28
+ proportion?: number;
29
+ softness?: number;
30
+ octaveCount?: number;
31
+ persistence?: number;
32
+ lacunarity?: number;
33
+ }
@@ -0,0 +1,195 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing.js";
7
+ import { declarePI, colorBandingFix } from "../shader-utils.js";
8
+ const perlinNoiseFragmentShader = `#version 300 es
9
+ precision mediump float;
10
+
11
+ uniform float u_time;
12
+
13
+ uniform vec4 u_colorFront;
14
+ uniform vec4 u_colorBack;
15
+ uniform float u_proportion;
16
+ uniform float u_softness;
17
+ uniform float u_octaveCount;
18
+ uniform float u_persistence;
19
+ uniform float u_lacunarity;
20
+
21
+ ${sizingVariablesDeclaration}
22
+
23
+ out vec4 fragColor;
24
+
25
+ ${declarePI}
26
+
27
+ float hash11(float p) {
28
+ p = fract(p * 0.3183099) + 0.1;
29
+ p *= p + 19.19;
30
+ return fract(p * p);
31
+ }
32
+
33
+ float hash21(vec2 p) {
34
+ p = fract(p * vec2(0.3183099, 0.3678794)) + 0.1;
35
+ p += dot(p, p + 19.19);
36
+ return fract(p.x * p.y);
37
+ }
38
+
39
+ float hash31(vec3 p) {
40
+ p = fract(p * 0.3183099) + 0.1;
41
+ p += dot(p, p.yzx + 19.19);
42
+ return fract(p.x * (p.y + p.z));
43
+ }
44
+
45
+ vec3 hash33(vec3 p) {
46
+ p = fract(p * 0.3183099) + 0.1;
47
+ p += dot(p, p.yzx + 19.19);
48
+ return fract(vec3(p.x * p.y, p.y * p.z, p.z * p.x));
49
+ }
50
+
51
+ vec3 gradientSafe(vec3 p) {
52
+ vec3 h = hash33(p) * 2.0 - 1.;
53
+ return normalize(h + 0.001);
54
+ }
55
+
56
+ vec3 gradientPredefined(float hash) {
57
+ int idx = int(hash * 12.0) % 12;
58
+
59
+ if (idx == 0) return vec3(1, 1, 0);
60
+ if (idx == 1) return vec3(-1, 1, 0);
61
+ if (idx == 2) return vec3(1, -1, 0);
62
+ if (idx == 3) return vec3(-1, -1, 0);
63
+ if (idx == 4) return vec3(1, 0, 1);
64
+ if (idx == 5) return vec3(-1, 0, 1);
65
+ if (idx == 6) return vec3(1, 0, -1);
66
+ if (idx == 7) return vec3(-1, 0, -1);
67
+ if (idx == 8) return vec3(0, 1, 1);
68
+ if (idx == 9) return vec3(0, -1, 1);
69
+ if (idx == 10) return vec3(0, 1, -1);
70
+ return vec3(0, -1, -1);// idx == 11
71
+ }
72
+
73
+ float interpolateSafe(float v000, float v001, float v010, float v011,
74
+ float v100, float v101, float v110, float v111, vec3 t) {
75
+ t = clamp(t, 0.0, 1.0);
76
+
77
+ float v00 = mix(v000, v100, t.x);
78
+ float v01 = mix(v001, v101, t.x);
79
+ float v10 = mix(v010, v110, t.x);
80
+ float v11 = mix(v011, v111, t.x);
81
+
82
+ float v0 = mix(v00, v10, t.y);
83
+ float v1 = mix(v01, v11, t.y);
84
+
85
+ return mix(v0, v1, t.z);
86
+ }
87
+
88
+ vec3 fade(vec3 t) {
89
+ return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
90
+ }
91
+
92
+ float perlinNoise(vec3 position, float seed) {
93
+ position += vec3(seed * 127.1, seed * 311.7, seed * 74.7);
94
+
95
+ vec3 i = floor(position);
96
+ vec3 f = fract(position);
97
+ float h000 = hash31(i);
98
+ float h001 = hash31(i + vec3(0, 0, 1));
99
+ float h010 = hash31(i + vec3(0, 1, 0));
100
+ float h011 = hash31(i + vec3(0, 1, 1));
101
+ float h100 = hash31(i + vec3(1, 0, 0));
102
+ float h101 = hash31(i + vec3(1, 0, 1));
103
+ float h110 = hash31(i + vec3(1, 1, 0));
104
+ float h111 = hash31(i + vec3(1, 1, 1));
105
+ vec3 g000 = gradientPredefined(h000);
106
+ vec3 g001 = gradientPredefined(h001);
107
+ vec3 g010 = gradientPredefined(h010);
108
+ vec3 g011 = gradientPredefined(h011);
109
+ vec3 g100 = gradientPredefined(h100);
110
+ vec3 g101 = gradientPredefined(h101);
111
+ vec3 g110 = gradientPredefined(h110);
112
+ vec3 g111 = gradientPredefined(h111);
113
+ float v000 = dot(g000, f - vec3(0, 0, 0));
114
+ float v001 = dot(g001, f - vec3(0, 0, 1));
115
+ float v010 = dot(g010, f - vec3(0, 1, 0));
116
+ float v011 = dot(g011, f - vec3(0, 1, 1));
117
+ float v100 = dot(g100, f - vec3(1, 0, 0));
118
+ float v101 = dot(g101, f - vec3(1, 0, 1));
119
+ float v110 = dot(g110, f - vec3(1, 1, 0));
120
+ float v111 = dot(g111, f - vec3(1, 1, 1));
121
+
122
+ vec3 u = fade(f);
123
+ return interpolateSafe(v000, v001, v010, v011, v100, v101, v110, v111, u);
124
+ }
125
+
126
+ float p_noise(vec3 position, int octaveCount, float persistence, float lacunarity) {
127
+ float value = 0.0;
128
+ float amplitude = 1.0;
129
+ float frequency = 10.0;
130
+ float maxValue = 0.0;
131
+ octaveCount = clamp(octaveCount, 1, 8);
132
+
133
+ for (int i = 0; i < octaveCount; i++) {
134
+ float seed = float(i) * 0.7319;
135
+ value += perlinNoise(position * frequency, seed) * amplitude;
136
+ maxValue += amplitude;
137
+ amplitude *= persistence;
138
+ frequency *= lacunarity;
139
+ }
140
+ return value;
141
+ }
142
+
143
+ float get_max_amp(float persistence, float octaveCount) {
144
+ persistence = clamp(persistence * 0.999, 0.0, 0.999);
145
+ octaveCount = clamp(octaveCount, 1.0, 8.0);
146
+
147
+ if (abs(persistence - 1.0) < 0.001) {
148
+ return octaveCount;
149
+ }
150
+
151
+ return (1.0 - pow(persistence, octaveCount)) / max(1e-4, (1.0 - persistence));
152
+ }
153
+
154
+ void main() {
155
+ vec2 uv = v_patternUV;
156
+ uv *= .5;
157
+
158
+ float t = .2 * u_time;
159
+
160
+ vec3 p = vec3(uv, t);
161
+
162
+ float octCount = clamp(floor(u_octaveCount), 1.0, 8.0);
163
+ float persistence = clamp(u_persistence, 0., 1.);
164
+ float noise = p_noise(p, int(octCount), persistence, u_lacunarity);
165
+
166
+ float max_amp = get_max_amp(persistence, octCount);
167
+ float noise_normalized = clamp((noise + max_amp) / max(1e-4, (2. * max_amp)) + (u_proportion - .5), 0.0, 1.0);
168
+ float sharpness = clamp(u_softness, 0., 1.);
169
+ float smooth_w = 0.5 * max(fwidth(noise_normalized), 0.001);
170
+ float res = smoothstep(
171
+ .5 - .5 * sharpness - smooth_w,
172
+ .5 + .5 * sharpness + smooth_w,
173
+ noise_normalized
174
+ );
175
+
176
+ vec3 fgColor = u_colorFront.rgb * u_colorFront.a;
177
+ float fgOpacity = u_colorFront.a;
178
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
179
+ float bgOpacity = u_colorBack.a;
180
+
181
+ vec3 color = fgColor * res;
182
+ float opacity = fgOpacity * res;
183
+
184
+ color += bgColor * (1. - opacity);
185
+ opacity += bgOpacity * (1. - opacity);
186
+
187
+ ${colorBandingFix}
188
+
189
+ fragColor = vec4(color, opacity);
190
+ }
191
+ `;
192
+ export {
193
+ perlinNoiseFragmentShader
194
+ };
195
+ //# sourceMappingURL=perlin-noise.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/perlin-noise.ts"],
4
+ "sourcesContent": ["import type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, colorBandingFix } from '../shader-utils.js';\n\n/**\n * 3d Perlin noise; original algorithm: https://www.shadertoy.com/view/NlSGDz\n *\n * Uniforms:\n * - u_colorBack, u_colorFront (RGBA)\n * - u_proportion: (0..1) blend point between 2 colors (0.5 = equal distribution)\n * - u_softness: color transition sharpness (0 = hard edge, 1 = smooth fade)\n * - u_octaveCount: more octaves => more detailed pattern\n * - u_persistence: roughness, falloff between octaves\n * - u_lacunarity: frequency step, typically around 2, defines how compressed is the pattern\n *\n */\n\n// language=GLSL\nexport const perlinNoiseFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorFront;\nuniform vec4 u_colorBack;\nuniform float u_proportion;\nuniform float u_softness;\nuniform float u_octaveCount;\nuniform float u_persistence;\nuniform float u_lacunarity;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n\nfloat hash11(float p) {\n p = fract(p * 0.3183099) + 0.1;\n p *= p + 19.19;\n return fract(p * p);\n}\n\nfloat hash21(vec2 p) {\n p = fract(p * vec2(0.3183099, 0.3678794)) + 0.1;\n p += dot(p, p + 19.19);\n return fract(p.x * p.y);\n}\n\nfloat hash31(vec3 p) {\n p = fract(p * 0.3183099) + 0.1;\n p += dot(p, p.yzx + 19.19);\n return fract(p.x * (p.y + p.z));\n}\n\nvec3 hash33(vec3 p) {\n p = fract(p * 0.3183099) + 0.1;\n p += dot(p, p.yzx + 19.19);\n return fract(vec3(p.x * p.y, p.y * p.z, p.z * p.x));\n}\n\nvec3 gradientSafe(vec3 p) {\n vec3 h = hash33(p) * 2.0 - 1.;\n return normalize(h + 0.001);\n}\n\nvec3 gradientPredefined(float hash) {\n int idx = int(hash * 12.0) % 12;\n\n if (idx == 0) return vec3(1, 1, 0);\n if (idx == 1) return vec3(-1, 1, 0);\n if (idx == 2) return vec3(1, -1, 0);\n if (idx == 3) return vec3(-1, -1, 0);\n if (idx == 4) return vec3(1, 0, 1);\n if (idx == 5) return vec3(-1, 0, 1);\n if (idx == 6) return vec3(1, 0, -1);\n if (idx == 7) return vec3(-1, 0, -1);\n if (idx == 8) return vec3(0, 1, 1);\n if (idx == 9) return vec3(0, -1, 1);\n if (idx == 10) return vec3(0, 1, -1);\n return vec3(0, -1, -1);// idx == 11\n}\n\nfloat interpolateSafe(float v000, float v001, float v010, float v011,\nfloat v100, float v101, float v110, float v111, vec3 t) {\n t = clamp(t, 0.0, 1.0);\n\n float v00 = mix(v000, v100, t.x);\n float v01 = mix(v001, v101, t.x);\n float v10 = mix(v010, v110, t.x);\n float v11 = mix(v011, v111, t.x);\n\n float v0 = mix(v00, v10, t.y);\n float v1 = mix(v01, v11, t.y);\n\n return mix(v0, v1, t.z);\n}\n\nvec3 fade(vec3 t) {\n return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n\nfloat perlinNoise(vec3 position, float seed) {\n position += vec3(seed * 127.1, seed * 311.7, seed * 74.7);\n\n vec3 i = floor(position);\n vec3 f = fract(position);\n float h000 = hash31(i);\n float h001 = hash31(i + vec3(0, 0, 1));\n float h010 = hash31(i + vec3(0, 1, 0));\n float h011 = hash31(i + vec3(0, 1, 1));\n float h100 = hash31(i + vec3(1, 0, 0));\n float h101 = hash31(i + vec3(1, 0, 1));\n float h110 = hash31(i + vec3(1, 1, 0));\n float h111 = hash31(i + vec3(1, 1, 1));\n vec3 g000 = gradientPredefined(h000);\n vec3 g001 = gradientPredefined(h001);\n vec3 g010 = gradientPredefined(h010);\n vec3 g011 = gradientPredefined(h011);\n vec3 g100 = gradientPredefined(h100);\n vec3 g101 = gradientPredefined(h101);\n vec3 g110 = gradientPredefined(h110);\n vec3 g111 = gradientPredefined(h111);\n float v000 = dot(g000, f - vec3(0, 0, 0));\n float v001 = dot(g001, f - vec3(0, 0, 1));\n float v010 = dot(g010, f - vec3(0, 1, 0));\n float v011 = dot(g011, f - vec3(0, 1, 1));\n float v100 = dot(g100, f - vec3(1, 0, 0));\n float v101 = dot(g101, f - vec3(1, 0, 1));\n float v110 = dot(g110, f - vec3(1, 1, 0));\n float v111 = dot(g111, f - vec3(1, 1, 1));\n\n vec3 u = fade(f);\n return interpolateSafe(v000, v001, v010, v011, v100, v101, v110, v111, u);\n}\n\nfloat p_noise(vec3 position, int octaveCount, float persistence, float lacunarity) {\n float value = 0.0;\n float amplitude = 1.0;\n float frequency = 10.0;\n float maxValue = 0.0;\n octaveCount = clamp(octaveCount, 1, 8);\n\n for (int i = 0; i < octaveCount; i++) {\n float seed = float(i) * 0.7319;\n value += perlinNoise(position * frequency, seed) * amplitude;\n maxValue += amplitude;\n amplitude *= persistence;\n frequency *= lacunarity;\n }\n return value;\n}\n\nfloat get_max_amp(float persistence, float octaveCount) {\n persistence = clamp(persistence * 0.999, 0.0, 0.999);\n octaveCount = clamp(octaveCount, 1.0, 8.0);\n\n if (abs(persistence - 1.0) < 0.001) {\n return octaveCount;\n }\n\n return (1.0 - pow(persistence, octaveCount)) / max(1e-4, (1.0 - persistence));\n}\n\nvoid main() {\n vec2 uv = v_patternUV;\n uv *= .5;\n \n float t = .2 * u_time;\n\n vec3 p = vec3(uv, t);\n\n float octCount = clamp(floor(u_octaveCount), 1.0, 8.0);\n float persistence = clamp(u_persistence, 0., 1.);\n float noise = p_noise(p, int(octCount), persistence, u_lacunarity);\n\n float max_amp = get_max_amp(persistence, octCount);\n float noise_normalized = clamp((noise + max_amp) / max(1e-4, (2. * max_amp)) + (u_proportion - .5), 0.0, 1.0);\n float sharpness = clamp(u_softness, 0., 1.);\n float smooth_w = 0.5 * max(fwidth(noise_normalized), 0.001);\n float res = smoothstep(\n .5 - .5 * sharpness - smooth_w,\n .5 + .5 * sharpness + smooth_w,\n noise_normalized\n );\n\n vec3 fgColor = u_colorFront.rgb * u_colorFront.a;\n float fgOpacity = u_colorFront.a;\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n float bgOpacity = u_colorBack.a;\n\n vec3 color = fgColor * res;\n float opacity = fgOpacity * res;\n\n color += bgColor * (1. - opacity);\n opacity += bgOpacity * (1. - opacity);\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface PerlinNoiseUniforms extends ShaderSizingUniforms {\n u_colorFront: [number, number, number, number];\n u_colorBack: [number, number, number, number];\n u_proportion: number;\n u_softness: number;\n u_octaveCount: number;\n u_persistence: number;\n u_lacunarity: number;\n}\n\nexport interface PerlinNoiseParams extends ShaderSizingParams, ShaderMotionParams {\n colorFront?: string;\n colorBack?: string;\n proportion?: number;\n softness?: number;\n octaveCount?: number;\n persistence?: number;\n lacunarity?: number;\n}\n"],
5
+ "mappings": ";;;;;AACA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,uBAAuB;AAgBpC,MAAM,4BAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa/C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkKP,eAAe;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 pulsingBorderMeta: {
5
+ readonly maxColorCount: 5;
6
+ readonly maxSpots: 4;
7
+ };
8
+ /**
9
+ * Color spots traveling around rectangular stroke (border)
10
+ *
11
+ * Uniforms:
12
+ * - u_colorBack (RGBA)
13
+ * - u_colors (vec4[]), u_colorsCount (float used as integer)
14
+ * - u_roundness, u_thickness, u_softness: border parameters
15
+ * - u_aspectRatio
16
+ * - u_intensity: thickness of individual spots
17
+ * - u_bloom: normal / additive color blending
18
+ * - u_spotSize: angular size of spots
19
+ * - u_spots (float used as int): number of spots rendered per color
20
+ * - u_pulse: optional pulsing animation
21
+ * - u_smoke, u_smokeSize: optional noisy shapes around the border
22
+ *
23
+ * - u_noiseTexture (sampler2D): pre-computed randomizer source
24
+ *
25
+ */
26
+ export declare const pulsingBorderFragmentShader: string;
27
+ export interface PulsingBorderUniforms extends ShaderSizingUniforms {
28
+ u_colorBack: [number, number, number, number];
29
+ u_colors: vec4[];
30
+ u_colorsCount: number;
31
+ u_roundness: number;
32
+ u_thickness: number;
33
+ u_marginLeft: number;
34
+ u_marginRight: number;
35
+ u_marginTop: number;
36
+ u_marginBottom: number;
37
+ u_aspectRatio: (typeof PulsingBorderAspectRatios)[PulsingBorderAspectRatio];
38
+ u_softness: number;
39
+ u_intensity: number;
40
+ u_bloom: number;
41
+ u_spots: number;
42
+ u_spotSize: number;
43
+ u_pulse: number;
44
+ u_smoke: number;
45
+ u_smokeSize: number;
46
+ u_noiseTexture?: HTMLImageElement;
47
+ }
48
+ export interface PulsingBorderParams extends ShaderSizingParams, ShaderMotionParams {
49
+ colorBack?: string;
50
+ colors?: string[];
51
+ roundness?: number;
52
+ thickness?: number;
53
+ margin?: number;
54
+ marginLeft?: number;
55
+ marginRight?: number;
56
+ marginTop?: number;
57
+ marginBottom?: number;
58
+ aspectRatio?: PulsingBorderAspectRatio;
59
+ softness?: number;
60
+ intensity?: number;
61
+ bloom?: number;
62
+ spots?: number;
63
+ spotSize?: number;
64
+ pulse?: number;
65
+ smoke?: number;
66
+ smokeSize?: number;
67
+ }
68
+ export declare const PulsingBorderAspectRatios: {
69
+ readonly auto: 0;
70
+ readonly square: 1;
71
+ };
72
+ export type PulsingBorderAspectRatio = keyof typeof PulsingBorderAspectRatios;