glre 0.38.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dist/addons.cjs +2 -0
- package/dist/addons.cjs.map +1 -0
- package/dist/addons.d.ts +1287 -0
- package/dist/addons.js +2 -0
- package/dist/addons.js.map +1 -0
- package/dist/index.cjs +31 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +187 -323
- package/dist/index.js +31 -43
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +1 -48
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.ts +536 -10
- package/dist/native.js +1 -48
- package/dist/native.js.map +1 -1
- package/dist/node.cjs +69 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.ts +626 -0
- package/dist/node.js +69 -0
- package/dist/node.js.map +1 -0
- package/dist/react.cjs +1 -48
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +524 -4
- package/dist/react.js +1 -48
- package/dist/react.js.map +1 -1
- package/dist/solid.cjs +1 -48
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.ts +524 -4
- package/dist/solid.js +1 -48
- package/dist/solid.js.map +1 -1
- package/package.json +64 -11
- package/src/addons/animation/easing/backIn.ts +10 -0
- package/src/addons/animation/easing/backInOut.ts +12 -0
- package/src/addons/animation/easing/backOut.ts +10 -0
- package/src/addons/animation/easing/bounceIn.ts +10 -0
- package/src/addons/animation/easing/bounceInOut.ts +13 -0
- package/src/addons/animation/easing/bounceOut.ts +30 -0
- package/src/addons/animation/easing/circularIn.ts +9 -0
- package/src/addons/animation/easing/circularInOut.ts +11 -0
- package/src/addons/animation/easing/circularOut.ts +9 -0
- package/src/addons/animation/easing/cubicIn.ts +9 -0
- package/src/addons/animation/easing/cubicInOut.ts +11 -0
- package/src/addons/animation/easing/cubicOut.ts +10 -0
- package/src/addons/animation/easing/elasticIn.ts +10 -0
- package/src/addons/animation/easing/elasticInOut.ts +21 -0
- package/src/addons/animation/easing/elasticOut.ts +12 -0
- package/src/addons/animation/easing/exponentialIn.ts +9 -0
- package/src/addons/animation/easing/exponentialInOut.ts +13 -0
- package/src/addons/animation/easing/exponentialOut.ts +9 -0
- package/src/addons/animation/easing/index.ts +33 -0
- package/src/addons/animation/easing/linearIn.ts +9 -0
- package/src/addons/animation/easing/linearInOut.ts +9 -0
- package/src/addons/animation/easing/linearOut.ts +9 -0
- package/src/addons/animation/easing/quadraticIn.ts +9 -0
- package/src/addons/animation/easing/quadraticInOut.ts +10 -0
- package/src/addons/animation/easing/quadraticOut.ts +9 -0
- package/src/addons/animation/easing/quarticIn.ts +9 -0
- package/src/addons/animation/easing/quarticInOut.ts +11 -0
- package/src/addons/animation/easing/quarticOut.ts +10 -0
- package/src/addons/animation/easing/quinticIn.ts +9 -0
- package/src/addons/animation/easing/quinticInOut.ts +11 -0
- package/src/addons/animation/easing/quinticOut.ts +9 -0
- package/src/addons/animation/easing/sineIn.ts +10 -0
- package/src/addons/animation/easing/sineInOut.ts +10 -0
- package/src/addons/animation/easing/sineOut.ts +10 -0
- package/src/addons/color/palette/macbeth.ts +42 -0
- package/src/addons/color/space/cmyk2rgb.ts +12 -0
- package/src/addons/color/space/gamma2linear.ts +19 -0
- package/src/addons/color/space/hsl2rgb.ts +20 -0
- package/src/addons/color/space/hsv2rgb.ts +18 -0
- package/src/addons/color/space/hue2rgb.ts +12 -0
- package/src/addons/color/space/index.ts +29 -0
- package/src/addons/color/space/lab2lch.ts +22 -0
- package/src/addons/color/space/lab2rgb.ts +19 -0
- package/src/addons/color/space/lab2xyz.ts +32 -0
- package/src/addons/color/space/lch2lab.ts +21 -0
- package/src/addons/color/space/lch2rgb.ts +22 -0
- package/src/addons/color/space/linear2gamma.ts +19 -0
- package/src/addons/color/space/oklab2rgb.ts +35 -0
- package/src/addons/color/space/rgb2cmyk.ts +13 -0
- package/src/addons/color/space/rgb2hcv.ts +29 -0
- package/src/addons/color/space/rgb2hsl.ts +23 -0
- package/src/addons/color/space/rgb2hsv.ts +36 -0
- package/src/addons/color/space/rgb2hue.ts +29 -0
- package/src/addons/color/space/rgb2lab.ts +19 -0
- package/src/addons/color/space/rgb2lch.ts +22 -0
- package/src/addons/color/space/rgb2oklab.ts +45 -0
- package/src/addons/color/space/rgb2srgb.ts +34 -0
- package/src/addons/color/space/rgb2xyz.ts +20 -0
- package/src/addons/color/space/rgb2yiq.ts +22 -0
- package/src/addons/color/space/rgb2yuv.ts +32 -0
- package/src/addons/color/space/srgb2rgb.ts +34 -0
- package/src/addons/color/space/xyz2lab.ts +27 -0
- package/src/addons/color/space/xyz2rgb.ts +30 -0
- package/src/addons/color/space/yiq2rgb.ts +22 -0
- package/src/addons/color/space/yuv2rgb.ts +32 -0
- package/src/addons/draw/arrows.ts +75 -0
- package/src/addons/draw/axis.ts +57 -0
- package/src/addons/draw/bridge.ts +81 -0
- package/src/addons/draw/char.ts +30 -0
- package/src/addons/draw/circle.ts +29 -0
- package/src/addons/draw/fill.ts +25 -0
- package/src/addons/draw/flip.ts +45 -0
- package/src/addons/draw/hex.ts +29 -0
- package/src/addons/draw/index.ts +13 -0
- package/src/addons/draw/line.ts +16 -0
- package/src/addons/draw/point.ts +30 -0
- package/src/addons/draw/rect.ts +52 -0
- package/src/addons/draw/stroke.ts +31 -0
- package/src/addons/draw/tri.ts +29 -0
- package/src/addons/generative/cnoise.ts +239 -0
- package/src/addons/generative/curl.ts +64 -0
- package/src/addons/generative/fbm.ts +69 -0
- package/src/addons/generative/gerstnerWave.ts +21 -0
- package/src/addons/generative/gnoise.ts +113 -0
- package/src/addons/generative/index.ts +15 -0
- package/src/addons/generative/noised.ts +139 -0
- package/src/addons/generative/pnoise.ts +249 -0
- package/src/addons/generative/psrdnoise.ts +277 -0
- package/src/addons/generative/random.ts +136 -0
- package/src/addons/generative/snoise.ts +199 -0
- package/src/addons/generative/srandom.ts +90 -0
- package/src/addons/generative/voronoi.ts +134 -0
- package/src/addons/generative/voronoise.ts +69 -0
- package/src/addons/generative/wavelet.ts +77 -0
- package/src/addons/generative/worley.ts +99 -0
- package/src/addons/geometry/aabb/aabb.ts +8 -0
- package/src/addons/geometry/aabb/centroid.ts +10 -0
- package/src/addons/geometry/aabb/contain.ts +19 -0
- package/src/addons/geometry/aabb/diagonal.ts +10 -0
- package/src/addons/geometry/aabb/expand.ts +16 -0
- package/src/addons/geometry/aabb/index.ts +7 -0
- package/src/addons/geometry/aabb/intersect.ts +20 -0
- package/src/addons/geometry/aabb/square.ts +17 -0
- package/src/addons/geometry/index.ts +2 -0
- package/src/addons/geometry/triangle/area.ts +10 -0
- package/src/addons/geometry/triangle/barycentric.ts +50 -0
- package/src/addons/geometry/triangle/centroid.ts +10 -0
- package/src/addons/geometry/triangle/closestPoint.ts +85 -0
- package/src/addons/geometry/triangle/contain.ts +19 -0
- package/src/addons/geometry/triangle/distanceSq.ts +38 -0
- package/src/addons/geometry/triangle/index.ts +10 -0
- package/src/addons/geometry/triangle/intersect.ts +49 -0
- package/src/addons/geometry/triangle/normal.ts +12 -0
- package/src/addons/geometry/triangle/signedDistance.ts +31 -0
- package/src/addons/geometry/triangle/triangle.ts +9 -0
- package/src/addons/index.ts +8 -0
- package/src/addons/lighting/ray.ts +8 -0
- package/src/addons/math/aafloor.ts +13 -0
- package/src/addons/math/aafract.ts +38 -0
- package/src/addons/math/aamirror.ts +12 -0
- package/src/addons/math/aastep.ts +14 -0
- package/src/addons/math/absi.ts +9 -0
- package/src/addons/math/adaptiveThreshold.ts +24 -0
- package/src/addons/math/bump.ts +20 -0
- package/src/addons/math/const.ts +19 -0
- package/src/addons/math/cubic.ts +101 -0
- package/src/addons/math/cubicMix.ts +49 -0
- package/src/addons/math/decimate.ts +12 -0
- package/src/addons/math/dist.ts +143 -0
- package/src/addons/math/fcos.ts +11 -0
- package/src/addons/math/frac.ts +9 -0
- package/src/addons/math/gain.ts +14 -0
- package/src/addons/math/gaussian.ts +14 -0
- package/src/addons/math/grad4.ts +19 -0
- package/src/addons/math/hammersley.ts +54 -0
- package/src/addons/math/highPass.ts +12 -0
- package/src/addons/math/index.ts +63 -0
- package/src/addons/math/inside.ts +68 -0
- package/src/addons/math/invCubic.ts +9 -0
- package/src/addons/math/invQuartic.ts +9 -0
- package/src/addons/math/inverse.ts +9 -0
- package/src/addons/math/lengthSq.ts +10 -0
- package/src/addons/math/map.ts +27 -0
- package/src/addons/math/mirror.ts +12 -0
- package/src/addons/math/mmax.ts +27 -0
- package/src/addons/math/mmin.ts +28 -0
- package/src/addons/math/mmix.ts +47 -0
- package/src/addons/math/mod2.ts +44 -0
- package/src/addons/math/mod289.ts +46 -0
- package/src/addons/math/modi.ts +15 -0
- package/src/addons/math/nyquist.ts +15 -0
- package/src/addons/math/pack.ts +15 -0
- package/src/addons/math/parabola.ts +12 -0
- package/src/addons/math/permute.ts +42 -0
- package/src/addons/math/pow2.ts +10 -0
- package/src/addons/math/pow3.ts +9 -0
- package/src/addons/math/pow5.ts +10 -0
- package/src/addons/math/pow7.ts +12 -0
- package/src/addons/math/powFast.ts +18 -0
- package/src/addons/math/quartic.ts +15 -0
- package/src/addons/math/quat/index.ts +14 -0
- package/src/addons/math/quat/quat2mat3.ts +28 -0
- package/src/addons/math/quat/quat2mat4.ts +16 -0
- package/src/addons/math/quat/quatAdd.ts +18 -0
- package/src/addons/math/quat/quatConj.ts +14 -0
- package/src/addons/math/quat/quatDiv.ts +18 -0
- package/src/addons/math/quat/quatIdentity.ts +9 -0
- package/src/addons/math/quat/quatInverse.ts +17 -0
- package/src/addons/math/quat/quatLength.ts +15 -0
- package/src/addons/math/quat/quatLengthSq.ts +14 -0
- package/src/addons/math/quat/quatLerp.ts +40 -0
- package/src/addons/math/quat/quatMul.ts +38 -0
- package/src/addons/math/quat/quatNeg.ts +14 -0
- package/src/addons/math/quat/quatNorm.ts +16 -0
- package/src/addons/math/quat/quatSub.ts +18 -0
- package/src/addons/math/quintic.ts +16 -0
- package/src/addons/math/rotate2d.ts +16 -0
- package/src/addons/math/rotate3d.ts +37 -0
- package/src/addons/math/rotate3dX.ts +20 -0
- package/src/addons/math/rotate3dY.ts +20 -0
- package/src/addons/math/rotate3dZ.ts +20 -0
- package/src/addons/math/rotate4d.ts +41 -0
- package/src/addons/math/rotate4dX.ts +21 -0
- package/src/addons/math/rotate4dY.ts +16 -0
- package/src/addons/math/rotate4dZ.ts +21 -0
- package/src/addons/math/saturateMediump.ts +11 -0
- package/src/addons/math/scale2d.ts +44 -0
- package/src/addons/math/scale3d.ts +17 -0
- package/src/addons/math/scale4d.ts +50 -0
- package/src/addons/math/smootherstep.ts +16 -0
- package/src/addons/math/taylorInvSqrt.ts +9 -0
- package/src/addons/math/toMat3.ts +14 -0
- package/src/addons/math/toMat4.ts +14 -0
- package/src/addons/math/translate4d.ts +31 -0
- package/src/addons/math/unpack.ts +88 -0
- package/src/addons/sdf/boxSDF.ts +24 -0
- package/src/addons/sdf/circleSDF.ts +20 -0
- package/src/addons/sdf/crossSDF.ts +17 -0
- package/src/addons/sdf/hexSDF.ts +18 -0
- package/src/addons/sdf/index.ts +7 -0
- package/src/addons/sdf/lineSDF.ts +33 -0
- package/src/addons/sdf/rectSDF.ts +46 -0
- package/src/addons/sdf/sphereSDF.ts +20 -0
- package/src/addons/sdf/triSDF.ts +14 -0
- package/src/addons/space/aspect.ts +14 -0
- package/src/addons/space/bracketing.ts +44 -0
- package/src/addons/space/brickTile.ts +44 -0
- package/src/addons/space/cart2polar.ts +20 -0
- package/src/addons/space/center.ts +32 -0
- package/src/addons/space/checkerTile.ts +41 -0
- package/src/addons/space/depth2viewZ.ts +43 -0
- package/src/addons/space/displace.ts +55 -0
- package/src/addons/space/equirect2xyz.ts +17 -0
- package/src/addons/space/eulerView.ts +19 -0
- package/src/addons/space/fisheye2xyz.ts +18 -0
- package/src/addons/space/flipY.ts +25 -0
- package/src/addons/space/hexTile.ts +18 -0
- package/src/addons/space/index.ts +38 -0
- package/src/addons/space/kaleidoscope.ts +48 -0
- package/src/addons/space/linearizeDepth.ts +17 -0
- package/src/addons/space/lookAt.ts +49 -0
- package/src/addons/space/lookAtView.ts +40 -0
- package/src/addons/space/mirrorTile.ts +73 -0
- package/src/addons/space/nearest.ts +13 -0
- package/src/addons/space/orthographic.ts +25 -0
- package/src/addons/space/parallaxMapping.ts +149 -0
- package/src/addons/space/perspective.ts +24 -0
- package/src/addons/space/polar2cart.ts +24 -0
- package/src/addons/space/ratio.ts +14 -0
- package/src/addons/space/rotate.ts +37 -0
- package/src/addons/space/rotateX.ts +54 -0
- package/src/addons/space/rotateY.ts +54 -0
- package/src/addons/space/rotateZ.ts +54 -0
- package/src/addons/space/scale.ts +13 -0
- package/src/addons/space/sprite.ts +16 -0
- package/src/addons/space/sqTile.ts +20 -0
- package/src/addons/space/tbn.ts +26 -0
- package/src/addons/space/translate.ts +12 -0
- package/src/addons/space/triTile.ts +32 -0
- package/src/addons/space/uncenter.ts +32 -0
- package/src/addons/space/unratio.ts +12 -0
- package/src/addons/space/viewZ2depth.ts +25 -0
- package/src/addons/space/windmillTile.ts +58 -0
- package/src/addons/space/xyz2equirect.ts +10 -0
- package/src/index.ts +10 -23
- package/src/node/build.ts +127 -0
- package/src/node/create.ts +76 -0
- package/src/node/index.ts +64 -49
- package/src/node/scope.ts +66 -62
- package/src/node/types.ts +221 -187
- package/src/node/utils/const.ts +74 -13
- package/src/node/utils/index.ts +19 -14
- package/src/node/utils/infer.ts +32 -34
- package/src/node/utils/parse.ts +48 -24
- package/src/node/utils/utils.ts +52 -29
- package/src/types.ts +11 -6
- package/src/utils/helpers.ts +56 -0
- package/src/utils/pipeline.ts +24 -8
- package/src/utils/program.ts +62 -38
- package/src/{webgl.ts → utils/webgl.ts} +46 -30
- package/src/{webgpu.ts → utils/webgpu.ts} +22 -17
- package/src/node/core.ts +0 -121
- package/src/node/node.ts +0 -65
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, float, vec4, step } from '../../../node'
|
|
2
|
+
import { mmin3 } from '../../math/mmin'
|
|
3
|
+
|
|
4
|
+
export const rgb2cmyk = Fn(([rgb]: [Vec3]): Vec4 => {
|
|
5
|
+
const k = mmin3(float(1).sub(rgb)).toVar()
|
|
6
|
+
const invK = float(1).sub(k).toVar()
|
|
7
|
+
const cmy = float(1).sub(rgb).sub(k).div(invK).mul(step(0, invK)).toVar()
|
|
8
|
+
return vec4(cmy, k).saturate()
|
|
9
|
+
}).setLayout({
|
|
10
|
+
name: 'rgb2cmyk',
|
|
11
|
+
type: 'vec4',
|
|
12
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
13
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, float, vec3, vec4, select } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const HCV_EPSILON = float('1e-10').constant()
|
|
4
|
+
|
|
5
|
+
export const rgb2hcv = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
6
|
+
const P_true = vec4(rgb.b, rgb.g, -1, float(2).div(3)).toVar()
|
|
7
|
+
const P_false = vec4(rgb.g, rgb.b, 0, float(-1).div(3)).toVar()
|
|
8
|
+
const P_final = select(P_true, P_false, rgb.g.lessThan(rgb.b)).toVar()
|
|
9
|
+
|
|
10
|
+
const Q_true = vec4(P_final.x, P_final.y, P_final.w, rgb.r).toVar()
|
|
11
|
+
const Q_false = vec4(rgb.r, P_final.y, P_final.z, P_final.x).toVar()
|
|
12
|
+
const Q_final = select(Q_true, Q_false, rgb.r.lessThan(P_final.x)).toVar()
|
|
13
|
+
|
|
14
|
+
const C = Q_final.x.sub(Q_final.w.min(Q_final.y)).toVar()
|
|
15
|
+
const H = Q_final.w.sub(Q_final.y).div(float(6).mul(C).add(HCV_EPSILON)).add(Q_final.z).abs().toVar()
|
|
16
|
+
return vec3(H, C, Q_final.x)
|
|
17
|
+
}).setLayout({
|
|
18
|
+
name: 'rgb2hcv',
|
|
19
|
+
type: 'vec3',
|
|
20
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
export const rgb2hcvVec4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
24
|
+
return vec4(rgb2hcv(rgb.xyz), rgb.w)
|
|
25
|
+
}).setLayout({
|
|
26
|
+
name: 'rgb2hcvVec4',
|
|
27
|
+
type: 'vec4',
|
|
28
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
29
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, float, vec3, vec4 } from '../../../node'
|
|
2
|
+
import { rgb2hcv } from './rgb2hcv'
|
|
3
|
+
|
|
4
|
+
const HSL_EPSILON = float('1e-10')
|
|
5
|
+
|
|
6
|
+
export const rgb2hsl = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
7
|
+
const HCV = rgb2hcv(rgb).toVar()
|
|
8
|
+
const L = HCV.z.sub(HCV.y.div(2)).toVar()
|
|
9
|
+
const S = HCV.y.div(float(1).sub(L.mul(2).sub(1).abs()).add(HSL_EPSILON)).toVar()
|
|
10
|
+
return vec3(HCV.x, S, L)
|
|
11
|
+
}).setLayout({
|
|
12
|
+
name: 'rgb2hsl',
|
|
13
|
+
type: 'vec3',
|
|
14
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
export const rgb2hslVec4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
18
|
+
return vec4(rgb2hsl(rgb.xyz), rgb.w)
|
|
19
|
+
}).setLayout({
|
|
20
|
+
name: 'rgb2hslVec4',
|
|
21
|
+
type: 'vec4',
|
|
22
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
23
|
+
})
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, float, vec3, vec4, select } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const HCV_EPSILON = float('1e-10')
|
|
4
|
+
|
|
5
|
+
export const rgb2hsv = Fn(([c]: [Vec3]): Vec3 => {
|
|
6
|
+
const K = vec4(0, float(-1).div(3), float(2).div(3), -1).toVar()
|
|
7
|
+
const P_true = vec4(c.b, c.g, K.w, K.z).toVar()
|
|
8
|
+
const P_false = vec4(c.g, c.b, K.x, K.y).toVar()
|
|
9
|
+
const P = select(P_true, P_false, c.g.lessThan(c.b)).toVar()
|
|
10
|
+
|
|
11
|
+
const Q_true = vec4(P.x, P.y, P.w, c.r).toVar()
|
|
12
|
+
const Q_false = vec4(c.r, P.y, P.z, P.x).toVar()
|
|
13
|
+
const Q = select(Q_true, Q_false, c.r.lessThan(P.x)).toVar()
|
|
14
|
+
|
|
15
|
+
const d = Q.x.sub(Q.w.min(Q.y)).toVar()
|
|
16
|
+
const H = Q.z
|
|
17
|
+
.add(Q.w.sub(Q.y).div(float(6).mul(d).add(HCV_EPSILON)))
|
|
18
|
+
.abs()
|
|
19
|
+
.toVar()
|
|
20
|
+
const S = d.div(Q.x.add(HCV_EPSILON)).toVar()
|
|
21
|
+
const V = Q.x.toVar()
|
|
22
|
+
|
|
23
|
+
return vec3(H, S, V)
|
|
24
|
+
}).setLayout({
|
|
25
|
+
name: 'rgb2hsv',
|
|
26
|
+
type: 'vec3',
|
|
27
|
+
inputs: [{ name: 'c', type: 'vec3' }],
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export const rgb2hsvVec4 = Fn(([c]: [Vec4]): Vec4 => {
|
|
31
|
+
return vec4(rgb2hsv(c.xyz), c.w)
|
|
32
|
+
}).setLayout({
|
|
33
|
+
name: 'rgb2hsvVec4',
|
|
34
|
+
type: 'vec4',
|
|
35
|
+
inputs: [{ name: 'c', type: 'vec4' }],
|
|
36
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, Float, float, vec4, select } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const HUE_EPSILON = float('1e-10')
|
|
4
|
+
|
|
5
|
+
export const rgb2hue = Fn(([c]: [Vec3]): Float => {
|
|
6
|
+
const K = vec4(0, float(-1).div(3), float(2).div(3), -1).toVar()
|
|
7
|
+
const P_true = vec4(c.b, c.g, K.w, K.z).toVar()
|
|
8
|
+
const P_false = vec4(c.g, c.b, K.x, K.y).toVar()
|
|
9
|
+
const P = select(P_true, P_false, c.g.lessThan(c.b)).toVar()
|
|
10
|
+
|
|
11
|
+
const Q_true = vec4(P.x, P.y, P.w, c.r).toVar()
|
|
12
|
+
const Q_false = vec4(c.r, P.y, P.z, P.x).toVar()
|
|
13
|
+
const Q = select(Q_true, Q_false, c.r.lessThan(P.x)).toVar()
|
|
14
|
+
|
|
15
|
+
const d = Q.x.sub(Q.w.min(Q.y)).toVar()
|
|
16
|
+
return Q.z.add(Q.w.sub(Q.y).div(float(6).mul(d).add(HUE_EPSILON))).abs()
|
|
17
|
+
}).setLayout({
|
|
18
|
+
name: 'rgb2hue',
|
|
19
|
+
type: 'float',
|
|
20
|
+
inputs: [{ name: 'c', type: 'vec3' }],
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
export const rgb2hueVec4 = Fn(([c]: [Vec4]): Float => {
|
|
24
|
+
return rgb2hue(c.xyz)
|
|
25
|
+
}).setLayout({
|
|
26
|
+
name: 'rgb2hueVec4',
|
|
27
|
+
type: 'float',
|
|
28
|
+
inputs: [{ name: 'c', type: 'vec4' }],
|
|
29
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, vec4 } from '../../../node'
|
|
2
|
+
import { rgb2xyz } from './rgb2xyz'
|
|
3
|
+
import { xyz2lab } from './xyz2lab'
|
|
4
|
+
|
|
5
|
+
export const rgb2lab = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
6
|
+
return xyz2lab(rgb2xyz(rgb))
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'rgb2lab',
|
|
9
|
+
type: 'vec3',
|
|
10
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const rgb2labVec4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
14
|
+
return vec4(rgb2lab(rgb.xyz), rgb.w)
|
|
15
|
+
}).setLayout({
|
|
16
|
+
name: 'rgb2labVec4',
|
|
17
|
+
type: 'vec4',
|
|
18
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
19
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, vec4 } from '../../../node'
|
|
2
|
+
import { rgb2lab } from './rgb2lab'
|
|
3
|
+
import { lab2lch } from './lab2lch'
|
|
4
|
+
|
|
5
|
+
export const rgb2lch3 = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
6
|
+
return lab2lch(rgb2lab(rgb))
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'rgb2lch3',
|
|
9
|
+
type: 'vec3',
|
|
10
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const rgb2lch4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
14
|
+
const lch = rgb2lch3(rgb.xyz)
|
|
15
|
+
return vec4(lch, rgb.w)
|
|
16
|
+
}).setLayout({
|
|
17
|
+
name: 'rgb2lch4',
|
|
18
|
+
type: 'vec4',
|
|
19
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export const rgb2lch = rgb2lch3
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Fn, mat3, vec3, vec4, Vec3, Vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const RGB2OKLAB_A = mat3(
|
|
4
|
+
0.2104542553,
|
|
5
|
+
1.9779984951,
|
|
6
|
+
0.0259040371,
|
|
7
|
+
0.793617785,
|
|
8
|
+
-2.428592205,
|
|
9
|
+
0.7827717662,
|
|
10
|
+
-0.0040720468,
|
|
11
|
+
0.4505937099,
|
|
12
|
+
-0.808675766
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
const RGB2OKLAB_B = mat3(
|
|
16
|
+
0.4122214708,
|
|
17
|
+
0.2119034982,
|
|
18
|
+
0.0883024619,
|
|
19
|
+
0.5363325363,
|
|
20
|
+
0.6806995451,
|
|
21
|
+
0.2817188376,
|
|
22
|
+
0.0514459929,
|
|
23
|
+
0.1073969566,
|
|
24
|
+
0.6299787005
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
export const rgb2oklab3 = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
28
|
+
const lms = RGB2OKLAB_B.mul(rgb)
|
|
29
|
+
return RGB2OKLAB_A.mul(lms.sign().mul(lms.abs().pow(vec3(0.3333333333333))))
|
|
30
|
+
}).setLayout({
|
|
31
|
+
name: 'rgb2oklab3',
|
|
32
|
+
type: 'vec3',
|
|
33
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
export const rgb2oklab4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
37
|
+
const oklab = rgb2oklab3(rgb.xyz)
|
|
38
|
+
return vec4(oklab, rgb.w)
|
|
39
|
+
}).setLayout({
|
|
40
|
+
name: 'rgb2oklab4',
|
|
41
|
+
type: 'vec4',
|
|
42
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
export const rgb2oklab = rgb2oklab3
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Fn, Float, Vec3, Vec4, float, vec3, vec4, select } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const SRGB_EPSILON = float('1e-10')
|
|
4
|
+
|
|
5
|
+
export const rgb2srgbFloat = Fn(([c]: [Float]): Float => {
|
|
6
|
+
return select(c.mul(12.92), float(1.055).mul(c.pow(0.4166666666666667)).sub(0.055), c.lessThan(0.0031308))
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'rgb2srgb',
|
|
9
|
+
type: 'float',
|
|
10
|
+
inputs: [{ name: 'c', type: 'float' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const rgb2srgbVec3 = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
14
|
+
return vec3(
|
|
15
|
+
rgb2srgbFloat(rgb.r.sub(SRGB_EPSILON)),
|
|
16
|
+
rgb2srgbFloat(rgb.g.sub(SRGB_EPSILON)),
|
|
17
|
+
rgb2srgbFloat(rgb.b.sub(SRGB_EPSILON))
|
|
18
|
+
).saturate()
|
|
19
|
+
}).setLayout({
|
|
20
|
+
name: 'rgb2srgbVec3',
|
|
21
|
+
type: 'vec3',
|
|
22
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
export const rgb2srgbVec4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
26
|
+
return vec4(rgb2srgbVec3(rgb.rgb), rgb.a)
|
|
27
|
+
}).setLayout({
|
|
28
|
+
name: 'rgb2srgbVec4',
|
|
29
|
+
type: 'vec4',
|
|
30
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// Default export for convenience
|
|
34
|
+
export const rgb2srgb = rgb2srgbVec3
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, mat3, vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
// CIE D65 white point transformation matrix
|
|
4
|
+
const RGB2XYZ = mat3(0.4124564, 0.3575761, 0.1804375, 0.2126729, 0.7151522, 0.072175, 0.0193339, 0.119192, 0.9503041)
|
|
5
|
+
|
|
6
|
+
export const rgb2xyz = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
7
|
+
return RGB2XYZ.mul(rgb)
|
|
8
|
+
}).setLayout({
|
|
9
|
+
name: 'rgb2xyz',
|
|
10
|
+
type: 'vec3',
|
|
11
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
export const rgb2xyzVec4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
15
|
+
return vec4(rgb2xyz(rgb.xyz), rgb.w)
|
|
16
|
+
}).setLayout({
|
|
17
|
+
name: 'rgb2xyzVec4',
|
|
18
|
+
type: 'vec4',
|
|
19
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
20
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Fn, mat3, vec4, Vec3, Vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const RGB2YIQ = mat3(0.3, 0.59, 0.11, 0.599, -0.2773, -0.3217, 0.213, -0.5251, 0.3121)
|
|
4
|
+
|
|
5
|
+
export const rgb2yiq3 = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
6
|
+
return RGB2YIQ.mul(rgb)
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'rgb2yiq3',
|
|
9
|
+
type: 'vec3',
|
|
10
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const rgb2yiq4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
14
|
+
const yiq = rgb2yiq3(rgb.xyz)
|
|
15
|
+
return vec4(yiq, rgb.w)
|
|
16
|
+
}).setLayout({
|
|
17
|
+
name: 'rgb2yiq4',
|
|
18
|
+
type: 'vec4',
|
|
19
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export const rgb2yiq = rgb2yiq3
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Fn, mat3, vec4, Vec3, Vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const RGB2YUV_HDTV = mat3(0.2126, -0.09991, 0.615, 0.7152, -0.33609, -0.55861, 0.0722, 0.426, -0.05639)
|
|
4
|
+
|
|
5
|
+
const RGB2YUV_SDTV = mat3(0.299, -0.14713, 0.615, 0.587, -0.28886, -0.51499, 0.114, 0.436, -0.10001)
|
|
6
|
+
|
|
7
|
+
export const rgb2yuv3 = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
8
|
+
return RGB2YUV_HDTV.mul(rgb)
|
|
9
|
+
}).setLayout({
|
|
10
|
+
name: 'rgb2yuv3',
|
|
11
|
+
type: 'vec3',
|
|
12
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
export const rgb2yuv4 = Fn(([rgb]: [Vec4]): Vec4 => {
|
|
16
|
+
const yuv = rgb2yuv3(rgb.xyz)
|
|
17
|
+
return vec4(yuv, rgb.w)
|
|
18
|
+
}).setLayout({
|
|
19
|
+
name: 'rgb2yuv4',
|
|
20
|
+
type: 'vec4',
|
|
21
|
+
inputs: [{ name: 'rgb', type: 'vec4' }],
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export const rgb2yuvSDTV = Fn(([rgb]: [Vec3]): Vec3 => {
|
|
25
|
+
return RGB2YUV_SDTV.mul(rgb)
|
|
26
|
+
}).setLayout({
|
|
27
|
+
name: 'rgb2yuvSDTV',
|
|
28
|
+
type: 'vec3',
|
|
29
|
+
inputs: [{ name: 'rgb', type: 'vec3' }],
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
export const rgb2yuv = rgb2yuv3
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Fn, Float, Vec3, Vec4, float, vec3, vec4, select } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const SRGB_EPSILON = float('1e-10')
|
|
4
|
+
|
|
5
|
+
export const srgb2rgbFloat = Fn(([v]: [Float]): Float => {
|
|
6
|
+
return select(v.mul(0.0773993808), v.add(0.055).mul(0.947867298578199).pow(2.4), v.lessThan(0.04045))
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'srgb2rgb',
|
|
9
|
+
type: 'float',
|
|
10
|
+
inputs: [{ name: 'v', type: 'float' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const srgb2rgbVec3 = Fn(([srgb]: [Vec3]): Vec3 => {
|
|
14
|
+
return vec3(
|
|
15
|
+
srgb2rgbFloat(srgb.r.add(SRGB_EPSILON)),
|
|
16
|
+
srgb2rgbFloat(srgb.g.add(SRGB_EPSILON)),
|
|
17
|
+
srgb2rgbFloat(srgb.b.add(SRGB_EPSILON))
|
|
18
|
+
)
|
|
19
|
+
}).setLayout({
|
|
20
|
+
name: 'srgb2rgbVec3',
|
|
21
|
+
type: 'vec3',
|
|
22
|
+
inputs: [{ name: 'srgb', type: 'vec3' }],
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
export const srgb2rgbVec4 = Fn(([srgb]: [Vec4]): Vec4 => {
|
|
26
|
+
return vec4(srgb2rgbVec3(srgb.rgb), srgb.a)
|
|
27
|
+
}).setLayout({
|
|
28
|
+
name: 'srgb2rgbVec4',
|
|
29
|
+
type: 'vec4',
|
|
30
|
+
inputs: [{ name: 'srgb', type: 'vec4' }],
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// Default export for convenience
|
|
34
|
+
export const srgb2rgb = srgb2rgbVec3
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, float, vec3, vec4, step, mix } from '../../../node'
|
|
2
|
+
|
|
3
|
+
export const xyz2lab = Fn(([xyz]: [Vec3]): Vec3 => {
|
|
4
|
+
const n = xyz.div(vec3(95.047, 100, 108.883)).toVar()
|
|
5
|
+
const c0 = n.pow(vec3(1 / 3)).toVar()
|
|
6
|
+
const c1 = n
|
|
7
|
+
.mul(7.787)
|
|
8
|
+
.add(16 / 116)
|
|
9
|
+
.toVar()
|
|
10
|
+
const v = mix(c0, c1, step(n, vec3(0.008856))).toVar()
|
|
11
|
+
const L = v.y.mul(116).sub(16).toVar()
|
|
12
|
+
const A = v.x.sub(v.y).mul(500).toVar()
|
|
13
|
+
const B = v.y.sub(v.z).mul(200).toVar()
|
|
14
|
+
return vec3(L, A, B)
|
|
15
|
+
}).setLayout({
|
|
16
|
+
name: 'xyz2lab',
|
|
17
|
+
type: 'vec3',
|
|
18
|
+
inputs: [{ name: 'xyz', type: 'vec3' }],
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
export const xyz2labVec4 = Fn(([xyz]: [Vec4]): Vec4 => {
|
|
22
|
+
return vec4(xyz2lab(xyz.xyz), xyz.w)
|
|
23
|
+
}).setLayout({
|
|
24
|
+
name: 'xyz2labVec4',
|
|
25
|
+
type: 'vec4',
|
|
26
|
+
inputs: [{ name: 'xyz', type: 'vec4' }],
|
|
27
|
+
})
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Fn, Vec3, Vec4, mat3, vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
// CIE D65 white point transformation matrix
|
|
4
|
+
const XYZ2RGB = mat3(
|
|
5
|
+
3.2404542,
|
|
6
|
+
-1.5371385,
|
|
7
|
+
-0.4985314,
|
|
8
|
+
-0.969266,
|
|
9
|
+
1.8760108,
|
|
10
|
+
0.041556,
|
|
11
|
+
0.0556434,
|
|
12
|
+
-0.2040259,
|
|
13
|
+
1.0572252
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
export const xyz2rgb = Fn(([xyz]: [Vec3]): Vec3 => {
|
|
17
|
+
return XYZ2RGB.mul(xyz.mul(0.01))
|
|
18
|
+
}).setLayout({
|
|
19
|
+
name: 'xyz2rgb',
|
|
20
|
+
type: 'vec3',
|
|
21
|
+
inputs: [{ name: 'xyz', type: 'vec3' }],
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export const xyz2rgbVec4 = Fn(([xyz]: [Vec4]): Vec4 => {
|
|
25
|
+
return vec4(xyz2rgb(xyz.xyz), xyz.w)
|
|
26
|
+
}).setLayout({
|
|
27
|
+
name: 'xyz2rgbVec4',
|
|
28
|
+
type: 'vec4',
|
|
29
|
+
inputs: [{ name: 'xyz', type: 'vec4' }],
|
|
30
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Fn, mat3, vec4, Vec3, Vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const YIQ2RGB = mat3(1, 0.9469, 0.6235, 1, -0.2747, -0.6357, 1, -1.1085, 1.702)
|
|
4
|
+
|
|
5
|
+
export const yiq2rgb3 = Fn(([yiq]: [Vec3]): Vec3 => {
|
|
6
|
+
return YIQ2RGB.mul(yiq)
|
|
7
|
+
}).setLayout({
|
|
8
|
+
name: 'yiq2rgb3',
|
|
9
|
+
type: 'vec3',
|
|
10
|
+
inputs: [{ name: 'yiq', type: 'vec3' }],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const yiq2rgb4 = Fn(([yiq]: [Vec4]): Vec4 => {
|
|
14
|
+
const rgb = yiq2rgb3(yiq.xyz)
|
|
15
|
+
return vec4(rgb, yiq.w)
|
|
16
|
+
}).setLayout({
|
|
17
|
+
name: 'yiq2rgb4',
|
|
18
|
+
type: 'vec4',
|
|
19
|
+
inputs: [{ name: 'yiq', type: 'vec4' }],
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export const yiq2rgb = yiq2rgb3
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Fn, mat3, vec4, Vec3, Vec4 } from '../../../node'
|
|
2
|
+
|
|
3
|
+
const YUV2RGB_HDTV = mat3(1, 1, 1, 0, -0.21482, 2.12798, 1.28033, -0.38059, 0)
|
|
4
|
+
|
|
5
|
+
const YUV2RGB_SDTV = mat3(1, 1, 1, 0, -0.39465, 2.03211, 1.13983, -0.5806, 0)
|
|
6
|
+
|
|
7
|
+
export const yuv2rgb3 = Fn(([yuv]: [Vec3]): Vec3 => {
|
|
8
|
+
return YUV2RGB_HDTV.mul(yuv)
|
|
9
|
+
}).setLayout({
|
|
10
|
+
name: 'yuv2rgb3',
|
|
11
|
+
type: 'vec3',
|
|
12
|
+
inputs: [{ name: 'yuv', type: 'vec3' }],
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
export const yuv2rgb4 = Fn(([yuv]: [Vec4]): Vec4 => {
|
|
16
|
+
const rgb = yuv2rgb3(yuv.xyz)
|
|
17
|
+
return vec4(rgb, yuv.w)
|
|
18
|
+
}).setLayout({
|
|
19
|
+
name: 'yuv2rgb4',
|
|
20
|
+
type: 'vec4',
|
|
21
|
+
inputs: [{ name: 'yuv', type: 'vec4' }],
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export const yuv2rgbSDTV = Fn(([yuv]: [Vec3]): Vec3 => {
|
|
25
|
+
return YUV2RGB_SDTV.mul(yuv)
|
|
26
|
+
}).setLayout({
|
|
27
|
+
name: 'yuv2rgbSDTV',
|
|
28
|
+
type: 'vec3',
|
|
29
|
+
inputs: [{ name: 'yuv', type: 'vec3' }],
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
export const yuv2rgb = yuv2rgb3
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Fn, Vec2, Float, float, vec2, floor, length, clamp, min, dot, cos, normalize, If } from '../../node'
|
|
2
|
+
|
|
3
|
+
// Constants
|
|
4
|
+
const ARROWS_TILE_SIZE = float(32)
|
|
5
|
+
const ARROWS_HEAD_ANGLE = float(0.5)
|
|
6
|
+
|
|
7
|
+
// Arrow tile center coordinate calculation
|
|
8
|
+
export const arrowsTileCenterCoord = Fn(([pos]: [Vec2]): Vec2 => {
|
|
9
|
+
return floor(pos.div(ARROWS_TILE_SIZE)).add(0.5).mul(ARROWS_TILE_SIZE)
|
|
10
|
+
}).setLayout({
|
|
11
|
+
name: 'arrowsTileCenterCoord',
|
|
12
|
+
type: 'vec2',
|
|
13
|
+
inputs: [{ name: 'pos', type: 'vec2' }],
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
// Arrows with resolution parameter
|
|
17
|
+
export const arrowsWithResolution = Fn(([p, v, resolution]: [Vec2, Vec2, Vec2]): Float => {
|
|
18
|
+
const scaledP = p.mul(resolution).toVar()
|
|
19
|
+
scaledP.subAssign(arrowsTileCenterCoord(scaledP))
|
|
20
|
+
const mag_v = length(v).toVar()
|
|
21
|
+
|
|
22
|
+
const result = float(0).toVar()
|
|
23
|
+
|
|
24
|
+
If(mag_v.greaterThan(0), () => {
|
|
25
|
+
const dir_v = v.div(mag_v).toVar()
|
|
26
|
+
mag_v.assign(clamp(mag_v, 5, ARROWS_TILE_SIZE.div(2)))
|
|
27
|
+
const vScaled = dir_v.mul(mag_v).toVar()
|
|
28
|
+
|
|
29
|
+
// Simplified arrow implementation based on GLSL default style
|
|
30
|
+
const arrow = float(1)
|
|
31
|
+
.add(
|
|
32
|
+
min(
|
|
33
|
+
float(0),
|
|
34
|
+
dot(normalize(vScaled.sub(scaledP)), dir_v).sub(cos(ARROWS_HEAD_ANGLE.div(2)))
|
|
35
|
+
)
|
|
36
|
+
.mul(2)
|
|
37
|
+
.mul(length(vScaled.sub(scaledP)))
|
|
38
|
+
.add(min(float(0), dot(scaledP, dir_v).add(1)))
|
|
39
|
+
.add(
|
|
40
|
+
min(
|
|
41
|
+
float(0),
|
|
42
|
+
cos(ARROWS_HEAD_ANGLE.div(2)).sub(
|
|
43
|
+
dot(normalize(vScaled.mul(0.33).sub(scaledP)), dir_v)
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
.mul(mag_v)
|
|
47
|
+
.mul(0.8)
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
.saturate()
|
|
51
|
+
result.assign(arrow)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
return result
|
|
55
|
+
}).setLayout({
|
|
56
|
+
name: 'arrowsWithResolution',
|
|
57
|
+
type: 'float',
|
|
58
|
+
inputs: [
|
|
59
|
+
{ name: 'p', type: 'vec2' },
|
|
60
|
+
{ name: 'v', type: 'vec2' },
|
|
61
|
+
{ name: 'resolution', type: 'vec2' },
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// Arrows with default resolution
|
|
66
|
+
export const arrows = Fn(([p, v]: [Vec2, Vec2]): Float => {
|
|
67
|
+
return arrowsWithResolution(p, v, vec2(1))
|
|
68
|
+
}).setLayout({
|
|
69
|
+
name: 'arrows',
|
|
70
|
+
type: 'float',
|
|
71
|
+
inputs: [
|
|
72
|
+
{ name: 'p', type: 'vec2' },
|
|
73
|
+
{ name: 'v', type: 'vec2' },
|
|
74
|
+
],
|
|
75
|
+
})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Fn, Vec2, Vec3, Vec4, Mat4, Float, vec3, vec4, Loop, int } from '../../node'
|
|
2
|
+
import { line } from './line'
|
|
3
|
+
|
|
4
|
+
export const axis = Fn(([st, M, pos, thickness]: [Vec2, Mat4, Vec3, Float]): Vec4 => {
|
|
5
|
+
let result = vec4(0, 0, 0, 0).toVar()
|
|
6
|
+
|
|
7
|
+
// Transform center position
|
|
8
|
+
const center = M.mul(vec4(pos, 1)).toVar()
|
|
9
|
+
center.xy.assign(center.xy.div(center.w))
|
|
10
|
+
center.xy.assign(center.xy.div(2).add(0.5))
|
|
11
|
+
|
|
12
|
+
// Define axis colors (RGB for XYZ)
|
|
13
|
+
const axisColors = [
|
|
14
|
+
vec4(1, 0, 0, 1), // Red for X axis
|
|
15
|
+
vec4(0, 1, 0, 1), // Green for Y axis
|
|
16
|
+
vec4(0, 0, 1, 1), // Blue for Z axis
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
const axisDirections = [
|
|
20
|
+
vec3(1, 0, 0), // X direction
|
|
21
|
+
vec3(0, 1, 0), // Y direction
|
|
22
|
+
vec3(0, 0, 1), // Z direction
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
// Draw each axis
|
|
26
|
+
Loop(int(3), ({ i }) => {
|
|
27
|
+
const axisColor = (i.equal(int(0)) as any).select(
|
|
28
|
+
axisColors[0],
|
|
29
|
+
(i.equal(int(1)) as any).select(axisColors[1], axisColors[2])
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
const axisDir = (i.equal(int(0)) as any).select(
|
|
33
|
+
axisDirections[0],
|
|
34
|
+
(i.equal(int(1)) as any).select(axisDirections[1], axisDirections[2])
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
// Transform axis endpoint
|
|
38
|
+
const axisPoint = (M as any).mul(vec4((pos as any).add(axisDir as any), 1)).toVar()
|
|
39
|
+
axisPoint.xy.assign(axisPoint.xy.div(axisPoint.w))
|
|
40
|
+
axisPoint.xy.assign(axisPoint.xy.div(2).add(0.5))
|
|
41
|
+
|
|
42
|
+
// Draw line from center to axis endpoint
|
|
43
|
+
const axisLine = line(st, center.xy, axisPoint.xy, thickness)
|
|
44
|
+
result.addAssign((axisColor as any).mul(axisLine as any))
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
return result
|
|
48
|
+
}).setLayout({
|
|
49
|
+
name: 'axis',
|
|
50
|
+
type: 'vec4',
|
|
51
|
+
inputs: [
|
|
52
|
+
{ name: 'st', type: 'vec2' },
|
|
53
|
+
{ name: 'M', type: 'mat4' },
|
|
54
|
+
{ name: 'pos', type: 'vec3' },
|
|
55
|
+
{ name: 'thickness', type: 'float' },
|
|
56
|
+
],
|
|
57
|
+
})
|