@paper-design/shaders 0.0.30 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/dist/index.d.ts +25 -23
- package/dist/index.js +35 -22
- package/dist/index.js.map +2 -2
- package/dist/shaders/color-panels.d.ts +48 -0
- package/dist/shaders/color-panels.js +213 -0
- package/dist/shaders/color-panels.js.map +7 -0
- package/dist/shaders/dithering.d.ts +8 -8
- package/dist/shaders/dithering.js +15 -7
- package/dist/shaders/dithering.js.map +2 -2
- package/dist/shaders/dot-grid.d.ts +1 -1
- package/dist/shaders/dot-grid.js +4 -4
- package/dist/shaders/dot-grid.js.map +1 -1
- package/dist/shaders/dot-orbit.d.ts +6 -3
- package/dist/shaders/dot-orbit.js +14 -10
- package/dist/shaders/dot-orbit.js.map +2 -2
- package/dist/shaders/god-rays.d.ts +9 -6
- package/dist/shaders/god-rays.js +15 -16
- package/dist/shaders/god-rays.js.map +2 -2
- package/dist/shaders/grain-gradient.d.ts +5 -3
- package/dist/shaders/grain-gradient.js +50 -36
- package/dist/shaders/grain-gradient.js.map +2 -2
- package/dist/shaders/liquid-metal.d.ts +27 -12
- package/dist/shaders/liquid-metal.js +63 -66
- package/dist/shaders/liquid-metal.js.map +2 -2
- package/dist/shaders/mesh-gradient.d.ts +3 -3
- package/dist/shaders/mesh-gradient.js +6 -6
- package/dist/shaders/mesh-gradient.js.map +1 -1
- package/dist/shaders/metaballs.d.ts +6 -3
- package/dist/shaders/metaballs.js +11 -10
- package/dist/shaders/metaballs.js.map +2 -2
- package/dist/shaders/neuro-noise.d.ts +12 -6
- package/dist/shaders/neuro-noise.js +26 -11
- package/dist/shaders/neuro-noise.js.map +2 -2
- package/dist/shaders/perlin-noise.d.ts +10 -10
- package/dist/shaders/perlin-noise.js +29 -21
- package/dist/shaders/perlin-noise.js.map +2 -2
- package/dist/shaders/pulsing-border.d.ts +3 -3
- package/dist/shaders/pulsing-border.js +25 -25
- package/dist/shaders/pulsing-border.js.map +1 -1
- package/dist/shaders/simplex-noise.d.ts +3 -3
- package/dist/shaders/simplex-noise.js +12 -12
- package/dist/shaders/simplex-noise.js.map +1 -1
- package/dist/shaders/smoke-ring.d.ts +3 -3
- package/dist/shaders/smoke-ring.js +6 -6
- package/dist/shaders/smoke-ring.js.map +1 -1
- package/dist/shaders/spiral.d.ts +8 -8
- package/dist/shaders/spiral.js +15 -7
- package/dist/shaders/spiral.js.map +2 -2
- package/dist/shaders/swirl.d.ts +5 -3
- package/dist/shaders/swirl.js +29 -18
- package/dist/shaders/swirl.js.map +2 -2
- package/dist/shaders/voronoi.d.ts +8 -8
- package/dist/shaders/voronoi.js +11 -11
- package/dist/shaders/voronoi.js.map +1 -1
- package/dist/shaders/warp.d.ts +3 -3
- package/dist/shaders/warp.js +31 -27
- package/dist/shaders/warp.js.map +2 -2
- package/dist/shaders/waves.d.ts +7 -7
- package/dist/shaders/waves.js +16 -8
- package/dist/shaders/waves.js.map +2 -2
- package/package.json +1 -1
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { sizingVariablesDeclaration } from "../shader-sizing";
|
|
7
|
-
import { declareRotate, colorBandingFix } from "../shader-utils";
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declareRotate, colorBandingFix } from "../shader-utils.js";
|
|
8
8
|
const neuroNoiseFragmentShader = `#version 300 es
|
|
9
9
|
precision mediump float;
|
|
10
10
|
|
|
@@ -13,8 +13,10 @@ uniform vec2 u_resolution;
|
|
|
13
13
|
uniform float u_pixelRatio;
|
|
14
14
|
|
|
15
15
|
uniform vec4 u_colorFront;
|
|
16
|
+
uniform vec4 u_colorMid;
|
|
16
17
|
uniform vec4 u_colorBack;
|
|
17
18
|
uniform float u_brightness;
|
|
19
|
+
uniform float u_contrast;
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
${sizingVariablesDeclaration}
|
|
@@ -23,7 +25,7 @@ out vec4 fragColor;
|
|
|
23
25
|
|
|
24
26
|
${declareRotate}
|
|
25
27
|
|
|
26
|
-
float
|
|
28
|
+
float neuroShape(vec2 uv, float t) {
|
|
27
29
|
vec2 sine_acc = vec2(0.);
|
|
28
30
|
vec2 res = vec2(0.);
|
|
29
31
|
float scale = 8.;
|
|
@@ -42,19 +44,32 @@ float neuro_shape(vec2 uv, float t) {
|
|
|
42
44
|
void main() {
|
|
43
45
|
vec2 shape_uv = v_patternUV;
|
|
44
46
|
|
|
45
|
-
shape_uv *= .
|
|
47
|
+
shape_uv *= .0013;
|
|
46
48
|
|
|
47
49
|
float t = .5 * u_time;
|
|
48
50
|
|
|
49
|
-
float noise =
|
|
51
|
+
float noise = neuroShape(shape_uv, t);
|
|
50
52
|
|
|
51
|
-
noise = u_brightness * pow(noise,
|
|
52
|
-
noise
|
|
53
|
-
noise =
|
|
53
|
+
noise = (1. + u_brightness) * pow(noise, 2.);
|
|
54
|
+
noise = pow(noise, .7 + 6. * u_contrast);
|
|
55
|
+
noise = min(1.4, noise);
|
|
56
|
+
|
|
57
|
+
float blend = smoothstep(0.7, 1.4, noise);
|
|
58
|
+
|
|
59
|
+
vec4 frontC = u_colorFront;
|
|
60
|
+
frontC.rgb *= frontC.a;
|
|
61
|
+
vec4 midC = u_colorMid;
|
|
62
|
+
midC.rgb *= midC.a;
|
|
63
|
+
vec4 blendFront = mix(midC, frontC, blend);
|
|
64
|
+
|
|
65
|
+
float safeNoise = max(noise, 0.0);
|
|
66
|
+
vec3 color = blendFront.rgb * safeNoise;
|
|
67
|
+
float opacity = clamp(blendFront.a * safeNoise, 0., 1.);
|
|
68
|
+
|
|
69
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
70
|
+
color = color + bgColor * (1. - opacity);
|
|
71
|
+
opacity = opacity + u_colorBack.a * (1. - opacity);
|
|
54
72
|
|
|
55
|
-
vec3 color = mix(u_colorBack.rgb * u_colorBack.a, u_colorFront.rgb * u_colorFront.a, noise);
|
|
56
|
-
float opacity = mix(u_colorBack.a, u_colorFront.a, noise);
|
|
57
|
-
|
|
58
73
|
${colorBandingFix}
|
|
59
74
|
|
|
60
75
|
fragColor = vec4(color, opacity);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/neuro-noise.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declareRotate, colorBandingFix } from '../shader-utils';\n\n/**\n * Neuro Noise Pattern\n *
|
|
5
|
-
"mappings": ";;;;;AACA,SAAS,kCAAsF;AAC/F,SAAS,eAAe,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declareRotate, colorBandingFix } from '../shader-utils.js';\n\n/**\n * Neuro Noise Pattern\n * Original algo: https://x.com/zozuar/status/1625182758745128981/\n * Renders a fractal-like structure made of several layers of since-arches\n *\n * Uniforms include:\n * u_colorFront - the highlights (overexposed noise areas)\n * u_colorMid - the base color of pattern\n * u_colorBack - the backgrond color of pattern\n * u_brightness - increase/decrease the weight of strong lines\n * u_contrast - show/hide the weak pattern lines\n */\nexport const neuroNoiseFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform float u_pixelRatio;\n\nuniform vec4 u_colorFront;\nuniform vec4 u_colorMid;\nuniform vec4 u_colorBack;\nuniform float u_brightness;\nuniform float u_contrast;\n\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declareRotate}\n\nfloat neuroShape(vec2 uv, float t) {\n vec2 sine_acc = vec2(0.);\n vec2 res = vec2(0.);\n float scale = 8.;\n\n for (int j = 0; j < 15; j++) {\n uv = rotate(uv, 1.);\n sine_acc = rotate(sine_acc, 1.);\n vec2 layer = uv * scale + float(j) + sine_acc - t;\n sine_acc += sin(layer);\n res += (.5 + .5 * cos(layer)) / scale;\n scale *= (1.2);\n }\n return res.x + res.y;\n}\n\nvoid main() {\n vec2 shape_uv = v_patternUV;\n\n shape_uv *= .0013;\n\n float t = .5 * u_time;\n\n float noise = neuroShape(shape_uv, t);\n\n noise = (1. + u_brightness) * pow(noise, 2.);\n noise = pow(noise, .7 + 6. * u_contrast);\n noise = min(1.4, noise);\n\n float blend = smoothstep(0.7, 1.4, noise);\n\n vec4 frontC = u_colorFront;\n frontC.rgb *= frontC.a;\n vec4 midC = u_colorMid;\n midC.rgb *= midC.a;\n vec4 blendFront = mix(midC, frontC, blend);\n\n float safeNoise = max(noise, 0.0);\n vec3 color = blendFront.rgb * safeNoise;\n float opacity = clamp(blendFront.a * safeNoise, 0., 1.);\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n color = color + bgColor * (1. - opacity);\n opacity = opacity + u_colorBack.a * (1. - opacity);\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface NeuroNoiseUniforms extends ShaderSizingUniforms {\n u_colorFront: [number, number, number, number];\n u_colorMid: [number, number, number, number];\n u_colorBack: [number, number, number, number];\n u_brightness: number;\n u_contrast: number;\n}\n\nexport interface NeuroNoiseParams extends ShaderSizingParams, ShaderMotionParams {\n colorFront?: string;\n colorMid?: string;\n colorBack?: string;\n brightness?: number;\n contrast?: number;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AACA,SAAS,kCAAsF;AAC/F,SAAS,eAAe,uBAAuB;AAcxC,MAAM,2BAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc9C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA+CX,eAAe;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
2
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
2
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
3
3
|
/**
|
|
4
4
|
* 3d Perlin noise with exposed parameters
|
|
5
5
|
* Based on https://www.shadertoy.com/view/NlSGDz
|
|
6
6
|
*
|
|
7
7
|
* Uniforms include:
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* u_proportion (0 .. 1) - the proportion between
|
|
11
|
-
* u_softness - the sharpness of the transition between
|
|
8
|
+
* u_colorFront - the first mixed color
|
|
9
|
+
* u_colorBack - the second mixed color
|
|
10
|
+
* u_proportion (0 .. 1) - the proportion between u_colorFront and u_colorBack;
|
|
11
|
+
* u_softness - the sharpness of the transition between u_colorFront and u_colorBack in the noise output
|
|
12
12
|
* u_octaveCount - the number of octaves for Perlin noise;
|
|
13
13
|
* higher values increase the complexity of the noise
|
|
14
14
|
* u_persistence (0 .. 1) - the amplitude of each successive octave of the noise;
|
|
@@ -18,8 +18,8 @@ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-si
|
|
|
18
18
|
*/
|
|
19
19
|
export declare const perlinNoiseFragmentShader: string;
|
|
20
20
|
export interface PerlinNoiseUniforms extends ShaderSizingUniforms {
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
u_colorFront: [number, number, number, number];
|
|
22
|
+
u_colorBack: [number, number, number, number];
|
|
23
23
|
u_proportion: number;
|
|
24
24
|
u_softness: number;
|
|
25
25
|
u_octaveCount: number;
|
|
@@ -27,8 +27,8 @@ export interface PerlinNoiseUniforms extends ShaderSizingUniforms {
|
|
|
27
27
|
u_lacunarity: number;
|
|
28
28
|
}
|
|
29
29
|
export interface PerlinNoiseParams extends ShaderSizingParams, ShaderMotionParams {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
colorFront?: string;
|
|
31
|
+
colorBack?: string;
|
|
32
32
|
proportion?: number;
|
|
33
33
|
softness?: number;
|
|
34
34
|
octaveCount?: number;
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { sizingVariablesDeclaration } from "../shader-sizing";
|
|
7
|
-
import { declarePI, colorBandingFix } from "../shader-utils";
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declarePI, colorBandingFix } from "../shader-utils.js";
|
|
8
8
|
const perlinNoiseFragmentShader = `#version 300 es
|
|
9
9
|
precision mediump float;
|
|
10
10
|
|
|
11
11
|
uniform float u_time;
|
|
12
12
|
|
|
13
|
-
uniform vec4
|
|
14
|
-
uniform vec4
|
|
13
|
+
uniform vec4 u_colorFront;
|
|
14
|
+
uniform vec4 u_colorBack;
|
|
15
15
|
uniform float u_proportion;
|
|
16
16
|
uniform float u_softness;
|
|
17
17
|
uniform float u_octaveCount;
|
|
@@ -158,29 +158,37 @@ float get_max_amp(float persistence, float octaveCount) {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
void main() {
|
|
161
|
-
vec2
|
|
161
|
+
vec2 uv = v_patternUV;
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
uv *= .005;
|
|
164
164
|
float t = .2 * u_time;
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
vec3 p = vec3(uv, t);
|
|
167
167
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
168
|
+
float oct_count = max(0., floor(u_octaveCount));
|
|
169
|
+
float persistence = clamp(u_persistence, 0., 1.);
|
|
170
|
+
float noise = p_noise(p, int(oct_count), persistence, u_lacunarity);
|
|
171
171
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
172
|
+
float max_amp = get_max_amp(persistence, oct_count);
|
|
173
|
+
float noise_normalized = (noise + max_amp) / (2. * max_amp) + (u_proportion - .5);
|
|
174
|
+
float sharpness = clamp(u_softness, 0., 1.);
|
|
175
|
+
float smooth_w = 0.5 * fwidth(noise_normalized);
|
|
176
|
+
float res = smoothstep(
|
|
177
|
+
.5 - .5 * sharpness - smooth_w,
|
|
178
|
+
.5 + .5 * sharpness + smooth_w,
|
|
179
|
+
noise_normalized
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
vec3 fgColor = u_colorFront.rgb * u_colorFront.a;
|
|
183
|
+
float fgOpacity = u_colorFront.a;
|
|
184
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
185
|
+
float bgOpacity = u_colorBack.a;
|
|
186
|
+
|
|
187
|
+
vec3 color = fgColor * res;
|
|
188
|
+
float opacity = fgOpacity * res;
|
|
181
189
|
|
|
182
|
-
|
|
183
|
-
|
|
190
|
+
color += bgColor * (1. - opacity);
|
|
191
|
+
opacity += bgOpacity * (1. - opacity);
|
|
184
192
|
|
|
185
193
|
${colorBandingFix}
|
|
186
194
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/perlin-noise.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declarePI, colorBandingFix } from '../shader-utils';\n\n/**\n * 3d Perlin noise with exposed parameters\n * Based on https://www.shadertoy.com/view/NlSGDz\n *\n * Uniforms include:\n *
|
|
5
|
-
"mappings": ";;;;;AACA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,uBAAuB;AAkBpC,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,
|
|
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 with exposed parameters\n * Based on https://www.shadertoy.com/view/NlSGDz\n *\n * Uniforms include:\n * u_colorFront - the first mixed color\n * u_colorBack - the second mixed color\n * u_proportion (0 .. 1) - the proportion between u_colorFront and u_colorBack;\n * u_softness - the sharpness of the transition between u_colorFront and u_colorBack in the noise output\n * u_octaveCount - the number of octaves for Perlin noise;\n * higher values increase the complexity of the noise\n * u_persistence (0 .. 1) - the amplitude of each successive octave of the noise;\n * lower values make higher octaves less pronounced\n * u_lacunarity - the frequency of each successive octave of the noise;\n * higher values increase the detail\n */\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\nuint hash(uint x, uint seed) {\n const uint m = 0x5bd1e995U;\n uint hash = seed;\n // process input\n uint k = x;\n k *= m;\n k ^= k >> 24;\n k *= m;\n hash *= m;\n hash ^= k;\n // some final mixing\n hash ^= hash >> 13;\n hash *= m;\n hash ^= hash >> 15;\n return hash;\n}\n\nuint hash(uvec3 x, uint seed){\n const uint m = 0x5bd1e995U;\n uint hash = seed;\n // process first vector element\n uint k = x.x;\n k *= m;\n k ^= k >> 24;\n k *= m;\n hash *= m;\n hash ^= k;\n // process second vector element\n k = x.y;\n k *= m;\n k ^= k >> 24;\n k *= m;\n hash *= m;\n hash ^= k;\n // process third vector element\n k = x.z;\n k *= m;\n k ^= k >> 24;\n k *= m;\n hash *= m;\n hash ^= k;\n // some final mixing\n hash ^= hash >> 13;\n hash *= m;\n hash ^= hash >> 15;\n return hash;\n}\n\n\nvec3 gradientdy(uint hash) {\n switch (int(hash) & 15) { // look at the last four bits to pick a gradient dy\n case 0:\n return vec3(1, 1, 0);\n case 1:\n return vec3(-1, 1, 0);\n case 2:\n return vec3(1, -1, 0);\n case 3:\n return vec3(-1, -1, 0);\n case 4:\n return vec3(1, 0, 1);\n case 5:\n return vec3(-1, 0, 1);\n case 6:\n return vec3(1, 0, -1);\n case 7:\n return vec3(-1, 0, -1);\n case 8:\n return vec3(0, 1, 1);\n case 9:\n return vec3(0, -1, 1);\n case 10:\n return vec3(0, 1, -1);\n case 11:\n return vec3(0, -1, -1);\n case 12:\n return vec3(1, 1, 0);\n case 13:\n return vec3(-1, 1, 0);\n case 14:\n return vec3(0, -1, 1);\n case 15:\n return vec3(0, -1, -1);\n }\n}\n\nfloat interpolate(float value1, float value2, float value3, float value4, float value5, float value6, float value7, float value8, vec3 t) {\n return mix(\n mix(mix(value1, value2, t.x), mix(value3, value4, t.x), t.y),\n mix(mix(value5, value6, t.x), mix(value7, value8, t.x), t.y),\n t.z\n );\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, uint seed) {\n position += 1e+4;\n vec3 floorPosition = floor(position);\n vec3 fractPosition = fract(position);\n uvec3 cellCoordinates = uvec3(floorPosition);\n float value1 = dot(gradientdy(hash(cellCoordinates, seed)), fractPosition);\n float value2 = dot(gradientdy(hash((cellCoordinates + uvec3(1, 0, 0)), seed)), fractPosition - vec3(1, 0, 0));\n float value3 = dot(gradientdy(hash((cellCoordinates + uvec3(0, 1, 0)), seed)), fractPosition - vec3(0, 1, 0));\n float value4 = dot(gradientdy(hash((cellCoordinates + uvec3(1, 1, 0)), seed)), fractPosition - vec3(1, 1, 0));\n float value5 = dot(gradientdy(hash((cellCoordinates + uvec3(0, 0, 1)), seed)), fractPosition - vec3(0, 0, 1));\n float value6 = dot(gradientdy(hash((cellCoordinates + uvec3(1, 0, 1)), seed)), fractPosition - vec3(1, 0, 1));\n float value7 = dot(gradientdy(hash((cellCoordinates + uvec3(0, 1, 1)), seed)), fractPosition - vec3(0, 1, 1));\n float value8 = dot(gradientdy(hash((cellCoordinates + uvec3(1, 1, 1)), seed)), fractPosition - vec3(1, 1, 1));\n return interpolate(value1, value2, value3, value4, value5, value6, value7, value8, fade(fractPosition));\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 currentFrequency = 10.;\n uint currentSeed = uint(0);\n for (int i = 0; i < octaveCount; i++) {\n currentSeed = hash(currentSeed, 0x0U);\n value += perlinNoise(position * currentFrequency, currentSeed) * amplitude;\n amplitude *= persistence;\n currentFrequency *= lacunarity;\n }\n return value;\n}\n\nfloat get_max_amp(float persistence, float octaveCount) {\n persistence *= .999;\n return (1. - pow(persistence, octaveCount)) / (1. - persistence);\n}\n\nvoid main() {\n vec2 uv = v_patternUV;\n\n uv *= .005;\n float t = .2 * u_time;\n\n vec3 p = vec3(uv, t);\n\n float oct_count = max(0., floor(u_octaveCount));\n float persistence = clamp(u_persistence, 0., 1.);\n float noise = p_noise(p, int(oct_count), persistence, u_lacunarity);\n\n float max_amp = get_max_amp(persistence, oct_count);\n float noise_normalized = (noise + max_amp) / (2. * max_amp) + (u_proportion - .5);\n float sharpness = clamp(u_softness, 0., 1.);\n float smooth_w = 0.5 * fwidth(noise_normalized);\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;AAkBpC,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwKP,eAAe;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const pulsingBorderMeta: {
|
|
5
5
|
readonly maxColorCount: 5;
|
|
6
6
|
readonly maxSpotsPerColor: 5;
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { sizingVariablesDeclaration } from "../shader-sizing";
|
|
7
|
-
import { declarePI, colorBandingFix } from "../shader-utils";
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declarePI, colorBandingFix } from "../shader-utils.js";
|
|
8
8
|
const pulsingBorderMeta = {
|
|
9
9
|
maxColorCount: 5,
|
|
10
10
|
maxSpotsPerColor: 5
|
|
@@ -37,7 +37,7 @@ out vec4 fragColor;
|
|
|
37
37
|
${declarePI}
|
|
38
38
|
|
|
39
39
|
float roundedBox(vec2 uv, vec2 halfSize, float radius, float distance, float edgeSoftness) {
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
float borderDistance = abs(distance) - .5 * u_thickness;
|
|
42
42
|
float border = 1. - smoothstep(-.5 * edgeSoftness, .5 * edgeSoftness, borderDistance);
|
|
43
43
|
border *= border;
|
|
@@ -46,24 +46,24 @@ float roundedBox(vec2 uv, vec2 halfSize, float radius, float distance, float edg
|
|
|
46
46
|
vec2 v1 = uv - vec2(-halfSize.x, halfSize.y);
|
|
47
47
|
vec2 v2 = uv - vec2(halfSize.x, -halfSize.y);
|
|
48
48
|
vec2 v3 = uv - halfSize;
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
float mult = (.07 - .25 * radius);
|
|
51
51
|
float m0 = mult * clamp(pow(1. - abs(v0.x - v0.y), 20.), 0., 1.);
|
|
52
52
|
float m1 = mult * clamp(pow(1. - abs(v1.x + v1.y), 20.), 0., 1.);
|
|
53
53
|
float m2 = mult * clamp(pow(1. - abs(v2.x + v2.y), 20.), 0., 1.);
|
|
54
54
|
float m3 = mult * clamp(pow(1. - abs(v3.x - v3.y), 20.), 0., 1.);
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
float l = edgeSoftness * .5 + .75 * u_thickness;
|
|
57
57
|
float fade0 = 1. - clamp(length(v0) / l, 0., 1.);
|
|
58
58
|
float fade1 = 1. - clamp(length(v1) / l, 0., 1.);
|
|
59
59
|
float fade2 = 1. - clamp(length(v2) / l, 0., 1.);
|
|
60
60
|
float fade3 = 1. - clamp(length(v3) / l, 0., 1.);
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
m0 *= fade0;
|
|
63
63
|
m1 *= fade1;
|
|
64
64
|
m2 *= fade2;
|
|
65
65
|
m3 *= fade3;
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
float fillFix = m0 + m1 + m2 + m3;
|
|
68
68
|
fillFix *= step(distance, 0.);
|
|
69
69
|
fillFix *= (1. + 3. * u_thickness);
|
|
@@ -82,7 +82,7 @@ float roundedBoxSmoke(vec2 uv, vec2 halfSize, float radius, float distance, floa
|
|
|
82
82
|
vec2 v1 = uv - vec2(-halfSize.x, halfSize.y);
|
|
83
83
|
vec2 v2 = uv - vec2(halfSize.x, -halfSize.y);
|
|
84
84
|
vec2 v3 = uv - halfSize;
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
float l_mask = .5;
|
|
87
87
|
float mask = smoothstep(0., 1., length(v0) / l_mask);
|
|
88
88
|
mask *= smoothstep(0., 1., length(v1) / l_mask);
|
|
@@ -121,12 +121,12 @@ float getWaveformValue(float time) {
|
|
|
121
121
|
void main() {
|
|
122
122
|
|
|
123
123
|
float t = .5 * u_time + 20.;
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
vec2 borderUV = v_responsiveUV;
|
|
126
126
|
|
|
127
127
|
float angle = atan(borderUV.y, borderUV.x) / TWO_PI;
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
|
|
129
|
+
|
|
130
130
|
float borderRatio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;
|
|
131
131
|
borderUV.x *= borderRatio;
|
|
132
132
|
vec2 halfSize = vec2(.5);
|
|
@@ -136,11 +136,11 @@ void main() {
|
|
|
136
136
|
float outsideDistance = length(max(d, 0.)) - radius;
|
|
137
137
|
float insideDistance = min(max(d.x, d.y), 0.0);
|
|
138
138
|
float distance = outsideDistance + insideDistance;
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
float border = roundedBox(borderUV, halfSize, radius, distance, .5 * u_softness);
|
|
141
141
|
|
|
142
142
|
float pulse = u_pulse * getWaveformValue(.18 * u_time);
|
|
143
|
-
|
|
143
|
+
|
|
144
144
|
border *= (1. + .1 * pulse);
|
|
145
145
|
border *= (1. + u_intensity);
|
|
146
146
|
|
|
@@ -159,53 +159,53 @@ void main() {
|
|
|
159
159
|
|
|
160
160
|
vec3 color = vec3(0.);
|
|
161
161
|
float opacity = 0.;
|
|
162
|
-
|
|
162
|
+
|
|
163
163
|
vec3 accumColor = vec3(0.);
|
|
164
164
|
float accumAlpha = 0.;
|
|
165
|
-
|
|
165
|
+
|
|
166
166
|
for (int i = 0; i < ${pulsingBorderMeta.maxSpotsPerColor}; i++) {
|
|
167
167
|
if (i >= int(u_spotsPerColor)) break;
|
|
168
168
|
float idx = float(i);
|
|
169
|
-
|
|
169
|
+
|
|
170
170
|
for (int j = 0; j < ${pulsingBorderMeta.maxColorCount}; j++) {
|
|
171
171
|
if (j >= int(u_colorsCount)) break;
|
|
172
172
|
float colorIdx = float(j);
|
|
173
173
|
|
|
174
174
|
vec2 randVal = rand(vec2(idx * 10. + 2., 40. + colorIdx));
|
|
175
|
-
|
|
175
|
+
|
|
176
176
|
float time = (.1 + .15 * abs(sin(idx * (2. + colorIdx)) * cos(idx * (2. + 2.5 * colorIdx)))) * t + randVal.x * 3.;
|
|
177
177
|
time *= mix(1., -1., step(.5, randVal.y));
|
|
178
|
-
|
|
178
|
+
|
|
179
179
|
float mask = .2 + mix(
|
|
180
180
|
sin(t + idx * (5. - 1.5 * colorIdx)),
|
|
181
181
|
cos(t + idx * (3. + 1.3 * colorIdx)),
|
|
182
182
|
step(mod(colorIdx, 2.), .5)
|
|
183
183
|
);
|
|
184
|
-
|
|
184
|
+
|
|
185
185
|
mask += pulse;
|
|
186
186
|
if (mask < 0.) continue;
|
|
187
|
-
|
|
187
|
+
|
|
188
188
|
float atg1 = fract(angle + time);
|
|
189
189
|
float sector = smoothstep(.5 - u_spotSize, .5, atg1) * smoothstep(.5 + u_spotSize, .5, atg1);
|
|
190
190
|
sector *= border;
|
|
191
191
|
sector *= mask;
|
|
192
192
|
sector = clamp(sector, 0., 1.);
|
|
193
|
-
|
|
193
|
+
|
|
194
194
|
sectorsTotal += sector;
|
|
195
|
-
|
|
195
|
+
|
|
196
196
|
float alpha = sector * u_colors[j].a;
|
|
197
197
|
accumColor += u_colors[j].rgb * alpha;
|
|
198
198
|
accumAlpha += alpha;
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
color = accumColor;
|
|
203
203
|
opacity = clamp(accumAlpha, 0., 1.);
|
|
204
|
-
|
|
204
|
+
|
|
205
205
|
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
206
206
|
color = color + bgColor * (1. - opacity);
|
|
207
207
|
opacity = opacity + u_colorBack.a * (1. - opacity);
|
|
208
|
-
|
|
208
|
+
|
|
209
209
|
${colorBandingFix}
|
|
210
210
|
|
|
211
211
|
fragColor = vec4(color, opacity);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/pulsing-border.ts"],
|
|
4
|
-
"sourcesContent": ["import type { vec4 } from '../types';\nimport type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declarePI, colorBandingFix } from '../shader-utils';\n\nexport const pulsingBorderMeta = {\n maxColorCount: 5,\n maxSpotsPerColor: 5,\n} as const;\n\n/**\n * Pulsing Border Pattern with Smoke Effect\n * This shader creates a rounded border mask with multiple color spots\n * traveling along the border\n *\n * Uniforms include:\n * u_colorBack - The background color of the pattern\n * u_colors - An array of colors for the pulsing spots (with up to `u_colorsCount` entries)\n * u_colorsCount - The number of colors used in the pattern\n * u_roundness - The roundness of the border corners\n * u_thickness - The thickness of the border\n * u_softness - The blur around the border edges\n * u_intensity - The intensity multiplier for the pulsing effect\n * u_spotSize - The size of the color spots\n * u_spotsPerColor - The number of spots for each color (not all the spots are visible all the time)\n * u_pulse - A multiplier for the pulsing strength (pulsing signal taken from the u_pulseTexture)\n * u_smoke - The strength of the smoke effect (the noise aroung the border)\n */\n\nexport const pulsingBorderFragmentShader: string = `#version 300 es\nprecision lowp float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colors[${pulsingBorderMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_roundness;\nuniform float u_thickness;\nuniform float u_softness;\nuniform float u_intensity;\nuniform float u_spotSize;\nuniform float u_spotsPerColor;\nuniform float u_pulse;\nuniform float u_smoke;\nuniform float u_smokeSize;\n\nuniform sampler2D u_pulseTexture;\nuniform sampler2D u_noiseTexture;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n\nfloat roundedBox(vec2 uv, vec2 halfSize, float radius, float distance, float edgeSoftness) {\n
|
|
4
|
+
"sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, colorBandingFix } from '../shader-utils.js';\n\nexport const pulsingBorderMeta = {\n maxColorCount: 5,\n maxSpotsPerColor: 5,\n} as const;\n\n/**\n * Pulsing Border Pattern with Smoke Effect\n * This shader creates a rounded border mask with multiple color spots\n * traveling along the border\n *\n * Uniforms include:\n * u_colorBack - The background color of the pattern\n * u_colors - An array of colors for the pulsing spots (with up to `u_colorsCount` entries)\n * u_colorsCount - The number of colors used in the pattern\n * u_roundness - The roundness of the border corners\n * u_thickness - The thickness of the border\n * u_softness - The blur around the border edges\n * u_intensity - The intensity multiplier for the pulsing effect\n * u_spotSize - The size of the color spots\n * u_spotsPerColor - The number of spots for each color (not all the spots are visible all the time)\n * u_pulse - A multiplier for the pulsing strength (pulsing signal taken from the u_pulseTexture)\n * u_smoke - The strength of the smoke effect (the noise aroung the border)\n */\n\nexport const pulsingBorderFragmentShader: string = `#version 300 es\nprecision lowp float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colors[${pulsingBorderMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_roundness;\nuniform float u_thickness;\nuniform float u_softness;\nuniform float u_intensity;\nuniform float u_spotSize;\nuniform float u_spotsPerColor;\nuniform float u_pulse;\nuniform float u_smoke;\nuniform float u_smokeSize;\n\nuniform sampler2D u_pulseTexture;\nuniform sampler2D u_noiseTexture;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n\nfloat roundedBox(vec2 uv, vec2 halfSize, float radius, float distance, float edgeSoftness) {\n\n float borderDistance = abs(distance) - .5 * u_thickness;\n float border = 1. - smoothstep(-.5 * edgeSoftness, .5 * edgeSoftness, borderDistance);\n border *= border;\n\n vec2 v0 = uv + halfSize;\n vec2 v1 = uv - vec2(-halfSize.x, halfSize.y);\n vec2 v2 = uv - vec2(halfSize.x, -halfSize.y);\n vec2 v3 = uv - halfSize;\n\n float mult = (.07 - .25 * radius);\n float m0 = mult * clamp(pow(1. - abs(v0.x - v0.y), 20.), 0., 1.);\n float m1 = mult * clamp(pow(1. - abs(v1.x + v1.y), 20.), 0., 1.);\n float m2 = mult * clamp(pow(1. - abs(v2.x + v2.y), 20.), 0., 1.);\n float m3 = mult * clamp(pow(1. - abs(v3.x - v3.y), 20.), 0., 1.);\n\n float l = edgeSoftness * .5 + .75 * u_thickness;\n float fade0 = 1. - clamp(length(v0) / l, 0., 1.);\n float fade1 = 1. - clamp(length(v1) / l, 0., 1.);\n float fade2 = 1. - clamp(length(v2) / l, 0., 1.);\n float fade3 = 1. - clamp(length(v3) / l, 0., 1.);\n\n m0 *= fade0;\n m1 *= fade1;\n m2 *= fade2;\n m3 *= fade3;\n\n float fillFix = m0 + m1 + m2 + m3;\n fillFix *= step(distance, 0.);\n fillFix *= (1. + 3. * u_thickness);\n fillFix *= (1.5 - .5 * smoothstep(0., .5, edgeSoftness));\n fillFix = clamp(fillFix, 0., 1.);\n\n return border + fillFix;\n}\n\nfloat roundedBoxSmoke(vec2 uv, vec2 halfSize, float radius, float distance, float size) {\n float borderDistance = abs(distance);\n float border = 1. - smoothstep(-.75 * size, .75 * size, borderDistance);\n border *= border;\n\n vec2 v0 = uv + halfSize;\n vec2 v1 = uv - vec2(-halfSize.x, halfSize.y);\n vec2 v2 = uv - vec2(halfSize.x, -halfSize.y);\n vec2 v3 = uv - halfSize;\n\n float l_mask = .5;\n float mask = smoothstep(0., 1., length(v0) / l_mask);\n mask *= smoothstep(0., 1., length(v1) / l_mask);\n mask *= smoothstep(0., 1., length(v2) / l_mask);\n mask *= smoothstep(0., 1., length(v3) / l_mask);\n\n return border * mask;\n}\n\nvec2 rand(vec2 p) {\n vec2 uv = floor(p) / 100. + .5;\n return texture(u_noiseTexture, uv).gb;\n}\n\nfloat noise(vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n float a = rand(i).x;\n float b = rand(i + vec2(1.0, 0.0)).x;\n float c = rand(i + vec2(0.0, 1.0)).x;\n float d = rand(i + vec2(1.0, 1.0)).x;\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}\n\nfloat getWaveformValue(float time) {\n float dur = 5.;\n float wrappedTime = mod(time, dur);\n float normalizedTime = wrappedTime / dur;\n float value = texture(u_pulseTexture, vec2(normalizedTime, 0.5)).r;\n return value * 2. - 1.;\n}\n\nvoid main() {\n\n float t = .5 * u_time + 20.;\n\n vec2 borderUV = v_responsiveUV;\n\n float angle = atan(borderUV.y, borderUV.x) / TWO_PI;\n\n\n float borderRatio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;\n borderUV.x *= borderRatio;\n vec2 halfSize = vec2(.5);\n halfSize.x *= borderRatio;\n float radius = min(.5 * u_roundness, halfSize.x);\n vec2 d = abs(borderUV) - halfSize + radius;\n float outsideDistance = length(max(d, 0.)) - radius;\n float insideDistance = min(max(d.x, d.y), 0.0);\n float distance = outsideDistance + insideDistance;\n\n float border = roundedBox(borderUV, halfSize, radius, distance, .5 * u_softness);\n\n float pulse = u_pulse * getWaveformValue(.18 * u_time);\n\n border *= (1. + .1 * pulse);\n border *= (1. + u_intensity);\n\n vec2 smokeUV = .001 * u_smokeSize * v_patternUV;\n float smoke = clamp(3. * noise(2.7 * smokeUV + .5 * t), 0., 1.);\n smoke -= noise(3.4 * smokeUV - .5 * t);\n smoke *= roundedBoxSmoke(borderUV, halfSize, radius, distance, u_smoke);\n smoke = 50. * pow(smoke, 2.);\n smoke *= u_smoke;\n smoke *= (.8 + .4 * pulse);\n smoke = clamp(smoke, 0., 1.);\n\n border += smoke;\n\n float sectorsTotal = 0.;\n\n vec3 color = vec3(0.);\n float opacity = 0.;\n\n vec3 accumColor = vec3(0.);\n float accumAlpha = 0.;\n\n for (int i = 0; i < ${pulsingBorderMeta.maxSpotsPerColor}; i++) {\n if (i >= int(u_spotsPerColor)) break;\n float idx = float(i);\n\n for (int j = 0; j < ${pulsingBorderMeta.maxColorCount}; j++) {\n if (j >= int(u_colorsCount)) break;\n float colorIdx = float(j);\n\n vec2 randVal = rand(vec2(idx * 10. + 2., 40. + colorIdx));\n\n float time = (.1 + .15 * abs(sin(idx * (2. + colorIdx)) * cos(idx * (2. + 2.5 * colorIdx)))) * t + randVal.x * 3.;\n time *= mix(1., -1., step(.5, randVal.y));\n\n float mask = .2 + mix(\n sin(t + idx * (5. - 1.5 * colorIdx)),\n cos(t + idx * (3. + 1.3 * colorIdx)),\n step(mod(colorIdx, 2.), .5)\n );\n\n mask += pulse;\n if (mask < 0.) continue;\n\n float atg1 = fract(angle + time);\n float sector = smoothstep(.5 - u_spotSize, .5, atg1) * smoothstep(.5 + u_spotSize, .5, atg1);\n sector *= border;\n sector *= mask;\n sector = clamp(sector, 0., 1.);\n\n sectorsTotal += sector;\n\n float alpha = sector * u_colors[j].a;\n accumColor += u_colors[j].rgb * alpha;\n accumAlpha += alpha;\n }\n }\n\n color = accumColor;\n opacity = clamp(accumAlpha, 0., 1.);\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n color = color + bgColor * (1. - opacity);\n opacity = opacity + u_colorBack.a * (1. - opacity);\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface PulsingBorderUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_roundness: number;\n u_thickness: number;\n u_softness: number;\n u_intensity: number;\n u_spotsPerColor: number;\n u_spotSize: number;\n u_pulse: number;\n u_smoke: number;\n u_smokeSize: number;\n u_pulseTexture?: HTMLImageElement;\n}\n\nexport interface PulsingBorderParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colors?: string[];\n roundness?: number;\n thickness?: number;\n softness?: number;\n intensity?: number;\n spotsPerColor?: number;\n spotSize?: number;\n pulse?: number;\n smoke?: number;\n smokeSize?: number;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,uBAAuB;AAEpC,MAAM,oBAAoB;AAAA,EAC/B,eAAe;AAAA,EACf,kBAAkB;AACpB;AAqBO,MAAM,8BAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAM3B,kBAAkB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAerD,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,wBAiIa,kBAAkB,gBAAgB;AAAA;AAAA;AAAA;AAAA,0BAIhC,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,IAuCrD,eAAe;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const simplexNoiseMeta: {
|
|
5
5
|
readonly maxColorCount: 10;
|
|
6
6
|
};
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { sizingVariablesDeclaration } from "../shader-sizing";
|
|
7
|
-
import { declareSimplexNoise, colorBandingFix } from "../shader-utils";
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declareSimplexNoise, colorBandingFix } from "../shader-utils.js";
|
|
8
8
|
const simplexNoiseMeta = {
|
|
9
9
|
maxColorCount: 10
|
|
10
10
|
};
|
|
@@ -35,10 +35,10 @@ float getNoise(vec2 uv, float t) {
|
|
|
35
35
|
float steppedSmooth(float t, float steps, float softness) {
|
|
36
36
|
float stepT = floor(t * steps) / steps;
|
|
37
37
|
float f = t * steps - floor(t * steps);
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
float fw = 0.005 / u_scale;
|
|
40
40
|
float smoothed = smoothstep(.5 - softness * .5 - fw, .5 + softness * .5 + fw, f);
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
return stepT + smoothed / steps;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -50,9 +50,9 @@ void main() {
|
|
|
50
50
|
float t = .2 * u_time;
|
|
51
51
|
|
|
52
52
|
float shape = .5 + .5 * getNoise(shape_uv, t);
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
bool u_extraSides = true;
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
float mixer = shape * (u_colorsCount - 1.);
|
|
57
57
|
if (u_extraSides == true) {
|
|
58
58
|
mixer = (shape - .5 / u_colorsCount) * u_colorsCount;
|
|
@@ -64,22 +64,22 @@ void main() {
|
|
|
64
64
|
gradient.rgb *= gradient.a;
|
|
65
65
|
for (int i = 1; i < ${simplexNoiseMeta.maxColorCount}; i++) {
|
|
66
66
|
if (i >= int(u_colorsCount)) break;
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
float localT = clamp(mixer - float(i - 1), 0., 1.);
|
|
69
|
-
localT = steppedSmooth(localT, steps, u_softness);
|
|
70
|
-
|
|
69
|
+
localT = steppedSmooth(localT, steps, u_softness);
|
|
70
|
+
|
|
71
71
|
vec4 c = u_colors[i];
|
|
72
72
|
c.rgb *= c.a;
|
|
73
73
|
gradient = mix(gradient, c, localT);
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
if (u_extraSides == true) {
|
|
77
77
|
if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {
|
|
78
78
|
float localT = mixer + 1.;
|
|
79
79
|
if (mixer > (u_colorsCount - 1.)) {
|
|
80
80
|
localT = mixer - (u_colorsCount - 1.);
|
|
81
81
|
}
|
|
82
|
-
localT = steppedSmooth(localT, steps, u_softness);
|
|
82
|
+
localT = steppedSmooth(localT, steps, u_softness);
|
|
83
83
|
vec4 cFst = u_colors[0];
|
|
84
84
|
cFst.rgb *= cFst.a;
|
|
85
85
|
vec4 cLast = u_colors[int(u_colorsCount - 1.)];
|
|
@@ -90,7 +90,7 @@ void main() {
|
|
|
90
90
|
|
|
91
91
|
vec3 color = gradient.rgb;
|
|
92
92
|
float opacity = gradient.a;
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
${colorBandingFix}
|
|
95
95
|
|
|
96
96
|
fragColor = vec4(color, opacity);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/simplex-noise.ts"],
|
|
4
|
-
"sourcesContent": ["import type { vec4 } from '../types';\nimport type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declareSimplexNoise, colorBandingFix } from '../shader-utils';\n\nexport const simplexNoiseMeta = {\n maxColorCount: 10,\n} as const;\n\n/**\n * Simplex Noise animation by Ksenia Kondrashova\n * Calculates a combination of 2 simplex noises with result mapped as\n * a gradient with dynamic number of main colors and steps between them\n *\n * Uniforms include:\n * - u_colors (vec4[]): Input RGBA colors\n * - u_colorsCount (float): Number of active colors (`u_colors` length)\n * - u_stepsPerColor (float, used as int): Number of rendered colors per input color\n * - u_softness (float, 0..1): Amount of blur applied to the color steps\n */\nexport const simplexNoiseFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\nuniform float u_scale;\n\nuniform vec4 u_colors[${simplexNoiseMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_stepsPerColor;\nuniform float u_softness;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declareSimplexNoise}\n\nfloat getNoise(vec2 uv, float t) {\n float noise = .5 * snoise(uv - vec2(0., .3 * t));\n noise += .5 * snoise(2. * uv + vec2(0., .32 * t));\n\n return noise;\n}\n\nfloat steppedSmooth(float t, float steps, float softness) {\n float stepT = floor(t * steps) / steps;\n float f = t * steps - floor(t * steps);\n
|
|
4
|
+
"sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declareSimplexNoise, colorBandingFix } from '../shader-utils.js';\n\nexport const simplexNoiseMeta = {\n maxColorCount: 10,\n} as const;\n\n/**\n * Simplex Noise animation by Ksenia Kondrashova\n * Calculates a combination of 2 simplex noises with result mapped as\n * a gradient with dynamic number of main colors and steps between them\n *\n * Uniforms include:\n * - u_colors (vec4[]): Input RGBA colors\n * - u_colorsCount (float): Number of active colors (`u_colors` length)\n * - u_stepsPerColor (float, used as int): Number of rendered colors per input color\n * - u_softness (float, 0..1): Amount of blur applied to the color steps\n */\nexport const simplexNoiseFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\nuniform float u_scale;\n\nuniform vec4 u_colors[${simplexNoiseMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_stepsPerColor;\nuniform float u_softness;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declareSimplexNoise}\n\nfloat getNoise(vec2 uv, float t) {\n float noise = .5 * snoise(uv - vec2(0., .3 * t));\n noise += .5 * snoise(2. * uv + vec2(0., .32 * t));\n\n return noise;\n}\n\nfloat steppedSmooth(float t, float steps, float softness) {\n float stepT = floor(t * steps) / steps;\n float f = t * steps - floor(t * steps);\n\n float fw = 0.005 / u_scale;\n float smoothed = smoothstep(.5 - softness * .5 - fw, .5 + softness * .5 + fw, f);\n\n return stepT + smoothed / steps;\n}\n\nvoid main() {\n vec2 shape_uv = v_patternUV;\n\n shape_uv *= .001;\n\n float t = .2 * u_time;\n\n float shape = .5 + .5 * getNoise(shape_uv, t);\n\n bool u_extraSides = true;\n\n float mixer = shape * (u_colorsCount - 1.);\n if (u_extraSides == true) {\n mixer = (shape - .5 / u_colorsCount) * u_colorsCount;\n }\n\n float steps = max(1., u_stepsPerColor);\n\n vec4 gradient = u_colors[0];\n gradient.rgb *= gradient.a;\n for (int i = 1; i < ${simplexNoiseMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n\n float localT = clamp(mixer - float(i - 1), 0., 1.);\n localT = steppedSmooth(localT, steps, u_softness);\n\n vec4 c = u_colors[i];\n c.rgb *= c.a;\n gradient = mix(gradient, c, localT);\n }\n\n if (u_extraSides == true) {\n if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {\n float localT = mixer + 1.;\n if (mixer > (u_colorsCount - 1.)) {\n localT = mixer - (u_colorsCount - 1.);\n }\n localT = steppedSmooth(localT, steps, u_softness);\n vec4 cFst = u_colors[0];\n cFst.rgb *= cFst.a;\n vec4 cLast = u_colors[int(u_colorsCount - 1.)];\n cLast.rgb *= cLast.a;\n gradient = mix(cLast, cFst, localT);\n }\n }\n\n vec3 color = gradient.rgb;\n float opacity = gradient.a;\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface SimplexNoiseUniforms extends ShaderSizingUniforms {\n u_colors: vec4[];\n u_colorsCount: number;\n u_stepsPerColor: number;\n u_softness: number;\n}\n\nexport interface SimplexNoiseParams extends ShaderSizingParams, ShaderMotionParams {\n colors?: string[];\n stepsPerColor?: number;\n softness?: number;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,qBAAqB,uBAAuB;AAE9C,MAAM,mBAAmB;AAAA,EAC9B,eAAe;AACjB;AAaO,MAAM,6BAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAM1B,iBAAiB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAuCG,iBAAiB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BlD,eAAe;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const smokeRingMeta: {
|
|
5
5
|
readonly maxColorCount: 10;
|
|
6
6
|
readonly maxNoiseIterations: 8;
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { sizingVariablesDeclaration } from "../shader-sizing";
|
|
7
|
-
import { declarePI, declareRandom, colorBandingFix } from "../shader-utils";
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declarePI, declareRandom, colorBandingFix } from "../shader-utils.js";
|
|
8
8
|
const smokeRingMeta = {
|
|
9
9
|
maxColorCount: 10,
|
|
10
10
|
maxNoiseIterations: 8
|
|
@@ -122,12 +122,12 @@ void main() {
|
|
|
122
122
|
gradient = mix(gradient, c, localT);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
vec3 color = gradient.rgb * ringShape;
|
|
125
126
|
float opacity = gradient.a * ringShape;
|
|
126
|
-
opacity += u_colorBack.a;
|
|
127
127
|
|
|
128
|
-
vec3
|
|
129
|
-
color
|
|
130
|
-
|
|
128
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
129
|
+
color = color + bgColor * (1. - opacity);
|
|
130
|
+
opacity = opacity + u_colorBack.a * (1. - opacity);
|
|
131
131
|
|
|
132
132
|
${colorBandingFix}
|
|
133
133
|
|