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
package/src/node/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CONSTANTS, CONVERSIONS, FUNCTIONS, OPERATOR_KEYS } from './utils/const'
1
+ import { CONSTANTS, CONVERSIONS, FUNCTIONS, OPERATOR_KEYS, OPERATOR_TYPE_RULES } from './utils/const'
2
2
  import type { GL } from '../types'
3
3
 
4
4
  export type Constants = (typeof CONSTANTS)[number] | 'void'
@@ -11,24 +11,32 @@ export type Operators = (typeof OPERATOR_KEYS)[number]
11
11
  */
12
12
  export interface FnLayout {
13
13
  name: string
14
- type: Constants | 'auto'
14
+ type: C | 'auto'
15
15
  inputs?: Array<{
16
16
  name: string
17
- type: Constants
17
+ type: C | 'auto'
18
18
  }>
19
19
  }
20
20
 
21
- export interface FnType<T extends NodeProxy | StructNode | void, Args extends any[]> {
21
+ export interface FnType<T extends X | Struct | void, Args extends any[]> {
22
22
  (...args: Args): T extends void ? Void : T
23
+ getLayout(): FnLayout
23
24
  setLayout(layout: FnLayout): FnType<T, Args>
24
25
  }
25
26
 
27
+ export type StructFields = Record<string, X>
28
+
29
+ export interface StructFactory<T extends StructFields> {
30
+ (initialValues?: StructFields, instanceId?: string): Struct<T>
31
+ }
32
+
26
33
  /**
27
34
  * node
28
35
  */
29
36
  export type NodeTypes =
30
37
  // headers
31
38
  | 'attribute'
39
+ | 'instance'
32
40
  | 'storage'
33
41
  | 'uniform'
34
42
  | 'constant'
@@ -55,6 +63,8 @@ export type NodeTypes =
55
63
  | 'switch'
56
64
  | 'declare'
57
65
  | 'return'
66
+ | 'break'
67
+ | 'continue'
58
68
 
59
69
  export interface NodeProps {
60
70
  id?: string
@@ -73,7 +83,7 @@ export interface NodeContext {
73
83
  label?: 'vert' | 'frag' | 'compute'
74
84
  isWebGL?: boolean
75
85
  units?: any // @TODO FIX
76
- infers?: WeakMap<NodeProxy, Constants>
86
+ infers?: WeakMap<X, C>
77
87
  onMount?: (name: string) => void
78
88
  code?: {
79
89
  headers: Map<string, string>
@@ -83,30 +93,24 @@ export interface NodeContext {
83
93
  vertVaryings: Map<string, string>
84
94
  computeInputs: Map<string, string>
85
95
  dependencies: Map<string, Set<string>>
86
- structFields: Map<string, StructFields>
96
+ structStructFields: Map<string, StructFields>
87
97
  }
88
98
  }
89
99
 
90
100
  /**
91
101
  * infer
92
102
  */
93
- type _StringLength<S extends string> = S extends `${infer _}${infer Rest}`
94
- ? Rest extends ''
95
- ? 1
96
- : Rest extends `${infer _}${infer Rest2}`
97
- ? Rest2 extends ''
98
- ? 2
99
- : Rest2 extends `${infer _}${infer Rest3}`
100
- ? Rest3 extends ''
101
- ? 3
102
- : 4
103
- : never
104
- : never
105
- : 0
103
+ // Optimized string length using direct pattern matching
104
+ // prettier-ignore
105
+ type _StringLength<A extends string> =
106
+ A extends `${infer _}${infer A}` ? A extends '' ? 1 :
107
+ A extends `${infer _}${infer B}` ? B extends '' ? 2 :
108
+ B extends `${infer _}${infer C}` ? C extends '' ? 3 :
109
+ 4 : never : never : never
106
110
 
107
111
  // Unified logic with infer.ts inferOperator function
108
112
  // prettier-ignore
109
- type InferOperator<L extends Constants, R extends Constants> =
113
+ type InferOperator<L extends C, R extends C> =
110
114
  L extends R ? L :
111
115
  // broadcast
112
116
  L extends 'float' | 'int' ? R :
@@ -122,19 +126,23 @@ type InferOperator<L extends Constants, R extends Constants> =
122
126
 
123
127
  // Unified logic with infer.ts inferArrayElement function
124
128
  // prettier-ignore
125
- type InferArrayElement<T extends Constants> =
129
+ type InferArrayElement<T extends C> =
126
130
  T extends 'mat4' ? 'vec4' :
127
131
  T extends 'mat3' ? 'vec3' :
128
132
  T extends 'mat2' ? 'vec2' :
129
133
  'float'
130
134
 
131
- type InferSwizzleType<S extends string> = _StringLength<S> extends 4
132
- ? 'vec4'
133
- : _StringLength<S> extends 3
134
- ? 'vec3'
135
- : _StringLength<S> extends 2
136
- ? 'vec2'
137
- : 'float'
135
+ type ExtractPairs<T> = T extends readonly [infer L, infer R, string] ? [L, R] | [R, L] : never
136
+ type OperatorTypeRules = ExtractPairs<(typeof OPERATOR_TYPE_RULES)[number]>
137
+ type IsInRules<L extends C, R extends C> = [L, R] extends OperatorTypeRules ? 1 : 0
138
+ type ValidateOperator<L extends C, R extends C> = L extends R ? 1 : IsInRules<L, R>
139
+
140
+ // prettier-ignore
141
+ type InferSwizzleType<S extends string> =
142
+ _StringLength<S> extends 4 ? 'vec4' :
143
+ _StringLength<S> extends 3 ? 'vec3' :
144
+ _StringLength<S> extends 2 ? 'vec2' :
145
+ 'float'
138
146
 
139
147
  /**
140
148
  * Swizzles
@@ -147,63 +155,34 @@ export type Swizzles =
147
155
  | _Swizzles<'p' | 'q'>
148
156
  | _Swizzles<'s' | 't'>
149
157
 
150
- type NodeProxyMethods =
151
- | Functions
152
- | Operators
153
- | Conversions
154
- | Swizzles
155
- // system property
156
- | '__nodeType'
157
- | 'type'
158
- | 'props'
159
- | 'isProxy'
160
- | 'assign'
161
- | 'toVar'
162
- | 'toString'
163
- | 'element'
164
-
165
- type ReadNodeProxy = {
166
- [K in string as K extends NodeProxyMethods ? never : K]: any
167
- } & {
168
- [K in Swizzles]: NodeProxy<InferSwizzleType<K>>
169
- }
170
-
171
- // Internal NodeProxy implementation (renamed from original)
172
- type NodeProxyImpl<T extends Constants> = BaseNodeProxy<T> & ReadNodeProxy
173
-
174
- export type Void = NodeProxyImpl<'void'>
175
- export type Bool = NodeProxyImpl<'bool'>
176
- export type UInt = NodeProxyImpl<'uint'>
177
- export type Int = NodeProxyImpl<'int'>
178
- export type Float = NodeProxyImpl<'float'>
179
- export type BVec2 = NodeProxyImpl<'bvec2'>
180
- export type IVec2 = NodeProxyImpl<'ivec2'>
181
- export type UVec2 = NodeProxyImpl<'uvec2'>
182
- export type Vec2 = NodeProxyImpl<'vec2'>
183
- export type BVec3 = NodeProxyImpl<'bvec3'>
184
- export type IVec3 = NodeProxyImpl<'ivec3'>
185
- export type UVec3 = NodeProxyImpl<'uvec3'>
186
- export type Vec3 = NodeProxyImpl<'vec3'>
187
- export type BVec4 = NodeProxyImpl<'bvec4'>
188
- export type IVec4 = NodeProxyImpl<'ivec4'>
189
- export type UVec4 = NodeProxyImpl<'uvec4'>
190
- export type Vec4 = NodeProxyImpl<'vec4'>
191
- export type Color = NodeProxyImpl<'color'>
192
- export type Mat2 = NodeProxyImpl<'mat2'>
193
- export type Mat3 = NodeProxyImpl<'mat3'>
194
- export type Mat4 = NodeProxyImpl<'mat4'>
195
- export type Texture = NodeProxyImpl<'texture'>
196
- export type Sampler2D = NodeProxyImpl<'sampler2D'>
197
- export type Struct = NodeProxyImpl<'struct'>
198
- export type StructFields = Record<string, NodeProxy>
199
- export type StructNode<T extends StructFields = any> = Omit<Struct, keyof T> & {
200
- [K in keyof T]: T[K] extends NodeProxy<infer U> ? NodeProxy<U> : never
158
+ export type Void = XImpl<'void'>
159
+ export type Bool = XImpl<'bool'>
160
+ export type UInt = XImpl<'uint'>
161
+ export type Int = XImpl<'int'>
162
+ export type Float = XImpl<'float'>
163
+ export type BVec2 = XImpl<'bvec2'>
164
+ export type IVec2 = XImpl<'ivec2'>
165
+ export type UVec2 = XImpl<'uvec2'>
166
+ export type Vec2 = XImpl<'vec2'>
167
+ export type BVec3 = XImpl<'bvec3'>
168
+ export type IVec3 = XImpl<'ivec3'>
169
+ export type UVec3 = XImpl<'uvec3'>
170
+ export type Vec3 = XImpl<'vec3'>
171
+ export type BVec4 = XImpl<'bvec4'>
172
+ export type IVec4 = XImpl<'ivec4'>
173
+ export type UVec4 = XImpl<'uvec4'>
174
+ export type Vec4 = XImpl<'vec4'>
175
+ export type Color = XImpl<'color'>
176
+ export type Mat2 = XImpl<'mat2'>
177
+ export type Mat3 = XImpl<'mat3'>
178
+ export type Mat4 = XImpl<'mat4'>
179
+ export type Texture = XImpl<'texture'>
180
+ export type Sampler2D = XImpl<'sampler2D'>
181
+ export type StructBase = XImpl<'struct'>
182
+ export type Struct<T extends StructFields = any> = Omit<StructBase, keyof T> & {
183
+ [K in keyof T]: T[K] extends X<infer U> ? X<U> : never
201
184
  } & {
202
- toVar(id?: string): StructNode<T>
203
- }
204
-
205
- export interface StructFactory<T extends StructFields> {
206
- (initialValues?: StructFields, instanceId?: string): StructNode<T>
185
+ toVar(id?: string): Struct<T>
207
186
  }
208
187
 
209
188
  export interface ConstantsToType {
@@ -230,74 +209,113 @@ export interface ConstantsToType {
230
209
  mat4: Mat4
231
210
  texture: Texture
232
211
  sampler2D: Sampler2D
233
- struct: Struct
212
+ struct: StructBase
234
213
  }
235
214
 
236
- export type NodeProxy<T extends Constants = Constants> = T extends keyof ConstantsToType
237
- ? ConstantsToType[T]
238
- : BaseNodeProxy<T>
215
+ /**
216
+ * X and Y
217
+ */
218
+ type XImpl<T extends C> = _X<T> & {
219
+ [K in string as K extends Methods ? never : K]: any
220
+ } & {
221
+ [K in Swizzles]: X<InferSwizzleType<K>>
222
+ }
239
223
 
240
- export type X<T extends Constants = Constants> = number | string | boolean | undefined | NodeProxy<T>
224
+ type C = Constants
225
+
226
+ export type X<T extends C = C> = T extends keyof ConstantsToType ? ConstantsToType[T] : _X<T>
227
+ export type Y<T extends C = C> = number | number[] | string | boolean | undefined | X<T>
228
+
229
+ type Methods =
230
+ | Functions
231
+ | Operators
232
+ | Conversions
233
+ | Swizzles
234
+ // system property
235
+ | '__nodeType'
236
+ | 'type'
237
+ | 'props'
238
+ | 'isProxy'
239
+ | 'assign'
240
+ | 'toVar'
241
+ | 'toString'
242
+ | 'element'
243
+ | 'select'
241
244
 
242
- export interface BaseNodeProxy<T extends Constants> {
245
+ interface _X<T extends C> {
243
246
  // System properties
244
247
  readonly __nodeType?: T
245
- assign(x: any): NodeProxy<T>
246
- toVar(name?: string): NodeProxy<T>
248
+ assign(x: any): X<T>
249
+ select(x: number | X<T>, y: X<'bool'>): X<T>
250
+ fragment(c: NodeContext): string
251
+ toVar(name?: string): X<T>
247
252
  toString(c?: NodeContext): string
253
+ fragment(c?: NodeContext): string
254
+ compute(c?: NodeContext): string
255
+ vertex(c?: NodeContext): string
248
256
  type: NodeTypes
249
257
  props: NodeProps
250
258
  isProxy: true
251
259
  listeners: Set<(value: any) => void>
252
260
 
253
261
  // Element access for array/matrix types
254
- element<Index extends X>(index: Index): NodeProxy<InferArrayElement<T>>
262
+ element<Index extends X>(index: Index): X<InferArrayElement<T>>
255
263
 
256
264
  // Enhanced member access with type preservation
257
- member<K extends string>(
258
- key: K
259
- ): K extends keyof T ? (T[K] extends NodeProxy<infer U> ? NodeProxy<U> : never) : never
260
-
261
- // Operators methods
262
- add<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
263
- sub<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
264
- mul<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
265
- div<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
266
- mod<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
267
- equal<U extends Constants>(x: X<U>): Bool
268
- notEqual<U extends Constants>(x: X<U>): Bool
269
- lessThan<U extends Constants>(x: X<U>): Bool
270
- lessThanEqual<U extends Constants>(x: X<U>): Bool
271
- greaterThan<U extends Constants>(x: X<U>): Bool
272
- greaterThanEqual<U extends Constants>(x: X<U>): Bool
273
- and(x: X<'bool'>): Bool
274
- or(x: X<'bool'>): Bool
265
+ member<K extends string>(key: K): K extends keyof T ? (T[K] extends X<infer U> ? X<U> : never) : never
266
+
267
+ // Operators methods with unified type validation
268
+ add<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<InferOperator<T, U>>
269
+ sub<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<InferOperator<T, U>>
270
+ mul<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<InferOperator<T, U>>
271
+ div<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<InferOperator<T, U>>
272
+ mod<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<InferOperator<T, U>>
273
+ equal<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
274
+ notEqual<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
275
+ lessThan<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
276
+ lessThanEqual<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
277
+ greaterThan<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
278
+ greaterThanEqual<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): Bool
279
+ and(x: Bool): Bool
280
+ or(x: Bool): Bool
275
281
  not(): Bool
276
282
 
277
283
  // Bitwise operators
278
- bitAnd(x: X<T>): NodeProxy<T>
279
- bitOr(x: X<T>): NodeProxy<T>
280
- bitXor(x: X<T>): NodeProxy<T>
281
- bitNot(): NodeProxy<T>
282
- shiftLeft<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
283
- shiftRight<U extends Constants>(x: X<U>): NodeProxy<InferOperator<T, U>>
284
+ bitAnd(x: X<T>): X<T>
285
+ bitOr(x: X<T>): X<T>
286
+ bitXor(x: X<T>): X<T>
287
+ bitNot(): X<T>
288
+ shiftLeft<U extends C>(x: X<U>): X<InferOperator<T, U>>
289
+ shiftRight<U extends C>(x: X<U>): X<InferOperator<T, U>>
290
+
291
+ // Assignment operators
292
+ addAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
293
+ subAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
294
+ mulAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
295
+ divAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
296
+ modAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
297
+ bitAndAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
298
+ bitOrAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
299
+ bitXorAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
300
+ shiftLeftAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
301
+ shiftRightAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>
284
302
 
285
303
  // Conversion methods
286
304
  toBool(): Bool
287
- toUint(): UInt
305
+ toUInt(): UInt
288
306
  toInt(): Int
289
307
  toFloat(): Float
290
- toBvec2(): BVec2
291
- toIvec2(): IVec2
292
- toUvec2(): UVec2
308
+ toBVec2(): BVec2
309
+ toIVec2(): IVec2
310
+ toUVec2(): UVec2
293
311
  toVec2(): Vec2
294
- toBvec3(): BVec3
295
- toIvec3(): IVec3
296
- toUvec3(): UVec3
312
+ toBVec3(): BVec3
313
+ toIVec3(): IVec3
314
+ toUVec3(): UVec3
297
315
  toVec3(): Vec3
298
- toBvec4(): BVec4
299
- toIvec4(): IVec4
300
- toUvec4(): UVec4
316
+ toBVec4(): BVec4
317
+ toIVec4(): IVec4
318
+ toUVec4(): UVec4
301
319
  toVec4(): Vec4
302
320
  toColor(): Color
303
321
  toMat2(): Mat2
@@ -312,15 +330,26 @@ export interface BaseNodeProxy<T extends Constants> {
312
330
  // 0. Always return bool
313
331
  all(): Bool
314
332
  any(): Bool
315
- // 2. Always return float
316
- determinant(): Float
317
- distance<U extends Constants>(y: X<U>): Float
318
- dot<U extends Constants>(y: X<U>): Float
319
- length(): Float
333
+
334
+ // 2. WGSL-compliant return types with individual function constraints
335
+ determinant(): T extends 'mat2' | 'mat3' | 'mat4' ? Float : never
336
+ distance<U extends C>(
337
+ y: T extends 'vec2' | 'vec3' | 'vec4' ? (U extends T ? number | X<U> : never) : never
338
+ ): Float
339
+ dot<U extends C>(
340
+ y: T extends 'vec2' | 'vec3' | 'vec4' | 'ivec2' | 'ivec3' | 'ivec4'
341
+ ? U extends T
342
+ ? number | X<U>
343
+ : never
344
+ : never
345
+ ): T extends `ivec${string}` ? Int : Float
346
+ length(): T extends 'vec2' | 'vec3' | 'vec4' ? Float : never
320
347
  lengthSq(): Float
321
348
  luminance(): Float
322
- // 3. Always return vec3
323
- cross<U extends Constants>(y: X<U>): Vec3
349
+
350
+ // 3. Always return vec3 with vector constraint
351
+ cross<U extends C = 'vec3'>(y: T extends 'vec3' ? (U extends 'vec3' ? number | X<U> : never) : never): Vec3
352
+
324
353
  // 4. Always return vec4
325
354
  cubeTexture(...args: X[]): Vec4
326
355
  texture(...args: X[]): Vec4
@@ -328,59 +357,64 @@ export interface BaseNodeProxy<T extends Constants> {
328
357
  textureLod(...args: X[]): Vec4
329
358
 
330
359
  /**
331
- * 3.1. unified with:
332
- * 1.1. index.ts functions and
333
- * 2.1. const.ts FUNCTIONS
360
+ * 3.2. unified with:
361
+ * 1.2. index.ts functions and
362
+ * 2.2. const.ts FUNCTIONS
334
363
  */
335
- // 0. Component-wise functions
336
- abs(): NodeProxy<T>
337
- acos(): NodeProxy<T>
338
- acosh(): NodeProxy<T>
339
- asin(): NodeProxy<T>
340
- asinh(): NodeProxy<T>
341
- atan(): NodeProxy<T>
342
- atanh(): NodeProxy<T>
343
- ceil(): NodeProxy<T>
344
- cos(): NodeProxy<T>
345
- cosh(): NodeProxy<T>
346
- degrees(): NodeProxy<T>
347
- dFdx(): NodeProxy<T>
348
- dFdy(): NodeProxy<T>
349
- exp(): NodeProxy<T>
350
- exp2(): NodeProxy<T>
351
- floor(): NodeProxy<T>
352
- fract(): NodeProxy<T>
353
- fwidth(): NodeProxy<T>
354
- inverseSqrt(): NodeProxy<T>
355
- log(): NodeProxy<T>
356
- log2(): NodeProxy<T>
357
- negate(): NodeProxy<T>
358
- normalize(): NodeProxy<T>
359
- oneMinus(): NodeProxy<T>
360
- radians(): NodeProxy<T>
361
- reciprocal(): NodeProxy<T>
362
- round(): NodeProxy<T>
363
- saturate(): NodeProxy<T>
364
- sign(): NodeProxy<T>
365
- sin(): NodeProxy<T>
366
- sinh(): NodeProxy<T>
367
- sqrt(): NodeProxy<T>
368
- tan(): NodeProxy<T>
369
- tanh(): NodeProxy<T>
370
- trunc(): NodeProxy<T>
371
-
372
- // 1. Functions where first argument determines return type
373
- atan2<U extends Constants>(x: X<U>): NodeProxy<T>
374
- clamp<U extends Constants, V>(mix: X<U>, max: V): NodeProxy<InferOperator<T, U>>
375
- max<U extends Constants>(y: X<U>): NodeProxy<InferOperator<T, U>>
376
- min<U extends Constants>(y: X<U>): NodeProxy<InferOperator<T, U>>
377
- mix<U extends Constants, V>(y: X<U>, a: V): NodeProxy<InferOperator<T, U>>
378
- pow<U extends Constants>(y: X<U>): NodeProxy<T>
379
- reflect<U extends Constants>(N: X<U>): NodeProxy<T>
380
- refract<U extends Constants>(N: X<U>, eta: any): NodeProxy<T>
381
-
382
- // 2. Functions where not first argument determines return type
383
- smoothstep<U extends Constants, V>(edge0: X<U>, edge1: V): NodeProxy<InferOperator<T, U>>
384
- step<U extends Constants>(edge: X<U>): NodeProxy<InferOperator<T, U>>
364
+ // 0. Component-wise functions with type validation
365
+ abs(): X<T>
366
+ acos(): X<T>
367
+ acosh(): X<T>
368
+ asin(): X<T>
369
+ asinh(): X<T>
370
+ atan(): X<T>
371
+ atanh(): X<T>
372
+ ceil(): X<T>
373
+ cos(): X<T>
374
+ cosh(): X<T>
375
+ degrees(): X<T>
376
+ dFdx(): X<T>
377
+ dFdy(): X<T>
378
+ exp(): X<T>
379
+ exp2(): X<T>
380
+ floor(): X<T>
381
+ fract(): X<T>
382
+ fwidth(): X<T>
383
+ inverseSqrt(): X<T>
384
+ log(): X<T>
385
+ log2(): X<T>
386
+ negate(): X<T>
387
+ normalize(): T extends 'vec2' | 'vec3' | 'vec4' ? X<T> : never
388
+ oneMinus(): X<T>
389
+ radians(): X<T>
390
+ reciprocal(): X<T>
391
+ round(): X<T>
392
+ saturate(): X<T>
393
+ sign(): X<T>
394
+ sin(): X<T>
395
+ sinh(): X<T>
396
+ sqrt(): X<T>
397
+ tan(): X<T>
398
+ tanh(): X<T>
399
+ trunc(): X<T>
400
+
401
+ // 1. Functions where first argument determines return type with unified parameter types
402
+ atan2<U extends C>(x: number | X<U>): X<T>
403
+ clamp<U extends C>(min: number | X<U>, max: number | X<U>): X<InferOperator<T, U>>
404
+ max<U extends C>(y: number | X<U>): X<InferOperator<T, U>>
405
+ min<U extends C>(y: number | X<U>): X<InferOperator<T, U>>
406
+ mix<U extends C>(y: number | X<U>, a: number | Float | X<U>): X<InferOperator<T, U>>
407
+ pow<U extends C>(y: number | X<U>): X<T>
408
+ reflect<U extends C>(
409
+ N: T extends 'vec2' | 'vec3' | 'vec4' ? (U extends T ? number | X<U> : never) : never
410
+ ): X<T>
411
+ refract<U extends C>(
412
+ N: T extends 'vec2' | 'vec3' | 'vec4' ? (U extends T ? number | X<U> : never) : never,
413
+ eta: number | Float
414
+ ): T extends 'vec2' | 'vec3' | 'vec4' ? X<T> : never
415
+
416
+ // 2. Functions where not first argument determines return type with unified parameter types
417
+ smoothstep<U extends C>(edge0: number | X<U>, edge1: number | X<U>): X<InferOperator<T, U>>
418
+ step<U extends C>(edge: number | X<U>): X<InferOperator<T, U>>
385
419
  // @NOTE: mod is operator
386
420
  }