glre 0.41.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.
- package/dist/addons.cjs +1 -1
- package/dist/addons.cjs.map +1 -1
- package/dist/addons.d.ts +378 -7
- package/dist/addons.js +1 -1
- package/dist/addons.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/node.cjs +12 -12
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +12 -12
- package/dist/node.js.map +1 -1
- 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/node/create.ts +2 -3
- package/src/node/utils/index.ts +2 -2
- package/src/utils/webgl.ts +2 -0
|
@@ -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.
|
package/src/addons/draw/index.ts
CHANGED
|
@@ -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
|
+
})
|
package/src/addons/draw/point.ts
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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: '
|
|
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
|
|
20
|
-
return
|
|
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: '
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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))
|
package/src/addons/index.ts
CHANGED
|
@@ -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'
|
package/src/addons/math/const.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { float } from
|
|
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.
|
|
9
|
-
export const TAU = float(6.
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
5
|
-
|
|
4
|
+
const v2 = v.mul(v).toVar('v2')
|
|
5
|
+
return v2.mul((float(2) as any).sub(v2))
|
|
6
6
|
}).setLayout({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
name: 'v',
|
|
13
|
-
type: 'auto'
|
|
14
|
-
}
|
|
15
|
-
]
|
|
16
|
-
})
|
|
8
|
+
name: 'quintic',
|
|
9
|
+
type: 'auto',
|
|
10
|
+
inputs: [{ name: 'v', type: 'auto' }],
|
|
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
|
-
|
|
30
|
-
|
|
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
|
+
})
|