interactive-bg 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +202 -2
- package/dist/core/canvas2d-renderer.cjs +119 -0
- package/dist/core/canvas2d-renderer.cjs.map +1 -0
- package/dist/core/canvas2d-renderer.d.cts +7 -0
- package/dist/core/canvas2d-renderer.d.ts +7 -0
- package/dist/core/canvas2d-renderer.js +119 -0
- package/dist/core/canvas2d-renderer.js.map +1 -0
- package/dist/core/color.cjs +46 -0
- package/dist/core/color.cjs.map +1 -0
- package/dist/core/color.d.cts +6 -0
- package/dist/core/color.d.ts +6 -0
- package/dist/core/color.js +46 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/engine.cjs +367 -0
- package/dist/core/engine.cjs.map +1 -0
- package/dist/core/engine.d.cts +69 -0
- package/dist/core/engine.d.ts +69 -0
- package/dist/core/engine.js +366 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/style.cjs +21 -0
- package/dist/core/style.cjs.map +1 -0
- package/dist/core/style.d.cts +85 -0
- package/dist/core/style.d.ts +85 -0
- package/dist/core/style.js +21 -0
- package/dist/core/style.js.map +1 -0
- package/dist/core/surface.cjs +25 -0
- package/dist/core/surface.cjs.map +1 -0
- package/dist/core/surface.d.cts +42 -0
- package/dist/core/surface.d.ts +42 -0
- package/dist/core/surface.js +24 -0
- package/dist/core/surface.js.map +1 -0
- package/dist/core/webgl-renderer.cjs +137 -0
- package/dist/core/webgl-renderer.cjs.map +1 -0
- package/dist/core/webgl-renderer.d.cts +8 -0
- package/dist/core/webgl-renderer.d.ts +8 -0
- package/dist/core/webgl-renderer.js +137 -0
- package/dist/core/webgl-renderer.js.map +1 -0
- package/dist/core/webgl.cjs +62 -0
- package/dist/core/webgl.cjs.map +1 -0
- package/dist/core/webgl.d.cts +15 -0
- package/dist/core/webgl.d.ts +15 -0
- package/dist/core/webgl.js +60 -0
- package/dist/core/webgl.js.map +1 -0
- package/dist/dots/canvas2d.cjs +14 -0
- package/dist/dots/canvas2d.cjs.map +1 -0
- package/dist/dots/canvas2d.d.cts +5 -0
- package/dist/dots/canvas2d.d.ts +5 -0
- package/dist/dots/canvas2d.js +13 -0
- package/dist/dots/canvas2d.js.map +1 -0
- package/dist/dots/index.cjs +16 -0
- package/dist/dots/index.cjs.map +1 -0
- package/dist/dots/index.d.cts +5 -0
- package/dist/dots/index.d.ts +5 -0
- package/dist/dots/index.js +15 -0
- package/dist/dots/index.js.map +1 -0
- package/dist/dots/webgl.cjs +14 -0
- package/dist/dots/webgl.cjs.map +1 -0
- package/dist/dots/webgl.d.cts +5 -0
- package/dist/dots/webgl.d.ts +5 -0
- package/dist/dots/webgl.js +13 -0
- package/dist/dots/webgl.js.map +1 -0
- package/dist/index.cjs +24 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +11 -0
- package/dist/index.umd.js +211 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/plus/canvas2d.cjs +14 -0
- package/dist/plus/canvas2d.cjs.map +1 -0
- package/dist/plus/canvas2d.d.cts +5 -0
- package/dist/plus/canvas2d.d.ts +5 -0
- package/dist/plus/canvas2d.js +13 -0
- package/dist/plus/canvas2d.js.map +1 -0
- package/dist/plus/index.cjs +16 -0
- package/dist/plus/index.cjs.map +1 -0
- package/dist/plus/index.d.cts +5 -0
- package/dist/plus/index.d.ts +5 -0
- package/dist/plus/index.js +15 -0
- package/dist/plus/index.js.map +1 -0
- package/dist/plus/webgl.cjs +14 -0
- package/dist/plus/webgl.cjs.map +1 -0
- package/dist/plus/webgl.d.cts +5 -0
- package/dist/plus/webgl.d.ts +5 -0
- package/dist/plus/webgl.js +13 -0
- package/dist/plus/webgl.js.map +1 -0
- package/dist/shared/buffer.cjs +20 -0
- package/dist/shared/buffer.cjs.map +1 -0
- package/dist/shared/buffer.d.cts +11 -0
- package/dist/shared/buffer.d.ts +11 -0
- package/dist/shared/buffer.js +19 -0
- package/dist/shared/buffer.js.map +1 -0
- package/dist/shared/grid-webgl.cjs +63 -0
- package/dist/shared/grid-webgl.cjs.map +1 -0
- package/dist/shared/grid-webgl.d.cts +10 -0
- package/dist/shared/grid-webgl.d.ts +10 -0
- package/dist/shared/grid-webgl.js +61 -0
- package/dist/shared/grid-webgl.js.map +1 -0
- package/dist/shared/grid.cjs +133 -0
- package/dist/shared/grid.cjs.map +1 -0
- package/dist/shared/grid.d.cts +72 -0
- package/dist/shared/grid.d.ts +72 -0
- package/dist/shared/grid.js +123 -0
- package/dist/shared/grid.js.map +1 -0
- package/dist/shared/noise.cjs +166 -0
- package/dist/shared/noise.cjs.map +1 -0
- package/dist/shared/noise.d.cts +4 -0
- package/dist/shared/noise.d.ts +4 -0
- package/dist/shared/noise.js +166 -0
- package/dist/shared/noise.js.map +1 -0
- package/dist/styles/dots/canvas2d.cjs +99 -0
- package/dist/styles/dots/canvas2d.cjs.map +1 -0
- package/dist/styles/dots/canvas2d.d.cts +7 -0
- package/dist/styles/dots/canvas2d.d.ts +7 -0
- package/dist/styles/dots/canvas2d.js +99 -0
- package/dist/styles/dots/canvas2d.js.map +1 -0
- package/dist/styles/dots/definition.cjs +15 -0
- package/dist/styles/dots/definition.cjs.map +1 -0
- package/dist/styles/dots/definition.d.cts +7 -0
- package/dist/styles/dots/definition.d.ts +7 -0
- package/dist/styles/dots/definition.js +16 -0
- package/dist/styles/dots/definition.js.map +1 -0
- package/dist/styles/dots/motion.cjs +6 -0
- package/dist/styles/dots/motion.cjs.map +1 -0
- package/dist/styles/dots/motion.d.cts +2 -0
- package/dist/styles/dots/motion.d.ts +2 -0
- package/dist/styles/dots/motion.js +6 -0
- package/dist/styles/dots/motion.js.map +1 -0
- package/dist/styles/dots/options.cjs +33 -0
- package/dist/styles/dots/options.cjs.map +1 -0
- package/dist/styles/dots/options.d.cts +33 -0
- package/dist/styles/dots/options.d.ts +33 -0
- package/dist/styles/dots/options.js +32 -0
- package/dist/styles/dots/options.js.map +1 -0
- package/dist/styles/dots/webgl.cjs +113 -0
- package/dist/styles/dots/webgl.cjs.map +1 -0
- package/dist/styles/dots/webgl.d.cts +4 -0
- package/dist/styles/dots/webgl.d.ts +4 -0
- package/dist/styles/dots/webgl.js +113 -0
- package/dist/styles/dots/webgl.js.map +1 -0
- package/dist/styles/plus/canvas2d.cjs +88 -0
- package/dist/styles/plus/canvas2d.cjs.map +1 -0
- package/dist/styles/plus/canvas2d.d.cts +8 -0
- package/dist/styles/plus/canvas2d.d.ts +8 -0
- package/dist/styles/plus/canvas2d.js +88 -0
- package/dist/styles/plus/canvas2d.js.map +1 -0
- package/dist/styles/plus/definition.cjs +17 -0
- package/dist/styles/plus/definition.cjs.map +1 -0
- package/dist/styles/plus/definition.d.cts +9 -0
- package/dist/styles/plus/definition.d.ts +9 -0
- package/dist/styles/plus/definition.js +18 -0
- package/dist/styles/plus/definition.js.map +1 -0
- package/dist/styles/plus/motion.cjs +18 -0
- package/dist/styles/plus/motion.cjs.map +1 -0
- package/dist/styles/plus/motion.d.cts +5 -0
- package/dist/styles/plus/motion.d.ts +5 -0
- package/dist/styles/plus/motion.js +18 -0
- package/dist/styles/plus/motion.js.map +1 -0
- package/dist/styles/plus/options.cjs +45 -0
- package/dist/styles/plus/options.cjs.map +1 -0
- package/dist/styles/plus/options.d.cts +45 -0
- package/dist/styles/plus/options.d.ts +45 -0
- package/dist/styles/plus/options.js +43 -0
- package/dist/styles/plus/options.js.map +1 -0
- package/dist/styles/plus/turns.cjs +102 -0
- package/dist/styles/plus/turns.cjs.map +1 -0
- package/dist/styles/plus/turns.d.cts +17 -0
- package/dist/styles/plus/turns.d.ts +17 -0
- package/dist/styles/plus/turns.js +102 -0
- package/dist/styles/plus/turns.js.map +1 -0
- package/dist/styles/plus/webgl.cjs +121 -0
- package/dist/styles/plus/webgl.cjs.map +1 -0
- package/dist/styles/plus/webgl.d.cts +8 -0
- package/dist/styles/plus/webgl.d.ts +8 -0
- package/dist/styles/plus/webgl.js +121 -0
- package/dist/styles/plus/webgl.js.map +1 -0
- package/dist/styles/topo/canvas2d.cjs +77 -0
- package/dist/styles/topo/canvas2d.cjs.map +1 -0
- package/dist/styles/topo/canvas2d.d.cts +4 -0
- package/dist/styles/topo/canvas2d.d.ts +4 -0
- package/dist/styles/topo/canvas2d.js +77 -0
- package/dist/styles/topo/canvas2d.js.map +1 -0
- package/dist/styles/topo/contours.cjs +83 -0
- package/dist/styles/topo/contours.cjs.map +1 -0
- package/dist/styles/topo/contours.d.cts +9 -0
- package/dist/styles/topo/contours.d.ts +9 -0
- package/dist/styles/topo/contours.js +83 -0
- package/dist/styles/topo/contours.js.map +1 -0
- package/dist/styles/topo/definition.cjs +13 -0
- package/dist/styles/topo/definition.cjs.map +1 -0
- package/dist/styles/topo/definition.d.cts +7 -0
- package/dist/styles/topo/definition.d.ts +7 -0
- package/dist/styles/topo/definition.js +14 -0
- package/dist/styles/topo/definition.js.map +1 -0
- package/dist/styles/topo/field.cjs +118 -0
- package/dist/styles/topo/field.cjs.map +1 -0
- package/dist/styles/topo/field.d.cts +26 -0
- package/dist/styles/topo/field.d.ts +26 -0
- package/dist/styles/topo/field.js +118 -0
- package/dist/styles/topo/field.js.map +1 -0
- package/dist/styles/topo/options.cjs +39 -0
- package/dist/styles/topo/options.cjs.map +1 -0
- package/dist/styles/topo/options.d.cts +52 -0
- package/dist/styles/topo/options.d.ts +52 -0
- package/dist/styles/topo/options.js +38 -0
- package/dist/styles/topo/options.js.map +1 -0
- package/dist/styles/topo/terrain.cjs +22 -0
- package/dist/styles/topo/terrain.cjs.map +1 -0
- package/dist/styles/topo/terrain.d.cts +11 -0
- package/dist/styles/topo/terrain.d.ts +11 -0
- package/dist/styles/topo/terrain.js +22 -0
- package/dist/styles/topo/terrain.js.map +1 -0
- package/dist/styles/topo/webgl.cjs +150 -0
- package/dist/styles/topo/webgl.cjs.map +1 -0
- package/dist/styles/topo/webgl.d.cts +7 -0
- package/dist/styles/topo/webgl.d.ts +7 -0
- package/dist/styles/topo/webgl.js +150 -0
- package/dist/styles/topo/webgl.js.map +1 -0
- package/dist/topo/canvas2d.cjs +14 -0
- package/dist/topo/canvas2d.cjs.map +1 -0
- package/dist/topo/canvas2d.d.cts +5 -0
- package/dist/topo/canvas2d.d.ts +5 -0
- package/dist/topo/canvas2d.js +13 -0
- package/dist/topo/canvas2d.js.map +1 -0
- package/dist/topo/index.cjs +16 -0
- package/dist/topo/index.cjs.map +1 -0
- package/dist/topo/index.d.cts +5 -0
- package/dist/topo/index.d.ts +5 -0
- package/dist/topo/index.js +15 -0
- package/dist/topo/index.js.map +1 -0
- package/dist/topo/webgl.cjs +14 -0
- package/dist/topo/webgl.cjs.map +1 -0
- package/dist/topo/webgl.d.cts +5 -0
- package/dist/topo/webgl.d.ts +5 -0
- package/dist/topo/webgl.js +13 -0
- package/dist/topo/webgl.js.map +1 -0
- package/package.json +192 -4
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// src/shared/noise.ts
|
|
2
|
+
var F3 = 1 / 3;
|
|
3
|
+
var G3 = 1 / 6;
|
|
4
|
+
var GRAD3 = new Float32Array([
|
|
5
|
+
1,
|
|
6
|
+
1,
|
|
7
|
+
0,
|
|
8
|
+
-1,
|
|
9
|
+
1,
|
|
10
|
+
0,
|
|
11
|
+
1,
|
|
12
|
+
-1,
|
|
13
|
+
0,
|
|
14
|
+
-1,
|
|
15
|
+
-1,
|
|
16
|
+
0,
|
|
17
|
+
1,
|
|
18
|
+
0,
|
|
19
|
+
1,
|
|
20
|
+
-1,
|
|
21
|
+
0,
|
|
22
|
+
1,
|
|
23
|
+
1,
|
|
24
|
+
0,
|
|
25
|
+
-1,
|
|
26
|
+
-1,
|
|
27
|
+
0,
|
|
28
|
+
-1,
|
|
29
|
+
0,
|
|
30
|
+
1,
|
|
31
|
+
1,
|
|
32
|
+
0,
|
|
33
|
+
-1,
|
|
34
|
+
1,
|
|
35
|
+
0,
|
|
36
|
+
1,
|
|
37
|
+
-1,
|
|
38
|
+
0,
|
|
39
|
+
-1,
|
|
40
|
+
-1
|
|
41
|
+
]);
|
|
42
|
+
/** Small, fast seeded PRNG returning floats in [0, 1). */
|
|
43
|
+
function mulberry32(seed) {
|
|
44
|
+
let a = seed >>> 0;
|
|
45
|
+
return () => {
|
|
46
|
+
a = a + 1831565813 | 0;
|
|
47
|
+
let t = Math.imul(a ^ a >>> 15, 1 | a);
|
|
48
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
49
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Seeded 3D simplex noise (Gustavson). The third axis is used as time. */
|
|
53
|
+
function createNoise3D(seed = Math.random() * 2 ** 32) {
|
|
54
|
+
const random = mulberry32(seed);
|
|
55
|
+
const p = /* @__PURE__ */ new Uint8Array(256);
|
|
56
|
+
for (let i = 0; i < 256; i++) p[i] = i;
|
|
57
|
+
for (let i = 255; i > 0; i--) {
|
|
58
|
+
const j = Math.floor(random() * (i + 1));
|
|
59
|
+
const tmp = p[i];
|
|
60
|
+
p[i] = p[j];
|
|
61
|
+
p[j] = tmp;
|
|
62
|
+
}
|
|
63
|
+
const perm = /* @__PURE__ */ new Uint8Array(512);
|
|
64
|
+
const permMod12 = /* @__PURE__ */ new Uint8Array(512);
|
|
65
|
+
for (let i = 0; i < 512; i++) {
|
|
66
|
+
perm[i] = p[i & 255];
|
|
67
|
+
permMod12[i] = perm[i] % 12;
|
|
68
|
+
}
|
|
69
|
+
return (x, y, z) => {
|
|
70
|
+
const s = (x + y + z) * F3;
|
|
71
|
+
const i = Math.floor(x + s);
|
|
72
|
+
const j = Math.floor(y + s);
|
|
73
|
+
const k = Math.floor(z + s);
|
|
74
|
+
const t = (i + j + k) * G3;
|
|
75
|
+
const x0 = x - (i - t);
|
|
76
|
+
const y0 = y - (j - t);
|
|
77
|
+
const z0 = z - (k - t);
|
|
78
|
+
let i1, j1, k1, i2, j2, k2;
|
|
79
|
+
if (x0 >= y0) {
|
|
80
|
+
if (y0 >= z0) {
|
|
81
|
+
i1 = 1;
|
|
82
|
+
j1 = 0;
|
|
83
|
+
k1 = 0;
|
|
84
|
+
i2 = 1;
|
|
85
|
+
j2 = 1;
|
|
86
|
+
k2 = 0;
|
|
87
|
+
} else if (x0 >= z0) {
|
|
88
|
+
i1 = 1;
|
|
89
|
+
j1 = 0;
|
|
90
|
+
k1 = 0;
|
|
91
|
+
i2 = 1;
|
|
92
|
+
j2 = 0;
|
|
93
|
+
k2 = 1;
|
|
94
|
+
} else {
|
|
95
|
+
i1 = 0;
|
|
96
|
+
j1 = 0;
|
|
97
|
+
k1 = 1;
|
|
98
|
+
i2 = 1;
|
|
99
|
+
j2 = 0;
|
|
100
|
+
k2 = 1;
|
|
101
|
+
}
|
|
102
|
+
} else if (y0 < z0) {
|
|
103
|
+
i1 = 0;
|
|
104
|
+
j1 = 0;
|
|
105
|
+
k1 = 1;
|
|
106
|
+
i2 = 0;
|
|
107
|
+
j2 = 1;
|
|
108
|
+
k2 = 1;
|
|
109
|
+
} else if (x0 < z0) {
|
|
110
|
+
i1 = 0;
|
|
111
|
+
j1 = 1;
|
|
112
|
+
k1 = 0;
|
|
113
|
+
i2 = 0;
|
|
114
|
+
j2 = 1;
|
|
115
|
+
k2 = 1;
|
|
116
|
+
} else {
|
|
117
|
+
i1 = 0;
|
|
118
|
+
j1 = 1;
|
|
119
|
+
k1 = 0;
|
|
120
|
+
i2 = 1;
|
|
121
|
+
j2 = 1;
|
|
122
|
+
k2 = 0;
|
|
123
|
+
}
|
|
124
|
+
const x1 = x0 - i1 + G3;
|
|
125
|
+
const y1 = y0 - j1 + G3;
|
|
126
|
+
const z1 = z0 - k1 + G3;
|
|
127
|
+
const x2 = x0 - i2 + 2 * G3;
|
|
128
|
+
const y2 = y0 - j2 + 2 * G3;
|
|
129
|
+
const z2 = z0 - k2 + 2 * G3;
|
|
130
|
+
const x3 = x0 - 1 + 3 * G3;
|
|
131
|
+
const y3 = y0 - 1 + 3 * G3;
|
|
132
|
+
const z3 = z0 - 1 + 3 * G3;
|
|
133
|
+
const ii = i & 255;
|
|
134
|
+
const jj = j & 255;
|
|
135
|
+
const kk = k & 255;
|
|
136
|
+
let n = 0;
|
|
137
|
+
let c = .6 - x0 * x0 - y0 * y0 - z0 * z0;
|
|
138
|
+
if (c > 0) {
|
|
139
|
+
const g = permMod12[ii + perm[jj + perm[kk]]] * 3;
|
|
140
|
+
c *= c;
|
|
141
|
+
n += c * c * (GRAD3[g] * x0 + GRAD3[g + 1] * y0 + GRAD3[g + 2] * z0);
|
|
142
|
+
}
|
|
143
|
+
c = .6 - x1 * x1 - y1 * y1 - z1 * z1;
|
|
144
|
+
if (c > 0) {
|
|
145
|
+
const g = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;
|
|
146
|
+
c *= c;
|
|
147
|
+
n += c * c * (GRAD3[g] * x1 + GRAD3[g + 1] * y1 + GRAD3[g + 2] * z1);
|
|
148
|
+
}
|
|
149
|
+
c = .6 - x2 * x2 - y2 * y2 - z2 * z2;
|
|
150
|
+
if (c > 0) {
|
|
151
|
+
const g = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;
|
|
152
|
+
c *= c;
|
|
153
|
+
n += c * c * (GRAD3[g] * x2 + GRAD3[g + 1] * y2 + GRAD3[g + 2] * z2);
|
|
154
|
+
}
|
|
155
|
+
c = .6 - x3 * x3 - y3 * y3 - z3 * z3;
|
|
156
|
+
if (c > 0) {
|
|
157
|
+
const g = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;
|
|
158
|
+
c *= c;
|
|
159
|
+
n += c * c * (GRAD3[g] * x3 + GRAD3[g + 1] * y3 + GRAD3[g + 2] * z3);
|
|
160
|
+
}
|
|
161
|
+
return 32 * n;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
exports.createNoise3D = createNoise3D;
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=noise.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.cjs","names":[],"sources":["../../src/shared/noise.ts"],"sourcesContent":["/** Returns a value in roughly [-1, 1]. */\nexport type Noise3D = (x: number, y: number, z: number) => number;\n\nconst F3 = 1 / 3;\nconst G3 = 1 / 6;\n\n// prettier-ignore\nconst GRAD3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0,\n 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1,\n 0, 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1,\n]);\n\n/** Small, fast seeded PRNG returning floats in [0, 1). */\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** Seeded 3D simplex noise (Gustavson). The third axis is used as time. */\nexport function createNoise3D(seed: number = Math.random() * 2 ** 32): Noise3D {\n const random = mulberry32(seed);\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) p[i] = i;\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n const tmp = p[i];\n p[i] = p[j];\n p[j] = tmp;\n }\n const perm = new Uint8Array(512);\n const permMod12 = new Uint8Array(512);\n for (let i = 0; i < 512; i++) {\n perm[i] = p[i & 255];\n permMod12[i] = perm[i] % 12;\n }\n\n return (x, y, z) => {\n const s = (x + y + z) * F3;\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const t = (i + j + k) * G3;\n const x0 = x - (i - t);\n const y0 = y - (j - t);\n const z0 = z - (k - t);\n\n let i1: number, j1: number, k1: number, i2: number, j2: number, k2: number;\n if (x0 >= y0) {\n if (y0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0; }\n else if (x0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1; }\n else { i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1; }\n } else {\n if (y0 < z0) { i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1; }\n else if (x0 < z0) { i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1; }\n else { i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0; }\n }\n\n const x1 = x0 - i1 + G3;\n const y1 = y0 - j1 + G3;\n const z1 = z0 - k1 + G3;\n const x2 = x0 - i2 + 2 * G3;\n const y2 = y0 - j2 + 2 * G3;\n const z2 = z0 - k2 + 2 * G3;\n const x3 = x0 - 1 + 3 * G3;\n const y3 = y0 - 1 + 3 * G3;\n const z3 = z0 - 1 + 3 * G3;\n\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n\n let n = 0;\n let c = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n if (c > 0) {\n const g = permMod12[ii + perm[jj + perm[kk]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x0 + GRAD3[g + 1] * y0 + GRAD3[g + 2] * z0);\n }\n c = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n if (c > 0) {\n const g = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x1 + GRAD3[g + 1] * y1 + GRAD3[g + 2] * z1);\n }\n c = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n if (c > 0) {\n const g = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x2 + GRAD3[g + 1] * y2 + GRAD3[g + 2] * z2);\n }\n c = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n if (c > 0) {\n const g = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x3 + GRAD3[g + 1] * y3 + GRAD3[g + 2] * z3);\n }\n return 32 * n;\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// src/shared/noise.ts
|
|
2
|
+
var F3 = 1 / 3;
|
|
3
|
+
var G3 = 1 / 6;
|
|
4
|
+
var GRAD3 = new Float32Array([
|
|
5
|
+
1,
|
|
6
|
+
1,
|
|
7
|
+
0,
|
|
8
|
+
-1,
|
|
9
|
+
1,
|
|
10
|
+
0,
|
|
11
|
+
1,
|
|
12
|
+
-1,
|
|
13
|
+
0,
|
|
14
|
+
-1,
|
|
15
|
+
-1,
|
|
16
|
+
0,
|
|
17
|
+
1,
|
|
18
|
+
0,
|
|
19
|
+
1,
|
|
20
|
+
-1,
|
|
21
|
+
0,
|
|
22
|
+
1,
|
|
23
|
+
1,
|
|
24
|
+
0,
|
|
25
|
+
-1,
|
|
26
|
+
-1,
|
|
27
|
+
0,
|
|
28
|
+
-1,
|
|
29
|
+
0,
|
|
30
|
+
1,
|
|
31
|
+
1,
|
|
32
|
+
0,
|
|
33
|
+
-1,
|
|
34
|
+
1,
|
|
35
|
+
0,
|
|
36
|
+
1,
|
|
37
|
+
-1,
|
|
38
|
+
0,
|
|
39
|
+
-1,
|
|
40
|
+
-1
|
|
41
|
+
]);
|
|
42
|
+
/** Small, fast seeded PRNG returning floats in [0, 1). */
|
|
43
|
+
function mulberry32(seed) {
|
|
44
|
+
let a = seed >>> 0;
|
|
45
|
+
return () => {
|
|
46
|
+
a = a + 1831565813 | 0;
|
|
47
|
+
let t = Math.imul(a ^ a >>> 15, 1 | a);
|
|
48
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
49
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Seeded 3D simplex noise (Gustavson). The third axis is used as time. */
|
|
53
|
+
function createNoise3D(seed = Math.random() * 2 ** 32) {
|
|
54
|
+
const random = mulberry32(seed);
|
|
55
|
+
const p = /* @__PURE__ */ new Uint8Array(256);
|
|
56
|
+
for (let i = 0; i < 256; i++) p[i] = i;
|
|
57
|
+
for (let i = 255; i > 0; i--) {
|
|
58
|
+
const j = Math.floor(random() * (i + 1));
|
|
59
|
+
const tmp = p[i];
|
|
60
|
+
p[i] = p[j];
|
|
61
|
+
p[j] = tmp;
|
|
62
|
+
}
|
|
63
|
+
const perm = /* @__PURE__ */ new Uint8Array(512);
|
|
64
|
+
const permMod12 = /* @__PURE__ */ new Uint8Array(512);
|
|
65
|
+
for (let i = 0; i < 512; i++) {
|
|
66
|
+
perm[i] = p[i & 255];
|
|
67
|
+
permMod12[i] = perm[i] % 12;
|
|
68
|
+
}
|
|
69
|
+
return (x, y, z) => {
|
|
70
|
+
const s = (x + y + z) * F3;
|
|
71
|
+
const i = Math.floor(x + s);
|
|
72
|
+
const j = Math.floor(y + s);
|
|
73
|
+
const k = Math.floor(z + s);
|
|
74
|
+
const t = (i + j + k) * G3;
|
|
75
|
+
const x0 = x - (i - t);
|
|
76
|
+
const y0 = y - (j - t);
|
|
77
|
+
const z0 = z - (k - t);
|
|
78
|
+
let i1, j1, k1, i2, j2, k2;
|
|
79
|
+
if (x0 >= y0) {
|
|
80
|
+
if (y0 >= z0) {
|
|
81
|
+
i1 = 1;
|
|
82
|
+
j1 = 0;
|
|
83
|
+
k1 = 0;
|
|
84
|
+
i2 = 1;
|
|
85
|
+
j2 = 1;
|
|
86
|
+
k2 = 0;
|
|
87
|
+
} else if (x0 >= z0) {
|
|
88
|
+
i1 = 1;
|
|
89
|
+
j1 = 0;
|
|
90
|
+
k1 = 0;
|
|
91
|
+
i2 = 1;
|
|
92
|
+
j2 = 0;
|
|
93
|
+
k2 = 1;
|
|
94
|
+
} else {
|
|
95
|
+
i1 = 0;
|
|
96
|
+
j1 = 0;
|
|
97
|
+
k1 = 1;
|
|
98
|
+
i2 = 1;
|
|
99
|
+
j2 = 0;
|
|
100
|
+
k2 = 1;
|
|
101
|
+
}
|
|
102
|
+
} else if (y0 < z0) {
|
|
103
|
+
i1 = 0;
|
|
104
|
+
j1 = 0;
|
|
105
|
+
k1 = 1;
|
|
106
|
+
i2 = 0;
|
|
107
|
+
j2 = 1;
|
|
108
|
+
k2 = 1;
|
|
109
|
+
} else if (x0 < z0) {
|
|
110
|
+
i1 = 0;
|
|
111
|
+
j1 = 1;
|
|
112
|
+
k1 = 0;
|
|
113
|
+
i2 = 0;
|
|
114
|
+
j2 = 1;
|
|
115
|
+
k2 = 1;
|
|
116
|
+
} else {
|
|
117
|
+
i1 = 0;
|
|
118
|
+
j1 = 1;
|
|
119
|
+
k1 = 0;
|
|
120
|
+
i2 = 1;
|
|
121
|
+
j2 = 1;
|
|
122
|
+
k2 = 0;
|
|
123
|
+
}
|
|
124
|
+
const x1 = x0 - i1 + G3;
|
|
125
|
+
const y1 = y0 - j1 + G3;
|
|
126
|
+
const z1 = z0 - k1 + G3;
|
|
127
|
+
const x2 = x0 - i2 + 2 * G3;
|
|
128
|
+
const y2 = y0 - j2 + 2 * G3;
|
|
129
|
+
const z2 = z0 - k2 + 2 * G3;
|
|
130
|
+
const x3 = x0 - 1 + 3 * G3;
|
|
131
|
+
const y3 = y0 - 1 + 3 * G3;
|
|
132
|
+
const z3 = z0 - 1 + 3 * G3;
|
|
133
|
+
const ii = i & 255;
|
|
134
|
+
const jj = j & 255;
|
|
135
|
+
const kk = k & 255;
|
|
136
|
+
let n = 0;
|
|
137
|
+
let c = .6 - x0 * x0 - y0 * y0 - z0 * z0;
|
|
138
|
+
if (c > 0) {
|
|
139
|
+
const g = permMod12[ii + perm[jj + perm[kk]]] * 3;
|
|
140
|
+
c *= c;
|
|
141
|
+
n += c * c * (GRAD3[g] * x0 + GRAD3[g + 1] * y0 + GRAD3[g + 2] * z0);
|
|
142
|
+
}
|
|
143
|
+
c = .6 - x1 * x1 - y1 * y1 - z1 * z1;
|
|
144
|
+
if (c > 0) {
|
|
145
|
+
const g = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;
|
|
146
|
+
c *= c;
|
|
147
|
+
n += c * c * (GRAD3[g] * x1 + GRAD3[g + 1] * y1 + GRAD3[g + 2] * z1);
|
|
148
|
+
}
|
|
149
|
+
c = .6 - x2 * x2 - y2 * y2 - z2 * z2;
|
|
150
|
+
if (c > 0) {
|
|
151
|
+
const g = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;
|
|
152
|
+
c *= c;
|
|
153
|
+
n += c * c * (GRAD3[g] * x2 + GRAD3[g + 1] * y2 + GRAD3[g + 2] * z2);
|
|
154
|
+
}
|
|
155
|
+
c = .6 - x3 * x3 - y3 * y3 - z3 * z3;
|
|
156
|
+
if (c > 0) {
|
|
157
|
+
const g = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;
|
|
158
|
+
c *= c;
|
|
159
|
+
n += c * c * (GRAD3[g] * x3 + GRAD3[g + 1] * y3 + GRAD3[g + 2] * z3);
|
|
160
|
+
}
|
|
161
|
+
return 32 * n;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export { createNoise3D };
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=noise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.js","names":[],"sources":["../../src/shared/noise.ts"],"sourcesContent":["/** Returns a value in roughly [-1, 1]. */\nexport type Noise3D = (x: number, y: number, z: number) => number;\n\nconst F3 = 1 / 3;\nconst G3 = 1 / 6;\n\n// prettier-ignore\nconst GRAD3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0,\n 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1,\n 0, 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1,\n]);\n\n/** Small, fast seeded PRNG returning floats in [0, 1). */\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** Seeded 3D simplex noise (Gustavson). The third axis is used as time. */\nexport function createNoise3D(seed: number = Math.random() * 2 ** 32): Noise3D {\n const random = mulberry32(seed);\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) p[i] = i;\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n const tmp = p[i];\n p[i] = p[j];\n p[j] = tmp;\n }\n const perm = new Uint8Array(512);\n const permMod12 = new Uint8Array(512);\n for (let i = 0; i < 512; i++) {\n perm[i] = p[i & 255];\n permMod12[i] = perm[i] % 12;\n }\n\n return (x, y, z) => {\n const s = (x + y + z) * F3;\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const t = (i + j + k) * G3;\n const x0 = x - (i - t);\n const y0 = y - (j - t);\n const z0 = z - (k - t);\n\n let i1: number, j1: number, k1: number, i2: number, j2: number, k2: number;\n if (x0 >= y0) {\n if (y0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0; }\n else if (x0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1; }\n else { i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1; }\n } else {\n if (y0 < z0) { i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1; }\n else if (x0 < z0) { i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1; }\n else { i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0; }\n }\n\n const x1 = x0 - i1 + G3;\n const y1 = y0 - j1 + G3;\n const z1 = z0 - k1 + G3;\n const x2 = x0 - i2 + 2 * G3;\n const y2 = y0 - j2 + 2 * G3;\n const z2 = z0 - k2 + 2 * G3;\n const x3 = x0 - 1 + 3 * G3;\n const y3 = y0 - 1 + 3 * G3;\n const z3 = z0 - 1 + 3 * G3;\n\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n\n let n = 0;\n let c = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n if (c > 0) {\n const g = permMod12[ii + perm[jj + perm[kk]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x0 + GRAD3[g + 1] * y0 + GRAD3[g + 2] * z0);\n }\n c = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n if (c > 0) {\n const g = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x1 + GRAD3[g + 1] * y1 + GRAD3[g + 2] * z1);\n }\n c = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n if (c > 0) {\n const g = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x2 + GRAD3[g + 1] * y2 + GRAD3[g + 2] * z2);\n }\n c = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n if (c > 0) {\n const g = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;\n c *= c;\n n += c * c * (GRAD3[g] * x3 + GRAD3[g + 1] * y3 + GRAD3[g + 2] * z3);\n }\n return 32 * n;\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
const require_buffer = require("../../shared/buffer.cjs");
|
|
2
|
+
const require_grid = require("../../shared/grid.cjs");
|
|
3
|
+
const require_motion = require("./motion.cjs");
|
|
4
|
+
const require_options = require("./options.cjs");
|
|
5
|
+
// src/styles/dots/canvas2d.ts
|
|
6
|
+
/** Dots grown by waves are drawn in this many size steps per unit of growth (steps of ~0.25 px). */
|
|
7
|
+
var SIZE_STEPS = 4;
|
|
8
|
+
/** Growth beyond this is clamped (two overlapping wave crests). */
|
|
9
|
+
var MAX_SIZE_STEP = 8;
|
|
10
|
+
/**
|
|
11
|
+
* Every dot's position computed on the CPU. Dots are drawn as zero-length lines
|
|
12
|
+
* with round caps: that renders the same round dots as `arc()`, about 4× faster.
|
|
13
|
+
*/
|
|
14
|
+
function createDotsCanvas2D(ctx, initial) {
|
|
15
|
+
let options = require_options.resolveDotsOptions(initial);
|
|
16
|
+
const waves = require_grid.createWaveList();
|
|
17
|
+
const waveData = /* @__PURE__ */ new Float32Array(32);
|
|
18
|
+
let clock = 0;
|
|
19
|
+
const sizes = Array.from({ length: 9 }, () => require_buffer.createFloatBuffer(256));
|
|
20
|
+
function add(buffer, x, y) {
|
|
21
|
+
const data = require_buffer.reserve(buffer, 2);
|
|
22
|
+
data[buffer.length++] = x;
|
|
23
|
+
data[buffer.length++] = y;
|
|
24
|
+
}
|
|
25
|
+
function stroke(buffer, radius) {
|
|
26
|
+
const { data, length } = buffer;
|
|
27
|
+
ctx.lineWidth = 2 * radius;
|
|
28
|
+
ctx.beginPath();
|
|
29
|
+
for (let k = 0; k < length; k += 2) {
|
|
30
|
+
ctx.moveTo(data[k], data[k + 1]);
|
|
31
|
+
ctx.lineTo(data[k] + .01, data[k + 1]);
|
|
32
|
+
}
|
|
33
|
+
ctx.stroke();
|
|
34
|
+
}
|
|
35
|
+
const phasesFor = require_grid.createPhaseCache();
|
|
36
|
+
return {
|
|
37
|
+
update(next) {
|
|
38
|
+
options = require_options.resolveDotsOptions(next);
|
|
39
|
+
},
|
|
40
|
+
render(frame) {
|
|
41
|
+
if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * require_grid.TAU;
|
|
42
|
+
waves.advance(frame, options.waveDuration, options.waveStrength !== 0);
|
|
43
|
+
const { spacing, size, jitter, pointerRadius, waveWidth, waveStrength } = options;
|
|
44
|
+
const { cols, rows, originX, originY } = require_grid.gridLayout(frame.width, frame.height, spacing);
|
|
45
|
+
const wander = phasesFor(cols, rows);
|
|
46
|
+
const { sx, cx, sy, cy } = require_grid.wanderClock(clock);
|
|
47
|
+
const push = options.pointerStrength * frame.pointer.influence;
|
|
48
|
+
const { x: px, y: py } = frame.pointer;
|
|
49
|
+
const waveCount = waves.waves.length;
|
|
50
|
+
waves.pack(waveData, options.waveSpeed, options.waveDuration);
|
|
51
|
+
const waveReach = 3 * waveWidth;
|
|
52
|
+
for (const buffer of sizes) buffer.length = 0;
|
|
53
|
+
for (let j = 0; j < rows; j++) {
|
|
54
|
+
const restY = originY + j * spacing;
|
|
55
|
+
for (let i = 0; i < cols; i++) {
|
|
56
|
+
const restX = originX + i * spacing;
|
|
57
|
+
const k = (j * cols + i) * 4;
|
|
58
|
+
let x = restX + jitter * (sx * wander[k] + cx * wander[k + 1]);
|
|
59
|
+
let y = restY + jitter * (cy * wander[k + 2] - sy * wander[k + 3]);
|
|
60
|
+
if (push !== 0) {
|
|
61
|
+
const dx = restX - px;
|
|
62
|
+
const dy = restY - py;
|
|
63
|
+
if (Math.abs(dx) < pointerRadius && Math.abs(dy) < pointerRadius) {
|
|
64
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
65
|
+
if (distance > 0 && distance < pointerRadius) {
|
|
66
|
+
const amount = push * require_grid.pointerFalloff(distance, pointerRadius) / distance;
|
|
67
|
+
x += dx * amount;
|
|
68
|
+
y += dy * amount;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
let grow = 0;
|
|
73
|
+
for (let w = 0; w < waveCount * 4; w += 4) {
|
|
74
|
+
const dx = restX - waveData[w];
|
|
75
|
+
const dy = restY - waveData[w + 1];
|
|
76
|
+
const outer = waveData[w + 2] + waveReach;
|
|
77
|
+
if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;
|
|
78
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
79
|
+
if (distance === 0 || Math.abs(distance - waveData[w + 2]) > waveReach) continue;
|
|
80
|
+
const ring = require_grid.waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];
|
|
81
|
+
const amount = waveStrength * ring / distance;
|
|
82
|
+
x += dx * amount;
|
|
83
|
+
y += dy * amount;
|
|
84
|
+
grow += ring;
|
|
85
|
+
}
|
|
86
|
+
add(sizes[Math.min(MAX_SIZE_STEP, Math.round(grow * SIZE_STEPS))], x, y);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
ctx.globalAlpha = options.opacity;
|
|
90
|
+
ctx.strokeStyle = options.color;
|
|
91
|
+
ctx.lineCap = "round";
|
|
92
|
+
for (let step = 0; step <= MAX_SIZE_STEP; step++) if (sizes[step].length > 0) stroke(sizes[step], size * (1 + require_motion.WAVE_GROW * step / SIZE_STEPS));
|
|
93
|
+
return waveCount > 0;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
exports.createDotsCanvas2D = createDotsCanvas2D;
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=canvas2d.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas2d.cjs","names":["resolveDotsOptions","createWaveList","createFloatBuffer","reserve","createPhaseCache","TAU","gridLayout","wanderClock","pointerFalloff","waveRing","WAVE_GROW"],"sources":["../../../src/styles/dots/canvas2d.ts"],"sourcesContent":["import type { StyleRenderer } from '../../core/style';\nimport { createFloatBuffer, reserve, type FloatBuffer } from '../../shared/buffer';\nimport {\n createPhaseCache,\n createWaveList,\n gridLayout,\n MAX_WAVES,\n pointerFalloff,\n TAU,\n wanderClock,\n waveRing,\n} from '../../shared/grid';\nimport { WAVE_GROW } from './motion';\nimport { resolveDotsOptions, type DotsOptions } from './options';\n\n/** Dots grown by waves are drawn in this many size steps per unit of growth (steps of ~0.25 px). */\nconst SIZE_STEPS = 4;\n/** Growth beyond this is clamped (two overlapping wave crests). */\nconst MAX_SIZE_STEP = 2 * SIZE_STEPS;\n\n/**\n * Every dot's position computed on the CPU. Dots are drawn as zero-length lines\n * with round caps: that renders the same round dots as `arc()`, about 4× faster.\n */\nexport function createDotsCanvas2D(ctx: CanvasRenderingContext2D, initial: DotsOptions): StyleRenderer<DotsOptions> {\n let options = resolveDotsOptions(initial);\n const waves = createWaveList();\n // Each wave as x, y, ring radius, envelope, worked out once per frame instead of once per dot.\n const waveData = new Float32Array(MAX_WAVES * 4);\n let clock = 0;\n\n // Dot centres as x, y pairs, one buffer per size step; dots outside a wave all land in step 0.\n const sizes = Array.from({ length: MAX_SIZE_STEP + 1 }, () => createFloatBuffer(256));\n\n function add(buffer: FloatBuffer, x: number, y: number): void {\n const data = reserve(buffer, 2);\n data[buffer.length++] = x;\n data[buffer.length++] = y;\n }\n\n function stroke(buffer: FloatBuffer, radius: number): void {\n const { data, length } = buffer;\n ctx.lineWidth = 2 * radius;\n ctx.beginPath();\n for (let k = 0; k < length; k += 2) {\n ctx.moveTo(data[k], data[k + 1]);\n // A tiny length: some browsers skip the caps of exactly zero-length lines.\n ctx.lineTo(data[k] + 0.01, data[k + 1]);\n }\n ctx.stroke();\n }\n\n const phasesFor = createPhaseCache();\n\n return {\n update(next) {\n options = resolveDotsOptions(next);\n },\n render(frame) {\n if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;\n waves.advance(frame, options.waveDuration, options.waveStrength !== 0);\n\n const { spacing, size, jitter, pointerRadius, waveWidth, waveStrength } = options;\n const { cols, rows, originX, originY } = gridLayout(frame.width, frame.height, spacing);\n const wander = phasesFor(cols, rows);\n const { sx, cx, sy, cy } = wanderClock(clock);\n const push = options.pointerStrength * frame.pointer.influence;\n const { x: px, y: py } = frame.pointer;\n const waveCount = waves.waves.length;\n waves.pack(waveData, options.waveSpeed, options.waveDuration);\n // Further than 3 widths from its ring a wave moves a dot by less than e⁻⁹ of its strength.\n const waveReach = 3 * waveWidth;\n for (const buffer of sizes) buffer.length = 0;\n\n for (let j = 0; j < rows; j++) {\n const restY = originY + j * spacing;\n for (let i = 0; i < cols; i++) {\n const restX = originX + i * spacing;\n const k = (j * cols + i) * 4;\n let x = restX + jitter * (sx * wander[k] + cx * wander[k + 1]);\n let y = restY + jitter * (cy * wander[k + 2] - sy * wander[k + 3]);\n\n if (push !== 0) {\n const dx = restX - px;\n const dy = restY - py;\n if (Math.abs(dx) < pointerRadius && Math.abs(dy) < pointerRadius) {\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance > 0 && distance < pointerRadius) {\n const amount = (push * pointerFalloff(distance, pointerRadius)) / distance;\n x += dx * amount;\n y += dy * amount;\n }\n }\n }\n\n let grow = 0;\n for (let w = 0; w < waveCount * 4; w += 4) {\n const dx = restX - waveData[w];\n const dy = restY - waveData[w + 1];\n const outer = waveData[w + 2] + waveReach;\n if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance === 0 || Math.abs(distance - waveData[w + 2]) > waveReach) continue;\n const ring = waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];\n const amount = (waveStrength * ring) / distance;\n x += dx * amount;\n y += dy * amount;\n grow += ring;\n }\n\n add(sizes[Math.min(MAX_SIZE_STEP, Math.round(grow * SIZE_STEPS))], x, y);\n }\n }\n\n ctx.globalAlpha = options.opacity;\n ctx.strokeStyle = options.color;\n ctx.lineCap = 'round';\n for (let step = 0; step <= MAX_SIZE_STEP; step++) {\n if (sizes[step].length > 0) stroke(sizes[step], size * (1 + (WAVE_GROW * step) / SIZE_STEPS));\n }\n return waveCount > 0;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StyleRenderer } from '../../core/style.cjs';
|
|
2
|
+
import { type DotsOptions } from './options.cjs';
|
|
3
|
+
/**
|
|
4
|
+
* Every dot's position computed on the CPU. Dots are drawn as zero-length lines
|
|
5
|
+
* with round caps: that renders the same round dots as `arc()`, about 4× faster.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createDotsCanvas2D(ctx: CanvasRenderingContext2D, initial: DotsOptions): StyleRenderer<DotsOptions>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StyleRenderer } from '../../core/style.js';
|
|
2
|
+
import { type DotsOptions } from './options.js';
|
|
3
|
+
/**
|
|
4
|
+
* Every dot's position computed on the CPU. Dots are drawn as zero-length lines
|
|
5
|
+
* with round caps: that renders the same round dots as `arc()`, about 4× faster.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createDotsCanvas2D(ctx: CanvasRenderingContext2D, initial: DotsOptions): StyleRenderer<DotsOptions>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createFloatBuffer, reserve } from "../../shared/buffer.js";
|
|
2
|
+
import { TAU, createPhaseCache, createWaveList, gridLayout, pointerFalloff, wanderClock, waveRing } from "../../shared/grid.js";
|
|
3
|
+
import { WAVE_GROW } from "./motion.js";
|
|
4
|
+
import { resolveDotsOptions } from "./options.js";
|
|
5
|
+
// src/styles/dots/canvas2d.ts
|
|
6
|
+
/** Dots grown by waves are drawn in this many size steps per unit of growth (steps of ~0.25 px). */
|
|
7
|
+
var SIZE_STEPS = 4;
|
|
8
|
+
/** Growth beyond this is clamped (two overlapping wave crests). */
|
|
9
|
+
var MAX_SIZE_STEP = 8;
|
|
10
|
+
/**
|
|
11
|
+
* Every dot's position computed on the CPU. Dots are drawn as zero-length lines
|
|
12
|
+
* with round caps: that renders the same round dots as `arc()`, about 4× faster.
|
|
13
|
+
*/
|
|
14
|
+
function createDotsCanvas2D(ctx, initial) {
|
|
15
|
+
let options = resolveDotsOptions(initial);
|
|
16
|
+
const waves = createWaveList();
|
|
17
|
+
const waveData = /* @__PURE__ */ new Float32Array(32);
|
|
18
|
+
let clock = 0;
|
|
19
|
+
const sizes = Array.from({ length: 9 }, () => createFloatBuffer(256));
|
|
20
|
+
function add(buffer, x, y) {
|
|
21
|
+
const data = reserve(buffer, 2);
|
|
22
|
+
data[buffer.length++] = x;
|
|
23
|
+
data[buffer.length++] = y;
|
|
24
|
+
}
|
|
25
|
+
function stroke(buffer, radius) {
|
|
26
|
+
const { data, length } = buffer;
|
|
27
|
+
ctx.lineWidth = 2 * radius;
|
|
28
|
+
ctx.beginPath();
|
|
29
|
+
for (let k = 0; k < length; k += 2) {
|
|
30
|
+
ctx.moveTo(data[k], data[k + 1]);
|
|
31
|
+
ctx.lineTo(data[k] + .01, data[k + 1]);
|
|
32
|
+
}
|
|
33
|
+
ctx.stroke();
|
|
34
|
+
}
|
|
35
|
+
const phasesFor = createPhaseCache();
|
|
36
|
+
return {
|
|
37
|
+
update(next) {
|
|
38
|
+
options = resolveDotsOptions(next);
|
|
39
|
+
},
|
|
40
|
+
render(frame) {
|
|
41
|
+
if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;
|
|
42
|
+
waves.advance(frame, options.waveDuration, options.waveStrength !== 0);
|
|
43
|
+
const { spacing, size, jitter, pointerRadius, waveWidth, waveStrength } = options;
|
|
44
|
+
const { cols, rows, originX, originY } = gridLayout(frame.width, frame.height, spacing);
|
|
45
|
+
const wander = phasesFor(cols, rows);
|
|
46
|
+
const { sx, cx, sy, cy } = wanderClock(clock);
|
|
47
|
+
const push = options.pointerStrength * frame.pointer.influence;
|
|
48
|
+
const { x: px, y: py } = frame.pointer;
|
|
49
|
+
const waveCount = waves.waves.length;
|
|
50
|
+
waves.pack(waveData, options.waveSpeed, options.waveDuration);
|
|
51
|
+
const waveReach = 3 * waveWidth;
|
|
52
|
+
for (const buffer of sizes) buffer.length = 0;
|
|
53
|
+
for (let j = 0; j < rows; j++) {
|
|
54
|
+
const restY = originY + j * spacing;
|
|
55
|
+
for (let i = 0; i < cols; i++) {
|
|
56
|
+
const restX = originX + i * spacing;
|
|
57
|
+
const k = (j * cols + i) * 4;
|
|
58
|
+
let x = restX + jitter * (sx * wander[k] + cx * wander[k + 1]);
|
|
59
|
+
let y = restY + jitter * (cy * wander[k + 2] - sy * wander[k + 3]);
|
|
60
|
+
if (push !== 0) {
|
|
61
|
+
const dx = restX - px;
|
|
62
|
+
const dy = restY - py;
|
|
63
|
+
if (Math.abs(dx) < pointerRadius && Math.abs(dy) < pointerRadius) {
|
|
64
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
65
|
+
if (distance > 0 && distance < pointerRadius) {
|
|
66
|
+
const amount = push * pointerFalloff(distance, pointerRadius) / distance;
|
|
67
|
+
x += dx * amount;
|
|
68
|
+
y += dy * amount;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
let grow = 0;
|
|
73
|
+
for (let w = 0; w < waveCount * 4; w += 4) {
|
|
74
|
+
const dx = restX - waveData[w];
|
|
75
|
+
const dy = restY - waveData[w + 1];
|
|
76
|
+
const outer = waveData[w + 2] + waveReach;
|
|
77
|
+
if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;
|
|
78
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
79
|
+
if (distance === 0 || Math.abs(distance - waveData[w + 2]) > waveReach) continue;
|
|
80
|
+
const ring = waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];
|
|
81
|
+
const amount = waveStrength * ring / distance;
|
|
82
|
+
x += dx * amount;
|
|
83
|
+
y += dy * amount;
|
|
84
|
+
grow += ring;
|
|
85
|
+
}
|
|
86
|
+
add(sizes[Math.min(MAX_SIZE_STEP, Math.round(grow * SIZE_STEPS))], x, y);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
ctx.globalAlpha = options.opacity;
|
|
90
|
+
ctx.strokeStyle = options.color;
|
|
91
|
+
ctx.lineCap = "round";
|
|
92
|
+
for (let step = 0; step <= MAX_SIZE_STEP; step++) if (sizes[step].length > 0) stroke(sizes[step], size * (1 + WAVE_GROW * step / SIZE_STEPS));
|
|
93
|
+
return waveCount > 0;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export { createDotsCanvas2D };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=canvas2d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas2d.js","names":[],"sources":["../../../src/styles/dots/canvas2d.ts"],"sourcesContent":["import type { StyleRenderer } from '../../core/style';\nimport { createFloatBuffer, reserve, type FloatBuffer } from '../../shared/buffer';\nimport {\n createPhaseCache,\n createWaveList,\n gridLayout,\n MAX_WAVES,\n pointerFalloff,\n TAU,\n wanderClock,\n waveRing,\n} from '../../shared/grid';\nimport { WAVE_GROW } from './motion';\nimport { resolveDotsOptions, type DotsOptions } from './options';\n\n/** Dots grown by waves are drawn in this many size steps per unit of growth (steps of ~0.25 px). */\nconst SIZE_STEPS = 4;\n/** Growth beyond this is clamped (two overlapping wave crests). */\nconst MAX_SIZE_STEP = 2 * SIZE_STEPS;\n\n/**\n * Every dot's position computed on the CPU. Dots are drawn as zero-length lines\n * with round caps: that renders the same round dots as `arc()`, about 4× faster.\n */\nexport function createDotsCanvas2D(ctx: CanvasRenderingContext2D, initial: DotsOptions): StyleRenderer<DotsOptions> {\n let options = resolveDotsOptions(initial);\n const waves = createWaveList();\n // Each wave as x, y, ring radius, envelope, worked out once per frame instead of once per dot.\n const waveData = new Float32Array(MAX_WAVES * 4);\n let clock = 0;\n\n // Dot centres as x, y pairs, one buffer per size step; dots outside a wave all land in step 0.\n const sizes = Array.from({ length: MAX_SIZE_STEP + 1 }, () => createFloatBuffer(256));\n\n function add(buffer: FloatBuffer, x: number, y: number): void {\n const data = reserve(buffer, 2);\n data[buffer.length++] = x;\n data[buffer.length++] = y;\n }\n\n function stroke(buffer: FloatBuffer, radius: number): void {\n const { data, length } = buffer;\n ctx.lineWidth = 2 * radius;\n ctx.beginPath();\n for (let k = 0; k < length; k += 2) {\n ctx.moveTo(data[k], data[k + 1]);\n // A tiny length: some browsers skip the caps of exactly zero-length lines.\n ctx.lineTo(data[k] + 0.01, data[k + 1]);\n }\n ctx.stroke();\n }\n\n const phasesFor = createPhaseCache();\n\n return {\n update(next) {\n options = resolveDotsOptions(next);\n },\n render(frame) {\n if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;\n waves.advance(frame, options.waveDuration, options.waveStrength !== 0);\n\n const { spacing, size, jitter, pointerRadius, waveWidth, waveStrength } = options;\n const { cols, rows, originX, originY } = gridLayout(frame.width, frame.height, spacing);\n const wander = phasesFor(cols, rows);\n const { sx, cx, sy, cy } = wanderClock(clock);\n const push = options.pointerStrength * frame.pointer.influence;\n const { x: px, y: py } = frame.pointer;\n const waveCount = waves.waves.length;\n waves.pack(waveData, options.waveSpeed, options.waveDuration);\n // Further than 3 widths from its ring a wave moves a dot by less than e⁻⁹ of its strength.\n const waveReach = 3 * waveWidth;\n for (const buffer of sizes) buffer.length = 0;\n\n for (let j = 0; j < rows; j++) {\n const restY = originY + j * spacing;\n for (let i = 0; i < cols; i++) {\n const restX = originX + i * spacing;\n const k = (j * cols + i) * 4;\n let x = restX + jitter * (sx * wander[k] + cx * wander[k + 1]);\n let y = restY + jitter * (cy * wander[k + 2] - sy * wander[k + 3]);\n\n if (push !== 0) {\n const dx = restX - px;\n const dy = restY - py;\n if (Math.abs(dx) < pointerRadius && Math.abs(dy) < pointerRadius) {\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance > 0 && distance < pointerRadius) {\n const amount = (push * pointerFalloff(distance, pointerRadius)) / distance;\n x += dx * amount;\n y += dy * amount;\n }\n }\n }\n\n let grow = 0;\n for (let w = 0; w < waveCount * 4; w += 4) {\n const dx = restX - waveData[w];\n const dy = restY - waveData[w + 1];\n const outer = waveData[w + 2] + waveReach;\n if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance === 0 || Math.abs(distance - waveData[w + 2]) > waveReach) continue;\n const ring = waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];\n const amount = (waveStrength * ring) / distance;\n x += dx * amount;\n y += dy * amount;\n grow += ring;\n }\n\n add(sizes[Math.min(MAX_SIZE_STEP, Math.round(grow * SIZE_STEPS))], x, y);\n }\n }\n\n ctx.globalAlpha = options.opacity;\n ctx.strokeStyle = options.color;\n ctx.lineCap = 'round';\n for (let step = 0; step <= MAX_SIZE_STEP; step++) {\n if (sizes[step].length > 0) stroke(sizes[step], size * (1 + (WAVE_GROW * step) / SIZE_STEPS));\n }\n return waveCount > 0;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const require_grid = require("../../shared/grid.cjs");
|
|
2
|
+
// src/styles/dots/definition.ts
|
|
3
|
+
/**
|
|
4
|
+
* A grid of dots that wander gently around their places. The pointer pushes
|
|
5
|
+
* nearby dots away, more the closer they are, and clicks send out a wave.
|
|
6
|
+
*/
|
|
7
|
+
var dotsStyle = {
|
|
8
|
+
name: "dots",
|
|
9
|
+
defaults: require("./options.cjs").dotsDefaults,
|
|
10
|
+
animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,
|
|
11
|
+
idleFps: require_grid.wanderIdleFps
|
|
12
|
+
};
|
|
13
|
+
exports.dotsStyle = dotsStyle;
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=definition.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.cjs","names":["dotsDefaults","wanderIdleFps"],"sources":["../../../src/styles/dots/definition.ts"],"sourcesContent":["import type { StyleBase } from '../../core/style';\nimport { wanderIdleFps } from '../../shared/grid';\nimport { dotsDefaults, type DotsOptions } from './options';\n\n/**\n * A grid of dots that wander gently around their places. The pointer pushes\n * nearby dots away, more the closer they are, and clicks send out a wave.\n */\nexport const dotsStyle: StyleBase<DotsOptions> = {\n name: 'dots',\n defaults: dotsDefaults,\n animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,\n // The wander is slow and sub-pixel, so it rarely needs the engine's full idle frame rate.\n idleFps: wanderIdleFps,\n};\n"],"mappings":";;;;;;AAQA,IAAa,YAAoC;CAC/C,MAAM;CACN,U,uBAAUA,CAAAA,CAAAA;CACV,WAAW,YAAY,QAAQ,SAAS,KAAK,QAAQ,cAAc;CAEnE,SAASC,aAAAA;AACX"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StyleBase } from '../../core/style.cjs';
|
|
2
|
+
import { type DotsOptions } from './options.cjs';
|
|
3
|
+
/**
|
|
4
|
+
* A grid of dots that wander gently around their places. The pointer pushes
|
|
5
|
+
* nearby dots away, more the closer they are, and clicks send out a wave.
|
|
6
|
+
*/
|
|
7
|
+
export declare const dotsStyle: StyleBase<DotsOptions>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StyleBase } from '../../core/style.js';
|
|
2
|
+
import { type DotsOptions } from './options.js';
|
|
3
|
+
/**
|
|
4
|
+
* A grid of dots that wander gently around their places. The pointer pushes
|
|
5
|
+
* nearby dots away, more the closer they are, and clicks send out a wave.
|
|
6
|
+
*/
|
|
7
|
+
export declare const dotsStyle: StyleBase<DotsOptions>;
|