glre 0.38.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.
- package/README.md +8 -4
- package/dist/addons.cjs +2 -0
- package/dist/addons.cjs.map +1 -0
- package/dist/addons.d.ts +1287 -0
- package/dist/addons.js +2 -0
- package/dist/addons.js.map +1 -0
- package/dist/index.cjs +31 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +187 -323
- package/dist/index.js +31 -43
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +1 -48
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.ts +536 -10
- package/dist/native.js +1 -48
- package/dist/native.js.map +1 -1
- package/dist/node.cjs +69 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.ts +626 -0
- package/dist/node.js +69 -0
- package/dist/node.js.map +1 -0
- package/dist/react.cjs +1 -48
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +524 -4
- package/dist/react.js +1 -48
- package/dist/react.js.map +1 -1
- package/dist/solid.cjs +1 -48
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.ts +524 -4
- package/dist/solid.js +1 -48
- package/dist/solid.js.map +1 -1
- package/package.json +64 -11
- package/src/addons/animation/easing/backIn.ts +10 -0
- package/src/addons/animation/easing/backInOut.ts +12 -0
- package/src/addons/animation/easing/backOut.ts +10 -0
- package/src/addons/animation/easing/bounceIn.ts +10 -0
- package/src/addons/animation/easing/bounceInOut.ts +13 -0
- package/src/addons/animation/easing/bounceOut.ts +30 -0
- package/src/addons/animation/easing/circularIn.ts +9 -0
- package/src/addons/animation/easing/circularInOut.ts +11 -0
- package/src/addons/animation/easing/circularOut.ts +9 -0
- package/src/addons/animation/easing/cubicIn.ts +9 -0
- package/src/addons/animation/easing/cubicInOut.ts +11 -0
- package/src/addons/animation/easing/cubicOut.ts +10 -0
- package/src/addons/animation/easing/elasticIn.ts +10 -0
- package/src/addons/animation/easing/elasticInOut.ts +21 -0
- package/src/addons/animation/easing/elasticOut.ts +12 -0
- package/src/addons/animation/easing/exponentialIn.ts +9 -0
- package/src/addons/animation/easing/exponentialInOut.ts +13 -0
- package/src/addons/animation/easing/exponentialOut.ts +9 -0
- package/src/addons/animation/easing/index.ts +33 -0
- package/src/addons/animation/easing/linearIn.ts +9 -0
- package/src/addons/animation/easing/linearInOut.ts +9 -0
- package/src/addons/animation/easing/linearOut.ts +9 -0
- package/src/addons/animation/easing/quadraticIn.ts +9 -0
- package/src/addons/animation/easing/quadraticInOut.ts +10 -0
- package/src/addons/animation/easing/quadraticOut.ts +9 -0
- package/src/addons/animation/easing/quarticIn.ts +9 -0
- package/src/addons/animation/easing/quarticInOut.ts +11 -0
- package/src/addons/animation/easing/quarticOut.ts +10 -0
- package/src/addons/animation/easing/quinticIn.ts +9 -0
- package/src/addons/animation/easing/quinticInOut.ts +11 -0
- package/src/addons/animation/easing/quinticOut.ts +9 -0
- package/src/addons/animation/easing/sineIn.ts +10 -0
- package/src/addons/animation/easing/sineInOut.ts +10 -0
- package/src/addons/animation/easing/sineOut.ts +10 -0
- package/src/addons/color/palette/macbeth.ts +42 -0
- package/src/addons/color/space/cmyk2rgb.ts +12 -0
- package/src/addons/color/space/gamma2linear.ts +19 -0
- package/src/addons/color/space/hsl2rgb.ts +20 -0
- package/src/addons/color/space/hsv2rgb.ts +18 -0
- package/src/addons/color/space/hue2rgb.ts +12 -0
- package/src/addons/color/space/index.ts +29 -0
- package/src/addons/color/space/lab2lch.ts +22 -0
- package/src/addons/color/space/lab2rgb.ts +19 -0
- package/src/addons/color/space/lab2xyz.ts +32 -0
- package/src/addons/color/space/lch2lab.ts +21 -0
- package/src/addons/color/space/lch2rgb.ts +22 -0
- package/src/addons/color/space/linear2gamma.ts +19 -0
- package/src/addons/color/space/oklab2rgb.ts +35 -0
- package/src/addons/color/space/rgb2cmyk.ts +13 -0
- package/src/addons/color/space/rgb2hcv.ts +29 -0
- package/src/addons/color/space/rgb2hsl.ts +23 -0
- package/src/addons/color/space/rgb2hsv.ts +36 -0
- package/src/addons/color/space/rgb2hue.ts +29 -0
- package/src/addons/color/space/rgb2lab.ts +19 -0
- package/src/addons/color/space/rgb2lch.ts +22 -0
- package/src/addons/color/space/rgb2oklab.ts +45 -0
- package/src/addons/color/space/rgb2srgb.ts +34 -0
- package/src/addons/color/space/rgb2xyz.ts +20 -0
- package/src/addons/color/space/rgb2yiq.ts +22 -0
- package/src/addons/color/space/rgb2yuv.ts +32 -0
- package/src/addons/color/space/srgb2rgb.ts +34 -0
- package/src/addons/color/space/xyz2lab.ts +27 -0
- package/src/addons/color/space/xyz2rgb.ts +30 -0
- package/src/addons/color/space/yiq2rgb.ts +22 -0
- package/src/addons/color/space/yuv2rgb.ts +32 -0
- package/src/addons/draw/arrows.ts +75 -0
- package/src/addons/draw/axis.ts +57 -0
- package/src/addons/draw/bridge.ts +81 -0
- package/src/addons/draw/char.ts +30 -0
- package/src/addons/draw/circle.ts +29 -0
- package/src/addons/draw/fill.ts +25 -0
- package/src/addons/draw/flip.ts +45 -0
- package/src/addons/draw/hex.ts +29 -0
- package/src/addons/draw/index.ts +13 -0
- package/src/addons/draw/line.ts +16 -0
- package/src/addons/draw/point.ts +30 -0
- package/src/addons/draw/rect.ts +52 -0
- package/src/addons/draw/stroke.ts +31 -0
- package/src/addons/draw/tri.ts +29 -0
- package/src/addons/generative/cnoise.ts +239 -0
- package/src/addons/generative/curl.ts +64 -0
- package/src/addons/generative/fbm.ts +69 -0
- package/src/addons/generative/gerstnerWave.ts +21 -0
- package/src/addons/generative/gnoise.ts +113 -0
- package/src/addons/generative/index.ts +15 -0
- package/src/addons/generative/noised.ts +139 -0
- package/src/addons/generative/pnoise.ts +249 -0
- package/src/addons/generative/psrdnoise.ts +277 -0
- package/src/addons/generative/random.ts +136 -0
- package/src/addons/generative/snoise.ts +199 -0
- package/src/addons/generative/srandom.ts +90 -0
- package/src/addons/generative/voronoi.ts +134 -0
- package/src/addons/generative/voronoise.ts +69 -0
- package/src/addons/generative/wavelet.ts +77 -0
- package/src/addons/generative/worley.ts +99 -0
- package/src/addons/geometry/aabb/aabb.ts +8 -0
- package/src/addons/geometry/aabb/centroid.ts +10 -0
- package/src/addons/geometry/aabb/contain.ts +19 -0
- package/src/addons/geometry/aabb/diagonal.ts +10 -0
- package/src/addons/geometry/aabb/expand.ts +16 -0
- package/src/addons/geometry/aabb/index.ts +7 -0
- package/src/addons/geometry/aabb/intersect.ts +20 -0
- package/src/addons/geometry/aabb/square.ts +17 -0
- package/src/addons/geometry/index.ts +2 -0
- package/src/addons/geometry/triangle/area.ts +10 -0
- package/src/addons/geometry/triangle/barycentric.ts +50 -0
- package/src/addons/geometry/triangle/centroid.ts +10 -0
- package/src/addons/geometry/triangle/closestPoint.ts +85 -0
- package/src/addons/geometry/triangle/contain.ts +19 -0
- package/src/addons/geometry/triangle/distanceSq.ts +38 -0
- package/src/addons/geometry/triangle/index.ts +10 -0
- package/src/addons/geometry/triangle/intersect.ts +49 -0
- package/src/addons/geometry/triangle/normal.ts +12 -0
- package/src/addons/geometry/triangle/signedDistance.ts +31 -0
- package/src/addons/geometry/triangle/triangle.ts +9 -0
- package/src/addons/index.ts +8 -0
- package/src/addons/lighting/ray.ts +8 -0
- package/src/addons/math/aafloor.ts +13 -0
- package/src/addons/math/aafract.ts +38 -0
- package/src/addons/math/aamirror.ts +12 -0
- package/src/addons/math/aastep.ts +14 -0
- package/src/addons/math/absi.ts +9 -0
- package/src/addons/math/adaptiveThreshold.ts +24 -0
- package/src/addons/math/bump.ts +20 -0
- package/src/addons/math/const.ts +19 -0
- package/src/addons/math/cubic.ts +101 -0
- package/src/addons/math/cubicMix.ts +49 -0
- package/src/addons/math/decimate.ts +12 -0
- package/src/addons/math/dist.ts +143 -0
- package/src/addons/math/fcos.ts +11 -0
- package/src/addons/math/frac.ts +9 -0
- package/src/addons/math/gain.ts +14 -0
- package/src/addons/math/gaussian.ts +14 -0
- package/src/addons/math/grad4.ts +19 -0
- package/src/addons/math/hammersley.ts +54 -0
- package/src/addons/math/highPass.ts +12 -0
- package/src/addons/math/index.ts +63 -0
- package/src/addons/math/inside.ts +68 -0
- package/src/addons/math/invCubic.ts +9 -0
- package/src/addons/math/invQuartic.ts +9 -0
- package/src/addons/math/inverse.ts +9 -0
- package/src/addons/math/lengthSq.ts +10 -0
- package/src/addons/math/map.ts +27 -0
- package/src/addons/math/mirror.ts +12 -0
- package/src/addons/math/mmax.ts +27 -0
- package/src/addons/math/mmin.ts +28 -0
- package/src/addons/math/mmix.ts +47 -0
- package/src/addons/math/mod2.ts +44 -0
- package/src/addons/math/mod289.ts +46 -0
- package/src/addons/math/modi.ts +15 -0
- package/src/addons/math/nyquist.ts +15 -0
- package/src/addons/math/pack.ts +15 -0
- package/src/addons/math/parabola.ts +12 -0
- package/src/addons/math/permute.ts +42 -0
- package/src/addons/math/pow2.ts +10 -0
- package/src/addons/math/pow3.ts +9 -0
- package/src/addons/math/pow5.ts +10 -0
- package/src/addons/math/pow7.ts +12 -0
- package/src/addons/math/powFast.ts +18 -0
- package/src/addons/math/quartic.ts +15 -0
- package/src/addons/math/quat/index.ts +14 -0
- package/src/addons/math/quat/quat2mat3.ts +28 -0
- package/src/addons/math/quat/quat2mat4.ts +16 -0
- package/src/addons/math/quat/quatAdd.ts +18 -0
- package/src/addons/math/quat/quatConj.ts +14 -0
- package/src/addons/math/quat/quatDiv.ts +18 -0
- package/src/addons/math/quat/quatIdentity.ts +9 -0
- package/src/addons/math/quat/quatInverse.ts +17 -0
- package/src/addons/math/quat/quatLength.ts +15 -0
- package/src/addons/math/quat/quatLengthSq.ts +14 -0
- package/src/addons/math/quat/quatLerp.ts +40 -0
- package/src/addons/math/quat/quatMul.ts +38 -0
- package/src/addons/math/quat/quatNeg.ts +14 -0
- package/src/addons/math/quat/quatNorm.ts +16 -0
- package/src/addons/math/quat/quatSub.ts +18 -0
- package/src/addons/math/quintic.ts +16 -0
- package/src/addons/math/rotate2d.ts +16 -0
- package/src/addons/math/rotate3d.ts +37 -0
- package/src/addons/math/rotate3dX.ts +20 -0
- package/src/addons/math/rotate3dY.ts +20 -0
- package/src/addons/math/rotate3dZ.ts +20 -0
- package/src/addons/math/rotate4d.ts +41 -0
- package/src/addons/math/rotate4dX.ts +21 -0
- package/src/addons/math/rotate4dY.ts +16 -0
- package/src/addons/math/rotate4dZ.ts +21 -0
- package/src/addons/math/saturateMediump.ts +11 -0
- package/src/addons/math/scale2d.ts +44 -0
- package/src/addons/math/scale3d.ts +17 -0
- package/src/addons/math/scale4d.ts +50 -0
- package/src/addons/math/smootherstep.ts +16 -0
- package/src/addons/math/taylorInvSqrt.ts +9 -0
- package/src/addons/math/toMat3.ts +14 -0
- package/src/addons/math/toMat4.ts +14 -0
- package/src/addons/math/translate4d.ts +31 -0
- package/src/addons/math/unpack.ts +88 -0
- package/src/addons/sdf/boxSDF.ts +24 -0
- package/src/addons/sdf/circleSDF.ts +20 -0
- package/src/addons/sdf/crossSDF.ts +17 -0
- package/src/addons/sdf/hexSDF.ts +18 -0
- package/src/addons/sdf/index.ts +7 -0
- package/src/addons/sdf/lineSDF.ts +33 -0
- package/src/addons/sdf/rectSDF.ts +46 -0
- package/src/addons/sdf/sphereSDF.ts +20 -0
- package/src/addons/sdf/triSDF.ts +14 -0
- package/src/addons/space/aspect.ts +14 -0
- package/src/addons/space/bracketing.ts +44 -0
- package/src/addons/space/brickTile.ts +44 -0
- package/src/addons/space/cart2polar.ts +20 -0
- package/src/addons/space/center.ts +32 -0
- package/src/addons/space/checkerTile.ts +41 -0
- package/src/addons/space/depth2viewZ.ts +43 -0
- package/src/addons/space/displace.ts +55 -0
- package/src/addons/space/equirect2xyz.ts +17 -0
- package/src/addons/space/eulerView.ts +19 -0
- package/src/addons/space/fisheye2xyz.ts +18 -0
- package/src/addons/space/flipY.ts +25 -0
- package/src/addons/space/hexTile.ts +18 -0
- package/src/addons/space/index.ts +38 -0
- package/src/addons/space/kaleidoscope.ts +48 -0
- package/src/addons/space/linearizeDepth.ts +17 -0
- package/src/addons/space/lookAt.ts +49 -0
- package/src/addons/space/lookAtView.ts +40 -0
- package/src/addons/space/mirrorTile.ts +73 -0
- package/src/addons/space/nearest.ts +13 -0
- package/src/addons/space/orthographic.ts +25 -0
- package/src/addons/space/parallaxMapping.ts +149 -0
- package/src/addons/space/perspective.ts +24 -0
- package/src/addons/space/polar2cart.ts +24 -0
- package/src/addons/space/ratio.ts +14 -0
- package/src/addons/space/rotate.ts +37 -0
- package/src/addons/space/rotateX.ts +54 -0
- package/src/addons/space/rotateY.ts +54 -0
- package/src/addons/space/rotateZ.ts +54 -0
- package/src/addons/space/scale.ts +13 -0
- package/src/addons/space/sprite.ts +16 -0
- package/src/addons/space/sqTile.ts +20 -0
- package/src/addons/space/tbn.ts +26 -0
- package/src/addons/space/translate.ts +12 -0
- package/src/addons/space/triTile.ts +32 -0
- package/src/addons/space/uncenter.ts +32 -0
- package/src/addons/space/unratio.ts +12 -0
- package/src/addons/space/viewZ2depth.ts +25 -0
- package/src/addons/space/windmillTile.ts +58 -0
- package/src/addons/space/xyz2equirect.ts +10 -0
- package/src/index.ts +10 -23
- package/src/node/build.ts +127 -0
- package/src/node/create.ts +76 -0
- package/src/node/index.ts +64 -49
- package/src/node/scope.ts +66 -62
- package/src/node/types.ts +221 -187
- package/src/node/utils/const.ts +74 -13
- package/src/node/utils/index.ts +19 -14
- package/src/node/utils/infer.ts +32 -34
- package/src/node/utils/parse.ts +48 -24
- package/src/node/utils/utils.ts +52 -29
- package/src/types.ts +11 -6
- package/src/utils/helpers.ts +56 -0
- package/src/utils/pipeline.ts +24 -8
- package/src/utils/program.ts +62 -38
- package/src/{webgl.ts → utils/webgl.ts} +46 -30
- package/src/{webgpu.ts → utils/webgpu.ts} +22 -17
- package/src/node/core.ts +0 -121
- package/src/node/node.ts +0 -65
|
@@ -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
|
+
})
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Fn, Float, Vec2, Vec3, Vec4, vec2, vec3, vec4, float, dot, sin } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const srandom = Fn(([x]: [Float]): Float => {
|
|
4
|
+
return float(-1).add(float(2).mul(x.sin().mul(43758.5453).fract()))
|
|
5
|
+
}).setLayout({
|
|
6
|
+
name: 'srandom',
|
|
7
|
+
type: 'float',
|
|
8
|
+
inputs: [{ name: 'x', type: 'float' }],
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
export const srandomVec2 = Fn(([st]: [Vec2]): Float => {
|
|
12
|
+
return float(-1).add(float(2).mul(st.dot(vec2(12.9898, 78.233)).sin().mul(43758.5453).fract()))
|
|
13
|
+
}).setLayout({
|
|
14
|
+
name: 'srandomVec2',
|
|
15
|
+
type: 'float',
|
|
16
|
+
inputs: [{ name: 'st', type: 'vec2' }],
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export const srandomVec3 = Fn(([pos]: [Vec3]): Float => {
|
|
20
|
+
return float(-1).add(float(2).mul(pos.dot(vec3(70.9898, 78.233, 32.4355)).sin().mul(43758.5453123).fract()))
|
|
21
|
+
}).setLayout({
|
|
22
|
+
name: 'srandomVec3',
|
|
23
|
+
type: 'float',
|
|
24
|
+
inputs: [{ name: 'pos', type: 'vec3' }],
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
export const srandomVec4 = Fn(([pos]: [Vec4]): Float => {
|
|
28
|
+
const dot_product = pos.dot(vec4(12.9898, 78.233, 45.164, 94.673)).toVar('dot_product')
|
|
29
|
+
return float(-1).add(float(2).mul(dot_product.sin().mul(43758.5453).fract()))
|
|
30
|
+
}).setLayout({
|
|
31
|
+
name: 'srandomVec4',
|
|
32
|
+
type: 'float',
|
|
33
|
+
inputs: [{ name: 'pos', type: 'vec4' }],
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
export const srandom2Vec2 = Fn(([st]: [Vec2]): Vec2 => {
|
|
37
|
+
const k = vec2(0.3183099, 0.3678794).toVar('k')
|
|
38
|
+
st.assign(st.mul(k).add(k.yx))
|
|
39
|
+
return vec2(-1).add(
|
|
40
|
+
vec2(2).mul(
|
|
41
|
+
float(16)
|
|
42
|
+
.mul(k)
|
|
43
|
+
.mul(st.x.mul(st.y).mul(st.x.add(st.y)).fract())
|
|
44
|
+
.fract()
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
}).setLayout({
|
|
48
|
+
name: 'srandom2Vec2',
|
|
49
|
+
type: 'vec2',
|
|
50
|
+
inputs: [{ name: 'st', type: 'vec2' }],
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
export const srandom3Vec3 = Fn(([p]: [Vec3]): Vec3 => {
|
|
54
|
+
p.assign(
|
|
55
|
+
vec3(
|
|
56
|
+
p.dot(vec3(127.1, 311.7, 74.7)),
|
|
57
|
+
p.dot(vec3(269.5, 183.3, 246.1)),
|
|
58
|
+
p.dot(vec3(113.5, 271.9, 124.6))
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
return float(-1).add(float(2).mul(p.sin().mul(43758.5453123).fract()))
|
|
62
|
+
}).setLayout({
|
|
63
|
+
name: 'srandom3Vec3',
|
|
64
|
+
type: 'vec3',
|
|
65
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
export const srandom2Vec2Tiled = Fn(([p, tileLength]: [Vec2, Float]): Vec2 => {
|
|
69
|
+
p.assign(p.mod(vec2(tileLength)))
|
|
70
|
+
return srandom2Vec2(p)
|
|
71
|
+
}).setLayout({
|
|
72
|
+
name: 'srandom2Vec2Tiled',
|
|
73
|
+
type: 'vec2',
|
|
74
|
+
inputs: [
|
|
75
|
+
{ name: 'p', type: 'vec2' },
|
|
76
|
+
{ name: 'tileLength', type: 'float' },
|
|
77
|
+
],
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
export const srandom3Vec3Tiled = Fn(([p, tileLength]: [Vec3, Float]): Vec3 => {
|
|
81
|
+
p.assign(p.mod(vec3(tileLength)))
|
|
82
|
+
return srandom3Vec3(p)
|
|
83
|
+
}).setLayout({
|
|
84
|
+
name: 'srandom3Vec3Tiled',
|
|
85
|
+
type: 'vec3',
|
|
86
|
+
inputs: [
|
|
87
|
+
{ name: 'p', type: 'vec3' },
|
|
88
|
+
{ name: 'tileLength', type: 'float' },
|
|
89
|
+
],
|
|
90
|
+
})
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Fn, Float, Vec2, Vec3, vec2, vec3, float, If } from '../../node'
|
|
2
|
+
import { random2Vec2 } from './random'
|
|
3
|
+
import { TAU } from '../math/const'
|
|
4
|
+
|
|
5
|
+
export const voronoi = Fn(([uv, time]: [Vec2, Float]): Vec3 => {
|
|
6
|
+
const i_uv = uv.floor().toVar('i_uv')
|
|
7
|
+
const f_uv = uv.fract().toVar('f_uv')
|
|
8
|
+
const rta = vec3(0, 0, 10).toVar('rta')
|
|
9
|
+
|
|
10
|
+
// Unroll nested loop: for j=-1 to 1, for i=-1 to 1
|
|
11
|
+
// j=-1, i=-1
|
|
12
|
+
const neighbor_m1m1 = vec2(-1, -1).toVar('neighbor_m1m1')
|
|
13
|
+
const point_m1m1 = random2Vec2(i_uv.add(neighbor_m1m1)).toVar('point_m1m1')
|
|
14
|
+
point_m1m1.assign(float(0.5).add(float(0.5).mul(time.add(point_m1m1.mul(TAU)).sin())))
|
|
15
|
+
const diff_m1m1 = neighbor_m1m1.add(point_m1m1).sub(f_uv).toVar('diff_m1m1')
|
|
16
|
+
const dist_m1m1 = diff_m1m1.length().toVar('dist_m1m1')
|
|
17
|
+
If(dist_m1m1.lessThan(rta.z), () => {
|
|
18
|
+
rta.xy.assign(point_m1m1)
|
|
19
|
+
rta.z.assign(dist_m1m1)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
// j=-1, i=0
|
|
23
|
+
const neighbor_0m1 = vec2(0, -1).toVar('neighbor_0m1')
|
|
24
|
+
const point_0m1 = random2Vec2(i_uv.add(neighbor_0m1)).toVar('point_0m1')
|
|
25
|
+
point_0m1.assign(float(0.5).add(float(0.5).mul(time.add(point_0m1.mul(TAU)).sin())))
|
|
26
|
+
const diff_0m1 = neighbor_0m1.add(point_0m1).sub(f_uv).toVar('diff_0m1')
|
|
27
|
+
const dist_0m1 = diff_0m1.length().toVar('dist_0m1')
|
|
28
|
+
If(dist_0m1.lessThan(rta.z), () => {
|
|
29
|
+
rta.xy.assign(point_0m1)
|
|
30
|
+
rta.z.assign(dist_0m1)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// j=-1, i=1
|
|
34
|
+
const neighbor_1m1 = vec2(1, -1).toVar('neighbor_1m1')
|
|
35
|
+
const point_1m1 = random2Vec2(i_uv.add(neighbor_1m1)).toVar('point_1m1')
|
|
36
|
+
point_1m1.assign(float(0.5).add(float(0.5).mul(time.add(point_1m1.mul(TAU)).sin())))
|
|
37
|
+
const diff_1m1 = neighbor_1m1.add(point_1m1).sub(f_uv).toVar('diff_1m1')
|
|
38
|
+
const dist_1m1 = diff_1m1.length().toVar('dist_1m1')
|
|
39
|
+
If(dist_1m1.lessThan(rta.z), () => {
|
|
40
|
+
rta.xy.assign(point_1m1)
|
|
41
|
+
rta.z.assign(dist_1m1)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// j=0, i=-1
|
|
45
|
+
const neighbor_m10 = vec2(-1, 0).toVar('neighbor_m10')
|
|
46
|
+
const point_m10 = random2Vec2(i_uv.add(neighbor_m10)).toVar('point_m10')
|
|
47
|
+
point_m10.assign(float(0.5).add(float(0.5).mul(time.add(point_m10.mul(TAU)).sin())))
|
|
48
|
+
const diff_m10 = neighbor_m10.add(point_m10).sub(f_uv).toVar('diff_m10')
|
|
49
|
+
const dist_m10 = diff_m10.length().toVar('dist_m10')
|
|
50
|
+
If(dist_m10.lessThan(rta.z), () => {
|
|
51
|
+
rta.xy.assign(point_m10)
|
|
52
|
+
rta.z.assign(dist_m10)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// j=0, i=0
|
|
56
|
+
const neighbor_00 = vec2(0, 0).toVar('neighbor_00')
|
|
57
|
+
const point_00 = random2Vec2(i_uv.add(neighbor_00)).toVar('point_00')
|
|
58
|
+
point_00.assign(float(0.5).add(float(0.5).mul(time.add(point_00.mul(TAU)).sin())))
|
|
59
|
+
const diff_00 = neighbor_00.add(point_00).sub(f_uv).toVar('diff_00')
|
|
60
|
+
const dist_00 = diff_00.length().toVar('dist_00')
|
|
61
|
+
If(dist_00.lessThan(rta.z), () => {
|
|
62
|
+
rta.xy.assign(point_00)
|
|
63
|
+
rta.z.assign(dist_00)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
// j=0, i=1
|
|
67
|
+
const neighbor_10 = vec2(1, 0).toVar('neighbor_10')
|
|
68
|
+
const point_10 = random2Vec2(i_uv.add(neighbor_10)).toVar('point_10')
|
|
69
|
+
point_10.assign(float(0.5).add(float(0.5).mul(time.add(point_10.mul(TAU)).sin())))
|
|
70
|
+
const diff_10 = neighbor_10.add(point_10).sub(f_uv).toVar('diff_10')
|
|
71
|
+
const dist_10 = diff_10.length().toVar('dist_10')
|
|
72
|
+
If(dist_10.lessThan(rta.z), () => {
|
|
73
|
+
rta.xy.assign(point_10)
|
|
74
|
+
rta.z.assign(dist_10)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
// j=1, i=-1
|
|
78
|
+
const neighbor_m11 = vec2(-1, 1).toVar('neighbor_m11')
|
|
79
|
+
const point_m11 = random2Vec2(i_uv.add(neighbor_m11)).toVar('point_m11')
|
|
80
|
+
point_m11.assign(float(0.5).add(float(0.5).mul(time.add(point_m11.mul(TAU)).sin())))
|
|
81
|
+
const diff_m11 = neighbor_m11.add(point_m11).sub(f_uv).toVar('diff_m11')
|
|
82
|
+
const dist_m11 = diff_m11.length().toVar('dist_m11')
|
|
83
|
+
If(dist_m11.lessThan(rta.z), () => {
|
|
84
|
+
rta.xy.assign(point_m11)
|
|
85
|
+
rta.z.assign(dist_m11)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
// j=1, i=0
|
|
89
|
+
const neighbor_01 = vec2(0, 1).toVar('neighbor_01')
|
|
90
|
+
const point_01 = random2Vec2(i_uv.add(neighbor_01)).toVar('point_01')
|
|
91
|
+
point_01.assign(float(0.5).add(float(0.5).mul(time.add(point_01.mul(TAU)).sin())))
|
|
92
|
+
const diff_01 = neighbor_01.add(point_01).sub(f_uv).toVar('diff_01')
|
|
93
|
+
const dist_01 = diff_01.length().toVar('dist_01')
|
|
94
|
+
If(dist_01.lessThan(rta.z), () => {
|
|
95
|
+
rta.xy.assign(point_01)
|
|
96
|
+
rta.z.assign(dist_01)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
// j=1, i=1
|
|
100
|
+
const neighbor_11 = vec2(1, 1).toVar('neighbor_11')
|
|
101
|
+
const point_11 = random2Vec2(i_uv.add(neighbor_11)).toVar('point_11')
|
|
102
|
+
point_11.assign(float(0.5).add(float(0.5).mul(time.add(point_11.mul(TAU)).sin())))
|
|
103
|
+
const diff_11 = neighbor_11.add(point_11).sub(f_uv).toVar('diff_11')
|
|
104
|
+
const dist_11 = diff_11.length().toVar('dist_11')
|
|
105
|
+
If(dist_11.lessThan(rta.z), () => {
|
|
106
|
+
rta.xy.assign(point_11)
|
|
107
|
+
rta.z.assign(dist_11)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
return rta
|
|
111
|
+
}).setLayout({
|
|
112
|
+
name: 'voronoi',
|
|
113
|
+
type: 'vec3',
|
|
114
|
+
inputs: [
|
|
115
|
+
{ name: 'uv', type: 'vec2' },
|
|
116
|
+
{ name: 'time', type: 'float' },
|
|
117
|
+
],
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
export const voronoiVec2 = Fn(([p]: [Vec2]): Vec3 => {
|
|
121
|
+
return voronoi(p, float(0))
|
|
122
|
+
}).setLayout({
|
|
123
|
+
name: 'voronoiVec2',
|
|
124
|
+
type: 'vec3',
|
|
125
|
+
inputs: [{ name: 'p', type: 'vec2' }],
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
export const voronoiVec3 = Fn(([p]: [Vec3]): Vec3 => {
|
|
129
|
+
return voronoi(p.xy, p.z)
|
|
130
|
+
}).setLayout({
|
|
131
|
+
name: 'voronoiVec3',
|
|
132
|
+
type: 'vec3',
|
|
133
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
134
|
+
})
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Fn, Float, Vec2, Vec3, vec2, vec3, int, smoothstep, float, Loop } from '../../node'
|
|
2
|
+
import { random3Vec2, random3Vec3 } from './random'
|
|
3
|
+
|
|
4
|
+
export const voronoise = Fn(([p, u, v]: [Vec2, Float, Float]): Float => {
|
|
5
|
+
const k = float(1)
|
|
6
|
+
.add(float(63).mul(float(1).sub(v).pow(float(6))))
|
|
7
|
+
.toVar('k')
|
|
8
|
+
const i = p.floor().toVar('i')
|
|
9
|
+
const f = p.fract().toVar('f')
|
|
10
|
+
const a = vec2(0, 0).toVar('a')
|
|
11
|
+
|
|
12
|
+
// 5x5 grid sampling from -2 to +2
|
|
13
|
+
Loop(int(5), ({ i: yLoop }) => {
|
|
14
|
+
const yOffset = yLoop.sub(int(2)).toFloat().toVar('yOffset')
|
|
15
|
+
Loop(int(5), ({ i: xLoop }) => {
|
|
16
|
+
const xOffset = xLoop.sub(int(2)).toFloat().toVar('xOffset')
|
|
17
|
+
const g = vec2(xOffset, yOffset).toVar('g')
|
|
18
|
+
const o = random3Vec2(i.add(g)).mul(vec3(u, u, 1)).toVar('o')
|
|
19
|
+
const d = g.sub(f).add(o.xy).toVar('d')
|
|
20
|
+
const w = float(1).sub(float(0).smoothstep(1.414, d.length())).pow(k).toVar('w')
|
|
21
|
+
a.addAssign(vec2(o.z.mul(w), w))
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
return a.x.div(a.y)
|
|
26
|
+
}).setLayout({
|
|
27
|
+
name: 'voronoise',
|
|
28
|
+
type: 'float',
|
|
29
|
+
inputs: [
|
|
30
|
+
{ name: 'p', type: 'vec2' },
|
|
31
|
+
{ name: 'u', type: 'float' },
|
|
32
|
+
{ name: 'v', type: 'float' },
|
|
33
|
+
],
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
export const voronoiseVec3 = Fn(([p, u, v]: [Vec3, Float, Float]): Float => {
|
|
37
|
+
const k = float(1)
|
|
38
|
+
.add(float(63).mul(float(1).sub(v).pow(float(6))))
|
|
39
|
+
.toVar('k')
|
|
40
|
+
const i = p.floor().toVar('i')
|
|
41
|
+
const f = p.fract().toVar('f')
|
|
42
|
+
const a = vec2(0, 0).toVar('a')
|
|
43
|
+
|
|
44
|
+
// 5x5x5 grid sampling from -2 to +2
|
|
45
|
+
Loop(int(5), ({ i: zLoop }) => {
|
|
46
|
+
const zOffset = zLoop.sub(int(2)).toFloat().toVar('zOffset')
|
|
47
|
+
Loop(int(5), ({ i: yLoop }) => {
|
|
48
|
+
const yOffset = yLoop.sub(int(2)).toFloat().toVar('yOffset')
|
|
49
|
+
Loop(int(5), ({ i: xLoop }) => {
|
|
50
|
+
const xOffset = xLoop.sub(int(2)).toFloat().toVar('xOffset')
|
|
51
|
+
const g = vec3(xOffset, yOffset, zOffset).toVar('g')
|
|
52
|
+
const o = random3Vec3(i.add(g)).mul(vec3(u, u, 1)).toVar('o')
|
|
53
|
+
const d = g.sub(f).add(o).add(0.5).toVar('d')
|
|
54
|
+
const w = float(1).sub(float(0).smoothstep(1.414, d.length())).pow(k).toVar('w')
|
|
55
|
+
a.addAssign(vec2(o.z.mul(w), w))
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return a.x.div(a.y)
|
|
61
|
+
}).setLayout({
|
|
62
|
+
name: 'voronoiseVec3',
|
|
63
|
+
type: 'float',
|
|
64
|
+
inputs: [
|
|
65
|
+
{ name: 'p', type: 'vec3' },
|
|
66
|
+
{ name: 'u', type: 'float' },
|
|
67
|
+
{ name: 'v', type: 'float' },
|
|
68
|
+
],
|
|
69
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Fn, Float, Vec2, Vec3, Loop, int, float, mat2 } from '../../node'
|
|
2
|
+
import { randomVec2 } from './random'
|
|
3
|
+
import { rotate2d } from '../math/rotate2d'
|
|
4
|
+
|
|
5
|
+
export const wavelet = Fn(([p, phase, k]: [Vec2, Float, Float]): Float => {
|
|
6
|
+
const d = float(0).toVar('d')
|
|
7
|
+
const s = float(1).toVar('s')
|
|
8
|
+
const m = float(0).toVar('m')
|
|
9
|
+
|
|
10
|
+
Loop(int(4), ({ i }) => {
|
|
11
|
+
const q = p.mul(s).toVar('q')
|
|
12
|
+
const a = randomVec2(q.floor()).mul(1000).toVar('a')
|
|
13
|
+
|
|
14
|
+
q.assign(q.fract().sub(0.5).mul(rotate2d(a)))
|
|
15
|
+
|
|
16
|
+
d.addAssign(
|
|
17
|
+
q.x
|
|
18
|
+
.mul(10)
|
|
19
|
+
.add(phase)
|
|
20
|
+
.sin()
|
|
21
|
+
.mul(float(0.25).smoothstep(0, q.dot(q)))
|
|
22
|
+
.div(s)
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
p.assign(p.mul(mat2(0.54, -0.84, 0.84, 0.54)).add(i.toFloat()))
|
|
26
|
+
m.addAssign(float(1).div(s))
|
|
27
|
+
s.mulAssign(k)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return d.div(m)
|
|
31
|
+
}).setLayout({
|
|
32
|
+
name: 'wavelet',
|
|
33
|
+
type: 'float',
|
|
34
|
+
inputs: [
|
|
35
|
+
{ name: 'p', type: 'vec2' },
|
|
36
|
+
{ name: 'phase', type: 'float' },
|
|
37
|
+
{ name: 'k', type: 'float' },
|
|
38
|
+
],
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export const waveletVec3K = Fn(([p, k]: [Vec3, Float]): Float => {
|
|
42
|
+
return wavelet(p.xy, p.z, k)
|
|
43
|
+
}).setLayout({
|
|
44
|
+
name: 'waveletVec3K',
|
|
45
|
+
type: 'float',
|
|
46
|
+
inputs: [
|
|
47
|
+
{ name: 'p', type: 'vec3' },
|
|
48
|
+
{ name: 'k', type: 'float' },
|
|
49
|
+
],
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
export const waveletVec3 = Fn(([p]: [Vec3]): Float => {
|
|
53
|
+
return waveletVec3K(p, float(1.24))
|
|
54
|
+
}).setLayout({
|
|
55
|
+
name: 'waveletVec3',
|
|
56
|
+
type: 'float',
|
|
57
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
export const waveletVec2Phase = Fn(([p, phase]: [Vec2, Float]): Float => {
|
|
61
|
+
return wavelet(p, phase, float(1.24))
|
|
62
|
+
}).setLayout({
|
|
63
|
+
name: 'waveletVec2Phase',
|
|
64
|
+
type: 'float',
|
|
65
|
+
inputs: [
|
|
66
|
+
{ name: 'p', type: 'vec2' },
|
|
67
|
+
{ name: 'phase', type: 'float' },
|
|
68
|
+
],
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
export const waveletVec2 = Fn(([p]: [Vec2]): Float => {
|
|
72
|
+
return wavelet(p, float(0), float(1.24))
|
|
73
|
+
}).setLayout({
|
|
74
|
+
name: 'waveletVec2',
|
|
75
|
+
type: 'float',
|
|
76
|
+
inputs: [{ name: 'p', type: 'vec2' }],
|
|
77
|
+
})
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Fn, Float, Vec2, Vec3, Loop, int, float, vec2, vec3, If } from '../../node'
|
|
2
|
+
import { random2Vec2, random3Vec3 } from './random'
|
|
3
|
+
import { distEuclidean } from '../math/dist'
|
|
4
|
+
|
|
5
|
+
export const worley2Vec2 = Fn(([p]: [Vec2]): Vec2 => {
|
|
6
|
+
const n = p.floor().toVar('n')
|
|
7
|
+
const f = p.fract().toVar('f')
|
|
8
|
+
const distF1 = float(1).toVar('distF1')
|
|
9
|
+
const distF2 = float(1).toVar('distF2')
|
|
10
|
+
const off1 = vec2(0).toVar('off1')
|
|
11
|
+
const pos1 = vec2(0).toVar('pos1')
|
|
12
|
+
const off2 = vec2(0).toVar('off2')
|
|
13
|
+
const pos2 = vec2(0).toVar('pos2')
|
|
14
|
+
|
|
15
|
+
Loop(int(3), ({ i }) => {
|
|
16
|
+
Loop(int(3), ({ i: j }) => {
|
|
17
|
+
const g = vec2(i.toFloat().sub(1), j.toFloat().sub(1)).toVar('g')
|
|
18
|
+
const o = random2Vec2(n.add(g)).mul(1).toVar('o')
|
|
19
|
+
const point = g.add(o).toVar('point')
|
|
20
|
+
const d = distEuclidean(point, f).toVar('d')
|
|
21
|
+
|
|
22
|
+
If(d.lessThan(distF1), () => {
|
|
23
|
+
distF2.assign(distF1)
|
|
24
|
+
distF1.assign(d)
|
|
25
|
+
off2.assign(off1)
|
|
26
|
+
off1.assign(g)
|
|
27
|
+
pos2.assign(pos1)
|
|
28
|
+
pos1.assign(point)
|
|
29
|
+
}).ElseIf(d.lessThan(distF2), () => {
|
|
30
|
+
distF2.assign(d)
|
|
31
|
+
off2.assign(g)
|
|
32
|
+
pos2.assign(point)
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
return vec2(distF1, distF2)
|
|
38
|
+
}).setLayout({
|
|
39
|
+
name: 'worley2Vec2',
|
|
40
|
+
type: 'vec2',
|
|
41
|
+
inputs: [{ name: 'p', type: 'vec2' }],
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export const worleyVec2 = Fn(([p]: [Vec2]): Float => {
|
|
45
|
+
return float(1).sub(worley2Vec2(p).x)
|
|
46
|
+
}).setLayout({
|
|
47
|
+
name: 'worleyVec2',
|
|
48
|
+
type: 'float',
|
|
49
|
+
inputs: [{ name: 'p', type: 'vec2' }],
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
export const worley2Vec3 = Fn(([p]: [Vec3]): Vec2 => {
|
|
53
|
+
const n = p.floor().toVar('n')
|
|
54
|
+
const f = p.fract().toVar('f')
|
|
55
|
+
const distF1 = float(1).toVar('distF1')
|
|
56
|
+
const distF2 = float(1).toVar('distF2')
|
|
57
|
+
const off1 = vec3(0).toVar('off1')
|
|
58
|
+
const pos1 = vec3(0).toVar('pos1')
|
|
59
|
+
const off2 = vec3(0).toVar('off2')
|
|
60
|
+
const pos2 = vec3(0).toVar('pos2')
|
|
61
|
+
|
|
62
|
+
Loop(int(3), ({ i }) => {
|
|
63
|
+
Loop(int(3), ({ i: j }) => {
|
|
64
|
+
Loop(int(3), ({ i: k }) => {
|
|
65
|
+
const g = vec3(i.toFloat().sub(1), j.toFloat().sub(1), k.toFloat().sub(1)).toVar('g')
|
|
66
|
+
const o = random3Vec3(n.add(g)).mul(1).toVar('o')
|
|
67
|
+
const point = g.add(o).toVar('point')
|
|
68
|
+
const d = distEuclidean(point, f).toVar('d')
|
|
69
|
+
|
|
70
|
+
If(d.lessThan(distF1), () => {
|
|
71
|
+
distF2.assign(distF1)
|
|
72
|
+
distF1.assign(d)
|
|
73
|
+
off2.assign(off1)
|
|
74
|
+
off1.assign(g)
|
|
75
|
+
pos2.assign(pos1)
|
|
76
|
+
pos1.assign(point)
|
|
77
|
+
}).ElseIf(d.lessThan(distF2), () => {
|
|
78
|
+
distF2.assign(d)
|
|
79
|
+
off2.assign(g)
|
|
80
|
+
pos2.assign(point)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
return vec2(distF1, distF2)
|
|
87
|
+
}).setLayout({
|
|
88
|
+
name: 'worley2Vec3',
|
|
89
|
+
type: 'vec2',
|
|
90
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
export const worleyVec3 = Fn(([p]: [Vec3]): Float => {
|
|
94
|
+
return float(1).sub(worley2Vec3(p).x)
|
|
95
|
+
}).setLayout({
|
|
96
|
+
name: 'worleyVec3',
|
|
97
|
+
type: 'float',
|
|
98
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
99
|
+
})
|