glre 0.40.0 → 0.42.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 (150) hide show
  1. package/dist/addons.cjs +1 -1
  2. package/dist/addons.cjs.map +1 -1
  3. package/dist/addons.d.ts +382 -10
  4. package/dist/addons.js +1 -1
  5. package/dist/addons.js.map +1 -1
  6. package/dist/index.cjs +6 -6
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +9 -8
  9. package/dist/index.js +5 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/native.d.ts +12 -11
  12. package/dist/node.cjs +16 -16
  13. package/dist/node.cjs.map +1 -1
  14. package/dist/node.d.ts +6 -5
  15. package/dist/node.js +15 -15
  16. package/dist/node.js.map +1 -1
  17. package/dist/react.d.ts +9 -8
  18. package/dist/solid.d.ts +9 -8
  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/node/create.ts +2 -3
  141. package/src/node/scope.ts +3 -2
  142. package/src/node/types.ts +1 -1
  143. package/src/node/utils/index.ts +2 -1
  144. package/src/node/utils/infer.ts +2 -1
  145. package/src/node/utils/utils.ts +6 -11
  146. package/src/types.ts +4 -3
  147. package/src/utils/helpers.ts +25 -8
  148. package/src/utils/program.ts +11 -4
  149. package/src/utils/webgl.ts +9 -3
  150. package/src/utils/webgpu.ts +12 -4
@@ -0,0 +1,334 @@
1
+ import { Fn, Float, Vec2, Vec3, Vec4, Mat2, Int, If, Loop, Break, float, vec2, int } from '../../node'
2
+
3
+ const DIGITS_SIZE = vec2(0.02)
4
+ const DIGITS_DECIMALS = float(2.0)
5
+ const DIGITS_VALUE_OFFSET = vec2(-6.0, 3.0)
6
+
7
+ const digitsCore = Fn(([st, value, nDecDigit]: [Vec2, Float, Float]): Float => {
8
+ const adjustedSt = st.div(DIGITS_SIZE).toVar('adjustedSt')
9
+ const absValue = value.abs().toVar('absValue')
10
+ const biggestDigitIndex = absValue.log2().div(float(10).log2()).floor().max(0).toVar('biggestDigitIndex')
11
+ const counter = absValue.floor().toVar('counter')
12
+ const nIntDigits = float(1).toVar('nIntDigits')
13
+
14
+ Loop(int(9), () => {
15
+ counter.assign(counter.mul(0.1).floor())
16
+ nIntDigits.addAssign(1)
17
+ If(counter.equal(0), () => {
18
+ Break()
19
+ })
20
+ })
21
+
22
+ let digit = float(12).toVar('digit')
23
+ const digitIndex = nIntDigits.sub(1).sub(adjustedSt.x.floor()).toVar('digitIndex')
24
+
25
+ If(digitIndex.greaterThan(nDecDigit.negate().sub(1.5)), () => {
26
+ If(digitIndex.greaterThan(biggestDigitIndex), () => {
27
+ If(value.lessThan(0), () => {
28
+ If(digitIndex.lessThan(biggestDigitIndex.add(1.5)), () => {
29
+ digit.assign(11)
30
+ })
31
+ })
32
+ }).Else(() => {
33
+ If(digitIndex.equal(-1), () => {
34
+ If(nDecDigit.greaterThan(0), () => {
35
+ digit.assign(10)
36
+ })
37
+ }).Else(() => {
38
+ If(digitIndex.lessThan(0), () => {
39
+ digitIndex.addAssign(1)
40
+ })
41
+ const digitValue = absValue.div(float(10).pow(digitIndex)).toVar('digitValue')
42
+ digit.assign(digitValue.add(0.0001).floor().mod(10))
43
+ })
44
+ })
45
+ })
46
+
47
+ const pos = vec2(adjustedSt.x.fract(), adjustedSt.y).toVar('pos')
48
+ If(pos.x.lessThan(0), () => {
49
+ return float(0)
50
+ })
51
+ If(pos.y.lessThan(0), () => {
52
+ return float(0)
53
+ })
54
+ If(pos.x.greaterThanEqual(1), () => {
55
+ return float(0)
56
+ })
57
+ If(pos.y.greaterThanEqual(1), () => {
58
+ return float(0)
59
+ })
60
+
61
+ const bin = float(0).toVar('bin')
62
+
63
+ If(digit.lessThan(0.5), () => {
64
+ bin.assign(
65
+ float(7)
66
+ .add(float(5).mul(16))
67
+ .add(float(5).mul(256))
68
+ .add(float(5).mul(4096))
69
+ .add(float(7).mul(65536))
70
+ )
71
+ })
72
+ .ElseIf(digit.lessThan(1.5), () => {
73
+ bin.assign(
74
+ float(2)
75
+ .add(float(2).mul(16))
76
+ .add(float(2).mul(256))
77
+ .add(float(2).mul(4096))
78
+ .add(float(2).mul(65536))
79
+ )
80
+ })
81
+ .ElseIf(digit.lessThan(2.5), () => {
82
+ bin.assign(
83
+ float(7)
84
+ .add(float(1).mul(16))
85
+ .add(float(7).mul(256))
86
+ .add(float(4).mul(4096))
87
+ .add(float(7).mul(65536))
88
+ )
89
+ })
90
+ .ElseIf(digit.lessThan(3.5), () => {
91
+ bin.assign(
92
+ float(7)
93
+ .add(float(4).mul(16))
94
+ .add(float(7).mul(256))
95
+ .add(float(4).mul(4096))
96
+ .add(float(7).mul(65536))
97
+ )
98
+ })
99
+ .ElseIf(digit.lessThan(4.5), () => {
100
+ bin.assign(
101
+ float(4)
102
+ .add(float(7).mul(16))
103
+ .add(float(5).mul(256))
104
+ .add(float(1).mul(4096))
105
+ .add(float(1).mul(65536))
106
+ )
107
+ })
108
+ .ElseIf(digit.lessThan(5.5), () => {
109
+ bin.assign(
110
+ float(7)
111
+ .add(float(4).mul(16))
112
+ .add(float(7).mul(256))
113
+ .add(float(1).mul(4096))
114
+ .add(float(7).mul(65536))
115
+ )
116
+ })
117
+ .ElseIf(digit.lessThan(6.5), () => {
118
+ bin.assign(
119
+ float(7)
120
+ .add(float(5).mul(16))
121
+ .add(float(7).mul(256))
122
+ .add(float(1).mul(4096))
123
+ .add(float(7).mul(65536))
124
+ )
125
+ })
126
+ .ElseIf(digit.lessThan(7.5), () => {
127
+ bin.assign(
128
+ float(4)
129
+ .add(float(4).mul(16))
130
+ .add(float(4).mul(256))
131
+ .add(float(4).mul(4096))
132
+ .add(float(7).mul(65536))
133
+ )
134
+ })
135
+ .ElseIf(digit.lessThan(8.5), () => {
136
+ bin.assign(
137
+ float(7)
138
+ .add(float(5).mul(16))
139
+ .add(float(7).mul(256))
140
+ .add(float(5).mul(4096))
141
+ .add(float(7).mul(65536))
142
+ )
143
+ })
144
+ .ElseIf(digit.lessThan(9.5), () => {
145
+ bin.assign(
146
+ float(7)
147
+ .add(float(4).mul(16))
148
+ .add(float(7).mul(256))
149
+ .add(float(5).mul(4096))
150
+ .add(float(7).mul(65536))
151
+ )
152
+ })
153
+ .ElseIf(digit.lessThan(10.5), () => {
154
+ bin.assign(
155
+ float(2)
156
+ .add(float(0).mul(16))
157
+ .add(float(0).mul(256))
158
+ .add(float(0).mul(4096))
159
+ .add(float(0).mul(65536))
160
+ )
161
+ })
162
+ .ElseIf(digit.lessThan(11.5), () => {
163
+ bin.assign(
164
+ float(0)
165
+ .add(float(0).mul(16))
166
+ .add(float(7).mul(256))
167
+ .add(float(0).mul(4096))
168
+ .add(float(0).mul(65536))
169
+ )
170
+ })
171
+
172
+ const pixel = pos.mul(vec2(4, 5)).floor().toVar('pixel')
173
+ return bin
174
+ .div(float(2).pow(pixel.x.add(pixel.y.mul(4))))
175
+ .floor()
176
+ .mod(2)
177
+ }).setLayout({
178
+ name: 'digitsCore',
179
+ type: 'float',
180
+ inputs: [
181
+ { name: 'st', type: 'vec2' },
182
+ { name: 'value', type: 'float' },
183
+ { name: 'nDecDigit', type: 'float' },
184
+ ],
185
+ })
186
+
187
+ export const digitsFloat = Fn(([st, value, nDecDigit]: [Vec2, Float, Float]): Float => {
188
+ return digitsCore(st, value, nDecDigit)
189
+ }).setLayout({
190
+ name: 'digitsFloat',
191
+ type: 'float',
192
+ inputs: [
193
+ { name: 'st', type: 'vec2' },
194
+ { name: 'value', type: 'float' },
195
+ { name: 'nDecDigit', type: 'float' },
196
+ ],
197
+ })
198
+
199
+ export const digitsInt = Fn(([st, value]: [Vec2, Int]): Float => {
200
+ return digitsCore(st, value.toFloat(), float(0))
201
+ }).setLayout({
202
+ name: 'digitsInt',
203
+ type: 'float',
204
+ inputs: [
205
+ { name: 'st', type: 'vec2' },
206
+ { name: 'value', type: 'int' },
207
+ ],
208
+ })
209
+
210
+ export const digits = Fn(([st, value]: [Vec2, Float]): Float => {
211
+ return digitsCore(st, value, DIGITS_DECIMALS)
212
+ }).setLayout({
213
+ name: 'digits',
214
+ type: 'float',
215
+ inputs: [
216
+ { name: 'st', type: 'vec2' },
217
+ { name: 'value', type: 'float' },
218
+ ],
219
+ })
220
+
221
+ export const digitsVec2 = Fn(([st, v]: [Vec2, Vec2]): Float => {
222
+ let rta = float(0).toVar('rta')
223
+ Loop(int(2), ({ i }) => {
224
+ const pos = st.add(vec2(i.toFloat(), 0).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET)).toVar('pos')
225
+ let value = float(0).toVar('value')
226
+ If(i.equal(int(0)), () => {
227
+ value.assign(v.x)
228
+ }).Else(() => {
229
+ value.assign(v.y)
230
+ })
231
+ rta.addAssign(digits(pos, value))
232
+ })
233
+ return rta
234
+ }).setLayout({
235
+ name: 'digitsVec2',
236
+ type: 'float',
237
+ inputs: [
238
+ { name: 'st', type: 'vec2' },
239
+ { name: 'v', type: 'vec2' },
240
+ ],
241
+ })
242
+
243
+ export const digitsVec3 = Fn(([st, v]: [Vec2, Vec3]): Float => {
244
+ let rta = float(0).toVar('rta')
245
+ Loop(int(3), ({ i }) => {
246
+ const pos = st.add(vec2(i.toFloat(), 0).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET)).toVar('pos')
247
+ let value = float(0).toVar('value')
248
+ If(i.equal(int(0)), () => {
249
+ value.assign(v.x)
250
+ })
251
+ .ElseIf(i.equal(1), () => {
252
+ value.assign(v.y)
253
+ })
254
+ .Else(() => {
255
+ value.assign(v.z)
256
+ })
257
+ rta.addAssign(digits(pos, value))
258
+ })
259
+ return rta
260
+ }).setLayout({
261
+ name: 'digitsVec3',
262
+ type: 'float',
263
+ inputs: [
264
+ { name: 'st', type: 'vec2' },
265
+ { name: 'v', type: 'vec3' },
266
+ ],
267
+ })
268
+
269
+ export const digitsVec4 = Fn(([st, v]: [Vec2, Vec4]): Float => {
270
+ let rta = float(0).toVar('rta')
271
+ Loop(int(4), ({ i }) => {
272
+ const pos = st.add(vec2(i.toFloat(), 0).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET)).toVar('pos')
273
+ let value = float(0).toVar('value')
274
+ If(i.equal(0), () => {
275
+ value.assign(v.x)
276
+ })
277
+ .ElseIf(i.equal(1), () => {
278
+ value.assign(v.y)
279
+ })
280
+ .ElseIf(i.equal(2), () => {
281
+ value.assign(v.z)
282
+ })
283
+ .Else(() => {
284
+ value.assign(v.w)
285
+ })
286
+ rta.addAssign(digits(pos, value))
287
+ })
288
+ return rta
289
+ }).setLayout({
290
+ name: 'digitsVec4',
291
+ type: 'float',
292
+ inputs: [
293
+ { name: 'st', type: 'vec2' },
294
+ { name: 'v', type: 'vec4' },
295
+ ],
296
+ })
297
+
298
+ export const digitsMat2 = Fn(([st, matrix]: [Vec2, Mat2]): Float => {
299
+ let rta = float(0).toVar('rta')
300
+ // Manually unroll the matrix elements
301
+ const pos00 = st
302
+ .add(vec2(0, 0).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET))
303
+ .sub(DIGITS_SIZE.mul(vec2(0, 3)))
304
+ .toVar('pos00')
305
+ const pos01 = st
306
+ .add(vec2(0, 1).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET))
307
+ .sub(DIGITS_SIZE.mul(vec2(0, 3)))
308
+ .toVar('pos01')
309
+ const pos10 = st
310
+ .add(vec2(1, 0).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET))
311
+ .sub(DIGITS_SIZE.mul(vec2(0, 3)))
312
+ .toVar('pos10')
313
+ const pos11 = st
314
+ .add(vec2(1, 1).mul(DIGITS_SIZE).mul(DIGITS_VALUE_OFFSET))
315
+ .sub(DIGITS_SIZE.mul(vec2(0, 3)))
316
+ .toVar('pos11')
317
+
318
+ rta.addAssign(digits(pos00, matrix.element(int(0)).element(int(0))))
319
+ rta.addAssign(digits(pos01, matrix.element(int(1)).element(int(0))))
320
+ rta.addAssign(digits(pos10, matrix.element(int(0)).element(int(1))))
321
+ rta.addAssign(digits(pos11, matrix.element(int(1)).element(int(1))))
322
+
323
+ return rta
324
+ }).setLayout({
325
+ name: 'digitsMat2',
326
+ type: 'float',
327
+ inputs: [
328
+ { name: 'st', type: 'vec2' },
329
+ { name: 'matrix', type: 'mat2' },
330
+ ],
331
+ })
332
+
333
+ // Note: Mat3 and Mat4 display functions are omitted for simplicity
334
+ // due to complexity in matrix element access. Only Mat2 is implemented.
@@ -3,10 +3,14 @@ export * from './axis'
3
3
  export * from './bridge'
4
4
  export * from './char'
5
5
  export * from './circle'
6
+ export * from './colorChecker'
7
+ export * from './colorPicker'
8
+ export * from './digits'
6
9
  export * from './fill'
7
10
  export * from './flip'
8
11
  export * from './hex'
9
12
  export * from './line'
13
+ export * from './matrix'
10
14
  export * from './point'
11
15
  export * from './rect'
12
16
  export * from './stroke'
@@ -0,0 +1,26 @@
1
+ import { Fn, Vec2, Vec4, Mat2, vec2, step, vec4 } from '../../node'
2
+ import { digitsMat2 } from './digits'
3
+
4
+ const DIGITS_SIZE = vec2(0.02)
5
+ const DIGITS_VALUE_OFFSET = vec2(-6.0, 3.0)
6
+
7
+ export const matrix = Fn(([st, M]: [Vec2, Mat2]): Vec4 => {
8
+ const rta = vec4(0).toVar('rta')
9
+ const size = DIGITS_SIZE.mul(DIGITS_VALUE_OFFSET.abs()).mul(2)
10
+ rta.a.assign(
11
+ step(DIGITS_SIZE.x.negate(), st.x)
12
+ .mul(step(st.x, size.x))
13
+ .mul(step(DIGITS_SIZE.y.negate(), st.y))
14
+ .mul(step(st.y, size.y))
15
+ .mul(0.5)
16
+ )
17
+ rta.assign(rta.add(digitsMat2(st, M)))
18
+ return rta
19
+ }).setLayout({
20
+ name: 'matrixMat2',
21
+ type: 'vec4',
22
+ inputs: [
23
+ { name: 'st', type: 'vec2' },
24
+ { name: 'M', type: 'mat2' },
25
+ ],
26
+ })
@@ -1,12 +1,27 @@
1
- import { Fn, Vec2, Vec3, Vec4, Float, vec3, vec4, float } from '../../node'
1
+ import { Fn, Vec2, Vec3, Vec4, Float, vec2, vec3, vec4, float, step } from '../../node'
2
+ import { digitsVec2 } from './digits'
2
3
  import { circleFill } from './circle'
3
4
 
4
- export const point2D = Fn(([st, pos, color, radius]: [Vec2, Vec2, Vec3, Float]): Vec4 => {
5
- const st_p = st.sub(pos)
6
- const circle = circleFill(st_p.add(0.5), radius)
7
- return vec4(color, 1).mul(circle)
5
+ const DIGITS_SIZE = vec2(0.02)
6
+ const DIGITS_VALUE_OFFSET = vec2(-6.0, 3.0)
7
+
8
+ export const pointWithColor = Fn(([st, pos, color, radius]: [Vec2, Vec2, Vec3, Float]): Vec4 => {
9
+ const rta = vec4(0).toVar('rta')
10
+ const st_p = st.sub(pos).toVar('st_p')
11
+ rta.assign(rta.add(vec4(color, 1).mul(circleFill(st_p.add(0.5), radius))))
12
+ st_p.assign(st_p.sub(DIGITS_SIZE.mul(vec2(0, 0.5))))
13
+ const size = DIGITS_SIZE.mul(DIGITS_VALUE_OFFSET.abs()).mul(vec2(2, 0.5))
14
+ rta.a.addAssign(
15
+ step(0, st_p.x)
16
+ .mul(step(st_p.x, size.x))
17
+ .mul(step(DIGITS_SIZE.y.mul(-0.5), st_p.y))
18
+ .mul(step(st_p.y, size.y))
19
+ .mul(0.5)
20
+ )
21
+ rta.assign(rta.add(digitsVec2(st_p, pos)))
22
+ return rta
8
23
  }).setLayout({
9
- name: 'point2D',
24
+ name: 'pointWithColor',
10
25
  type: 'vec4',
11
26
  inputs: [
12
27
  { name: 'st', type: 'vec2' },
@@ -16,15 +31,13 @@ export const point2D = Fn(([st, pos, color, radius]: [Vec2, Vec2, Vec3, Float]):
16
31
  ],
17
32
  })
18
33
 
19
- export const pointSimple = Fn(([st, pos]: [Vec2, Vec2]): Vec4 => {
20
- return point2D(st, pos, vec3(1, 0, 0), float(0.02))
34
+ export const point = Fn(([st, pos]: [Vec2, Vec2]): Vec4 => {
35
+ return pointWithColor(st, pos, vec3(1, 0, 0), float(0.02))
21
36
  }).setLayout({
22
- name: 'pointSimple',
37
+ name: 'point',
23
38
  type: 'vec4',
24
39
  inputs: [
25
40
  { name: 'st', type: 'vec2' },
26
41
  { name: 'pos', type: 'vec2' },
27
42
  ],
28
43
  })
29
-
30
- export const point = pointSimple
@@ -1,4 +1,4 @@
1
- import { Fn, Vec3, dot, length, cross, normalize, max, min, vec3, float, If, Return } from '../../../node'
1
+ import { Fn, Vec3, dot, length, cross, normalize, max, min, vec3, float, If } from '../../../node'
2
2
  import { barycentricFromVec3 } from './barycentric'
3
3
  import { TriangleType } from './triangle'
4
4
 
@@ -16,20 +16,20 @@ export const closestPointWithNormal = Fn(([tri, triNormal, pos]: [TriangleType,
16
16
  const bc = c.sub(b).toVar('bc')
17
17
  const n = length(bc).toVar('n')
18
18
  const t = max(float(0), min(dot(bc, p.sub(b)).div(n), n)).toVar('t')
19
- Return(b.add(t.div(n).mul(bc)))
19
+ return b.add(t.div(n).mul(bc))
20
20
  })
21
21
 
22
22
  If(bcoords.y.lessThan(0), () => {
23
23
  const ca = a.sub(c).toVar('ca')
24
24
  const n = length(ca).toVar('n')
25
25
  const t = max(float(0), min(dot(ca, p.sub(c)).div(n), n)).toVar('t')
26
- Return(c.add(t.div(n).mul(ca)))
26
+ return c.add(t.div(n).mul(ca))
27
27
  })
28
28
 
29
29
  If(bcoords.z.lessThan(0), () => {
30
30
  const n = length(ab).toVar('n')
31
31
  const t = max(float(0), min(dot(ab, p.sub(a)).div(n), n)).toVar('t')
32
- Return(a.add(t.div(n).mul(ab)))
32
+ return a.add(t.div(n).mul(ab))
33
33
  })
34
34
 
35
35
  return a.mul(bcoords.x).add(b.mul(bcoords.y)).add(c.mul(bcoords.z))
@@ -58,20 +58,20 @@ export const closestPoint = Fn(([tri, pos]: [TriangleType, Vec3]): Vec3 => {
58
58
  const bc = c.sub(b).toVar('bc')
59
59
  const n = length(bc).toVar('n')
60
60
  const t = max(float(0), min(dot(bc, p.sub(b)).div(n), n)).toVar('t')
61
- Return(b.add(t.div(n).mul(bc)))
61
+ return b.add(t.div(n).mul(bc))
62
62
  })
63
63
 
64
64
  If(bcoords.y.lessThan(0), () => {
65
65
  const ca = a.sub(c).toVar('ca')
66
66
  const n = length(ca).toVar('n')
67
67
  const t = max(float(0), min(dot(ca, p.sub(c)).div(n), n)).toVar('t')
68
- Return(c.add(t.div(n).mul(ca)))
68
+ return c.add(t.div(n).mul(ca))
69
69
  })
70
70
 
71
71
  If(bcoords.z.lessThan(0), () => {
72
72
  const n = length(ab).toVar('n')
73
73
  const t = max(float(0), min(dot(ab, p.sub(a)).div(n), n)).toVar('t')
74
- Return(a.add(t.div(n).mul(ab)))
74
+ return a.add(t.div(n).mul(ab))
75
75
  })
76
76
 
77
77
  return a.mul(bcoords.x).add(b.mul(bcoords.y)).add(c.mul(bcoords.z))
@@ -1,6 +1,9 @@
1
1
  export * from './animation/easing'
2
+ export * from './color/blend'
3
+ export * from './color/composite'
2
4
  export * from './color/space'
3
5
  export * from './draw'
6
+ export * from './draw/digits'
4
7
  export * from './geometry'
5
8
  export * from './generative'
6
9
  export * from './math'
@@ -1,12 +1,12 @@
1
- import { float } from "../../node"
1
+ import { float } from '../../node'
2
2
 
3
3
  // Mathematical constants as float nodes
4
4
  export const EIGHTH_PI = float(0.39269908169)
5
5
  export const QTR_PI = float(0.78539816339)
6
6
  export const HALF_PI = float(1.5707963267948966192313216916398)
7
7
  export const PI = float(3.1415926535897932384626433832795)
8
- export const TWO_PI = float(6.2831853071795864769252867665590)
9
- export const TAU = float(6.2831853071795864769252867665590)
8
+ export const TWO_PI = float(6.283185307179586476925286766559)
9
+ export const TAU = float(6.283185307179586476925286766559)
10
10
  export const INV_PI = float(0.31830988618379067153776752674503)
11
11
  export const INV_SQRT_TAU = float(0.39894228040143267793994605993439)
12
12
  export const SQRT_HALF_PI = float(1.25331413732)
@@ -16,4 +16,4 @@ export const GOLDEN_RATIO = float(1.6180339887)
16
16
  export const GOLDEN_RATIO_CONJUGATE = float(0.61803398875)
17
17
  export const GOLDEN_ANGLE = float(2.39996323)
18
18
  export const DEG2RAD = PI.div(180)
19
- export const RAD2DEG = float(180).div(PI)
19
+ export const RAD2DEG = float(180).div(PI)
@@ -5,12 +5,7 @@ function fun(x: Vec2): Vec2
5
5
  function fun(x: Vec3): Vec3
6
6
  function fun(x: Vec4): Vec4
7
7
  function fun(x: X): X {
8
- return x.sub(
9
- x
10
- .div(289)
11
- .floor()
12
- .mul(289)
13
- )
8
+ return x.sub(x.div(289).floor().mul(289))
14
9
  }
15
10
 
16
11
  export const mod289 = Fn(([x]: [Float]): Float => {
@@ -6,13 +6,7 @@ export const powFast = Fn(([a, b]: [X, X]): X => {
6
6
  name: 'powFast',
7
7
  type: 'auto',
8
8
  inputs: [
9
- {
10
- name: 'a',
11
- type: 'auto'
12
- },
13
- {
14
- name: 'b',
15
- type: 'auto'
16
- }
17
- ]
18
- })
9
+ { name: 'a', type: 'auto' },
10
+ { name: 'b', type: 'auto' },
11
+ ],
12
+ })
@@ -1,15 +1,10 @@
1
1
  import { Fn, X, float } from '../../node'
2
2
 
3
3
  export const quartic = Fn(([v]: [X]): X => {
4
- const v2 = v.mul(v).toVar('v2')
5
- return v2.mul((float(2) as any).sub(v2))
4
+ const v2 = v.mul(v).toVar('v2')
5
+ return v2.mul((float(2) as any).sub(v2))
6
6
  }).setLayout({
7
- name: 'quartic',
8
- type: 'auto',
9
- inputs: [
10
- {
11
- name: 'v',
12
- type: 'auto'
13
- }
14
- ]
15
- })
7
+ name: 'quartic',
8
+ type: 'auto',
9
+ inputs: [{ name: 'v', type: 'auto' }],
10
+ })
@@ -1,4 +1,4 @@
1
- import { Fn, Vec4, Float, vec4, If, Return, float } from '../../../node'
1
+ import { Fn, Vec4, Float, If, float } from '../../../node'
2
2
 
3
3
  export const quatLerp = Fn(([qa, qb, t]: [Vec4, Vec4, Float]): Vec4 => {
4
4
  const cosHalfTheta = qa.w.mul(qb.w).add(qa.xyz.dot(qb.xyz)).toVar('cosHalfTheta')
@@ -6,14 +6,14 @@ export const quatLerp = Fn(([qa, qb, t]: [Vec4, Vec4, Float]): Vec4 => {
6
6
  const absCosHalfTheta = cosHalfTheta.abs().toVar('absCosHalfTheta')
7
7
 
8
8
  If(absCosHalfTheta.greaterThanEqual(1), () => {
9
- Return(qa)
9
+ return qa
10
10
  })
11
11
 
12
12
  const halfTheta = absCosHalfTheta.acos().toVar('halfTheta')
13
13
  const sinHalfTheta = float(1).sub(absCosHalfTheta.mul(absCosHalfTheta)).sqrt().toVar('sinHalfTheta')
14
14
 
15
15
  If(sinHalfTheta.abs().lessThan(0.001), () => {
16
- Return(qa.div(2).add(adjustedQb.div(2)).normalize())
16
+ return qa.div(2).add(adjustedQb.div(2)).normalize()
17
17
  })
18
18
 
19
19
  const ratioA = float(1).sub(t).mul(halfTheta).sin().div(sinHalfTheta).toVar('ratioA')
@@ -1,16 +1,11 @@
1
1
  import { Fn, X } from '../../node'
2
2
 
3
3
  export const quintic = Fn(([v]: [X]): X => {
4
- const v3 = v.mul(v).mul(v).toVar('v3')
5
- const inner = v.mul(v.mul(6).sub(15)).add(10).toVar('inner')
6
- return v3.mul(inner)
4
+ const v3 = v.mul(v).mul(v).toVar('v3')
5
+ const inner = v.mul(v.mul(6).sub(15)).add(10).toVar('inner')
6
+ return v3.mul(inner)
7
7
  }).setLayout({
8
- name: 'quintic',
9
- type: 'auto',
10
- inputs: [
11
- {
12
- name: 'v',
13
- type: 'auto'
14
- }
15
- ]
16
- })
8
+ name: 'quintic',
9
+ type: 'auto',
10
+ inputs: [{ name: 'v', type: 'auto' }],
11
+ })
@@ -7,10 +7,5 @@ export const rotate2d = Fn(([r]: [Float]): Mat2 => {
7
7
  }).setLayout({
8
8
  name: 'rotate2d',
9
9
  type: 'mat2',
10
- inputs: [
11
- {
12
- name: 'r',
13
- type: 'float',
14
- },
15
- ],
10
+ inputs: [{ name: 'r', type: 'float' }],
16
11
  })
@@ -25,13 +25,7 @@ export const rotate3d = Fn(([a, r]: [Vec3, Float]): Mat3 => {
25
25
  name: 'rotate3d',
26
26
  type: 'mat3',
27
27
  inputs: [
28
- {
29
- name: 'a',
30
- type: 'vec3'
31
- },
32
- {
33
- name: 'r',
34
- type: 'float'
35
- }
36
- ]
37
- })
28
+ { name: 'a', type: 'vec3' },
29
+ { name: 'r', type: 'float' },
30
+ ],
31
+ })
@@ -3,18 +3,9 @@ import { Fn, Float, Mat3, mat3, vec3 } from '../../node'
3
3
  export const rotate3dX = Fn(([r]: [Float]): Mat3 => {
4
4
  const c = r.cos()
5
5
  const s = r.sin()
6
- return mat3(
7
- vec3(1, 0, 0),
8
- vec3(0, c, s),
9
- vec3(0, s.negate(), c)
10
- )
6
+ return mat3(vec3(1, 0, 0), vec3(0, c, s), vec3(0, s.negate(), c))
11
7
  }).setLayout({
12
8
  name: 'rotate3dX',
13
9
  type: 'mat3',
14
- inputs: [
15
- {
16
- name: 'r',
17
- type: 'float'
18
- }
19
- ]
20
- })
10
+ inputs: [{ name: 'r', type: 'float' }],
11
+ })