glre 0.39.0 → 0.40.0

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 (281) hide show
  1. package/README.md +8 -4
  2. package/dist/addons.cjs +1 -1
  3. package/dist/addons.cjs.map +1 -1
  4. package/dist/addons.d.ts +849 -19
  5. package/dist/addons.js +1 -1
  6. package/dist/addons.js.map +1 -1
  7. package/dist/index.cjs +8 -8
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +38 -20
  10. package/dist/index.js +8 -8
  11. package/dist/index.js.map +1 -1
  12. package/dist/native.d.ts +48 -22
  13. package/dist/node.cjs +59 -30
  14. package/dist/node.cjs.map +1 -1
  15. package/dist/node.d.ts +34 -22
  16. package/dist/node.js +59 -30
  17. package/dist/node.js.map +1 -1
  18. package/dist/react.d.ts +38 -20
  19. package/dist/solid.d.ts +38 -20
  20. package/package.json +24 -24
  21. package/src/addons/animation/easing/backIn.ts +10 -0
  22. package/src/addons/animation/easing/backInOut.ts +12 -0
  23. package/src/addons/animation/easing/backOut.ts +10 -0
  24. package/src/addons/animation/easing/bounceIn.ts +10 -0
  25. package/src/addons/animation/easing/bounceInOut.ts +13 -0
  26. package/src/addons/animation/easing/bounceOut.ts +30 -0
  27. package/src/addons/animation/easing/circularIn.ts +9 -0
  28. package/src/addons/animation/easing/circularInOut.ts +11 -0
  29. package/src/addons/animation/easing/circularOut.ts +9 -0
  30. package/src/addons/animation/easing/cubicIn.ts +9 -0
  31. package/src/addons/animation/easing/cubicInOut.ts +11 -0
  32. package/src/addons/animation/easing/cubicOut.ts +10 -0
  33. package/src/addons/animation/easing/elasticIn.ts +10 -0
  34. package/src/addons/animation/easing/elasticInOut.ts +21 -0
  35. package/src/addons/animation/easing/elasticOut.ts +12 -0
  36. package/src/addons/animation/easing/exponentialIn.ts +9 -0
  37. package/src/addons/animation/easing/exponentialInOut.ts +13 -0
  38. package/src/addons/animation/easing/exponentialOut.ts +9 -0
  39. package/src/addons/animation/easing/index.ts +33 -0
  40. package/src/addons/animation/easing/linearIn.ts +9 -0
  41. package/src/addons/animation/easing/linearInOut.ts +9 -0
  42. package/src/addons/animation/easing/linearOut.ts +9 -0
  43. package/src/addons/animation/easing/quadraticIn.ts +9 -0
  44. package/src/addons/animation/easing/quadraticInOut.ts +10 -0
  45. package/src/addons/animation/easing/quadraticOut.ts +9 -0
  46. package/src/addons/animation/easing/quarticIn.ts +9 -0
  47. package/src/addons/animation/easing/quarticInOut.ts +11 -0
  48. package/src/addons/animation/easing/quarticOut.ts +10 -0
  49. package/src/addons/animation/easing/quinticIn.ts +9 -0
  50. package/src/addons/animation/easing/quinticInOut.ts +11 -0
  51. package/src/addons/animation/easing/quinticOut.ts +9 -0
  52. package/src/addons/animation/easing/sineIn.ts +10 -0
  53. package/src/addons/animation/easing/sineInOut.ts +10 -0
  54. package/src/addons/animation/easing/sineOut.ts +10 -0
  55. package/src/addons/color/palette/macbeth.ts +42 -0
  56. package/src/addons/color/space/cmyk2rgb.ts +12 -0
  57. package/src/addons/color/space/gamma2linear.ts +19 -0
  58. package/src/addons/color/space/hsl2rgb.ts +20 -0
  59. package/src/addons/color/space/hsv2rgb.ts +18 -0
  60. package/src/addons/color/space/hue2rgb.ts +12 -0
  61. package/src/addons/color/space/index.ts +29 -0
  62. package/src/addons/color/space/lab2lch.ts +22 -0
  63. package/src/addons/color/space/lab2rgb.ts +19 -0
  64. package/src/addons/color/space/lab2xyz.ts +32 -0
  65. package/src/addons/color/space/lch2lab.ts +21 -0
  66. package/src/addons/color/space/lch2rgb.ts +22 -0
  67. package/src/addons/color/space/linear2gamma.ts +19 -0
  68. package/src/addons/color/space/oklab2rgb.ts +35 -0
  69. package/src/addons/color/space/rgb2cmyk.ts +13 -0
  70. package/src/addons/color/space/rgb2hcv.ts +29 -0
  71. package/src/addons/color/space/rgb2hsl.ts +23 -0
  72. package/src/addons/color/space/rgb2hsv.ts +36 -0
  73. package/src/addons/color/space/rgb2hue.ts +29 -0
  74. package/src/addons/color/space/rgb2lab.ts +19 -0
  75. package/src/addons/color/space/rgb2lch.ts +22 -0
  76. package/src/addons/color/space/rgb2oklab.ts +45 -0
  77. package/src/addons/color/space/rgb2srgb.ts +34 -0
  78. package/src/addons/color/space/rgb2xyz.ts +20 -0
  79. package/src/addons/color/space/rgb2yiq.ts +22 -0
  80. package/src/addons/color/space/rgb2yuv.ts +32 -0
  81. package/src/addons/color/space/srgb2rgb.ts +34 -0
  82. package/src/addons/color/space/xyz2lab.ts +27 -0
  83. package/src/addons/color/space/xyz2rgb.ts +30 -0
  84. package/src/addons/color/space/yiq2rgb.ts +22 -0
  85. package/src/addons/color/space/yuv2rgb.ts +32 -0
  86. package/src/addons/draw/arrows.ts +75 -0
  87. package/src/addons/draw/axis.ts +57 -0
  88. package/src/addons/draw/bridge.ts +81 -0
  89. package/src/addons/draw/char.ts +30 -0
  90. package/src/addons/draw/circle.ts +29 -0
  91. package/src/addons/draw/fill.ts +25 -0
  92. package/src/addons/draw/flip.ts +45 -0
  93. package/src/addons/draw/hex.ts +29 -0
  94. package/src/addons/draw/index.ts +13 -0
  95. package/src/addons/draw/line.ts +16 -0
  96. package/src/addons/draw/point.ts +30 -0
  97. package/src/addons/draw/rect.ts +52 -0
  98. package/src/addons/draw/stroke.ts +31 -0
  99. package/src/addons/draw/tri.ts +29 -0
  100. package/src/addons/generative/cnoise.ts +239 -0
  101. package/src/addons/generative/curl.ts +64 -0
  102. package/src/addons/generative/fbm.ts +69 -0
  103. package/src/addons/generative/gerstnerWave.ts +21 -0
  104. package/src/addons/generative/gnoise.ts +113 -0
  105. package/src/addons/generative/index.ts +15 -0
  106. package/src/addons/generative/noised.ts +139 -0
  107. package/src/addons/generative/pnoise.ts +249 -0
  108. package/src/addons/generative/psrdnoise.ts +277 -0
  109. package/src/addons/generative/random.ts +136 -0
  110. package/src/addons/generative/snoise.ts +199 -0
  111. package/src/addons/generative/srandom.ts +90 -0
  112. package/src/addons/generative/voronoi.ts +134 -0
  113. package/src/addons/generative/voronoise.ts +69 -0
  114. package/src/addons/generative/wavelet.ts +77 -0
  115. package/src/addons/generative/worley.ts +99 -0
  116. package/src/addons/geometry/aabb/aabb.ts +8 -0
  117. package/src/addons/geometry/aabb/centroid.ts +10 -0
  118. package/src/addons/geometry/aabb/contain.ts +19 -0
  119. package/src/addons/geometry/aabb/diagonal.ts +10 -0
  120. package/src/addons/geometry/aabb/expand.ts +16 -0
  121. package/src/addons/geometry/aabb/index.ts +7 -0
  122. package/src/addons/geometry/aabb/intersect.ts +20 -0
  123. package/src/addons/geometry/aabb/square.ts +17 -0
  124. package/src/addons/geometry/index.ts +2 -0
  125. package/src/addons/geometry/triangle/area.ts +10 -0
  126. package/src/addons/geometry/triangle/barycentric.ts +50 -0
  127. package/src/addons/geometry/triangle/centroid.ts +10 -0
  128. package/src/addons/geometry/triangle/closestPoint.ts +85 -0
  129. package/src/addons/geometry/triangle/contain.ts +19 -0
  130. package/src/addons/geometry/triangle/distanceSq.ts +38 -0
  131. package/src/addons/geometry/triangle/index.ts +10 -0
  132. package/src/addons/geometry/triangle/intersect.ts +49 -0
  133. package/src/addons/geometry/triangle/normal.ts +12 -0
  134. package/src/addons/geometry/triangle/signedDistance.ts +31 -0
  135. package/src/addons/geometry/triangle/triangle.ts +9 -0
  136. package/src/addons/index.ts +8 -6
  137. package/src/addons/lighting/ray.ts +8 -0
  138. package/src/addons/math/aafloor.ts +13 -0
  139. package/src/addons/math/aafract.ts +38 -0
  140. package/src/addons/math/aamirror.ts +12 -0
  141. package/src/addons/math/aastep.ts +14 -0
  142. package/src/addons/math/absi.ts +9 -0
  143. package/src/addons/math/adaptiveThreshold.ts +24 -0
  144. package/src/addons/math/bump.ts +20 -0
  145. package/src/addons/math/const.ts +19 -0
  146. package/src/addons/math/cubic.ts +101 -0
  147. package/src/addons/math/cubicMix.ts +49 -0
  148. package/src/addons/math/decimate.ts +12 -0
  149. package/src/addons/math/dist.ts +143 -0
  150. package/src/addons/math/fcos.ts +11 -0
  151. package/src/addons/math/frac.ts +9 -0
  152. package/src/addons/math/gain.ts +14 -0
  153. package/src/addons/math/gaussian.ts +14 -0
  154. package/src/addons/math/grad4.ts +19 -0
  155. package/src/addons/math/hammersley.ts +54 -0
  156. package/src/addons/math/highPass.ts +12 -0
  157. package/src/addons/math/index.ts +63 -0
  158. package/src/addons/math/inside.ts +68 -0
  159. package/src/addons/math/invCubic.ts +9 -0
  160. package/src/addons/math/invQuartic.ts +9 -0
  161. package/src/addons/math/inverse.ts +9 -0
  162. package/src/addons/math/lengthSq.ts +10 -0
  163. package/src/addons/math/map.ts +27 -0
  164. package/src/addons/math/mirror.ts +12 -0
  165. package/src/addons/math/mmax.ts +27 -0
  166. package/src/addons/math/mmin.ts +28 -0
  167. package/src/addons/math/mmix.ts +47 -0
  168. package/src/addons/math/mod2.ts +44 -0
  169. package/src/addons/math/mod289.ts +46 -0
  170. package/src/addons/math/modi.ts +15 -0
  171. package/src/addons/math/nyquist.ts +15 -0
  172. package/src/addons/math/pack.ts +15 -0
  173. package/src/addons/math/parabola.ts +12 -0
  174. package/src/addons/math/permute.ts +42 -0
  175. package/src/addons/math/pow2.ts +10 -0
  176. package/src/addons/math/pow3.ts +9 -0
  177. package/src/addons/math/pow5.ts +10 -0
  178. package/src/addons/math/pow7.ts +12 -0
  179. package/src/addons/math/powFast.ts +18 -0
  180. package/src/addons/math/quartic.ts +15 -0
  181. package/src/addons/math/quat/index.ts +14 -0
  182. package/src/addons/math/quat/quat2mat3.ts +28 -0
  183. package/src/addons/math/quat/quat2mat4.ts +16 -0
  184. package/src/addons/math/quat/quatAdd.ts +18 -0
  185. package/src/addons/math/quat/quatConj.ts +14 -0
  186. package/src/addons/math/quat/quatDiv.ts +18 -0
  187. package/src/addons/math/quat/quatIdentity.ts +9 -0
  188. package/src/addons/math/quat/quatInverse.ts +17 -0
  189. package/src/addons/math/quat/quatLength.ts +15 -0
  190. package/src/addons/math/quat/quatLengthSq.ts +14 -0
  191. package/src/addons/math/quat/quatLerp.ts +40 -0
  192. package/src/addons/math/quat/quatMul.ts +38 -0
  193. package/src/addons/math/quat/quatNeg.ts +14 -0
  194. package/src/addons/math/quat/quatNorm.ts +16 -0
  195. package/src/addons/math/quat/quatSub.ts +18 -0
  196. package/src/addons/math/quintic.ts +16 -0
  197. package/src/addons/math/rotate2d.ts +16 -0
  198. package/src/addons/math/rotate3d.ts +37 -0
  199. package/src/addons/math/rotate3dX.ts +20 -0
  200. package/src/addons/math/rotate3dY.ts +20 -0
  201. package/src/addons/math/rotate3dZ.ts +20 -0
  202. package/src/addons/math/rotate4d.ts +41 -0
  203. package/src/addons/math/rotate4dX.ts +21 -0
  204. package/src/addons/math/rotate4dY.ts +16 -0
  205. package/src/addons/math/rotate4dZ.ts +21 -0
  206. package/src/addons/math/saturateMediump.ts +11 -0
  207. package/src/addons/math/scale2d.ts +44 -0
  208. package/src/addons/math/scale3d.ts +17 -0
  209. package/src/addons/math/scale4d.ts +50 -0
  210. package/src/addons/math/smootherstep.ts +16 -0
  211. package/src/addons/math/taylorInvSqrt.ts +9 -0
  212. package/src/addons/math/toMat3.ts +14 -0
  213. package/src/addons/math/toMat4.ts +14 -0
  214. package/src/addons/math/translate4d.ts +31 -0
  215. package/src/addons/math/unpack.ts +88 -0
  216. package/src/addons/sdf/boxSDF.ts +24 -0
  217. package/src/addons/sdf/circleSDF.ts +20 -0
  218. package/src/addons/sdf/crossSDF.ts +17 -0
  219. package/src/addons/sdf/hexSDF.ts +18 -0
  220. package/src/addons/sdf/index.ts +7 -0
  221. package/src/addons/sdf/lineSDF.ts +33 -0
  222. package/src/addons/sdf/rectSDF.ts +46 -0
  223. package/src/addons/sdf/sphereSDF.ts +20 -0
  224. package/src/addons/sdf/triSDF.ts +14 -0
  225. package/src/addons/space/aspect.ts +14 -0
  226. package/src/addons/space/bracketing.ts +44 -0
  227. package/src/addons/space/brickTile.ts +44 -0
  228. package/src/addons/space/cart2polar.ts +20 -0
  229. package/src/addons/space/center.ts +32 -0
  230. package/src/addons/space/checkerTile.ts +41 -0
  231. package/src/addons/space/depth2viewZ.ts +43 -0
  232. package/src/addons/space/displace.ts +55 -0
  233. package/src/addons/space/equirect2xyz.ts +17 -0
  234. package/src/addons/space/eulerView.ts +19 -0
  235. package/src/addons/space/fisheye2xyz.ts +18 -0
  236. package/src/addons/space/flipY.ts +25 -0
  237. package/src/addons/space/hexTile.ts +18 -0
  238. package/src/addons/space/index.ts +38 -0
  239. package/src/addons/space/kaleidoscope.ts +48 -0
  240. package/src/addons/space/linearizeDepth.ts +17 -0
  241. package/src/addons/space/lookAt.ts +49 -0
  242. package/src/addons/space/lookAtView.ts +40 -0
  243. package/src/addons/space/mirrorTile.ts +73 -0
  244. package/src/addons/space/nearest.ts +13 -0
  245. package/src/addons/space/orthographic.ts +25 -0
  246. package/src/addons/space/parallaxMapping.ts +149 -0
  247. package/src/addons/space/perspective.ts +24 -0
  248. package/src/addons/space/polar2cart.ts +24 -0
  249. package/src/addons/space/ratio.ts +14 -0
  250. package/src/addons/space/rotate.ts +37 -0
  251. package/src/addons/space/rotateX.ts +54 -0
  252. package/src/addons/space/rotateY.ts +54 -0
  253. package/src/addons/space/rotateZ.ts +54 -0
  254. package/src/addons/space/scale.ts +13 -0
  255. package/src/addons/space/sprite.ts +16 -0
  256. package/src/addons/space/sqTile.ts +20 -0
  257. package/src/addons/space/tbn.ts +26 -0
  258. package/src/addons/space/translate.ts +12 -0
  259. package/src/addons/space/triTile.ts +32 -0
  260. package/src/addons/space/uncenter.ts +32 -0
  261. package/src/addons/space/unratio.ts +12 -0
  262. package/src/addons/space/viewZ2depth.ts +25 -0
  263. package/src/addons/space/windmillTile.ts +58 -0
  264. package/src/addons/space/xyz2equirect.ts +10 -0
  265. package/src/index.ts +5 -2
  266. package/src/node/build.ts +62 -52
  267. package/src/node/create.ts +3 -0
  268. package/src/node/index.ts +1 -2
  269. package/src/node/scope.ts +26 -25
  270. package/src/node/types.ts +15 -11
  271. package/src/node/utils/const.ts +12 -11
  272. package/src/node/utils/index.ts +14 -12
  273. package/src/node/utils/infer.ts +15 -5
  274. package/src/node/utils/parse.ts +37 -13
  275. package/src/node/utils/utils.ts +46 -23
  276. package/src/types.ts +9 -2
  277. package/src/utils/helpers.ts +56 -0
  278. package/src/utils/pipeline.ts +21 -5
  279. package/src/utils/program.ts +57 -38
  280. package/src/utils/webgl.ts +41 -35
  281. package/src/utils/webgpu.ts +19 -35
@@ -0,0 +1,277 @@
1
+ import { Fn, Float, Vec2, Vec3, vec2, vec3, vec4, mat3, step, mix, If, float, any } from '../../node'
2
+ import { mod289Vec3 } from '../math/mod289'
3
+ import { permuteVec4 } from '../math/permute'
4
+
5
+ // Basic psrdnoise 2D implementation
6
+ export const psrdnoise2D = Fn(([x, period, alpha]: [Vec2, Vec2, Float]): Vec2 => {
7
+ const uv = vec2(x.x.add(x.y.div(2)), x.y).toVar('uv')
8
+ const i0 = uv.floor().toVar('i0')
9
+ const f0 = uv.fract().toVar('f0')
10
+ const cmp = f0.x.step(f0.y).toVar('cmp')
11
+ const o1 = vec2(cmp, cmp.oneMinus()).toVar('o1')
12
+ const i1 = i0.add(o1).toVar('i1')
13
+ const i2 = i0.add(vec2(1, 1)).toVar('i2')
14
+
15
+ const v0 = vec2(i0.x.sub(i0.y.div(2)), i0.y).toVar('v0')
16
+ const v1 = vec2(v0.x.add(o1.x).sub(o1.y.div(2)), v0.y.add(o1.y)).toVar('v1')
17
+ const v2 = vec2(v0.x.add(0.5), v0.y.add(1)).toVar('v2')
18
+
19
+ const x0 = x.sub(v0).toVar('x0')
20
+ const x1 = x.sub(v1).toVar('x1')
21
+ const x2 = x.sub(v2).toVar('x2')
22
+
23
+ let iu = vec3(i0.x, i1.x, i2.x).toVar('iu')
24
+ let iv = vec3(i0.y, i1.y, i2.y).toVar('iv')
25
+
26
+ If(period.x.greaterThan(0).or(period.y.greaterThan(0)), () => {
27
+ const xw = vec3(v0.x, v1.x, v2.x).toVar('xw')
28
+ const yw = vec3(v0.y, v1.y, v2.y).toVar('yw')
29
+
30
+ If(period.x.greaterThan(0), () => {
31
+ xw.assign(xw.mod(period.x))
32
+ })
33
+
34
+ If(period.y.greaterThan(0), () => {
35
+ yw.assign(yw.mod(period.y))
36
+ })
37
+
38
+ iu.assign(xw.add(yw.div(2)).add(0.5).floor())
39
+ iv.assign(yw.add(0.5).floor())
40
+ })
41
+
42
+ let hash = mod289Vec3(iu).toVar('hash')
43
+ hash.assign(mod289Vec3(hash.mul(51).add(2).mul(hash).add(iv)))
44
+ hash.assign(mod289Vec3(hash.mul(34).add(10).mul(hash)))
45
+
46
+ const psi = hash.mul(0.07482).add(alpha).toVar('psi')
47
+ const gx = psi.cos().toVar('gx')
48
+ const gy = psi.sin().toVar('gy')
49
+
50
+ const g0 = vec2(gx.x, gy.x).toVar('g0')
51
+ const g1 = vec2(gx.y, gy.y).toVar('g1')
52
+ const g2 = vec2(gx.z, gy.z).toVar('g2')
53
+
54
+ const w = vec3(0.8)
55
+ .sub(vec3(x0.dot(x0), x1.dot(x1), x2.dot(x2)))
56
+ .toVar('w')
57
+ w.assign(w.max(0))
58
+
59
+ const w2 = w.mul(w).toVar('w2')
60
+ const w4 = w2.mul(w2).toVar('w4')
61
+ const gdotx = vec3(g0.dot(x0), g1.dot(x1), g2.dot(x2)).toVar('gdotx')
62
+ const n = w4.dot(gdotx).toVar('n')
63
+
64
+ const w3 = w2.mul(w).toVar('w3')
65
+ const dw = w3.mul(-8).mul(gdotx).toVar('dw')
66
+ const dn0 = g0.mul(w4.x).add(x0.mul(dw.x)).toVar('dn0')
67
+ const dn1 = g1.mul(w4.y).add(x1.mul(dw.y)).toVar('dn1')
68
+ const dn2 = g2.mul(w4.z).add(x2.mul(dw.z)).toVar('dn2')
69
+ const gradient = dn0.add(dn1).add(dn2).mul(10.9).toVar('gradient')
70
+
71
+ return vec2(n.mul(10.9), gradient.length())
72
+ }).setLayout({
73
+ name: 'psrdnoise2D',
74
+ type: 'vec2',
75
+ inputs: [
76
+ { name: 'x', type: 'vec2' },
77
+ { name: 'period', type: 'vec2' },
78
+ { name: 'alpha', type: 'float' },
79
+ ],
80
+ })
81
+
82
+ // Basic psrdnoise 3D implementation
83
+ export const psrdnoise3D = Fn(([x, period, alpha]: [Vec3, Vec3, Float]): Vec3 => {
84
+ const M = mat3(0, 1, 1, 1, 0, 1, 1, 1, 0).toVar('M')
85
+ const Mi = mat3(-0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5).toVar('Mi')
86
+
87
+ const uvw = M.mul(x).toVar('uvw')
88
+ const i0 = uvw.floor().toVar('i0')
89
+ const f0 = uvw.fract().toVar('f0')
90
+
91
+ const g_ = f0.yzz.step(f0.xyx).toVar('g_')
92
+ const l_ = g_.oneMinus().toVar('l_')
93
+ const g = vec3(l_.z, g_.xy).toVar('g')
94
+ const l = vec3(l_.xy, g_.z).toVar('l')
95
+
96
+ const o1 = g.min(l).toVar('o1')
97
+ const o2 = g.max(l).toVar('o2')
98
+
99
+ const i1 = i0.add(o1).toVar('i1')
100
+ const i2 = i0.add(o2).toVar('i2')
101
+ const i3 = i0.add(vec3(1)).toVar('i3')
102
+
103
+ let v0 = Mi.mul(i0).toVar('v0')
104
+ let v1 = Mi.mul(i1).toVar('v1')
105
+ let v2 = Mi.mul(i2).toVar('v2')
106
+ let v3 = Mi.mul(i3).toVar('v3')
107
+
108
+ const x0 = x.sub(v0).toVar('x0')
109
+ const x1 = x.sub(v1).toVar('x1')
110
+ const x2 = x.sub(v2).toVar('x2')
111
+ const x3 = x.sub(v3).toVar('x3')
112
+
113
+ If(period.x.greaterThan(0).or(period.y.greaterThan(0)).or(period.z.greaterThan(0)), () => {
114
+ const vx = vec4(v0.x, v1.x, v2.x, v3.x).toVar('vx')
115
+ const vy = vec4(v0.y, v1.y, v2.y, v3.y).toVar('vy')
116
+ const vz = vec4(v0.z, v1.z, v2.z, v3.z).toVar('vz')
117
+
118
+ If(period.x.greaterThan(0), () => vx.assign(vx.mod(period.x)))
119
+ If(period.y.greaterThan(0), () => vy.assign(vy.mod(period.y)))
120
+ If(period.z.greaterThan(0), () => vz.assign(vz.mod(period.z)))
121
+
122
+ i0.assign(M.mul(vec3(vx.x, vy.x, vz.x)))
123
+ i1.assign(M.mul(vec3(vx.y, vy.y, vz.y)))
124
+ i2.assign(M.mul(vec3(vx.z, vy.z, vz.z)))
125
+ i3.assign(M.mul(vec3(vx.w, vy.w, vz.w)))
126
+
127
+ i0.assign(i0.add(0.5).floor())
128
+ i1.assign(i1.add(0.5).floor())
129
+ i2.assign(i2.add(0.5).floor())
130
+ i3.assign(i3.add(0.5).floor())
131
+ })
132
+
133
+ const hash = permuteVec4(
134
+ permuteVec4(permuteVec4(vec4(i0.z, i1.z, i2.z, i3.z)).add(vec4(i0.y, i1.y, i2.y, i3.y))).add(
135
+ vec4(i0.x, i1.x, i2.x, i3.x)
136
+ )
137
+ ).toVar('hash')
138
+
139
+ const theta = hash.mul(3.883222077).toVar('theta')
140
+ const sz = hash.mul(-0.006920415).add(0.996539792).toVar('sz')
141
+ const psi = hash.mul(0.108705628).toVar('psi')
142
+
143
+ const Ct = theta.cos().toVar('Ct')
144
+ const St = theta.sin().toVar('St')
145
+ const sz_prime = sz.mul(sz).oneMinus().sqrt().toVar('sz_prime')
146
+
147
+ const gx = Ct.mul(sz_prime).toVar('gx')
148
+ const gy = St.mul(sz_prime).toVar('gy')
149
+ const gz = sz.toVar('gz')
150
+
151
+ If(alpha.notEqual(0), () => {
152
+ const Sp = psi.sin().toVar('Sp')
153
+ const Cp = psi.cos().toVar('Cp')
154
+ const px = Ct.mul(sz_prime).toVar('px')
155
+ const py = St.mul(sz_prime).toVar('py')
156
+ const pz = sz.toVar('pz')
157
+
158
+ const Ctp = St.mul(Sp).sub(Ct.mul(Cp)).toVar('Ctp')
159
+ const qx = Ctp.mul(St).mix(Sp, sz).toVar('qx')
160
+ const qy = Ctp.negate().mul(Ct).mix(Cp, sz).toVar('qy')
161
+ const qz = py.mul(Cp).add(px.mul(Sp)).negate().toVar('qz')
162
+
163
+ const Sa = vec4(alpha.sin()).toVar('Sa')
164
+ const Ca = vec4(alpha.cos()).toVar('Ca')
165
+
166
+ gx.assign(Ca.mul(px).add(Sa.mul(qx)))
167
+ gy.assign(Ca.mul(py).add(Sa.mul(qy)))
168
+ gz.assign(Ca.mul(pz).add(Sa.mul(qz)))
169
+ })
170
+
171
+ const g0 = vec3(gx.x, gy.x, gz.x).toVar('g0')
172
+ const g1 = vec3(gx.y, gy.y, gz.y).toVar('g1')
173
+ const g2 = vec3(gx.z, gy.z, gz.z).toVar('g2')
174
+ const g3 = vec3(gx.w, gy.w, gz.w).toVar('g3')
175
+
176
+ let w = vec4(0.5)
177
+ .sub(vec4(x0.dot(x0), x1.dot(x1), x2.dot(x2), x3.dot(x3)))
178
+ .toVar('w')
179
+ w.assign(w.max(0))
180
+
181
+ const w2 = w.mul(w).toVar('w2')
182
+ const w3 = w2.mul(w).toVar('w3')
183
+ const gdotx = vec4(g0.dot(x0), g1.dot(x1), g2.dot(x2), g3.dot(x3)).toVar('gdotx')
184
+ const n = w3.dot(gdotx).toVar('n')
185
+
186
+ const dw = w2.mul(-6).mul(gdotx).toVar('dw')
187
+ const dn0 = g0.mul(w3.x).add(x0.mul(dw.x)).toVar('dn0')
188
+ const dn1 = g1.mul(w3.y).add(x1.mul(dw.y)).toVar('dn1')
189
+ const dn2 = g2.mul(w3.z).add(x2.mul(dw.z)).toVar('dn2')
190
+ const dn3 = g3.mul(w3.w).add(x3.mul(dw.w)).toVar('dn3')
191
+ const gradient = dn0.add(dn1).add(dn2).add(dn3).mul(39.5).toVar('gradient')
192
+
193
+ return vec3(n.mul(39.5), gradient.xy)
194
+ }).setLayout({
195
+ name: 'psrdnoise3D',
196
+ type: 'vec3',
197
+ inputs: [
198
+ { name: 'x', type: 'vec3' },
199
+ { name: 'period', type: 'vec3' },
200
+ { name: 'alpha', type: 'float' },
201
+ ],
202
+ })
203
+
204
+ // Simplified overloads
205
+ export const psrdnoise = Fn(([x]: [Vec2]): Float => {
206
+ return psrdnoise2D(x, vec2(0), float(0)).x
207
+ }).setLayout({
208
+ name: 'psrdnoise',
209
+ type: 'float',
210
+ inputs: [{ name: 'x', type: 'vec2' }],
211
+ })
212
+
213
+ // Two-parameter overload for compatibility
214
+ export const psrdnoise2 = Fn(([x, period]: [Vec2, Vec2]): Float => {
215
+ return psrdnoise2D(x, period, float(0)).x
216
+ }).setLayout({
217
+ name: 'psrdnoise2',
218
+ type: 'float',
219
+ inputs: [
220
+ { name: 'x', type: 'vec2' },
221
+ { name: 'period', type: 'vec2' },
222
+ ],
223
+ })
224
+
225
+ export const psrdnoisePeriod = Fn(([x, period]: [Vec2, Vec2]): Float => {
226
+ return psrdnoise2D(x, period, float(0)).x
227
+ }).setLayout({
228
+ name: 'psrdnoisePeriod',
229
+ type: 'float',
230
+ inputs: [
231
+ { name: 'x', type: 'vec2' },
232
+ { name: 'period', type: 'vec2' },
233
+ ],
234
+ })
235
+
236
+ export const psrdnoiseAlpha = Fn(([x, period, alpha]: [Vec2, Vec2, Float]): Float => {
237
+ return psrdnoise2D(x, period, alpha).x
238
+ }).setLayout({
239
+ name: 'psrdnoiseAlpha',
240
+ type: 'float',
241
+ inputs: [
242
+ { name: 'x', type: 'vec2' },
243
+ { name: 'period', type: 'vec2' },
244
+ { name: 'alpha', type: 'float' },
245
+ ],
246
+ })
247
+
248
+ export const psrdnoise3 = Fn(([x]: [Vec3]): Float => {
249
+ return psrdnoise3D(x, vec3(0), float(0)).x
250
+ }).setLayout({
251
+ name: 'psrdnoise3',
252
+ type: 'float',
253
+ inputs: [{ name: 'x', type: 'vec3' }],
254
+ })
255
+
256
+ export const psrdnoise3Period = Fn(([x, period]: [Vec3, Vec3]): Float => {
257
+ return psrdnoise3D(x, period, float(0)).x
258
+ }).setLayout({
259
+ name: 'psrdnoise3Period',
260
+ type: 'float',
261
+ inputs: [
262
+ { name: 'x', type: 'vec3' },
263
+ { name: 'period', type: 'vec3' },
264
+ ],
265
+ })
266
+
267
+ export const psrdnoise3Alpha = Fn(([x, period, alpha]: [Vec3, Vec3, Float]): Float => {
268
+ return psrdnoise3D(x, period, alpha).x
269
+ }).setLayout({
270
+ name: 'psrdnoise3Alpha',
271
+ type: 'float',
272
+ inputs: [
273
+ { name: 'x', type: 'vec3' },
274
+ { name: 'period', type: 'vec3' },
275
+ { name: 'alpha', type: 'float' },
276
+ ],
277
+ })
@@ -0,0 +1,136 @@
1
+ import { Fn, Float, Vec2, Vec3, Vec4, vec2, vec3, vec4, float, dot, fract, sin } from '../../node'
2
+
3
+ const RANDOM_SCALE = vec4(443.897, 441.423, 0.0973, 0.1099)
4
+
5
+ export const random = Fn(([x]: [Float]): Float => {
6
+ return x.sin().mul(43758.5453).fract()
7
+ }).setLayout({
8
+ name: 'random',
9
+ type: 'float',
10
+ inputs: [{ name: 'x', type: 'float' }],
11
+ })
12
+
13
+ export const randomVec2 = Fn(([st]: [Vec2]): Float => {
14
+ return st.dot(vec2(12.9898, 78.233)).sin().mul(43758.5453).fract()
15
+ }).setLayout({
16
+ name: 'randomVec2',
17
+ type: 'float',
18
+ inputs: [{ name: 'st', type: 'vec2' }],
19
+ })
20
+
21
+ export const randomVec3 = Fn(([pos]: [Vec3]): Float => {
22
+ return pos.dot(vec3(70.9898, 78.233, 32.4355)).sin().mul(43758.5453123).fract()
23
+ }).setLayout({
24
+ name: 'randomVec3',
25
+ type: 'float',
26
+ inputs: [{ name: 'pos', type: 'vec3' }],
27
+ })
28
+
29
+ export const randomVec4 = Fn(([pos]: [Vec4]): Float => {
30
+ const dot_product = pos.dot(vec4(12.9898, 78.233, 45.164, 94.673)).toVar('dot_product')
31
+ return dot_product.sin().mul(43758.5453).fract()
32
+ }).setLayout({
33
+ name: 'randomVec4',
34
+ type: 'float',
35
+ inputs: [{ name: 'pos', type: 'vec4' }],
36
+ })
37
+
38
+ export const random2Float = Fn(([p]: [Float]): Vec2 => {
39
+ const p3 = vec3(p).mul(RANDOM_SCALE.xyz).fract().toVar('p3')
40
+ p3.addAssign(p3.dot(p3.yzx.add(19.19)))
41
+ return p3.xx.add(p3.yz).mul(p3.zy).fract()
42
+ }).setLayout({
43
+ name: 'random2Float',
44
+ type: 'vec2',
45
+ inputs: [{ name: 'p', type: 'float' }],
46
+ })
47
+
48
+ export const random2Vec2 = Fn(([p]: [Vec2]): Vec2 => {
49
+ const p3 = p.xyx.mul(RANDOM_SCALE.xyz).fract().toVar('p3')
50
+ p3.addAssign(p3.dot(p3.yzx.add(19.19)))
51
+ return p3.xx.add(p3.yz).mul(p3.zy).fract()
52
+ }).setLayout({
53
+ name: 'random2Vec2',
54
+ type: 'vec2',
55
+ inputs: [{ name: 'p', type: 'vec2' }],
56
+ })
57
+
58
+ export const random2Vec3 = Fn(([p3]: [Vec3]): Vec2 => {
59
+ p3.assign(p3.mul(RANDOM_SCALE.xyz).fract())
60
+ p3.addAssign(p3.dot(p3.yzx.add(19.19)))
61
+ return p3.xx.add(p3.yz).mul(p3.zy).fract()
62
+ }).setLayout({
63
+ name: 'random2Vec3',
64
+ type: 'vec2',
65
+ inputs: [{ name: 'p3', type: 'vec3' }],
66
+ })
67
+
68
+ export const random3Float = Fn(([p]: [Float]): Vec3 => {
69
+ const p3 = vec3(p).mul(RANDOM_SCALE.xyz).fract().toVar('p3')
70
+ p3.addAssign(p3.dot(p3.yzx.add(19.19)))
71
+ return p3.xxy.add(p3.yzz).mul(p3.zyx).fract()
72
+ }).setLayout({
73
+ name: 'random3Float',
74
+ type: 'vec3',
75
+ inputs: [{ name: 'p', type: 'float' }],
76
+ })
77
+
78
+ export const random3Vec2 = Fn(([p]: [Vec2]): Vec3 => {
79
+ const p3 = vec3(p.xyx).mul(RANDOM_SCALE.xyz).fract().toVar('p3')
80
+ p3.addAssign(p3.dot(p3.yxz.add(19.19)))
81
+ return p3.xxy.add(p3.yzz).mul(p3.zyx).fract()
82
+ }).setLayout({
83
+ name: 'random3Vec2',
84
+ type: 'vec3',
85
+ inputs: [{ name: 'p', type: 'vec2' }],
86
+ })
87
+
88
+ export const random3Vec3 = Fn(([p]: [Vec3]): Vec3 => {
89
+ p.assign(p.mul(RANDOM_SCALE.xyz).fract())
90
+ p.addAssign(p.dot(p.yxz.add(19.19)))
91
+ return p.xxy.add(p.yzz).mul(p.zyx).fract()
92
+ }).setLayout({
93
+ name: 'random3Vec3',
94
+ type: 'vec3',
95
+ inputs: [{ name: 'p', type: 'vec3' }],
96
+ })
97
+
98
+ export const random4Float = Fn(([p]: [Float]): Vec4 => {
99
+ const p4 = float(p).mul(RANDOM_SCALE).fract().toVar('p4')
100
+ p4.addAssign(p4.dot(p4.wzxy.add(19.19)))
101
+ return p4.xxyz.add(p4.yzzw).mul(p4.zywx).fract()
102
+ }).setLayout({
103
+ name: 'random4Float',
104
+ type: 'vec4',
105
+ inputs: [{ name: 'p', type: 'float' }],
106
+ })
107
+
108
+ export const random4Vec2 = Fn(([p]: [Vec2]): Vec4 => {
109
+ const p4 = p.xyxy.mul(RANDOM_SCALE).fract().toVar('p4')
110
+ p4.addAssign(p4.dot(p4.wzxy.add(19.19)))
111
+ return p4.xxyz.add(p4.yzzw).mul(p4.zywx).fract()
112
+ }).setLayout({
113
+ name: 'random4Vec2',
114
+ type: 'vec4',
115
+ inputs: [{ name: 'p', type: 'vec2' }],
116
+ })
117
+
118
+ export const random4Vec3 = Fn(([p]: [Vec3]): Vec4 => {
119
+ const p4 = p.xyzx.mul(RANDOM_SCALE).fract().toVar('p4')
120
+ p4.addAssign(p4.dot(p4.wzxy.add(19.19)))
121
+ return p4.xxyz.add(p4.yzzw).mul(p4.zywx).fract()
122
+ }).setLayout({
123
+ name: 'random4Vec3',
124
+ type: 'vec4',
125
+ inputs: [{ name: 'p', type: 'vec3' }],
126
+ })
127
+
128
+ export const random4Vec4 = Fn(([p4]: [Vec4]): Vec4 => {
129
+ p4.assign(p4.mul(RANDOM_SCALE).fract())
130
+ p4.addAssign(p4.dot(p4.wzxy.add(19.19)))
131
+ return p4.xxyz.add(p4.yzzw).mul(p4.zywx).fract()
132
+ }).setLayout({
133
+ name: 'random4Vec4',
134
+ type: 'vec4',
135
+ inputs: [{ name: 'p4', type: 'vec4' }],
136
+ })
@@ -0,0 +1,199 @@
1
+ import { Fn, Float, Vec2, Vec3, Vec4, vec2, vec3, vec4, float } from '../../node'
2
+ import { mod289Vec2, mod289Vec3, mod289Vec4 } from '../math/mod289'
3
+ import { permute, permuteVec3, permuteVec4 } from '../math/permute'
4
+ import { taylorInvSqrt } from '../math/taylorInvSqrt'
5
+ import { grad4 } from '../math/grad4'
6
+
7
+ export const snoiseVec2 = Fn(([v]: [Vec2]): Float => {
8
+ const C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439).toVar('C')
9
+ const i = v.add(v.dot(C.yy)).floor().toVar('i')
10
+ const x0 = v.sub(i).add(i.dot(C.xx)).toVar('x0')
11
+ const i1 = vec2(1, 0).select(vec2(0, 1), x0.x.greaterThan(x0.y)).toVar('i1')
12
+ const x12 = x0.xyxy.add(C.xxzz).toVar('x12')
13
+ x12.xy = x12.xy.sub(i1)
14
+ i.assign(mod289Vec2(i))
15
+ const p = permuteVec3(
16
+ permuteVec3(i.y.add(vec3(0, i1.y, 1)))
17
+ .add(i.x)
18
+ .add(vec3(0, i1.x, 1))
19
+ ).toVar('p')
20
+ const m = float(0.5)
21
+ .sub(vec3(x0.dot(x0), x12.xy.dot(x12.xy), x12.zw.dot(x12.zw)))
22
+ .max(0)
23
+ .toVar('m')
24
+ m.assign(m.mul(m))
25
+ m.assign(m.mul(m))
26
+ const x = p.mul(C.www).fract().mul(2).sub(1).toVar('x')
27
+ const h = x.abs().sub(0.5).toVar('h')
28
+ const ox = x.add(0.5).floor().toVar('ox')
29
+ const a0 = x.sub(ox).toVar('a0')
30
+ m.mulAssign(float(1.79284291400159).sub(float(0.85373472095314).mul(a0.mul(a0).add(h.mul(h)))))
31
+ const g = vec3(a0.x.mul(x0.x).add(h.x.mul(x0.y)), a0.yz.mul(x12.xz).add(h.yz.mul(x12.yw))).toVar('g')
32
+ return float(130).mul(m.dot(g))
33
+ }).setLayout({
34
+ name: 'snoiseVec2',
35
+ type: 'float',
36
+ inputs: [{ name: 'v', type: 'vec2' }],
37
+ })
38
+
39
+ export const snoiseVec3 = Fn(([v]: [Vec3]): Float => {
40
+ const C = vec2(1 / 6, 1 / 3).toVar('C')
41
+ const D = vec4(0, 0.5, 1, 2).toVar('D')
42
+ const i = v.add(v.dot(C.yyy)).floor().toVar('i')
43
+ const x0 = v.sub(i).add(i.dot(C.xxx)).toVar('x0')
44
+ const g = x0.yzx.step(x0.xyz).toVar('g')
45
+ const l = float(1).sub(g).toVar('l')
46
+ const i1 = g.xyz.min(l.zxy).toVar('i1')
47
+ const i2 = g.xyz.max(l.zxy).toVar('i2')
48
+ const x1 = x0.sub(i1).add(C.xxx).toVar('x1')
49
+ const x2 = x0.sub(i2).add(C.yyy).toVar('x2')
50
+ const x3 = x0.sub(D.yyy).toVar('x3')
51
+ i.assign(mod289Vec3(i))
52
+ const p = permuteVec4(
53
+ permuteVec4(
54
+ permuteVec4(i.z.add(vec4(0, i1.z, i2.z, 1)))
55
+ .add(i.y)
56
+ .add(vec4(0, i1.y, i2.y, 1))
57
+ )
58
+ .add(i.x)
59
+ .add(vec4(0, i1.x, i2.x, 1))
60
+ ).toVar('p')
61
+ const n_ = float(0.142857142857).toVar('n_')
62
+ const ns = n_.mul(D.wyz).sub(D.xzx).toVar('ns')
63
+ const j = p.sub(p.mul(ns.z).mul(ns.z).floor().mul(49)).toVar('j')
64
+ const x_ = j.mul(ns.z).floor().toVar('x_')
65
+ const y_ = j.sub(x_.mul(7)).floor().toVar('y_')
66
+ const x = x_.mul(ns.x).add(ns.yyyy).toVar('x')
67
+ const y = y_.mul(ns.x).add(ns.yyyy).toVar('y')
68
+ const h = float(1).sub(x.abs()).sub(y.abs()).toVar('h')
69
+ const b0 = vec4(x.xy, y.xy).toVar('b0')
70
+ const b1 = vec4(x.zw, y.zw).toVar('b1')
71
+ const s0 = b0.floor().mul(2).add(1).toVar('s0')
72
+ const s1 = b1.floor().mul(2).add(1).toVar('s1')
73
+ const sh = vec4(0).step(h).negate().toVar('sh')
74
+ const a0 = b0.xzyw.add(s0.xzyw.mul(sh.xxyy)).toVar('a0')
75
+ const a1 = b1.xzyw.add(s1.xzyw.mul(sh.zzww)).toVar('a1')
76
+ const p0 = vec3(a0.xy, h.x).toVar('p0')
77
+ const p1 = vec3(a0.zw, h.y).toVar('p1')
78
+ const p2 = vec3(a1.xy, h.z).toVar('p2')
79
+ const p3 = vec3(a1.zw, h.w).toVar('p3')
80
+ const norm = taylorInvSqrt(vec4(p0.dot(p0), p1.dot(p1), p2.dot(p2), p3.dot(p3))).toVar('norm')
81
+ p0.mulAssign(norm.x)
82
+ p1.mulAssign(norm.y)
83
+ p2.mulAssign(norm.z)
84
+ p3.mulAssign(norm.w)
85
+ const m = float(0.6)
86
+ .sub(vec4(x0.dot(x0), x1.dot(x1), x2.dot(x2), x3.dot(x3)))
87
+ .max(0)
88
+ .toVar('m')
89
+ m.assign(m.mul(m))
90
+ return float(42).mul(m.mul(m).dot(vec4(p0.dot(x0), p1.dot(x1), p2.dot(x2), p3.dot(x3))))
91
+ }).setLayout({
92
+ name: 'snoiseVec3',
93
+ type: 'float',
94
+ inputs: [{ name: 'v', type: 'vec3' }],
95
+ })
96
+
97
+ export const snoiseVec4 = Fn(([v]: [Vec4]): Float => {
98
+ const C = vec4(0.138196601125011, 0.276393202250021, 0.414589803375032, -0.447213595499958).toVar('C')
99
+ const i = v
100
+ .add(v.dot(vec4(0.309016994374947451)))
101
+ .floor()
102
+ .toVar('i')
103
+ const x0 = v.sub(i).add(i.dot(C.xxxx)).toVar('x0')
104
+ const i0 = vec4(0).toVar('i0')
105
+ const isX = x0.xxx.step(x0.yzw).toVar('isX')
106
+ const isYZ = x0.yyz.step(x0.zww).toVar('isYZ')
107
+ i0.x = isX.x.add(isX.y).add(isX.z)
108
+ i0.yzw = float(1).sub(isX)
109
+ i0.y = i0.y.add(isYZ.x).add(isYZ.y)
110
+ i0.zw = i0.zw.add(float(1).sub(isYZ.xy))
111
+ i0.z = i0.z.add(isYZ.z)
112
+ i0.w = i0.w.add(float(1).sub(isYZ.z))
113
+ const i3 = i0.clamp(0, 1).toVar('i3')
114
+ const i2 = i0.sub(1).clamp(0, 1).toVar('i2')
115
+ const i1 = i0.sub(2).clamp(0, 1).toVar('i1')
116
+ const x1 = x0.sub(i1).add(C.xxxx).toVar('x1')
117
+ const x2 = x0.sub(i2).add(C.yyyy).toVar('x2')
118
+ const x3 = x0.sub(i3).add(C.zzzz).toVar('x3')
119
+ const x4 = x0.add(C.wwww).toVar('x4')
120
+ i.assign(mod289Vec4(i))
121
+ const j0 = permute(permute(permute(permute(i.w).add(i.z)).add(i.y)).add(i.x)).toVar('j0')
122
+ const j1 = permuteVec4(
123
+ permuteVec4(
124
+ permuteVec4(
125
+ permuteVec4(i.w.add(vec4(i1.w, i2.w, i3.w, 1)))
126
+ .add(i.z)
127
+ .add(vec4(i1.z, i2.z, i3.z, 1))
128
+ )
129
+ .add(i.y)
130
+ .add(vec4(i1.y, i2.y, i3.y, 1))
131
+ )
132
+ .add(i.x)
133
+ .add(vec4(i1.x, i2.x, i3.x, 1))
134
+ ).toVar('j1')
135
+ const ip = vec4(1 / 294, 1 / 49, 1 / 7, 0).toVar('ip')
136
+ const p0 = grad4(j0, ip).toVar('p0')
137
+ const p1 = grad4(j1.x, ip).toVar('p1')
138
+ const p2 = grad4(j1.y, ip).toVar('p2')
139
+ const p3 = grad4(j1.z, ip).toVar('p3')
140
+ const p4 = grad4(j1.w, ip).toVar('p4')
141
+ const norm = taylorInvSqrt(vec4(p0.dot(p0), p1.dot(p1), p2.dot(p2), p3.dot(p3))).toVar('norm')
142
+ p0.mulAssign(norm.x)
143
+ p1.mulAssign(norm.y)
144
+ p2.mulAssign(norm.z)
145
+ p3.mulAssign(norm.w)
146
+ p4.mulAssign(taylorInvSqrt(p4.dot(p4)))
147
+ const m0 = float(0.6)
148
+ .sub(vec3(x0.dot(x0), x1.dot(x1), x2.dot(x2)))
149
+ .max(0)
150
+ .toVar('m0')
151
+ const m1 = float(0.6)
152
+ .sub(vec2(x3.dot(x3), x4.dot(x4)))
153
+ .max(0)
154
+ .toVar('m1')
155
+ m0.assign(m0.mul(m0))
156
+ m1.assign(m1.mul(m1))
157
+ return float(49).mul(
158
+ m0
159
+ .mul(m0)
160
+ .dot(vec3(p0.dot(x0), p1.dot(x1), p2.dot(x2)))
161
+ .add(m1.mul(m1).dot(vec2(p3.dot(x3), p4.dot(x4))))
162
+ )
163
+ }).setLayout({
164
+ name: 'snoiseVec4',
165
+ type: 'float',
166
+ inputs: [{ name: 'v', type: 'vec4' }],
167
+ })
168
+
169
+ export const snoise2 = Fn(([x]: [Vec2]): Vec2 => {
170
+ const s = snoiseVec2(x).toVar('s')
171
+ const s1 = snoiseVec2(vec2(x.y.sub(19.1), x.x.add(47.2))).toVar('s1')
172
+ return vec2(s, s1)
173
+ }).setLayout({
174
+ name: 'snoise2',
175
+ type: 'vec2',
176
+ inputs: [{ name: 'x', type: 'vec2' }],
177
+ })
178
+
179
+ export const snoise3Vec3 = Fn(([x]: [Vec3]): Vec3 => {
180
+ const s = snoiseVec3(x).toVar('s')
181
+ const s1 = snoiseVec3(vec3(x.y.sub(19.1), x.z.add(33.4), x.x.add(47.2))).toVar('s1')
182
+ const s2 = snoiseVec3(vec3(x.z.add(74.2), x.x.sub(124.5), x.y.add(99.4))).toVar('s2')
183
+ return vec3(s, s1, s2)
184
+ }).setLayout({
185
+ name: 'snoise3Vec3',
186
+ type: 'vec3',
187
+ inputs: [{ name: 'x', type: 'vec3' }],
188
+ })
189
+
190
+ export const snoise3Vec4 = Fn(([x]: [Vec4]): Vec3 => {
191
+ const s = snoiseVec4(x).toVar('s')
192
+ const s1 = snoiseVec4(vec4(x.y.sub(19.1), x.z.add(33.4), x.x.add(47.2), x.w)).toVar('s1')
193
+ const s2 = snoiseVec4(vec4(x.z.add(74.2), x.x.sub(124.5), x.y.add(99.4), x.w)).toVar('s2')
194
+ return vec3(s, s1, s2)
195
+ }).setLayout({
196
+ name: 'snoise3Vec4',
197
+ type: 'vec3',
198
+ inputs: [{ name: 'x', type: 'vec4' }],
199
+ })