glre 0.39.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 (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 +849 -19
  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 +38 -20
  10. package/dist/index.js +8 -8
  11. package/dist/index.js.map +1 -1
  12. package/dist/native.d.ts +48 -22
  13. package/dist/node.cjs +59 -30
  14. package/dist/node.cjs.map +1 -1
  15. package/dist/node.d.ts +34 -22
  16. package/dist/node.js +59 -30
  17. package/dist/node.js.map +1 -1
  18. package/dist/react.d.ts +38 -20
  19. package/dist/solid.d.ts +38 -20
  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 +26 -25
  270. package/src/node/types.ts +15 -11
  271. package/src/node/utils/const.ts +12 -11
  272. package/src/node/utils/index.ts +14 -12
  273. package/src/node/utils/infer.ts +15 -5
  274. package/src/node/utils/parse.ts +37 -13
  275. package/src/node/utils/utils.ts +46 -23
  276. package/src/types.ts +9 -2
  277. package/src/utils/helpers.ts +56 -0
  278. package/src/utils/pipeline.ts +21 -5
  279. package/src/utils/program.ts +57 -38
  280. package/src/utils/webgl.ts +41 -35
  281. package/src/utils/webgpu.ts +19 -35
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 ye}from"reev";import{createFrame as Le,createQueue as _e}from"refr";var T={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,D=(e,t,r)=>{e.loading++;let n=new Image;Object.assign(n,{src:t,crossOrigin:"anonymous"}),n.decode().then(()=>{r(n),e.loading--})},le=e=>[1,2,3,4,9,16].includes(e),xe=(e,t=3)=>e%t===0?Math.floor(e/t):-1,C=(e,t=1,r=console.warn)=>{let n=xe(e,t);return le(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
+ }`,$=`
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(),K=`
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 F}from"reev";var H=(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=H(e,t,e.FRAGMENT_SHADER,n.error),s=H(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}`)},j=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},O=(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)},Y=(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)},z=(e,t,r)=>{if(T.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)=>{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)},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 x=0;x<Math.min(u,4);x++)i[4*p+x]=t[p*u+x]||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(T.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 ge=(e,t)=>{if(!e.cs)return null;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=F(()=>r++),a=T.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=F(b=>t.getUniformLocation(s,b)),u=F(b=>{let L=new Float32Array(i.x*i.y*4),R={texture:t.createTexture(),buffer:t.createFramebuffer()},U={texture:t.createTexture(),buffer:t.createFramebuffer()};return{ping:R,pong:U,array:L,loc:m(b),unit:o(b)}});return{render:()=>{t.useProgram(s);let b=u.map.values().map(({ping:L,pong:R,loc:U,unit:d},g)=>{let[P,h]=n%2?[L,R]:[R,L];return te(t,P,h,U,d,g)});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,L)=>{t.useProgram(s),z(t,m(b),L)},_storage:(b,L)=>{let{ping:R,pong:U,unit:d,array:g}=u(b);Z(t,L,i.x,i.y,R,U,d,g)},storages:u}},ne=async e=>{let t={isWebGL:!0,gl:e},r=e.el.getContext("webgl2"),n=ge(e,r),o=e.fs?T.str(e.fs)?e.fs:e.fs.fragment(t):q,a=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(t):X,s=V(r,o,a,e);r.useProgram(s);let i=0,m=F(()=>i++),u=F(d=>r.getUniformLocation(s,d)),p=F((d,g,P=!1)=>{let h=C(g.length,P?e.instanceCount:e.count,e.error),v=r.getAttribLocation(s,d),{array:S,buffer:f}=j(r,g);return{array:S,buffer:f,location:v,stride:h}}),x=(d="",g)=>{let{array:P,buffer:h,location:v,stride:S}=p(d,g);O(r,P,h,g),Y(r,v,S,h)},G=(d,g)=>{let{array:P,buffer:h,location:v,stride:S}=p(d,g,!0);O(r,P,h,g),Q(r,v,S,h)},y=(d,g)=>{r.useProgram(s),z(r,u(d),g),n?._uniform(d,g)},b=(d,g)=>{r.useProgram(s),D(e,g,P=>{J(r,P,u(d),m(d))})},L=()=>{n?.clean(),r.deleteProgram(s),r.getExtension("WEBGL_lose_context")?.loseContext()},R=()=>{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:R,clean:L,_attribute:x,_instance:G,_uniform:y,_texture:b,_storage:n?._storage}};import{nested as W}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}}}},Ee=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:Ee(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:x}=o.get(i);p.push(m),x.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})}),Te=e=>e==="uniform"?72:e==="attrib"?40:140,M=(e,t,r)=>{k(t)||(t=new Float32Array(t));let n=Te(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}),be=(e,t=32)=>{T.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 Ge=(e,t,r)=>{let n=u=>{},o=W((u,p)=>{let{array:x,buffer:G}=M(t,p,"storage"),{binding:y,group:b}=r.storage();return{array:x,buffer:G,binding:y,group:b}});return{storages:o,_storage:(u,p)=>{let{array:x,buffer:G}=o(u,p);t.queue.writeBuffer(G,0,x)},update:(u,p,x)=>{let G=fe(t,p,x);n=y=>{y.setPipeline(G),u.forEach((U,d)=>y.setBindGroup(d,U));let{x:b,y:L,z:R}=be(e.particleCount);y.dispatchWorkgroups(b,L,R),y.end()}},render:u=>{n(u)},clean:()=>{for(let{buffer:u}of o.map.values())u.destroy()}}},de=async e=>{let t=e.el.getContext("webgpu"),{device:r,format:n}=await oe(t,e.error),o=ae(),a=Ge(e,r,o),s,i,m,u=f=>{},p=!0,x,G=W((f,c,l=!1)=>{p=!0;let E=C(c.length,l?e.instanceCount:e.count),{location:A}=o.attrib(),{array:_,buffer:w}=M(r,c,"attrib");return{array:_,buffer:w,location:A,stride:E,isInstance:l}}),y=W((f,c)=>{p=!0;let{binding:l,group:E}=o.uniform(),{array:A,buffer:_}=M(r,c,"uniform");return{array:A,buffer:_,binding:l,group:E}}),b=W((f,c=0,l=0)=>{p=!0;let{binding:E,group:A}=o.texture(),{texture:_,sampler:w}=ce(r,c,l);return{texture:_,sampler:w,binding:E,group:A,view:_.createView()}}),L=(f="",c)=>{let{array:l,buffer:E}=G(f,c);l.set(c),r.queue.writeBuffer(E,0,l)},R=(f,c)=>{let{array:l,buffer:E}=G(f,c,!0);l.set(c),r.queue.writeBuffer(E,0,l)},U=(f,c)=>{T.num(c)&&(c=[c]);let{array:l,buffer:E}=y(f,c);l.set(c),r.queue.writeBuffer(E,0,l)},d=(f,c)=>{D(e,c,l=>{let{width:E,height:A}=l,{texture:_}=b(f,E,A);r.queue.copyExternalImageToTexture({source:l},{texture:_},{width:E,height:A})})},g=()=>{let{vertexBuffers:f,bufferLayouts:c}=se(G.map.values()),{bindGroups:l,bindGroupLayouts:E}=ie(r,y.map.values(),b.map.values(),a.storages.map.values()),A=ue(r,n,c,E,m,s);u=_=>{_.setPipeline(A),l.forEach((w,I)=>_.setBindGroup(I,w)),f.forEach((w,I)=>_.setVertexBuffer(I,w)),_.draw(e.count,e.instanceCount,0,0),_.end()},e.cs&&a.update(l,E,i)},P=()=>{if(!s||!m){let c={isWebGL:!1,gl:e};s=e.fs?T.str(e.fs)?e.fs:e.fs.fragment(c):K,m=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(c):$,i=e.cs?T.str(e.cs)?e.cs:e.cs.compute(c):""}if(e.loading)return;p&&g(),p=!1;let f=r.createCommandEncoder();e.cs&&a.render(f.beginComputePass()),u(f.beginRenderPass(me(t,x))),r.queue.submit([f.finish()])},h=()=>{let f=e.el;x?.destroy(),x=pe(r,f.width,f.height)},v=()=>{r.destroy(),x?.destroy();for(let{texture:f}of b.map.values())f.destroy();for(let{buffer:f}of y.map.values())f.destroy();for(let{buffer:f}of G.map.values())f.destroy();a.clean()};return h(),{webgpu:{device:r,uniforms:y,textures:b,attribs:G,storages:a.storages},render:P,resize:h,clean:v,_attribute:L,_instance:R,_uniform:U,_texture:d,_storage:a._storage}};var qe=e=>T.obj(e)?"isGL"in e:!1,Re=()=>typeof window>"u",he=()=>Re()?!1:"gpu"in navigator,N=performance.now(),Pe=e=>{let t=ye({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=_e(),t.frame=Le(),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:N}),t("mount",async()=>{he()||(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 de(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",()=>{N=performance.now()/1e3,t.uniform("iTime",N)}),t(e)},$e=Pe;export{Pe as createGL,$e as default,qe as isGL,Re as isServer,he as isWebGPUSupported};
37
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/helpers.ts","../src/utils/webgl.ts","../src/utils/program.ts","../src/utils/webgpu.ts","../src/utils/pipeline.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './utils/helpers'\nimport { webgl } from './utils/webgl'\nimport { webgpu } from './utils/webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\n\nexport const isGL = (a: unknown): a is EventState<GL> => {\n if (!is.obj(a)) return false\n if ('isGL' in a) return true\n return false\n}\n\nexport const isServer = () => {\n return typeof window === 'undefined'\n}\n\nexport const isWebGPUSupported = () => {\n if (isServer()) return false\n return 'gpu' in navigator\n}\n\nlet iTime = performance.now()\n\nexport const createGL = (props?: Partial<GL>) => {\n const gl = event({\n isNative: false,\n isWebGL: true,\n isError: false,\n isLoop: true,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n particles: 1024,\n webgl: {},\n webgpu: {},\n loading: 0,\n error() {\n gl.isError = true\n gl.isLoop = false\n gl.clean()\n console.warn('GLRE Error:', ...arguments)\n },\n }) as EventState<GL>\n\n gl.queue = createQueue()\n gl.frame = createFrame()\n\n gl.attribute = durable((k, v, i) => gl.queue(() => gl._attribute?.(k, v, i)), gl)\n gl.storage = durable((k, v) => gl.queue(() => gl._storage?.(k, v)), gl)\n gl.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async () => {\n if (!isWebGPUSupported()) gl.isWebGL = true\n gl.vs = gl.vs || gl.vert || gl.vertex\n gl.fs = gl.fs || gl.frag || gl.fragment\n gl.cs = gl.cs || gl.comp || gl.compute\n if (gl.isWebGL) {\n gl((await webgl(gl)) as GL)\n } else gl((await webgpu(gl)) as GL)\n if (gl.isError) return // stop if error\n gl.resize()\n gl.frame(() => {\n gl.loop()\n gl.queue.flush()\n if (gl.loading) return true // wait for textures @TODO FIX\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\n window.addEventListener('resize', gl.resize)\n gl.el.addEventListener('mousemove', gl.mousemove)\n })\n\n gl('clean', () => {\n gl.frame.stop()\n if (gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('resize', () => {\n const w = gl.width || window.innerWidth\n const h = gl.height || window.innerHeight\n gl.size[0] = gl.el.width = w\n gl.size[1] = gl.el.height = h\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const [w, h] = gl.size\n const { top, left } = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - top - w / 2) / (w / 2)\n gl.mouse[1] = -(y - left - h / 2) / (h / 2)\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('loop', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n })\n\n return gl(props)\n}\n\nexport default createGL\n\n","import type { GL } from './../types'\n\nexport const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\n/**\n * each\n */\ntype EachFn<Value, Key, This> = (this: This, value: Value, key: Key) => void\ntype Eachable<Value = any, Key = any, This = any> = {\n forEach(cb: EachFn<Value, Key, This>, ctx?: This): void\n}\n\nexport const each = <Value, Key, This>(obj: Eachable<Value, Key, This>, fn: EachFn<Value, Key, This>) => obj.forEach(fn)\n\nexport const flush = <Value extends Function, Key, This>(obj: Eachable<Value, Key, This>, ...args: any[]) => {\n each(obj, (f) => f(...args))\n}\n\n/**\n * other\n */\nexport const replace = (x = '', from = '_', to = '/') => x.split(from).join(to)\nexport const ext = (src = '.pdf') => src.split('.').pop()?.toLowerCase() ?? ''\nexport const fig = (x = 0) => `${x}`.split('.')[1]?.length ?? 0\nexport const dig = (x = 0) => `${x}`.split('.')[0]?.length - (x < 0 ? 1 : 0)\nexport const sig = (value = 0, digit = -2) => {\n digit *= -1\n digit = Math.pow(10, digit)\n value *= digit\n value = Math.round(value)\n value /= digit\n return value\n}\n\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nexport const loadingImage = (gl: GL, src: string, fun: (source: HTMLImageElement) => void) => {\n gl.loading++\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => {\n fun(source)\n gl.loading--\n })\n}\n","import { nested as cached } from 'reev'\nimport { is, loadingImage } from './helpers'\nimport {\n cleanStorage,\n createAttachment,\n createAttrib,\n createProgram,\n createStorage,\n createTexture,\n createUniform,\n} from './program'\nimport type { GL, WebGLState } from '../types'\n\nconst DEFAULT_FRAGMENT = /* cpp */ `\n#version 300 es\nprecision mediump float;\nout vec4 fragColor;\nuniform vec2 iResolution;\nvoid main() {\n fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);\n}\n`\n\nconst DEFAULT_VERTEX = /* cpp */ `\n#version 300 es\nvoid main() {\n float x = float(gl_VertexID % 2) * 4.0 - 1.0;\n float y = float(gl_VertexID / 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}`\n\nconst computeProgram = (gl: GL, c: WebGL2RenderingContext) => {\n if (!gl.cs) return null // ignore if no compute shader\n c.getExtension('EXT_color_buffer_float')\n\n let activeUnit = 0 // for texture units\n let currentNum = 0 // for storage buffers\n\n const units = cached(() => activeUnit++)\n const cs = is.str(gl.cs) ? gl.cs : gl.cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, DEFAULT_VERTEX, gl)!\n const size = Math.ceil(Math.sqrt(gl.particles))\n\n const uniforms = cached((key) => c.getUniformLocation(pg, key)!)\n const storages = cached((key) => {\n const array = new Float32Array(size * size * 4) // RGBA texture data\n const ping = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n const pong = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n return { ping, pong, array, loc: uniforms(key), unit: units(key) }\n })\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n createUniform(c, uniforms(key), value)\n }\n\n const _storage = (key: string, value: number[]) => {\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size, ping, pong, unit, array)\n }\n\n const clean = () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n }\n\n const render = () => {\n c.useProgram(pg)\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = currentNum % 2 ? [ping, pong] : [pong, ping]\n return createAttachment(c, i, o, loc, unit, index)\n })\n c.drawBuffers(attachments)\n c.drawArrays(c.TRIANGLES, 0, 3)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n currentNum++\n }\n\n return { render, clean, _uniform, _storage, storages }\n}\n\nexport const webgl = async (gl: GL) => {\n const config = { isWebGL: true, gl }\n const c = gl.el!.getContext('webgl2')!\n const cp = computeProgram(gl, c)\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs!.fragment(config)) : DEFAULT_FRAGMENT\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs!.vertex(config)) : DEFAULT_VERTEX\n const pg = createProgram(c, fs, vs, gl)!\n c.useProgram(pg)\n\n let activeUnit = 0 // for texture units\n\n const units = cached(() => activeUnit++)\n const attribs = cached((key) => c.getAttribLocation(pg, key))\n const uniforms = cached((key) => c.getUniformLocation(pg, key))\n\n const _attribute = (key = '', value: number[], iboValue: number[]) => {\n const loc = attribs(key, true)\n createAttrib(c, loc, gl.count, value, iboValue)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n createUniform(c, uniforms(key)!, value)\n cp?._uniform(key, value)\n }\n\n const _texture = (key: string, src: string) => {\n c.useProgram(pg)\n loadingImage(gl, src, (source) => {\n createTexture(c, source, uniforms(key)!, units(key))\n })\n }\n\n const clean = () => {\n cp?.clean()\n c.deleteProgram(pg)\n c.getExtension('WEBGL_lose_context')?.loseContext()\n }\n\n const render = () => {\n cp?.render()\n c.useProgram(pg)\n c.viewport(0, 0, ...gl.size)\n c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n }\n\n const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, render, clean, _attribute, _uniform, _texture, _storage: cp?._storage }\n}\n","import { is } from './helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGLRenderingContext, source: string, type: number, onError = console.warn) => {\n const shader = c.createShader(type)\n if (!shader) return onError('Failed to create shader')\n c.shaderSource(shader, source.trim())\n c.compileShader(shader)\n if (c.getShaderParameter(shader, c.COMPILE_STATUS)) return shader\n const error = c.getShaderInfoLog(shader)\n c.deleteShader(shader)\n onError(`Could not compile shader: ${error}\\n\\n↓↓↓generated↓↓↓\\n${source}`)\n}\n\nexport const createProgram = (c: WebGLRenderingContext, frag: string, vert: string, gl: GL) => {\n const pg = c.createProgram()\n const fs = createShader(c, frag, c.FRAGMENT_SHADER, gl.error)\n const vs = createShader(c, vert, c.VERTEX_SHADER, gl.error)\n if (!fs || !vs) return\n c.attachShader(pg, fs!)\n c.attachShader(pg, vs!)\n c.linkProgram(pg)\n if (c.getProgramParameter(pg, c.LINK_STATUS)) return pg\n const error = c.getProgramInfoLog(pg)\n c.deleteProgram(pg)\n gl.error(`Could not link program: ${error}`)\n}\n\nconst createVbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, new Float32Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n return buffer\n}\n\nconst createIbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, buffer)\n c.bufferData(c.ELEMENT_ARRAY_BUFFER, new Int16Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, null)\n return buffer\n}\n\nconst getStride = (count: number, value: number[], iboValue?: number[]) => {\n if (iboValue) count = Math.max(...iboValue) + 1\n const stride = value.length / count\n return Math.floor(stride)\n}\n\nexport const createAttrib = (\n c: WebGLRenderingContext,\n loc: number,\n count: number,\n value: number[],\n iboValue: number[]\n) => {\n const vbo = createVbo(c, value)\n const ibo = createIbo(c, iboValue)\n const str = getStride(count, value, iboValue)\n c.bindBuffer(c.ARRAY_BUFFER, vbo)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, str, c.FLOAT, false, 0, 0)\n if (ibo) c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, ibo)\n}\n\nexport const createUniform = (c: WebGLRenderingContext, loc: WebGLUniformLocation, value: number | number[]) => {\n if (is.num(value)) return c.uniform1f(loc, value)\n let l = value.length\n if (l <= 4) return c[`uniform${l as 2}fv`](loc, value)\n l = Math.sqrt(l) << 0\n c[`uniformMatrix${l as 2}fv`](loc, false, value)\n}\n\nexport const createTexture = (\n c: WebGLRenderingContext,\n img: HTMLImageElement,\n loc: WebGLUniformLocation,\n unit: number\n) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, img)\n c.generateMipmap(c.TEXTURE_2D)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, null)\n c.uniform1i(loc, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (\n c: WebGL2RenderingContext,\n value: number[],\n size: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\n const particles = size * size\n const vectorSize = value.length / particles\n for (let i = 0; i < particles; i++) {\n for (let j = 0; j < Math.min(vectorSize, 4); j++) {\n array[4 * i + j] = value[i * vectorSize + j] || 0\n }\n }\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, ping.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, size, size, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, pong.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, size, size, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n}\n\nexport const cleanStorage = (\n c: WebGL2RenderingContext,\n map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>\n) => {\n for (const { ping, pong } of map) {\n c.deleteTexture(ping.texture)\n c.deleteTexture(pong.texture)\n c.deleteFramebuffer(ping.buffer)\n c.deleteFramebuffer(pong.buffer)\n }\n}\n\nexport const createAttachment = (\n c: WebGL2RenderingContext,\n i: TextureBuffer,\n o: TextureBuffer,\n loc: WebGLUniformLocation,\n unit: number,\n index: number\n) => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, i.texture)\n c.uniform1i(loc, unit)\n if (index === 0) c.bindFramebuffer(c.FRAMEBUFFER, o.buffer)\n const attachment = c.COLOR_ATTACHMENT0 + index\n c.framebufferTexture2D(c.FRAMEBUFFER, attachment, c.TEXTURE_2D, o.texture, 0)\n return attachment\n}\n","import { nested as cached } from 'reev'\nimport { is, loadingImage } from './helpers'\nimport {\n createArrayBuffer,\n createBindGroup,\n createBindings,\n createComputePipeline,\n createDepthTexture,\n createDescriptor,\n createDevice,\n createPipeline,\n createTextureSampler,\n createVertexBuffers,\n} from './pipeline'\nimport type { GL, WebGPUState } from '../types'\n\nconst WORKING_GROUP_SIZE = 32\n\nconst DEFAULT_VERTEX = /* rust */ `\nstruct In { @builtin(vertex_index) vertex_index: u32 }\nstruct Out { @builtin(position) position: vec4f }\n@vertex\nfn main(in: In) -> Out {\n var out: Out;\n var x = f32(in.vertex_index % 2) * 4.0 - 1.0;\n var y = f32(in.vertex_index / 2) * 4.0 - 1.0;\n out.position = vec4f(x, y, 0.0, 1.0);\n return out;\n}\n`.trim()\n\nconst DEFAULT_FRAGMENT = /* rust */ `\nstruct Out { @builtin(position) position: vec4f }\n@group(0) @binding(0) var<uniform> iResolution: vec2f;\n@fragment\nfn main(out: Out) -> @location(0) vec4f {\n return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);\n}\n`\n\nconst computeProgram = (gl: GL, device: GPUDevice, bindings: any) => {\n let flush = (_pass: GPUComputePassEncoder) => {}\n\n const storages = cached((_key, value: number[] | Float32Array) => {\n const { array, buffer } = createArrayBuffer(device, value, 'storage')\n const { binding, group } = bindings.storage()\n return { array, buffer, binding, group }\n })\n\n const _storage = (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const update = (bindGroups: GPUBindGroup[], bindGroupLayouts: GPUBindGroupLayout[], comp: string) => {\n const pipeline = createComputePipeline(device, bindGroupLayouts, comp!)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const workgroupCount = Math.ceil(gl.particles / WORKING_GROUP_SIZE)\n pass.dispatchWorkgroups(workgroupCount, 1, 1)\n pass.end()\n }\n }\n\n const render = (pass: GPUComputePassEncoder) => {\n flush(pass)\n }\n\n const clean = () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n }\n\n return { storages, _storage, update, render, clean }\n}\n\nexport const webgpu = async (gl: GL) => {\n const context = gl.el!.getContext('webgpu') as GPUCanvasContext\n const { device, format } = await createDevice(context, gl.error)\n const bindings = createBindings()\n const cp = computeProgram(gl, device, bindings)\n let frag: string\n let comp: string\n let vert: string\n let flush = (_pass: GPURenderPassEncoder) => {}\n let needsUpdate = true\n let depthTexture: GPUTexture\n\n const attribs = cached((_key, value: number[]) => {\n needsUpdate = true\n const stride = value.length / gl.count\n const { location } = bindings.attrib()\n const { array, buffer } = createArrayBuffer(device, value, 'attrib')\n return { array, buffer, location, stride }\n })\n\n const uniforms = cached((_key, value: number[]) => {\n needsUpdate = true\n const { binding, group } = bindings.uniform()\n const { array, buffer } = createArrayBuffer(device, value, 'uniform')\n return { array, buffer, binding, group }\n })\n\n const textures = cached((_key, width = 0, height = 0) => {\n needsUpdate = true\n const { binding, group } = bindings.texture()\n const { texture, sampler } = createTextureSampler(device, width, height)\n return { texture, sampler, binding, group, view: texture.createView() }\n })\n\n const _attribute = (key = '', value: number[]) => {\n const { array, buffer } = attribs(key, value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n if (is.num(value)) value = [value]\n const { array, buffer } = uniforms(key, value)\n array.set(value) // needs to set leatest value\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _texture = (key: string, src: string) => {\n loadingImage(gl, src, (source) => {\n const { width, height } = source\n const { texture } = textures(key, width, height)\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\n })\n }\n\n const update = () => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs.map.values())\n const { bindGroups, bindGroupLayouts } = createBindGroup(\n device,\n uniforms.map.values(),\n textures.map.values(),\n cp.storages.map.values()\n )\n const pipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vert, frag)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => pass.setVertexBuffer(i, v))\n pass.draw(gl.count, 1, 0, 0)\n pass.end()\n }\n if (gl.cs) cp.update(bindGroups, bindGroupLayouts, comp)\n }\n\n const render = () => {\n if (!frag || !vert) {\n const config = { isWebGL: false, gl }\n frag = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : DEFAULT_FRAGMENT\n vert = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : DEFAULT_VERTEX\n comp = gl.cs ? (is.str(gl.cs) ? gl.cs : gl.cs.compute(config)) : ''\n }\n if (gl.loading) return // MEMO: loading after build node\n if (needsUpdate) update()\n needsUpdate = false\n const encoder = device.createCommandEncoder()\n if (gl.cs) cp.render(encoder.beginComputePass())\n flush(encoder.beginRenderPass(createDescriptor(context, depthTexture)))\n device.queue.submit([encoder.finish()])\n }\n\n const resize = () => {\n const canvas = gl.el as HTMLCanvasElement\n depthTexture?.destroy()\n depthTexture = createDepthTexture(device, canvas.width, canvas.height)\n }\n\n const clean = () => {\n device.destroy()\n depthTexture?.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n for (const { buffer } of attribs.map.values()) buffer.destroy()\n cp.clean()\n }\n\n resize()\n\n const webgpu = { device, uniforms, textures, attribs, storages: cp.storages } as WebGPUState\n\n return { webgpu, render, resize, clean, _attribute, _uniform, _texture, _storage: cp._storage }\n}\n","import { isFloat32 } from './helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n const device = await adapter!.requestDevice()\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'opaque' })\n return { device, format }\n}\n\nexport const createBindings = () => {\n let uniform = 0\n let texture = 0\n let storage = 0\n let attrib = 0\n return {\n uniform: () => {\n const group = Math.floor(uniform / 12)\n const binding = uniform % 12\n uniform++\n return { group, binding }\n },\n texture: () => {\n const baseGroup = Math.floor(uniform / 12) + 1\n const group = baseGroup + Math.floor(texture / 6)\n const binding = (texture % 6) * 2\n texture++\n return { group, binding }\n },\n storage: () => {\n const baseGroup = Math.floor(uniform / 12) + Math.floor(texture / 6) + 2\n const group = baseGroup + Math.floor(storage / 12)\n const binding = storage % 12\n storage++\n return { group, binding }\n },\n attrib: () => {\n const location = attrib\n attrib++\n return { location }\n },\n }\n}\n\n/**\n * pipeline update\n */\nconst getVertexFormat = (stride: number): GPUVertexFormat => {\n if (stride === 2) return 'float32x2'\n if (stride === 3) return 'float32x3'\n if (stride === 4) return 'float32x4'\n return 'float32'\n}\n\nexport const createVertexBuffers = (attribs: Iterable<AttribData>) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride } of attribs) {\n vertexBuffers[location] = buffer\n bufferLayouts[location] = {\n arrayStride: stride * 4,\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(stride),\n },\n ],\n }\n }\n return { vertexBuffers, bufferLayouts }\n}\n\nexport const createBindGroup = (\n device: GPUDevice,\n uniforms: Iterable<UniformData>,\n textures: Iterable<TextureData>,\n storages: Iterable<StorageData> = []\n) => {\n const groups = new Map<number, { layouts: GPUBindGroupLayoutEntry[]; bindings: GPUBindGroupEntry[] }>()\n const ret = { bindGroups: [] as GPUBindGroup[], bindGroupLayouts: [] as GPUBindGroupLayout[] }\n const add = (i: number, layout: GPUBindGroupLayoutEntry, binding: GPUBindGroupEntry) => {\n if (!groups.has(i)) groups.set(i, { layouts: [], bindings: [] })\n const { layouts, bindings } = groups.get(i)!\n layouts.push(layout)\n bindings.push(binding)\n }\n for (const { binding, buffer, group: i } of uniforms) {\n add(i, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group: i } of storages) {\n add(i, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group: i, sampler, view } of textures) {\n add(i, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(i, { binding: b + 1, visibility: 2, texture: {} }, { binding: b + 1, resource: view })\n }\n for (const [i, { layouts, bindings }] of groups) {\n ret.bindGroupLayouts[i] = device.createBindGroupLayout({ entries: layouts })\n ret.bindGroups[i] = device.createBindGroup({ layout: ret.bindGroupLayouts[i], entries: bindings })\n }\n return ret\n}\n\nexport const createPipeline = (\n device: GPUDevice,\n format: GPUTextureFormat,\n bufferLayouts: GPUVertexBufferLayout[],\n bindGroupLayouts: GPUBindGroupLayout[],\n vs: string,\n fs: string\n) => {\n return device.createRenderPipeline({\n vertex: {\n module: device.createShaderModule({ label: 'vert', code: vs.trim() }),\n entryPoint: 'main',\n buffers: bufferLayouts,\n },\n fragment: {\n module: device.createShaderModule({ label: 'frag', code: fs.trim() }),\n entryPoint: 'main',\n targets: [{ format }],\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n primitive: { topology: 'triangle-list' },\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n })\n}\n\nexport const createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\n return device.createComputePipeline({\n compute: {\n module: device.createShaderModule({ label: 'compute', code: cs.trim() }),\n entryPoint: 'main',\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n })\n}\n\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n}\n\nexport const createArrayBuffer = (\n device: GPUDevice,\n array: number[] | Float32Array,\n type: 'uniform' | 'storage' | 'attrib'\n) => {\n if (!isFloat32(array)) array = new Float32Array(array)\n const usage = bufferUsage(type)\n const size = type === 'uniform' ? Math.ceil(array.byteLength / 256) * 256 : array.byteLength\n const buffer = device.createBuffer({ size, usage })\n return { array, buffer }\n}\n\nexport const createDescriptor = (c: GPUCanvasContext, depthTexture: GPUTexture) => {\n return {\n colorAttachments: [\n {\n view: c.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear' as GPULoadOp,\n storeOp: 'store' as GPUStoreOp,\n },\n ],\n depthStencilAttachment: {\n view: depthTexture.createView(),\n depthClearValue: 1.0,\n depthLoadOp: 'clear' as GPULoadOp,\n depthStoreOp: 'store' as GPUStoreOp,\n },\n } as GPURenderPassDescriptor\n}\n\n/**\n * textures\n */\nexport const createTextureSampler = (device: GPUDevice, width = 1280, height = 800) => {\n const texture = device.createTexture({ size: [width, height], format: 'rgba8unorm', usage: 22 }) // 22 is GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' })\n return { texture, sampler }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({\n size: [width, height],\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n })\n}\n"],"mappings":"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","names":["durable","event","createFrame","createQueue","is","a","isFloat32","value","loadingImage","gl","src","fun","source","cached","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createVbo","data","buffer","createIbo","getStride","count","value","iboValue","stride","createAttrib","loc","vbo","ibo","str","createUniform","is","l","createTexture","img","unit","texture","createStorage","size","ping","pong","array","particles","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","DEFAULT_FRAGMENT","DEFAULT_VERTEX","computeProgram","gl","c","activeUnit","currentNum","units","cached","cs","is","pg","createProgram","size","uniforms","key","storages","array","ping","pong","attachments","loc","unit","index","i","o","createAttachment","cleanStorage","value","createUniform","createStorage","webgl","config","cp","fs","vs","attribs","_attribute","iboValue","createAttrib","_uniform","_texture","src","loadingImage","source","createTexture","clean","render","cached","createDevice","c","log","gpu","format","device","e","createBindings","uniform","texture","storage","attrib","group","binding","location","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","createBindGroup","uniforms","textures","storages","groups","ret","add","layout","layouts","bindings","i","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","createComputePipeline","cs","bufferUsage","type","createArrayBuffer","array","isFloat32","usage","size","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","WORKING_GROUP_SIZE","DEFAULT_VERTEX","DEFAULT_FRAGMENT","computeProgram","gl","device","bindings","flush","_pass","storages","cached","_key","value","array","buffer","createArrayBuffer","binding","group","key","bindGroups","bindGroupLayouts","comp","pipeline","createComputePipeline","pass","v","i","workgroupCount","webgpu","context","format","createDevice","createBindings","cp","frag","vert","needsUpdate","depthTexture","attribs","stride","location","uniforms","textures","width","height","texture","sampler","createTextureSampler","_attribute","_uniform","is","_texture","src","loadingImage","source","update","vertexBuffers","bufferLayouts","createVertexBuffers","createBindGroup","createPipeline","render","config","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","event","createQueue","createFrame","durable","k","v","i","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/helpers.ts","../src/utils/webgl.ts","../src/utils/program.ts","../src/utils/webgpu.ts","../src/utils/pipeline.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './utils/helpers'\nimport { webgl } from './utils/webgl'\nimport { webgpu } from './utils/webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\n\nexport const isGL = (a: unknown): a is EventState<GL> => {\n if (!is.obj(a)) return false\n if ('isGL' in a) return true\n return false\n}\n\nexport const isServer = () => {\n return typeof window === 'undefined'\n}\n\nexport const isWebGPUSupported = () => {\n if (isServer()) return false\n return 'gpu' in navigator\n}\n\nlet iTime = performance.now()\n\nexport const createGL = (props?: Partial<GL>) => {\n const gl = event({\n isNative: false,\n isWebGL: true,\n isError: false,\n isLoop: true,\n isDebug: false,\n isDepth: false,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n instanceCount: 1,\n particleCount: 1024,\n webgl: {},\n webgpu: {},\n loading: 0,\n error() {\n gl.isError = true\n gl.isLoop = false\n gl.clean()\n console.warn('GLRE Error:', ...arguments)\n },\n }) as EventState<GL>\n\n gl.queue = createQueue()\n gl.frame = createFrame()\n\n gl.attribute = durable((k, v, i) => gl.queue(() => gl._attribute?.(k, v, i)), gl)\n gl.instance = durable((k, v, at) => gl.queue(() => gl._instance?.(k, v, at)), gl)\n gl.storage = durable((k, v) => gl.queue(() => gl._storage?.(k, v)), gl)\n gl.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async () => {\n if (!isWebGPUSupported()) gl.isWebGL = true\n gl.vs = gl.vs || gl.vert || gl.vertex\n gl.fs = gl.fs || gl.frag || gl.fragment\n gl.cs = gl.cs || gl.comp || gl.compute\n if (gl.isWebGL) {\n gl((await webgl(gl)) as GL)\n } else gl((await webgpu(gl)) as GL)\n if (gl.isError) return // stop if error\n gl.resize()\n gl.frame(() => {\n gl.loop()\n gl.queue.flush()\n if (gl.loading) return true // wait for textures @TODO FIX\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\n window.addEventListener('resize', gl.resize)\n gl.el.addEventListener('mousemove', gl.mousemove)\n })\n\n gl('clean', () => {\n gl.frame.stop()\n if (gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('resize', () => {\n const w = gl.width || window.innerWidth\n const h = gl.height || window.innerHeight\n gl.size[0] = gl.el.width = w\n gl.size[1] = gl.el.height = h\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const [w, h] = gl.size\n const { top, left } = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - top - w / 2) / (w / 2)\n gl.mouse[1] = -(y - left - h / 2) / (h / 2)\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('loop', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n })\n\n return gl(props)\n}\n\nexport default createGL\n","import type { GL } from './../types'\n\nexport const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\n/**\n * each\n */\ntype EachFn<Value, Key, This> = (this: This, value: Value, key: Key) => void\ntype Eachable<Value = any, Key = any, This = any> = {\n forEach(cb: EachFn<Value, Key, This>, ctx?: This): void\n}\n\nexport const each = <Value, Key, This>(obj: Eachable<Value, Key, This>, fn: EachFn<Value, Key, This>) => obj.forEach(fn)\n\nexport const flush = <Value extends Function, Key, This>(obj: Eachable<Value, Key, This>, ...args: any[]) => {\n each(obj, (f) => f(...args))\n}\n\n/**\n * other\n */\nexport const replace = (x = '', from = '_', to = '/') => x.split(from).join(to)\nexport const ext = (src = '.pdf') => src.split('.').pop()?.toLowerCase() ?? ''\nexport const fig = (x = 0) => `${x}`.split('.')[1]?.length ?? 0\nexport const dig = (x = 0) => `${x}`.split('.')[0]?.length - (x < 0 ? 1 : 0)\nexport const sig = (value = 0, digit = -2) => {\n digit *= -1\n digit = Math.pow(10, digit)\n value *= digit\n value = Math.round(value)\n value /= digit\n return value\n}\n\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nexport const loadingImage = (gl: GL, src: string, fun: (source: HTMLImageElement) => void) => {\n gl.loading++\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => {\n fun(source)\n gl.loading--\n })\n}\n\nconst isValidStride = (stride: number) => [1, 2, 3, 4, 9, 16].includes(stride)\n\nconst calcStride = (arrayLength: number, count = 3) => {\n if (arrayLength % count === 0) return Math.floor(arrayLength / count)\n return -1\n}\n\nexport const getStride = (arrayLength: number, count = 1, error = console.warn) => {\n const ret = calcStride(arrayLength, count)\n if (!isValidStride(ret))\n error(\n `glre attribute error: Invalid attribute length ${arrayLength}. Must divide by vertex count (${count}) with valid stride (1,2,3,4,9,16)`\n )\n return ret\n}\n\nexport const GLSL_FS = /* cpp */ `\n#version 300 es\nprecision mediump float;\nout vec4 fragColor;\nuniform vec2 iResolution;\nvoid main() {\n fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);\n}\n`\n\nexport const GLSL_VS = /* cpp */ `\n#version 300 es\nvoid main() {\n float x = float(gl_VertexID % 2) * 4.0 - 1.0;\n float y = float(gl_VertexID / 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}`\n\nexport const WGSL_VS = /* rust */ `\nstruct In { @builtin(vertex_index) vertex_index: u32 }\nstruct Out { @builtin(position) position: vec4f }\n@vertex\nfn main(in: In) -> Out {\n var out: Out;\n var x = f32(in.vertex_index % 2) * 4.0 - 1.0;\n var y = f32(in.vertex_index / 2) * 4.0 - 1.0;\n out.position = vec4f(x, y, 0.0, 1.0);\n return out;\n}\n`.trim()\n\nexport const WGSL_FS = /* rust */ `\nstruct Out { @builtin(position) position: vec4f }\n@group(0) @binding(0) var<uniform> iResolution: vec2f;\n@fragment\nfn main(out: Out) -> @location(0) vec4f {\n return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);\n}\n`\n","import { nested as cached } from 'reev'\nimport { is, loadingImage, getStride, GLSL_VS, GLSL_FS } from './helpers'\nimport {\n createArrayBuffer,\n cleanStorage,\n createAttachment,\n createProgram,\n createStorage,\n createTexture,\n setArrayBuffer,\n storageSize,\n updateAttrib,\n updateInstance,\n updateUniform,\n} from './program'\nimport type { GL, WebGLState } from '../types'\n\nconst computeProgram = (gl: GL, c: WebGL2RenderingContext) => {\n if (!gl.cs) return null // ignore if no compute shader\n c.getExtension('EXT_color_buffer_float')\n\n let activeUnit = 0 // for texture units\n let currentNum = 0 // for storage buffers\n\n const units = cached(() => activeUnit++)\n const cs = is.str(gl.cs) ? gl.cs : gl.cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, GLSL_VS, gl)!\n const size = storageSize(gl.particleCount)\n\n const uniforms = cached((key) => c.getUniformLocation(pg, key)!)\n const storages = cached((key) => {\n const array = new Float32Array(size.x * size.y * 4) // RGBA texture data\n const ping = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n const pong = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n return { ping, pong, array, loc: uniforms(key), unit: units(key) }\n })\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n updateUniform(c, uniforms(key), value)\n }\n\n const _storage = (key: string, value: number[]) => {\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size.x, size.y, ping, pong, unit, array)\n }\n\n const clean = () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n }\n\n const render = () => {\n c.useProgram(pg)\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = currentNum % 2 ? [ping, pong] : [pong, ping]\n return createAttachment(c, i, o, loc, unit, index)\n })\n c.drawBuffers(attachments)\n c.drawArrays(c.TRIANGLES, 0, 3)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n currentNum++\n }\n\n return { render, clean, _uniform, _storage, storages }\n}\n\nexport const webgl = async (gl: GL) => {\n const config = { isWebGL: true, gl }\n const c = gl.el!.getContext('webgl2')!\n const cp = computeProgram(gl, c)\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs!.fragment(config)) : GLSL_FS\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs!.vertex(config)) : GLSL_VS\n const pg = createProgram(c, fs, vs, gl)!\n c.useProgram(pg)\n\n let activeUnit = 0 // for texture units\n\n const units = cached(() => activeUnit++)\n const uniforms = cached((key) => c.getUniformLocation(pg, key))\n\n const attribs = cached((key, value: number[], isInstance = false) => {\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count, gl.error)\n const location = c.getAttribLocation(pg, key)\n const { array, buffer } = createArrayBuffer(c, value)\n return { array, buffer, location, stride }\n })\n\n const _attribute = (key = '', value: number[]) => {\n const { array, buffer, location, stride } = attribs(key, value)\n setArrayBuffer(c, array, buffer, value)\n updateAttrib(c, location, stride, buffer)\n }\n\n const _instance = (key: string, value: number[]) => {\n const { array, buffer, location, stride } = attribs(key, value, true)\n setArrayBuffer(c, array, buffer, value)\n updateInstance(c, location, stride, buffer)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n updateUniform(c, uniforms(key)!, value)\n cp?._uniform(key, value)\n }\n\n const _texture = (key: string, src: string) => {\n c.useProgram(pg)\n loadingImage(gl, src, (source) => {\n createTexture(c, source, uniforms(key)!, units(key))\n })\n }\n\n const clean = () => {\n cp?.clean()\n c.deleteProgram(pg)\n c.getExtension('WEBGL_lose_context')?.loseContext()\n }\n\n const render = () => {\n cp?.render()\n c.useProgram(pg)\n c.viewport(0, 0, ...gl.size)\n if (gl.instanceCount > 1) {\n c.drawArraysInstanced(c.TRIANGLES, 0, gl.count, gl.instanceCount)\n } else c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n }\n\n if (gl.isDepth) {\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n }\n\n const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, render, clean, _attribute, _instance, _uniform, _texture, _storage: cp?._storage }\n}\n","import { is } from './helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGL2RenderingContext, source: string, type: number, onError = console.warn) => {\n const shader = c.createShader(type)\n if (!shader) return onError('Failed to create shader')\n c.shaderSource(shader, source.trim())\n c.compileShader(shader)\n if (c.getShaderParameter(shader, c.COMPILE_STATUS)) return shader\n const error = c.getShaderInfoLog(shader)\n c.deleteShader(shader)\n onError(`Could not compile shader: ${error}\\n\\n↓↓↓generated↓↓↓\\n${source}`)\n}\n\nexport const createProgram = (c: WebGL2RenderingContext, frag: string, vert: string, gl: GL) => {\n const pg = c.createProgram()\n const fs = createShader(c, frag, c.FRAGMENT_SHADER, gl.error)\n const vs = createShader(c, vert, c.VERTEX_SHADER, gl.error)\n if (!fs || !vs) return\n c.attachShader(pg, fs!)\n c.attachShader(pg, vs!)\n c.linkProgram(pg)\n if (c.getProgramParameter(pg, c.LINK_STATUS)) return pg\n const error = c.getProgramInfoLog(pg)\n c.deleteProgram(pg)\n gl.error(`Could not link program: ${error}`)\n}\n\nexport const createArrayBuffer = (c: WebGL2RenderingContext, data: number[]) => {\n const array = new Float32Array(data)\n const buffer = c.createBuffer()\n return { array, buffer }\n}\n\nexport const setArrayBuffer = (\n c: WebGL2RenderingContext,\n array: Float32Array,\n buffer: WebGLBuffer,\n value: number[]\n) => {\n array.set(value)\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, array, c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n}\n\nexport const updateAttrib = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n}\n\nexport const updateInstance = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n c.vertexAttribDivisor(loc, 1) // divisor is 1\n}\n\nexport const updateUniform = (c: WebGL2RenderingContext, loc: WebGLUniformLocation, value: number | number[]) => {\n if (is.num(value)) return c.uniform1f(loc, value)\n let l = value.length\n if (l <= 4) return c[`uniform${l as 2}fv`](loc, value)\n l = Math.sqrt(l) << 0\n c[`uniformMatrix${l as 2}fv`](loc, false, value)\n}\n\nexport const createTexture = (\n c: WebGL2RenderingContext,\n img: HTMLImageElement,\n loc: WebGLUniformLocation,\n unit: number\n) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, img)\n c.generateMipmap(c.TEXTURE_2D)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, null)\n c.uniform1i(loc, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (\n c: WebGL2RenderingContext,\n value: number[],\n width: number,\n height: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\n const particleCount = width * height\n const vectorSize = value.length / particleCount\n for (let i = 0; i < particleCount; i++) {\n for (let j = 0; j < Math.min(vectorSize, 4); j++) {\n array[4 * i + j] = value[i * vectorSize + j] || 0\n }\n }\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, ping.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, pong.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n}\n\nexport const cleanStorage = (\n c: WebGL2RenderingContext,\n map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>\n) => {\n for (const { ping, pong } of map) {\n c.deleteTexture(ping.texture)\n c.deleteTexture(pong.texture)\n c.deleteFramebuffer(ping.buffer)\n c.deleteFramebuffer(pong.buffer)\n }\n}\n\nexport const createAttachment = (\n c: WebGL2RenderingContext,\n i: TextureBuffer,\n o: TextureBuffer,\n loc: WebGLUniformLocation,\n unit: number,\n index: number\n) => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, i.texture)\n c.uniform1i(loc, unit)\n if (index === 0) c.bindFramebuffer(c.FRAMEBUFFER, o.buffer)\n const attachment = c.COLOR_ATTACHMENT0 + index\n c.framebufferTexture2D(c.FRAMEBUFFER, attachment, c.TEXTURE_2D, o.texture, 0)\n return attachment\n}\n\n/**\n * utils\n */\nexport const storageSize = (particleCount: number | number[] = 1024) => {\n if (is.num(particleCount)) {\n const sqrt = Math.sqrt(particleCount)\n const size = Math.ceil(sqrt)\n if (!Number.isInteger(sqrt)) {\n console.warn(\n `GLRE Storage Warning: particleCount (${particleCount}) is not a square. Using ${size}x${size} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`\n )\n }\n return { x: size, y: size }\n }\n const [x, y, z] = particleCount\n if (z !== undefined) {\n const yz = y * z\n console.warn(\n `GLRE Storage Warning: 3D particleCount [${x}, ${y}, ${z}] specified but WebGL storage textures only support 2D. Flattening to 2D by multiplying height=${y} * depth=${z} = ${yz}.`\n )\n return { x, y: yz }\n }\n return { x, y }\n}\n","import { nested as cached } from 'reev'\nimport { is, loadingImage, getStride, WGSL_FS, WGSL_VS } from './helpers'\nimport {\n createArrayBuffer,\n createBindGroup,\n createBindings,\n createComputePipeline,\n createDepthTexture,\n createDescriptor,\n createDevice,\n createPipeline,\n createTextureSampler,\n createVertexBuffers,\n workgroupCount,\n} from './pipeline'\nimport type { GL, WebGPUState } from '../types'\n\nconst computeProgram = (gl: GL, device: GPUDevice, bindings: any) => {\n let flush = (_pass: GPUComputePassEncoder) => {}\n\n const storages = cached((_key, value: number[] | Float32Array) => {\n const { array, buffer } = createArrayBuffer(device, value, 'storage')\n const { binding, group } = bindings.storage()\n return { array, buffer, binding, group }\n })\n\n const _storage = (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const update = (bindGroups: GPUBindGroup[], bindGroupLayouts: GPUBindGroupLayout[], comp: string) => {\n const pipeline = createComputePipeline(device, bindGroupLayouts, comp!)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const { x, y, z } = workgroupCount(gl.particleCount)\n pass.dispatchWorkgroups(x, y, z)\n pass.end()\n }\n }\n\n const render = (pass: GPUComputePassEncoder) => {\n flush(pass)\n }\n\n const clean = () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n }\n\n return { storages, _storage, update, render, clean }\n}\n\nexport const webgpu = async (gl: GL) => {\n const context = gl.el!.getContext('webgpu') as GPUCanvasContext\n const { device, format } = await createDevice(context, gl.error)\n const bindings = createBindings()\n const cp = computeProgram(gl, device, bindings)\n let frag: string\n let comp: string\n let vert: string\n let flush = (_pass: GPURenderPassEncoder) => {}\n let needsUpdate = true\n let depthTexture: GPUTexture\n\n const attribs = cached((_key, value: number[], isInstance = false) => {\n needsUpdate = true\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count)\n const { location } = bindings.attrib()\n const { array, buffer } = createArrayBuffer(device, value, 'attrib')\n return { array, buffer, location, stride, isInstance }\n })\n\n const uniforms = cached((_key, value: number[]) => {\n needsUpdate = true\n const { binding, group } = bindings.uniform()\n const { array, buffer } = createArrayBuffer(device, value, 'uniform')\n return { array, buffer, binding, group }\n })\n\n const textures = cached((_key, width = 0, height = 0) => {\n needsUpdate = true\n const { binding, group } = bindings.texture()\n const { texture, sampler } = createTextureSampler(device, width, height)\n return { texture, sampler, binding, group, view: texture.createView() }\n })\n\n const _attribute = (key = '', value: number[]) => {\n const { array, buffer } = attribs(key, value)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _instance = (key: string, value: number[]) => {\n const { array, buffer } = attribs(key, value, true)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n if (is.num(value)) value = [value]\n const { array, buffer } = uniforms(key, value)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _texture = (key: string, src: string) => {\n loadingImage(gl, src, (source) => {\n const { width, height } = source\n const { texture } = textures(key, width, height)\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\n })\n }\n\n const update = () => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs.map.values())\n const { bindGroups, bindGroupLayouts } = createBindGroup(\n device,\n uniforms.map.values(),\n textures.map.values(),\n cp.storages.map.values()\n )\n const pipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vert, frag)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => pass.setVertexBuffer(i, v))\n pass.draw(gl.count, gl.instanceCount, 0, 0)\n pass.end()\n }\n if (gl.cs) cp.update(bindGroups, bindGroupLayouts, comp)\n }\n\n const render = () => {\n if (!frag || !vert) {\n const config = { isWebGL: false, gl }\n frag = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : WGSL_FS\n vert = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : WGSL_VS\n comp = gl.cs ? (is.str(gl.cs) ? gl.cs : gl.cs.compute(config)) : ''\n }\n if (gl.loading) return // MEMO: loading after build node\n if (needsUpdate) update()\n needsUpdate = false\n const encoder = device.createCommandEncoder()\n if (gl.cs) cp.render(encoder.beginComputePass())\n flush(encoder.beginRenderPass(createDescriptor(context, depthTexture)))\n device.queue.submit([encoder.finish()])\n }\n\n const resize = () => {\n const canvas = gl.el as HTMLCanvasElement\n depthTexture?.destroy()\n depthTexture = createDepthTexture(device, canvas.width, canvas.height)\n }\n\n const clean = () => {\n device.destroy()\n depthTexture?.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n for (const { buffer } of attribs.map.values()) buffer.destroy()\n cp.clean()\n }\n\n resize()\n\n const webgpu = { device, uniforms, textures, attribs, storages: cp.storages } as WebGPUState\n\n return { webgpu, render, resize, clean, _attribute, _instance, _uniform, _texture, _storage: cp._storage }\n}\n","import { is, isFloat32 } from './helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n const device = await adapter!.requestDevice()\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'opaque' })\n return { device, format }\n}\n\nexport const createBindings = () => {\n let uniform = 0\n let texture = 0\n let storage = 0\n let attrib = 0\n return {\n uniform: () => {\n const group = Math.floor(uniform / 12)\n const binding = uniform % 12\n uniform++\n return { group, binding }\n },\n texture: () => {\n const baseGroup = Math.floor(uniform / 12) + 1\n const group = baseGroup + Math.floor(texture / 6)\n const binding = (texture % 6) * 2\n texture++\n return { group, binding }\n },\n storage: () => {\n const baseGroup = Math.floor(uniform / 12) + Math.floor(texture / 6) + 2\n const group = baseGroup + Math.floor(storage / 12)\n const binding = storage % 12\n storage++\n return { group, binding }\n },\n attrib: () => {\n const location = attrib\n attrib++\n return { location }\n },\n }\n}\n\n/**\n * pipeline update\n */\nconst getVertexFormat = (stride: number): GPUVertexFormat => {\n if (stride === 2) return 'float32x2'\n if (stride === 3) return 'float32x3'\n if (stride === 4) return 'float32x4'\n return 'float32'\n}\n\nexport const createVertexBuffers = (attribs: Iterable<AttribData & { isInstance?: boolean }>) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride, isInstance } of attribs) {\n vertexBuffers[location] = buffer\n const componentSize = Math.min(Math.max(Math.floor(stride), 1), 4)\n const arrayStride = Math.max(4, Math.ceil((componentSize * 4) / 4) * 4)\n bufferLayouts[location] = {\n arrayStride,\n stepMode: isInstance ? 'instance' : 'vertex',\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(componentSize),\n },\n ],\n }\n }\n return { vertexBuffers, bufferLayouts }\n}\n\nexport const createBindGroup = (\n device: GPUDevice,\n uniforms: Iterable<UniformData>,\n textures: Iterable<TextureData>,\n storages: Iterable<StorageData> = []\n) => {\n const groups = new Map<number, { layouts: GPUBindGroupLayoutEntry[]; bindings: GPUBindGroupEntry[] }>()\n const ret = { bindGroups: [] as GPUBindGroup[], bindGroupLayouts: [] as GPUBindGroupLayout[] }\n const add = (i: number, layout: GPUBindGroupLayoutEntry, binding: GPUBindGroupEntry) => {\n if (!groups.has(i)) groups.set(i, { layouts: [], bindings: [] })\n const { layouts, bindings } = groups.get(i)!\n layouts.push(layout)\n bindings.push(binding)\n }\n for (const { binding, buffer, group: i } of uniforms) {\n add(i, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group: i } of storages) {\n add(i, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group: i, sampler, view } of textures) {\n add(i, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(i, { binding: b + 1, visibility: 2, texture: {} }, { binding: b + 1, resource: view })\n }\n for (const [i, { layouts, bindings }] of groups) {\n ret.bindGroupLayouts[i] = device.createBindGroupLayout({ entries: layouts })\n ret.bindGroups[i] = device.createBindGroup({ layout: ret.bindGroupLayouts[i], entries: bindings })\n }\n return ret\n}\n\nexport const createPipeline = (\n device: GPUDevice,\n format: GPUTextureFormat,\n bufferLayouts: GPUVertexBufferLayout[],\n bindGroupLayouts: GPUBindGroupLayout[],\n vs: string,\n fs: string\n) => {\n return device.createRenderPipeline({\n vertex: {\n module: device.createShaderModule({ label: 'vert', code: vs.trim() }),\n entryPoint: 'main',\n buffers: bufferLayouts,\n },\n fragment: {\n module: device.createShaderModule({ label: 'frag', code: fs.trim() }),\n entryPoint: 'main',\n targets: [{ format }],\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n primitive: { topology: 'triangle-list' },\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n })\n}\n\nexport const createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\n return device.createComputePipeline({\n compute: {\n module: device.createShaderModule({ label: 'compute', code: cs.trim() }),\n entryPoint: 'main',\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n })\n}\n\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n}\n\nexport const createArrayBuffer = (\n device: GPUDevice,\n array: number[] | Float32Array,\n type: 'uniform' | 'storage' | 'attrib'\n) => {\n if (!isFloat32(array)) array = new Float32Array(array)\n const usage = bufferUsage(type)\n const size = type === 'uniform' ? Math.ceil(array.byteLength / 256) * 256 : array.byteLength\n const buffer = device.createBuffer({ size, usage })\n return { array, buffer }\n}\n\nexport const createDescriptor = (c: GPUCanvasContext, depthTexture: GPUTexture) => {\n return {\n colorAttachments: [\n {\n view: c.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear' as GPULoadOp,\n storeOp: 'store' as GPUStoreOp,\n },\n ],\n depthStencilAttachment: {\n view: depthTexture.createView(),\n depthClearValue: 1.0,\n depthLoadOp: 'clear' as GPULoadOp,\n depthStoreOp: 'store' as GPUStoreOp,\n },\n } as GPURenderPassDescriptor\n}\n\n/**\n * textures\n */\nexport const createTextureSampler = (device: GPUDevice, width = 1280, height = 800) => {\n const texture = device.createTexture({ size: [width, height], format: 'rgba8unorm', usage: 22 }) // 22 is GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' })\n return { texture, sampler }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({\n size: [width, height],\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n })\n}\n\n/**\n * utils\n */\nexport const workgroupCount = (particleCount: number | number[], workgroupSize = 32) => {\n if (is.num(particleCount)) particleCount = [particleCount]\n const [x, y = 1, z = 1] = particleCount\n return {\n x: Math.min((x * y * z) / workgroupSize, 65535),\n y: 1,\n z: 1,\n }\n}\n"],"mappings":"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","names":["durable","event","createFrame","createQueue","is","a","isFloat32","value","loadingImage","gl","src","fun","source","isValidStride","stride","calcStride","arrayLength","count","getStride","error","ret","GLSL_FS","GLSL_VS","WGSL_VS","WGSL_FS","cached","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createArrayBuffer","data","array","buffer","setArrayBuffer","value","updateAttrib","loc","stride","updateInstance","updateUniform","is","l","createTexture","img","unit","texture","createStorage","width","height","ping","pong","particleCount","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","storageSize","sqrt","size","x","y","z","yz","computeProgram","gl","c","activeUnit","currentNum","units","cached","cs","is","pg","createProgram","GLSL_VS","size","storageSize","uniforms","key","storages","array","ping","pong","attachments","loc","unit","index","i","o","createAttachment","cleanStorage","value","updateUniform","createStorage","webgl","config","cp","fs","GLSL_FS","vs","attribs","isInstance","stride","getStride","location","buffer","createArrayBuffer","_attribute","setArrayBuffer","updateAttrib","_instance","updateInstance","_uniform","_texture","src","loadingImage","source","createTexture","clean","render","cached","createDevice","c","log","gpu","format","device","e","createBindings","uniform","texture","storage","attrib","group","binding","location","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","isInstance","componentSize","arrayStride","createBindGroup","uniforms","textures","storages","groups","ret","add","layout","layouts","bindings","i","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","createComputePipeline","cs","bufferUsage","type","createArrayBuffer","array","isFloat32","usage","size","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","workgroupCount","particleCount","workgroupSize","is","x","y","z","computeProgram","gl","device","bindings","flush","_pass","storages","cached","_key","value","array","buffer","createArrayBuffer","binding","group","key","bindGroups","bindGroupLayouts","comp","pipeline","createComputePipeline","pass","v","i","x","y","z","workgroupCount","webgpu","context","format","createDevice","createBindings","cp","frag","vert","needsUpdate","depthTexture","attribs","isInstance","stride","getStride","location","uniforms","textures","width","height","texture","sampler","createTextureSampler","_attribute","_instance","_uniform","is","_texture","src","loadingImage","source","update","vertexBuffers","bufferLayouts","createVertexBuffers","createBindGroup","createPipeline","render","config","WGSL_FS","WGSL_VS","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","event","createQueue","createFrame","durable","k","v","i","at","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}
package/dist/native.d.ts CHANGED
@@ -3,7 +3,7 @@ import { EventState, Nested } from 'reev';
3
3
  import * as refr from 'refr';
4
4
  import { Queue, Frame } from 'refr';
5
5
 
6
- 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
+ declare const CONVERSIONS: readonly ["toBool", "toUInt", "toInt", "toFloat", "toBVec2", "toIVec2", "toUVec2", "toVec2", "toBVec3", "toIVec3", "toUVec3", "toVec3", "toBVec4", "toIVec4", "toUVec4", "toVec4", "toColor", "toMat2", "toMat3", "toMat4"];
7
7
  declare const TYPE_MAPPING: {
8
8
  readonly bool: "bool";
9
9
  readonly uint: "u32";
@@ -68,7 +68,7 @@ declare const OPERATOR_TYPE_RULES: readonly [readonly ["float", "vec2", "vec2"],
68
68
  * 1.2. index.ts functions and
69
69
  * 3.2. types.ts _N
70
70
  */
71
- 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"];
71
+ 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"];
72
72
 
73
73
  type Constants = (typeof CONSTANTS)[number] | 'void';
74
74
  type Conversions = (typeof CONVERSIONS)[number];
@@ -82,14 +82,14 @@ interface FnLayout {
82
82
  type: C | 'auto';
83
83
  inputs?: Array<{
84
84
  name: string;
85
- type: C;
85
+ type: C | 'auto';
86
86
  }>;
87
87
  }
88
88
  type StructFields = Record<string, X>;
89
89
  /**
90
90
  * node
91
91
  */
92
- 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';
92
+ 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';
93
93
  interface NodeProps {
94
94
  id?: string;
95
95
  args?: any[];
@@ -194,10 +194,11 @@ type XImpl<T extends C> = _X<T> & {
194
194
  };
195
195
  type C = Constants;
196
196
  type X<T extends C = C> = T extends keyof ConstantsToType ? ConstantsToType[T] : _X<T>;
197
- type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element';
197
+ type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element' | 'select';
198
198
  interface _X<T extends C> {
199
199
  readonly __nodeType?: T;
200
200
  assign(x: any): X<T>;
201
+ select(x: number | X<T>, y: X<'bool'>): X<T>;
201
202
  fragment(c: NodeContext): string;
202
203
  toVar(name?: string): X<T>;
203
204
  toString(c?: NodeContext): string;
@@ -241,20 +242,20 @@ interface _X<T extends C> {
241
242
  shiftLeftAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>;
242
243
  shiftRightAssign<U extends C>(x: ValidateOperator<T, U> extends 0 ? never : number | X<U>): X<T>;
243
244
  toBool(): Bool;
244
- toUint(): UInt;
245
+ toUInt(): UInt;
245
246
  toInt(): Int;
246
247
  toFloat(): Float;
247
- toBvec2(): BVec2;
248
- toIvec2(): IVec2;
249
- toUvec2(): UVec2;
248
+ toBVec2(): BVec2;
249
+ toIVec2(): IVec2;
250
+ toUVec2(): UVec2;
250
251
  toVec2(): Vec2;
251
- toBvec3(): BVec3;
252
- toIvec3(): IVec3;
253
- toUvec3(): UVec3;
252
+ toBVec3(): BVec3;
253
+ toIVec3(): IVec3;
254
+ toUVec3(): UVec3;
254
255
  toVec3(): Vec3;
255
- toBvec4(): BVec4;
256
- toIvec4(): IVec4;
257
- toUvec4(): UVec4;
256
+ toBVec4(): BVec4;
257
+ toIVec4(): IVec4;
258
+ toUVec4(): UVec4;
258
259
  toVec4(): Vec4;
259
260
  toColor(): Color;
260
261
  toMat2(): Mat2;
@@ -338,14 +339,17 @@ type GL = EventState<{
338
339
  isWebGL: boolean;
339
340
  isError: boolean;
340
341
  isLoop: boolean;
342
+ isDebug: boolean;
343
+ isDepth: boolean;
341
344
  isGL: true;
342
345
  width?: number;
343
346
  height?: number;
344
347
  size: [number, number];
345
348
  mouse: [number, number];
346
349
  count: number;
350
+ instanceCount: number;
351
+ particleCount: number | [number, number] | [number, number, number];
347
352
  loading: number;
348
- particles: 64 | 256 | 576 | 1024 | 1600 | 2304 | 3136 | 4096 | 4096 | 5184 | 6400;
349
353
  el: HTMLCanvasElement;
350
354
  vs?: string | Vec4;
351
355
  cs?: string | Void;
@@ -372,7 +376,7 @@ type GL = EventState<{
372
376
  error(e?: string): void;
373
377
  render(): void;
374
378
  resize(e?: Event): void;
375
- mousemove(e: Event): void;
379
+ mousemove(e: MouseEvent): void;
376
380
  loop(): void;
377
381
  /**
378
382
  * setter
@@ -392,6 +396,11 @@ type GL = EventState<{
392
396
  attribute(target: {
393
397
  [key: string]: Attribute;
394
398
  }): GL;
399
+ _instance?(key: string, value: Attribute, at?: number): GL;
400
+ instance(key: string, value: Attribute, at?: number): GL;
401
+ instance(target: {
402
+ [key: string]: Attribute;
403
+ }): GL;
395
404
  _storage?(key: string, value: Storage): GL;
396
405
  storage(key: string, value: Storage): GL;
397
406
  storage(target: {
@@ -422,6 +431,7 @@ interface AttribData {
422
431
  buffer: GPUBuffer;
423
432
  location: number;
424
433
  stride: number;
434
+ isInstance?: boolean;
425
435
  }
426
436
  interface StorageData {
427
437
  array: Float32Array;
@@ -453,14 +463,17 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
453
463
  isWebGL: boolean;
454
464
  isError: boolean;
455
465
  isLoop: boolean;
466
+ isDebug: boolean;
467
+ isDepth: boolean;
456
468
  isGL: true;
457
469
  width?: number;
458
470
  height?: number;
459
471
  size: [number, number];
460
472
  mouse: [number, number];
461
473
  count: number;
474
+ instanceCount: number;
475
+ particleCount: number | [number, number] | [number, number, number];
462
476
  loading: number;
463
- particles: 64 | 256 | 576 | 1024 | 1600 | 2304 | 3136 | 4096 | 4096 | 5184 | 6400;
464
477
  el: HTMLCanvasElement;
465
478
  vs?: string | Vec4;
466
479
  cs?: string | Void;
@@ -481,7 +494,7 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
481
494
  error(e?: string): void;
482
495
  render(): void;
483
496
  resize(e?: Event): void;
484
- mousemove(e: Event): void;
497
+ mousemove(e: MouseEvent): void;
485
498
  loop(): void;
486
499
  _uniform?(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
487
500
  uniform(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
@@ -498,6 +511,11 @@ declare const createGL: (props?: Partial<GL>) => EventState<{
498
511
  attribute(target: {
499
512
  [key: string]: number[] | Float32Array<ArrayBufferLike>;
500
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;
501
519
  _storage?(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
502
520
  storage(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
503
521
  storage(target: {
@@ -510,14 +528,17 @@ declare const useGL: (props?: Partial<GL>) => reev.EventState<{
510
528
  isWebGL: boolean;
511
529
  isError: boolean;
512
530
  isLoop: boolean;
531
+ isDebug: boolean;
532
+ isDepth: boolean;
513
533
  isGL: true;
514
534
  width?: number;
515
535
  height?: number;
516
536
  size: [number, number];
517
537
  mouse: [number, number];
518
538
  count: number;
539
+ instanceCount: number;
540
+ particleCount: number | [number, number] | [number, number, number];
519
541
  loading: number;
520
- particles: 64 | 256 | 576 | 1024 | 1600 | 2304 | 3136 | 4096 | 4096 | 5184 | 6400;
521
542
  el: HTMLCanvasElement;
522
543
  vs?: string | Vec4;
523
544
  cs?: string | Void;
@@ -538,7 +559,7 @@ declare const useGL: (props?: Partial<GL>) => reev.EventState<{
538
559
  error(e?: string): void;
539
560
  render(): void;
540
561
  resize(e?: Event): void;
541
- mousemove(e: Event): void;
562
+ mousemove(e: MouseEvent): void;
542
563
  loop(): void;
543
564
  _uniform?(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
544
565
  uniform(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
@@ -555,6 +576,11 @@ declare const useGL: (props?: Partial<GL>) => reev.EventState<{
555
576
  attribute(target: {
556
577
  [key: string]: number[] | Float32Array<ArrayBufferLike>;
557
578
  }): GL;
579
+ _instance?(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
580
+ instance(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
581
+ instance(target: {
582
+ [key: string]: number[] | Float32Array<ArrayBufferLike>;
583
+ }): GL;
558
584
  _storage?(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
559
585
  storage(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
560
586
  storage(target: {
@@ -562,4 +588,4 @@ declare const useGL: (props?: Partial<GL>) => reev.EventState<{
562
588
  }): GL;
563
589
  }, any[] | unknown[]>;
564
590
 
565
- export { AttribData, GL, StorageData, TextureData, UniformData, WebGLState, WebGPUState, createGL, isGL, isServer, isWebGPUSupported, useGL };
591
+ export { type AttribData, type GL, type StorageData, type TextureData, type UniformData, type WebGLState, type WebGPUState, createGL, isGL, isServer, isWebGPUSupported, useGL };