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.
Files changed (144) hide show
  1. package/dist/addons.cjs +1 -1
  2. package/dist/addons.cjs.map +1 -1
  3. package/dist/addons.d.ts +379 -7
  4. package/dist/addons.js +1 -1
  5. package/dist/addons.js.map +1 -1
  6. package/dist/index.cjs +3 -3
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +3 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/native.d.ts +3 -0
  12. package/dist/node.cjs +12 -12
  13. package/dist/node.cjs.map +1 -1
  14. package/dist/node.d.ts +2 -1
  15. package/dist/node.js +12 -12
  16. package/dist/node.js.map +1 -1
  17. package/dist/react.d.ts +2 -0
  18. package/dist/solid.d.ts +2 -0
  19. package/package.json +1 -1
  20. package/src/addons/color/blend/add.ts +35 -0
  21. package/src/addons/color/blend/average.ts +35 -0
  22. package/src/addons/color/blend/color.ts +28 -0
  23. package/src/addons/color/blend/colorBurn.ts +35 -0
  24. package/src/addons/color/blend/colorDodge.ts +39 -0
  25. package/src/addons/color/blend/darken.ts +35 -0
  26. package/src/addons/color/blend/difference.ts +35 -0
  27. package/src/addons/color/blend/exclusion.ts +35 -0
  28. package/src/addons/color/blend/glow.ts +36 -0
  29. package/src/addons/color/blend/hardLight.ts +36 -0
  30. package/src/addons/color/blend/hardMix.ts +39 -0
  31. package/src/addons/color/blend/hue.ts +29 -0
  32. package/src/addons/color/blend/index.ts +28 -0
  33. package/src/addons/color/blend/lighten.ts +35 -0
  34. package/src/addons/color/blend/linearBurn.ts +39 -0
  35. package/src/addons/color/blend/linearDodge.ts +39 -0
  36. package/src/addons/color/blend/linearLight.ts +44 -0
  37. package/src/addons/color/blend/luminosity.ts +28 -0
  38. package/src/addons/color/blend/multiply.ts +35 -0
  39. package/src/addons/color/blend/negation.ts +35 -0
  40. package/src/addons/color/blend/overlay.ts +38 -0
  41. package/src/addons/color/blend/phoenix.ts +35 -0
  42. package/src/addons/color/blend/pinLight.ts +40 -0
  43. package/src/addons/color/blend/reflect.ts +35 -0
  44. package/src/addons/color/blend/saturation.ts +28 -0
  45. package/src/addons/color/blend/screen.ts +39 -0
  46. package/src/addons/color/blend/softLight.ts +63 -0
  47. package/src/addons/color/blend/subtract.ts +37 -0
  48. package/src/addons/color/blend/vividLight.ts +44 -0
  49. package/src/addons/color/composite/compositeXor.ts +40 -0
  50. package/src/addons/color/composite/destinationAtop.ts +42 -0
  51. package/src/addons/color/composite/destinationIn.ts +42 -0
  52. package/src/addons/color/composite/destinationOut.ts +42 -0
  53. package/src/addons/color/composite/destinationOver.ts +42 -0
  54. package/src/addons/color/composite/index.ts +9 -0
  55. package/src/addons/color/composite/sourceAtop.ts +42 -0
  56. package/src/addons/color/composite/sourceIn.ts +40 -0
  57. package/src/addons/color/composite/sourceOut.ts +40 -0
  58. package/src/addons/color/composite/sourceOver.ts +40 -0
  59. package/src/addons/color/palette/macbeth.ts +31 -33
  60. package/src/addons/draw/arrows.ts +34 -48
  61. package/src/addons/draw/axis.ts +24 -42
  62. package/src/addons/draw/bridge.ts +4 -4
  63. package/src/addons/draw/char.ts +235 -18
  64. package/src/addons/draw/circle.ts +22 -1
  65. package/src/addons/draw/colorChecker.ts +42 -0
  66. package/src/addons/draw/colorPicker.ts +66 -0
  67. package/src/addons/draw/digits.ts +334 -0
  68. package/src/addons/draw/index.ts +4 -0
  69. package/src/addons/draw/matrix.ts +26 -0
  70. package/src/addons/draw/point.ts +24 -11
  71. package/src/addons/geometry/triangle/closestPoint.ts +7 -7
  72. package/src/addons/index.ts +3 -0
  73. package/src/addons/math/const.ts +4 -4
  74. package/src/addons/math/mod289.ts +1 -6
  75. package/src/addons/math/powFast.ts +4 -10
  76. package/src/addons/math/quartic.ts +6 -11
  77. package/src/addons/math/quat/quatLerp.ts +3 -3
  78. package/src/addons/math/quintic.ts +7 -12
  79. package/src/addons/math/rotate2d.ts +1 -6
  80. package/src/addons/math/rotate3d.ts +4 -10
  81. package/src/addons/math/rotate3dX.ts +3 -12
  82. package/src/addons/math/rotate3dY.ts +3 -12
  83. package/src/addons/math/rotate3dZ.ts +3 -12
  84. package/src/addons/math/rotate4d.ts +4 -10
  85. package/src/addons/math/rotate4dX.ts +3 -13
  86. package/src/addons/math/rotate4dY.ts +1 -6
  87. package/src/addons/math/rotate4dZ.ts +3 -13
  88. package/src/addons/math/scale2d.ts +16 -32
  89. package/src/addons/math/toMat3.ts +1 -6
  90. package/src/addons/math/toMat4.ts +1 -6
  91. package/src/addons/sdf/arrowSDF.ts +61 -0
  92. package/src/addons/sdf/boxFrameSDF.ts +31 -0
  93. package/src/addons/sdf/boxSDF.ts +4 -6
  94. package/src/addons/sdf/capsuleSDF.ts +17 -0
  95. package/src/addons/sdf/coneSDF.ts +60 -0
  96. package/src/addons/sdf/crossSDF.ts +4 -7
  97. package/src/addons/sdf/cubeSDF.ts +13 -0
  98. package/src/addons/sdf/cylinderSDF.ts +65 -0
  99. package/src/addons/sdf/dodecahedronSDF.ts +32 -0
  100. package/src/addons/sdf/ellipsoidSDF.ts +14 -0
  101. package/src/addons/sdf/flowerSDF.ts +16 -0
  102. package/src/addons/sdf/gearSDF.ts +22 -0
  103. package/src/addons/sdf/heartSDF.ts +17 -0
  104. package/src/addons/sdf/hexPrismSDF.ts +15 -0
  105. package/src/addons/sdf/hexSDF.ts +8 -15
  106. package/src/addons/sdf/icosahedronSDF.ts +23 -0
  107. package/src/addons/sdf/index.ts +41 -0
  108. package/src/addons/sdf/juliaSDF.ts +39 -0
  109. package/src/addons/sdf/kochSDF.ts +49 -0
  110. package/src/addons/sdf/linkSDF.ts +15 -0
  111. package/src/addons/sdf/mandelbulbSDF.ts +41 -0
  112. package/src/addons/sdf/octahedronSDF.ts +30 -0
  113. package/src/addons/sdf/octogonPrismSDF.ts +19 -0
  114. package/src/addons/sdf/opElongate.ts +35 -0
  115. package/src/addons/sdf/opExtrude.ts +14 -0
  116. package/src/addons/sdf/opIntersection.ts +25 -0
  117. package/src/addons/sdf/opOnion.ts +12 -0
  118. package/src/addons/sdf/opRepeat.ts +49 -0
  119. package/src/addons/sdf/opRevolve.ts +12 -0
  120. package/src/addons/sdf/opRound.ts +12 -0
  121. package/src/addons/sdf/opSubtraction.ts +50 -0
  122. package/src/addons/sdf/opUnion.ts +39 -0
  123. package/src/addons/sdf/planeSDF.ts +21 -0
  124. package/src/addons/sdf/polySDF.ts +32 -0
  125. package/src/addons/sdf/pyramidSDF.ts +29 -0
  126. package/src/addons/sdf/raysSDF.ts +14 -0
  127. package/src/addons/sdf/rhombSDF.ts +10 -0
  128. package/src/addons/sdf/spiralSDF.ts +15 -0
  129. package/src/addons/sdf/starSDF.ts +47 -0
  130. package/src/addons/sdf/superShapeSDF.ts +73 -0
  131. package/src/addons/sdf/tetrahedronSDF.ts +21 -0
  132. package/src/addons/sdf/torusSDF.ts +27 -0
  133. package/src/addons/sdf/triPrismSDF.ts +13 -0
  134. package/src/addons/sdf/triSDF.ts +19 -11
  135. package/src/addons/sdf/vesicaSDF.ts +23 -0
  136. package/src/addons/space/bracketing.ts +1 -2
  137. package/src/addons/space/kaleidoscope.ts +1 -2
  138. package/src/addons/space/scale.ts +42 -7
  139. package/src/addons/space/windmillTile.ts +2 -1
  140. package/src/index.ts +1 -0
  141. package/src/node/create.ts +2 -3
  142. package/src/node/utils/index.ts +2 -2
  143. package/src/types.ts +1 -0
  144. 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
- name: 'a',
34
- type: 'vec3'
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
+ })
@@ -7,10 +7,5 @@ export const rotate4dY = Fn(([r]: [Float]): Mat4 => {
7
7
  }).setLayout({
8
8
  name: 'rotate4dY',
9
9
  type: 'mat4',
10
- inputs: [
11
- {
12
- name: 'r',
13
- type: 'float',
14
- },
15
- ],
10
+ inputs: [{ name: 'r', type: 'float' }],
16
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
- return mat2(s, 0, 0, s)
4
+ return mat2(s, 0, 0, s)
5
5
  }).setLayout({
6
- name: 'scale2d',
7
- type: 'mat2',
8
- inputs: [
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
- return mat2(s.x, 0, 0, s.y)
12
+ return mat2(s.x, 0, 0, s.y)
18
13
  }).setLayout({
19
- name: 'scale2d',
20
- type: 'mat2',
21
- inputs: [
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
- return mat2(x, 0, 0, y)
20
+ return mat2(x, 0, 0, y)
31
21
  }).setLayout({
32
- name: 'scale2d',
33
- type: 'mat2',
34
- inputs: [
35
- {
36
- name: 'x',
37
- type: 'float',
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
+ })
@@ -5,10 +5,5 @@ export const toMat3 = Fn(([m]: [Mat4]): Mat3 => {
5
5
  }).setLayout({
6
6
  name: 'toMat3',
7
7
  type: 'mat3',
8
- inputs: [
9
- {
10
- name: 'm',
11
- type: 'mat4',
12
- },
13
- ],
8
+ inputs: [{ name: 'm', type: 'mat4' }],
14
9
  })
@@ -5,10 +5,5 @@ export const toMat4 = Fn(([m]: [Mat3]): Mat4 => {
5
5
  }).setLayout({
6
6
  name: 'toMat4',
7
7
  type: 'mat4',
8
- inputs: [
9
- {
10
- name: 'm',
11
- type: 'mat3',
12
- },
13
- ],
8
+ inputs: [{ name: 'm', type: 'mat3' }],
14
9
  })
@@ -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
+ })
@@ -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
+ })
@@ -1,18 +1,11 @@
1
- import { Fn, Vec2, Float, abs, max, float } from '../../node'
1
+ import { Fn, Vec2, Float } from '../../node'
2
2
 
3
3
  export const hexSDF = Fn(([st]: [Vec2]): Float => {
4
- // Transform to centered coordinates [-1, 1]
5
- const normalized = st.mul(2).sub(1).toVar()
6
- normalized.assign(abs(normalized))
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
- name: 'hexSDF',
16
- type: 'float',
17
- inputs: [{ name: 'st', type: 'vec2' }],
18
- })
8
+ name: 'hexSDF',
9
+ type: 'float',
10
+ inputs: [{ name: 'st', type: 'vec2' }],
11
+ })