@paper-design/shaders 0.0.26 → 0.0.27

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 (81) hide show
  1. package/dist/get-shader-color-from-string.d.ts +1 -1
  2. package/dist/get-shader-color-from-string.js +93 -0
  3. package/dist/get-shader-color-from-string.js.map +7 -0
  4. package/dist/get-shader-noise-texture.d.ts +1 -0
  5. package/dist/get-shader-noise-texture.js +23 -0
  6. package/dist/get-shader-noise-texture.js.map +7 -0
  7. package/dist/index.d.ts +30 -16
  8. package/dist/index.js +79 -1767
  9. package/dist/index.js.map +4 -4
  10. package/dist/shader-color-spaces.d.ts +6 -0
  11. package/dist/shader-color-spaces.js +96 -0
  12. package/dist/shader-color-spaces.js.map +7 -0
  13. package/dist/shader-mount.d.ts +48 -17
  14. package/dist/shader-mount.js +568 -0
  15. package/dist/shader-mount.js.map +7 -0
  16. package/dist/shader-sizing.d.ts +35 -0
  17. package/dist/shader-sizing.js +196 -0
  18. package/dist/shader-sizing.js.map +7 -0
  19. package/dist/shader-utils.d.ts +5 -0
  20. package/dist/shader-utils.js +59 -0
  21. package/dist/shader-utils.js.map +7 -0
  22. package/dist/shaders/dithering.d.ts +47 -0
  23. package/dist/shaders/dithering.js +197 -0
  24. package/dist/shaders/dithering.js.map +7 -0
  25. package/dist/shaders/dot-grid.d.ts +33 -20
  26. package/dist/shaders/dot-grid.js +100 -0
  27. package/dist/shaders/dot-grid.js.map +7 -0
  28. package/dist/shaders/dot-orbit.d.ts +27 -18
  29. package/dist/shaders/dot-orbit.js +120 -0
  30. package/dist/shaders/dot-orbit.js.map +7 -0
  31. package/dist/shaders/god-rays.d.ts +35 -26
  32. package/dist/shaders/god-rays.js +134 -0
  33. package/dist/shaders/god-rays.js.map +7 -0
  34. package/dist/shaders/grain-gradient.d.ts +25 -0
  35. package/dist/shaders/grain-gradient.js +219 -0
  36. package/dist/shaders/grain-gradient.js.map +7 -0
  37. package/dist/shaders/liquid-metal.d.ts +19 -0
  38. package/dist/shaders/liquid-metal.js +224 -0
  39. package/dist/shaders/liquid-metal.js.map +7 -0
  40. package/dist/shaders/mesh-gradient.d.ts +23 -13
  41. package/dist/shaders/mesh-gradient.js +97 -0
  42. package/dist/shaders/mesh-gradient.js.map +7 -0
  43. package/dist/shaders/metaballs.d.ts +22 -15
  44. package/dist/shaders/metaballs.js +108 -0
  45. package/dist/shaders/metaballs.js.map +7 -0
  46. package/dist/shaders/neuro-noise.d.ts +13 -8
  47. package/dist/shaders/neuro-noise.js +66 -0
  48. package/dist/shaders/neuro-noise.js.map +7 -0
  49. package/dist/shaders/perlin-noise.d.ts +26 -15
  50. package/dist/shaders/perlin-noise.js +193 -0
  51. package/dist/shaders/perlin-noise.js.map +7 -0
  52. package/dist/shaders/pulsing-border.d.ts +54 -0
  53. package/dist/shaders/pulsing-border.js +218 -0
  54. package/dist/shaders/pulsing-border.js.map +7 -0
  55. package/dist/shaders/simplex-noise.d.ts +29 -0
  56. package/dist/shaders/simplex-noise.js +103 -0
  57. package/dist/shaders/simplex-noise.js.map +7 -0
  58. package/dist/shaders/smoke-ring.d.ts +34 -12
  59. package/dist/shaders/smoke-ring.js +141 -0
  60. package/dist/shaders/smoke-ring.js.map +7 -0
  61. package/dist/shaders/spiral.d.ts +28 -18
  62. package/dist/shaders/spiral.js +75 -0
  63. package/dist/shaders/spiral.js.map +7 -0
  64. package/dist/shaders/swirl.d.ts +26 -0
  65. package/dist/shaders/swirl.js +80 -0
  66. package/dist/shaders/swirl.js.map +7 -0
  67. package/dist/shaders/voronoi.d.ts +39 -29
  68. package/dist/shaders/voronoi.js +143 -0
  69. package/dist/shaders/voronoi.js.map +7 -0
  70. package/dist/shaders/warp.d.ts +43 -32
  71. package/dist/shaders/warp.js +124 -0
  72. package/dist/shaders/warp.js.map +7 -0
  73. package/dist/shaders/waves.d.ts +25 -15
  74. package/dist/shaders/waves.js +60 -0
  75. package/dist/shaders/waves.js.map +7 -0
  76. package/dist/types.d.ts +3 -0
  77. package/dist/types.js +6 -0
  78. package/dist/types.js.map +7 -0
  79. package/package.json +2 -1
  80. package/dist/get-shader-color-from-string.test.d.ts +0 -1
  81. package/dist/shaders/stepped-simplex-noise.d.ts +0 -24
@@ -1,22 +1,4 @@
1
- /** Possible values for the shape uniform */
2
- export declare const DotGridShapes: {
3
- readonly Circle: 0;
4
- readonly Diamond: 1;
5
- readonly Square: 2;
6
- readonly Triangle: 3;
7
- };
8
- export type DotGridShape = (typeof DotGridShapes)[keyof typeof DotGridShapes];
9
- export type DotGridUniforms = {
10
- u_colorFill: [number, number, number, number];
11
- u_colorStroke: [number, number, number, number];
12
- u_dotSize: number;
13
- u_gridSpacingX: number;
14
- u_gridSpacingY: number;
15
- u_strokeWidth: number;
16
- u_sizeRange: number;
17
- u_opacityRange: number;
18
- u_shape: DotGridShape;
19
- };
1
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
20
2
  /**
21
3
  * Dot Grid Pattern
22
4
  * (the size parameters are set in pixels)
@@ -33,4 +15,35 @@ export type DotGridUniforms = {
33
15
  * u_opacityRange(0 .. 1) - variety of dot opacity to be applied equally to fill and stroke
34
16
  * u_shape - shape code (0 - circle, 1 - diamond, 2 - square, 3 - triangle)
35
17
  */
36
- export declare const dotGridFragmentShader = "#version 300 es\nprecision highp float;\n\nuniform vec2 u_resolution;\nuniform float u_pixelRatio;\n\nuniform vec4 u_colorFill;\nuniform vec4 u_colorStroke;\nuniform float u_dotSize;\nuniform float u_gridSpacingX;\nuniform float u_gridSpacingY;\nuniform float u_strokeWidth;\nuniform float u_sizeRange;\nuniform float u_opacityRange;\nuniform float u_shape;\n\nout vec4 fragColor;\n\n#define TWO_PI 6.28318530718\n#define PI 3.14159265358979323846\n\nfloat hash(vec2 st) {\n return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);\n}\n\nvec3 permute(vec3 x) { return mod(((x * 34.0) + 1.0) * x, 289.0); }\n\nfloat snoise(vec2 v) {\n const vec4 C = vec4(0.211324865405187, 0.366025403784439,\n -0.577350269189626, 0.024390243902439);\n vec2 i = floor(v + dot(v, C.yy));\n vec2 x0 = v - i + dot(i, C.xx);\n vec2 i1;\n i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n vec4 x12 = x0.xyxy + C.xxzz;\n x12.xy -= i1;\n i = mod(i, 289.0);\n vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0))\n + i.x + vec3(0.0, i1.x, 1.0));\n vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy),\n dot(x12.zw, x12.zw)), 0.0);\n m = m * m;\n m = m * m;\n vec3 x = 2.0 * fract(p * C.www) - 1.0;\n vec3 h = abs(x) - 0.5;\n vec3 ox = floor(x + 0.5);\n vec3 a0 = x - ox;\n m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);\n vec3 g;\n g.x = a0.x * x0.x + h.x * x0.y;\n g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n return 130.0 * dot(m, g);\n}\nfloat polygon(vec2 p, float N, float rot) {\n float a = atan(p.x, p.y) + rot;\n float r = TWO_PI / float(N);\n\n return cos(floor(.5 + a / r) * r - a) * length(p);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy;\n uv.y = u_resolution.y - uv.y;\n\n uv /= u_pixelRatio;\n\n vec2 grid = fract(uv / vec2(u_gridSpacingX, u_gridSpacingY)) + 1e-4;\n vec2 grid_idx = floor(uv / vec2(u_gridSpacingX, u_gridSpacingY));\n float sizeRandomizer = .5 + .8 * snoise(2. * vec2(grid_idx.x * 100., grid_idx.y));\n float opacity_randomizer = .5 + .7 * snoise(2. * vec2(grid_idx.y, grid_idx.x));\n\n vec2 center = vec2(0.5) - 1e-3;\n vec2 p = (grid - center) * vec2(u_gridSpacingX, u_gridSpacingY);\n\n float baseSize = u_dotSize * (1. - sizeRandomizer * u_sizeRange);\n float strokeWidth = u_strokeWidth;\n\n float dist;\n if (u_shape < 0.5) {\n // Circle\n dist = length(p);\n } else if (u_shape < 1.5) {\n // Diamond\n strokeWidth *= 1.5;\n dist = polygon(1.5 * p, 4., .25 * PI);\n } else if (u_shape < 2.5) {\n // Square\n dist = polygon(1.03 * p, 4., 1e-3);\n } else {\n // Triangle\n strokeWidth *= 1.5;\n p = p * 2. - 1.;\n p *= .9;\n p.y -= .75 * baseSize;\n dist = polygon(p, 3., 1e-3);\n }\n\n float edgeWidth = fwidth(dist);\n float shapeOuter = smoothstep(baseSize + edgeWidth + strokeWidth, baseSize - edgeWidth + strokeWidth, dist);\n float shapeInner = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist);\n float stroke = clamp(shapeOuter - shapeInner, 0., 1.);\n\n float dot_opacity = max(0., 1. - opacity_randomizer * u_opacityRange);\n\n vec3 color = u_colorFill.rgb * u_colorFill.a * dot_opacity * shapeInner;\n color = mix(color, u_colorStroke.rgb, u_colorStroke.a * dot_opacity * stroke);\n\n float opacity = u_colorFill.a * shapeInner * dot_opacity;\n opacity += u_colorStroke.a * stroke * dot_opacity;\n\n fragColor = vec4(color, opacity);\n}\n";
18
+ export declare const dotGridFragmentShader: string;
19
+ export interface DotGridUniforms extends ShaderSizingUniforms {
20
+ u_colorBack: [number, number, number, number];
21
+ u_colorFill: [number, number, number, number];
22
+ u_colorStroke: [number, number, number, number];
23
+ u_dotSize: number;
24
+ u_gridSpacingX: number;
25
+ u_gridSpacingY: number;
26
+ u_strokeWidth: number;
27
+ u_sizeRange: number;
28
+ u_opacityRange: number;
29
+ u_shape: (typeof DotGridShapes)[DotGridShape];
30
+ }
31
+ export interface DotGridParams extends ShaderSizingParams {
32
+ colorBack?: string;
33
+ colorFill?: string;
34
+ colorStroke?: string;
35
+ dotSize?: number;
36
+ gridSpacingX?: number;
37
+ gridSpacingY?: number;
38
+ strokeWidth?: number;
39
+ sizeRange?: number;
40
+ opacityRange?: number;
41
+ shape?: DotGridShape;
42
+ }
43
+ export declare const DotGridShapes: {
44
+ readonly circle: 0;
45
+ readonly diamond: 1;
46
+ readonly square: 2;
47
+ readonly triangle: 3;
48
+ };
49
+ export type DotGridShape = keyof typeof DotGridShapes;
@@ -0,0 +1,100 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing";
7
+ import { declarePI, declareSimplexNoise } from "../shader-utils";
8
+ const dotGridFragmentShader = `#version 300 es
9
+ precision highp float;
10
+
11
+ uniform vec4 u_colorBack;
12
+ uniform vec4 u_colorFill;
13
+ uniform vec4 u_colorStroke;
14
+ uniform float u_dotSize;
15
+ uniform float u_gridSpacingX;
16
+ uniform float u_gridSpacingY;
17
+ uniform float u_strokeWidth;
18
+ uniform float u_sizeRange;
19
+ uniform float u_opacityRange;
20
+ uniform float u_shape;
21
+
22
+ ${sizingVariablesDeclaration}
23
+
24
+ out vec4 fragColor;
25
+
26
+ ${declarePI}
27
+ ${declareSimplexNoise}
28
+
29
+ float polygon(vec2 p, float N, float rot) {
30
+ float a = atan(p.x, p.y) + rot;
31
+ float r = TWO_PI / float(N);
32
+
33
+ return cos(floor(.5 + a / r) * r - a) * length(p);
34
+ }
35
+
36
+ void main() {
37
+
38
+ vec2 shape_uv = v_patternUV;
39
+ shape_uv += .5;
40
+
41
+ vec2 grid = fract(shape_uv / vec2(u_gridSpacingX, u_gridSpacingY)) + 1e-4;
42
+ vec2 grid_idx = floor(shape_uv / vec2(u_gridSpacingX, u_gridSpacingY));
43
+ float sizeRandomizer = .5 + .8 * snoise(2. * vec2(grid_idx.x * 100., grid_idx.y));
44
+ float opacity_randomizer = .5 + .7 * snoise(2. * vec2(grid_idx.y, grid_idx.x));
45
+
46
+ vec2 center = vec2(0.5) - 1e-3;
47
+ vec2 p = (grid - center) * vec2(u_gridSpacingX, u_gridSpacingY);
48
+
49
+ float baseSize = u_dotSize * (1. - sizeRandomizer * u_sizeRange);
50
+ float strokeWidth = u_strokeWidth * (1. - sizeRandomizer * u_sizeRange);
51
+
52
+ float dist;
53
+ if (u_shape < 0.5) {
54
+ // Circle
55
+ dist = length(p);
56
+ } else if (u_shape < 1.5) {
57
+ // Diamond
58
+ strokeWidth *= 1.5;
59
+ dist = polygon(1.5 * p, 4., .25 * PI);
60
+ } else if (u_shape < 2.5) {
61
+ // Square
62
+ dist = polygon(1.03 * p, 4., 1e-3);
63
+ } else {
64
+ // Triangle
65
+ strokeWidth *= 1.5;
66
+ p = p * 2. - 1.;
67
+ p *= .9;
68
+ p.y -= .75 * baseSize;
69
+ dist = polygon(p, 3., 1e-3);
70
+ }
71
+
72
+ float edgeWidth = fwidth(dist);
73
+ float shapeOuter = smoothstep(baseSize + edgeWidth + strokeWidth, baseSize - edgeWidth + strokeWidth, dist);
74
+ float shapeInner = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist);
75
+ float stroke = clamp(shapeOuter - shapeInner, 0., 1.);
76
+
77
+ float dot_opacity = max(0., 1. - opacity_randomizer * u_opacityRange);
78
+
79
+ vec3 color = u_colorBack.rgb * u_colorBack.a;
80
+ color = mix(color, u_colorFill.rgb, u_colorFill.a * dot_opacity * shapeInner);
81
+ color = mix(color, u_colorStroke.rgb, u_colorStroke.a * dot_opacity * stroke);
82
+
83
+ float opacity = u_colorBack.a;
84
+ opacity += u_colorFill.a * shapeInner * dot_opacity;
85
+ opacity += u_colorStroke.a * stroke * dot_opacity;
86
+
87
+ fragColor = vec4(color, opacity);
88
+ }
89
+ `;
90
+ const DotGridShapes = {
91
+ circle: 0,
92
+ diamond: 1,
93
+ square: 2,
94
+ triangle: 3
95
+ };
96
+ export {
97
+ DotGridShapes,
98
+ dotGridFragmentShader
99
+ };
100
+ //# sourceMappingURL=dot-grid.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/dot-grid.ts"],
4
+ "sourcesContent": ["import { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declarePI, declareSimplexNoise } from '../shader-utils';\n\n/**\n * Dot Grid Pattern\n * (the size parameters are set in pixels)\n *\n * Uniforms include:\n * u_colorBack - the background color\n * u_colorFill - the fill color\n * u_colorStroke - the stroke color\n * u_dotSize (px) - the base dot radius\n * u_strokeWidth (px) - the stroke (to be subtracted from u_dotSize)\n * u_gridSpacingX (px) - horizontal grid spacing\n * u_gridSpacingY (px) - xertical grid spacing\n * u_sizeRange (0 .. 1) - variety of dot size\n * u_opacityRange(0 .. 1) - variety of dot opacity to be applied equally to fill and stroke\n * u_shape - shape code (0 - circle, 1 - diamond, 2 - square, 3 - triangle)\n */\nexport const dotGridFragmentShader: string = `#version 300 es\nprecision highp float;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorFill;\nuniform vec4 u_colorStroke;\nuniform float u_dotSize;\nuniform float u_gridSpacingX;\nuniform float u_gridSpacingY;\nuniform float u_strokeWidth;\nuniform float u_sizeRange;\nuniform float u_opacityRange;\nuniform float u_shape;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareSimplexNoise}\n\nfloat polygon(vec2 p, float N, float rot) {\n float a = atan(p.x, p.y) + rot;\n float r = TWO_PI / float(N);\n\n return cos(floor(.5 + a / r) * r - a) * length(p);\n}\n\nvoid main() {\n \n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n\n vec2 grid = fract(shape_uv / vec2(u_gridSpacingX, u_gridSpacingY)) + 1e-4;\n vec2 grid_idx = floor(shape_uv / vec2(u_gridSpacingX, u_gridSpacingY));\n float sizeRandomizer = .5 + .8 * snoise(2. * vec2(grid_idx.x * 100., grid_idx.y));\n float opacity_randomizer = .5 + .7 * snoise(2. * vec2(grid_idx.y, grid_idx.x));\n\n vec2 center = vec2(0.5) - 1e-3;\n vec2 p = (grid - center) * vec2(u_gridSpacingX, u_gridSpacingY);\n\n float baseSize = u_dotSize * (1. - sizeRandomizer * u_sizeRange);\n float strokeWidth = u_strokeWidth * (1. - sizeRandomizer * u_sizeRange);\n\n float dist;\n if (u_shape < 0.5) {\n // Circle\n dist = length(p);\n } else if (u_shape < 1.5) {\n // Diamond\n strokeWidth *= 1.5;\n dist = polygon(1.5 * p, 4., .25 * PI);\n } else if (u_shape < 2.5) {\n // Square\n dist = polygon(1.03 * p, 4., 1e-3);\n } else {\n // Triangle\n strokeWidth *= 1.5;\n p = p * 2. - 1.;\n p *= .9;\n p.y -= .75 * baseSize;\n dist = polygon(p, 3., 1e-3);\n }\n\n float edgeWidth = fwidth(dist);\n float shapeOuter = smoothstep(baseSize + edgeWidth + strokeWidth, baseSize - edgeWidth + strokeWidth, dist);\n float shapeInner = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist);\n float stroke = clamp(shapeOuter - shapeInner, 0., 1.);\n\n float dot_opacity = max(0., 1. - opacity_randomizer * u_opacityRange);\n\n vec3 color = u_colorBack.rgb * u_colorBack.a;\n color = mix(color, u_colorFill.rgb, u_colorFill.a * dot_opacity * shapeInner);\n color = mix(color, u_colorStroke.rgb, u_colorStroke.a * dot_opacity * stroke);\n\n float opacity = u_colorBack.a;\n opacity += u_colorFill.a * shapeInner * dot_opacity;\n opacity += u_colorStroke.a * stroke * dot_opacity;\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotGridUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colorFill: [number, number, number, number];\n u_colorStroke: [number, number, number, number];\n u_dotSize: number;\n u_gridSpacingX: number;\n u_gridSpacingY: number;\n u_strokeWidth: number;\n u_sizeRange: number;\n u_opacityRange: number;\n u_shape: (typeof DotGridShapes)[DotGridShape];\n}\n\nexport interface DotGridParams extends ShaderSizingParams {\n colorBack?: string;\n colorFill?: string;\n colorStroke?: string;\n dotSize?: number;\n gridSpacingX?: number;\n gridSpacingY?: number;\n strokeWidth?: number;\n sizeRange?: number;\n opacityRange?: number;\n shape?: DotGridShape;\n}\n\nexport const DotGridShapes = {\n circle: 0,\n diamond: 1,\n square: 2,\n triangle: 3,\n} as const;\n\nexport type DotGridShape = keyof typeof DotGridShapes;\n"],
5
+ "mappings": ";;;;;AAAA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,2BAA2B;AAkBxC,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc3C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Fd,MAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;",
6
+ "names": []
7
+ }
@@ -1,12 +1,8 @@
1
- export type DotOrbitUniforms = {
2
- u_scale: number;
3
- u_color1: [number, number, number, number];
4
- u_color2: [number, number, number, number];
5
- u_color3: [number, number, number, number];
6
- u_color4: [number, number, number, number];
7
- u_dotSize: number;
8
- u_dotSizeRange: number;
9
- u_spreading: number;
1
+ import type { vec4 } from '../types';
2
+ import type { ShaderMotionParams } from '../shader-mount';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
4
+ export declare const dotOrbitMeta: {
5
+ readonly maxColorCount: 10;
10
6
  };
11
7
  /**
12
8
  * Dot Pattern with dot moving around their grid position
@@ -14,13 +10,26 @@ export type DotOrbitUniforms = {
14
10
  * Renders a dot pattern with dot placed in the center of each cell of animated Voronoi diagram
15
11
  *
16
12
  * Uniforms include:
17
- * u_scale - the scale applied to user space
18
- * u_color1 - the first color
19
- * u_color2 - the second color
20
- * u_color3 - the third color
21
- * u_color4 - the fourth color
22
- * u_dotSize (0 .. 1) - the base dot radius (relative to cell size)
23
- * u_dotSizeRange (0 .. 1) - the dot radius to vary between the cells
24
- * u_spreading (0 .. 1) - the distance each dot can move around the regular grid
13
+ * - u_colors (vec4[]): Input RGBA colors
14
+ * - u_colorsCount (float): Number of active colors (`u_colors` length)
15
+ * - u_stepsPerColor (float): Discretization of the color transition
16
+ * - u_dotSize (float, 0 .. 1): Base dot radius (relative to cell size)
17
+ * - u_dotSizeRange (float, 0 .. 1): Dot radius to vary between the cells
18
+ * - u_spreading (float, 0 .. 1): the distance each dot can move around the regular grid
25
19
  */
26
- export declare const dotOrbitFragmentShader = "#version 300 es\nprecision highp float;\n\nuniform float u_time;\nuniform float u_pixelRatio;\nuniform vec2 u_resolution;\n\nuniform float u_scale;\nuniform vec4 u_color1;\nuniform vec4 u_color2;\nuniform vec4 u_color3;\nuniform vec4 u_color4;\nuniform float u_dotSize;\nuniform float u_dotSizeRange;\nuniform float u_spreading;\n\nout vec4 fragColor;\n\n#define TWO_PI 6.28318530718\n\nfloat random(in vec2 st) {\n return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);\n}\nvec2 random2(vec2 p) {\n return vec2(random(p), random(200. * p));\n}\n\nvec3 get_voronoi_shape(vec2 _uv, float time) {\n vec2 i_uv = floor(_uv);\n vec2 f_uv = fract(_uv);\n\n float min_dist = 1.;\n vec2 cell_randomizer = vec2(0.);\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 tile_offset = vec2(float(x), float(y));\n vec2 rand = random2(i_uv + tile_offset);\n vec2 cell_center = .5 + 1e-4 + .25 * clamp(u_spreading, 0., 1.) * sin(time + TWO_PI * rand);\n float dist = length(tile_offset + cell_center - f_uv);\n if (dist < min_dist) {\n min_dist = dist;\n cell_randomizer = rand;\n }\n min_dist = min(min_dist, dist);\n }\n }\n\n return vec3(min_dist, cell_randomizer);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / u_resolution.xy;\n\n uv -= .5;\n float scale = .5 * u_scale + 1e-4;\n uv *= (.02 * (1. - step(1. - scale, 1.) / scale));\n uv *= u_resolution;\n uv /= u_pixelRatio;\n uv += .5;\n\n float t = u_time;\n\n vec3 voronoi = get_voronoi_shape(uv, t) + 1e-4;\n\n float radius = .25 * clamp(u_dotSize, 0., 1.) - .5 * clamp(u_dotSizeRange, 0., 1.) * voronoi[2];\n float dist = voronoi[0];\n float edge_width = fwidth(dist);\n float shape = smoothstep(radius + edge_width, radius - edge_width, dist);\n\n float color_randomizer = voronoi[1];\n\n float opacity =\n u_color1.a * step(0.0, color_randomizer) * step(color_randomizer, 0.25) +\n u_color2.a * step(0.25, color_randomizer) * step(color_randomizer, 0.5) +\n u_color3.a * step(0.5, color_randomizer) * step(color_randomizer, 0.75) +\n u_color4.a * step(0.75, color_randomizer) * step(color_randomizer, 1.0);\n\n opacity *= shape;\n\n vec3 color =\n u_color1.rgb * step(0.0, color_randomizer) * step(color_randomizer, 0.25) +\n u_color2.rgb * step(0.25, color_randomizer) * step(color_randomizer, 0.5) +\n u_color3.rgb * step(0.5, color_randomizer) * step(color_randomizer, 0.75) +\n u_color4.rgb * step(0.75, color_randomizer) * step(color_randomizer, 1.0);\n\n fragColor = vec4(color * opacity, opacity);\n}\n";
20
+ export declare const dotOrbitFragmentShader: string;
21
+ export interface DotOrbitUniforms extends ShaderSizingUniforms {
22
+ u_colors: vec4[];
23
+ u_colorsCount: number;
24
+ u_dotSize: number;
25
+ u_dotSizeRange: number;
26
+ u_spreading: number;
27
+ u_stepsPerColor: number;
28
+ }
29
+ export interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {
30
+ colors?: string[];
31
+ dotSize?: number;
32
+ dotSizeRange?: number;
33
+ spreading?: number;
34
+ stepsPerColor?: number;
35
+ }
@@ -0,0 +1,120 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing";
7
+ import { declarePI, declareRandom, declareRotate } from "../shader-utils";
8
+ const dotOrbitMeta = {
9
+ maxColorCount: 10
10
+ };
11
+ const dotOrbitFragmentShader = `#version 300 es
12
+ precision highp float;
13
+
14
+ uniform float u_time;
15
+
16
+ uniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];
17
+ uniform float u_colorsCount;
18
+ uniform float u_stepsPerColor;
19
+ uniform float u_dotSize;
20
+ uniform float u_dotSizeRange;
21
+ uniform float u_spreading;
22
+
23
+ ${sizingVariablesDeclaration}
24
+
25
+ out vec4 fragColor;
26
+
27
+ ${declarePI}
28
+ ${declareRandom}
29
+ ${declareRotate}
30
+
31
+ vec2 random2(vec2 p) {
32
+ return vec2(random(p), random(200. * p));
33
+ }
34
+
35
+ vec3 voronoiShape(vec2 uv, float time) {
36
+ vec2 i_uv = floor(uv);
37
+ vec2 f_uv = fract(uv);
38
+
39
+ float spreading = .25 * clamp(u_spreading, 0., 1.);
40
+
41
+ float minDist = 1.;
42
+ vec2 randomizer = vec2(0.);
43
+ for (int y = -1; y <= 1; y++) {
44
+ for (int x = -1; x <= 1; x++) {
45
+ vec2 tileOffset = vec2(float(x), float(y));
46
+ vec2 rand = random2(i_uv + tileOffset);
47
+ vec2 cellCenter = vec2(.5 + 1e-4);
48
+ cellCenter += spreading * cos(time + TWO_PI * rand);
49
+ cellCenter -= .5;
50
+ cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);
51
+ cellCenter += .5;
52
+ float dist = length(tileOffset + cellCenter - f_uv);
53
+ if (dist < minDist) {
54
+ minDist = dist;
55
+ randomizer = rand;
56
+ }
57
+ minDist = min(minDist, dist);
58
+ }
59
+ }
60
+
61
+ return vec3(minDist, randomizer);
62
+ }
63
+
64
+ void main() {
65
+
66
+ vec2 shape_uv = v_patternUV;
67
+ shape_uv += .5;
68
+ shape_uv *= .015;
69
+
70
+ float t = u_time;
71
+
72
+ vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;
73
+
74
+ float radius = .25 * clamp(u_dotSize, 0., 1.) - .5 * clamp(u_dotSizeRange, 0., 1.) * voronoi[2];
75
+ float dist = voronoi[0];
76
+ float edgeWidth = fwidth(dist);
77
+ float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);
78
+
79
+ float shape = voronoi[1];
80
+
81
+ float mixer = shape * (u_colorsCount - 1.);
82
+ mixer = (shape - .5 / u_colorsCount) * u_colorsCount;
83
+ float steps = max(1., u_stepsPerColor);
84
+
85
+ vec4 gradient = u_colors[0];
86
+ gradient.rgb *= gradient.a;
87
+ for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {
88
+ if (i >= int(u_colorsCount)) break;
89
+ float localT = clamp(mixer - float(i - 1), 0.0, 1.0);
90
+ localT = round(localT * steps) / steps;
91
+ vec4 c = u_colors[i];
92
+ c.rgb *= c.a;
93
+ gradient = mix(gradient, c, localT);
94
+ }
95
+
96
+ if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {
97
+ float localT = mixer + 1.;
98
+ if (mixer > (u_colorsCount - 1.)) {
99
+ localT = mixer - (u_colorsCount - 1.);
100
+ }
101
+ localT = round(localT * steps) / steps;
102
+ vec4 cFst = u_colors[0];
103
+ cFst.rgb *= cFst.a;
104
+ vec4 cLast = u_colors[int(u_colorsCount - 1.)];
105
+ cLast.rgb *= cLast.a;
106
+ gradient = mix(cLast, cFst, localT);
107
+ }
108
+
109
+ gradient *= dots;
110
+ vec3 color = gradient.rgb;
111
+ float opacity = gradient.a;
112
+
113
+ fragColor = vec4(color, opacity);
114
+ }
115
+ `;
116
+ export {
117
+ dotOrbitFragmentShader,
118
+ dotOrbitMeta
119
+ };
120
+ //# sourceMappingURL=dot-orbit.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/dot-orbit.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types';\nimport type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declarePI, declareRandom, declareRotate } from '../shader-utils';\n\nexport const dotOrbitMeta = {\n maxColorCount: 10,\n} as const;\n\n/**\n * Dot Pattern with dot moving around their grid position\n * The artwork by Ksenia Kondrashova\n * Renders a dot pattern with dot placed in the center of each cell of animated Voronoi diagram\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): Discretization of the color transition\n * - u_dotSize (float, 0 .. 1): Base dot radius (relative to cell size)\n * - u_dotSizeRange (float, 0 .. 1): Dot radius to vary between the cells\n * - u_spreading (float, 0 .. 1): the distance each dot can move around the regular grid\n */\nexport const dotOrbitFragmentShader: string = `#version 300 es\nprecision highp float;\n\nuniform float u_time;\n\nuniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_stepsPerColor;\nuniform float u_dotSize;\nuniform float u_dotSizeRange;\nuniform float u_spreading;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n\nvec2 random2(vec2 p) {\n return vec2(random(p), random(200. * p));\n}\n\nvec3 voronoiShape(vec2 uv, float time) {\n vec2 i_uv = floor(uv);\n vec2 f_uv = fract(uv);\n \n float spreading = .25 * clamp(u_spreading, 0., 1.);\n\n float minDist = 1.;\n vec2 randomizer = vec2(0.);\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 tileOffset = vec2(float(x), float(y));\n vec2 rand = random2(i_uv + tileOffset);\n vec2 cellCenter = vec2(.5 + 1e-4);\n cellCenter += spreading * cos(time + TWO_PI * rand);\n cellCenter -= .5;\n cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);\n cellCenter += .5;\n float dist = length(tileOffset + cellCenter - f_uv);\n if (dist < minDist) {\n minDist = dist;\n randomizer = rand;\n }\n minDist = min(minDist, dist);\n }\n }\n\n return vec3(minDist, randomizer);\n}\n\nvoid main() {\n \n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n shape_uv *= .015;\n \n float t = u_time;\n\n vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;\n\n float radius = .25 * clamp(u_dotSize, 0., 1.) - .5 * clamp(u_dotSizeRange, 0., 1.) * voronoi[2];\n float dist = voronoi[0];\n float edgeWidth = fwidth(dist);\n float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);\n\n float shape = voronoi[1];\n \n float mixer = shape * (u_colorsCount - 1.);\n mixer = (shape - .5 / u_colorsCount) * u_colorsCount;\n float steps = max(1., u_stepsPerColor);\n \n vec4 gradient = u_colors[0];\n gradient.rgb *= gradient.a;\n for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n float localT = clamp(mixer - float(i - 1), 0.0, 1.0);\n localT = round(localT * steps) / steps;\n vec4 c = u_colors[i];\n c.rgb *= c.a;\n gradient = mix(gradient, c, localT);\n }\n\n if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {\n float localT = mixer + 1.;\n if (mixer > (u_colorsCount - 1.)) {\n localT = mixer - (u_colorsCount - 1.);\n }\n localT = round(localT * steps) / steps;\n vec4 cFst = u_colors[0];\n cFst.rgb *= cFst.a;\n vec4 cLast = u_colors[int(u_colorsCount - 1.)];\n cLast.rgb *= cLast.a;\n gradient = mix(cLast, cFst, localT);\n }\n\n gradient *= dots;\n vec3 color = gradient.rgb;\n float opacity = gradient.a;\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotOrbitUniforms extends ShaderSizingUniforms {\n u_colors: vec4[];\n u_colorsCount: number;\n u_dotSize: number;\n u_dotSizeRange: number;\n u_spreading: number;\n u_stepsPerColor: number;\n}\n\nexport interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {\n colors?: string[];\n dotSize?: number;\n dotSizeRange?: number;\n spreading?: number;\n stepsPerColor?: number;\n}\n"],
5
+ "mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,qBAAqB;AAEjD,MAAM,eAAe;AAAA,EAC1B,eAAe;AACjB;AAeO,MAAM,yBAAiC;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKtB,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBA0DS,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -1,16 +1,8 @@
1
- export type GodRaysUniforms = {
2
- u_offsetX: number;
3
- u_offsetY: number;
4
- u_colorBack: [number, number, number, number];
5
- u_color1: [number, number, number, number];
6
- u_color2: [number, number, number, number];
7
- u_color3: [number, number, number, number];
8
- u_spotty: number;
9
- u_midSize: number;
10
- u_midIntensity: number;
11
- u_frequency: number;
12
- u_density: number;
13
- u_blending: number;
1
+ import type { vec4 } from '../types';
2
+ import type { ShaderMotionParams } from '../shader-mount';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
4
+ export declare const godRaysMeta: {
5
+ readonly maxColorCount: 5;
14
6
  };
15
7
  /**
16
8
  * GodRays pattern
@@ -19,17 +11,34 @@ export type GodRaysUniforms = {
19
11
  *
20
12
  * Uniforms include:
21
13
  *
22
- * u_offsetX - left / right pan
23
- * u_offsetY - up / down pan
24
- * u_colorBack - background RGBA color
25
- * u_color1 - ray color #1 (also main color of middle spot)
26
- * u_color2 - ray color #2
27
- * u_color3 - ray color #3
28
- * u_frequency - the frequency of rays (the number of sectors)
29
- * u_spotty - the density of spots in the rings (higher = more spots)
30
- * u_midSize - the size of the central shape within the rings
31
- * u_midIntensity - the influence of the central shape on the rings
32
- * u_density (0 .. 1) - the number of visible rays
33
- * u_blending (0 .. 1) - blending mode (0 for color mix, 1 for additive blending)
14
+ * - u_colorBack: background RGBA color
15
+ * - uColors (vec4[]): Input RGBA colors
16
+ * - u_frequency: the frequency of rays (the number of sectors)
17
+ * - u_spotty: the density of spots in the rings (higher = more spots)
18
+ * - u_midSize: the size of the central shape within the rings
19
+ * - u_midIntensity: the influence of the central shape on the rings
20
+ * - u_density (0 .. 1): the number of visible rays
21
+ * - u_blending (0 .. 1): normal / additive blending
34
22
  */
35
- export declare const godRaysFragmentShader = "#version 300 es\nprecision highp float;\n\nuniform float u_time;\nuniform float u_pixelRatio;\nuniform vec2 u_resolution;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_color1;\nuniform vec4 u_color2;\nuniform vec4 u_color3;\n\nuniform float u_offsetX;\nuniform float u_offsetY;\n\nuniform float u_frequency;\nuniform float u_spotty;\nuniform float u_midSize;\nuniform float u_midIntensity;\nuniform float u_density;\nuniform float u_blending;\n\nout vec4 fragColor;\n\n#define TWO_PI 6.28318530718\n\nfloat random(vec2 uv) {\n return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453123);\n}\n\nvec2 rotate(vec2 uv, float th) {\n return mat2(cos(th), sin(th), -sin(th), cos(th)) * uv;\n}\n\nfloat noise(vec2 uv) {\n vec2 i = floor(uv);\n vec2 f = fract(uv);\n\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\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 get_noise_shape(vec2 uv, float r, float freq, float density, float time) {\n uv = rotate(uv, .05 * time);\n float a = atan(uv.y, uv.x);\n r -= 3. * time;\n vec2 left = vec2(a * freq, r);\n vec2 right = vec2(mod(a, TWO_PI) * freq, r);\n float n_left = pow(noise(left), density);\n float n_right = pow(noise(right), density);\n float shape = mix(n_right, n_left, smoothstep(-.2, .2, uv.x));\n return shape;\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / u_resolution.xy;\n float ratio = u_resolution.x / u_resolution.y;\n\n uv -= .5;\n uv += vec2(-u_offsetX, u_offsetY);\n uv.x *= ratio;\n\n float t = .2 * u_time;\n\n float radius = length(uv);\n float spots = 4. * abs(u_spotty);\n float density = 4. - 3. * clamp(u_density, 0., 1.);\n\n float rays1 = get_noise_shape(uv, radius * spots, 5. * u_frequency, density, t);\n rays1 *= get_noise_shape(uv, .5 + .75 * radius * spots, 4. * u_frequency, density, -.5 * t);\n \n float rays2 = get_noise_shape(uv, 1.5 * radius, 12. * u_frequency, density, t);\n rays2 *= get_noise_shape(uv, -.5 + 1.1 * radius * spots, 7. * u_frequency, density, .75 * t);\n \n float rays3 = get_noise_shape(uv, 2. * radius * spots, 10. * u_frequency, density, t);\n rays3 *= get_noise_shape(uv, 1.1 * radius, 12. * u_frequency, density, .2 * t);\n\n float mid_shape = smoothstep(1. * abs(u_midSize), .05 * abs(u_midSize), radius); \n rays3 = mix(rays3, 1., (.5 + .5 * rays1) * u_midIntensity * pow(mid_shape, 7.));\n rays2 = mix(rays2, 1., (.5 + .5 * rays3) * u_midIntensity * pow(mid_shape, 3.));\n rays1 = mix(rays1, 1., u_midIntensity * pow(mid_shape, 5.));\n \n float opacity = rays2 * u_color2.a;\n opacity += rays3 * u_color3.a;\n opacity += rays1 * u_color1.a;\n opacity += u_colorBack.a * (1.0 - rays1 * u_color1.a - rays2 * u_color2.a - rays3 * u_color3.a);\n opacity = clamp(opacity, 0.0, 1.0);\n\n vec3 added_color = u_colorBack.rgb * (1. - (rays1 + rays2 + rays3)) * u_colorBack.a;\n added_color += u_color1.rgb * rays1 * u_color1.a;\n added_color += u_color2.rgb * rays2 * u_color2.a;\n added_color += u_color3.rgb * rays3 * u_color3.a;\n\n added_color += u_colorBack.rgb * rays1 * (1.0 - u_color1.a) * u_colorBack.a;\n added_color += u_colorBack.rgb * rays2 * (1.0 - u_color2.a) * u_colorBack.a;\n added_color += u_colorBack.rgb * rays3 * (1.0 - u_color3.a) * u_colorBack.a;\n \n vec3 mixed_color = mix(u_colorBack.rgb * u_colorBack.a, u_color2.rgb, rays2 * u_color2.a);\n mixed_color = mix(mixed_color, u_color3.rgb, rays3 * u_color3.a);\n mixed_color = mix(mixed_color, u_color1.rgb, rays1 * u_color1.a);\n \n vec3 color = mix(mixed_color, added_color, clamp(u_blending, 0., 1.));\n \n fragColor = vec4(color, opacity);\n}\n";
23
+ export declare const godRaysFragmentShader: string;
24
+ export interface GodRaysUniforms extends ShaderSizingUniforms {
25
+ u_colorBack: [number, number, number, number];
26
+ u_colors: vec4[];
27
+ u_colorsCount: number;
28
+ u_spotty: number;
29
+ u_midSize: number;
30
+ u_midIntensity: number;
31
+ u_frequency: number;
32
+ u_density: number;
33
+ u_blending: number;
34
+ }
35
+ export interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {
36
+ colorBack?: string;
37
+ colors?: string[];
38
+ spotty?: number;
39
+ midSize?: number;
40
+ midIntensity?: number;
41
+ frequency?: number;
42
+ density?: number;
43
+ blending?: number;
44
+ }
@@ -0,0 +1,134 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { sizingVariablesDeclaration } from "../shader-sizing";
7
+ import { declarePI, declareRandom, declareRotate, colorBandingFix } from "../shader-utils";
8
+ const godRaysMeta = {
9
+ maxColorCount: 5
10
+ };
11
+ const godRaysFragmentShader = `#version 300 es
12
+ precision mediump float;
13
+
14
+ uniform float u_time;
15
+
16
+ uniform vec4 u_colorBack;
17
+ uniform vec4 u_colors[${godRaysMeta.maxColorCount}];
18
+ uniform float u_colorsCount;
19
+
20
+ uniform float u_frequency;
21
+ uniform float u_spotty;
22
+ uniform float u_midSize;
23
+ uniform float u_midIntensity;
24
+ uniform float u_density;
25
+ uniform float u_blending;
26
+
27
+ ${sizingVariablesDeclaration}
28
+
29
+ out vec4 fragColor;
30
+
31
+ ${declarePI}
32
+ ${declareRandom}
33
+ ${declareRotate}
34
+
35
+ float hash(float n) {
36
+ return fract(sin(n * 43758.5453123) * 43758.5453123);
37
+ }
38
+
39
+ float valueNoise(vec2 uv) {
40
+ vec2 i = floor(uv);
41
+ vec2 f = fract(uv);
42
+
43
+ float a = random(i);
44
+ float b = random(i + vec2(1.0, 0.0));
45
+ float c = random(i + vec2(0.0, 1.0));
46
+ float d = random(i + vec2(1.0, 1.0));
47
+
48
+ vec2 u = f * f * (3.0 - 2.0 * f);
49
+
50
+ float x1 = mix(a, b, u.x);
51
+ float x2 = mix(c, d, u.x);
52
+ return mix(x1, x2, u.y);
53
+ }
54
+
55
+ float raysShape(vec2 uv, float r, float freq, float density, float radius) {
56
+ float a = atan(uv.y, uv.x);
57
+ vec2 left = vec2(a * freq, r);
58
+ vec2 right = vec2(mod(a, TWO_PI) * freq, r);
59
+ float n_left = pow(valueNoise(left), density);
60
+ float n_right = pow(valueNoise(right), density);
61
+ float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));
62
+ return shape;
63
+ }
64
+
65
+ void main() {
66
+ vec2 shape_uv = v_objectUV;
67
+
68
+ float t = .2 * u_time;
69
+
70
+ float radius = length(shape_uv);
71
+ float spots = 5. * abs(u_spotty);
72
+
73
+ float density = 4. - 3. * clamp(u_density, 0., 1.);
74
+
75
+ float delta = 1. - smoothstep(0., 1., radius);
76
+
77
+ float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);
78
+ middleShape = pow(middleShape, 5.0);
79
+
80
+ vec3 accumColor = vec3(0.0);
81
+ float accumAlpha = 0.0;
82
+
83
+ for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {
84
+ if (i >= int(u_colorsCount)) break;
85
+
86
+ vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);
87
+
88
+ float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;
89
+ float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;
90
+ float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_frequency;
91
+
92
+ float ray = raysShape(rotatedUV, r1, 5.0 * f, density, radius);
93
+ ray *= raysShape(rotatedUV, r2, 4.0 * f, density, radius);
94
+ ray += (1. + 4. * ray) * middleShape;
95
+ ray = clamp(ray, 0.0, 1.0);
96
+
97
+ float srcAlpha = u_colors[i].a * ray;
98
+ vec3 srcColor = u_colors[i].rgb * srcAlpha;
99
+
100
+ vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;
101
+ float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;
102
+
103
+ vec3 addBlendColor = accumColor + srcColor;
104
+ float addBlendAlpha = accumAlpha + srcAlpha;
105
+
106
+ accumColor = mix(alphaBlendColor, addBlendColor, u_blending);
107
+ accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_blending);
108
+ }
109
+
110
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
111
+
112
+ vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * bgColor;
113
+ float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * u_colorBack.a;
114
+
115
+ vec3 addBlendColor = accumColor + bgColor;
116
+ float addBlendAlpha = accumAlpha + u_colorBack.a;
117
+
118
+ accumColor = mix(alphaBlendColor, addBlendColor, u_blending);
119
+ accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_blending);
120
+
121
+ vec3 color = clamp(accumColor, 0.0, 1.0);
122
+ float opacity = clamp(accumAlpha, 0.0, 1.0);
123
+
124
+
125
+ ${colorBandingFix}
126
+
127
+ fragColor = vec4(color, opacity);
128
+ }
129
+ `;
130
+ export {
131
+ godRaysFragmentShader,
132
+ godRaysMeta
133
+ };
134
+ //# sourceMappingURL=god-rays.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/god-rays.ts"],
4
+ "sourcesContent": ["import type { vec4 } from '../types';\nimport type { ShaderMotionParams } from '../shader-mount';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';\nimport { declarePI, declareRandom, declareRotate, colorBandingFix } from '../shader-utils';\n\nexport const godRaysMeta = {\n maxColorCount: 5,\n} as const;\n\n/**\n * GodRays pattern\n * The artwork by Ksenia Kondrashova\n * Renders a number of circular shapes with gooey effect applied\n *\n * Uniforms include:\n *\n * - u_colorBack: background RGBA color\n * - uColors (vec4[]): Input RGBA colors\n * - u_frequency: the frequency of rays (the number of sectors)\n * - u_spotty: the density of spots in the rings (higher = more spots)\n * - u_midSize: the size of the central shape within the rings\n * - u_midIntensity: the influence of the central shape on the rings\n * - u_density (0 .. 1): the number of visible rays\n * - u_blending (0 .. 1): normal / additive blending\n */\nexport const godRaysFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colors[${godRaysMeta.maxColorCount}];\nuniform float u_colorsCount;\n\nuniform float u_frequency;\nuniform float u_spotty;\nuniform float u_midSize;\nuniform float u_midIntensity;\nuniform float u_density;\nuniform float u_blending;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n\nfloat hash(float n) {\n return fract(sin(n * 43758.5453123) * 43758.5453123);\n}\n\nfloat valueNoise(vec2 uv) {\n vec2 i = floor(uv);\n vec2 f = fract(uv);\n\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\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 raysShape(vec2 uv, float r, float freq, float density, float radius) {\n float a = atan(uv.y, uv.x);\n vec2 left = vec2(a * freq, r);\n vec2 right = vec2(mod(a, TWO_PI) * freq, r);\n float n_left = pow(valueNoise(left), density);\n float n_right = pow(valueNoise(right), density);\n float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));\n return shape;\n}\n\nvoid main() {\n vec2 shape_uv = v_objectUV;\n\n float t = .2 * u_time;\n\n float radius = length(shape_uv);\n float spots = 5. * abs(u_spotty);\n\n float density = 4. - 3. * clamp(u_density, 0., 1.);\n\n float delta = 1. - smoothstep(0., 1., radius);\n\n float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);\n middleShape = pow(middleShape, 5.0);\n\n vec3 accumColor = vec3(0.0);\n float accumAlpha = 0.0;\n\n for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n\n vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);\n\n float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;\n float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;\n float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_frequency;\n\n float ray = raysShape(rotatedUV, r1, 5.0 * f, density, radius);\n ray *= raysShape(rotatedUV, r2, 4.0 * f, density, radius);\n ray += (1. + 4. * ray) * middleShape;\n ray = clamp(ray, 0.0, 1.0);\n\n float srcAlpha = u_colors[i].a * ray;\n vec3 srcColor = u_colors[i].rgb * srcAlpha;\n\n vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;\n float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;\n\n vec3 addBlendColor = accumColor + srcColor;\n float addBlendAlpha = accumAlpha + srcAlpha;\n\n accumColor = mix(alphaBlendColor, addBlendColor, u_blending);\n accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_blending);\n }\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n\n vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * bgColor;\n float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * u_colorBack.a;\n\n vec3 addBlendColor = accumColor + bgColor;\n float addBlendAlpha = accumAlpha + u_colorBack.a;\n\n accumColor = mix(alphaBlendColor, addBlendColor, u_blending);\n accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_blending);\n\n vec3 color = clamp(accumColor, 0.0, 1.0);\n float opacity = clamp(accumAlpha, 0.0, 1.0);\n\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface GodRaysUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_spotty: number;\n u_midSize: number;\n u_midIntensity: number;\n u_frequency: number;\n u_density: number;\n u_blending: number;\n}\n\nexport interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colors?: string[];\n spotty?: number;\n midSize?: number;\n midIntensity?: number;\n frequency?: number;\n density?: number;\n blending?: number;\n}\n"],
5
+ "mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,eAAe,uBAAuB;AAElE,MAAM,cAAc;AAAA,EACzB,eAAe;AACjB;AAkBO,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMrB,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAkDS,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0C7C,eAAe;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ import type { vec4 } from '../types';
2
+ import type { ShaderMotionParams } from '../shader-mount';
3
+ import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
4
+ export declare const grainGradientMeta: {
5
+ readonly maxColorCount: 7;
6
+ };
7
+ /**
8
+ * Grainy Gradient Ksenia Kondrashova
9
+ */
10
+ export declare const grainGradientFragmentShader: string;
11
+ export interface GrainGradientUniforms extends ShaderSizingUniforms {
12
+ u_colors: vec4[];
13
+ u_colorsCount: number;
14
+ u_softness: number;
15
+ u_intensity: number;
16
+ u_noise: number;
17
+ u_shape: number;
18
+ }
19
+ export interface GrainGradientParams extends ShaderSizingParams, ShaderMotionParams {
20
+ colors?: string[];
21
+ softness?: number;
22
+ intensity?: number;
23
+ noise?: number;
24
+ shape?: number;
25
+ }