@thi.ng/shader-ast-stdlib 0.16.8 → 0.16.10

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 (84) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/api.js +0 -1
  4. package/color/aces-film.js +12 -10
  5. package/color/levels.js +80 -66
  6. package/color/linear-srgb.js +11 -21
  7. package/color/luminance.js +4 -6
  8. package/color/porter-duff.js +51 -55
  9. package/color/rgbe.js +13 -15
  10. package/fog/exp.js +5 -9
  11. package/fog/exp2.js +6 -12
  12. package/fog/linear.js +5 -11
  13. package/isec/point.js +19 -13
  14. package/light/lambert.js +8 -29
  15. package/light/trilight.js +17 -15
  16. package/math/additive.js +27 -32
  17. package/math/cartesian.js +21 -24
  18. package/math/clamp.js +7 -19
  19. package/math/cross2.js +7 -19
  20. package/math/dist-chebyshev.js +8 -3
  21. package/math/dist-manhattan.js +8 -3
  22. package/math/easing.js +325 -88
  23. package/math/fit.js +17 -65
  24. package/math/interval.js +23 -24
  25. package/math/magsq.js +8 -3
  26. package/math/maxcomp.js +8 -18
  27. package/math/mincomp.js +8 -18
  28. package/math/mix-cubic.js +32 -10
  29. package/math/mix-quadratic.js +27 -8
  30. package/math/orthogonal.js +15 -21
  31. package/math/osc.js +28 -39
  32. package/math/polar.js +12 -21
  33. package/math/sincos.js +6 -12
  34. package/math/smoother-step.js +26 -24
  35. package/matrix/convert.js +19 -8
  36. package/matrix/lookat.js +20 -18
  37. package/matrix/mvp.js +4 -10
  38. package/matrix/normal.js +4 -8
  39. package/matrix/rotation.js +131 -47
  40. package/noise/curl3.js +30 -18
  41. package/noise/hash.js +126 -197
  42. package/noise/permute.js +11 -5
  43. package/noise/simplex2.js +87 -41
  44. package/noise/simplex3.js +168 -75
  45. package/noise/voronoi2.js +67 -50
  46. package/noise/worley2.js +70 -58
  47. package/package.json +8 -6
  48. package/raymarch/ao.js +25 -24
  49. package/raymarch/direction.js +16 -9
  50. package/raymarch/normal.js +10 -16
  51. package/raymarch/point-at.js +4 -11
  52. package/raymarch/scene.js +35 -44
  53. package/screen/uv.js +23 -30
  54. package/sdf/annular.js +4 -7
  55. package/sdf/arc.js +20 -19
  56. package/sdf/bezier.js +93 -57
  57. package/sdf/box-rounded.js +14 -18
  58. package/sdf/box.js +16 -24
  59. package/sdf/cross.js +23 -44
  60. package/sdf/cylinder.js +9 -14
  61. package/sdf/hex.js +22 -19
  62. package/sdf/isec.js +4 -8
  63. package/sdf/line.js +14 -29
  64. package/sdf/mirror.js +17 -13
  65. package/sdf/plane.js +8 -18
  66. package/sdf/polygon.js +51 -29
  67. package/sdf/polyhedra.js +78 -43
  68. package/sdf/polyline.js +30 -7
  69. package/sdf/repeat-polar.js +13 -17
  70. package/sdf/repeat.js +7 -15
  71. package/sdf/round.js +4 -10
  72. package/sdf/smooth-isec.js +14 -17
  73. package/sdf/smooth-sub.js +14 -17
  74. package/sdf/smooth-union.js +14 -17
  75. package/sdf/sphere.js +8 -16
  76. package/sdf/sub.js +4 -8
  77. package/sdf/torus.js +5 -10
  78. package/sdf/tri.js +30 -20
  79. package/sdf/union.js +7 -18
  80. package/tex/blur.js +53 -70
  81. package/tex/index-coord.js +6 -16
  82. package/tex/index-uv.js +30 -20
  83. package/tex/read-index.js +10 -32
  84. package/viz/function.js +70 -68
package/noise/simplex2.js CHANGED
@@ -2,50 +2,96 @@ import { F, V2 } from "@thi.ng/shader-ast/api/types";
2
2
  import { assign } from "@thi.ng/shader-ast/ast/assign";
3
3
  import { ternary } from "@thi.ng/shader-ast/ast/controlflow";
4
4
  import { defn, ret } from "@thi.ng/shader-ast/ast/function";
5
- import { FLOAT05, FLOAT1, VEC3_0, float, vec2, vec3, vec4, } from "@thi.ng/shader-ast/ast/lit";
5
+ import {
6
+ FLOAT05,
7
+ FLOAT1,
8
+ VEC3_0,
9
+ float,
10
+ vec2,
11
+ vec3,
12
+ vec4
13
+ } from "@thi.ng/shader-ast/ast/lit";
6
14
  import { add, gt, mul, sub } from "@thi.ng/shader-ast/ast/ops";
7
15
  import { $, $x, $xy, $y } from "@thi.ng/shader-ast/ast/swizzle";
8
16
  import { sym } from "@thi.ng/shader-ast/ast/sym";
9
- import { abs, dot, floor, fract, max, mod, } from "@thi.ng/shader-ast/builtin/math";
17
+ import {
18
+ abs,
19
+ dot,
20
+ floor,
21
+ fract,
22
+ max,
23
+ mod
24
+ } from "@thi.ng/shader-ast/builtin/math";
10
25
  import { magSq2 } from "../math/magsq.js";
11
26
  import { permute3 } from "./permute.js";
12
- /**
13
- * Array and textureless GLSL 2D simplex noise function. Ported from original
14
- * GLSL implementation by Ian McEwan & Ashima Arts.
15
- *
16
- * https://github.com/ashima/webgl-noise
17
- */
18
- export const snoise2 = defn(F, "snoise2", [V2], (v) => {
19
- let C;
20
- let i;
21
- let i1;
22
- let x0;
23
- let x12;
24
- let p;
25
- let m;
26
- let x;
27
- let h;
28
- let ox;
29
- let a0;
30
- let g;
31
- return [
32
- (C = sym(vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439))),
33
- (i = sym(floor(add(v, dot(v, $(C, "yy")))))),
34
- (x0 = sym(add(sub(v, i), dot(i, $(C, "xx"))))),
35
- (i1 = sym(ternary(gt($x(x0), $y(x0)), vec2(1, 0), vec2(0, 1)))),
36
- (x12 = sym(sub(add($(x0, "xyxy"), $(C, "xxzz")), vec4(i1, 0, 0)))),
37
- assign(i, mod(i, float(289))),
38
- (p = sym(permute3(add(permute3(add(vec3(0, $y(i1), 1), $y(i))), add(vec3(0, $x(i1), 1), $x(i)))))),
39
- (m = sym(max(sub(FLOAT05, vec3(magSq2(x0), magSq2($xy(x12)), magSq2($(x12, "zw")))), VEC3_0))),
40
- assign(m, mul(m, m)),
41
- assign(m, mul(m, m)),
42
- (x = sym(sub(mul(2, fract(mul(p, $(C, "www")))), FLOAT1))),
43
- (h = sym(sub(abs(x), FLOAT05))),
44
- (ox = sym(floor(add(x, FLOAT05)))),
45
- (a0 = sym(sub(x, ox))),
46
- assign(m, mul(m, sub(1.79284291400159, mul(0.85373472095314, add(mul(a0, a0), mul(h, h)))))),
47
- (g = sym(vec3(add(mul($x(a0), $x(x0)), mul($x(h), $y(x0)))))),
48
- assign($(g, "yz"), add(mul($(a0, "yz"), $(x12, "xz")), mul($(h, "yz"), $(x12, "yw")))),
49
- ret(mul(130, dot(m, g))),
50
- ];
27
+ const snoise2 = defn(F, "snoise2", [V2], (v) => {
28
+ let C;
29
+ let i;
30
+ let i1;
31
+ let x0;
32
+ let x12;
33
+ let p;
34
+ let m;
35
+ let x;
36
+ let h;
37
+ let ox;
38
+ let a0;
39
+ let g;
40
+ return [
41
+ C = sym(
42
+ vec4(
43
+ 0.211324865405187,
44
+ 0.366025403784439,
45
+ -0.577350269189626,
46
+ 0.024390243902439
47
+ )
48
+ ),
49
+ i = sym(floor(add(v, dot(v, $(C, "yy"))))),
50
+ x0 = sym(add(sub(v, i), dot(i, $(C, "xx")))),
51
+ i1 = sym(ternary(gt($x(x0), $y(x0)), vec2(1, 0), vec2(0, 1))),
52
+ x12 = sym(sub(add($(x0, "xyxy"), $(C, "xxzz")), vec4(i1, 0, 0))),
53
+ assign(i, mod(i, float(289))),
54
+ p = sym(
55
+ permute3(
56
+ add(
57
+ permute3(add(vec3(0, $y(i1), 1), $y(i))),
58
+ add(vec3(0, $x(i1), 1), $x(i))
59
+ )
60
+ )
61
+ ),
62
+ m = sym(
63
+ max(
64
+ sub(
65
+ FLOAT05,
66
+ vec3(magSq2(x0), magSq2($xy(x12)), magSq2($(x12, "zw")))
67
+ ),
68
+ VEC3_0
69
+ )
70
+ ),
71
+ assign(m, mul(m, m)),
72
+ assign(m, mul(m, m)),
73
+ x = sym(sub(mul(2, fract(mul(p, $(C, "www")))), FLOAT1)),
74
+ h = sym(sub(abs(x), FLOAT05)),
75
+ ox = sym(floor(add(x, FLOAT05))),
76
+ a0 = sym(sub(x, ox)),
77
+ assign(
78
+ m,
79
+ mul(
80
+ m,
81
+ sub(
82
+ 1.79284291400159,
83
+ mul(0.85373472095314, add(mul(a0, a0), mul(h, h)))
84
+ )
85
+ )
86
+ ),
87
+ g = sym(vec3(add(mul($x(a0), $x(x0)), mul($x(h), $y(x0))))),
88
+ assign(
89
+ $(g, "yz"),
90
+ add(mul($(a0, "yz"), $(x12, "xz")), mul($(h, "yz"), $(x12, "yw")))
91
+ ),
92
+ ret(mul(130, dot(m, g)))
93
+ ];
51
94
  });
95
+ export {
96
+ snoise2
97
+ };
package/noise/simplex3.js CHANGED
@@ -1,85 +1,178 @@
1
1
  import { F, V2, V3 } from "@thi.ng/shader-ast/api/types";
2
2
  import { assign } from "@thi.ng/shader-ast/ast/assign";
3
3
  import { defn, ret } from "@thi.ng/shader-ast/ast/function";
4
- import { FLOAT0, FLOAT05, FLOAT1, FLOAT2, float, vec2, vec3, vec4, } from "@thi.ng/shader-ast/ast/lit";
4
+ import {
5
+ FLOAT0,
6
+ FLOAT05,
7
+ FLOAT1,
8
+ FLOAT2,
9
+ float,
10
+ vec2,
11
+ vec3,
12
+ vec4
13
+ } from "@thi.ng/shader-ast/ast/lit";
5
14
  import { add, mul, neg, sub } from "@thi.ng/shader-ast/ast/ops";
6
15
  import { $, $w, $x, $xy, $y, $z } from "@thi.ng/shader-ast/ast/swizzle";
7
16
  import { sym } from "@thi.ng/shader-ast/ast/sym";
8
- import { abs, dot, floor, max, min, mod, step, } from "@thi.ng/shader-ast/builtin/math";
17
+ import {
18
+ abs,
19
+ dot,
20
+ floor,
21
+ max,
22
+ min,
23
+ mod,
24
+ step
25
+ } from "@thi.ng/shader-ast/builtin/math";
9
26
  import { permute4 } from "./permute.js";
10
- export const snoise3 = defn(F, "snoise3", [V3], (v) => {
11
- let g;
12
- let j;
13
- let l;
14
- let m;
15
- let p;
16
- let norm;
17
- let _x;
18
- let x;
19
- let y;
20
- let h;
21
- let sh;
22
- let a0;
23
- let a1;
24
- let b0;
25
- let b1;
26
- let x0;
27
- let x1;
28
- let x2;
29
- let x3;
30
- let p0;
31
- let p1;
32
- let p2;
33
- let p3;
34
- let i;
35
- let i1;
36
- let i2;
37
- const NS = 1 / 7;
38
- const NSX = NS * 2;
39
- const NSY = NS * 0.5 - 1;
40
- return [
41
- (i = sym(floor(add(v, dot(v, vec3(1 / 3)))))),
42
- (x0 = sym(add(sub(v, i), dot(i, vec3(1 / 6))))),
43
- (g = sym(step($(x0, "yzx"), x0))),
44
- (l = sym($(sub(FLOAT1, g), "zxy"))),
45
- (i1 = sym(min(g, l))),
46
- (i2 = sym(max(g, l))),
47
- (x1 = sym(add(sub(x0, i1), 1 / 6))),
48
- (x2 = sym(add(sub(x0, i2), 1 / 3))),
49
- (x3 = sym(sub(x0, FLOAT05))),
50
- assign(i, mod(i, float(289))),
51
- (p = sym(permute4(add(permute4(add(permute4(add(vec4(FLOAT0, $z(i1), $z(i2), FLOAT1), $z(i))), add(vec4(FLOAT0, $y(i1), $y(i2), FLOAT1), $y(i)))), add(vec4(FLOAT0, $x(i1), $x(i2), FLOAT1), $x(i)))))),
52
- (j = sym(sub(p, mul(floor(mul(p, NS * NS)), 49)))),
53
- (_x = sym(floor(mul(j, NS)))),
54
- (x = sym(add(mul(_x, NSX), NSY))),
55
- (y = sym(add(mul(floor(sub(j, mul(_x, 7))), NSX), NSY))),
56
- (h = sym(sub(sub(FLOAT1, abs(x)), abs(y)))),
57
- (sh = sym(neg(step(h, vec4())))),
58
- (b0 = sym(vec4($xy(x), $xy(y)))),
59
- (b1 = sym(vec4($(x, "zw"), $(y, "zw")))),
60
- (a0 = sym(add($(b0, "xzyw"), mul($(add(mul(floor(b0), FLOAT2), FLOAT1), "xzyw"), $(sh, "xxyy"))))),
61
- (a1 = sym(add($(b1, "xzyw"), mul($(add(mul(floor(b1), FLOAT2), FLOAT1), "xzyw"), $(sh, "zzww"))))),
62
- (p0 = sym(vec3($xy(a0), $x(h)))),
63
- (p1 = sym(vec3($(a0, "zw"), $y(h)))),
64
- (p2 = sym(vec3($xy(a1), $z(h)))),
65
- (p3 = sym(vec3($(a1, "zw"), $w(h)))),
66
- (norm = sym(sub(1.79284291400159, mul(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)), 0.85373472095314)))),
67
- assign(p0, mul(p0, $x(norm))),
68
- assign(p1, mul(p1, $y(norm))),
69
- assign(p2, mul(p2, $z(norm))),
70
- assign(p3, mul(p3, $w(norm))),
71
- (m = sym(max(vec4(), sub(0.6, vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)))))),
72
- assign(m, mul(m, m)),
73
- ret(mul(42, dot(mul(m, m), vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))))),
74
- ];
27
+ const snoise3 = defn(F, "snoise3", [V3], (v) => {
28
+ let g;
29
+ let j;
30
+ let l;
31
+ let m;
32
+ let p;
33
+ let norm;
34
+ let _x;
35
+ let x;
36
+ let y;
37
+ let h;
38
+ let sh;
39
+ let a0;
40
+ let a1;
41
+ let b0;
42
+ let b1;
43
+ let x0;
44
+ let x1;
45
+ let x2;
46
+ let x3;
47
+ let p0;
48
+ let p1;
49
+ let p2;
50
+ let p3;
51
+ let i;
52
+ let i1;
53
+ let i2;
54
+ const NS = 1 / 7;
55
+ const NSX = NS * 2;
56
+ const NSY = NS * 0.5 - 1;
57
+ return [
58
+ i = sym(floor(add(v, dot(v, vec3(1 / 3))))),
59
+ x0 = sym(add(sub(v, i), dot(i, vec3(1 / 6)))),
60
+ g = sym(step($(x0, "yzx"), x0)),
61
+ l = sym($(sub(FLOAT1, g), "zxy")),
62
+ i1 = sym(min(g, l)),
63
+ i2 = sym(max(g, l)),
64
+ x1 = sym(add(sub(x0, i1), 1 / 6)),
65
+ x2 = sym(add(sub(x0, i2), 1 / 3)),
66
+ x3 = sym(sub(x0, FLOAT05)),
67
+ assign(i, mod(i, float(289))),
68
+ p = sym(
69
+ permute4(
70
+ add(
71
+ permute4(
72
+ add(
73
+ permute4(
74
+ add(vec4(FLOAT0, $z(i1), $z(i2), FLOAT1), $z(i))
75
+ ),
76
+ add(vec4(FLOAT0, $y(i1), $y(i2), FLOAT1), $y(i))
77
+ )
78
+ ),
79
+ add(vec4(FLOAT0, $x(i1), $x(i2), FLOAT1), $x(i))
80
+ )
81
+ )
82
+ ),
83
+ j = sym(sub(p, mul(floor(mul(p, NS * NS)), 49))),
84
+ _x = sym(floor(mul(j, NS))),
85
+ x = sym(add(mul(_x, NSX), NSY)),
86
+ y = sym(add(mul(floor(sub(j, mul(_x, 7))), NSX), NSY)),
87
+ h = sym(sub(sub(FLOAT1, abs(x)), abs(y))),
88
+ sh = sym(neg(step(h, vec4()))),
89
+ b0 = sym(vec4($xy(x), $xy(y))),
90
+ b1 = sym(vec4($(x, "zw"), $(y, "zw"))),
91
+ a0 = sym(
92
+ add(
93
+ $(b0, "xzyw"),
94
+ mul(
95
+ $(add(mul(floor(b0), FLOAT2), FLOAT1), "xzyw"),
96
+ $(sh, "xxyy")
97
+ )
98
+ )
99
+ ),
100
+ a1 = sym(
101
+ add(
102
+ $(b1, "xzyw"),
103
+ mul(
104
+ $(add(mul(floor(b1), FLOAT2), FLOAT1), "xzyw"),
105
+ $(sh, "zzww")
106
+ )
107
+ )
108
+ ),
109
+ p0 = sym(vec3($xy(a0), $x(h))),
110
+ p1 = sym(vec3($(a0, "zw"), $y(h))),
111
+ p2 = sym(vec3($xy(a1), $z(h))),
112
+ p3 = sym(vec3($(a1, "zw"), $w(h))),
113
+ norm = sym(
114
+ sub(
115
+ 1.79284291400159,
116
+ mul(
117
+ vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)),
118
+ 0.85373472095314
119
+ )
120
+ )
121
+ ),
122
+ assign(p0, mul(p0, $x(norm))),
123
+ assign(p1, mul(p1, $y(norm))),
124
+ assign(p2, mul(p2, $z(norm))),
125
+ assign(p3, mul(p3, $w(norm))),
126
+ m = sym(
127
+ max(
128
+ vec4(),
129
+ sub(
130
+ 0.6,
131
+ vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3))
132
+ )
133
+ )
134
+ ),
135
+ assign(m, mul(m, m)),
136
+ ret(
137
+ mul(
138
+ 42,
139
+ dot(
140
+ mul(m, m),
141
+ vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))
142
+ )
143
+ )
144
+ )
145
+ ];
75
146
  });
76
- export const snoiseVec32 = defn(V2, "snoiseVec32", [V3], (p) => {
77
- return [
78
- ret(vec2(snoise3(p), snoise3(vec3(sub($y(p), 19.1), add($z(p), 33.4), add($x(p), 47.2))))),
79
- ];
147
+ const snoiseVec32 = defn(V2, "snoiseVec32", [V3], (p) => {
148
+ return [
149
+ ret(
150
+ vec2(
151
+ snoise3(p),
152
+ snoise3(
153
+ vec3(sub($y(p), 19.1), add($z(p), 33.4), add($x(p), 47.2))
154
+ )
155
+ )
156
+ )
157
+ ];
80
158
  });
81
- export const snoiseVec3 = defn(V3, "snoiseVec3", [V3], (p) => {
82
- return [
83
- ret(vec3(snoise3(p), snoise3(vec3(sub($y(p), 19.1), add($z(p), 33.4), add($x(p), 47.2))), snoise3(vec3(add($z(p), 74.2), sub($x(p), 124.5), add($y(p), 99.4))))),
84
- ];
159
+ const snoiseVec3 = defn(V3, "snoiseVec3", [V3], (p) => {
160
+ return [
161
+ ret(
162
+ vec3(
163
+ snoise3(p),
164
+ snoise3(
165
+ vec3(sub($y(p), 19.1), add($z(p), 33.4), add($x(p), 47.2))
166
+ ),
167
+ snoise3(
168
+ vec3(add($z(p), 74.2), sub($x(p), 124.5), add($y(p), 99.4))
169
+ )
170
+ )
171
+ )
172
+ ];
85
173
  });
174
+ export {
175
+ snoise3,
176
+ snoiseVec3,
177
+ snoiseVec32
178
+ };
package/noise/voronoi2.js CHANGED
@@ -2,58 +2,75 @@ import { F, V2 } from "@thi.ng/shader-ast/api/types";
2
2
  import { assign } from "@thi.ng/shader-ast/ast/assign";
3
3
  import { forLoop } from "@thi.ng/shader-ast/ast/controlflow";
4
4
  import { defn, ret } from "@thi.ng/shader-ast/ast/function";
5
- import { FLOAT0, SQRT2, float, int, vec2, vec3, } from "@thi.ng/shader-ast/ast/lit";
5
+ import {
6
+ FLOAT0,
7
+ SQRT2,
8
+ float,
9
+ int,
10
+ vec2,
11
+ vec3
12
+ } from "@thi.ng/shader-ast/ast/lit";
6
13
  import { add, div, inc, lte, madd, mul, sub } from "@thi.ng/shader-ast/ast/ops";
7
14
  import { $xy, $z } from "@thi.ng/shader-ast/ast/swizzle";
8
15
  import { sym } from "@thi.ng/shader-ast/ast/sym";
9
- import { dot, floor, fract, pow, smoothstep, sqrt, } from "@thi.ng/shader-ast/builtin/math";
16
+ import {
17
+ dot,
18
+ floor,
19
+ fract,
20
+ pow,
21
+ smoothstep,
22
+ sqrt
23
+ } from "@thi.ng/shader-ast/builtin/math";
10
24
  import { hash32 } from "./hash.js";
11
- /**
12
- * IQ's parametric 2D voronoise. Depending on `u` and `v`, this function
13
- * produces 4 different noise types
14
- *
15
- * - cell noise (0,0)
16
- * - voronoi (1,0)
17
- * - perlin noise (0,1)
18
- * - voronoise (1,1)
19
- *
20
- * http://www.iquilezles.org/www/articles/voronoise/voronoise.htm
21
- *
22
- * Note: This implementation uses the improved {@link hash32} by Dave Hoskins
23
- * instead of iq's original {@link hash3}.
24
- *
25
- * @param p -
26
- * @param u -
27
- * @param v -
28
- */
29
- export const voronoise2 = defn(F, "voronoise2", [V2, F, F], (x, u, v) => {
30
- let p;
31
- let f;
32
- let coeff;
33
- let k;
34
- let va;
35
- let wt;
36
- let g;
37
- let o;
38
- let r;
39
- let w;
40
- return [
41
- (p = sym(floor(x))),
42
- (f = sym(fract(x))),
43
- (coeff = sym(vec3(u, u, 1))),
44
- (k = sym(add(1, mul(63, pow(sub(1, v), float(4)))))),
45
- (va = sym(FLOAT0)),
46
- (wt = sym(FLOAT0)),
47
- forLoop(sym(int(-2)), (i) => lte(i, int(2)), inc, (i) => [
48
- forLoop(sym(int(-2)), (j) => lte(j, int(2)), inc, (j) => [
49
- (g = sym(vec2(float(i), float(j)))),
50
- (o = sym(mul(hash32(add(p, g)), coeff))),
51
- (r = sym(add(sub(g, f), $xy(o)))),
52
- (w = sym(pow(sub(1, smoothstep(FLOAT0, SQRT2, sqrt(dot(r, r)))), k))),
53
- assign(va, madd(w, $z(o), va)),
54
- assign(wt, add(wt, w)),
55
- ]),
56
- ]),
57
- ret(div(va, wt)),
58
- ];
25
+ const voronoise2 = defn(F, "voronoise2", [V2, F, F], (x, u, v) => {
26
+ let p;
27
+ let f;
28
+ let coeff;
29
+ let k;
30
+ let va;
31
+ let wt;
32
+ let g;
33
+ let o;
34
+ let r;
35
+ let w;
36
+ return [
37
+ p = sym(floor(x)),
38
+ f = sym(fract(x)),
39
+ coeff = sym(vec3(u, u, 1)),
40
+ k = sym(add(1, mul(63, pow(sub(1, v), float(4))))),
41
+ va = sym(FLOAT0),
42
+ wt = sym(FLOAT0),
43
+ forLoop(
44
+ sym(int(-2)),
45
+ (i) => lte(i, int(2)),
46
+ inc,
47
+ (i) => [
48
+ forLoop(
49
+ sym(int(-2)),
50
+ (j) => lte(j, int(2)),
51
+ inc,
52
+ (j) => [
53
+ g = sym(vec2(float(i), float(j))),
54
+ o = sym(mul(hash32(add(p, g)), coeff)),
55
+ r = sym(add(sub(g, f), $xy(o))),
56
+ w = sym(
57
+ pow(
58
+ sub(
59
+ 1,
60
+ smoothstep(FLOAT0, SQRT2, sqrt(dot(r, r)))
61
+ ),
62
+ k
63
+ )
64
+ ),
65
+ assign(va, madd(w, $z(o), va)),
66
+ assign(wt, add(wt, w))
67
+ ]
68
+ )
69
+ ]
70
+ ),
71
+ ret(div(va, wt))
72
+ ];
59
73
  });
74
+ export {
75
+ voronoise2
76
+ };
package/noise/worley2.js CHANGED
@@ -7,64 +7,76 @@ import { float, vec3 } from "@thi.ng/shader-ast/ast/lit";
7
7
  import { add, lt, mul, sub } from "@thi.ng/shader-ast/ast/ops";
8
8
  import { $, $x, $xy, $y, $z } from "@thi.ng/shader-ast/ast/swizzle";
9
9
  import { sym } from "@thi.ng/shader-ast/ast/sym";
10
- import { abs, floor, fract, max, min, mod, sqrt, } from "@thi.ng/shader-ast/builtin/math";
10
+ import {
11
+ abs,
12
+ floor,
13
+ fract,
14
+ max,
15
+ min,
16
+ mod,
17
+ sqrt
18
+ } from "@thi.ng/shader-ast/builtin/math";
11
19
  import { permute3 } from "./permute.js";
12
- export const worleyDist = defn(V3, "worleyDist", [V3, V3], (a, b) => [
13
- ret(add(mul(a, a), mul(b, b))),
20
+ const worleyDist = defn(V3, "worleyDist", [V3, V3], (a, b) => [
21
+ ret(add(mul(a, a), mul(b, b)))
14
22
  ]);
15
- export const worleyDistManhattan = defn(V3, "worleyDistManhatten", [V3, V3], (a, b) => [ret(add(abs(a), abs(b)))]);
16
- /**
17
- * Higher order function. Computes 2D Worley noise using provided distance
18
- * function. The returned function takes 2 args: position and jitter amount, the
19
- * latter in [0..1] interval. Returns noise components as vec2, with the x
20
- * component containing the distance from closest simplex center and y the noise
21
- * value. The vector components can be used individually or combined (e.g.
22
- * `noise.y - noise.x`)...
23
- *
24
- * THe optional `name` arg can be used to customize the name of the generated
25
- * function.
26
- *
27
- * @remarks
28
- * Based on implementation by Stefan Gustavson:
29
- * http://webstaff.itn.liu.se/~stegu/GLSL-cellular/GLSL-cellular-notes.pdf
30
- *
31
- * @param distFn -
32
- * @param name -
33
- */
34
- export const worley2 = (distFn, name = gensym("worley2_")) => defn(V2, name, [V2, F], (P, jitter) => {
35
- const K = float(1 / 7);
36
- const Ko = float(3 / 7);
37
- const oI = sym(vec3(-1, 0, 1));
38
- const oF = sym(vec3(-0.5, 0.5, 1.5));
39
- let pI;
40
- let pF;
41
- let px;
42
- let p;
43
- let d1;
44
- let d2;
45
- let d3;
46
- let d1a;
47
- const $dist = (x) => distFn(add(add($x(pF), x), mul(sub(fract(mul(p, K)), Ko), jitter)), add(sub($y(pF), oF), mul(sub(mul(mod(floor(mul(p, K)), float(7)), K), Ko), jitter)));
48
- return [
49
- oI,
50
- oF,
51
- (pI = sym(mod(floor(P), float(289)))),
52
- (pF = sym(fract(P))),
53
- (px = sym(permute3(add(oI, $x(pI))))),
54
- (p = sym(permute3(add(add(oI, $y(pI)), $x(px))))),
55
- (d1 = sym($dist(0.5))),
56
- assign(p, permute3(add(oI, add($y(pI), $y(px))))),
57
- (d2 = sym($dist(-0.5))),
58
- assign(p, permute3(add(oI, add($y(pI), $z(px))))),
59
- (d3 = sym($dist(-1.5))),
60
- (d1a = sym(min(d1, d2))),
61
- assign(d2, min(max(d1, d2), d3)),
62
- assign(d1, min(d1a, d2)),
63
- assign(d2, max(d1a, d2)),
64
- assign($xy(d1), ternary(lt($x(d1), $y(d1)), $xy(d1), $(d1, "yx"))),
65
- assign($(d1, "xz"), ternary(lt($x(d1), $z(d1)), $(d1, "xz"), $(d1, "zx"))),
66
- assign($(d1, "yz"), min($(d1, "yz"), $(d2, "yz"))),
67
- assign($y(d1), min(min($y(d1), $z(d1)), $x(d2))),
68
- ret(sqrt($xy(d1))),
69
- ];
23
+ const worleyDistManhattan = defn(
24
+ V3,
25
+ "worleyDistManhatten",
26
+ [V3, V3],
27
+ (a, b) => [ret(add(abs(a), abs(b)))]
28
+ );
29
+ const worley2 = (distFn, name = gensym("worley2_")) => defn(V2, name, [V2, F], (P, jitter) => {
30
+ const K = float(1 / 7);
31
+ const Ko = float(3 / 7);
32
+ const oI = sym(vec3(-1, 0, 1));
33
+ const oF = sym(vec3(-0.5, 0.5, 1.5));
34
+ let pI;
35
+ let pF;
36
+ let px;
37
+ let p;
38
+ let d1;
39
+ let d2;
40
+ let d3;
41
+ let d1a;
42
+ const $dist = (x) => distFn(
43
+ add(add($x(pF), x), mul(sub(fract(mul(p, K)), Ko), jitter)),
44
+ add(
45
+ sub($y(pF), oF),
46
+ mul(
47
+ sub(mul(mod(floor(mul(p, K)), float(7)), K), Ko),
48
+ jitter
49
+ )
50
+ )
51
+ );
52
+ return [
53
+ oI,
54
+ oF,
55
+ pI = sym(mod(floor(P), float(289))),
56
+ pF = sym(fract(P)),
57
+ px = sym(permute3(add(oI, $x(pI)))),
58
+ p = sym(permute3(add(add(oI, $y(pI)), $x(px)))),
59
+ d1 = sym($dist(0.5)),
60
+ assign(p, permute3(add(oI, add($y(pI), $y(px))))),
61
+ d2 = sym($dist(-0.5)),
62
+ assign(p, permute3(add(oI, add($y(pI), $z(px))))),
63
+ d3 = sym($dist(-1.5)),
64
+ d1a = sym(min(d1, d2)),
65
+ assign(d2, min(max(d1, d2), d3)),
66
+ assign(d1, min(d1a, d2)),
67
+ assign(d2, max(d1a, d2)),
68
+ assign($xy(d1), ternary(lt($x(d1), $y(d1)), $xy(d1), $(d1, "yx"))),
69
+ assign(
70
+ $(d1, "xz"),
71
+ ternary(lt($x(d1), $z(d1)), $(d1, "xz"), $(d1, "zx"))
72
+ ),
73
+ assign($(d1, "yz"), min($(d1, "yz"), $(d2, "yz"))),
74
+ assign($y(d1), min(min($y(d1), $z(d1)), $x(d2))),
75
+ ret(sqrt($xy(d1)))
76
+ ];
70
77
  });
78
+ export {
79
+ worley2,
80
+ worleyDist,
81
+ worleyDistManhattan
82
+ };