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.
Files changed (295) hide show
  1. package/README.md +8 -4
  2. package/dist/addons.cjs +2 -0
  3. package/dist/addons.cjs.map +1 -0
  4. package/dist/addons.d.ts +1287 -0
  5. package/dist/addons.js +2 -0
  6. package/dist/addons.js.map +1 -0
  7. package/dist/index.cjs +31 -43
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +187 -323
  10. package/dist/index.js +31 -43
  11. package/dist/index.js.map +1 -1
  12. package/dist/native.cjs +1 -48
  13. package/dist/native.cjs.map +1 -1
  14. package/dist/native.d.ts +536 -10
  15. package/dist/native.js +1 -48
  16. package/dist/native.js.map +1 -1
  17. package/dist/node.cjs +69 -0
  18. package/dist/node.cjs.map +1 -0
  19. package/dist/node.d.ts +626 -0
  20. package/dist/node.js +69 -0
  21. package/dist/node.js.map +1 -0
  22. package/dist/react.cjs +1 -48
  23. package/dist/react.cjs.map +1 -1
  24. package/dist/react.d.ts +524 -4
  25. package/dist/react.js +1 -48
  26. package/dist/react.js.map +1 -1
  27. package/dist/solid.cjs +1 -48
  28. package/dist/solid.cjs.map +1 -1
  29. package/dist/solid.d.ts +524 -4
  30. package/dist/solid.js +1 -48
  31. package/dist/solid.js.map +1 -1
  32. package/package.json +64 -11
  33. package/src/addons/animation/easing/backIn.ts +10 -0
  34. package/src/addons/animation/easing/backInOut.ts +12 -0
  35. package/src/addons/animation/easing/backOut.ts +10 -0
  36. package/src/addons/animation/easing/bounceIn.ts +10 -0
  37. package/src/addons/animation/easing/bounceInOut.ts +13 -0
  38. package/src/addons/animation/easing/bounceOut.ts +30 -0
  39. package/src/addons/animation/easing/circularIn.ts +9 -0
  40. package/src/addons/animation/easing/circularInOut.ts +11 -0
  41. package/src/addons/animation/easing/circularOut.ts +9 -0
  42. package/src/addons/animation/easing/cubicIn.ts +9 -0
  43. package/src/addons/animation/easing/cubicInOut.ts +11 -0
  44. package/src/addons/animation/easing/cubicOut.ts +10 -0
  45. package/src/addons/animation/easing/elasticIn.ts +10 -0
  46. package/src/addons/animation/easing/elasticInOut.ts +21 -0
  47. package/src/addons/animation/easing/elasticOut.ts +12 -0
  48. package/src/addons/animation/easing/exponentialIn.ts +9 -0
  49. package/src/addons/animation/easing/exponentialInOut.ts +13 -0
  50. package/src/addons/animation/easing/exponentialOut.ts +9 -0
  51. package/src/addons/animation/easing/index.ts +33 -0
  52. package/src/addons/animation/easing/linearIn.ts +9 -0
  53. package/src/addons/animation/easing/linearInOut.ts +9 -0
  54. package/src/addons/animation/easing/linearOut.ts +9 -0
  55. package/src/addons/animation/easing/quadraticIn.ts +9 -0
  56. package/src/addons/animation/easing/quadraticInOut.ts +10 -0
  57. package/src/addons/animation/easing/quadraticOut.ts +9 -0
  58. package/src/addons/animation/easing/quarticIn.ts +9 -0
  59. package/src/addons/animation/easing/quarticInOut.ts +11 -0
  60. package/src/addons/animation/easing/quarticOut.ts +10 -0
  61. package/src/addons/animation/easing/quinticIn.ts +9 -0
  62. package/src/addons/animation/easing/quinticInOut.ts +11 -0
  63. package/src/addons/animation/easing/quinticOut.ts +9 -0
  64. package/src/addons/animation/easing/sineIn.ts +10 -0
  65. package/src/addons/animation/easing/sineInOut.ts +10 -0
  66. package/src/addons/animation/easing/sineOut.ts +10 -0
  67. package/src/addons/color/palette/macbeth.ts +42 -0
  68. package/src/addons/color/space/cmyk2rgb.ts +12 -0
  69. package/src/addons/color/space/gamma2linear.ts +19 -0
  70. package/src/addons/color/space/hsl2rgb.ts +20 -0
  71. package/src/addons/color/space/hsv2rgb.ts +18 -0
  72. package/src/addons/color/space/hue2rgb.ts +12 -0
  73. package/src/addons/color/space/index.ts +29 -0
  74. package/src/addons/color/space/lab2lch.ts +22 -0
  75. package/src/addons/color/space/lab2rgb.ts +19 -0
  76. package/src/addons/color/space/lab2xyz.ts +32 -0
  77. package/src/addons/color/space/lch2lab.ts +21 -0
  78. package/src/addons/color/space/lch2rgb.ts +22 -0
  79. package/src/addons/color/space/linear2gamma.ts +19 -0
  80. package/src/addons/color/space/oklab2rgb.ts +35 -0
  81. package/src/addons/color/space/rgb2cmyk.ts +13 -0
  82. package/src/addons/color/space/rgb2hcv.ts +29 -0
  83. package/src/addons/color/space/rgb2hsl.ts +23 -0
  84. package/src/addons/color/space/rgb2hsv.ts +36 -0
  85. package/src/addons/color/space/rgb2hue.ts +29 -0
  86. package/src/addons/color/space/rgb2lab.ts +19 -0
  87. package/src/addons/color/space/rgb2lch.ts +22 -0
  88. package/src/addons/color/space/rgb2oklab.ts +45 -0
  89. package/src/addons/color/space/rgb2srgb.ts +34 -0
  90. package/src/addons/color/space/rgb2xyz.ts +20 -0
  91. package/src/addons/color/space/rgb2yiq.ts +22 -0
  92. package/src/addons/color/space/rgb2yuv.ts +32 -0
  93. package/src/addons/color/space/srgb2rgb.ts +34 -0
  94. package/src/addons/color/space/xyz2lab.ts +27 -0
  95. package/src/addons/color/space/xyz2rgb.ts +30 -0
  96. package/src/addons/color/space/yiq2rgb.ts +22 -0
  97. package/src/addons/color/space/yuv2rgb.ts +32 -0
  98. package/src/addons/draw/arrows.ts +75 -0
  99. package/src/addons/draw/axis.ts +57 -0
  100. package/src/addons/draw/bridge.ts +81 -0
  101. package/src/addons/draw/char.ts +30 -0
  102. package/src/addons/draw/circle.ts +29 -0
  103. package/src/addons/draw/fill.ts +25 -0
  104. package/src/addons/draw/flip.ts +45 -0
  105. package/src/addons/draw/hex.ts +29 -0
  106. package/src/addons/draw/index.ts +13 -0
  107. package/src/addons/draw/line.ts +16 -0
  108. package/src/addons/draw/point.ts +30 -0
  109. package/src/addons/draw/rect.ts +52 -0
  110. package/src/addons/draw/stroke.ts +31 -0
  111. package/src/addons/draw/tri.ts +29 -0
  112. package/src/addons/generative/cnoise.ts +239 -0
  113. package/src/addons/generative/curl.ts +64 -0
  114. package/src/addons/generative/fbm.ts +69 -0
  115. package/src/addons/generative/gerstnerWave.ts +21 -0
  116. package/src/addons/generative/gnoise.ts +113 -0
  117. package/src/addons/generative/index.ts +15 -0
  118. package/src/addons/generative/noised.ts +139 -0
  119. package/src/addons/generative/pnoise.ts +249 -0
  120. package/src/addons/generative/psrdnoise.ts +277 -0
  121. package/src/addons/generative/random.ts +136 -0
  122. package/src/addons/generative/snoise.ts +199 -0
  123. package/src/addons/generative/srandom.ts +90 -0
  124. package/src/addons/generative/voronoi.ts +134 -0
  125. package/src/addons/generative/voronoise.ts +69 -0
  126. package/src/addons/generative/wavelet.ts +77 -0
  127. package/src/addons/generative/worley.ts +99 -0
  128. package/src/addons/geometry/aabb/aabb.ts +8 -0
  129. package/src/addons/geometry/aabb/centroid.ts +10 -0
  130. package/src/addons/geometry/aabb/contain.ts +19 -0
  131. package/src/addons/geometry/aabb/diagonal.ts +10 -0
  132. package/src/addons/geometry/aabb/expand.ts +16 -0
  133. package/src/addons/geometry/aabb/index.ts +7 -0
  134. package/src/addons/geometry/aabb/intersect.ts +20 -0
  135. package/src/addons/geometry/aabb/square.ts +17 -0
  136. package/src/addons/geometry/index.ts +2 -0
  137. package/src/addons/geometry/triangle/area.ts +10 -0
  138. package/src/addons/geometry/triangle/barycentric.ts +50 -0
  139. package/src/addons/geometry/triangle/centroid.ts +10 -0
  140. package/src/addons/geometry/triangle/closestPoint.ts +85 -0
  141. package/src/addons/geometry/triangle/contain.ts +19 -0
  142. package/src/addons/geometry/triangle/distanceSq.ts +38 -0
  143. package/src/addons/geometry/triangle/index.ts +10 -0
  144. package/src/addons/geometry/triangle/intersect.ts +49 -0
  145. package/src/addons/geometry/triangle/normal.ts +12 -0
  146. package/src/addons/geometry/triangle/signedDistance.ts +31 -0
  147. package/src/addons/geometry/triangle/triangle.ts +9 -0
  148. package/src/addons/index.ts +8 -0
  149. package/src/addons/lighting/ray.ts +8 -0
  150. package/src/addons/math/aafloor.ts +13 -0
  151. package/src/addons/math/aafract.ts +38 -0
  152. package/src/addons/math/aamirror.ts +12 -0
  153. package/src/addons/math/aastep.ts +14 -0
  154. package/src/addons/math/absi.ts +9 -0
  155. package/src/addons/math/adaptiveThreshold.ts +24 -0
  156. package/src/addons/math/bump.ts +20 -0
  157. package/src/addons/math/const.ts +19 -0
  158. package/src/addons/math/cubic.ts +101 -0
  159. package/src/addons/math/cubicMix.ts +49 -0
  160. package/src/addons/math/decimate.ts +12 -0
  161. package/src/addons/math/dist.ts +143 -0
  162. package/src/addons/math/fcos.ts +11 -0
  163. package/src/addons/math/frac.ts +9 -0
  164. package/src/addons/math/gain.ts +14 -0
  165. package/src/addons/math/gaussian.ts +14 -0
  166. package/src/addons/math/grad4.ts +19 -0
  167. package/src/addons/math/hammersley.ts +54 -0
  168. package/src/addons/math/highPass.ts +12 -0
  169. package/src/addons/math/index.ts +63 -0
  170. package/src/addons/math/inside.ts +68 -0
  171. package/src/addons/math/invCubic.ts +9 -0
  172. package/src/addons/math/invQuartic.ts +9 -0
  173. package/src/addons/math/inverse.ts +9 -0
  174. package/src/addons/math/lengthSq.ts +10 -0
  175. package/src/addons/math/map.ts +27 -0
  176. package/src/addons/math/mirror.ts +12 -0
  177. package/src/addons/math/mmax.ts +27 -0
  178. package/src/addons/math/mmin.ts +28 -0
  179. package/src/addons/math/mmix.ts +47 -0
  180. package/src/addons/math/mod2.ts +44 -0
  181. package/src/addons/math/mod289.ts +46 -0
  182. package/src/addons/math/modi.ts +15 -0
  183. package/src/addons/math/nyquist.ts +15 -0
  184. package/src/addons/math/pack.ts +15 -0
  185. package/src/addons/math/parabola.ts +12 -0
  186. package/src/addons/math/permute.ts +42 -0
  187. package/src/addons/math/pow2.ts +10 -0
  188. package/src/addons/math/pow3.ts +9 -0
  189. package/src/addons/math/pow5.ts +10 -0
  190. package/src/addons/math/pow7.ts +12 -0
  191. package/src/addons/math/powFast.ts +18 -0
  192. package/src/addons/math/quartic.ts +15 -0
  193. package/src/addons/math/quat/index.ts +14 -0
  194. package/src/addons/math/quat/quat2mat3.ts +28 -0
  195. package/src/addons/math/quat/quat2mat4.ts +16 -0
  196. package/src/addons/math/quat/quatAdd.ts +18 -0
  197. package/src/addons/math/quat/quatConj.ts +14 -0
  198. package/src/addons/math/quat/quatDiv.ts +18 -0
  199. package/src/addons/math/quat/quatIdentity.ts +9 -0
  200. package/src/addons/math/quat/quatInverse.ts +17 -0
  201. package/src/addons/math/quat/quatLength.ts +15 -0
  202. package/src/addons/math/quat/quatLengthSq.ts +14 -0
  203. package/src/addons/math/quat/quatLerp.ts +40 -0
  204. package/src/addons/math/quat/quatMul.ts +38 -0
  205. package/src/addons/math/quat/quatNeg.ts +14 -0
  206. package/src/addons/math/quat/quatNorm.ts +16 -0
  207. package/src/addons/math/quat/quatSub.ts +18 -0
  208. package/src/addons/math/quintic.ts +16 -0
  209. package/src/addons/math/rotate2d.ts +16 -0
  210. package/src/addons/math/rotate3d.ts +37 -0
  211. package/src/addons/math/rotate3dX.ts +20 -0
  212. package/src/addons/math/rotate3dY.ts +20 -0
  213. package/src/addons/math/rotate3dZ.ts +20 -0
  214. package/src/addons/math/rotate4d.ts +41 -0
  215. package/src/addons/math/rotate4dX.ts +21 -0
  216. package/src/addons/math/rotate4dY.ts +16 -0
  217. package/src/addons/math/rotate4dZ.ts +21 -0
  218. package/src/addons/math/saturateMediump.ts +11 -0
  219. package/src/addons/math/scale2d.ts +44 -0
  220. package/src/addons/math/scale3d.ts +17 -0
  221. package/src/addons/math/scale4d.ts +50 -0
  222. package/src/addons/math/smootherstep.ts +16 -0
  223. package/src/addons/math/taylorInvSqrt.ts +9 -0
  224. package/src/addons/math/toMat3.ts +14 -0
  225. package/src/addons/math/toMat4.ts +14 -0
  226. package/src/addons/math/translate4d.ts +31 -0
  227. package/src/addons/math/unpack.ts +88 -0
  228. package/src/addons/sdf/boxSDF.ts +24 -0
  229. package/src/addons/sdf/circleSDF.ts +20 -0
  230. package/src/addons/sdf/crossSDF.ts +17 -0
  231. package/src/addons/sdf/hexSDF.ts +18 -0
  232. package/src/addons/sdf/index.ts +7 -0
  233. package/src/addons/sdf/lineSDF.ts +33 -0
  234. package/src/addons/sdf/rectSDF.ts +46 -0
  235. package/src/addons/sdf/sphereSDF.ts +20 -0
  236. package/src/addons/sdf/triSDF.ts +14 -0
  237. package/src/addons/space/aspect.ts +14 -0
  238. package/src/addons/space/bracketing.ts +44 -0
  239. package/src/addons/space/brickTile.ts +44 -0
  240. package/src/addons/space/cart2polar.ts +20 -0
  241. package/src/addons/space/center.ts +32 -0
  242. package/src/addons/space/checkerTile.ts +41 -0
  243. package/src/addons/space/depth2viewZ.ts +43 -0
  244. package/src/addons/space/displace.ts +55 -0
  245. package/src/addons/space/equirect2xyz.ts +17 -0
  246. package/src/addons/space/eulerView.ts +19 -0
  247. package/src/addons/space/fisheye2xyz.ts +18 -0
  248. package/src/addons/space/flipY.ts +25 -0
  249. package/src/addons/space/hexTile.ts +18 -0
  250. package/src/addons/space/index.ts +38 -0
  251. package/src/addons/space/kaleidoscope.ts +48 -0
  252. package/src/addons/space/linearizeDepth.ts +17 -0
  253. package/src/addons/space/lookAt.ts +49 -0
  254. package/src/addons/space/lookAtView.ts +40 -0
  255. package/src/addons/space/mirrorTile.ts +73 -0
  256. package/src/addons/space/nearest.ts +13 -0
  257. package/src/addons/space/orthographic.ts +25 -0
  258. package/src/addons/space/parallaxMapping.ts +149 -0
  259. package/src/addons/space/perspective.ts +24 -0
  260. package/src/addons/space/polar2cart.ts +24 -0
  261. package/src/addons/space/ratio.ts +14 -0
  262. package/src/addons/space/rotate.ts +37 -0
  263. package/src/addons/space/rotateX.ts +54 -0
  264. package/src/addons/space/rotateY.ts +54 -0
  265. package/src/addons/space/rotateZ.ts +54 -0
  266. package/src/addons/space/scale.ts +13 -0
  267. package/src/addons/space/sprite.ts +16 -0
  268. package/src/addons/space/sqTile.ts +20 -0
  269. package/src/addons/space/tbn.ts +26 -0
  270. package/src/addons/space/translate.ts +12 -0
  271. package/src/addons/space/triTile.ts +32 -0
  272. package/src/addons/space/uncenter.ts +32 -0
  273. package/src/addons/space/unratio.ts +12 -0
  274. package/src/addons/space/viewZ2depth.ts +25 -0
  275. package/src/addons/space/windmillTile.ts +58 -0
  276. package/src/addons/space/xyz2equirect.ts +10 -0
  277. package/src/index.ts +10 -23
  278. package/src/node/build.ts +127 -0
  279. package/src/node/create.ts +76 -0
  280. package/src/node/index.ts +64 -49
  281. package/src/node/scope.ts +66 -62
  282. package/src/node/types.ts +221 -187
  283. package/src/node/utils/const.ts +74 -13
  284. package/src/node/utils/index.ts +19 -14
  285. package/src/node/utils/infer.ts +32 -34
  286. package/src/node/utils/parse.ts +48 -24
  287. package/src/node/utils/utils.ts +52 -29
  288. package/src/types.ts +11 -6
  289. package/src/utils/helpers.ts +56 -0
  290. package/src/utils/pipeline.ts +24 -8
  291. package/src/utils/program.ts +62 -38
  292. package/src/{webgl.ts → utils/webgl.ts} +46 -30
  293. package/src/{webgpu.ts → utils/webgpu.ts} +22 -17
  294. package/src/node/core.ts +0 -121
  295. 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
+ })