glre 0.41.0 → 0.43.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/dist/addons.cjs +1 -1
- package/dist/addons.cjs.map +1 -1
- package/dist/addons.d.ts +379 -7
- package/dist/addons.js +1 -1
- package/dist/addons.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +3 -0
- package/dist/node.cjs +12 -12
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +2 -1
- package/dist/node.js +12 -12
- package/dist/node.js.map +1 -1
- package/dist/react.d.ts +2 -0
- package/dist/solid.d.ts +2 -0
- package/package.json +1 -1
- package/src/addons/color/blend/add.ts +35 -0
- package/src/addons/color/blend/average.ts +35 -0
- package/src/addons/color/blend/color.ts +28 -0
- package/src/addons/color/blend/colorBurn.ts +35 -0
- package/src/addons/color/blend/colorDodge.ts +39 -0
- package/src/addons/color/blend/darken.ts +35 -0
- package/src/addons/color/blend/difference.ts +35 -0
- package/src/addons/color/blend/exclusion.ts +35 -0
- package/src/addons/color/blend/glow.ts +36 -0
- package/src/addons/color/blend/hardLight.ts +36 -0
- package/src/addons/color/blend/hardMix.ts +39 -0
- package/src/addons/color/blend/hue.ts +29 -0
- package/src/addons/color/blend/index.ts +28 -0
- package/src/addons/color/blend/lighten.ts +35 -0
- package/src/addons/color/blend/linearBurn.ts +39 -0
- package/src/addons/color/blend/linearDodge.ts +39 -0
- package/src/addons/color/blend/linearLight.ts +44 -0
- package/src/addons/color/blend/luminosity.ts +28 -0
- package/src/addons/color/blend/multiply.ts +35 -0
- package/src/addons/color/blend/negation.ts +35 -0
- package/src/addons/color/blend/overlay.ts +38 -0
- package/src/addons/color/blend/phoenix.ts +35 -0
- package/src/addons/color/blend/pinLight.ts +40 -0
- package/src/addons/color/blend/reflect.ts +35 -0
- package/src/addons/color/blend/saturation.ts +28 -0
- package/src/addons/color/blend/screen.ts +39 -0
- package/src/addons/color/blend/softLight.ts +63 -0
- package/src/addons/color/blend/subtract.ts +37 -0
- package/src/addons/color/blend/vividLight.ts +44 -0
- package/src/addons/color/composite/compositeXor.ts +40 -0
- package/src/addons/color/composite/destinationAtop.ts +42 -0
- package/src/addons/color/composite/destinationIn.ts +42 -0
- package/src/addons/color/composite/destinationOut.ts +42 -0
- package/src/addons/color/composite/destinationOver.ts +42 -0
- package/src/addons/color/composite/index.ts +9 -0
- package/src/addons/color/composite/sourceAtop.ts +42 -0
- package/src/addons/color/composite/sourceIn.ts +40 -0
- package/src/addons/color/composite/sourceOut.ts +40 -0
- package/src/addons/color/composite/sourceOver.ts +40 -0
- package/src/addons/color/palette/macbeth.ts +31 -33
- package/src/addons/draw/arrows.ts +34 -48
- package/src/addons/draw/axis.ts +24 -42
- package/src/addons/draw/bridge.ts +4 -4
- package/src/addons/draw/char.ts +235 -18
- package/src/addons/draw/circle.ts +22 -1
- package/src/addons/draw/colorChecker.ts +42 -0
- package/src/addons/draw/colorPicker.ts +66 -0
- package/src/addons/draw/digits.ts +334 -0
- package/src/addons/draw/index.ts +4 -0
- package/src/addons/draw/matrix.ts +26 -0
- package/src/addons/draw/point.ts +24 -11
- package/src/addons/geometry/triangle/closestPoint.ts +7 -7
- package/src/addons/index.ts +3 -0
- package/src/addons/math/const.ts +4 -4
- package/src/addons/math/mod289.ts +1 -6
- package/src/addons/math/powFast.ts +4 -10
- package/src/addons/math/quartic.ts +6 -11
- package/src/addons/math/quat/quatLerp.ts +3 -3
- package/src/addons/math/quintic.ts +7 -12
- package/src/addons/math/rotate2d.ts +1 -6
- package/src/addons/math/rotate3d.ts +4 -10
- package/src/addons/math/rotate3dX.ts +3 -12
- package/src/addons/math/rotate3dY.ts +3 -12
- package/src/addons/math/rotate3dZ.ts +3 -12
- package/src/addons/math/rotate4d.ts +4 -10
- package/src/addons/math/rotate4dX.ts +3 -13
- package/src/addons/math/rotate4dY.ts +1 -6
- package/src/addons/math/rotate4dZ.ts +3 -13
- package/src/addons/math/scale2d.ts +16 -32
- package/src/addons/math/toMat3.ts +1 -6
- package/src/addons/math/toMat4.ts +1 -6
- package/src/addons/sdf/arrowSDF.ts +61 -0
- package/src/addons/sdf/boxFrameSDF.ts +31 -0
- package/src/addons/sdf/boxSDF.ts +4 -6
- package/src/addons/sdf/capsuleSDF.ts +17 -0
- package/src/addons/sdf/coneSDF.ts +60 -0
- package/src/addons/sdf/crossSDF.ts +4 -7
- package/src/addons/sdf/cubeSDF.ts +13 -0
- package/src/addons/sdf/cylinderSDF.ts +65 -0
- package/src/addons/sdf/dodecahedronSDF.ts +32 -0
- package/src/addons/sdf/ellipsoidSDF.ts +14 -0
- package/src/addons/sdf/flowerSDF.ts +16 -0
- package/src/addons/sdf/gearSDF.ts +22 -0
- package/src/addons/sdf/heartSDF.ts +17 -0
- package/src/addons/sdf/hexPrismSDF.ts +15 -0
- package/src/addons/sdf/hexSDF.ts +8 -15
- package/src/addons/sdf/icosahedronSDF.ts +23 -0
- package/src/addons/sdf/index.ts +41 -0
- package/src/addons/sdf/juliaSDF.ts +39 -0
- package/src/addons/sdf/kochSDF.ts +49 -0
- package/src/addons/sdf/linkSDF.ts +15 -0
- package/src/addons/sdf/mandelbulbSDF.ts +41 -0
- package/src/addons/sdf/octahedronSDF.ts +30 -0
- package/src/addons/sdf/octogonPrismSDF.ts +19 -0
- package/src/addons/sdf/opElongate.ts +35 -0
- package/src/addons/sdf/opExtrude.ts +14 -0
- package/src/addons/sdf/opIntersection.ts +25 -0
- package/src/addons/sdf/opOnion.ts +12 -0
- package/src/addons/sdf/opRepeat.ts +49 -0
- package/src/addons/sdf/opRevolve.ts +12 -0
- package/src/addons/sdf/opRound.ts +12 -0
- package/src/addons/sdf/opSubtraction.ts +50 -0
- package/src/addons/sdf/opUnion.ts +39 -0
- package/src/addons/sdf/planeSDF.ts +21 -0
- package/src/addons/sdf/polySDF.ts +32 -0
- package/src/addons/sdf/pyramidSDF.ts +29 -0
- package/src/addons/sdf/raysSDF.ts +14 -0
- package/src/addons/sdf/rhombSDF.ts +10 -0
- package/src/addons/sdf/spiralSDF.ts +15 -0
- package/src/addons/sdf/starSDF.ts +47 -0
- package/src/addons/sdf/superShapeSDF.ts +73 -0
- package/src/addons/sdf/tetrahedronSDF.ts +21 -0
- package/src/addons/sdf/torusSDF.ts +27 -0
- package/src/addons/sdf/triPrismSDF.ts +13 -0
- package/src/addons/sdf/triSDF.ts +19 -11
- package/src/addons/sdf/vesicaSDF.ts +23 -0
- package/src/addons/space/bracketing.ts +1 -2
- package/src/addons/space/kaleidoscope.ts +1 -2
- package/src/addons/space/scale.ts +42 -7
- package/src/addons/space/windmillTile.ts +2 -1
- package/src/index.ts +1 -0
- package/src/node/create.ts +2 -3
- package/src/node/utils/index.ts +2 -2
- package/src/types.ts +1 -0
- package/src/utils/webgl.ts +7 -0
|
@@ -3,18 +3,9 @@ import { Fn, Float, Mat3, mat3, vec3 } from '../../node'
|
|
|
3
3
|
export const rotate3dY = Fn(([r]: [Float]): Mat3 => {
|
|
4
4
|
const c = r.cos()
|
|
5
5
|
const s = r.sin()
|
|
6
|
-
return mat3(
|
|
7
|
-
vec3(c, 0, s.negate()),
|
|
8
|
-
vec3(0, 1, 0),
|
|
9
|
-
vec3(s, 0, c)
|
|
10
|
-
)
|
|
6
|
+
return mat3(vec3(c, 0, s.negate()), vec3(0, 1, 0), vec3(s, 0, c))
|
|
11
7
|
}).setLayout({
|
|
12
8
|
name: 'rotate3dY',
|
|
13
9
|
type: 'mat3',
|
|
14
|
-
inputs: [
|
|
15
|
-
|
|
16
|
-
name: 'r',
|
|
17
|
-
type: 'float'
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
})
|
|
10
|
+
inputs: [{ name: 'r', type: 'float' }],
|
|
11
|
+
})
|
|
@@ -3,18 +3,9 @@ import { Fn, Float, Mat3, mat3, vec3 } from '../../node'
|
|
|
3
3
|
export const rotate3dZ = Fn(([r]: [Float]): Mat3 => {
|
|
4
4
|
const c = r.cos()
|
|
5
5
|
const s = r.sin()
|
|
6
|
-
return mat3(
|
|
7
|
-
vec3(c, s, 0),
|
|
8
|
-
vec3(s.negate(), c, 0),
|
|
9
|
-
vec3(0, 0, 1)
|
|
10
|
-
)
|
|
6
|
+
return mat3(vec3(c, s, 0), vec3(s.negate(), c, 0), vec3(0, 0, 1))
|
|
11
7
|
}).setLayout({
|
|
12
8
|
name: 'rotate3dZ',
|
|
13
9
|
type: 'mat3',
|
|
14
|
-
inputs: [
|
|
15
|
-
|
|
16
|
-
name: 'r',
|
|
17
|
-
type: 'float'
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
})
|
|
10
|
+
inputs: [{ name: 'r', type: 'float' }],
|
|
11
|
+
})
|
|
@@ -29,13 +29,7 @@ export const rotate4d = Fn(([a, r]: [Vec3, Float]): Mat4 => {
|
|
|
29
29
|
name: 'rotate4d',
|
|
30
30
|
type: 'mat4',
|
|
31
31
|
inputs: [
|
|
32
|
-
{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
name: 'r',
|
|
38
|
-
type: 'float'
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
})
|
|
32
|
+
{ name: 'a', type: 'vec3' },
|
|
33
|
+
{ name: 'r', type: 'float' },
|
|
34
|
+
],
|
|
35
|
+
})
|
|
@@ -3,19 +3,9 @@ import { Fn, Float, Mat4, mat4, vec4 } from '../../node'
|
|
|
3
3
|
export const rotate4dX = Fn(([r]: [Float]): Mat4 => {
|
|
4
4
|
const c = r.cos()
|
|
5
5
|
const s = r.sin()
|
|
6
|
-
return mat4(
|
|
7
|
-
vec4(1, 0, 0, 0),
|
|
8
|
-
vec4(0, c, s, 0),
|
|
9
|
-
vec4(0, s.negate(), c, 0),
|
|
10
|
-
vec4(0, 0, 0, 1)
|
|
11
|
-
)
|
|
6
|
+
return mat4(vec4(1, 0, 0, 0), vec4(0, c, s, 0), vec4(0, s.negate(), c, 0), vec4(0, 0, 0, 1))
|
|
12
7
|
}).setLayout({
|
|
13
8
|
name: 'rotate4dX',
|
|
14
9
|
type: 'mat4',
|
|
15
|
-
inputs: [
|
|
16
|
-
|
|
17
|
-
name: 'r',
|
|
18
|
-
type: 'float'
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
})
|
|
10
|
+
inputs: [{ name: 'r', type: 'float' }],
|
|
11
|
+
})
|
|
@@ -3,19 +3,9 @@ import { Fn, Float, Mat4, mat4, vec4 } from '../../node'
|
|
|
3
3
|
export const rotate4dZ = Fn(([r]: [Float]): Mat4 => {
|
|
4
4
|
const c = r.cos()
|
|
5
5
|
const s = r.sin()
|
|
6
|
-
return mat4(
|
|
7
|
-
vec4(c, s, 0, 0),
|
|
8
|
-
vec4(s.negate(), c, 0, 0),
|
|
9
|
-
vec4(0, 0, 1, 0),
|
|
10
|
-
vec4(0, 0, 0, 1)
|
|
11
|
-
)
|
|
6
|
+
return mat4(vec4(c, s, 0, 0), vec4(s.negate(), c, 0, 0), vec4(0, 0, 1, 0), vec4(0, 0, 0, 1))
|
|
12
7
|
}).setLayout({
|
|
13
8
|
name: 'rotate4dZ',
|
|
14
9
|
type: 'mat4',
|
|
15
|
-
inputs: [
|
|
16
|
-
|
|
17
|
-
name: 'r',
|
|
18
|
-
type: 'float'
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
})
|
|
10
|
+
inputs: [{ name: 'r', type: 'float' }],
|
|
11
|
+
})
|
|
@@ -1,44 +1,28 @@
|
|
|
1
1
|
import { Fn, Float, Vec2, mat2, Mat2 } from '../../node'
|
|
2
2
|
|
|
3
3
|
export const scale2d = Fn(([s]: [Float]): Mat2 => {
|
|
4
|
-
|
|
4
|
+
return mat2(s, 0, 0, s)
|
|
5
5
|
}).setLayout({
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{
|
|
10
|
-
name: 's',
|
|
11
|
-
type: 'float',
|
|
12
|
-
},
|
|
13
|
-
]
|
|
6
|
+
name: 'scale2d',
|
|
7
|
+
type: 'mat2',
|
|
8
|
+
inputs: [{ name: 's', type: 'float' }],
|
|
14
9
|
})
|
|
15
10
|
|
|
16
11
|
export const scale2dVec = Fn(([s]: [Vec2]): Mat2 => {
|
|
17
|
-
|
|
12
|
+
return mat2(s.x, 0, 0, s.y)
|
|
18
13
|
}).setLayout({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
{
|
|
23
|
-
name: 's',
|
|
24
|
-
type: 'vec2',
|
|
25
|
-
},
|
|
26
|
-
]
|
|
14
|
+
name: 'scale2d',
|
|
15
|
+
type: 'mat2',
|
|
16
|
+
inputs: [{ name: 's', type: 'vec2' }],
|
|
27
17
|
})
|
|
28
18
|
|
|
29
19
|
export const scale2dXY = Fn(([x, y]: [Float, Float]): Mat2 => {
|
|
30
|
-
|
|
20
|
+
return mat2(x, 0, 0, y)
|
|
31
21
|
}).setLayout({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
name: 'y',
|
|
41
|
-
type: 'float',
|
|
42
|
-
},
|
|
43
|
-
]
|
|
44
|
-
})
|
|
22
|
+
name: 'scale2d',
|
|
23
|
+
type: 'mat2',
|
|
24
|
+
inputs: [
|
|
25
|
+
{ name: 'x', type: 'float' },
|
|
26
|
+
{ name: 'y', type: 'float' },
|
|
27
|
+
],
|
|
28
|
+
})
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Fn, Vec3, Float, vec3, vec2, mat3, float, If } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const arrowSDF = Fn(
|
|
4
|
+
([v, start, end, baseRadius, tipRadius, tipHeight]: [Vec3, Vec3, Vec3, Float, Float, Float]): Float => {
|
|
5
|
+
const t = start.sub(end).toVar('t')
|
|
6
|
+
const l = t.length().toVar('l')
|
|
7
|
+
t.assign(t.div(l))
|
|
8
|
+
l.assign(l.max(tipHeight))
|
|
9
|
+
v.assign(v.sub(end))
|
|
10
|
+
|
|
11
|
+
If(t.y.add(1).lessThan(0.0001), () => {
|
|
12
|
+
v.assign(vec3(v.x, v.y.negate(), v.z))
|
|
13
|
+
}).Else(() => {
|
|
14
|
+
const k = float(1).div(float(1).add(t.y)).toVar('k')
|
|
15
|
+
const column1 = vec3(t.z.mul(t.z).mul(k).add(t.y), t.x, t.z.mul(t.x.negate()).mul(k)).toVar(
|
|
16
|
+
'column1'
|
|
17
|
+
)
|
|
18
|
+
const column2 = vec3(t.x.negate(), t.y, t.z.negate()).toVar('column2')
|
|
19
|
+
const column3 = vec3(t.x.negate().mul(t.z).mul(k), t.z, t.x.mul(t.x).mul(k).add(t.y)).toVar(
|
|
20
|
+
'column3'
|
|
21
|
+
)
|
|
22
|
+
v.assign(
|
|
23
|
+
mat3(
|
|
24
|
+
column1.x,
|
|
25
|
+
column1.y,
|
|
26
|
+
column1.z,
|
|
27
|
+
column2.x,
|
|
28
|
+
column2.y,
|
|
29
|
+
column2.z,
|
|
30
|
+
column3.x,
|
|
31
|
+
column3.y,
|
|
32
|
+
column3.z
|
|
33
|
+
).mul(v)
|
|
34
|
+
)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const q = vec2(vec2(v.x, v.z).length(), v.y).toVar('q')
|
|
38
|
+
q.assign(vec2(q.x.abs(), q.y))
|
|
39
|
+
const e = vec2(tipRadius, tipHeight).toVar('e')
|
|
40
|
+
const h = q.dot(e).div(e.dot(e)).clamp(0, 1).toVar('h')
|
|
41
|
+
const d1 = q.sub(e.mul(h)).toVar('d1')
|
|
42
|
+
const d2 = q.sub(vec2(tipRadius, tipHeight)).toVar('d2')
|
|
43
|
+
d2.assign(vec2(d2.x.sub(d2.x.clamp(baseRadius.sub(tipRadius), 0)), d2.y))
|
|
44
|
+
const d3 = q.sub(vec2(baseRadius, tipHeight)).toVar('d3')
|
|
45
|
+
d3.assign(vec2(d3.x, d3.y.sub(d3.y.clamp(0, l.sub(tipHeight)))))
|
|
46
|
+
const d4 = vec2(q.y.sub(l), q.x.sub(baseRadius).max(0)).toVar('d4')
|
|
47
|
+
const s = d1.x.max(d1.y.negate()).max(d4.x).max(d2.y.min(d3.x)).toVar('s')
|
|
48
|
+
return d1.dot(d1).min(d2.dot(d2)).min(d3.dot(d3)).min(d4.dot(d4)).sqrt().mul(s.sign())
|
|
49
|
+
}
|
|
50
|
+
).setLayout({
|
|
51
|
+
name: 'arrowSDF',
|
|
52
|
+
type: 'float',
|
|
53
|
+
inputs: [
|
|
54
|
+
{ name: 'v', type: 'vec3' },
|
|
55
|
+
{ name: 'start', type: 'vec3' },
|
|
56
|
+
{ name: 'end', type: 'vec3' },
|
|
57
|
+
{ name: 'baseRadius', type: 'float' },
|
|
58
|
+
{ name: 'tipRadius', type: 'float' },
|
|
59
|
+
{ name: 'tipHeight', type: 'float' },
|
|
60
|
+
],
|
|
61
|
+
})
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Fn, Vec3, Float, vec3 } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const boxFrameSDF = Fn(([p, b, e]: [Vec3, Vec3, Float]): Float => {
|
|
4
|
+
const p_abs = p.abs().sub(b).toVar('p_abs')
|
|
5
|
+
const q = p_abs.add(e).abs().sub(e).toVar('q')
|
|
6
|
+
|
|
7
|
+
const term1 = vec3(p_abs.x, q.y, q.z)
|
|
8
|
+
.max(vec3(0))
|
|
9
|
+
.length()
|
|
10
|
+
.add(p_abs.x.max(q.y.max(q.z)).min(0))
|
|
11
|
+
|
|
12
|
+
const term2 = vec3(q.x, p_abs.y, q.z)
|
|
13
|
+
.max(vec3(0))
|
|
14
|
+
.length()
|
|
15
|
+
.add(q.x.max(p_abs.y.max(q.z)).min(0))
|
|
16
|
+
|
|
17
|
+
const term3 = vec3(q.x, q.y, p_abs.z)
|
|
18
|
+
.max(vec3(0))
|
|
19
|
+
.length()
|
|
20
|
+
.add(q.x.max(q.y.max(p_abs.z)).min(0))
|
|
21
|
+
|
|
22
|
+
return term1.min(term2).min(term3)
|
|
23
|
+
}).setLayout({
|
|
24
|
+
name: 'boxFrameSDF',
|
|
25
|
+
type: 'float',
|
|
26
|
+
inputs: [
|
|
27
|
+
{ name: 'p', type: 'vec3' },
|
|
28
|
+
{ name: 'b', type: 'vec3' },
|
|
29
|
+
{ name: 'e', type: 'float' },
|
|
30
|
+
],
|
|
31
|
+
})
|
package/src/addons/sdf/boxSDF.ts
CHANGED
|
@@ -6,9 +6,7 @@ export const boxSDF = Fn(([p]: [Vec3]) => {
|
|
|
6
6
|
}).setLayout({
|
|
7
7
|
name: 'boxSDF',
|
|
8
8
|
type: 'float',
|
|
9
|
-
inputs: [
|
|
10
|
-
{ name: 'p', type: 'vec3' }
|
|
11
|
-
]
|
|
9
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
12
10
|
})
|
|
13
11
|
|
|
14
12
|
export const boxSDFSize = Fn(([p, b]: [Vec3, Vec3]) => {
|
|
@@ -19,6 +17,6 @@ export const boxSDFSize = Fn(([p, b]: [Vec3, Vec3]) => {
|
|
|
19
17
|
type: 'float',
|
|
20
18
|
inputs: [
|
|
21
19
|
{ name: 'p', type: 'vec3' },
|
|
22
|
-
{ name: 'b', type: 'vec3' }
|
|
23
|
-
]
|
|
24
|
-
})
|
|
20
|
+
{ name: 'b', type: 'vec3' },
|
|
21
|
+
],
|
|
22
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Fn, Vec3, Float } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const capsuleSDF = Fn(([p, a, b, r]: [Vec3, Vec3, Vec3, Float]): Float => {
|
|
4
|
+
const pa = p.sub(a).toVar('pa')
|
|
5
|
+
const ba = b.sub(a).toVar('ba')
|
|
6
|
+
const h = pa.dot(ba).div(ba.dot(ba)).clamp(0, 1).toVar('h')
|
|
7
|
+
return pa.sub(ba.mul(h)).length().sub(r)
|
|
8
|
+
}).setLayout({
|
|
9
|
+
name: 'capsuleSDF',
|
|
10
|
+
type: 'float',
|
|
11
|
+
inputs: [
|
|
12
|
+
{ name: 'p', type: 'vec3' },
|
|
13
|
+
{ name: 'a', type: 'vec3' },
|
|
14
|
+
{ name: 'b', type: 'vec3' },
|
|
15
|
+
{ name: 'r', type: 'float' },
|
|
16
|
+
],
|
|
17
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec2, Float, vec2, If } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const coneSDF = Fn(([p, c]: [Vec3, Vec3]): Float => {
|
|
4
|
+
const q = vec2(vec2(p.x, p.z).length(), p.y).toVar('q')
|
|
5
|
+
const d1 = q.y.negate().sub(c.z).toVar('d1')
|
|
6
|
+
const d2 = q.dot(vec2(c.x, c.y)).max(q.y).toVar('d2')
|
|
7
|
+
return vec2(d1, d2).max(0).length().add(d1.max(d2).min(0))
|
|
8
|
+
}).setLayout({
|
|
9
|
+
name: 'coneSDF',
|
|
10
|
+
type: 'float',
|
|
11
|
+
inputs: [
|
|
12
|
+
{ name: 'p', type: 'vec3' },
|
|
13
|
+
{ name: 'c', type: 'vec3' },
|
|
14
|
+
],
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
export const coneSDFVec2Height = Fn(([p, c, h]: [Vec3, Vec2, Float]): Float => {
|
|
18
|
+
const q = h.mul(vec2(c.x, c.y.negate())).div(c.y).toVar('q')
|
|
19
|
+
const w = vec2(vec2(p.x, p.z).length(), p.y).toVar('w')
|
|
20
|
+
const a = w.sub(q.mul(w.dot(q).div(q.dot(q)).clamp(0, 1))).toVar('a')
|
|
21
|
+
const b = w.sub(q.mul(vec2(w.x.div(q.x).clamp(0, 1), 1))).toVar('b')
|
|
22
|
+
const k = q.y.sign().toVar('k')
|
|
23
|
+
const d = a.dot(a).min(b.dot(b)).toVar('d')
|
|
24
|
+
const s = k
|
|
25
|
+
.mul(w.x.mul(q.y).sub(w.y.mul(q.x)))
|
|
26
|
+
.max(k.mul(w.y.sub(q.y)))
|
|
27
|
+
.toVar('s')
|
|
28
|
+
return d.sqrt().mul(s.sign())
|
|
29
|
+
}).setLayout({
|
|
30
|
+
name: 'coneSDFVec2Height',
|
|
31
|
+
type: 'float',
|
|
32
|
+
inputs: [
|
|
33
|
+
{ name: 'p', type: 'vec3' },
|
|
34
|
+
{ name: 'c', type: 'vec2' },
|
|
35
|
+
{ name: 'h', type: 'float' },
|
|
36
|
+
],
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export const coneSDFRadii = Fn(([p, r1, r2, h]: [Vec3, Float, Float, Float]): Float => {
|
|
40
|
+
const q = vec2(vec2(p.x, p.z).length(), p.y).toVar('q')
|
|
41
|
+
const b = r1.sub(r2).div(h).toVar('b')
|
|
42
|
+
const a = b.mul(b).oneMinus().sqrt().toVar('a')
|
|
43
|
+
const k = q.dot(vec2(b.negate(), a)).toVar('k')
|
|
44
|
+
If(k.lessThan(0), () => {
|
|
45
|
+
return q.length().sub(r1)
|
|
46
|
+
})
|
|
47
|
+
If(k.greaterThan(a.mul(h)), () => {
|
|
48
|
+
return q.sub(vec2(0, h)).length().sub(r2)
|
|
49
|
+
})
|
|
50
|
+
return q.dot(vec2(a, b)).sub(r1)
|
|
51
|
+
}).setLayout({
|
|
52
|
+
name: 'coneSDFRadii',
|
|
53
|
+
type: 'float',
|
|
54
|
+
inputs: [
|
|
55
|
+
{ name: 'p', type: 'vec3' },
|
|
56
|
+
{ name: 'r1', type: 'float' },
|
|
57
|
+
{ name: 'r2', type: 'float' },
|
|
58
|
+
{ name: 'h', type: 'float' },
|
|
59
|
+
],
|
|
60
|
+
})
|
|
@@ -3,15 +3,12 @@ import { rectSDF } from './rectSDF'
|
|
|
3
3
|
|
|
4
4
|
export const crossSDF = Fn(([st, s]: [Vec2, Float]): Float => {
|
|
5
5
|
const size = vec2(0.25, s)
|
|
6
|
-
return min(
|
|
7
|
-
rectSDF(st, size),
|
|
8
|
-
rectSDF(st, size.yx)
|
|
9
|
-
)
|
|
6
|
+
return min(rectSDF(st, size), rectSDF(st, size.yx))
|
|
10
7
|
}).setLayout({
|
|
11
8
|
name: 'crossSDF',
|
|
12
9
|
type: 'float',
|
|
13
10
|
inputs: [
|
|
14
11
|
{ name: 'st', type: 'vec2' },
|
|
15
|
-
{ name: 's', type: 'float' }
|
|
16
|
-
]
|
|
17
|
-
})
|
|
12
|
+
{ name: 's', type: 'float' },
|
|
13
|
+
],
|
|
14
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Fn, Vec3, Float, vec3 } from '../../node'
|
|
2
|
+
import { boxSDFSize } from './boxSDF'
|
|
3
|
+
|
|
4
|
+
export const cubeSDF = Fn(([p, s]: [Vec3, Float]): Float => {
|
|
5
|
+
return boxSDFSize(p, vec3(s))
|
|
6
|
+
}).setLayout({
|
|
7
|
+
name: 'cubeSDF',
|
|
8
|
+
type: 'float',
|
|
9
|
+
inputs: [
|
|
10
|
+
{ name: 'p', type: 'vec3' },
|
|
11
|
+
{ name: 's', type: 'float' },
|
|
12
|
+
],
|
|
13
|
+
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec2, Float, vec2, select, float } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const cylinderSDF = Fn(([p, h]: [Vec3, Vec2]): Float => {
|
|
4
|
+
const d = vec2(vec2(p.x, p.z).length(), p.y).abs().sub(h).toVar('d')
|
|
5
|
+
return d.x.max(d.y).min(0).add(d.max(0).length())
|
|
6
|
+
}).setLayout({
|
|
7
|
+
name: 'cylinderSDF',
|
|
8
|
+
type: 'float',
|
|
9
|
+
inputs: [
|
|
10
|
+
{ name: 'p', type: 'vec3' },
|
|
11
|
+
{ name: 'h', type: 'vec2' },
|
|
12
|
+
],
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
export const cylinderSDFHeight = Fn(([p, h]: [Vec3, Float]): Float => {
|
|
16
|
+
return cylinderSDF(p, vec2(h))
|
|
17
|
+
}).setLayout({
|
|
18
|
+
name: 'cylinderSDFHeight',
|
|
19
|
+
type: 'float',
|
|
20
|
+
inputs: [
|
|
21
|
+
{ name: 'p', type: 'vec3' },
|
|
22
|
+
{ name: 'h', type: 'float' },
|
|
23
|
+
],
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
export const cylinderSDFHeightRadius = Fn(([p, h, r]: [Vec3, Float, Float]): Float => {
|
|
27
|
+
const d = vec2(vec2(p.x, p.z).length(), p.y).abs().sub(vec2(h, r)).toVar('d')
|
|
28
|
+
return d.x.max(d.y).min(0).add(d.max(0).length())
|
|
29
|
+
}).setLayout({
|
|
30
|
+
name: 'cylinderSDFHeightRadius',
|
|
31
|
+
type: 'float',
|
|
32
|
+
inputs: [
|
|
33
|
+
{ name: 'p', type: 'vec3' },
|
|
34
|
+
{ name: 'h', type: 'float' },
|
|
35
|
+
{ name: 'r', type: 'float' },
|
|
36
|
+
],
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export const cylinderSDFCaps = Fn(([p, a, b, r]: [Vec3, Vec3, Vec3, Float]): Float => {
|
|
40
|
+
const pa = p.sub(a).toVar('pa')
|
|
41
|
+
const ba = b.sub(a).toVar('ba')
|
|
42
|
+
const baba = ba.dot(ba).toVar('baba')
|
|
43
|
+
const paba = pa.dot(ba).toVar('paba')
|
|
44
|
+
const x = pa.mul(baba).sub(ba.mul(paba)).length().sub(r.mul(baba)).toVar('x')
|
|
45
|
+
const y = paba.sub(baba.mul(0.5)).abs().sub(baba.mul(0.5)).toVar('y')
|
|
46
|
+
const x2 = x.mul(x).toVar('x2')
|
|
47
|
+
const y2 = y.mul(y).mul(baba).toVar('y2')
|
|
48
|
+
const d = select(
|
|
49
|
+
select(float(0), x2, x.greaterThan(0)).add(select(float(0), y2, y.greaterThan(0))),
|
|
50
|
+
x2.min(y2).negate(),
|
|
51
|
+
x.max(y).lessThan(0)
|
|
52
|
+
)
|
|
53
|
+
.toFloat()
|
|
54
|
+
.toVar('d')
|
|
55
|
+
return d.sign().mul(d.abs().sqrt()).div(baba)
|
|
56
|
+
}).setLayout({
|
|
57
|
+
name: 'cylinderSDFCaps',
|
|
58
|
+
type: 'float',
|
|
59
|
+
inputs: [
|
|
60
|
+
{ name: 'p', type: 'vec3' },
|
|
61
|
+
{ name: 'a', type: 'vec3' },
|
|
62
|
+
{ name: 'b', type: 'vec3' },
|
|
63
|
+
{ name: 'r', type: 'float' },
|
|
64
|
+
],
|
|
65
|
+
})
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Fn, Vec3, Float, vec3 } from '../../node'
|
|
2
|
+
|
|
3
|
+
const PHI = 1.618033988749894848204586834
|
|
4
|
+
|
|
5
|
+
export const dodecahedronSDF = Fn(([p]: [Vec3]): Float => {
|
|
6
|
+
const n = vec3(PHI, 1, 0).normalize().toVar('n')
|
|
7
|
+
const pAbs = p.abs().toVar('pAbs')
|
|
8
|
+
const a = pAbs.dot(vec3(n.x, n.y, n.z)).toVar('a')
|
|
9
|
+
const b = pAbs.dot(vec3(n.z, n.x, n.y)).toVar('b')
|
|
10
|
+
const c = pAbs.dot(vec3(n.y, n.z, n.x)).toVar('c')
|
|
11
|
+
return a.max(b).max(c).sub(n.x)
|
|
12
|
+
}).setLayout({
|
|
13
|
+
name: 'dodecahedronSDF',
|
|
14
|
+
type: 'float',
|
|
15
|
+
inputs: [{ name: 'p', type: 'vec3' }],
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export const dodecahedronSDFRadius = Fn(([p, radius]: [Vec3, Float]): Float => {
|
|
19
|
+
const n = vec3(PHI, 1, 0).normalize().toVar('n')
|
|
20
|
+
const pScaled = p.abs().div(radius).toVar('pScaled')
|
|
21
|
+
const a = pScaled.dot(vec3(n.x, n.y, n.z)).toVar('a')
|
|
22
|
+
const b = pScaled.dot(vec3(n.z, n.x, n.y)).toVar('b')
|
|
23
|
+
const c = pScaled.dot(vec3(n.y, n.z, n.x)).toVar('c')
|
|
24
|
+
return a.max(b).max(c).sub(n.x).mul(radius)
|
|
25
|
+
}).setLayout({
|
|
26
|
+
name: 'dodecahedronSDFRadius',
|
|
27
|
+
type: 'float',
|
|
28
|
+
inputs: [
|
|
29
|
+
{ name: 'p', type: 'vec3' },
|
|
30
|
+
{ name: 'radius', type: 'float' },
|
|
31
|
+
],
|
|
32
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Fn, Vec3, Float } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const ellipsoidSDF = Fn(([p, r]: [Vec3, Vec3]): Float => {
|
|
4
|
+
const k0 = p.div(r).length().toVar('k0')
|
|
5
|
+
const k1 = p.div(r.mul(r)).length().toVar('k1')
|
|
6
|
+
return k0.mul(k0.sub(1)).div(k1)
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'ellipsoidSDF',
|
|
9
|
+
type: 'float',
|
|
10
|
+
inputs: [
|
|
11
|
+
{ name: 'p', type: 'vec3' },
|
|
12
|
+
{ name: 'r', type: 'vec3' },
|
|
13
|
+
],
|
|
14
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Fn, Vec2, Int, Float, atan2 } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const flowerSDF = Fn(([st, N]: [Vec2, Int]): Float => {
|
|
4
|
+
const centered = st.sub(0.5).mul(4).toVar('centered')
|
|
5
|
+
const r = centered.length().mul(2).toVar('r')
|
|
6
|
+
const a = atan2(centered.y, centered.x).toVar('a')
|
|
7
|
+
const v = N.toFloat().mul(0.5).toVar('v')
|
|
8
|
+
return a.mul(v).cos().abs().mul(0.5).add(0.5).div(r).oneMinus()
|
|
9
|
+
}).setLayout({
|
|
10
|
+
name: 'flowerSDF',
|
|
11
|
+
type: 'float',
|
|
12
|
+
inputs: [
|
|
13
|
+
{ name: 'st', type: 'vec2' },
|
|
14
|
+
{ name: 'N', type: 'int' },
|
|
15
|
+
],
|
|
16
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Fn, Vec2, Float, Int, float } from '../../node'
|
|
2
|
+
import { mapRange } from '../math'
|
|
3
|
+
|
|
4
|
+
export const gearSDF = Fn(([st, b, N]: [Vec2, Float, Int]): Float => {
|
|
5
|
+
const e = float(2.71828182845904523536)
|
|
6
|
+
const stCentered = st.sub(0.5).mul(3).toVar('stCentered')
|
|
7
|
+
const s = mapRange(b, float(1), float(15), float(0.066), float(0.5)).toVar('s')
|
|
8
|
+
const d = stCentered.length().sub(s).toVar('d')
|
|
9
|
+
const omega = b.mul(N.toFloat().mul(stCentered.y.atan2(stCentered.x)).sin()).toVar('omega')
|
|
10
|
+
const l = e.pow(omega.mul(2)).toVar('l')
|
|
11
|
+
const hyperTan = l.sub(1).div(l.add(1)).toVar('hyperTan')
|
|
12
|
+
const r = hyperTan.div(b).toVar('r')
|
|
13
|
+
return d.add(d.min(r))
|
|
14
|
+
}).setLayout({
|
|
15
|
+
name: 'gearSDF',
|
|
16
|
+
type: 'float',
|
|
17
|
+
inputs: [
|
|
18
|
+
{ name: 'st', type: 'vec2' },
|
|
19
|
+
{ name: 'b', type: 'float' },
|
|
20
|
+
{ name: 'N', type: 'int' },
|
|
21
|
+
],
|
|
22
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Fn, Vec2, Float, vec2 } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const heartSDF = Fn(([st]: [Vec2]): Float => {
|
|
4
|
+
const centered = st.sub(0.5).sub(vec2(0, 0.3)).toVar('centered')
|
|
5
|
+
const r = centered.length().mul(5).toVar('r')
|
|
6
|
+
const normalized = centered.normalize().toVar('normalized')
|
|
7
|
+
const shape = normalized.y
|
|
8
|
+
.mul(normalized.x.abs().pow(0.67))
|
|
9
|
+
.div(normalized.y.add(1.5))
|
|
10
|
+
.sub(normalized.y.mul(2))
|
|
11
|
+
.add(1.26)
|
|
12
|
+
return r.sub(shape)
|
|
13
|
+
}).setLayout({
|
|
14
|
+
name: 'heartSDF',
|
|
15
|
+
type: 'float',
|
|
16
|
+
inputs: [{ name: 'st', type: 'vec2' }],
|
|
17
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec2, Float, vec2 } from '../../node'
|
|
2
|
+
|
|
3
|
+
export const hexPrismSDF = Fn(([p, h]: [Vec3, Vec2]): Float => {
|
|
4
|
+
const q = p.abs().toVar('q')
|
|
5
|
+
const d1 = q.z.sub(h.y).toVar('d1')
|
|
6
|
+
const d2 = q.x.mul(0.866025).add(q.y.mul(0.5)).max(q.y).sub(h.x).toVar('d2')
|
|
7
|
+
return vec2(d1, d2).max(0).length().add(d1.max(d2).min(0))
|
|
8
|
+
}).setLayout({
|
|
9
|
+
name: 'hexPrismSDF',
|
|
10
|
+
type: 'float',
|
|
11
|
+
inputs: [
|
|
12
|
+
{ name: 'p', type: 'vec3' },
|
|
13
|
+
{ name: 'h', type: 'vec2' },
|
|
14
|
+
],
|
|
15
|
+
})
|
package/src/addons/sdf/hexSDF.ts
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import { Fn, Vec2, Float
|
|
1
|
+
import { Fn, Vec2, Float } from '../../node'
|
|
2
2
|
|
|
3
3
|
export const hexSDF = Fn(([st]: [Vec2]): Float => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
// Hexagon SDF calculation using geometric properties
|
|
9
|
-
const sqrt3_2 = float(0.866025) // sqrt(3)/2
|
|
10
|
-
return max(
|
|
11
|
-
abs(normalized.y),
|
|
12
|
-
normalized.x.mul(sqrt3_2).add(normalized.y.div(2))
|
|
13
|
-
)
|
|
4
|
+
const transformed = st.mul(2).sub(1).toVar('transformed')
|
|
5
|
+
transformed.assign(transformed.abs())
|
|
6
|
+
return transformed.y.abs().max(transformed.x.mul(0.866025).add(transformed.y.mul(0.5)))
|
|
14
7
|
}).setLayout({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
})
|
|
8
|
+
name: 'hexSDF',
|
|
9
|
+
type: 'float',
|
|
10
|
+
inputs: [{ name: 'st', type: 'vec2' }],
|
|
11
|
+
})
|