@matboks/utilities 0.0.1 → 0.0.2

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 (33) hide show
  1. package/dist/constants 2.js +1 -0
  2. package/dist/constants 3.js +1 -0
  3. package/dist/constants.d 2.ts +1 -0
  4. package/dist/constants.d 3.ts +1 -0
  5. package/dist/index 2.js +11 -0
  6. package/dist/index 3.js +11 -0
  7. package/dist/index.d 2.ts +11 -0
  8. package/dist/index.d 3.ts +11 -0
  9. package/dist/shader-modules/modules/camera.js +42 -42
  10. package/dist/shader-modules/modules/color/blend.js +107 -107
  11. package/dist/shader-modules/modules/color/index.js +134 -134
  12. package/dist/shader-modules/modules/constants.js +13 -13
  13. package/dist/shader-modules/modules/geometry.js +109 -109
  14. package/dist/shader-modules/modules/math.js +18 -18
  15. package/dist/shader-modules/modules/noise.d.ts +1 -1
  16. package/dist/shader-modules/modules/noise.js +449 -409
  17. package/dist/shader-modules/modules/random.d.ts +1 -1
  18. package/dist/shader-modules/modules/random.js +172 -146
  19. package/dist/shader-modules/modules/ray-marching.js +53 -53
  20. package/dist/shader-modules/modules/sdf/index.js +182 -182
  21. package/dist/shader-modules/modules/sdf/operations.js +76 -76
  22. package/dist/shader-modules/modules/sdf.d.ts +1 -0
  23. package/dist/shader-modules/modules/sdf.js +126 -0
  24. package/dist/shader-modules/modules/utils.js +114 -114
  25. package/dist/shader-modules/shaders.js +107 -107
  26. package/dist/shader-renderer/pixel-vertex-shader.js +13 -13
  27. package/dist/tilings/tiler.d.ts +1 -0
  28. package/dist/tilings/tiler.js +4 -0
  29. package/dist/types 2.js +1 -0
  30. package/dist/types 3.js +1 -0
  31. package/dist/types.d 2.ts +1 -0
  32. package/dist/types.d 3.ts +1 -0
  33. package/package.json +2 -2
@@ -1,410 +1,450 @@
1
- export const noiseDefinition = /*glsl*/ `
2
- import { random, random2, random3, randomUnit } from "@/random";
3
- import { triangleWave, dot2 } from "@/utils";
4
- import { rotate, axisAngle } from "@/geometry";
5
- import { PI } from "@/constants";
6
-
7
- export {
8
- valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise,
9
- octaveNoise1D, octaveNoise2D, octaveNoise3D
10
- }
11
-
12
- float valueNoise(float p, float scale, float seed) {
13
- p *= scale;
14
-
15
- float pi = floor(p);
16
- float pf = fract(p);
17
-
18
- float sf = smoothstep(0.0, 1.0, pf);
19
-
20
- return mix(random(pi, seed), random(pi + 1.0, seed), sf);
21
- }
22
-
23
- float valueNoise(vec2 p, float scale, float seed) {
24
- p *= scale;
25
-
26
- vec2 pi = floor(p);
27
- vec2 pf = fract(p);
28
-
29
- vec2 sf = smoothstep(0.0, 1.0, pf);
30
- vec2 o = vec2(1, 0);
31
-
32
- return mix(
33
- mix(random(pi, seed), random(pi + o.xy, seed), sf.x),
34
- mix(random(pi + o.yx, seed), random(pi + o.xx, seed), sf.x),
35
- sf.y
36
- );
37
- }
38
-
39
- float valueNoise(vec3 p, float scale, float seed) {
40
- p *= scale;
41
-
42
- vec3 pi = floor(p);
43
- vec3 pf = fract(p);
44
-
45
- vec3 sf = smoothstep(0.0, 1.0, pf);
46
- vec2 o = vec2(1, 0);
47
-
48
- return mix(
49
- mix(
50
- mix(random(pi, seed), random(pi + o.xyy, seed), sf.x),
51
- mix(random(pi + o.yxy, seed), random(pi + o.xxy, seed), sf.x),
52
- sf.y
53
- ),
54
- mix(
55
- mix(random(pi + o.yyx, seed), random(pi + o.xyx, seed), sf.x),
56
- mix(random(pi + o.yxx, seed), random(pi + o.xxx, seed), sf.x),
57
- sf.y
58
- ),
59
- sf.z
60
- );
61
-
62
- }
63
-
64
- float perlinNoise(float p, float scale, float seed) {
65
- p *= scale;
66
-
67
- float pi = floor(p);
68
- float pf = fract(p);
69
-
70
- float sf = smoothstep(0.0, 1.0, pf);
71
-
72
- float signed = mix(random(pi, seed)*pf, random(pi + 1.0, seed)*(pf - 1.0), sf);
73
-
74
- // Signed is in range [-1/2, 1/2], map to [0, 1]
75
- return 0.5 + signed;
76
- }
77
-
78
- float perlinNoise(vec2 p, float scale, float seed) {
79
- p *= scale;
80
-
81
- vec2 pi = floor(p);
82
- vec2 pf = fract(p);
83
-
84
- vec2 sf = smoothstep(0.0, 1.0, pf);
85
- vec2 o = vec2(1, 0);
86
-
87
- float signed = mix(
88
- mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xy, seed), pf - o.xy), sf.x),
89
- mix(dot(randomUnit(pi + o.yx, seed), pf - o.yx), dot(randomUnit(pi + o.xx, seed), pf - o.xx), sf.x),
90
- sf.y
91
- );
92
-
93
- // Signed is in range [-sqrt(2)/2, sqrt(2)/2], map to [0, 1]
94
- return 0.5 + 0.70710678118654752*signed;
95
- }
96
-
97
- float perlinNoise(vec3 p, float scale, float seed) {
98
- p *= scale;
99
-
100
- vec3 pi = floor(p);
101
- vec3 pf = fract(p);
102
-
103
- vec3 sf = smoothstep(0.0, 1.0, pf);
104
- vec2 o = vec2(1, 0);
105
-
106
- float signed = mix(
107
- mix(
108
- mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyy, seed), pf - o.xyy), sf.x),
109
- mix(dot(randomUnit(pi + o.yxy, seed), pf - o.yxy), dot(randomUnit(pi + o.xxy, seed), pf - o.xxy), sf.x),
110
- sf.y
111
- ),
112
- mix(
113
- mix(dot(randomUnit(pi + o.yyx, seed), pf - o.yyx), dot(randomUnit(pi + o.xyx, seed), pf - o.xyx), sf.x),
114
- mix(dot(randomUnit(pi + o.yxx, seed), pf - o.yxx), dot(randomUnit(pi + o.xxx, seed), pf - o.xxx), sf.x),
115
- sf.y
116
- ),
117
- sf.z
118
- );
119
-
120
- // Signed is in range [-sqrt(3/4), sqrt(3/4)], map to [0, 1]
121
- return 0.5 + 0.57735026918962576*signed;
122
- }
123
-
124
- float worleyNoise(float p, float scale, float seed) {
125
- p *= scale;
126
-
127
- float pi = floor(p);
128
- float pf = fract(p);
129
-
130
- float minDist = 1e9;
131
-
132
- for (int index = -1; index <= 1; index++) {
133
- float fi = float(index);
134
- float centerToPosition = fi + random(pi + fi, seed) - pf;
135
-
136
- minDist = min(minDist, abs(centerToPosition));
137
- }
138
-
139
- return minDist;
140
- }
141
-
142
- float worleyNoise(vec2 p, float scale, float seed) {
143
- p *= scale;
144
-
145
- vec2 pi = floor(p);
146
- vec2 pf = fract(p);
147
-
148
- float minDist2 = 1e9;
149
-
150
- for (int row = -1; row <= 1; row++) {
151
- for (int col = -1; col <= 1; col++) {
152
- vec2 index = vec2(col, row);
153
-
154
- vec2 centerToPosition = index + random2(pi + index, seed) - pf;
155
- float dist2 = dot2(centerToPosition);
156
-
157
- minDist2 = min(minDist2, dist2);
158
- }
159
- }
160
-
161
- return sqrt(minDist2);
162
- }
163
-
164
- float worleyNoise(vec3 p, float scale, float seed) {
165
- p *= scale;
166
-
167
- vec3 pi = floor(p);
168
- vec3 pf = fract(p);
169
-
170
- float minDist2 = 1e9;
171
-
172
- for (int row = -1; row <= 1; row++) {
173
- for (int col = -1; col <= 1; col++) {
174
- for (int slice = -1; slice <= 1; slice++) {
175
- vec3 index = vec3(col, row, slice);
176
-
177
- vec3 centerToPosition = index + random3(pi + index, seed) - pf;
178
- float dist2 = dot2(centerToPosition);
179
-
180
- minDist2 = min(minDist2, dist2);
181
- }
182
- }
183
- }
184
-
185
- return sqrt(minDist2);
186
- }
187
-
188
- // Adapted version of https://iquilezles.org/articles/voronoise/
189
- float voroNoise(vec2 p, float scale, float disorder, float smoothness, float seed) {
190
- p *= scale;
191
-
192
- vec2 pi = floor(p);
193
- vec2 pf = fract(p);
194
-
195
- float s = 1.0;
196
- int kernel = 2;
197
-
198
- float power = 64.0 - 63.0*pow(smoothness, 0.1);
199
-
200
- float sum = 0.0;
201
- float weightSum = 0.0;
202
-
203
- for (int row = -kernel; row <= kernel; row++) {
204
- for (int col = -kernel; col <= kernel; col++) {
205
- vec2 index = vec2(col, row);
206
-
207
- // xy is cell center, z is value
208
- vec3 data = random3(pi + index, seed);
209
-
210
- vec2 centerToPosition = index + data.xy*disorder - pf;
211
-
212
- float dist2 = dot2(centerToPosition);
213
-
214
- float weight = pow(smoothstep(1.0, 0.0, sqrt(0.5*dist2)), power );
215
-
216
- sum += weight*data.z;
217
- weightSum += weight;
218
- }
219
- }
220
-
221
- return sum / weightSum;
222
- }
223
-
224
- float gaboroNoise(vec2 p, float level, float scale, float radius, float freq, float hatchAmount, float hatchAngle, float seed) {
225
- p *= scale;
226
-
227
- vec2 pi = floor(p);
228
- float exponent = 1. / (radius*radius);
229
-
230
- float valueSum = 0., weightSum = 0.;
231
- for (int i = -1; i <= 1; i++) {
232
- for (int j = -1; j <= 1; j++) {
233
- vec2 cellIndex = pi + vec2(i, j);
234
- vec2 cellCenter = cellIndex + random2(cellIndex, seed);
235
-
236
- float se = random(cellCenter, seed);
237
-
238
- vec2 diff = p - cellCenter;
239
- float rotation = PI*random(se);
240
-
241
- float weight = exp(-exponent*dot(diff, diff));
242
-
243
- vec2 texturePosition = diff*freq;
244
-
245
- float value = max(triangleWave(texturePosition, rotation), hatchAmount*triangleWave(texturePosition, rotation + hatchAngle));
246
-
247
- weightSum += weight;
248
- valueSum += weight*value;
249
- }
250
- }
251
-
252
- level = mix(level, sqrt(level), hatchAmount);
253
-
254
- return smoothstep(0.05, -0.05, valueSum / weightSum - level);
255
- //return valueSum / weightSum;
256
- }
257
-
258
- float idwNoise(float p, float power, float scale, float seed, int window) {
259
- p *= scale;
260
-
261
- float pi = floor(p);
262
-
263
- float sum = 0.0;
264
- float weightSum = 0.0;
265
- float powerCoeff = -power;
266
-
267
- for (int i = -window; i <= window; i++) {
268
- float cellCorner = pi + i;
269
- float value = random(cellCorner, seed);
270
-
271
- float cellPosition = cellCorner + random(cellCorner, seed);
272
-
273
- float w = pow(abs(p - cellPosition), powerCoeff);
274
-
275
- if (isinf(w)) return value;
276
-
277
- sum += w*value;
278
- weightSum += w;
279
- }
280
-
281
- return sum / weightSum;
282
- }
283
-
284
- float idwNoise(vec2 p, float power, float scale, float seed, int window) {
285
- p *= scale;
286
-
287
- vec2 pi = floor(p);
288
-
289
- float sum = 0.0;
290
- float weightSum = 0.0;
291
- float powerCoeff = -0.5*power;
292
-
293
- for (int i = -window; i <= window; i++) {
294
- for (int j = -window; j <= window; j++) {
295
- vec2 cellCorner = pi + vec2(i, j);
296
- float value = random(cellCorner, seed);
297
-
298
- vec2 cellPosition = cellCorner + random2(cellCorner, seed);
299
-
300
- float w = pow(dot2(p - cellPosition), powerCoeff);
301
-
302
- if (isinf(w)) return value;
303
-
304
- sum += w*value;
305
- weightSum += w;
306
- }
307
- }
308
-
309
- return sum / weightSum;
310
- }
311
-
312
- float idwNoise(vec3 p, float power, float scale, float seed, int window) {
313
- p *= scale;
314
-
315
- vec3 pi = floor(p);
316
-
317
- float sum = 0.0;
318
- float weightSum = 0.0;
319
- float powerCoeff = -0.5*power;
320
-
321
- for (int i = -window; i <= window; i++) {
322
- for (int j = -window; j <= window; j++) {
323
- for (int k = -window; k <= window; k++) {
324
- vec3 cellCorner = pi + vec3(i, j, k);
325
- float value = random(cellCorner, seed);
326
-
327
- vec3 cellPosition = cellCorner + random3(cellCorner, seed);
328
-
329
- float w = pow(dot2(p - cellPosition), powerCoeff);
330
-
331
- if (isinf(w)) return value;
332
-
333
- sum += w*value;
334
- weightSum += w;
335
- }
336
- }
337
- }
338
-
339
- return sum / weightSum;
340
- }
341
-
342
- float standardizeOctaveNoise(float value, int octaves) {
343
- float norm = clamp((float(octaves) - 1.0)/9.0, 0.0, 1.0);
344
- float l = 0.25*pow(norm, 0.125);
345
- return (value - l)/(1.0 - 2.0*l);
346
- }
347
-
348
- float octaveNoise1D(float p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(float, float)) {
349
- p *= scale;
350
-
351
- float sum = 0.0;
352
- float amplitude = 1.0;
353
- float amplitudeSum = 0.0;
354
-
355
- for (int i = 0; i < octaves; i++) {
356
- float value = noise(p, seed + float(i));
357
- sum += amplitude*value;
358
- amplitudeSum += amplitude;
359
-
360
- p = lacunarity*p + PI;
361
- amplitude *= falloff;
362
- }
363
-
364
- // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
365
- return sum / amplitudeSum;
366
- }
367
-
368
- float octaveNoise2D(vec2 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec2, float)) {
369
- p *= scale;
370
-
371
- float sum = 0.0;
372
- float amplitude = 1.0;
373
- float amplitudeSum = 0.0;
374
-
375
- for (int i = 0; i < octaves; i++) {
376
- float value = noise(p, seed + float(i));
377
- sum += amplitude*value;
378
- amplitudeSum += amplitude;
379
-
380
- p = rotate(lacunarity*p, 1.2);
381
- amplitude *= falloff;
382
- }
383
-
384
- // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
385
- return sum / amplitudeSum;
386
- }
387
-
388
- float octaveNoise3D(vec3 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec3, float)) {
389
- p *= scale;
390
-
391
- float sum = 0.0;
392
- float amplitude = 1.0;
393
- float amplitudeSum = 0.0;
394
-
395
- vec3 axis = vec3(0.5092382307155079, -0.23643203568934296, 0.8275121249127003);
396
-
397
- for (int i = 0; i < octaves; i++) {
398
- float value = noise(p, seed + float(i));
399
- sum += amplitude*value;
400
- amplitudeSum += amplitude;
401
-
402
- p = axisAngle(lacunarity*p, axis, 1.2);
403
- amplitude *= falloff;
404
- }
405
-
406
- // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
407
- return sum / amplitudeSum;
408
- }
409
-
1
+ export const noiseDefinition = /*glsl*/ `
2
+ import { random, random2, random3, randomUnit } from "@/random";
3
+ import { triangleWave, dot2 } from "@/utils";
4
+ import { rotate, axisAngle } from "@/geometry";
5
+ import { PI } from "@/constants";
6
+
7
+ export {
8
+ valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise,
9
+ octaveNoise1D, octaveNoise2D, octaveNoise3D
10
+ }
11
+
12
+ float valueNoise(float p, float scale, float seed) {
13
+ p *= scale;
14
+
15
+ float pi = floor(p);
16
+ float pf = fract(p);
17
+
18
+ float sf = smoothstep(0.0, 1.0, pf);
19
+
20
+ return mix(random(pi, seed), random(pi + 1.0, seed), sf);
21
+ }
22
+
23
+ float valueNoise(vec2 p, float scale, float seed) {
24
+ p *= scale;
25
+
26
+ vec2 pi = floor(p);
27
+ vec2 pf = fract(p);
28
+
29
+ vec2 sf = smoothstep(0.0, 1.0, pf);
30
+ vec2 o = vec2(1, 0);
31
+
32
+ return mix(
33
+ mix(random(pi, seed), random(pi + o.xy, seed), sf.x),
34
+ mix(random(pi + o.yx, seed), random(pi + o.xx, seed), sf.x),
35
+ sf.y
36
+ );
37
+ }
38
+
39
+ float valueNoise(vec3 p, float scale, float seed) {
40
+ p *= scale;
41
+
42
+ vec3 pi = floor(p);
43
+ vec3 pf = fract(p);
44
+
45
+ vec3 sf = smoothstep(0.0, 1.0, pf);
46
+ vec2 o = vec2(1, 0);
47
+
48
+ return mix(
49
+ mix(
50
+ mix(random(pi, seed), random(pi + o.xyy, seed), sf.x),
51
+ mix(random(pi + o.yxy, seed), random(pi + o.xxy, seed), sf.x),
52
+ sf.y
53
+ ),
54
+ mix(
55
+ mix(random(pi + o.yyx, seed), random(pi + o.xyx, seed), sf.x),
56
+ mix(random(pi + o.yxx, seed), random(pi + o.xxx, seed), sf.x),
57
+ sf.y
58
+ ),
59
+ sf.z
60
+ );
61
+
62
+ }
63
+
64
+ float valueNoise(vec4 p, float scale, float seed) {
65
+ p *= scale;
66
+
67
+ vec4 pi = floor(p);
68
+ vec4 pf = fract(p);
69
+
70
+ vec4 sf = smoothstep(0.0, 1.0, pf);
71
+ vec2 o = vec2(1, 0);
72
+
73
+ return mix(
74
+ mix(
75
+ mix(
76
+ mix(random(pi, seed), random(pi + o.xyyy, seed), sf.x),
77
+ mix(random(pi + o.yxyy, seed), random(pi + o.xxyy, seed), sf.x),
78
+ sf.y
79
+ ),
80
+ mix(
81
+ mix(random(pi + o.yyxy, seed), random(pi + o.xyxy, seed), sf.x),
82
+ mix(random(pi + o.yxxy, seed), random(pi + o.xxxy, seed), sf.x),
83
+ sf.y
84
+ ),
85
+ sf.z
86
+ ),
87
+ mix(
88
+ mix(
89
+ mix(random(pi + o.yyyx, seed), random(pi + o.xyyx, seed), sf.x),
90
+ mix(random(pi + o.yxyx, seed), random(pi + o.xxyx, seed), sf.x),
91
+ sf.y
92
+ ),
93
+ mix(
94
+ mix(random(pi + o.yyxx, seed), random(pi + o.xyxx, seed), sf.x),
95
+ mix(random(pi + o.yxxx, seed), random(pi + o.xxxx, seed), sf.x),
96
+ sf.y
97
+ ),
98
+ sf.z
99
+ ),
100
+ sf.w
101
+ );
102
+ }
103
+
104
+ float perlinNoise(float p, float scale, float seed) {
105
+ p *= scale;
106
+
107
+ float pi = floor(p);
108
+ float pf = fract(p);
109
+
110
+ float sf = smoothstep(0.0, 1.0, pf);
111
+
112
+ float signed = mix(random(pi, seed)*pf, random(pi + 1.0, seed)*(pf - 1.0), sf);
113
+
114
+ // Signed is in range [-1/2, 1/2], map to [0, 1]
115
+ return 0.5 + signed;
116
+ }
117
+
118
+ float perlinNoise(vec2 p, float scale, float seed) {
119
+ p *= scale;
120
+
121
+ vec2 pi = floor(p);
122
+ vec2 pf = fract(p);
123
+
124
+ vec2 sf = smoothstep(0.0, 1.0, pf);
125
+ vec2 o = vec2(1, 0);
126
+
127
+ float signed = mix(
128
+ mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xy, seed), pf - o.xy), sf.x),
129
+ mix(dot(randomUnit(pi + o.yx, seed), pf - o.yx), dot(randomUnit(pi + o.xx, seed), pf - o.xx), sf.x),
130
+ sf.y
131
+ );
132
+
133
+ // Signed is in range [-sqrt(2)/2, sqrt(2)/2], map to [0, 1]
134
+ return 0.5 + 0.70710678118654752*signed;
135
+ }
136
+
137
+ float perlinNoise(vec3 p, float scale, float seed) {
138
+ p *= scale;
139
+
140
+ vec3 pi = floor(p);
141
+ vec3 pf = fract(p);
142
+
143
+ vec3 sf = smoothstep(0.0, 1.0, pf);
144
+ vec2 o = vec2(1, 0);
145
+
146
+ float signed = mix(
147
+ mix(
148
+ mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyy, seed), pf - o.xyy), sf.x),
149
+ mix(dot(randomUnit(pi + o.yxy, seed), pf - o.yxy), dot(randomUnit(pi + o.xxy, seed), pf - o.xxy), sf.x),
150
+ sf.y
151
+ ),
152
+ mix(
153
+ mix(dot(randomUnit(pi + o.yyx, seed), pf - o.yyx), dot(randomUnit(pi + o.xyx, seed), pf - o.xyx), sf.x),
154
+ mix(dot(randomUnit(pi + o.yxx, seed), pf - o.yxx), dot(randomUnit(pi + o.xxx, seed), pf - o.xxx), sf.x),
155
+ sf.y
156
+ ),
157
+ sf.z
158
+ );
159
+
160
+ // Signed is in range [-sqrt(3/4), sqrt(3/4)], map to [0, 1]
161
+ return 0.5 + 0.57735026918962576*signed;
162
+ }
163
+
164
+ float worleyNoise(float p, float scale, float seed) {
165
+ p *= scale;
166
+
167
+ float pi = floor(p);
168
+ float pf = fract(p);
169
+
170
+ float minDist = 1e9;
171
+
172
+ for (int index = -1; index <= 1; index++) {
173
+ float fi = float(index);
174
+ float centerToPosition = fi + random(pi + fi, seed) - pf;
175
+
176
+ minDist = min(minDist, abs(centerToPosition));
177
+ }
178
+
179
+ return minDist;
180
+ }
181
+
182
+ float worleyNoise(vec2 p, float scale, float seed) {
183
+ p *= scale;
184
+
185
+ vec2 pi = floor(p);
186
+ vec2 pf = fract(p);
187
+
188
+ float minDist2 = 1e9;
189
+
190
+ for (int row = -1; row <= 1; row++) {
191
+ for (int col = -1; col <= 1; col++) {
192
+ vec2 index = vec2(col, row);
193
+
194
+ vec2 centerToPosition = index + random2(pi + index, seed) - pf;
195
+ float dist2 = dot2(centerToPosition);
196
+
197
+ minDist2 = min(minDist2, dist2);
198
+ }
199
+ }
200
+
201
+ return sqrt(minDist2);
202
+ }
203
+
204
+ float worleyNoise(vec3 p, float scale, float seed) {
205
+ p *= scale;
206
+
207
+ vec3 pi = floor(p);
208
+ vec3 pf = fract(p);
209
+
210
+ float minDist2 = 1e9;
211
+
212
+ for (int row = -1; row <= 1; row++) {
213
+ for (int col = -1; col <= 1; col++) {
214
+ for (int slice = -1; slice <= 1; slice++) {
215
+ vec3 index = vec3(col, row, slice);
216
+
217
+ vec3 centerToPosition = index + random3(pi + index, seed) - pf;
218
+ float dist2 = dot2(centerToPosition);
219
+
220
+ minDist2 = min(minDist2, dist2);
221
+ }
222
+ }
223
+ }
224
+
225
+ return sqrt(minDist2);
226
+ }
227
+
228
+ // Adapted version of https://iquilezles.org/articles/voronoise/
229
+ float voroNoise(vec2 p, float scale, float disorder, float smoothness, float seed) {
230
+ p *= scale;
231
+
232
+ vec2 pi = floor(p);
233
+ vec2 pf = fract(p);
234
+
235
+ float s = 1.0;
236
+ int kernel = 2;
237
+
238
+ float power = 64.0 - 63.0*pow(smoothness, 0.1);
239
+
240
+ float sum = 0.0;
241
+ float weightSum = 0.0;
242
+
243
+ for (int row = -kernel; row <= kernel; row++) {
244
+ for (int col = -kernel; col <= kernel; col++) {
245
+ vec2 index = vec2(col, row);
246
+
247
+ // xy is cell center, z is value
248
+ vec3 data = random3(pi + index, seed);
249
+
250
+ vec2 centerToPosition = index + data.xy*disorder - pf;
251
+
252
+ float dist2 = dot2(centerToPosition);
253
+
254
+ float weight = pow(smoothstep(1.0, 0.0, sqrt(0.5*dist2)), power );
255
+
256
+ sum += weight*data.z;
257
+ weightSum += weight;
258
+ }
259
+ }
260
+
261
+ return sum / weightSum;
262
+ }
263
+
264
+ float gaboroNoise(vec2 p, float level, float scale, float radius, float freq, float hatchAmount, float hatchAngle, float seed) {
265
+ p *= scale;
266
+
267
+ vec2 pi = floor(p);
268
+ float exponent = 1. / (radius*radius);
269
+
270
+ float valueSum = 0., weightSum = 0.;
271
+ for (int i = -1; i <= 1; i++) {
272
+ for (int j = -1; j <= 1; j++) {
273
+ vec2 cellIndex = pi + vec2(i, j);
274
+ vec2 cellCenter = cellIndex + random2(cellIndex, seed);
275
+
276
+ float se = random(cellCenter, seed);
277
+
278
+ vec2 diff = p - cellCenter;
279
+ float rotation = PI*random(se);
280
+
281
+ float weight = exp(-exponent*dot(diff, diff));
282
+
283
+ vec2 texturePosition = diff*freq;
284
+
285
+ float value = max(triangleWave(texturePosition, rotation), hatchAmount*triangleWave(texturePosition, rotation + hatchAngle));
286
+
287
+ weightSum += weight;
288
+ valueSum += weight*value;
289
+ }
290
+ }
291
+
292
+ level = mix(level, sqrt(level), hatchAmount);
293
+
294
+ return smoothstep(0.05, -0.05, valueSum / weightSum - level);
295
+ //return valueSum / weightSum;
296
+ }
297
+
298
+ float idwNoise(float p, float power, float scale, float seed, int window) {
299
+ p *= scale;
300
+
301
+ float pi = floor(p);
302
+
303
+ float sum = 0.0;
304
+ float weightSum = 0.0;
305
+ float powerCoeff = -power;
306
+
307
+ for (int i = -window; i <= window; i++) {
308
+ float cellCorner = pi + i;
309
+ float value = random(cellCorner, seed);
310
+
311
+ float cellPosition = cellCorner + random(cellCorner, seed);
312
+
313
+ float w = pow(abs(p - cellPosition), powerCoeff);
314
+
315
+ if (isinf(w)) return value;
316
+
317
+ sum += w*value;
318
+ weightSum += w;
319
+ }
320
+
321
+ return sum / weightSum;
322
+ }
323
+
324
+ float idwNoise(vec2 p, float power, float scale, float seed, int window) {
325
+ p *= scale;
326
+
327
+ vec2 pi = floor(p);
328
+
329
+ float sum = 0.0;
330
+ float weightSum = 0.0;
331
+ float powerCoeff = -0.5*power;
332
+
333
+ for (int i = -window; i <= window; i++) {
334
+ for (int j = -window; j <= window; j++) {
335
+ vec2 cellCorner = pi + vec2(i, j);
336
+ float value = random(cellCorner, seed);
337
+
338
+ vec2 cellPosition = cellCorner + random2(cellCorner, seed);
339
+
340
+ float w = pow(dot2(p - cellPosition), powerCoeff);
341
+
342
+ if (isinf(w)) return value;
343
+
344
+ sum += w*value;
345
+ weightSum += w;
346
+ }
347
+ }
348
+
349
+ return sum / weightSum;
350
+ }
351
+
352
+ float idwNoise(vec3 p, float power, float scale, float seed, int window) {
353
+ p *= scale;
354
+
355
+ vec3 pi = floor(p);
356
+
357
+ float sum = 0.0;
358
+ float weightSum = 0.0;
359
+ float powerCoeff = -0.5*power;
360
+
361
+ for (int i = -window; i <= window; i++) {
362
+ for (int j = -window; j <= window; j++) {
363
+ for (int k = -window; k <= window; k++) {
364
+ vec3 cellCorner = pi + vec3(i, j, k);
365
+ float value = random(cellCorner, seed);
366
+
367
+ vec3 cellPosition = cellCorner + random3(cellCorner, seed);
368
+
369
+ float w = pow(dot2(p - cellPosition), powerCoeff);
370
+
371
+ if (isinf(w)) return value;
372
+
373
+ sum += w*value;
374
+ weightSum += w;
375
+ }
376
+ }
377
+ }
378
+
379
+ return sum / weightSum;
380
+ }
381
+
382
+ float standardizeOctaveNoise(float value, int octaves) {
383
+ float norm = clamp((float(octaves) - 1.0)/9.0, 0.0, 1.0);
384
+ float l = 0.25*pow(norm, 0.125);
385
+ return (value - l)/(1.0 - 2.0*l);
386
+ }
387
+
388
+ float octaveNoise1D(float p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(float, float)) {
389
+ p *= scale;
390
+
391
+ float sum = 0.0;
392
+ float amplitude = 1.0;
393
+ float amplitudeSum = 0.0;
394
+
395
+ for (int i = 0; i < octaves; i++) {
396
+ float value = noise(p, seed + float(i));
397
+ sum += amplitude*value;
398
+ amplitudeSum += amplitude;
399
+
400
+ p = lacunarity*p + PI;
401
+ amplitude *= falloff;
402
+ }
403
+
404
+ // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
405
+ return sum / amplitudeSum;
406
+ }
407
+
408
+ float octaveNoise2D(vec2 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec2, float)) {
409
+ p *= scale;
410
+
411
+ float sum = 0.0;
412
+ float amplitude = 1.0;
413
+ float amplitudeSum = 0.0;
414
+
415
+ for (int i = 0; i < octaves; i++) {
416
+ float value = noise(p, seed + float(i));
417
+ sum += amplitude*value;
418
+ amplitudeSum += amplitude;
419
+
420
+ p = rotate(lacunarity*p, 1.2);
421
+ amplitude *= falloff;
422
+ }
423
+
424
+ // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
425
+ return sum / amplitudeSum;
426
+ }
427
+
428
+ float octaveNoise3D(vec3 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec3, float)) {
429
+ p *= scale;
430
+
431
+ float sum = 0.0;
432
+ float amplitude = 1.0;
433
+ float amplitudeSum = 0.0;
434
+
435
+ vec3 axis = vec3(0.5092382307155079, -0.23643203568934296, 0.8275121249127003);
436
+
437
+ for (int i = 0; i < octaves; i++) {
438
+ float value = noise(p, seed + float(i));
439
+ sum += amplitude*value;
440
+ amplitudeSum += amplitude;
441
+
442
+ p = axisAngle(lacunarity*p, axis, 1.2);
443
+ amplitude *= falloff;
444
+ }
445
+
446
+ // return standardizeOctaveNoise(sum / amplitudeSum, octaves);
447
+ return sum / amplitudeSum;
448
+ }
449
+
410
450
  `;