glre 0.39.0 → 0.41.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 (281) hide show
  1. package/README.md +8 -4
  2. package/dist/addons.cjs +1 -1
  3. package/dist/addons.cjs.map +1 -1
  4. package/dist/addons.d.ts +853 -22
  5. package/dist/addons.js +1 -1
  6. package/dist/addons.js.map +1 -1
  7. package/dist/index.cjs +8 -8
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +47 -28
  10. package/dist/index.js +8 -8
  11. package/dist/index.js.map +1 -1
  12. package/dist/native.d.ts +60 -33
  13. package/dist/node.cjs +59 -30
  14. package/dist/node.cjs.map +1 -1
  15. package/dist/node.d.ts +39 -26
  16. package/dist/node.js +59 -30
  17. package/dist/node.js.map +1 -1
  18. package/dist/react.d.ts +47 -28
  19. package/dist/solid.d.ts +47 -28
  20. package/package.json +24 -24
  21. package/src/addons/animation/easing/backIn.ts +10 -0
  22. package/src/addons/animation/easing/backInOut.ts +12 -0
  23. package/src/addons/animation/easing/backOut.ts +10 -0
  24. package/src/addons/animation/easing/bounceIn.ts +10 -0
  25. package/src/addons/animation/easing/bounceInOut.ts +13 -0
  26. package/src/addons/animation/easing/bounceOut.ts +30 -0
  27. package/src/addons/animation/easing/circularIn.ts +9 -0
  28. package/src/addons/animation/easing/circularInOut.ts +11 -0
  29. package/src/addons/animation/easing/circularOut.ts +9 -0
  30. package/src/addons/animation/easing/cubicIn.ts +9 -0
  31. package/src/addons/animation/easing/cubicInOut.ts +11 -0
  32. package/src/addons/animation/easing/cubicOut.ts +10 -0
  33. package/src/addons/animation/easing/elasticIn.ts +10 -0
  34. package/src/addons/animation/easing/elasticInOut.ts +21 -0
  35. package/src/addons/animation/easing/elasticOut.ts +12 -0
  36. package/src/addons/animation/easing/exponentialIn.ts +9 -0
  37. package/src/addons/animation/easing/exponentialInOut.ts +13 -0
  38. package/src/addons/animation/easing/exponentialOut.ts +9 -0
  39. package/src/addons/animation/easing/index.ts +33 -0
  40. package/src/addons/animation/easing/linearIn.ts +9 -0
  41. package/src/addons/animation/easing/linearInOut.ts +9 -0
  42. package/src/addons/animation/easing/linearOut.ts +9 -0
  43. package/src/addons/animation/easing/quadraticIn.ts +9 -0
  44. package/src/addons/animation/easing/quadraticInOut.ts +10 -0
  45. package/src/addons/animation/easing/quadraticOut.ts +9 -0
  46. package/src/addons/animation/easing/quarticIn.ts +9 -0
  47. package/src/addons/animation/easing/quarticInOut.ts +11 -0
  48. package/src/addons/animation/easing/quarticOut.ts +10 -0
  49. package/src/addons/animation/easing/quinticIn.ts +9 -0
  50. package/src/addons/animation/easing/quinticInOut.ts +11 -0
  51. package/src/addons/animation/easing/quinticOut.ts +9 -0
  52. package/src/addons/animation/easing/sineIn.ts +10 -0
  53. package/src/addons/animation/easing/sineInOut.ts +10 -0
  54. package/src/addons/animation/easing/sineOut.ts +10 -0
  55. package/src/addons/color/palette/macbeth.ts +42 -0
  56. package/src/addons/color/space/cmyk2rgb.ts +12 -0
  57. package/src/addons/color/space/gamma2linear.ts +19 -0
  58. package/src/addons/color/space/hsl2rgb.ts +20 -0
  59. package/src/addons/color/space/hsv2rgb.ts +18 -0
  60. package/src/addons/color/space/hue2rgb.ts +12 -0
  61. package/src/addons/color/space/index.ts +29 -0
  62. package/src/addons/color/space/lab2lch.ts +22 -0
  63. package/src/addons/color/space/lab2rgb.ts +19 -0
  64. package/src/addons/color/space/lab2xyz.ts +32 -0
  65. package/src/addons/color/space/lch2lab.ts +21 -0
  66. package/src/addons/color/space/lch2rgb.ts +22 -0
  67. package/src/addons/color/space/linear2gamma.ts +19 -0
  68. package/src/addons/color/space/oklab2rgb.ts +35 -0
  69. package/src/addons/color/space/rgb2cmyk.ts +13 -0
  70. package/src/addons/color/space/rgb2hcv.ts +29 -0
  71. package/src/addons/color/space/rgb2hsl.ts +23 -0
  72. package/src/addons/color/space/rgb2hsv.ts +36 -0
  73. package/src/addons/color/space/rgb2hue.ts +29 -0
  74. package/src/addons/color/space/rgb2lab.ts +19 -0
  75. package/src/addons/color/space/rgb2lch.ts +22 -0
  76. package/src/addons/color/space/rgb2oklab.ts +45 -0
  77. package/src/addons/color/space/rgb2srgb.ts +34 -0
  78. package/src/addons/color/space/rgb2xyz.ts +20 -0
  79. package/src/addons/color/space/rgb2yiq.ts +22 -0
  80. package/src/addons/color/space/rgb2yuv.ts +32 -0
  81. package/src/addons/color/space/srgb2rgb.ts +34 -0
  82. package/src/addons/color/space/xyz2lab.ts +27 -0
  83. package/src/addons/color/space/xyz2rgb.ts +30 -0
  84. package/src/addons/color/space/yiq2rgb.ts +22 -0
  85. package/src/addons/color/space/yuv2rgb.ts +32 -0
  86. package/src/addons/draw/arrows.ts +75 -0
  87. package/src/addons/draw/axis.ts +57 -0
  88. package/src/addons/draw/bridge.ts +81 -0
  89. package/src/addons/draw/char.ts +30 -0
  90. package/src/addons/draw/circle.ts +29 -0
  91. package/src/addons/draw/fill.ts +25 -0
  92. package/src/addons/draw/flip.ts +45 -0
  93. package/src/addons/draw/hex.ts +29 -0
  94. package/src/addons/draw/index.ts +13 -0
  95. package/src/addons/draw/line.ts +16 -0
  96. package/src/addons/draw/point.ts +30 -0
  97. package/src/addons/draw/rect.ts +52 -0
  98. package/src/addons/draw/stroke.ts +31 -0
  99. package/src/addons/draw/tri.ts +29 -0
  100. package/src/addons/generative/cnoise.ts +239 -0
  101. package/src/addons/generative/curl.ts +64 -0
  102. package/src/addons/generative/fbm.ts +69 -0
  103. package/src/addons/generative/gerstnerWave.ts +21 -0
  104. package/src/addons/generative/gnoise.ts +113 -0
  105. package/src/addons/generative/index.ts +15 -0
  106. package/src/addons/generative/noised.ts +139 -0
  107. package/src/addons/generative/pnoise.ts +249 -0
  108. package/src/addons/generative/psrdnoise.ts +277 -0
  109. package/src/addons/generative/random.ts +136 -0
  110. package/src/addons/generative/snoise.ts +199 -0
  111. package/src/addons/generative/srandom.ts +90 -0
  112. package/src/addons/generative/voronoi.ts +134 -0
  113. package/src/addons/generative/voronoise.ts +69 -0
  114. package/src/addons/generative/wavelet.ts +77 -0
  115. package/src/addons/generative/worley.ts +99 -0
  116. package/src/addons/geometry/aabb/aabb.ts +8 -0
  117. package/src/addons/geometry/aabb/centroid.ts +10 -0
  118. package/src/addons/geometry/aabb/contain.ts +19 -0
  119. package/src/addons/geometry/aabb/diagonal.ts +10 -0
  120. package/src/addons/geometry/aabb/expand.ts +16 -0
  121. package/src/addons/geometry/aabb/index.ts +7 -0
  122. package/src/addons/geometry/aabb/intersect.ts +20 -0
  123. package/src/addons/geometry/aabb/square.ts +17 -0
  124. package/src/addons/geometry/index.ts +2 -0
  125. package/src/addons/geometry/triangle/area.ts +10 -0
  126. package/src/addons/geometry/triangle/barycentric.ts +50 -0
  127. package/src/addons/geometry/triangle/centroid.ts +10 -0
  128. package/src/addons/geometry/triangle/closestPoint.ts +85 -0
  129. package/src/addons/geometry/triangle/contain.ts +19 -0
  130. package/src/addons/geometry/triangle/distanceSq.ts +38 -0
  131. package/src/addons/geometry/triangle/index.ts +10 -0
  132. package/src/addons/geometry/triangle/intersect.ts +49 -0
  133. package/src/addons/geometry/triangle/normal.ts +12 -0
  134. package/src/addons/geometry/triangle/signedDistance.ts +31 -0
  135. package/src/addons/geometry/triangle/triangle.ts +9 -0
  136. package/src/addons/index.ts +8 -6
  137. package/src/addons/lighting/ray.ts +8 -0
  138. package/src/addons/math/aafloor.ts +13 -0
  139. package/src/addons/math/aafract.ts +38 -0
  140. package/src/addons/math/aamirror.ts +12 -0
  141. package/src/addons/math/aastep.ts +14 -0
  142. package/src/addons/math/absi.ts +9 -0
  143. package/src/addons/math/adaptiveThreshold.ts +24 -0
  144. package/src/addons/math/bump.ts +20 -0
  145. package/src/addons/math/const.ts +19 -0
  146. package/src/addons/math/cubic.ts +101 -0
  147. package/src/addons/math/cubicMix.ts +49 -0
  148. package/src/addons/math/decimate.ts +12 -0
  149. package/src/addons/math/dist.ts +143 -0
  150. package/src/addons/math/fcos.ts +11 -0
  151. package/src/addons/math/frac.ts +9 -0
  152. package/src/addons/math/gain.ts +14 -0
  153. package/src/addons/math/gaussian.ts +14 -0
  154. package/src/addons/math/grad4.ts +19 -0
  155. package/src/addons/math/hammersley.ts +54 -0
  156. package/src/addons/math/highPass.ts +12 -0
  157. package/src/addons/math/index.ts +63 -0
  158. package/src/addons/math/inside.ts +68 -0
  159. package/src/addons/math/invCubic.ts +9 -0
  160. package/src/addons/math/invQuartic.ts +9 -0
  161. package/src/addons/math/inverse.ts +9 -0
  162. package/src/addons/math/lengthSq.ts +10 -0
  163. package/src/addons/math/map.ts +27 -0
  164. package/src/addons/math/mirror.ts +12 -0
  165. package/src/addons/math/mmax.ts +27 -0
  166. package/src/addons/math/mmin.ts +28 -0
  167. package/src/addons/math/mmix.ts +47 -0
  168. package/src/addons/math/mod2.ts +44 -0
  169. package/src/addons/math/mod289.ts +46 -0
  170. package/src/addons/math/modi.ts +15 -0
  171. package/src/addons/math/nyquist.ts +15 -0
  172. package/src/addons/math/pack.ts +15 -0
  173. package/src/addons/math/parabola.ts +12 -0
  174. package/src/addons/math/permute.ts +42 -0
  175. package/src/addons/math/pow2.ts +10 -0
  176. package/src/addons/math/pow3.ts +9 -0
  177. package/src/addons/math/pow5.ts +10 -0
  178. package/src/addons/math/pow7.ts +12 -0
  179. package/src/addons/math/powFast.ts +18 -0
  180. package/src/addons/math/quartic.ts +15 -0
  181. package/src/addons/math/quat/index.ts +14 -0
  182. package/src/addons/math/quat/quat2mat3.ts +28 -0
  183. package/src/addons/math/quat/quat2mat4.ts +16 -0
  184. package/src/addons/math/quat/quatAdd.ts +18 -0
  185. package/src/addons/math/quat/quatConj.ts +14 -0
  186. package/src/addons/math/quat/quatDiv.ts +18 -0
  187. package/src/addons/math/quat/quatIdentity.ts +9 -0
  188. package/src/addons/math/quat/quatInverse.ts +17 -0
  189. package/src/addons/math/quat/quatLength.ts +15 -0
  190. package/src/addons/math/quat/quatLengthSq.ts +14 -0
  191. package/src/addons/math/quat/quatLerp.ts +40 -0
  192. package/src/addons/math/quat/quatMul.ts +38 -0
  193. package/src/addons/math/quat/quatNeg.ts +14 -0
  194. package/src/addons/math/quat/quatNorm.ts +16 -0
  195. package/src/addons/math/quat/quatSub.ts +18 -0
  196. package/src/addons/math/quintic.ts +16 -0
  197. package/src/addons/math/rotate2d.ts +16 -0
  198. package/src/addons/math/rotate3d.ts +37 -0
  199. package/src/addons/math/rotate3dX.ts +20 -0
  200. package/src/addons/math/rotate3dY.ts +20 -0
  201. package/src/addons/math/rotate3dZ.ts +20 -0
  202. package/src/addons/math/rotate4d.ts +41 -0
  203. package/src/addons/math/rotate4dX.ts +21 -0
  204. package/src/addons/math/rotate4dY.ts +16 -0
  205. package/src/addons/math/rotate4dZ.ts +21 -0
  206. package/src/addons/math/saturateMediump.ts +11 -0
  207. package/src/addons/math/scale2d.ts +44 -0
  208. package/src/addons/math/scale3d.ts +17 -0
  209. package/src/addons/math/scale4d.ts +50 -0
  210. package/src/addons/math/smootherstep.ts +16 -0
  211. package/src/addons/math/taylorInvSqrt.ts +9 -0
  212. package/src/addons/math/toMat3.ts +14 -0
  213. package/src/addons/math/toMat4.ts +14 -0
  214. package/src/addons/math/translate4d.ts +31 -0
  215. package/src/addons/math/unpack.ts +88 -0
  216. package/src/addons/sdf/boxSDF.ts +24 -0
  217. package/src/addons/sdf/circleSDF.ts +20 -0
  218. package/src/addons/sdf/crossSDF.ts +17 -0
  219. package/src/addons/sdf/hexSDF.ts +18 -0
  220. package/src/addons/sdf/index.ts +7 -0
  221. package/src/addons/sdf/lineSDF.ts +33 -0
  222. package/src/addons/sdf/rectSDF.ts +46 -0
  223. package/src/addons/sdf/sphereSDF.ts +20 -0
  224. package/src/addons/sdf/triSDF.ts +14 -0
  225. package/src/addons/space/aspect.ts +14 -0
  226. package/src/addons/space/bracketing.ts +44 -0
  227. package/src/addons/space/brickTile.ts +44 -0
  228. package/src/addons/space/cart2polar.ts +20 -0
  229. package/src/addons/space/center.ts +32 -0
  230. package/src/addons/space/checkerTile.ts +41 -0
  231. package/src/addons/space/depth2viewZ.ts +43 -0
  232. package/src/addons/space/displace.ts +55 -0
  233. package/src/addons/space/equirect2xyz.ts +17 -0
  234. package/src/addons/space/eulerView.ts +19 -0
  235. package/src/addons/space/fisheye2xyz.ts +18 -0
  236. package/src/addons/space/flipY.ts +25 -0
  237. package/src/addons/space/hexTile.ts +18 -0
  238. package/src/addons/space/index.ts +38 -0
  239. package/src/addons/space/kaleidoscope.ts +48 -0
  240. package/src/addons/space/linearizeDepth.ts +17 -0
  241. package/src/addons/space/lookAt.ts +49 -0
  242. package/src/addons/space/lookAtView.ts +40 -0
  243. package/src/addons/space/mirrorTile.ts +73 -0
  244. package/src/addons/space/nearest.ts +13 -0
  245. package/src/addons/space/orthographic.ts +25 -0
  246. package/src/addons/space/parallaxMapping.ts +149 -0
  247. package/src/addons/space/perspective.ts +24 -0
  248. package/src/addons/space/polar2cart.ts +24 -0
  249. package/src/addons/space/ratio.ts +14 -0
  250. package/src/addons/space/rotate.ts +37 -0
  251. package/src/addons/space/rotateX.ts +54 -0
  252. package/src/addons/space/rotateY.ts +54 -0
  253. package/src/addons/space/rotateZ.ts +54 -0
  254. package/src/addons/space/scale.ts +13 -0
  255. package/src/addons/space/sprite.ts +16 -0
  256. package/src/addons/space/sqTile.ts +20 -0
  257. package/src/addons/space/tbn.ts +26 -0
  258. package/src/addons/space/translate.ts +12 -0
  259. package/src/addons/space/triTile.ts +32 -0
  260. package/src/addons/space/uncenter.ts +32 -0
  261. package/src/addons/space/unratio.ts +12 -0
  262. package/src/addons/space/viewZ2depth.ts +25 -0
  263. package/src/addons/space/windmillTile.ts +58 -0
  264. package/src/addons/space/xyz2equirect.ts +10 -0
  265. package/src/index.ts +5 -2
  266. package/src/node/build.ts +62 -52
  267. package/src/node/create.ts +3 -0
  268. package/src/node/index.ts +1 -2
  269. package/src/node/scope.ts +27 -25
  270. package/src/node/types.ts +16 -12
  271. package/src/node/utils/const.ts +12 -11
  272. package/src/node/utils/index.ts +15 -12
  273. package/src/node/utils/infer.ts +17 -6
  274. package/src/node/utils/parse.ts +37 -13
  275. package/src/node/utils/utils.ts +40 -22
  276. package/src/types.ts +13 -5
  277. package/src/utils/helpers.ts +80 -7
  278. package/src/utils/pipeline.ts +21 -5
  279. package/src/utils/program.ts +68 -42
  280. package/src/utils/webgl.ts +47 -37
  281. package/src/utils/webgpu.ts +30 -38
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as refr from 'refr';
2
2
  import { Queue, Frame } from 'refr';
3
3
  import { EventState, Nested } from 'reev';
4
4
 
5
- declare const CONVERSIONS: readonly ["toBool", "toUint", "toInt", "toFloat", "toBvec2", "toIvec2", "toUvec2", "toVec2", "toBvec3", "toIvec3", "toUvec3", "toVec3", "toBvec4", "toIvec4", "toUvec4", "toVec4", "toColor", "toMat2", "toMat3", "toMat4"];
5
+ declare const CONVERSIONS: readonly ["toBool", "toUInt", "toInt", "toFloat", "toBVec2", "toIVec2", "toUVec2", "toVec2", "toBVec3", "toIVec3", "toUVec3", "toVec3", "toBVec4", "toIVec4", "toUVec4", "toVec4", "toColor", "toMat2", "toMat3", "toMat4"];
6
6
  declare const TYPE_MAPPING: {
7
7
  readonly bool: "bool";
8
8
  readonly uint: "u32";
@@ -67,7 +67,7 @@ declare const OPERATOR_TYPE_RULES: readonly [readonly ["float", "vec2", "vec2"],
67
67
  * 1.2. index.ts functions and
68
68
  * 3.2. types.ts _N
69
69
  */
70
- declare const FUNCTIONS: readonly [...("texture" | "all" | "any" | "determinant" | "distance" | "dot" | "length" | "lengthSq" | "luminance" | "cross" | "cubeTexture" | "texelFetch" | "textureLod")[], "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "cos", "cosh", "dFdx", "dFdy", "degrees", "exp", "exp2", "floor", "fract", "fwidth", "inverseSqrt", "log", "log2", "negate", "normalize", "oneMinus", "radians", "reciprocal", "round", "saturate", "sign", "sin", "sinh", "sqrt", "tan", "tanh", "trunc", "atan2", "clamp", "max", "min", "mix", "pow", "reflect", "refract", "smoothstep", "step"];
70
+ declare const FUNCTIONS: readonly [...("texture" | "all" | "any" | "determinant" | "distance" | "dot" | "length" | "lengthSq" | "luminance" | "cross" | "cubeTexture" | "texelFetch" | "textureLod")[], "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "cos", "cosh", "dFdx", "dFdy", "degrees", "exp", "exp2", "floor", "fract", "fwidth", "inverse", "inverseSqrt", "log", "log2", "negate", "normalize", "oneMinus", "radians", "reciprocal", "round", "sign", "sin", "sinh", "sqrt", "tan", "tanh", "trunc", "saturate", "atan2", "clamp", "max", "min", "mix", "pow", "reflect", "refract", "smoothstep", "step"];
71
71
 
72
72
  type Constants = (typeof CONSTANTS)[number] | 'void';
73
73
  type Conversions = (typeof CONVERSIONS)[number];
@@ -81,14 +81,14 @@ interface FnLayout {
81
81
  type: C | 'auto';
82
82
  inputs?: Array<{
83
83
  name: string;
84
- type: C;
84
+ type: C | 'auto';
85
85
  }>;
86
86
  }
87
87
  type StructFields = Record<string, X>;
88
88
  /**
89
89
  * node
90
90
  */
91
- type NodeTypes = 'attribute' | 'storage' | 'uniform' | 'constant' | 'variable' | 'varying' | 'ternary' | 'builtin' | 'conversion' | 'operator' | 'function' | 'struct' | 'member' | 'element' | 'gather' | 'scatter' | 'scope' | 'assign' | 'loop' | 'define' | 'if' | 'switch' | 'declare' | 'return' | 'break' | 'continue';
91
+ type NodeTypes = 'attribute' | 'instance' | 'storage' | 'uniform' | 'constant' | 'variable' | 'varying' | 'ternary' | 'builtin' | 'conversion' | 'operator' | 'function' | 'struct' | 'member' | 'element' | 'gather' | 'scatter' | 'scope' | 'assign' | 'loop' | 'define' | 'if' | 'switch' | 'declare' | 'return' | 'break' | 'continue';
92
92
  interface NodeProps {
93
93
  id?: string;
94
94
  args?: any[];
@@ -154,7 +154,7 @@ type Color = XImpl<'color'>;
154
154
  type Mat2 = XImpl<'mat2'>;
155
155
  type Mat3 = XImpl<'mat3'>;
156
156
  type Mat4 = XImpl<'mat4'>;
157
- type Texture = XImpl<'texture'>;
157
+ type Texture$1 = XImpl<'texture'>;
158
158
  type Sampler2D = XImpl<'sampler2D'>;
159
159
  type StructBase = XImpl<'struct'>;
160
160
  interface ConstantsToType {
@@ -179,7 +179,7 @@ interface ConstantsToType {
179
179
  mat2: Mat2;
180
180
  mat3: Mat3;
181
181
  mat4: Mat4;
182
- texture: Texture;
182
+ texture: Texture$1;
183
183
  sampler2D: Sampler2D;
184
184
  struct: StructBase;
185
185
  }
@@ -193,10 +193,11 @@ type XImpl<T extends C> = _X<T> & {
193
193
  };
194
194
  type C = Constants;
195
195
  type X<T extends C = C> = T extends keyof ConstantsToType ? ConstantsToType[T] : _X<T>;
196
- type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element';
196
+ type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element' | 'select';
197
197
  interface _X<T extends C> {
198
198
  readonly __nodeType?: T;
199
199
  assign(x: any): X<T>;
200
+ select(x: number | X<T>, y: X<'bool'>): X<T>;
200
201
  fragment(c: NodeContext): string;
201
202
  toVar(name?: string): X<T>;
202
203
  toString(c?: NodeContext): string;
@@ -240,20 +241,20 @@ interface _X<T extends C> {
240
241
  shiftLeftAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>;
241
242
  shiftRightAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>;
242
243
  toBool(): Bool;
243
- toUint(): UInt;
244
+ toUInt(): UInt;
244
245
  toInt(): Int;
245
246
  toFloat(): Float;
246
- toBvec2(): BVec2;
247
- toIvec2(): IVec2;
248
- toUvec2(): UVec2;
247
+ toBVec2(): BVec2;
248
+ toIVec2(): IVec2;
249
+ toUVec2(): UVec2;
249
250
  toVec2(): Vec2;
250
- toBvec3(): BVec3;
251
- toIvec3(): IVec3;
252
- toUvec3(): UVec3;
251
+ toBVec3(): BVec3;
252
+ toIVec3(): IVec3;
253
+ toUVec3(): UVec3;
253
254
  toVec3(): Vec3;
254
- toBvec4(): BVec4;
255
- toIvec4(): IVec4;
256
- toUvec4(): UVec4;
255
+ toBVec4(): BVec4;
256
+ toIVec4(): IVec4;
257
+ toUVec4(): UVec4;
257
258
  toVec4(): Vec4;
258
259
  toColor(): Color;
259
260
  toMat2(): Mat2;
@@ -337,14 +338,17 @@ type GL = EventState<{
337
338
  isWebGL: boolean;
338
339
  isError: boolean;
339
340
  isLoop: boolean;
341
+ isDebug: boolean;
342
+ isDepth: boolean;
340
343
  isGL: true;
341
344
  width?: number;
342
345
  height?: number;
343
346
  size: [number, number];
344
347
  mouse: [number, number];
345
348
  count: number;
349
+ instanceCount: number;
350
+ particleCount: number | [number, number] | [number, number, number];
346
351
  loading: number;
347
- particles: 64 | 256 | 576 | 1024 | 1600 | 2304 | 3136 | 4096 | 4096 | 5184 | 6400;
348
352
  el: HTMLCanvasElement;
349
353
  vs?: string | Vec4;
350
354
  cs?: string | Void;
@@ -371,7 +375,7 @@ type GL = EventState<{
371
375
  error(e?: string): void;
372
376
  render(): void;
373
377
  resize(e?: Event): void;
374
- mousemove(e: Event): void;
378
+ mousemove(e: MouseEvent): void;
375
379
  loop(): void;
376
380
  /**
377
381
  * setter
@@ -381,16 +385,21 @@ type GL = EventState<{
381
385
  uniform(target: {
382
386
  [key: string]: Uniform;
383
387
  }): GL;
384
- _texture?(key: string, value: string): GL;
385
- texture(key: string, value: string): GL;
388
+ _texture?(key: string, value: Texture): GL;
389
+ texture(key: string, value: Texture): GL;
386
390
  texture(target: {
387
- [key: string]: string;
391
+ [key: string]: Texture;
388
392
  }): GL;
389
393
  _attribute?(key: string, value: Attribute, iboValue?: Attribute): GL;
390
394
  attribute(key: string, value: Attribute, iboValue?: Attribute): GL;
391
395
  attribute(target: {
392
396
  [key: string]: Attribute;
393
397
  }): GL;
398
+ _instance?(key: string, value: Attribute, at?: number): GL;
399
+ instance(key: string, value: Attribute, at?: number): GL;
400
+ instance(target: {
401
+ [key: string]: Attribute;
402
+ }): GL;
394
403
  _storage?(key: string, value: Storage): GL;
395
404
  storage(key: string, value: Storage): GL;
396
405
  storage(target: {
@@ -398,6 +407,7 @@ type GL = EventState<{
398
407
  }): GL;
399
408
  }>;
400
409
  type Uniform = number | number[] | Float32Array;
410
+ type Texture = string | HTMLImageElement | HTMLVideoElement;
401
411
  type Attribute = number[] | Float32Array;
402
412
  type Storage = number[] | Float32Array;
403
413
  /**
@@ -421,6 +431,7 @@ interface AttribData {
421
431
  buffer: GPUBuffer;
422
432
  location: number;
423
433
  stride: number;
434
+ isInstance?: boolean;
424
435
  }
425
436
  interface StorageData {
426
437
  array: Float32Array;
@@ -452,14 +463,17 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
452
463
  isWebGL: boolean;
453
464
  isError: boolean;
454
465
  isLoop: boolean;
466
+ isDebug: boolean;
467
+ isDepth: boolean;
455
468
  isGL: true;
456
469
  width?: number;
457
470
  height?: number;
458
471
  size: [number, number];
459
472
  mouse: [number, number];
460
473
  count: number;
474
+ instanceCount: number;
475
+ particleCount: number | [number, number] | [number, number, number];
461
476
  loading: number;
462
- particles: 64 | 256 | 576 | 1024 | 1600 | 2304 | 3136 | 4096 | 4096 | 5184 | 6400;
463
477
  el: HTMLCanvasElement;
464
478
  vs?: string | Vec4;
465
479
  cs?: string | Void;
@@ -480,23 +494,28 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
480
494
  error(e?: string): void;
481
495
  render(): void;
482
496
  resize(e?: Event): void;
483
- mousemove(e: Event): void;
497
+ mousemove(e: MouseEvent): void;
484
498
  loop(): void;
485
499
  _uniform?(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
486
500
  uniform(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
487
501
  uniform(target: {
488
502
  [key: string]: number | number[] | Float32Array<ArrayBufferLike>;
489
503
  }): GL;
490
- _texture?(key: string, value: string): GL;
491
- texture(key: string, value: string): GL;
504
+ _texture?(key: string, value: string | HTMLImageElement | HTMLVideoElement): GL;
505
+ texture(key: string, value: string | HTMLImageElement | HTMLVideoElement): GL;
492
506
  texture(target: {
493
- [key: string]: string;
507
+ [key: string]: string | HTMLImageElement | HTMLVideoElement;
494
508
  }): GL;
495
509
  _attribute?(key: string, value: number[] | Float32Array<ArrayBufferLike>, iboValue?: number[] | Float32Array<ArrayBufferLike>): GL;
496
510
  attribute(key: string, value: number[] | Float32Array<ArrayBufferLike>, iboValue?: number[] | Float32Array<ArrayBufferLike>): GL;
497
511
  attribute(target: {
498
512
  [key: string]: number[] | Float32Array<ArrayBufferLike>;
499
513
  }): GL;
514
+ _instance?(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
515
+ instance(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
516
+ instance(target: {
517
+ [key: string]: number[] | Float32Array<ArrayBufferLike>;
518
+ }): GL;
500
519
  _storage?(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
501
520
  storage(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
502
521
  storage(target: {
@@ -504,4 +523,4 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
504
523
  }): GL;
505
524
  }, any[] | unknown[]>;
506
525
 
507
- export { AttribData, GL, StorageData, TextureData, UniformData, WebGLState, WebGPUState, createGL, createGL as default, isGL, isServer, isWebGPUSupported };
526
+ export { type AttribData, type GL, type StorageData, type TextureData, type UniformData, type WebGLState, type WebGPUState, createGL, createGL as default, isGL, isServer, isWebGPUSupported };
package/dist/index.js CHANGED
@@ -1,7 +1,4 @@
1
- import{durable as B,event as de}from"reev";import{createFrame as Ee,createQueue as ge}from"refr";var _={arr:Array.isArray,bol:e=>typeof e=="boolean",str:e=>typeof e=="string",num:e=>typeof e=="number",int:e=>Number.isInteger(e),fun:e=>typeof e=="function",und:e=>typeof e>"u",nul:e=>e===null,set:e=>e instanceof Set,map:e=>e instanceof Map,obj:e=>!!e&&e.constructor.name==="Object",nan:e=>typeof e=="number"&&Number.isNaN(e)};var W=e=>e instanceof Float32Array,F=(e,t,r)=>{e.loading++;let n=new Image;Object.assign(n,{src:t,crossOrigin:"anonymous"}),n.decode().then(()=>{r(n),e.loading--})};import{nested as A}from"reev";var N=(e,t,r,n=console.warn)=>{let o=e.createShader(r);if(!o)return n("Failed to create shader");if(e.shaderSource(o,t.trim()),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))return o;let a=e.getShaderInfoLog(o);e.deleteShader(o),n(`Could not compile shader: ${a}
2
-
3
- \u2193\u2193\u2193generated\u2193\u2193\u2193
4
- ${t}`)},C=(e,t,r,n)=>{let o=e.createProgram(),a=N(e,t,e.FRAGMENT_SHADER,n.error),s=N(e,r,e.VERTEX_SHADER,n.error);if(!a||!s)return;if(e.attachShader(o,a),e.attachShader(o,s),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;let i=e.getProgramInfoLog(o);e.deleteProgram(o),n.error(`Could not link program: ${i}`)},oe=(e,t)=>{let r=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,r),e.bufferData(e.ARRAY_BUFFER,new Float32Array(t),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),r},ae=(e,t)=>{let r=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,r),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(t),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),r},se=(e,t,r)=>{r&&(e=Math.max(...r)+1);let n=t.length/e;return Math.floor(n)},O=(e,t,r,n,o)=>{let a=oe(e,n),s=ae(e,o),i=se(r,n,o);e.bindBuffer(e.ARRAY_BUFFER,a),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,i,e.FLOAT,!1,0,0),s&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,s)},I=(e,t,r)=>{if(_.num(r))return e.uniform1f(t,r);let n=r.length;if(n<=4)return e[`uniform${n}fv`](t,r);n=Math.sqrt(n)<<0,e[`uniformMatrix${n}fv`](t,!1,r)},V=(e,t,r,n)=>{let o=e.createTexture();e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(r,n),e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,o)},k=(e,t,r,n,o,a,s)=>{let i=r*r,f=t.length/i;for(let u=0;u<i;u++)for(let m=0;m<Math.min(f,4);m++)s[4*u+m]=t[u*f+m]||0;e.activeTexture(e.TEXTURE0+a),e.bindTexture(e.TEXTURE_2D,n.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,r,0,e.RGBA,e.FLOAT,s),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,o.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,r,0,e.RGBA,e.FLOAT,s),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)},q=(e,t)=>{for(let{ping:r,pong:n}of t)e.deleteTexture(r.texture),e.deleteTexture(n.texture),e.deleteFramebuffer(r.buffer),e.deleteFramebuffer(n.buffer)},z=(e,t,r,n,o,a)=>{e.activeTexture(e.TEXTURE0+o),e.bindTexture(e.TEXTURE_2D,t.texture),e.uniform1i(n,o),a===0&&e.bindFramebuffer(e.FRAMEBUFFER,r.buffer);let s=e.COLOR_ATTACHMENT0+a;return e.framebufferTexture2D(e.FRAMEBUFFER,s,e.TEXTURE_2D,r.texture,0),s};var ie=`
1
+ import{durable as B,event as Re}from"reev";import{createFrame as _e,createQueue as he}from"refr";var E={arr:Array.isArray,bol:e=>typeof e=="boolean",str:e=>typeof e=="string",num:e=>typeof e=="number",int:e=>Number.isInteger(e),fun:e=>typeof e=="function",und:e=>typeof e>"u",nul:e=>e===null,set:e=>e instanceof Set,map:e=>e instanceof Map,obj:e=>!!e&&e.constructor.name==="Object",nan:e=>typeof e=="number"&&Number.isNaN(e)};var k=e=>e instanceof Float32Array,le=(e,t)=>{let r=new Image;Object.assign(r,{src:e,crossOrigin:"anonymous"}),r.decode().then(()=>t(r))},ge=(e,t)=>{let r=document.createElement("video");r.crossOrigin="anonymous",r.muted=!0,r.loop=!0,r.src=e,r.load(),r.play(),r.addEventListener("canplay",t.bind(null,r),{once:!0})};function M(e,t){if(!E.str(e))return t(e,e instanceof HTMLVideoElement);let r=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(r?ge:le)(e,o=>{t(o,r)})}var xe=e=>[1,2,3,4,9,16].includes(e),Te=(e,t=3)=>e%t===0?Math.floor(e/t):-1,C=(e,t=1,r=console.warn)=>{let n=Te(e,t);return xe(n)||r(`glre attribute error: Invalid attribute length ${e}. Must divide by vertex count (${t}) with valid stride (1,2,3,4,9,16)`),n},q=`
5
2
  #version 300 es
6
3
  precision mediump float;
7
4
  out vec4 fragColor;
@@ -9,13 +6,13 @@ uniform vec2 iResolution;
9
6
  void main() {
10
7
  fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);
11
8
  }
12
- `,K=`
9
+ `,X=`
13
10
  #version 300 es
14
11
  void main() {
15
12
  float x = float(gl_VertexID % 2) * 4.0 - 1.0;
16
13
  float y = float(gl_VertexID / 2) * 4.0 - 1.0;
17
14
  gl_Position = vec4(x, y, 0.0, 1.0);
18
- }`,ue=(e,t)=>{if(!e.cs)return null;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=A(()=>r++),a=_.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),s=C(t,a,K,e),i=Math.ceil(Math.sqrt(e.particles)),f=A(b=>t.getUniformLocation(s,b)),u=A(b=>{let x=new Float32Array(i*i*4),L={texture:t.createTexture(),buffer:t.createFramebuffer()},l={texture:t.createTexture(),buffer:t.createFramebuffer()};return{ping:L,pong:l,array:x,loc:f(b),unit:o(b)}});return{render:()=>{t.useProgram(s);let b=u.map.values().map(({ping:x,pong:L,loc:l,unit:y},U)=>{let[P,S]=n%2?[x,L]:[L,x];return z(t,P,S,l,y,U)});t.drawBuffers(b),t.drawArrays(t.TRIANGLES,0,3),t.bindFramebuffer(t.FRAMEBUFFER,null),n++},clean:()=>{t.deleteProgram(s),q(t,u.map.values())},_uniform:(b,x)=>{t.useProgram(s),I(t,f(b),x)},_storage:(b,x)=>{let{ping:L,pong:l,unit:y,array:U}=u(b);k(t,x,i,L,l,y,U)},storages:u}},Y=async e=>{let t={isWebGL:!0,gl:e},r=e.el.getContext("webgl2"),n=ue(e,r),o=e.fs?_.str(e.fs)?e.fs:e.fs.fragment(t):ie,a=e.vs?_.str(e.vs)?e.vs:e.vs.vertex(t):K,s=C(r,o,a,e);r.useProgram(s);let i=0,f=A(()=>i++),u=A(l=>r.getAttribLocation(s,l)),m=A(l=>r.getUniformLocation(s,l)),E=(l="",y,U)=>{let P=u(l,!0);O(r,P,e.count,y,U)},R=(l,y)=>{r.useProgram(s),I(r,m(l),y),n?._uniform(l,y)},T=(l,y)=>{r.useProgram(s),F(e,y,U=>{V(r,U,m(l),f(l))})},b=()=>{n?.clean(),r.deleteProgram(s),r.getExtension("WEBGL_lose_context")?.loseContext()},x=()=>{n?.render(),r.useProgram(s),r.viewport(0,0,...e.size),r.drawArrays(r.TRIANGLES,0,e.count),r.bindFramebuffer(r.FRAMEBUFFER,null)};return{webgl:{context:r,program:s,storages:n?.storages},render:x,clean:b,_attribute:E,_uniform:R,_texture:T,_storage:n?._storage}};import{nested as D}from"reev";var H=async(e,t=console.log)=>{let r=navigator.gpu,n=r.getPreferredCanvasFormat(),a=await(await r.requestAdapter()).requestDevice();return a.onuncapturederror=s=>t(s.error.message),e.configure({device:a,format:n,alphaMode:"opaque"}),{device:a,format:n}},j=()=>{let e=0,t=0,r=0,n=0;return{uniform:()=>{let o=Math.floor(e/12),a=e%12;return e++,{group:o,binding:a}},texture:()=>{let a=Math.floor(e/12)+1+Math.floor(t/6),s=t%6*2;return t++,{group:a,binding:s}},storage:()=>{let a=Math.floor(e/12)+Math.floor(t/6)+2+Math.floor(r/12),s=r%12;return r++,{group:a,binding:s}},attrib:()=>{let o=n;return n++,{location:o}}}},fe=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",$=e=>{let t=[],r=[];for(let{buffer:n,location:o,stride:a}of e)t[o]=n,r[o]={arrayStride:a*4,attributes:[{shaderLocation:o,offset:0,format:fe(a)}]};return{vertexBuffers:t,bufferLayouts:r}},Q=(e,t,r,n=[])=>{let o=new Map,a={bindGroups:[],bindGroupLayouts:[]},s=(i,f,u)=>{o.has(i)||o.set(i,{layouts:[],bindings:[]});let{layouts:m,bindings:E}=o.get(i);m.push(f),E.push(u)};for(let{binding:i,buffer:f,group:u}of t)s(u,{binding:i,visibility:7,buffer:{type:"uniform"}},{binding:i,resource:{buffer:f}});for(let{binding:i,buffer:f,group:u}of n)s(u,{binding:i,visibility:6,buffer:{type:"storage"}},{binding:i,resource:{buffer:f}});for(let{binding:i,group:f,sampler:u,view:m}of r)s(f,{binding:i,visibility:2,sampler:{}},{binding:i,resource:u}),s(f,{binding:i+1,visibility:2,texture:{}},{binding:i+1,resource:m});for(let[i,{layouts:f,bindings:u}]of o)a.bindGroupLayouts[i]=e.createBindGroupLayout({entries:f}),a.bindGroups[i]=e.createBindGroup({layout:a.bindGroupLayouts[i],entries:u});return a},Z=(e,t,r,n,o,a)=>e.createRenderPipeline({vertex:{module:e.createShaderModule({label:"vert",code:o.trim()}),entryPoint:"main",buffers:r},fragment:{module:e.createShaderModule({label:"frag",code:a.trim()}),entryPoint:"main",targets:[{format:t}]},layout:e.createPipelineLayout({bindGroupLayouts:n}),primitive:{topology:"triangle-list"},depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}}),J=(e,t,r)=>e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})}),me=e=>e==="uniform"?72:e==="attrib"?40:140,w=(e,t,r)=>{W(t)||(t=new Float32Array(t));let n=me(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,a=e.createBuffer({size:o,usage:n});return{array:t,buffer:a}},ee=(e,t)=>({colorAttachments:[{view:e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:t.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),te=(e,t=1280,r=800)=>{let n=e.createTexture({size:[t,r],format:"rgba8unorm",usage:22}),o=e.createSampler({magFilter:"linear",minFilter:"linear"});return{texture:n,sampler:o}},re=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT});var pe=32,ce=`
15
+ }`,H=`
19
16
  struct In { @builtin(vertex_index) vertex_index: u32 }
20
17
  struct Out { @builtin(position) position: vec4f }
21
18
  @vertex
@@ -26,12 +23,15 @@ fn main(in: In) -> Out {
26
23
  out.position = vec4f(x, y, 0.0, 1.0);
27
24
  return out;
28
25
  }
29
- `.trim(),be=`
26
+ `.trim(),$=`
30
27
  struct Out { @builtin(position) position: vec4f }
31
28
  @group(0) @binding(0) var<uniform> iResolution: vec2f;
32
29
  @fragment
33
30
  fn main(out: Out) -> @location(0) vec4f {
34
31
  return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);
35
32
  }
36
- `,le=(e,t,r)=>{let n=u=>{},o=D((u,m)=>{let{array:E,buffer:R}=w(t,m,"storage"),{binding:T,group:b}=r.storage();return{array:E,buffer:R,binding:T,group:b}});return{storages:o,_storage:(u,m)=>{let{array:E,buffer:R}=o(u,m);t.queue.writeBuffer(R,0,E)},update:(u,m,E)=>{let R=J(t,m,E);n=T=>{T.setPipeline(R),u.forEach((x,L)=>T.setBindGroup(L,x));let b=Math.ceil(e.particles/pe);T.dispatchWorkgroups(b,1,1),T.end()}},render:u=>{n(u)},clean:()=>{for(let{buffer:u}of o.map.values())u.destroy()}}},ne=async e=>{let t=e.el.getContext("webgpu"),{device:r,format:n}=await H(t,e.error),o=j(),a=le(e,r,o),s,i,f,u=p=>{},m=!0,E,R=D((p,c)=>{m=!0;let d=c.length/e.count,{location:g}=o.attrib(),{array:h,buffer:G}=w(r,c,"attrib");return{array:h,buffer:G,location:g,stride:d}}),T=D((p,c)=>{m=!0;let{binding:d,group:g}=o.uniform(),{array:h,buffer:G}=w(r,c,"uniform");return{array:h,buffer:G,binding:d,group:g}}),b=D((p,c=0,d=0)=>{m=!0;let{binding:g,group:h}=o.texture(),{texture:G,sampler:v}=te(r,c,d);return{texture:G,sampler:v,binding:g,group:h,view:G.createView()}}),x=(p="",c)=>{let{array:d,buffer:g}=R(p,c);r.queue.writeBuffer(g,0,d)},L=(p,c)=>{_.num(c)&&(c=[c]);let{array:d,buffer:g}=T(p,c);d.set(c),r.queue.writeBuffer(g,0,d)},l=(p,c)=>{F(e,c,d=>{let{width:g,height:h}=d,{texture:G}=b(p,g,h);r.queue.copyExternalImageToTexture({source:d},{texture:G},{width:g,height:h})})},y=()=>{let{vertexBuffers:p,bufferLayouts:c}=$(R.map.values()),{bindGroups:d,bindGroupLayouts:g}=Q(r,T.map.values(),b.map.values(),a.storages.map.values()),h=Z(r,n,c,g,f,s);u=G=>{G.setPipeline(h),d.forEach((v,M)=>G.setBindGroup(M,v)),p.forEach((v,M)=>G.setVertexBuffer(M,v)),G.draw(e.count,1,0,0),G.end()},e.cs&&a.update(d,g,i)},U=()=>{if(!s||!f){let c={isWebGL:!1,gl:e};s=e.fs?_.str(e.fs)?e.fs:e.fs.fragment(c):be,f=e.vs?_.str(e.vs)?e.vs:e.vs.vertex(c):ce,i=e.cs?_.str(e.cs)?e.cs:e.cs.compute(c):""}if(e.loading)return;m&&y(),m=!1;let p=r.createCommandEncoder();e.cs&&a.render(p.beginComputePass()),u(p.beginRenderPass(ee(t,E))),r.queue.submit([p.finish()])},P=()=>{let p=e.el;E?.destroy(),E=re(r,p.width,p.height)},S=()=>{r.destroy(),E?.destroy();for(let{texture:p}of b.map.values())p.destroy();for(let{buffer:p}of T.map.values())p.destroy();for(let{buffer:p}of R.map.values())p.destroy();a.clean()};return P(),{webgpu:{device:r,uniforms:T,textures:b,attribs:R,storages:a.storages},render:U,resize:P,clean:S,_attribute:x,_uniform:L,_texture:l,_storage:a._storage}};var Ne=e=>_.obj(e)?"isGL"in e:!1,Te=()=>typeof window>"u",xe=()=>Te()?!1:"gpu"in navigator,X=performance.now(),Ge=e=>{let t=de({isNative:!1,isWebGL:!0,isError:!1,isLoop:!0,isGL:!0,size:[0,0],mouse:[0,0],count:6,particles:1024,webgl:{},webgpu:{},loading:0,error(){t.isError=!0,t.isLoop=!1,t.clean(),console.warn("GLRE Error:",...arguments)}});return t.queue=ge(),t.frame=Ee(),t.attribute=B((r,n,o)=>t.queue(()=>t._attribute?.(r,n,o)),t),t.storage=B((r,n)=>t.queue(()=>t._storage?.(r,n)),t),t.uniform=B((r,n)=>t.queue(()=>t._uniform?.(r,n)),t),t.texture=B((r,n)=>t.queue(()=>t._texture?.(r,n)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:X}),t("mount",async()=>{xe()||(t.isWebGL=!0),t.vs=t.vs||t.vert||t.vertex,t.fs=t.fs||t.frag||t.fragment,t.cs=t.cs||t.comp||t.compute,t.isWebGL?t(await Y(t)):t(await ne(t)),!t.isError&&(t.resize(),t.frame(()=>(t.loop(),t.queue.flush(),t.loading?!0:(t.render(),t.isLoop))),!t.isNative&&(window.addEventListener("resize",t.resize),t.el.addEventListener("mousemove",t.mousemove)))}),t("clean",()=>{t.frame.stop(),!t.isNative&&(window.removeEventListener("resize",t.resize),t.el.removeEventListener("mousemove",t.mousemove))}),t("resize",()=>{let r=t.width||window.innerWidth,n=t.height||window.innerHeight;t.size[0]=t.el.width=r,t.size[1]=t.el.height=n,t.uniform("iResolution",t.size)}),t("mousemove",(r,n=r.clientX,o=r.clientY)=>{let[a,s]=t.size,{top:i,left:f}=t.el.getBoundingClientRect();t.mouse[0]=(n-i-a/2)/(a/2),t.mouse[1]=-(o-f-s/2)/(s/2),t.uniform("iMouse",t.mouse)}),t("loop",()=>{X=performance.now()/1e3,t.uniform("iTime",X)}),t(e)},Oe=Ge;export{Ge as createGL,Oe as default,Ne as isGL,Te as isServer,xe as isWebGPUSupported};
33
+ `;import{nested as D}from"reev";var K=(e,t,r,n=console.warn)=>{let o=e.createShader(r);if(!o)return n("Failed to create shader");if(e.shaderSource(o,t.trim()),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))return o;let a=e.getShaderInfoLog(o);e.deleteShader(o),n(`Could not compile shader: ${a}
34
+
35
+ \u2193\u2193\u2193generated\u2193\u2193\u2193
36
+ ${t}`)},V=(e,t,r,n)=>{let o=e.createProgram(),a=K(e,t,e.FRAGMENT_SHADER,n.error),s=K(e,r,e.VERTEX_SHADER,n.error);if(!a||!s)return;if(e.attachShader(o,a),e.attachShader(o,s),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;let i=e.getProgramInfoLog(o);e.deleteProgram(o),n.error(`Could not link program: ${i}`)},Y=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},N=(e,t,r,n)=>{t.set(n),e.bindBuffer(e.ARRAY_BUFFER,r),e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null)},j=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0)},Q=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0),e.vertexAttribDivisor(t,1)},O=(e,t,r)=>{if(E.num(r))return e.uniform1f(t,r);let n=r.length;if(n<=4)return e[`uniform${n}fv`](t,r);n=Math.sqrt(n)<<0,e[`uniformMatrix${n}fv`](t,!1,r)},J=(e,t,r,n,o=!1)=>{let a=e.createTexture();if(e.bindTexture(e.TEXTURE_2D,a),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),o||e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(r,n),e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,a),o)return()=>{e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,a),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)}},Z=(e,t,r,n,o,a,s,i)=>{let m=r*n,u=t.length/m;for(let p=0;p<m;p++)for(let g=0;g<Math.min(u,4);g++)i[4*p+g]=t[p*u+g]||0;e.activeTexture(e.TEXTURE0+s),e.bindTexture(e.TEXTURE_2D,o.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,0,e.RGBA,e.FLOAT,i),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,a.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,0,e.RGBA,e.FLOAT,i),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)},ee=(e,t)=>{for(let{ping:r,pong:n}of t)e.deleteTexture(r.texture),e.deleteTexture(n.texture),e.deleteFramebuffer(r.buffer),e.deleteFramebuffer(n.buffer)},te=(e,t,r,n,o,a)=>{e.activeTexture(e.TEXTURE0+o),e.bindTexture(e.TEXTURE_2D,t.texture),e.uniform1i(n,o),a===0&&e.bindFramebuffer(e.FRAMEBUFFER,r.buffer);let s=e.COLOR_ATTACHMENT0+a;return e.framebufferTexture2D(e.FRAMEBUFFER,s,e.TEXTURE_2D,r.texture,0),s},re=(e=1024)=>{if(E.num(e)){let o=Math.sqrt(e),a=Math.ceil(o);return Number.isInteger(o)||console.warn(`GLRE Storage Warning: particleCount (${e}) is not a square. Using ${a}x${a} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`),{x:a,y:a}}let[t,r,n]=e;if(n!==void 0){let o=r*n;return console.warn(`GLRE Storage Warning: 3D particleCount [${t}, ${r}, ${n}] specified but WebGL storage textures only support 2D. Flattening to 2D by multiplying height=${r} * depth=${n} = ${o}.`),{x:t,y:o}}return{x:t,y:r}};var Ee=(e,t)=>{if(!e.cs)return null;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=D(()=>r++),a=E.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),s=V(t,a,X,e),i=re(e.particleCount),m=D(b=>t.getUniformLocation(s,b)),u=D(b=>{let R=new Float32Array(i.x*i.y*4),h={texture:t.createTexture(),buffer:t.createFramebuffer()},v={texture:t.createTexture(),buffer:t.createFramebuffer()};return{ping:h,pong:v,array:R,loc:m(b),unit:o(b)}});return{render:()=>{t.useProgram(s);let b=u.map.values().map(({ping:R,pong:h,loc:v,unit:l},x)=>{let[U,_]=n%2?[R,h]:[h,R];return te(t,U,_,v,l,x)});t.drawBuffers(b),t.drawArrays(t.TRIANGLES,0,3),t.bindFramebuffer(t.FRAMEBUFFER,null),n++},clean:()=>{t.deleteProgram(s),ee(t,u.map.values())},_uniform:(b,R)=>{t.useProgram(s),O(t,m(b),R)},_storage:(b,R)=>{let{ping:h,pong:v,unit:l,array:x}=u(b);Z(t,R,i.x,i.y,h,v,l,x)},storages:u}},ne=async e=>{let t={isWebGL:!0,gl:e},r=e.el.getContext("webgl2"),n=Ee(e,r),o=e.fs?E.str(e.fs)?e.fs:e.fs.fragment(t):q,a=e.vs?E.str(e.vs)?e.vs:e.vs.vertex(t):X,s=V(r,o,a,e);r.useProgram(s);let i=0,m=D(()=>i++),u=D(l=>r.getUniformLocation(s,l)),p=D((l,x,U=!1)=>{let _=C(x.length,U?e.instanceCount:e.count,e.error),A=r.getAttribLocation(s,l),{array:w,buffer:f}=Y(r,x);return{array:w,buffer:f,location:A,stride:_}}),g=(l="",x)=>{let{array:U,buffer:_,location:A,stride:w}=p(l,x);N(r,U,_,x),j(r,A,w,_)},y=(l,x)=>{let{array:U,buffer:_,location:A,stride:w}=p(l,x,!0);N(r,U,_,x),Q(r,A,w,_)},L=(l,x)=>{r.useProgram(s),O(r,u(l),x),n?._uniform(l,x)},b=(l,x)=>{e.loading++,r.useProgram(s),M(x,(U,_)=>{let A=m(l),w=J(r,U,u(l),A,_);w&&e({loop:w}),e.loading--})},R=()=>{n?.clean(),r.deleteProgram(s),r.getExtension("WEBGL_lose_context")?.loseContext()},h=()=>{n?.render(),r.useProgram(s),r.viewport(0,0,...e.size),e.instanceCount>1?r.drawArraysInstanced(r.TRIANGLES,0,e.count,e.instanceCount):r.drawArrays(r.TRIANGLES,0,e.count),r.bindFramebuffer(r.FRAMEBUFFER,null)};return e.isDepth&&(r.depthFunc(r.LEQUAL),r.enable(r.CULL_FACE)),{webgl:{context:r,program:s,storages:n?.storages},render:h,clean:R,_attribute:g,_instance:y,_uniform:L,_texture:b,_storage:n?._storage}};import{nested as I}from"reev";var oe=async(e,t=console.log)=>{let r=navigator.gpu,n=r.getPreferredCanvasFormat(),a=await(await r.requestAdapter()).requestDevice();return a.onuncapturederror=s=>t(s.error.message),e.configure({device:a,format:n,alphaMode:"opaque"}),{device:a,format:n}},ae=()=>{let e=0,t=0,r=0,n=0;return{uniform:()=>{let o=Math.floor(e/12),a=e%12;return e++,{group:o,binding:a}},texture:()=>{let a=Math.floor(e/12)+1+Math.floor(t/6),s=t%6*2;return t++,{group:a,binding:s}},storage:()=>{let a=Math.floor(e/12)+Math.floor(t/6)+2+Math.floor(r/12),s=r%12;return r++,{group:a,binding:s}},attrib:()=>{let o=n;return n++,{location:o}}}},Ge=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",se=e=>{let t=[],r=[];for(let{buffer:n,location:o,stride:a,isInstance:s}of e){t[o]=n;let i=Math.min(Math.max(Math.floor(a),1),4),m=Math.max(4,Math.ceil(i*4/4)*4);r[o]={arrayStride:m,stepMode:s?"instance":"vertex",attributes:[{shaderLocation:o,offset:0,format:Ge(i)}]}}return{vertexBuffers:t,bufferLayouts:r}},ie=(e,t,r,n=[])=>{let o=new Map,a={bindGroups:[],bindGroupLayouts:[]},s=(i,m,u)=>{o.has(i)||o.set(i,{layouts:[],bindings:[]});let{layouts:p,bindings:g}=o.get(i);p.push(m),g.push(u)};for(let{binding:i,buffer:m,group:u}of t)s(u,{binding:i,visibility:7,buffer:{type:"uniform"}},{binding:i,resource:{buffer:m}});for(let{binding:i,buffer:m,group:u}of n)s(u,{binding:i,visibility:6,buffer:{type:"storage"}},{binding:i,resource:{buffer:m}});for(let{binding:i,group:m,sampler:u,view:p}of r)s(m,{binding:i,visibility:2,sampler:{}},{binding:i,resource:u}),s(m,{binding:i+1,visibility:2,texture:{}},{binding:i+1,resource:p});for(let[i,{layouts:m,bindings:u}]of o)a.bindGroupLayouts[i]=e.createBindGroupLayout({entries:m}),a.bindGroups[i]=e.createBindGroup({layout:a.bindGroupLayouts[i],entries:u});return a},ue=(e,t,r,n,o,a)=>e.createRenderPipeline({vertex:{module:e.createShaderModule({label:"vert",code:o.trim()}),entryPoint:"main",buffers:r},fragment:{module:e.createShaderModule({label:"frag",code:a.trim()}),entryPoint:"main",targets:[{format:t}]},layout:e.createPipelineLayout({bindGroupLayouts:n}),primitive:{topology:"triangle-list"},depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}}),fe=(e,t,r)=>e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})}),ye=e=>e==="uniform"?72:e==="attrib"?40:140,W=(e,t,r)=>{k(t)||(t=new Float32Array(t));let n=ye(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,a=e.createBuffer({size:o,usage:n});return{array:t,buffer:a}},me=(e,t)=>({colorAttachments:[{view:e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:t.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),ce=(e,t=1280,r=800)=>{let n=e.createTexture({size:[t,r],format:"rgba8unorm",usage:22}),o=e.createSampler({magFilter:"linear",minFilter:"linear"});return{texture:n,sampler:o}},pe=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT}),de=(e,t=32)=>{E.num(e)&&(e=[e]);let[r,n=1,o=1]=e;return{x:Math.min(r*n*o/t,65535),y:1,z:1}};var Le=(e,t,r)=>{let n=u=>{},o=I((u,p)=>{let{array:g,buffer:y}=W(t,p,"storage"),{binding:L,group:b}=r.storage();return{array:g,buffer:y,binding:L,group:b}});return{storages:o,_storage:(u,p)=>{let{array:g,buffer:y}=o(u,p);t.queue.writeBuffer(y,0,g)},update:(u,p,g)=>{let y=fe(t,p,g);n=L=>{L.setPipeline(y),u.forEach((v,l)=>L.setBindGroup(l,v));let{x:b,y:R,z:h}=de(e.particleCount);L.dispatchWorkgroups(b,R,h),L.end()}},render:u=>{n(u)},clean:()=>{for(let{buffer:u}of o.map.values())u.destroy()}}},be=async e=>{let t=e.el.getContext("webgpu"),{device:r,format:n}=await oe(t,e.error),o=ae(),a=Le(e,r,o),s,i,m,u=f=>{},p=!0,g,y=I((f,c,d=!1)=>{p=!0;let T=C(c.length,d?e.instanceCount:e.count),{location:P}=o.attrib(),{array:G,buffer:S}=W(r,c,"attrib");return{array:G,buffer:S,location:P,stride:T,isInstance:d}}),L=I((f,c)=>{p=!0;let{binding:d,group:T}=o.uniform(),{array:P,buffer:G}=W(r,c,"uniform");return{array:P,buffer:G,binding:d,group:T}}),b=I((f,c=0,d=0)=>{p=!0;let{binding:T,group:P}=o.texture(),{texture:G,sampler:S}=ce(r,c,d);return{texture:G,sampler:S,binding:T,group:P,view:G.createView()}}),R=(f="",c)=>{let{array:d,buffer:T}=y(f,c);d.set(c),r.queue.writeBuffer(T,0,d)},h=(f,c)=>{let{array:d,buffer:T}=y(f,c,!0);d.set(c),r.queue.writeBuffer(T,0,d)},v=(f,c)=>{E.num(c)&&(c=[c]);let{array:d,buffer:T}=L(f,c);d.set(c),r.queue.writeBuffer(T,0,d)},l=(f,c)=>{e.loading++,M(c,(d,T)=>{let[P,G]=T?[d.videoWidth,d.videoHeight]:[d.width,d.height],{texture:S}=b(f,P,G),F=()=>{r.queue.copyExternalImageToTexture({source:d},{texture:S},{width:P,height:G})};F(),T&&e({loop:F}),e.loading--})},x=()=>{let{vertexBuffers:f,bufferLayouts:c}=se(y.map.values()),{bindGroups:d,bindGroupLayouts:T}=ie(r,L.map.values(),b.map.values(),a.storages.map.values()),P=ue(r,n,c,T,m,s);u=G=>{G.setPipeline(P),d.forEach((S,F)=>G.setBindGroup(F,S)),f.forEach((S,F)=>G.setVertexBuffer(F,S)),G.draw(e.count,e.instanceCount,0,0),G.end()},e.cs&&a.update(d,T,i)},U=()=>{if(!s||!m){let c={isWebGL:!1,gl:e};s=e.fs?E.str(e.fs)?e.fs:e.fs.fragment(c):$,m=e.vs?E.str(e.vs)?e.vs:e.vs.vertex(c):H,i=e.cs?E.str(e.cs)?e.cs:e.cs.compute(c):""}if(e.loading)return;p&&x(),p=!1;let f=r.createCommandEncoder();e.cs&&a.render(f.beginComputePass()),u(f.beginRenderPass(me(t,g))),r.queue.submit([f.finish()])},_=()=>{let f=e.el;g?.destroy(),g=pe(r,f.width,f.height)},A=()=>{r.destroy(),g?.destroy();for(let{texture:f}of b.map.values())f.destroy();for(let{buffer:f}of L.map.values())f.destroy();for(let{buffer:f}of y.map.values())f.destroy();a.clean()};return _(),{webgpu:{device:r,uniforms:L,textures:b,attribs:y,storages:a.storages},render:U,resize:_,clean:A,_attribute:R,_instance:h,_uniform:v,_texture:l,_storage:a._storage}};var $e=e=>E.obj(e)?"isGL"in e:!1,Ue=()=>typeof window>"u",ve=()=>Ue()?!1:"gpu"in navigator,z=performance.now(),Pe=e=>{let t=Re({isNative:!1,isWebGL:!0,isError:!1,isLoop:!0,isDebug:!1,isDepth:!1,isGL:!0,size:[0,0],mouse:[0,0],count:6,instanceCount:1,particleCount:1024,webgl:{},webgpu:{},loading:0,error(){t.isError=!0,t.isLoop=!1,t.clean(),console.warn("GLRE Error:",...arguments)}});return t.queue=he(),t.frame=_e(),t.attribute=B((r,n,o)=>t.queue(()=>t._attribute?.(r,n,o)),t),t.instance=B((r,n,o)=>t.queue(()=>t._instance?.(r,n,o)),t),t.storage=B((r,n)=>t.queue(()=>t._storage?.(r,n)),t),t.uniform=B((r,n)=>t.queue(()=>t._uniform?.(r,n)),t),t.texture=B((r,n)=>t.queue(()=>t._texture?.(r,n)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:z}),t("mount",async()=>{ve()||(t.isWebGL=!0),t.vs=t.vs||t.vert||t.vertex,t.fs=t.fs||t.frag||t.fragment,t.cs=t.cs||t.comp||t.compute,t.isWebGL?t(await ne(t)):t(await be(t)),!t.isError&&(t.resize(),t.frame(()=>(t.loop(),t.queue.flush(),t.loading?!0:(t.render(),t.isLoop))),!t.isNative&&(window.addEventListener("resize",t.resize),t.el.addEventListener("mousemove",t.mousemove)))}),t("clean",()=>{t.frame.stop(),!t.isNative&&(window.removeEventListener("resize",t.resize),t.el.removeEventListener("mousemove",t.mousemove))}),t("resize",()=>{let r=t.width||window.innerWidth,n=t.height||window.innerHeight;t.size[0]=t.el.width=r,t.size[1]=t.el.height=n,t.uniform("iResolution",t.size)}),t("mousemove",(r,n=r.clientX,o=r.clientY)=>{let[a,s]=t.size,{top:i,left:m}=t.el.getBoundingClientRect();t.mouse[0]=(n-i-a/2)/(a/2),t.mouse[1]=-(o-m-s/2)/(s/2),t.uniform("iMouse",t.mouse)}),t("loop",()=>{z=performance.now()/1e3,t.uniform("iTime",z)}),t(e)},Ke=Pe;export{Pe as createGL,Ke as default,$e as isGL,Ue as isServer,ve as isWebGPUSupported};
37
37
  //# sourceMappingURL=index.js.map