@aethervtt/shard-noise 0.0.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 +3 -0
- package/dist/compile.d.ts +61 -0
- package/dist/compile.js +375 -0
- package/dist/gpu.d.ts +11 -0
- package/dist/gpu.js +15 -0
- package/dist/graph.d.ts +44 -0
- package/dist/graph.js +370 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +127 -0
- package/dist/kernel.d.ts +99 -0
- package/dist/kernel.js +263 -0
- package/dist/loader.d.ts +25 -0
- package/dist/loader.js +108 -0
- package/dist/methods.d.ts +9 -0
- package/dist/methods.js +119 -0
- package/dist/nodes.d.ts +74 -0
- package/dist/nodes.js +366 -0
- package/dist/noise-graph.d.ts +80 -0
- package/dist/noise-graph.js +258 -0
- package/dist/planet.d.ts +44 -0
- package/dist/planet.js +15 -0
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.js +18 -0
- package/dist/reference.d.ts +9 -0
- package/dist/reference.js +97 -0
- package/dist/sample.d.ts +67 -0
- package/dist/sample.js +232 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.js +132 -0
- package/dist/stats.d.ts +58 -0
- package/dist/stats.js +164 -0
- package/dist/wgsl.d.ts +17 -0
- package/dist/wgsl.js +641 -0
- package/dist/worker.js +58 -0
- package/package.json +39 -0
- package/wasm/shard_noise.wasm +0 -0
- package/wasm/shard_noise_simd.wasm +0 -0
package/dist/wgsl.js
ADDED
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
import { FRACTAL, OP, WIDTH } from "./compile.js";
|
|
2
|
+
import { SOURCE_KINDS } from "./nodes.js";
|
|
3
|
+
const NOISE_LIBRARY = (
|
|
4
|
+
/* wgsl */
|
|
5
|
+
`
|
|
6
|
+
const PX: u32 = 501125321u;
|
|
7
|
+
const PY: u32 = 1136930381u;
|
|
8
|
+
const PZ: u32 = 1720413743u;
|
|
9
|
+
const PW: u32 = 1066037191u;
|
|
10
|
+
const SEED_FLIP_3D: u32 = 0x52d547b3u;
|
|
11
|
+
const SQRT_2: f32 = 1.4142135623730951;
|
|
12
|
+
const LN_2: f32 = 0.6931471805599453;
|
|
13
|
+
const G2: f32 = 0.2113248654051871;
|
|
14
|
+
const G4: f32 = 0.1381966011250105;
|
|
15
|
+
const F2: f32 = 0.3660254037844386;
|
|
16
|
+
const F4: f32 = 0.3090169943749474;
|
|
17
|
+
const TWO_THIRDS: f32 = 2.0 / 3.0;
|
|
18
|
+
const PERLIN2_SCALE: f32 = 1.0;
|
|
19
|
+
const PERLIN3_SCALE: f32 = 1.0;
|
|
20
|
+
const SIMPLEX2_SCALE: f32 = 70.0;
|
|
21
|
+
const SIMPLEX3_SCALE: f32 = 32.0;
|
|
22
|
+
const SIMPLEX4_SCALE: f32 = 27.0;
|
|
23
|
+
|
|
24
|
+
/** One source octave's lattice origin: the integer cell and the fraction (from the CPU, in f64). */
|
|
25
|
+
struct NoiseOrigin {
|
|
26
|
+
cell: vec4i,
|
|
27
|
+
frac: vec4f,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
fn mix32(x: u32) -> u32 {
|
|
31
|
+
var h = x ^ (x >> 16u);
|
|
32
|
+
h = h * 0x7feb352du;
|
|
33
|
+
h = h ^ (h >> 15u);
|
|
34
|
+
h = h * 0x846ca68bu;
|
|
35
|
+
return h ^ (h >> 16u);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
fn fnv(h: u32, b: u32) -> u32 {
|
|
39
|
+
return (h ^ b) * 0x01000193u;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** hashSeed(seed, label) from @aethervtt/shard-core, for a numeric label. */
|
|
43
|
+
fn hash_seed(seed: u32, label: u32) -> u32 {
|
|
44
|
+
var h = 0x811c9dc5u;
|
|
45
|
+
h = fnv(h, label & 0xffu);
|
|
46
|
+
h = fnv(h, (label >> 8u) & 0xffu);
|
|
47
|
+
h = fnv(h, (label >> 16u) & 0xffu);
|
|
48
|
+
h = fnv(h, label >> 24u);
|
|
49
|
+
return ((seed ^ h) * 0x9e3779b1u) ^ fnv(h, 0x23u);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn hash2(seed: u32, x: u32, y: u32) -> u32 { return mix32(seed ^ x ^ y); }
|
|
53
|
+
fn hash3(seed: u32, x: u32, y: u32, z: u32) -> u32 { return mix32(seed ^ x ^ y ^ z); }
|
|
54
|
+
fn hash4(seed: u32, x: u32, y: u32, z: u32, w: u32) -> u32 { return mix32(seed ^ x ^ y ^ z ^ w); }
|
|
55
|
+
|
|
56
|
+
fn to_value(h: u32) -> f32 {
|
|
57
|
+
return f32(h >> 8u) * (2.0 / 16777215.0) - 1.0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
fn flip(x: f32, s: u32) -> f32 {
|
|
61
|
+
return bitcast<f32>(bitcast<u32>(x) ^ s);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fn fade(t: f32) -> f32 {
|
|
65
|
+
return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn lerp(a: f32, b: f32, t: f32) -> f32 {
|
|
69
|
+
return a + t * (b - a);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
fn grad_hash2(seed: u32, x: u32, y: u32) -> u32 { return ((seed ^ x ^ y) * 0x27d4eb2du) >> 29u; }
|
|
73
|
+
fn grad_hash3(seed: u32, x: u32, y: u32, z: u32) -> u32 { return ((seed ^ x ^ y ^ z) * 0x27d4eb2du) >> 28u; }
|
|
74
|
+
fn grad_hash4(seed: u32, x: u32, y: u32, z: u32, w: u32) -> u32 { return ((seed ^ x ^ y ^ z ^ w) * 0x27d4eb2du) >> 27u; }
|
|
75
|
+
|
|
76
|
+
fn grad2(h: u32, x: f32, y: f32) -> f32 {
|
|
77
|
+
let s0 = h << 31u;
|
|
78
|
+
let s1 = (h & 2u) << 30u;
|
|
79
|
+
let diag = flip(x, s0) + flip(y, s1);
|
|
80
|
+
let axis = flip(select(y, x, (h & 2u) == 0u), s0) * SQRT_2;
|
|
81
|
+
return select(axis, diag, h < 4u);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
fn grad3(g: u32, x: f32, y: f32, z: f32) -> f32 {
|
|
85
|
+
let drop = g >> 2u;
|
|
86
|
+
let a = select(x, y, drop == 0u);
|
|
87
|
+
let b = select(z, y, drop == 2u);
|
|
88
|
+
return flip(a, g << 31u) + flip(b, (g & 2u) << 30u);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
fn grad4(h: u32, x: f32, y: f32, z: f32, w: f32) -> f32 {
|
|
92
|
+
let axis = h >> 3u;
|
|
93
|
+
let a = select(x, y, axis == 0u);
|
|
94
|
+
let b = select(y, z, axis < 2u);
|
|
95
|
+
let d = select(z, w, axis < 3u);
|
|
96
|
+
return flip(a, h << 31u) + flip(b, (h & 2u) << 30u) + flip(d, (h & 4u) << 29u);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
fn unit(v: f32) -> f32 {
|
|
100
|
+
return clamp(v, -1.0, 1.0);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
fn value2(seed: u32, ix: i32, iy: i32, px: f32, py: f32) -> f32 {
|
|
104
|
+
let fx = floor(px);
|
|
105
|
+
let fy = floor(py);
|
|
106
|
+
let x0 = bitcast<u32>(ix + i32(fx)) * PX;
|
|
107
|
+
let y0 = bitcast<u32>(iy + i32(fy)) * PY;
|
|
108
|
+
let x1 = x0 + PX;
|
|
109
|
+
let y1 = y0 + PY;
|
|
110
|
+
let u = fade(px - fx);
|
|
111
|
+
let v = fade(py - fy);
|
|
112
|
+
let a = lerp(to_value(hash2(seed, x0, y0)), to_value(hash2(seed, x1, y0)), u);
|
|
113
|
+
let b = lerp(to_value(hash2(seed, x0, y1)), to_value(hash2(seed, x1, y1)), u);
|
|
114
|
+
return lerp(a, b, v);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
fn value3(seed: u32, ix: i32, iy: i32, iz: i32, px: f32, py: f32, pz: f32) -> f32 {
|
|
118
|
+
let fx = floor(px);
|
|
119
|
+
let fy = floor(py);
|
|
120
|
+
let fz = floor(pz);
|
|
121
|
+
let x0 = bitcast<u32>(ix + i32(fx)) * PX;
|
|
122
|
+
let y0 = bitcast<u32>(iy + i32(fy)) * PY;
|
|
123
|
+
let z0 = bitcast<u32>(iz + i32(fz)) * PZ;
|
|
124
|
+
let x1 = x0 + PX;
|
|
125
|
+
let y1 = y0 + PY;
|
|
126
|
+
let z1 = z0 + PZ;
|
|
127
|
+
let u = fade(px - fx);
|
|
128
|
+
let v = fade(py - fy);
|
|
129
|
+
let w = fade(pz - fz);
|
|
130
|
+
let a = lerp(to_value(hash3(seed, x0, y0, z0)), to_value(hash3(seed, x1, y0, z0)), u);
|
|
131
|
+
let b = lerp(to_value(hash3(seed, x0, y1, z0)), to_value(hash3(seed, x1, y1, z0)), u);
|
|
132
|
+
let d = lerp(to_value(hash3(seed, x0, y0, z1)), to_value(hash3(seed, x1, y0, z1)), u);
|
|
133
|
+
let e = lerp(to_value(hash3(seed, x0, y1, z1)), to_value(hash3(seed, x1, y1, z1)), u);
|
|
134
|
+
return lerp(lerp(a, b, v), lerp(d, e, v), w);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fn perlin2(seed: u32, ix: i32, iy: i32, px: f32, py: f32) -> f32 {
|
|
138
|
+
let fx = floor(px);
|
|
139
|
+
let fy = floor(py);
|
|
140
|
+
let tx = px - fx;
|
|
141
|
+
let ty = py - fy;
|
|
142
|
+
let x0 = bitcast<u32>(ix + i32(fx)) * PX;
|
|
143
|
+
let y0 = bitcast<u32>(iy + i32(fy)) * PY;
|
|
144
|
+
let x1 = x0 + PX;
|
|
145
|
+
let y1 = y0 + PY;
|
|
146
|
+
let tx1 = tx - 1.0;
|
|
147
|
+
let ty1 = ty - 1.0;
|
|
148
|
+
let u = fade(tx);
|
|
149
|
+
let v = fade(ty);
|
|
150
|
+
let a = lerp(grad2(grad_hash2(seed, x0, y0), tx, ty), grad2(grad_hash2(seed, x1, y0), tx1, ty), u);
|
|
151
|
+
let b = lerp(grad2(grad_hash2(seed, x0, y1), tx, ty1), grad2(grad_hash2(seed, x1, y1), tx1, ty1), u);
|
|
152
|
+
return unit(lerp(a, b, v) * PERLIN2_SCALE);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
fn perlin3(seed: u32, ix: i32, iy: i32, iz: i32, px: f32, py: f32, pz: f32) -> f32 {
|
|
156
|
+
let fx = floor(px);
|
|
157
|
+
let fy = floor(py);
|
|
158
|
+
let fz = floor(pz);
|
|
159
|
+
let tx = px - fx;
|
|
160
|
+
let ty = py - fy;
|
|
161
|
+
let tz = pz - fz;
|
|
162
|
+
let x0 = bitcast<u32>(ix + i32(fx)) * PX;
|
|
163
|
+
let y0 = bitcast<u32>(iy + i32(fy)) * PY;
|
|
164
|
+
let z0 = bitcast<u32>(iz + i32(fz)) * PZ;
|
|
165
|
+
let x1 = x0 + PX;
|
|
166
|
+
let y1 = y0 + PY;
|
|
167
|
+
let z1 = z0 + PZ;
|
|
168
|
+
let tx1 = tx - 1.0;
|
|
169
|
+
let ty1 = ty - 1.0;
|
|
170
|
+
let tz1 = tz - 1.0;
|
|
171
|
+
let u = fade(tx);
|
|
172
|
+
let v = fade(ty);
|
|
173
|
+
let w = fade(tz);
|
|
174
|
+
let a = lerp(grad3(grad_hash3(seed, x0, y0, z0), tx, ty, tz), grad3(grad_hash3(seed, x1, y0, z0), tx1, ty, tz), u);
|
|
175
|
+
let b = lerp(grad3(grad_hash3(seed, x0, y1, z0), tx, ty1, tz), grad3(grad_hash3(seed, x1, y1, z0), tx1, ty1, tz), u);
|
|
176
|
+
let d = lerp(grad3(grad_hash3(seed, x0, y0, z1), tx, ty, tz1), grad3(grad_hash3(seed, x1, y0, z1), tx1, ty, tz1), u);
|
|
177
|
+
let e = lerp(grad3(grad_hash3(seed, x0, y1, z1), tx, ty1, tz1), grad3(grad_hash3(seed, x1, y1, z1), tx1, ty1, tz1), u);
|
|
178
|
+
return unit(lerp(lerp(a, b, v), lerp(d, e, v), w) * PERLIN3_SCALE);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
fn falloff(r2: f32, d2: f32) -> f32 {
|
|
182
|
+
let a = max(r2 - d2, 0.0);
|
|
183
|
+
let a2 = a * a;
|
|
184
|
+
return a2 * a2;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
fn simplex2(seed: u32, ix: i32, iy: i32, px: f32, py: f32) -> f32 {
|
|
188
|
+
let fx = floor(px);
|
|
189
|
+
let fy = floor(py);
|
|
190
|
+
let xi = px - fx;
|
|
191
|
+
let yi = py - fy;
|
|
192
|
+
let t = (xi + yi) * G2;
|
|
193
|
+
let x0 = xi - t;
|
|
194
|
+
let y0 = yi - t;
|
|
195
|
+
let xb = bitcast<u32>(ix + i32(fx)) * PX;
|
|
196
|
+
let yb = bitcast<u32>(iy + i32(fy)) * PY;
|
|
197
|
+
let lower = y0 < x0;
|
|
198
|
+
let i1 = select(0.0, 1.0, lower);
|
|
199
|
+
let j1 = 1.0 - i1;
|
|
200
|
+
let x1 = x0 - i1 + G2;
|
|
201
|
+
let y1 = y0 - j1 + G2;
|
|
202
|
+
let x2 = x0 - 1.0 + 2.0 * G2;
|
|
203
|
+
let y2 = y0 - 1.0 + 2.0 * G2;
|
|
204
|
+
let h0 = grad_hash2(seed, xb, yb);
|
|
205
|
+
let h1 = grad_hash2(seed, xb + select(0u, PX, lower), yb + select(PY, 0u, lower));
|
|
206
|
+
let h2 = grad_hash2(seed, xb + PX, yb + PY);
|
|
207
|
+
let n0 = falloff(0.5, x0 * x0 + y0 * y0) * grad2(h0, x0, y0);
|
|
208
|
+
let n1 = falloff(0.5, x1 * x1 + y1 * y1) * grad2(h1, x1, y1);
|
|
209
|
+
let n2 = falloff(0.5, x2 * x2 + y2 * y2) * grad2(h2, x2, y2);
|
|
210
|
+
return unit((n0 + n1 + n2) * SIMPLEX2_SCALE);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
fn simplex3(seed: u32, ix: i32, iy: i32, iz: i32, px: f32, py: f32, pz: f32) -> f32 {
|
|
214
|
+
let rx = round(px);
|
|
215
|
+
let ry = round(py);
|
|
216
|
+
let rz = round(pz);
|
|
217
|
+
var xb = bitcast<u32>(ix + i32(rx)) * PX;
|
|
218
|
+
var yb = bitcast<u32>(iy + i32(ry)) * PY;
|
|
219
|
+
var zb = bitcast<u32>(iz + i32(rz)) * PZ;
|
|
220
|
+
var xr = px - rx;
|
|
221
|
+
var yr = py - ry;
|
|
222
|
+
var zr = pz - rz;
|
|
223
|
+
var xs = select(-1, 1, xr < 0.0);
|
|
224
|
+
var ys = select(-1, 1, yr < 0.0);
|
|
225
|
+
var zs = select(-1, 1, zr < 0.0);
|
|
226
|
+
var ax = abs(xr);
|
|
227
|
+
var ay = abs(yr);
|
|
228
|
+
var az = abs(zr);
|
|
229
|
+
var a = (0.6 - xr * xr) - (yr * yr + zr * zr);
|
|
230
|
+
var s = seed;
|
|
231
|
+
var value = 0.0;
|
|
232
|
+
for (var l = 0; l < 2; l++) {
|
|
233
|
+
let a0 = max(a, 0.0);
|
|
234
|
+
let a2 = a0 * a0;
|
|
235
|
+
value = value + a2 * a2 * grad3(grad_hash3(s, xb, yb, zb), xr, yr, zr);
|
|
236
|
+
let mx = ax >= ay && ax >= az;
|
|
237
|
+
let my = !mx && ay >= az;
|
|
238
|
+
let mz = !(mx || my);
|
|
239
|
+
let am = select(select(az, ay, my), ax, mx);
|
|
240
|
+
let b0 = max(a + am + am - 1.0, 0.0);
|
|
241
|
+
let b2 = b0 * b0;
|
|
242
|
+
let hx = xb - select(0u, bitcast<u32>(xs) * PX, mx);
|
|
243
|
+
let hy = yb - select(0u, bitcast<u32>(ys) * PY, my);
|
|
244
|
+
let hz = zb - select(0u, bitcast<u32>(zs) * PZ, mz);
|
|
245
|
+
let ox = xr + select(0.0, f32(xs), mx);
|
|
246
|
+
let oy = yr + select(0.0, f32(ys), my);
|
|
247
|
+
let oz = zr + select(0.0, f32(zs), mz);
|
|
248
|
+
value = value + b2 * b2 * grad3(grad_hash3(s, hx, hy, hz), ox, oy, oz);
|
|
249
|
+
if (l == 1) { break; }
|
|
250
|
+
ax = 0.5 - ax;
|
|
251
|
+
ay = 0.5 - ay;
|
|
252
|
+
az = 0.5 - az;
|
|
253
|
+
xr = f32(xs) * ax;
|
|
254
|
+
yr = f32(ys) * ay;
|
|
255
|
+
zr = f32(zs) * az;
|
|
256
|
+
a = a + ((0.75 - ax) - (ay + az));
|
|
257
|
+
xb = xb + select(0u, PX, xs == -1);
|
|
258
|
+
yb = yb + select(0u, PY, ys == -1);
|
|
259
|
+
zb = zb + select(0u, PZ, zs == -1);
|
|
260
|
+
xs = -xs;
|
|
261
|
+
ys = -ys;
|
|
262
|
+
zs = -zs;
|
|
263
|
+
s = s ^ SEED_FLIP_3D;
|
|
264
|
+
}
|
|
265
|
+
return unit(value * SIMPLEX3_SCALE);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
fn simplex4(seed: u32, ix: i32, iy: i32, iz: i32, iw: i32, px: f32, py: f32, pz: f32, pw: f32) -> f32 {
|
|
269
|
+
let fx = floor(px);
|
|
270
|
+
let fy = floor(py);
|
|
271
|
+
let fz = floor(pz);
|
|
272
|
+
let fw = floor(pw);
|
|
273
|
+
let xi = px - fx;
|
|
274
|
+
let yi = py - fy;
|
|
275
|
+
let zi = pz - fz;
|
|
276
|
+
let wi = pw - fw;
|
|
277
|
+
let t = (xi + yi + zi + wi) * G4;
|
|
278
|
+
let x0 = xi - t;
|
|
279
|
+
let y0 = yi - t;
|
|
280
|
+
let z0 = zi - t;
|
|
281
|
+
let w0 = wi - t;
|
|
282
|
+
var rx = 0;
|
|
283
|
+
var ry = 0;
|
|
284
|
+
var rz = 0;
|
|
285
|
+
var rw = 0;
|
|
286
|
+
if (y0 < x0) { rx += 1; } else { ry += 1; }
|
|
287
|
+
if (z0 < x0) { rx += 1; } else { rz += 1; }
|
|
288
|
+
if (w0 < x0) { rx += 1; } else { rw += 1; }
|
|
289
|
+
if (z0 < y0) { ry += 1; } else { rz += 1; }
|
|
290
|
+
if (w0 < y0) { ry += 1; } else { rw += 1; }
|
|
291
|
+
if (w0 < z0) { rz += 1; } else { rw += 1; }
|
|
292
|
+
let xb = bitcast<u32>(ix + i32(fx)) * PX;
|
|
293
|
+
let yb = bitcast<u32>(iy + i32(fy)) * PY;
|
|
294
|
+
let zb = bitcast<u32>(iz + i32(fz)) * PZ;
|
|
295
|
+
let wb = bitcast<u32>(iw + i32(fw)) * PW;
|
|
296
|
+
var value = 0.0;
|
|
297
|
+
for (var k = 0; k < 5; k++) {
|
|
298
|
+
let at = 4 - k;
|
|
299
|
+
let sx = rx >= at;
|
|
300
|
+
let sy = ry >= at;
|
|
301
|
+
let sz = rz >= at;
|
|
302
|
+
let sw = rw >= at;
|
|
303
|
+
let off = f32(k) * G4;
|
|
304
|
+
let x = x0 - select(0.0, 1.0, sx) + off;
|
|
305
|
+
let y = y0 - select(0.0, 1.0, sy) + off;
|
|
306
|
+
let z = z0 - select(0.0, 1.0, sz) + off;
|
|
307
|
+
let w = w0 - select(0.0, 1.0, sw) + off;
|
|
308
|
+
let h = grad_hash4(seed, xb + select(0u, PX, sx), yb + select(0u, PY, sy), zb + select(0u, PZ, sz), wb + select(0u, PW, sw));
|
|
309
|
+
value = value + falloff(0.6, x * x + y * y + z * z + w * w) * grad4(h, x, y, z, w);
|
|
310
|
+
}
|
|
311
|
+
return unit(value * SIMPLEX4_SCALE);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
fn jitter_of(h: u32, shift: u32) -> f32 {
|
|
315
|
+
return f32((h >> shift) & 1023u) * (1.0 / 1023.0) - 0.5;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
fn cell_result(ret: i32, metric: i32, b1: f32, b2: f32, bh: u32) -> f32 {
|
|
319
|
+
var d1 = b1;
|
|
320
|
+
var d2 = b2;
|
|
321
|
+
if (metric == 0) {
|
|
322
|
+
d1 = sqrt(b1);
|
|
323
|
+
d2 = sqrt(b2);
|
|
324
|
+
}
|
|
325
|
+
if (ret == 0) { return d1; }
|
|
326
|
+
if (ret == 1) { return d2; }
|
|
327
|
+
if (ret == 2) { return d2 - d1; }
|
|
328
|
+
return to_value(mix32(bh));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
fn cell_distance(metric: i32, fx: f32, fy: f32, fz: f32) -> f32 {
|
|
332
|
+
if (metric == 1) { return abs(fx) + abs(fy) + abs(fz); }
|
|
333
|
+
if (metric == 2) { return max(max(abs(fx), abs(fy)), abs(fz)); }
|
|
334
|
+
return fx * fx + fy * fy + fz * fz;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
fn cellular2(seed: u32, ix: i32, iy: i32, px: f32, py: f32, jitter: f32, metric: i32, ret: i32) -> f32 {
|
|
338
|
+
let fx0 = floor(px);
|
|
339
|
+
let fy0 = floor(py);
|
|
340
|
+
let tx = px - fx0;
|
|
341
|
+
let ty = py - fy0;
|
|
342
|
+
let xb = bitcast<u32>(ix + i32(fx0)) * PX;
|
|
343
|
+
let yb = bitcast<u32>(iy + i32(fy0)) * PY;
|
|
344
|
+
var b1 = 1e10;
|
|
345
|
+
var b2 = 1e10;
|
|
346
|
+
var bh = 0u;
|
|
347
|
+
for (var dy = -1; dy <= 1; dy++) {
|
|
348
|
+
for (var dx = -1; dx <= 1; dx++) {
|
|
349
|
+
let h = hash2(seed, xb + bitcast<u32>(dx) * PX, yb + bitcast<u32>(dy) * PY);
|
|
350
|
+
let fx = f32(dx) + 0.5 + jitter * jitter_of(h, 0u) - tx;
|
|
351
|
+
let fy = f32(dy) + 0.5 + jitter * jitter_of(h, 10u) - ty;
|
|
352
|
+
var d = fx * fx + fy * fy;
|
|
353
|
+
if (metric == 1) { d = abs(fx) + abs(fy); }
|
|
354
|
+
if (metric == 2) { d = max(abs(fx), abs(fy)); }
|
|
355
|
+
let m = d < b1;
|
|
356
|
+
b2 = select(min(b2, d), b1, m);
|
|
357
|
+
bh = select(bh, h, m);
|
|
358
|
+
b1 = select(b1, d, m);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return cell_result(ret, metric, b1, b2, bh);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
fn cellular3(seed: u32, ix: i32, iy: i32, iz: i32, px: f32, py: f32, pz: f32, jitter: f32, metric: i32, ret: i32) -> f32 {
|
|
365
|
+
let fx0 = floor(px);
|
|
366
|
+
let fy0 = floor(py);
|
|
367
|
+
let fz0 = floor(pz);
|
|
368
|
+
let tx = px - fx0;
|
|
369
|
+
let ty = py - fy0;
|
|
370
|
+
let tz = pz - fz0;
|
|
371
|
+
let xb = bitcast<u32>(ix + i32(fx0)) * PX;
|
|
372
|
+
let yb = bitcast<u32>(iy + i32(fy0)) * PY;
|
|
373
|
+
let zb = bitcast<u32>(iz + i32(fz0)) * PZ;
|
|
374
|
+
var b1 = 1e10;
|
|
375
|
+
var b2 = 1e10;
|
|
376
|
+
var bh = 0u;
|
|
377
|
+
for (var dz = -1; dz <= 1; dz++) {
|
|
378
|
+
for (var dy = -1; dy <= 1; dy++) {
|
|
379
|
+
for (var dx = -1; dx <= 1; dx++) {
|
|
380
|
+
let h = hash3(seed, xb + bitcast<u32>(dx) * PX, yb + bitcast<u32>(dy) * PY, zb + bitcast<u32>(dz) * PZ);
|
|
381
|
+
let fx = f32(dx) + 0.5 + jitter * jitter_of(h, 0u) - tx;
|
|
382
|
+
let fy = f32(dy) + 0.5 + jitter * jitter_of(h, 10u) - ty;
|
|
383
|
+
let fz = f32(dz) + 0.5 + jitter * jitter_of(h, 20u) - tz;
|
|
384
|
+
let d = cell_distance(metric, fx, fy, fz);
|
|
385
|
+
let m = d < b1;
|
|
386
|
+
b2 = select(min(b2, d), b1, m);
|
|
387
|
+
bh = select(bh, h, m);
|
|
388
|
+
b1 = select(b1, d, m);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return cell_result(ret, metric, b1, b2, bh);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
fn nlog2(x: f32) -> f32 {
|
|
396
|
+
let bits = bitcast<i32>(x);
|
|
397
|
+
let big0 = bitcast<f32>((bits & 0x007fffff) | 0x3f800000);
|
|
398
|
+
let big = big0 > SQRT_2;
|
|
399
|
+
let m = select(big0, big0 * 0.5, big);
|
|
400
|
+
let e = f32(((bits >> 23u) & 0xff) - 127 + select(0, 1, big));
|
|
401
|
+
let s = (m - 1.0) / (m + 1.0);
|
|
402
|
+
let s2 = s * s;
|
|
403
|
+
var p = 1.0 / 9.0;
|
|
404
|
+
p = 1.0 / 7.0 + s2 * p;
|
|
405
|
+
p = 1.0 / 5.0 + s2 * p;
|
|
406
|
+
p = 1.0 / 3.0 + s2 * p;
|
|
407
|
+
p = 1.0 + s2 * p;
|
|
408
|
+
return e + s * p * (2.0 / LN_2);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
fn nexp2(y0: f32) -> f32 {
|
|
412
|
+
let y = clamp(y0, -126.0, 126.0);
|
|
413
|
+
let n = floor(y + 0.5);
|
|
414
|
+
let t = (y - n) * LN_2;
|
|
415
|
+
var p = 1.0 / 720.0;
|
|
416
|
+
p = 1.0 / 120.0 + t * p;
|
|
417
|
+
p = 1.0 / 24.0 + t * p;
|
|
418
|
+
p = 1.0 / 6.0 + t * p;
|
|
419
|
+
p = 0.5 + t * p;
|
|
420
|
+
p = 1.0 + t * p;
|
|
421
|
+
p = 1.0 + t * p;
|
|
422
|
+
return p * bitcast<f32>((i32(n) + 127) << 23u);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** sign(x) \xD7 |x|^e, and 0 for |x| below 1e-30 (the kernel's power). */
|
|
426
|
+
fn pow_signed(x: f32, e: f32) -> f32 {
|
|
427
|
+
let a = abs(x);
|
|
428
|
+
let v = select(nexp2(e * nlog2(max(a, 1e-30))), 0.0, a < 1e-30);
|
|
429
|
+
return flip(v, bitcast<u32>(x) & 0x80000000u);
|
|
430
|
+
}
|
|
431
|
+
`
|
|
432
|
+
);
|
|
433
|
+
function f(v) {
|
|
434
|
+
const x = Math.fround(v);
|
|
435
|
+
if (Object.is(x, -0)) return "-0.0";
|
|
436
|
+
const s = String(x);
|
|
437
|
+
const lit = /[.e]/.test(s) ? s : `${s}.0`;
|
|
438
|
+
return x < 0 ? `(${lit})` : lit;
|
|
439
|
+
}
|
|
440
|
+
const u = (v) => `${v >>> 0}u`;
|
|
441
|
+
const i = (v) => v < 0 ? `(${v | 0})` : `${v | 0}`;
|
|
442
|
+
function generateWgsl(program, options) {
|
|
443
|
+
const name = options.name;
|
|
444
|
+
const records = program.terms.skew.length;
|
|
445
|
+
const pos = program.dimensions === 4 ? "vec4f" : "vec3f";
|
|
446
|
+
const lines = [
|
|
447
|
+
"import shard::noise::{ NoiseOrigin, hash_seed, value2, value3, perlin2, perlin3, simplex2, simplex3, simplex4, cellular2, cellular3, pow_signed };",
|
|
448
|
+
"",
|
|
449
|
+
`/** Origin records for noise_${name}_at: one per source octave. */`,
|
|
450
|
+
`alias NoiseOrigins_${name} = array<NoiseOrigin, ${Math.max(records, 1)}>;`,
|
|
451
|
+
`const NOISE_${name.toUpperCase()}_ORIGINS: u32 = ${records}u;`,
|
|
452
|
+
""
|
|
453
|
+
];
|
|
454
|
+
const zero = program.zeroOrigins;
|
|
455
|
+
const zf = new Float32Array(zero.buffer, zero.byteOffset, zero.length);
|
|
456
|
+
const plain = (k, part, axis) => part === "cell" ? i(zero[k * 8 + axis]) : f(zf[k * 8 + 4 + axis]);
|
|
457
|
+
const at = (k, part, axis) => `(*origin)[${k}].${part}.${"xyzw"[axis]}`;
|
|
458
|
+
lines.push(`fn noise_${name}(p: ${pos}, seed: u32) -> f32 {`);
|
|
459
|
+
lines.push(...body(program, plain, "p"), "}", "");
|
|
460
|
+
lines.push(
|
|
461
|
+
`fn noise_${name}_at(origin: ptr<function, NoiseOrigins_${name}>, local: ${pos}, seed: u32) -> f32 {`
|
|
462
|
+
);
|
|
463
|
+
lines.push(...body(program, at, "local"), "}", "");
|
|
464
|
+
return lines.join("\n");
|
|
465
|
+
}
|
|
466
|
+
function body(program, origin, p) {
|
|
467
|
+
const out = [];
|
|
468
|
+
const r = (n) => `r${n}`;
|
|
469
|
+
const w4 = program.dimensions === 4;
|
|
470
|
+
out.push(` let r0 = ${p}.x;`, ` let r1 = ${p}.y;`);
|
|
471
|
+
out.push(program.dimensions === 2 ? " let r2 = 0.0;" : ` let r2 = ${p}.z;`);
|
|
472
|
+
out.push(w4 ? ` let r3 = ${p}.w;` : " let r3 = 0.0;");
|
|
473
|
+
const code = program.code;
|
|
474
|
+
const k = program.consts;
|
|
475
|
+
for (let n = 0; n < program.instructions; n++) {
|
|
476
|
+
const b = n * WIDTH;
|
|
477
|
+
const op = code[b];
|
|
478
|
+
const dst = code[b + 1];
|
|
479
|
+
const a = code[b + 2];
|
|
480
|
+
const c0 = code[b + 3];
|
|
481
|
+
const c1 = code[b + 4];
|
|
482
|
+
const kb = code[b + 8];
|
|
483
|
+
const count = code[b + 9];
|
|
484
|
+
const d = r(dst);
|
|
485
|
+
switch (op) {
|
|
486
|
+
case OP.CONST:
|
|
487
|
+
out.push(` let ${d} = ${f(k[kb])};`);
|
|
488
|
+
break;
|
|
489
|
+
case OP.SOURCE:
|
|
490
|
+
out.push(...source(program, b, origin));
|
|
491
|
+
break;
|
|
492
|
+
case OP.ADD:
|
|
493
|
+
out.push(` let ${d} = ${r(a)} + ${r(c0)};`);
|
|
494
|
+
break;
|
|
495
|
+
case OP.MUL:
|
|
496
|
+
out.push(` let ${d} = ${r(a)} * ${r(c0)};`);
|
|
497
|
+
break;
|
|
498
|
+
case OP.MIN:
|
|
499
|
+
out.push(` let ${d} = min(${r(a)}, ${r(c0)});`);
|
|
500
|
+
break;
|
|
501
|
+
case OP.MAX:
|
|
502
|
+
out.push(` let ${d} = max(${r(a)}, ${r(c0)});`);
|
|
503
|
+
break;
|
|
504
|
+
case OP.LERP:
|
|
505
|
+
out.push(` let ${d} = ${r(a)} + ${r(c1)} * (${r(c0)} - ${r(a)});`);
|
|
506
|
+
break;
|
|
507
|
+
case OP.SELECT: {
|
|
508
|
+
const [th, fo, lo, inv] = [k[kb], k[kb + 1], k[kb + 2], k[kb + 3]];
|
|
509
|
+
if (fo > 0) {
|
|
510
|
+
out.push(` let ${d}_t0 = clamp((${r(c1)} - ${f(lo)}) * ${f(inv)}, 0.0, 1.0);`);
|
|
511
|
+
out.push(` let ${d}_t = ${d}_t0 * ${d}_t0 * (3.0 - 2.0 * ${d}_t0);`);
|
|
512
|
+
} else out.push(` let ${d}_t = select(0.0, 1.0, ${r(c1)} >= ${f(th)});`);
|
|
513
|
+
out.push(` let ${d} = ${r(a)} + ${d}_t * (${r(c0)} - ${r(a)});`);
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
case OP.REMAP: {
|
|
517
|
+
const v = `${f(k[kb + 1])} + (${r(a)} - ${f(k[kb])}) * ${f(k[kb + 2])}`;
|
|
518
|
+
out.push(
|
|
519
|
+
count ? ` let ${d} = clamp(${v}, ${f(k[kb + 3])}, ${f(k[kb + 4])});` : ` let ${d} = ${v};`
|
|
520
|
+
);
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
case OP.CLAMP:
|
|
524
|
+
out.push(` let ${d} = clamp(${r(a)}, ${f(k[kb])}, ${f(k[kb + 1])});`);
|
|
525
|
+
break;
|
|
526
|
+
case OP.CURVE: {
|
|
527
|
+
out.push(` var ${d}_v = ${f(k[kb + 1])};`);
|
|
528
|
+
for (let s = 0; s + 1 < count; s++) {
|
|
529
|
+
const o = kb + s * 4;
|
|
530
|
+
const [x0, y0, inv, dy] = [f(k[o]), f(k[o + 1]), f(k[o + 2]), f(k[o + 3])];
|
|
531
|
+
out.push(
|
|
532
|
+
` ${d}_v = select(${d}_v, ${y0} + clamp((${r(a)} - ${x0}) * ${inv}, 0.0, 1.0) * ${dy}, ${r(a)} >= ${x0});`
|
|
533
|
+
);
|
|
534
|
+
}
|
|
535
|
+
out.push(` let ${d} = ${d}_v;`);
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
case OP.TERRACE: {
|
|
539
|
+
const [min, scale, sharp, back] = [f(k[kb]), f(k[kb + 1]), f(k[kb + 2]), f(k[kb + 3])];
|
|
540
|
+
out.push(` let ${d}_u = (${r(a)} - ${min}) * ${scale};`);
|
|
541
|
+
out.push(` let ${d}_s = floor(${d}_u);`);
|
|
542
|
+
out.push(` let ${d}_f = clamp((${d}_u - ${d}_s - 0.5) * ${sharp} + 0.5, 0.0, 1.0);`);
|
|
543
|
+
out.push(` let ${d} = (${d}_s + ${d}_f) * ${back} + ${min};`);
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
case OP.ABS:
|
|
547
|
+
out.push(` let ${d} = abs(${r(a)});`);
|
|
548
|
+
break;
|
|
549
|
+
case OP.POWER:
|
|
550
|
+
out.push(` let ${d} = pow_signed(${r(a)}, ${f(k[kb])});`);
|
|
551
|
+
break;
|
|
552
|
+
case OP.WARP: {
|
|
553
|
+
const amount = f(k[kb]);
|
|
554
|
+
for (let axis = 0; axis < 4; axis++) {
|
|
555
|
+
const ch = code[b + 3 + axis];
|
|
556
|
+
const dst4 = r(dst + axis);
|
|
557
|
+
if (ch < 0) out.push(` let ${dst4} = ${a >= 0 ? r(a + axis) : "0.0"};`);
|
|
558
|
+
else if (a >= 0) out.push(` let ${dst4} = ${r(a + axis)} + ${amount} * ${r(ch)};`);
|
|
559
|
+
else out.push(` let ${dst4} = ${amount} * ${r(ch)};`);
|
|
560
|
+
}
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
case OP.SCALE_DISP:
|
|
564
|
+
for (let axis = 0; axis < 4; axis++) {
|
|
565
|
+
out.push(` let ${r(dst + axis)} = ${r(a + axis)} * ${f(k[kb + axis])};`);
|
|
566
|
+
}
|
|
567
|
+
break;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
out.push(` return ${r(program.result)};`);
|
|
571
|
+
return out;
|
|
572
|
+
}
|
|
573
|
+
function source(program, b, origin) {
|
|
574
|
+
const code = program.code;
|
|
575
|
+
const k = program.consts;
|
|
576
|
+
const out = [];
|
|
577
|
+
const dst = code[b + 1];
|
|
578
|
+
const disp = code[b + 2];
|
|
579
|
+
const base = code[b + 3];
|
|
580
|
+
const kind = SOURCE_KINDS[code[b + 4]];
|
|
581
|
+
const dims = code[b + 5];
|
|
582
|
+
const fractal = code[b + 6];
|
|
583
|
+
const metric = code[b + 7] & 15;
|
|
584
|
+
const ret = code[b + 7] >> 4;
|
|
585
|
+
const kb = code[b + 8];
|
|
586
|
+
const octaves = code[b + 9];
|
|
587
|
+
const label = code[b + 10];
|
|
588
|
+
const salt = code[b + 11];
|
|
589
|
+
const d = `r${dst}`;
|
|
590
|
+
const seed = salt !== 0 ? `hash_seed(seed, ${u(salt)})` : "seed";
|
|
591
|
+
out.push(` let ${d}_s = hash_seed(${seed}, ${u(label)});`);
|
|
592
|
+
const jitter = f(k[kb]);
|
|
593
|
+
const norm = f(k[kb + 1]);
|
|
594
|
+
let sum = "0.0";
|
|
595
|
+
for (let o = 0; o < octaves; o++) {
|
|
596
|
+
const c = kb + 2 + o * 6;
|
|
597
|
+
const v = `${d}_${o}`;
|
|
598
|
+
const q = (axis) => {
|
|
599
|
+
const lx = `r${axis}`;
|
|
600
|
+
const a = f(k[c + axis]);
|
|
601
|
+
return disp >= 0 ? `${a} * ${lx} + ${f(k[c + 4])} * r${disp + axis}` : `${a} * ${lx}`;
|
|
602
|
+
};
|
|
603
|
+
out.push(` let ${v}_qx = ${q(0)};`, ` let ${v}_qy = ${q(1)};`);
|
|
604
|
+
if (dims >= 3) out.push(` let ${v}_qz = ${q(2)};`);
|
|
605
|
+
if (dims >= 4) out.push(` let ${v}_qw = ${q(3)};`);
|
|
606
|
+
const rec = base + o;
|
|
607
|
+
const cell = (axis) => origin(rec, "cell", axis);
|
|
608
|
+
const frac = (axis) => origin(rec, "frac", axis);
|
|
609
|
+
const s = fractal === FRACTAL.NONE ? `${d}_s` : `hash_seed(${d}_s, ${u(o)})`;
|
|
610
|
+
let call;
|
|
611
|
+
if (kind === "simplex" && dims === 2) {
|
|
612
|
+
out.push(` let ${v}_t = (${v}_qx + ${v}_qy) * ${f(0.3660254037844386)};`);
|
|
613
|
+
call = `simplex2(${s}, ${cell(0)}, ${cell(1)}, ${frac(0)} + (${v}_qx + ${v}_t), ${frac(1)} + (${v}_qy + ${v}_t))`;
|
|
614
|
+
} else if (kind === "simplex" && dims === 4) {
|
|
615
|
+
out.push(` let ${v}_t = (${v}_qx + ${v}_qy + ${v}_qz + ${v}_qw) * ${f(0.3090169943749474)};`);
|
|
616
|
+
call = `simplex4(${s}, ${cell(0)}, ${cell(1)}, ${cell(2)}, ${cell(3)}, ${frac(0)} + (${v}_qx + ${v}_t), ${frac(1)} + (${v}_qy + ${v}_t), ${frac(2)} + (${v}_qz + ${v}_t), ${frac(3)} + (${v}_qw + ${v}_t))`;
|
|
617
|
+
} else if (kind === "simplex") {
|
|
618
|
+
out.push(` let ${v}_t = (${v}_qx + ${v}_qy + ${v}_qz) * ${f(2 / 3)};`);
|
|
619
|
+
call = `simplex3(${s}, ${cell(0)}, ${cell(1)}, ${cell(2)}, ${frac(0)} + (${v}_t - ${v}_qx), ${frac(1)} + (${v}_t - ${v}_qy), ${frac(2)} + (${v}_t - ${v}_qz))`;
|
|
620
|
+
} else if (dims === 2) {
|
|
621
|
+
const args = `${s}, ${cell(0)}, ${cell(1)}, ${frac(0)} + ${v}_qx, ${frac(1)} + ${v}_qy`;
|
|
622
|
+
call = kind === "cellular" ? `cellular2(${args}, ${jitter}, ${metric}, ${ret})` : `${kind}2(${args})`;
|
|
623
|
+
} else {
|
|
624
|
+
const args = `${s}, ${cell(0)}, ${cell(1)}, ${cell(2)}, ${frac(0)} + ${v}_qx, ${frac(1)} + ${v}_qy, ${frac(2)} + ${v}_qz`;
|
|
625
|
+
call = kind === "cellular" ? `cellular3(${args}, ${jitter}, ${metric}, ${ret})` : `${kind}3(${args})`;
|
|
626
|
+
}
|
|
627
|
+
out.push(` let ${v} = ${call};`);
|
|
628
|
+
const amp = f(k[c + 5]);
|
|
629
|
+
const term = fractal === FRACTAL.RIDGED ? `${amp} * ((1.0 - abs(${v})) * (1.0 - abs(${v})))` : fractal === FRACTAL.BILLOW ? `${amp} * (2.0 * abs(${v}) - 1.0)` : `${amp} * ${v}`;
|
|
630
|
+
out.push(` let ${v}_sum = ${sum} + ${term};`);
|
|
631
|
+
sum = `${v}_sum`;
|
|
632
|
+
}
|
|
633
|
+
out.push(
|
|
634
|
+
fractal === FRACTAL.RIDGED ? ` let ${d} = ${sum} * ${norm} * 2.0 - 1.0;` : ` let ${d} = ${sum} * ${norm};`
|
|
635
|
+
);
|
|
636
|
+
return out;
|
|
637
|
+
}
|
|
638
|
+
export {
|
|
639
|
+
NOISE_LIBRARY,
|
|
640
|
+
generateWgsl
|
|
641
|
+
};
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Pool jobs for @aethervtt/shard-noise. Plain JavaScript: workers import it with no bundler or loader.
|
|
2
|
+
import {
|
|
3
|
+
computeOrigins,
|
|
4
|
+
evalProgram,
|
|
5
|
+
gridOrigin,
|
|
6
|
+
gridPoints,
|
|
7
|
+
instantiate,
|
|
8
|
+
patchOrigin,
|
|
9
|
+
patchPoints,
|
|
10
|
+
} from './kernel.js'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Samples `program` for one job and returns the values (moved back to the caller).
|
|
14
|
+
* `job.kind` is `points` (with optional f64 `origin`), `patch`, or `grid`; patch and grid jobs
|
|
15
|
+
* cover rows [row0, row1) and use the whole area's center as origin, so how a request is split
|
|
16
|
+
* never changes a value.
|
|
17
|
+
*/
|
|
18
|
+
export function sample(module, program, seed, job) {
|
|
19
|
+
const state = instantiate(module)
|
|
20
|
+
if (job.kind === 'points') {
|
|
21
|
+
const count = job.points.length / job.stride
|
|
22
|
+
const out = new Float32Array(count)
|
|
23
|
+
const origins = job.origin
|
|
24
|
+
? computeOrigins(program.terms, job.origin, new Int32Array(program.zeroOrigins.length))
|
|
25
|
+
: program.zeroOrigins
|
|
26
|
+
evalProgram(state, program, seed, origins, job.points, job.stride, count, out)
|
|
27
|
+
return out
|
|
28
|
+
}
|
|
29
|
+
const origin = new Float64Array(4)
|
|
30
|
+
let width
|
|
31
|
+
let local
|
|
32
|
+
if (job.kind === 'patch') {
|
|
33
|
+
patchOrigin(job.area, origin)
|
|
34
|
+
width = job.area.resolution
|
|
35
|
+
local = patchPoints(
|
|
36
|
+
job.area,
|
|
37
|
+
origin,
|
|
38
|
+
job.row0,
|
|
39
|
+
job.row1,
|
|
40
|
+
new Float32Array((job.row1 - job.row0) * width * 3),
|
|
41
|
+
)
|
|
42
|
+
} else {
|
|
43
|
+
gridOrigin(job.area, origin)
|
|
44
|
+
width = job.area.resolution[0]
|
|
45
|
+
local = gridPoints(
|
|
46
|
+
job.area,
|
|
47
|
+
origin,
|
|
48
|
+
job.row0,
|
|
49
|
+
job.row1,
|
|
50
|
+
new Float32Array((job.row1 - job.row0) * width * 3),
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
const origins = computeOrigins(program.terms, origin, new Int32Array(program.zeroOrigins.length))
|
|
54
|
+
const count = (job.row1 - job.row0) * width
|
|
55
|
+
const out = new Float32Array(count)
|
|
56
|
+
evalProgram(state, program, seed, origins, local, 3, count, out)
|
|
57
|
+
return out
|
|
58
|
+
}
|