glre 0.45.0 → 0.46.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 (52) hide show
  1. package/README.md +4 -26
  2. package/dist/addons.d.ts +35 -50
  3. package/dist/index.cjs +6 -6
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.ts +37 -90
  6. package/dist/index.js +6 -6
  7. package/dist/index.js.map +1 -1
  8. package/dist/native.cjs +1 -1
  9. package/dist/native.cjs.map +1 -1
  10. package/dist/native.d.ts +45 -93
  11. package/dist/native.js +1 -1
  12. package/dist/native.js.map +1 -1
  13. package/dist/node.cjs +15 -15
  14. package/dist/node.cjs.map +1 -1
  15. package/dist/node.d.ts +35 -50
  16. package/dist/node.js +14 -14
  17. package/dist/node.js.map +1 -1
  18. package/dist/react.cjs +1 -1
  19. package/dist/react.cjs.map +1 -1
  20. package/dist/react.d.ts +37 -91
  21. package/dist/react.js +1 -1
  22. package/dist/react.js.map +1 -1
  23. package/dist/solid.cjs +1 -1
  24. package/dist/solid.cjs.map +1 -1
  25. package/dist/solid.d.ts +37 -91
  26. package/dist/solid.js +1 -1
  27. package/dist/solid.js.map +1 -1
  28. package/package.json +1 -1
  29. package/src/{utils/helpers.ts → helpers.ts} +10 -32
  30. package/src/index.ts +45 -42
  31. package/src/native.ts +6 -7
  32. package/src/node/build.ts +3 -19
  33. package/src/node/create.ts +2 -4
  34. package/src/node/index.ts +8 -20
  35. package/src/node/types.ts +2 -0
  36. package/src/node/utils/index.ts +1 -1
  37. package/src/node/utils/infer.ts +4 -12
  38. package/src/node/utils/parse.ts +18 -34
  39. package/src/node/utils/utils.ts +3 -3
  40. package/src/react.ts +9 -12
  41. package/src/solid.ts +3 -10
  42. package/src/types.ts +30 -22
  43. package/src/webgl/compute.ts +56 -0
  44. package/src/webgl/graphic.ts +65 -0
  45. package/src/webgl/index.ts +21 -0
  46. package/src/{utils/program.ts → webgl/utils.ts} +30 -8
  47. package/src/webgpu/compute.ts +39 -0
  48. package/src/webgpu/graphic.ts +89 -0
  49. package/src/webgpu/index.ts +42 -0
  50. package/src/{utils/pipeline.ts → webgpu/utils.ts} +75 -78
  51. package/src/utils/webgl.ts +0 -135
  52. package/src/utils/webgpu.ts +0 -178
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{durable as F,event as _e}from"reev";import{createFrame as he,createQueue as Re}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,be=(e,t)=>{let r=new Image;Object.assign(r,{src:e,crossOrigin:"anonymous"}),r.decode().then(()=>t(r))},ge=(e,t)=>{let r=document.createElement("video");r.crossOrigin="anonymous",r.muted=!0,r.loop=!0,r.src=e,r.load(),r.play(),r.addEventListener("canplay",t.bind(null,r),{once:!0})};function D(e,t){if(!T.str(e))return t(e,e instanceof HTMLVideoElement);let r=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(r?ge:be)(e,o=>{t(o,r)})}var xe=e=>[1,2,3,4,9,16].includes(e),Ee=(e,t=3)=>e%t===0?Math.floor(e/t):-1,M=(e,t=1,r=console.warn)=>{let n=Ee(e,t);return xe(n)||r(`glre attribute error: Invalid attribute length ${e}. Must divide by vertex count (${t}) with valid stride (1,2,3,4,9,16)`),n},q=`
1
+ import{durable as y,event as Ge}from"reev";import{createFrame as ye,createQueue as Le}from"refr";var b={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 C=e=>e instanceof Float32Array,fe=(e,t)=>{let r=new Image;Object.assign(r,{src:e,crossOrigin:"anonymous"}),r.decode().then(()=>t(r))},me=(e,t)=>{let r=document.createElement("video");Object.assign(r,{src:e,loop:!0,muted:!0,crossOrigin:"anonymous"}),r.load(),r.play(),r.addEventListener("canplay",t.bind(null,r),{once:!0})};function L(e,t){if(!b.str(e))return t(e,e instanceof HTMLVideoElement);let r=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(r?me:fe)(e,o=>{t(o,r)})}var pe=e=>[1,2,3,4,9,16].includes(e),de=(e,t=3)=>e%t===0?Math.floor(e/t):-1,h=(e,t=1,r=console.warn)=>{let n=de(e,t);return pe(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},M=`
2
2
  #version 300 es
3
3
  precision highp float;
4
4
  precision highp int;
@@ -7,13 +7,13 @@ uniform vec2 iResolution;
7
7
  void main() {
8
8
  fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);
9
9
  }
10
- `,I=`
10
+ `,R=`
11
11
  #version 300 es
12
12
  void main() {
13
13
  float x = float(gl_VertexID % 2) * 4.0 - 1.0;
14
14
  float y = float(gl_VertexID / 2) * 4.0 - 1.0;
15
15
  gl_Position = vec4(x, y, 0.0, 1.0);
16
- }`,H=`
16
+ }`,I=`
17
17
  struct In { @builtin(vertex_index) vertex_index: u32 }
18
18
  struct Out { @builtin(position) position: vec4f }
19
19
  @vertex
@@ -24,15 +24,15 @@ fn main(in: In) -> Out {
24
24
  out.position = vec4f(x, y, 0.0, 1.0);
25
25
  return out;
26
26
  }
27
- `.trim(),$=`
27
+ `.trim(),W=`
28
28
  struct Out { @builtin(position) position: vec4f }
29
29
  @group(0) @binding(0) var<uniform> iResolution: vec2f;
30
30
  @fragment
31
31
  fn main(out: Out) -> @location(0) vec4f {
32
32
  return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);
33
33
  }
34
- `;import{nested as B}from"reev";var K=(e,t,r,n=console.warn)=>{let o=e.createShader(r);if(!o)return n("Failed to create shader");if(e.shaderSource(o,t.trim()),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))return o;let i=e.getShaderInfoLog(o);e.deleteShader(o),n(`Could not compile shader: ${i}
34
+ `;import{nested as B}from"reev";var X=(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 i=e.getShaderInfoLog(o);e.deleteShader(o),n(`Could not compile shader: ${i}
35
35
 
36
36
  \u2193\u2193\u2193generated\u2193\u2193\u2193
37
- ${t}`)},X=(e,t,r,n)=>{let o=e.createProgram(),i=K(e,t,e.FRAGMENT_SHADER,n.error),a=K(e,r,e.VERTEX_SHADER,n.error);if(!i||!a)return;if(e.attachShader(o,i),e.attachShader(o,a),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;let s=e.getProgramInfoLog(o);e.deleteProgram(o),n.error(`Could not link program: ${s}`)},Y=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},V=(e,t,r,n)=>{t.set(n),e.bindBuffer(e.ARRAY_BUFFER,r),e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null)},j=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0)},Q=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0),e.vertexAttribDivisor(t,1)},N=(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,o=!1)=>{let i=e.createTexture();if(e.bindTexture(e.TEXTURE_2D,i),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),o||e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(r,n),e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,i),o)return()=>{e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,i),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)}},Z=(e,t,r,n,o,i,a,s)=>{let f=r*n,u=t.length/f;for(let d=0;d<f;d++)for(let x=0;x<Math.min(u,4);x++)s[4*d+x]=t[d*u+x]||0;e.activeTexture(e.TEXTURE0+a),e.bindTexture(e.TEXTURE_2D,o.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,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,i.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,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)},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,i)=>{e.activeTexture(e.TEXTURE0+o),e.bindTexture(e.TEXTURE_2D,t.texture),e.uniform1i(n,o),i===0&&e.bindFramebuffer(e.FRAMEBUFFER,r.buffer);let a=e.COLOR_ATTACHMENT0+i;return e.framebufferTexture2D(e.FRAMEBUFFER,a,e.TEXTURE_2D,r.texture,0),a},re=(e=1024)=>{if(T.num(e)){let o=Math.sqrt(e),i=Math.ceil(o);return Number.isInteger(o)||console.warn(`GLRE Storage Warning: particleCount (${e}) is not a square. Using ${i}x${i} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`),{x:i,y:i}}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 Te=(e,t)=>{if(!e.cs)return null;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=B(()=>r++),i=T.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),a=X(t,i,I,e),s=re(e.particleCount),f=B(b=>t.getUniformLocation(a,b)),u=B(b=>{let _=new Float32Array(s.x*s.y*4),U={texture:t.createTexture(),buffer:t.createFramebuffer()},m={texture:t.createTexture(),buffer:t.createFramebuffer()};return{ping:U,pong:m,array:_,loc:f(b),unit:o(b)}});return{render:()=>{t.useProgram(a);let b=u.map.values().map(({ping:_,pong:U,loc:m,unit:g},h)=>{let[R,v]=n%2?[_,U]:[U,_];return te(t,R,v,m,g,h)});t.drawBuffers(b),t.drawArrays(t.TRIANGLES,0,3),t.bindFramebuffer(t.FRAMEBUFFER,null),n++},clean:()=>{t.deleteProgram(a),ee(t,u.map.values())},_uniform:(b,_)=>{t.useProgram(a),N(t,f(b),_)},_storage:(b,_)=>{let{ping:U,pong:m,unit:g,array:h}=u(b);Z(t,_,s.x,s.y,U,m,g,h)},storages:u}},ne=async e=>{let t={isWebGL:!0,gl:e},r=e.webgl.context=e.el.getContext("webgl2"),n=Te(e,r),o=e.fs?T.str(e.fs)?e.fs:e.fs.fragment(t):q,i=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(t):I,a=e.webgl.program=X(r,o,i,e);r.useProgram(a);let s=0,f=B(()=>s++),u=e.webgl.uniforms=B(m=>r.getUniformLocation(a,m)),d=B((m,g,h=!1)=>{let R=M(g.length,h?e.instanceCount:e.count,e.error),v=r.getAttribLocation(a,m),{array:P,buffer:z}=Y(r,g);return{array:P,buffer:z,location:v,stride:R}}),x=(m="",g)=>{let{array:h,buffer:R,location:v,stride:P}=d(m,g);V(r,h,R,g),j(r,v,P,R)},y=(m,g)=>{let{array:h,buffer:R,location:v,stride:P}=d(m,g,!0);V(r,h,R,g),Q(r,v,P,R)},L=(m,g)=>{r.useProgram(a),N(r,u(m),g),n?._uniform(m,g)},b=(m,g)=>{e.loading++,r.useProgram(a),D(g,(h,R)=>{let v=f(m),P=J(r,h,u(m),v,R);P&&e({loop:P}),e.loading--})},_=()=>{n?.clean(),r.deleteProgram(a),r.getExtension("WEBGL_lose_context")?.loseContext()},U=()=>{n?.render(),r.useProgram(a),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)};if(e.isDepth&&(r.enable(r.DEPTH_TEST),r.depthFunc(r.LEQUAL),r.enable(r.CULL_FACE),r.cullFace(r.BACK)),e.wireframe){let m=r.getExtension("WEBGL_polygon_mode");m.polygonModeWEBGL(r.FRONT_AND_BACK,m.LINE_WEBGL)}return{render:U,clean:_,_attribute:x,_instance:y,_uniform:L,_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(),i=await(await r.requestAdapter()).requestDevice();return i.onuncapturederror=a=>t(a.error.message),e.configure({device:i,format:n,alphaMode:"opaque"}),{device:i,format:n}},ie=()=>{let e=0,t=0,r=0,n=0;return{uniform:()=>{let o=Math.floor(e/12),i=e%12;return e++,{group:o,binding:i}},texture:()=>{let i=Math.floor(e/12)+1+Math.floor(t/6),a=t%6*2;return t++,{group:i,binding:a}},storage:()=>{let i=Math.floor(e/12)+Math.floor(t/6)+2+Math.floor(r/12),a=r%12;return r++,{group:i,binding:a}},attrib:()=>{let o=n;return n++,{location:o}}}},Ge=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",ae=e=>{let t=[],r=[];for(let{buffer:n,location:o,stride:i,isInstance:a}of e){t[o]=n;let s=Math.min(Math.max(Math.floor(i),1),4),f=Math.max(4,Math.ceil(s*4/4)*4);r[o]={arrayStride:f,stepMode:a?"instance":"vertex",attributes:[{shaderLocation:o,offset:0,format:Ge(s)}]}}return{vertexBuffers:t,bufferLayouts:r}},se=(e,t,r,n=[])=>{let o=new Map,i={bindGroups:[],bindGroupLayouts:[]},a=(s,f,u)=>{o.has(s)||o.set(s,{layouts:[],bindings:[]});let{layouts:d,bindings:x}=o.get(s);d.push(f),x.push(u)};for(let{binding:s,buffer:f,group:u}of t)a(u,{binding:s,visibility:7,buffer:{type:"uniform"}},{binding:s,resource:{buffer:f}});for(let{binding:s,buffer:f,group:u}of n)a(u,{binding:s,visibility:6,buffer:{type:"storage"}},{binding:s,resource:{buffer:f}});for(let{binding:s,group:f,sampler:u,view:d}of r)a(f,{binding:s,visibility:2,sampler:{}},{binding:s,resource:u}),a(f,{binding:s+1,visibility:2,texture:{}},{binding:s+1,resource:d});for(let[s,{layouts:f,bindings:u}]of o)i.bindGroupLayouts[s]=e.createBindGroupLayout({entries:f}),i.bindGroups[s]=e.createBindGroup({layout:i.bindGroupLayouts[s],entries:u});return i},ue=(e,t,r,n,o,i)=>e.createRenderPipeline({vertex:{module:e.createShaderModule({label:"vert",code:o.trim()}),entryPoint:"main",buffers:r},fragment:{module:e.createShaderModule({label:"frag",code:i.trim()}),entryPoint:"main",targets:[{format:t}]},layout:e.createPipelineLayout({bindGroupLayouts:n}),primitive:{topology:"triangle-list"},depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}}),fe=(e,t,r)=>e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})}),ye=e=>e==="uniform"?72:e==="attrib"?40:140,C=(e,t,r)=>{k(t)||(t=new Float32Array(t));let n=ye(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,i=e.createBuffer({size:o,usage:n});return{array:t,buffer:i}},me=(e,t)=>({colorAttachments:[{view:e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:t.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),ce=(e,t=1280,r=800)=>{let n=e.createTexture({size:[t,r],format:"rgba8unorm",usage:22}),o=e.createSampler({magFilter:"linear",minFilter:"linear"});return{texture:n,sampler:o}},pe=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT}),de=(e,t=32)=>{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 Le=(e,t,r)=>{let n=u=>{},o=W((u,d)=>{let{array:x,buffer:y}=C(t,d,"storage"),{binding:L,group:b}=r.storage();return{array:x,buffer:y,binding:L,group:b}});return{storages:o,_storage:(u,d)=>{let{array:x,buffer:y}=o(u,d);t.queue.writeBuffer(y,0,x)},update:(u,d,x)=>{let y=fe(t,d,x);n=L=>{L.setPipeline(y),u.forEach((m,g)=>L.setBindGroup(g,m));let{x:b,y:_,z:U}=de(e.particleCount);L.dispatchWorkgroups(b,_,U),L.end()}},render:u=>{n(u)},clean:()=>{for(let{buffer:u}of o.map.values())u.destroy()}}},le=async e=>{let t=e.el.getContext("webgpu"),{device:r,format:n}=await oe(t,e.error),o=ie(),i=Le(e,r,o),a,s,f,u=c=>{},d=!0,x,y=W((c,p,l=!1)=>{d=!0;let E=M(p.length,l?e.instanceCount:e.count),{location:A}=o.attrib(),{array:G,buffer:w}=C(r,p,"attrib");return{array:G,buffer:w,location:A,stride:E,isInstance:l}}),L=W((c,p)=>{d=!0;let{binding:l,group:E}=o.uniform(),{array:A,buffer:G}=C(r,p,"uniform");return{array:A,buffer:G,binding:l,group:E}}),b=W((c,p=0,l=0)=>{d=!0;let{binding:E,group:A}=o.texture(),{texture:G,sampler:w}=ce(r,p,l);return{texture:G,sampler:w,binding:E,group:A,view:G.createView()}}),_=(c="",p)=>{let{array:l,buffer:E}=y(c,p);l.set(p),r.queue.writeBuffer(E,0,l)},U=(c,p)=>{let{array:l,buffer:E}=y(c,p,!0);l.set(p),r.queue.writeBuffer(E,0,l)},m=(c,p)=>{T.num(p)&&(p=[p]);let{array:l,buffer:E}=L(c,p);l.set(p),r.queue.writeBuffer(E,0,l)},g=(c,p)=>{e.loading++,D(p,(l,E)=>{let[A,G]=E?[l.videoWidth,l.videoHeight]:[l.width,l.height],{texture:w}=b(c,A,G),S=()=>{r.queue.copyExternalImageToTexture({source:l},{texture:w},{width:A,height:G})};S(),E&&e({loop:S}),e.loading--})},h=()=>{let{vertexBuffers:c,bufferLayouts:p}=ae(y.map.values()),{bindGroups:l,bindGroupLayouts:E}=se(r,L.map.values(),b.map.values(),i.storages.map.values()),A=ue(r,n,p,E,f,a);u=G=>{G.setPipeline(A),l.forEach((w,S)=>G.setBindGroup(S,w)),c.forEach((w,S)=>G.setVertexBuffer(S,w)),G.draw(e.count,e.instanceCount,0,0),G.end()},e.cs&&i.update(l,E,s)},R=()=>{if(!a||!f){let p={isWebGL:!1,gl:e};a=e.fs?T.str(e.fs)?e.fs:e.fs.fragment(p):$,f=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(p):H,s=e.cs?T.str(e.cs)?e.cs:e.cs.compute(p):""}if(e.loading)return;d&&h(),d=!1;let c=r.createCommandEncoder();e.cs&&i.render(c.beginComputePass()),u(c.beginRenderPass(me(t,x))),r.queue.submit([c.finish()])},v=()=>{let c=e.el;x?.destroy(),x=pe(r,c.width,c.height)},P=()=>{r.destroy(),x?.destroy();for(let{texture:c}of b.map.values())c.destroy();for(let{buffer:c}of L.map.values())c.destroy();for(let{buffer:c}of y.map.values())c.destroy();i.clean()};return v(),{webgpu:{device:r,uniforms:L,textures:b,attribs:y,storages:i.storages},render:R,resize:v,clean:P,_attribute:_,_instance:U,_uniform:m,_texture:g,_storage:i._storage}};var $e=e=>T.obj(e)?"isGL"in e:!1,Ue=()=>typeof window>"u",ve=()=>Ue()?!1:"gpu"in navigator,O=performance.now(),Pe=e=>{let t=_e({isNative:!1,isWebGL:!0,isError:!1,isLoop:!0,isDebug:!1,isDepth:!1,wireframe:!1,isGL:!0,size:[0,0],mouse:[0,0],count:6,instanceCount:1,particleCount:1024,precision:"highp",webgl:{},webgpu:{},loading:0,error(){t.isError=!0,t.isLoop=!1,t.clean(),console.warn("GLRE Error:",...arguments)}});return t.queue=Re(),t.frame=he(),t.attribute=F((r,n,o)=>t.queue(()=>t._attribute?.(r,n,o)),t),t.instance=F((r,n,o)=>t.queue(()=>t._instance?.(r,n,o)),t),t.storage=F((r,n)=>t.queue(()=>t._storage?.(r,n)),t),t.uniform=F((r,n)=>t.queue(()=>t._uniform?.(r,n)),t),t.texture=F((r,n)=>t.queue(()=>t._texture?.(r,n)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:O}),t("mount",async()=>{ve()||(t.isWebGL=!0),t.vs=t.vs||t.vert||t.vertex,t.fs=t.fs||t.frag||t.fragment,t.cs=t.cs||t.comp||t.compute,t.isWebGL?t(await ne(t)):t(await le(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[i,a]=t.size,{top:s,left:f}=t.el.getBoundingClientRect();t.mouse[0]=(n-s-i/2)/(i/2),t.mouse[1]=-(o-f-a/2)/(a/2),t.uniform("iMouse",t.mouse)}),t("loop",()=>{O=performance.now()/1e3,t.uniform("iTime",O)}),t(e)},Ke=Pe;export{Pe as createGL,Ke as default,$e as isGL,Ue as isServer,ve as isWebGPUSupported};
37
+ ${t}`)},v=(e,t,r,n)=>{let o=e.createProgram(),i=X(e,t,e.FRAGMENT_SHADER,n.error),u=X(e,r,e.VERTEX_SHADER,n.error);if(!i||!u)return;if(e.attachShader(o,i),e.attachShader(o,u),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;let s=e.getProgramInfoLog(o);e.deleteProgram(o),n.error(`Could not link program: ${s}`)},V=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},U=(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)},N=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0)},O=(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)},_=(e,t,r)=>{if(b.nul(t))return;if(b.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)},A=(e,t,r,n,o=!1)=>{let i=e.createTexture();if(e.bindTexture(e.TEXTURE_2D,i),t?(e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),o||e.generateMipmap(e.TEXTURE_2D)):e.texImage2D(e.TEXTURE_2D,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,new Uint8Array([0,0,0,0])),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,i),o)return()=>{e.activeTexture(e.TEXTURE0+n),e.bindTexture(e.TEXTURE_2D,i),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)}},z=(e,t,r,n,o,i,u,s)=>{let p=r*n,d=t.length/p;for(let m=0;m<p;m++)for(let a=0;a<Math.min(d,4);a++)s[4*m+a]=t[m*d+a]||0;e.activeTexture(e.TEXTURE0+u),e.bindTexture(e.TEXTURE_2D,o.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,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,i.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,r,n,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)},H=(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)},k=(e,t,r,n,o,i)=>{e.activeTexture(e.TEXTURE0+o),e.bindTexture(e.TEXTURE_2D,t.texture),e.uniform1i(n,o),i===0&&e.bindFramebuffer(e.FRAMEBUFFER,r.buffer);let u=e.COLOR_ATTACHMENT0+i;return e.framebufferTexture2D(e.FRAMEBUFFER,u,e.TEXTURE_2D,r.texture,0),u},$=(e=1024)=>{if(b.num(e)){let o=Math.sqrt(e),i=Math.ceil(o);return Number.isInteger(o)||console.warn(`GLRE Storage Warning: particleCount (${e}) is not a square. Using ${i}x${i} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`),{x:i,y:i}}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}},q=e=>{let t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()},K=e=>{e.enable(e.DEPTH_TEST),e.depthFunc(e.LEQUAL),e.enable(e.CULL_FACE),e.cullFace(e.BACK)},Y=e=>{let t=e.getExtension("WEBGL_polygon_mode");t&&t.polygonModeWEBGL(e.FRONT_AND_BACK,t.LINE_WEBGL)};var j=e=>{if(!e.cs)return;let t=e.gl;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=B(()=>r++),i=b.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),u=v(t,i,R,e),s=$(e.particleCount),p=B(m=>t.getUniformLocation(u,m)),d=B(m=>{let a=new Float32Array(s.x*s.y*4),f={texture:t.createTexture(),buffer:t.createFramebuffer()},c={texture:t.createTexture(),buffer:t.createFramebuffer()};return{ping:f,pong:c,array:a,loc:p(m),unit:o(m)}});e("_uniform",(m,a)=>{t.useProgram(e.program=u),_(t,p(m),a)}),e("_storage",(m,a)=>{t.useProgram(e.program=u);let{ping:f,pong:c,unit:l,array:x}=d(m);z(t,a,s.x,s.y,f,c,l,x)}),e("clean",()=>{t.deleteProgram(u),H(t,d.map.values())}),e("render",()=>{t.useProgram(e.program=u);let m=d.map.values().map(({ping:a,pong:f,loc:c,unit:l},x)=>{let[T,g]=n%2?[a,f]:[f,a];return k(t,T,g,c,l,x)});t.drawBuffers(m),t.drawArrays(t.TRIANGLES,0,3),t.bindFramebuffer(t.FRAMEBUFFER,null),n++})};import{nested as S}from"reev";var Q=e=>{let t={isWebGL:!0,gl:e},r=e.gl,n=e.fs?b.str(e.fs)?e.fs:e.fs.fragment(t):M,o=e.vs?b.str(e.vs)?e.vs:e.vs.vertex(t):R,i=v(r,n,o,e),u=0,s=S(()=>u++),p=S(m=>r.getUniformLocation(i,m)),d=S((m,a,f=!1)=>({stride:h(a.length,f?e.instanceCount:e.triangleCount,e.error),location:r.getAttribLocation(i,m),...V(r,a)}));e("_attribute",(m,a)=>{r.useProgram(e.program=i);let f=d(m,a);U(r,f.array,f.buffer,a),N(r,f.location,f.stride,f.buffer)}),e("_instance",(m,a)=>{r.useProgram(e.program=i);let f=d(m,a,!0);U(r,f.array,f.buffer,a),O(r,f.location,f.stride,f.buffer)}),e("_uniform",(m,a)=>{r.useProgram(e.program=i),_(r,p(m),a)}),e("_texture",(m,a)=>{r.useProgram(e.program=i);let f=p(m),c=s(m);A(r,null,f,c,!1),L(a,(l,x)=>{r.useProgram(e.program=i);let T=A(r,l,f,c,x);T&&e({render:T})})}),e("clean",()=>{r.deleteProgram(i)}),e("render",()=>{r.useProgram(e.program=i),e.instanceCount>1?r.drawArraysInstanced(r.TRIANGLES,0,e.triangleCount,e.instanceCount):r.drawArrays(r.TRIANGLES,0,e.triangleCount),r.bindFramebuffer(r.FRAMEBUFFER,null)})};var J=e=>{let t=!e.gl;if(t){let r=e.gl=e.el.getContext("webgl2");e("render",()=>r.viewport(0,0,...e.size))}j(e),Q(e),t&&(e("clean",()=>q(e.gl)),e.isDepth&&K(e.gl),e.wireframe&&Y(e.gl))};import{nested as ge}from"reev";import{nested as P}from"reev";var Z=()=>{let e=0,t=0,r=0,n=0,o=P(()=>{let p=Math.floor(e/12),d=e%12;return e++,{group:p,binding:d}}),i=P(()=>{let d=Math.floor(e/12)+1+Math.floor(t/6),m=t%6*2;return t++,{group:d,binding:m}}),u=P(()=>{let d=Math.floor(e/12)+Math.floor(t/6)+2+Math.floor(r/12),m=r%12;return r++,{group:d,binding:m}}),s=P(()=>{let p=n;return n++,{location:p}});return{uniform:o,texture:i,storage:u,attrib:s}},ee=async(e,t=console.log,r)=>{let n=navigator.gpu,o=n.getPreferredCanvasFormat(),i=await n.requestAdapter();if(r?.aborted)throw new DOMException("Aborted","AbortError");let u=await i.requestDevice();if(r?.aborted&&(u.destroy(),r?.aborted))throw new DOMException("Aborted","AbortError");return u.onuncapturederror=s=>t(s.error.message),e.configure({device:u,format:o,alphaMode:"premultiplied"}),{device:u,format:o}},ce=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",be=e=>{let t=[],r=[];for(let{buffer:n,location:o,stride:i,isInstance:u}of e){t[o]=n;let s=Math.min(Math.max(Math.floor(i),1),4),p=Math.max(4,Math.ceil(s*4/4)*4);r[o]={arrayStride:p,stepMode:u?"instance":"vertex",attributes:[{shaderLocation:o,offset:0,format:ce(s)}]}}return{vertexBuffers:t,bufferLayouts:r}},le=(e,t,r,n=[])=>{let o=new Map,i={bindGroups:[],bindGroupLayouts:[]},u=(s,p,d)=>{o.has(s)||o.set(s,{layouts:[],bindings:[]});let{layouts:m,bindings:a}=o.get(s);m.push(p),a.push(d)};for(let{binding:s,buffer:p,group:d}of t)u(d,{binding:s,visibility:7,buffer:{type:"uniform"}},{binding:s,resource:{buffer:p}});for(let{binding:s,buffer:p,group:d}of n)u(d,{binding:s,visibility:6,buffer:{type:"storage"}},{binding:s,resource:{buffer:p}});for(let{binding:s,group:p,sampler:d,view:m}of r)u(p,{binding:s,visibility:2,sampler:{}},{binding:s,resource:d}),u(p,{binding:s+1,visibility:2,texture:{}},{binding:s+1,resource:m});for(let[s,{layouts:p,bindings:d}]of o)i.bindGroupLayouts[s]=e.createBindGroupLayout({entries:p}),i.bindGroups[s]=e.createBindGroup({layout:i.bindGroupLayouts[s],entries:d});return i},xe=(e,t,r,n,o,i)=>e.createRenderPipeline({vertex:{module:e.createShaderModule({label:"vert",code:o.trim()}),entryPoint:"main",buffers:r},fragment:{module:e.createShaderModule({label:"frag",code:i.trim()}),entryPoint:"main",targets:[{format:t}]},layout:e.createPipelineLayout({bindGroupLayouts:n}),primitive:{topology:"triangle-list"},depthStencil:{depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}}),Te=(e,t,r)=>{if(r)return e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})})},te=(e,t,r,n,o,i,u,s,p)=>{let{vertexBuffers:d,bufferLayouts:m}=be(r),{bindGroups:a,bindGroupLayouts:f}=le(e,n,o,i),c=Te(e,f,s),l=xe(e,t,m,f,p,u);return{bindGroups:a,vertexBuffers:d,computePipeline:c,graphicPipeline:l}},Ee=e=>e==="uniform"?72:e==="attrib"?40:140,G=(e,t,r)=>{C(t)||(t=new Float32Array(t));let n=Ee(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,i=e.createBuffer({size:o,usage:n});return{array:t,buffer:i}},E=(e,t,r,n)=>{r.set(t),e.queue.writeBuffer(n,0,r)},re=(e,t)=>({colorAttachments:[{view:e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:t.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),F=(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,view:n.createView()}},ne=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:16}),oe=(e,t=32)=>{b.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 ie=(e,t)=>{let r,n,o=ge((u,s)=>({...t.storage(u),...G(e.device,s,"storage")}));return e("_storage",(u,s)=>{let{array:p,buffer:d}=o(u,s);E(e.device,s,p,d)}),e("render",()=>{if(!r||!n)return;let u=e.encoder.beginComputePass();u.setPipeline(r),n.forEach((m,a)=>u.setBindGroup(a,m));let{x:s,y:p,z:d}=oe(e.particleCount);u.dispatchWorkgroups(s,p,d),u.end()}),e("clean",()=>{for(let{buffer:u}of o.map.values())u.destroy()}),{storages:o,set:(u,s)=>{r=u,n=s}}};import{nested as D}from"reev";var ae=(e,t,r=()=>{})=>{let n,o,i,u,s=D((a,f,c=!1,l=h(f.length,c?e.instanceCount:e.triangleCount))=>(r(),{...t.attrib(a),...G(e.device,f,"attrib"),isInstance:c,stride:l})),p=D((a,f)=>(r(),{...t.uniform(a),...G(e.device,f,"uniform")})),d=D((a,f=1,c=1)=>(r(),{...t.texture(a),...F(e.device,f,c)}));return e("_attribute",(a,f)=>{let c=s(a,f);E(e.device,f,c.array,c.buffer)}),e("_instance",(a,f)=>{let c=s(a,f,!0);E(e.device,f,c.array,c.buffer)}),e("_uniform",(a,f)=>{b.num(f)&&(f=[f]);let c=p(a,f);E(e.device,f,c.array,c.buffer)}),e("_texture",(a,f)=>{let c=d(a);L(f,(l,x)=>{let[T,g]=x?[l.videoWidth,l.videoHeight]:[l.width,l.height];(c.texture.width!==T||c.texture.height!==g)&&(c.texture.destroy(),Object.assign(c,F(e.device,T,g)),r());let w=()=>void e.device.queue.copyExternalImageToTexture({source:l},{texture:c.texture},{width:T,height:g});x?e({render:w}):w()})}),e("render",()=>{if(!n||!o||!i)return;let a=e.encoder.beginRenderPass(re(e.gpu,u));a.setPipeline(n),o.forEach((f,c)=>a.setBindGroup(c,f)),i.forEach((f,c)=>a.setVertexBuffer(c,f)),a.draw(e.triangleCount,e.instanceCount,0,0),a.end()}),e("resize",()=>{let a=e.el;u?.destroy(),u=ne(e.device,a.width,a.height)}),e("clean",()=>{u?.destroy();for(let{buffer:a}of s.map.values())a.destroy();for(let{texture:a}of d.map.values())a.destroy();for(let{buffer:a}of p.map.values())a.destroy()}),{uniforms:p,textures:d,attributes:s,set:(a,f,c)=>{n=a,o=f,i=c}}};var se=async e=>{let t=!1;if(!e.gl){let s=e.el.getContext("webgpu"),{device:p,format:d}=await ee(s,e.error);e({device:p,format:d,gpu:s})}e("render",()=>{t&&u(),e.encoder=e.device.createCommandEncoder()});let n=Z(),o=ie(e,n),i=ae(e,n,()=>t=!0),u=()=>{t=!1;let s={isWebGL:!1,gl:e,binding:n},p=e.fs?b.str(e.fs)?e.fs:e.fs.fragment(s):W,d=e.vs?b.str(e.vs)?e.vs:e.vs.vertex(s):I,m=e.cs?b.str(e.cs)?e.cs:e.cs.compute(s):"",a=te(e.device,e.format,i.attributes.map.values(),i.uniforms.map.values(),i.textures.map.values(),o.storages.map.values(),p,m,d);o.set(a.computePipeline,a.bindGroups),i.set(a.graphicPipeline,a.bindGroups,a.vertexBuffers)};e("render",()=>{e.encoder&&e.device.queue.submit([e.encoder.finish()])}),e("clean",()=>{e.device.destroy()})};var he=()=>typeof window>"u",Re=()=>he()?!1:"gpu"in navigator,ue=e=>e.el||e.elem||e.element,ve=(...e)=>{let t=Ge({isNative:!1,isWebGL:!0,isError:!1,isLoop:!0,isDebug:!1,isDepth:!1,wireframe:!1,size:[0,0],mouse:[0,0],precision:"highp",error(){t.isError=!0,t.isLoop=!1,t.clean(),console.warn("GLRE Error:",...arguments)}}),r=performance.now();return t.queue=Le(),t.frame=ye(),t.attribute=y((n,o,i)=>t.queue(()=>t._attribute?.(n,o,i)),t),t.instance=y((n,o,i)=>t.queue(()=>t._instance?.(n,o,i)),t),t.storage=y((n,o)=>t.queue(()=>t._storage?.(n,o)),t),t.texture=y((n,o)=>t.queue(()=>t._texture?.(n,o)),t),t.uniform=y((n,o)=>t.queue(()=>t._uniform?.(n,o)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:r}),t("mount",async n=>{t.el=ue(t)||n||e.map(ue).find(Boolean);let o=!t.el;o&&!t.isNative&&(t.el=document.createElement("canvas"));for(let i of e)t.fs=i.fs||i.frag||i.fragment||void 0,t.cs=i.cs||i.comp||i.compute||void 0,t.vs=i.vs||i.vert||i.vertex||void 0,t.triangleCount=i.triangleCount||i.count||6,t.instanceCount=i.instanceCount||1,t.particleCount=i.particleCount||1024,t(i),b.bol(i.isWebGL)&&(t.isWebGL=i.isWebGL||!Re()),t.isWebGL?J(t):await se(t),i.mount&&i.mount();!t.el||t.isError||(t.resize(),t.frame(()=>(t.render(),t.isLoop)),!t.isNative&&(o&&document.body.appendChild(t.el),window.addEventListener("resize",t.resize),t.el.addEventListener("mousemove",t.mousemove)))}),t("clean",()=>{t.frame.stop(),!(!t.el||t.isNative)&&(window.removeEventListener("resize",t.resize),t.el.removeEventListener("mousemove",t.mousemove))}),t("ref",n=>{n?(t.el=n,t.mount()):t.clean()}),t("resize",()=>{let n=t.el.parentElement?.getBoundingClientRect();t.size[0]=t.el.width=t.width||n?.width||window.innerWidth,t.size[1]=t.el.height=t.height||n?.height||window.innerHeight,t.uniform("iResolution",t.size)}),t("mousemove",(n,o=n.clientX,i=n.clientY)=>{let u=t.el.getBoundingClientRect();t.mouse[0]=(o-u.left)/u.width,t.mouse[1]=-(i-u.top)/u.height+1,t.uniform("iMouse",t.mouse)}),t("render",()=>{r=performance.now()/1e3,t.uniform("iTime",r),t.queue.flush()}),t},st=ve;export{ve as createGL,st as default,he as isServer,Re as isWebGPUSupported};
38
38
  //# 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 isDebug: false,\n isDepth: false,\n wireframe: false,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n instanceCount: 1,\n particleCount: 1024,\n precision: 'highp',\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","export 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\nconst loadingImage = (src: string, fun: (source: HTMLImageElement) => void) => {\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => fun(source))\n}\n\nconst loadingVideo = (src: string, fun: (source: HTMLVideoElement) => void) => {\n const source = document.createElement('video')\n source.crossOrigin = 'anonymous'\n source.muted = true\n source.loop = true\n source.src = src\n source.load()\n source.play()\n source.addEventListener('canplay', fun.bind(null, source), { once: true })\n}\n\nexport function loadingTexture(src: string, fun: (source: HTMLVideoElement, isVideo: true) => void): void\n\nexport function loadingTexture(src: string, fun: (source: HTMLImageElement, isVideo: false) => void): void\n\nexport function loadingTexture(src: string | HTMLImageElement | HTMLVideoElement, fun: Function) {\n if (!is.str(src)) return fun(src, src instanceof HTMLVideoElement)\n const isVideo = /\\.(mp4|webm|ogg|avi|mov)$/i.test(src)\n const loader = isVideo ? loadingVideo : loadingImage\n loader(src, (el: HTMLImageElement | HTMLVideoElement) => {\n fun(el as HTMLVideoElement, isVideo)\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 highp float;\nprecision highp int;\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, getStride, GLSL_VS, GLSL_FS, loadingTexture } from './helpers'\nimport { createArrayBuffer, cleanStorage, createAttachment, createProgram, createStorage, createTexture, setArrayBuffer, storageSize, updateAttrib, updateInstance, updateUniform } from './program'\nimport type { GL } 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.webgl.context = 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 = (gl.webgl.program = 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 = (gl.webgl.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 gl.loading++\n c.useProgram(pg)\n loadingTexture(src, (source, isVideo) => {\n const unit = units(key)\n const loop = createTexture(c, source, uniforms(key)!, unit, isVideo)\n if (loop) gl({ loop })\n gl.loading--\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.enable(c.DEPTH_TEST)\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n c.cullFace(c.BACK)\n }\n\n if (gl.wireframe) {\n const ext = c.getExtension('WEBGL_polygon_mode')\n ext.polygonModeWEBGL(c.FRONT_AND_BACK, ext.LINE_WEBGL)\n }\n\n return { 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 = (c: WebGL2RenderingContext, array: Float32Array, buffer: WebGLBuffer, value: number[]) => {\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 = (c: WebGL2RenderingContext, el: HTMLImageElement | HTMLVideoElement, loc: WebGLUniformLocation, unit: number, isVideo = false) => {\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, el)\n if (!isVideo) 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 if (isVideo)\n return () => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el)\n }\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (c: WebGL2RenderingContext, value: number[], width: number, height: number, ping: TextureBuffer, pong: TextureBuffer, unit: number, array: Float32Array) => {\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 = (c: WebGL2RenderingContext, map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>) => {\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 = (c: WebGL2RenderingContext, i: TextureBuffer, o: TextureBuffer, loc: WebGLUniformLocation, unit: number, index: number) => {\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)) console.warn(`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 return { x: size, y: size }\n }\n const [x, y, z] = particleCount\n if (z !== undefined) {\n const yz = y * z\n console.warn(`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 return { x, y: yz }\n }\n return { x, y }\n}\n","import { nested as cached } from 'reev'\nimport { is, getStride, WGSL_FS, WGSL_VS, loadingTexture } 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 gl.loading++\n loadingTexture(src, (source, isVideo) => {\n const [width, height] = isVideo\n ? [source.videoWidth, source.videoHeight]\n : [source.width, source.height]\n const { texture } = textures(key, width, height)\n const loop = () => {\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\n }\n loop()\n if (isVideo) gl({ loop })\n gl.loading--\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","src","fun","source","loadingVideo","loadingTexture","is","isVideo","el","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","el","unit","isVideo","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","loadingTexture","source","isVideo","loop","createTexture","clean","render","ext","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","i","layout","layouts","bindings","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","loadingTexture","source","isVideo","loop","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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/helpers.ts","../src/webgl/compute.ts","../src/webgl/utils.ts","../src/webgl/graphic.ts","../src/webgl/index.ts","../src/webgpu/compute.ts","../src/webgpu/utils.ts","../src/webgpu/graphic.ts","../src/webgpu/index.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './helpers'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\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\nconst findElement = (arg: Partial<GL>) => {\n return arg.el || arg.elem || arg.element\n}\n\nexport const createGL = (...args: 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 wireframe: false,\n size: [0, 0],\n mouse: [0, 0],\n precision: 'highp',\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 let iTime = performance.now()\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.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async (el: HTMLCanvasElement) => {\n gl.el = findElement(gl) || el || args.map(findElement).find(Boolean)\n const isAppend = !gl.el // Check first: canvas may unmount during WebGPU async processing\n if (isAppend && !gl.isNative) gl.el = document.createElement('canvas')\n for (const arg of args) {\n gl.fs = arg.fs || arg.frag || arg.fragment || undefined\n gl.cs = arg.cs || arg.comp || arg.compute || undefined\n gl.vs = arg.vs || arg.vert || arg.vertex || undefined\n gl.triangleCount = arg.triangleCount || arg.count || 6\n gl.instanceCount = arg.instanceCount || 1\n gl.particleCount = arg.particleCount || 1024\n gl(arg)\n if (is.bol(arg.isWebGL)) gl.isWebGL = arg.isWebGL || !isWebGPUSupported()\n if (gl.isWebGL) webgl(gl)\n else await webgpu(gl)\n if (arg.mount) arg.mount() // events added in mount phase need explicit call to execute\n }\n if (!gl.el || gl.isError) return // stop if error or canvas was unmounted during async\n gl.resize()\n gl.frame(() => {\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\n if (isAppend) document.body.appendChild(gl.el)\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.el || gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('ref', (el: HTMLCanvasElement | null) => {\n if (el) {\n gl.el = el\n gl.mount()\n } else gl.clean()\n })\n\n gl('resize', () => {\n const rect = gl.el.parentElement?.getBoundingClientRect()\n gl.size[0] = gl.el.width = gl.width || rect?.width || window.innerWidth\n gl.size[1] = gl.el.height = gl.height || rect?.height || window.innerHeight\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const rect = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - rect.left) / rect.width\n gl.mouse[1] = -(y - rect.top) / rect.height + 1\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('render', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n gl.queue.flush()\n })\n\n return gl\n}\n\nexport default createGL\n","export 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\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nconst loadingImage = (src: string, fun: (el: HTMLImageElement) => void) => {\n const el = new Image()\n Object.assign(el, { src, crossOrigin: 'anonymous' })\n el.decode().then(() => fun(el))\n}\n\nconst loadingVideo = (src: string, fun: (source: HTMLVideoElement) => void) => {\n const el = document.createElement('video')\n Object.assign(el, { src, loop: true, muted: true, crossOrigin: 'anonymous' })\n el.load()\n el.play()\n el.addEventListener('canplay', fun.bind(null, el), { once: true })\n}\n\nexport function loadingTexture(src: string, fun: (source: HTMLVideoElement, isVideo: true) => void): void\n\nexport function loadingTexture(src: string, fun: (source: HTMLImageElement, isVideo: false) => void): void\n\nexport function loadingTexture(src: string | HTMLImageElement | HTMLVideoElement, fun: Function) {\n if (!is.str(src)) return fun(src, src instanceof HTMLVideoElement)\n const isVideo = /\\.(mp4|webm|ogg|avi|mov)$/i.test(src)\n const loader = isVideo ? loadingVideo : loadingImage\n loader(src, (el: HTMLImageElement | HTMLVideoElement) => {\n fun(el as HTMLVideoElement, isVideo)\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)) error(`glre attribute error: Invalid attribute length ${arrayLength}. Must divide by vertex count (${count}) with valid stride (1,2,3,4,9,16)`)\n return ret\n}\n\nexport const GLSL_FS = /* cpp */ `\n#version 300 es\nprecision highp float;\nprecision highp int;\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 } from 'reev'\nimport { cleanStorage, createAttachment, createProgram, createStorage, storageSize, updateUniform } from './utils'\nimport { GLSL_VS, is } from '../helpers'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL) => {\n if (!gl.cs) return\n const c = gl.gl\n c.getExtension('EXT_color_buffer_float') // Enable high precision GPGPU by writing to float textures\n\n let _texture = 0 // for texture active units\n let _storage = 0 // for storage current num\n\n const units = nested(() => _texture++)\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 = nested((key) => c.getUniformLocation(pg, key)!)\n const storages = nested((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 gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_storage', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size.x, size.y, ping, pong, unit, array)\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = _storage % 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 _storage++\n })\n}\n\nexport type WebGLCompute = ReturnType<typeof compute>\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 createBuffer = (c: WebGL2RenderingContext, data: number[]) => {\n const array = new Float32Array(data)\n const buffer = c.createBuffer()\n return { array, buffer }\n}\n\nexport const updateBuffer = (c: WebGL2RenderingContext, array: Float32Array, buffer: WebGLBuffer, value: number[]) => {\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 | null, value: number | number[]) => {\n if (is.nul(loc)) return\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 = (c: WebGL2RenderingContext, el: HTMLImageElement | HTMLVideoElement | null, loc: WebGLUniformLocation | null, unit: number, isVideo = false) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n if (el) {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el)\n if (!isVideo) c.generateMipmap(c.TEXTURE_2D)\n } else {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, 1, 1, 0, c.RGBA, c.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]))\n }\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 if (isVideo)\n return () => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el!)\n }\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (c: WebGL2RenderingContext, value: number[], width: number, height: number, ping: TextureBuffer, pong: TextureBuffer, unit: number, array: Float32Array) => {\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 = (c: WebGL2RenderingContext, map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>) => {\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 = (c: WebGL2RenderingContext, i: TextureBuffer, o: TextureBuffer, loc: WebGLUniformLocation, unit: number, index: number) => {\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)) console.warn(`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 return { x: size, y: size }\n }\n const [x, y, z] = particleCount\n if (z !== undefined) {\n const yz = y * z\n console.warn(`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 return { x, y: yz }\n }\n return { x, y }\n}\n\nexport const loseContext = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_lose_context')\n if (ext) ext.loseContext()\n}\n\nexport const enableDepth = (c: WebGL2RenderingContext) => {\n c.enable(c.DEPTH_TEST)\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n c.cullFace(c.BACK)\n}\n\nexport const enableWireframe = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_polygon_mode')\n if (ext) ext.polygonModeWEBGL(c.FRONT_AND_BACK, ext.LINE_WEBGL)\n}\n","import { nested } from 'reev'\nimport { getStride, GLSL_FS, GLSL_VS, is, loadingTexture } from '../helpers'\nimport { createBuffer, createProgram, createTexture, updateAttrib, updateBuffer, updateInstance, updateUniform } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL) => {\n const config = { isWebGL: true, gl }\n const c = gl.gl\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 let activeUnit = 0\n\n const units = nested(() => activeUnit++)\n const uniforms = nested((key) => c.getUniformLocation(pg, key))\n const attributes = nested((key, value: number[], isInstance = false) => {\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.triangleCount, gl.error)\n return { stride, location: c.getAttribLocation(pg, key), ...createBuffer(c, value) }\n })\n\n gl('_attribute', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value)\n updateBuffer(c, a.array, a.buffer, value)\n updateAttrib(c, a.location, a.stride, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value, true)\n updateBuffer(c, a.array, a.buffer, value)\n updateInstance(c, a.location, a.stride, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_texture', (key: string, src: string) => {\n c.useProgram((gl.program = pg))\n const location = uniforms(key)\n const unit = units(key)\n createTexture(c, null, location, unit, false)\n loadingTexture(src, (source, isVideo) => {\n c.useProgram((gl.program = pg))\n const render = createTexture(c, source, location, unit, isVideo)\n if (render) gl({ render })\n })\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n if (gl.instanceCount > 1) {\n c.drawArraysInstanced(c.TRIANGLES, 0, gl.triangleCount, gl.instanceCount)\n } else c.drawArrays(c.TRIANGLES, 0, gl.triangleCount)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n })\n}\n\nexport type WebGLGraphic = ReturnType<typeof graphic>\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { enableDepth, enableWireframe, loseContext } from './utils'\nimport type { GL } from '../types'\n\nexport const webgl = (gl: GL) => {\n const isInit = !gl.gl\n if (isInit) {\n const c = (gl.gl = gl.el.getContext('webgl2')!)\n gl('render', () => c.viewport(0, 0, ...gl.size!)) // Run before other renderers' events to prevent flickering\n }\n\n compute(gl)\n graphic(gl)\n\n if (isInit) {\n gl('clean', () => loseContext(gl.gl))\n if (gl.isDepth) enableDepth(gl.gl)\n if (gl.wireframe) enableWireframe(gl.gl)\n }\n}\n","import { nested } from 'reev'\nimport { createBuffer, updateBuffer, workgroupCount } from './utils'\nimport type { Binding } from './utils'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL, bindings: Binding) => {\n let pipeline: GPUComputePipeline | undefined\n let bindGroups: GPUBindGroup[] | undefined\n\n const storages = nested((key, value: number[] | Float32Array) => {\n return { ...bindings.storage(key), ...createBuffer(gl.device, value, 'storage') }\n })\n\n gl('_storage', (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n updateBuffer(gl.device, value, array, buffer)\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups) return\n const pass = gl.encoder.beginComputePass()\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 gl('clean', () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline?: GPUComputePipeline, _bindGroups?: GPUBindGroup[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n }\n\n return { storages, set }\n}\n","import { nested } from 'reev'\nimport { is, isFloat32 } from '../helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\ntype IAttribs = Iterable<AttribData & { isInstance?: boolean }>\ntype IUniforms = Iterable<UniformData>\ntype ITextures = Iterable<TextureData>\ntype IStorages = Iterable<StorageData>\n\n/**\n * binding\n */\nexport const createBinding = () => {\n let _uniform = 0\n let _texture = 0\n let _storage = 0\n let _attrib = 0\n const uniform = nested(() => {\n const group = Math.floor(_uniform / 12)\n const binding = _uniform % 12\n _uniform++\n return { group, binding }\n })\n const texture = nested(() => {\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 const storage = nested(() => {\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 const attrib = nested(() => {\n const location = _attrib\n _attrib++\n return { location }\n })\n return { uniform, texture, storage, attrib }\n}\n\nexport type Binding = ReturnType<typeof createBinding>\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log, signal?: AbortSignal) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n const device = await adapter!.requestDevice()\n if (signal?.aborted) {\n device.destroy()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n }\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'premultiplied' })\n return { device, format }\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\nconst createVertexBuffers = (attribs: IAttribs) => {\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\nconst createBindGroup = (device: GPUDevice, uniforms: IUniforms, textures: ITextures, storages: IStorages = []) => {\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\nconst createPipeline = (device: GPUDevice, format: GPUTextureFormat, bufferLayouts: GPUVertexBufferLayout[], bindGroupLayouts: GPUBindGroupLayout[], vs: string, fs: string) => {\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\nconst createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\n if (!cs) return\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\nexport const updatePipeline = (device: GPUDevice, format: GPUTextureFormat, attribs: IAttribs, uniforms: IUniforms, textures: ITextures, storages: IStorages, fs: string, cs: string, vs: string) => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs)\n const { bindGroups, bindGroupLayouts } = createBindGroup(device, uniforms, textures, storages)\n const computePipeline = createComputePipeline(device, bindGroupLayouts, cs)\n const graphicPipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vs, fs)\n return { bindGroups, vertexBuffers, computePipeline, graphicPipeline }\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 createBuffer = (device: GPUDevice, array: number[] | Float32Array, type: 'uniform' | 'storage' | 'attrib') => {\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 updateBuffer = (device: GPUDevice, value: number[] | Float32Array, array: Float32Array, buffer: GPUBuffer) => {\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as GPUAllowSharedBufferSource)\n}\n\nexport const createDescriptor = (c: GPUCanvasContext, depthTexture: GPUTexture) => {\n return {\n colorAttachments: [{ view: c.getCurrentTexture().createView(), clearValue: { r: 0, g: 0, b: 0, a: 0 }, loadOp: 'clear', storeOp: 'store' }],\n depthStencilAttachment: { view: depthTexture.createView(), depthClearValue: 1.0, depthLoadOp: 'clear', depthStoreOp: 'store' },\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, view: texture.createView() }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({ size: [width, height], format: 'depth24plus', usage: 16 }) // 16 is GPUTextureUsage.RENDER_ATTACHMENT\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","import { nested } from 'reev'\nimport { is, getStride, loadingTexture } from '../helpers'\nimport { createBuffer, createDepthTexture, createDescriptor, createTextureSampler, updateBuffer } from './utils'\nimport type { Binding } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL, bindings: Binding, update = () => {}) => {\n let pipeline: GPURenderPipeline\n let bindGroups: GPUBindGroup[]\n let vertexBuffers: GPUBuffer[]\n let depthTexture: GPUTexture\n\n const attributes = nested((key, value: number[], isInstance = false, stride = getStride(value.length, isInstance ? gl.instanceCount : gl.triangleCount)) => {\n update()\n return { ...bindings.attrib(key), ...createBuffer(gl.device, value, 'attrib'), isInstance, stride }\n })\n\n const uniforms = nested((key, value: number[] | Float32Array) => {\n update()\n return { ...bindings.uniform(key), ...createBuffer(gl.device, value, 'uniform') }\n })\n\n const textures = nested((key, width = 1, height = 1) => {\n update()\n return { ...bindings.texture(key), ...createTextureSampler(gl.device, width, height) }\n })\n\n gl('_attribute', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value, true)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[] | Float32Array) => {\n if (is.num(value)) value = [value]\n const u = uniforms(key, value)\n updateBuffer(gl.device, value, u.array, u.buffer)\n })\n\n gl('_texture', (key: string, src: string) => {\n const t = textures(key)\n loadingTexture(src, (source, isVideo) => {\n const [width, height] = isVideo ? [source.videoWidth, source.videoHeight] : [source.width, source.height]\n if (t.texture.width !== width || t.texture.height !== height) {\n t.texture.destroy()\n Object.assign(t, createTextureSampler(gl.device, width, height))\n update() // Rebuilding BindGroups because the texture size has changed\n }\n const render = () => void gl.device.queue.copyExternalImageToTexture({ source }, { texture: t.texture }, { width, height })\n if (isVideo) gl({ render })\n else render()\n })\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups || !vertexBuffers) return\n const pass = gl.encoder.beginRenderPass(createDescriptor(gl.gpu, depthTexture))\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.triangleCount, gl.instanceCount, 0, 0)\n pass.end()\n })\n\n gl('resize', () => {\n const canvas = gl.el as HTMLCanvasElement\n depthTexture?.destroy()\n depthTexture = createDepthTexture(gl.device, canvas.width, canvas.height)\n })\n\n gl('clean', () => {\n depthTexture?.destroy()\n for (const { buffer } of attributes.map.values()) buffer.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline: GPURenderPipeline, _bindGroups: GPUBindGroup[], _vertexBuffers: GPUBuffer[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n vertexBuffers = _vertexBuffers\n }\n\n return { uniforms, textures, attributes, set }\n}\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { createBinding, createDevice, updatePipeline } from './utils'\nimport { is, WGSL_FS, WGSL_VS } from '../helpers'\nimport type { GL } from '../types'\n\nexport const webgpu = async (gl: GL) => {\n let isUpdate = false\n const isInit = !gl.gl\n if (isInit) {\n const gpu = gl.el!.getContext('webgpu') as GPUCanvasContext\n const { device, format } = await createDevice(gpu, gl.error)\n gl({ device, format, gpu })\n }\n\n gl('render', () => {\n if (isUpdate) update()\n gl.encoder = gl.device.createCommandEncoder()\n })\n\n const binding = createBinding()\n const c = compute(gl, binding)\n const g = graphic(gl, binding, () => (isUpdate = true))\n const update = () => {\n isUpdate = false\n const config = { isWebGL: false, gl, binding }\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : WGSL_FS\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : WGSL_VS\n const cs = gl.cs ? (is.str(gl.cs) ? gl.cs : gl.cs.compute(config)) : ''\n const p = updatePipeline(gl.device, gl.format, g.attributes.map.values(), g.uniforms.map.values(), g.textures.map.values(), c.storages.map.values(), fs, cs, vs)\n c.set(p.computePipeline, p.bindGroups)\n g.set(p.graphicPipeline, p.bindGroups, p.vertexBuffers)\n }\n\n gl('render', () => {\n if (gl.encoder) gl.device.queue.submit([gl.encoder.finish()])\n })\n\n gl('clean', () => {\n gl.device.destroy()\n })\n}\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,SAAAC,OAAa,OAC/B,OAAS,eAAAC,GAAa,eAAAC,OAAmB,OCDlC,IAAMC,EAAK,CACV,IAAK,MAAM,QACX,IAAMC,GAA6B,OAAOA,GAAM,UAChD,IAAMA,GAA4B,OAAOA,GAAM,SAC/C,IAAMA,GAA4B,OAAOA,GAAM,SAC/C,IAAMA,GAA4B,OAAO,UAAUA,CAAC,EACpD,IAAMA,GAA8B,OAAOA,GAAM,WACjD,IAAMA,GAA+B,OAAOA,EAAM,IAClD,IAAMA,GAA0BA,IAAM,KACtC,IAAMA,GAAkCA,aAAa,IACrD,IAAMA,GAA2CA,aAAa,IAC9D,IAAMA,GAA4B,CAAC,CAACA,GAAKA,EAAE,YAAY,OAAS,SAChE,IAAMA,GAA4B,OAAOA,GAAM,UAAY,OAAO,MAAMA,CAAC,CACjF,EAgBO,IAAMC,EAAaC,GACXA,aAAiB,aAG1BC,GAAe,CAACC,EAAaC,IAAwC,CACnE,IAAMC,EAAK,IAAI,MACf,OAAO,OAAOA,EAAI,CAAE,IAAAF,EAAK,YAAa,WAAY,CAAC,EACnDE,EAAG,OAAO,EAAE,KAAK,IAAMD,EAAIC,CAAE,CAAC,CACtC,EAEMC,GAAe,CAACH,EAAaC,IAA4C,CACvE,IAAMC,EAAK,SAAS,cAAc,OAAO,EACzC,OAAO,OAAOA,EAAI,CAAE,IAAAF,EAAK,KAAM,GAAM,MAAO,GAAM,YAAa,WAAY,CAAC,EAC5EE,EAAG,KAAK,EACRA,EAAG,KAAK,EACRA,EAAG,iBAAiB,UAAWD,EAAI,KAAK,KAAMC,CAAE,EAAG,CAAE,KAAM,EAAK,CAAC,CACzE,EAMO,SAASE,EAAeJ,EAAmDC,EAAe,CACzF,GAAI,CAACI,EAAG,IAAIL,CAAG,EAAG,OAAOC,EAAID,EAAKA,aAAe,gBAAgB,EACjE,IAAMM,EAAU,6BAA6B,KAAKN,CAAG,GACtCM,EAAUH,GAAeJ,IACjCC,EAAME,GAA4C,CACjDD,EAAIC,EAAwBI,CAAO,CAC3C,CAAC,CACT,CACA,IAAMC,GAAiBC,GAAmB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,EAAE,SAASA,CAAM,EAEvEC,GAAa,CAACC,EAAqBC,EAAQ,IACrCD,EAAcC,IAAU,EAAU,KAAK,MAAMD,EAAcC,CAAK,EAC7D,GAGFC,EAAY,CAACF,EAAqBC,EAAQ,EAAGE,EAAQ,QAAQ,OAAS,CAC3E,IAAMC,EAAML,GAAWC,EAAaC,CAAK,EACzC,OAAKJ,GAAcO,CAAG,GAAGD,EAAM,kDAAkDH,CAAW,kCAAkCC,CAAK,oCAAoC,EAChKG,CACf,EAEaC,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpBC,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQpBC,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhC,KAAK,EAEMC,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECxGlC,OAAS,UAAAC,MAAc,OCGvB,IAAMC,EAAe,CAACC,EAA2BC,EAAgBC,EAAcC,EAAU,QAAQ,OAAS,CAClG,IAAMC,EAASJ,EAAE,aAAaE,CAAI,EAClC,GAAI,CAACE,EAAQ,OAAOD,EAAQ,yBAAyB,EAGrD,GAFAH,EAAE,aAAaI,EAAQH,EAAO,KAAK,CAAC,EACpCD,EAAE,cAAcI,CAAM,EAClBJ,EAAE,mBAAmBI,EAAQJ,EAAE,cAAc,EAAG,OAAOI,EAC3D,IAAMC,EAAQL,EAAE,iBAAiBI,CAAM,EACvCJ,EAAE,aAAaI,CAAM,EACrBD,EAAQ,6BAA6BE,CAAK;AAAA;AAAA;AAAA,EAAwBJ,CAAM,EAAE,CAClF,EAEaK,EAAgB,CAACN,EAA2BO,EAAcC,EAAcC,IAAW,CACxF,IAAMC,EAAKV,EAAE,cAAc,EACrBW,EAAKZ,EAAaC,EAAGO,EAAMP,EAAE,gBAAiBS,EAAG,KAAK,EACtDG,EAAKb,EAAaC,EAAGQ,EAAMR,EAAE,cAAeS,EAAG,KAAK,EAC1D,GAAI,CAACE,GAAM,CAACC,EAAI,OAIhB,GAHAZ,EAAE,aAAaU,EAAIC,CAAG,EACtBX,EAAE,aAAaU,EAAIE,CAAG,EACtBZ,EAAE,YAAYU,CAAE,EACZV,EAAE,oBAAoBU,EAAIV,EAAE,WAAW,EAAG,OAAOU,EACrD,IAAML,EAAQL,EAAE,kBAAkBU,CAAE,EACpCV,EAAE,cAAcU,CAAE,EAClBD,EAAG,MAAM,2BAA2BJ,CAAK,EAAE,CACnD,EAEaQ,EAAe,CAACb,EAA2Bc,IAAmB,CACnE,IAAMC,EAAQ,IAAI,aAAaD,CAAI,EAC7BE,EAAShB,EAAE,aAAa,EAC9B,MAAO,CAAE,MAAAe,EAAO,OAAAC,CAAO,CAC/B,EAEaC,EAAe,CAACjB,EAA2Be,EAAqBC,EAAqBE,IAAoB,CAC9GH,EAAM,IAAIG,CAAK,EACflB,EAAE,WAAWA,EAAE,aAAcgB,CAAM,EACnChB,EAAE,WAAWA,EAAE,aAAce,EAAOf,EAAE,WAAW,EACjDA,EAAE,WAAWA,EAAE,aAAc,IAAI,CACzC,EAEamB,EAAe,CAACnB,EAA2BoB,EAAaC,EAAgBL,IAAwB,CACrGhB,EAAE,WAAWA,EAAE,aAAcgB,CAAM,EACnChB,EAAE,wBAAwBoB,CAAG,EAC7BpB,EAAE,oBAAoBoB,EAAKC,EAAQrB,EAAE,MAAO,GAAO,EAAG,CAAC,CAC/D,EAEasB,EAAiB,CAACtB,EAA2BoB,EAAaC,EAAgBL,IAAwB,CACvGhB,EAAE,WAAWA,EAAE,aAAcgB,CAAM,EACnChB,EAAE,wBAAwBoB,CAAG,EAC7BpB,EAAE,oBAAoBoB,EAAKC,EAAQrB,EAAE,MAAO,GAAO,EAAG,CAAC,EACvDA,EAAE,oBAAoBoB,EAAK,CAAC,CACpC,EAEaG,EAAgB,CAACvB,EAA2BoB,EAAkCF,IAA6B,CAChH,GAAIM,EAAG,IAAIJ,CAAG,EAAG,OACjB,GAAII,EAAG,IAAIN,CAAK,EAAG,OAAOlB,EAAE,UAAUoB,EAAKF,CAAK,EAChD,IAAIO,EAAIP,EAAM,OACd,GAAIO,GAAK,EAAG,OAAOzB,EAAE,UAAUyB,CAAM,IAAI,EAAEL,EAAKF,CAAK,EACrDO,EAAI,KAAK,KAAKA,CAAC,GAAK,EACpBzB,EAAE,gBAAgByB,CAAM,IAAI,EAAEL,EAAK,GAAOF,CAAK,CACvD,EAEaQ,EAAgB,CAAC1B,EAA2B2B,EAAgDP,EAAkCQ,EAAcC,EAAU,KAAU,CACrK,IAAMC,EAAU9B,EAAE,cAAc,EAgBhC,GAfAA,EAAE,YAAYA,EAAE,WAAY8B,CAAO,EAC/BH,GACI3B,EAAE,WAAWA,EAAE,WAAY,EAAGA,EAAE,KAAMA,EAAE,KAAMA,EAAE,cAAe2B,CAAE,EAC5DE,GAAS7B,EAAE,eAAeA,EAAE,UAAU,GAE3CA,EAAE,WAAWA,EAAE,WAAY,EAAGA,EAAE,KAAM,EAAG,EAAG,EAAGA,EAAE,KAAMA,EAAE,cAAe,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CAAC,EAE5GA,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,MAAM,EAC5DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,MAAM,EAC5DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,EAC/DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,EAC/DA,EAAE,YAAYA,EAAE,WAAY,IAAI,EAChCA,EAAE,UAAUoB,EAAKQ,CAAI,EACrB5B,EAAE,cAAcA,EAAE,SAAW4B,CAAI,EACjC5B,EAAE,YAAYA,EAAE,WAAY8B,CAAO,EAC/BD,EACI,MAAO,IAAM,CACL7B,EAAE,cAAcA,EAAE,SAAW4B,CAAI,EACjC5B,EAAE,YAAYA,EAAE,WAAY8B,CAAO,EACnC9B,EAAE,WAAWA,EAAE,WAAY,EAAGA,EAAE,KAAMA,EAAE,KAAMA,EAAE,cAAe2B,CAAG,CAC1E,CAChB,EAUaI,EAAgB,CAAC/B,EAA2BkB,EAAiBc,EAAeC,EAAgBC,EAAqBC,EAAqBP,EAAcb,IAAwB,CACjL,IAAMqB,EAAgBJ,EAAQC,EACxBI,EAAanB,EAAM,OAASkB,EAClC,QAASE,EAAI,EAAGA,EAAIF,EAAeE,IAC3B,QAASC,EAAI,EAAGA,EAAI,KAAK,IAAIF,EAAY,CAAC,EAAGE,IACrCxB,EAAM,EAAIuB,EAAIC,CAAC,EAAIrB,EAAMoB,EAAID,EAAaE,CAAC,GAAK,EAGhEvC,EAAE,cAAcA,EAAE,SAAW4B,CAAI,EACjC5B,EAAE,YAAYA,EAAE,WAAYkC,EAAK,OAAO,EACxClC,EAAE,WAAWA,EAAE,WAAY,EAAGA,EAAE,QAASgC,EAAOC,EAAQ,EAAGjC,EAAE,KAAMA,EAAE,MAAOe,CAAK,EACjFf,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,OAAO,EAC7DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,OAAO,EAC7DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,EAC/DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,EAC/DA,EAAE,YAAYA,EAAE,WAAYmC,EAAK,OAAO,EACxCnC,EAAE,WAAWA,EAAE,WAAY,EAAGA,EAAE,QAASgC,EAAOC,EAAQ,EAAGjC,EAAE,KAAMA,EAAE,MAAOe,CAAK,EACjFf,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,OAAO,EAC7DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,mBAAoBA,EAAE,OAAO,EAC7DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,EAC/DA,EAAE,cAAcA,EAAE,WAAYA,EAAE,eAAgBA,EAAE,aAAa,CACvE,EAEawC,EAAe,CAACxC,EAA2ByC,IAAgE,CAChH,OAAW,CAAE,KAAAP,EAAM,KAAAC,CAAK,IAAKM,EACrBzC,EAAE,cAAckC,EAAK,OAAO,EAC5BlC,EAAE,cAAcmC,EAAK,OAAO,EAC5BnC,EAAE,kBAAkBkC,EAAK,MAAM,EAC/BlC,EAAE,kBAAkBmC,EAAK,MAAM,CAE/C,EAEaO,EAAmB,CAAC1C,EAA2BsC,EAAkBK,EAAkBvB,EAA2BQ,EAAcgB,IAAkB,CACnJ5C,EAAE,cAAcA,EAAE,SAAW4B,CAAI,EACjC5B,EAAE,YAAYA,EAAE,WAAYsC,EAAE,OAAO,EACrCtC,EAAE,UAAUoB,EAAKQ,CAAI,EACjBgB,IAAU,GAAG5C,EAAE,gBAAgBA,EAAE,YAAa2C,EAAE,MAAM,EAC1D,IAAME,EAAa7C,EAAE,kBAAoB4C,EACzC,OAAA5C,EAAE,qBAAqBA,EAAE,YAAa6C,EAAY7C,EAAE,WAAY2C,EAAE,QAAS,CAAC,EACrEE,CACf,EAKaC,EAAc,CAACV,EAAmC,OAAS,CAChE,GAAIZ,EAAG,IAAIY,CAAa,EAAG,CACnB,IAAMW,EAAO,KAAK,KAAKX,CAAa,EAC9BY,EAAO,KAAK,KAAKD,CAAI,EAC3B,OAAK,OAAO,UAAUA,CAAI,GAAG,QAAQ,KAAK,wCAAwCX,CAAa,4BAA4BY,CAAI,IAAIA,CAAI,2FAA2F,EAC3N,CAAE,EAAGA,EAAM,EAAGA,CAAK,CAClC,CACA,GAAM,CAACC,EAAGC,EAAGC,CAAC,EAAIf,EAClB,GAAIe,IAAM,OAAW,CACb,IAAMC,EAAKF,EAAIC,EACf,eAAQ,KAAK,2CAA2CF,CAAC,KAAKC,CAAC,KAAKC,CAAC,kGAAkGD,CAAC,YAAYC,CAAC,MAAMC,CAAE,GAAG,EACzL,CAAE,EAAAH,EAAG,EAAGG,CAAG,CAC1B,CACA,MAAO,CAAE,EAAAH,EAAG,EAAAC,CAAE,CACtB,EAEaG,EAAerD,GAA8B,CAClD,IAAMsD,EAAMtD,EAAE,aAAa,oBAAoB,EAC3CsD,GAAKA,EAAI,YAAY,CACjC,EAEaC,EAAevD,GAA8B,CAClDA,EAAE,OAAOA,EAAE,UAAU,EACrBA,EAAE,UAAUA,EAAE,MAAM,EACpBA,EAAE,OAAOA,EAAE,SAAS,EACpBA,EAAE,SAASA,EAAE,IAAI,CACzB,EAEawD,EAAmBxD,GAA8B,CACtD,IAAMsD,EAAMtD,EAAE,aAAa,oBAAoB,EAC3CsD,GAAKA,EAAI,iBAAiBtD,EAAE,eAAgBsD,EAAI,UAAU,CACtE,EDvKO,IAAMG,EAAWC,GAAW,CAC3B,GAAI,CAACA,EAAG,GAAI,OACZ,IAAMC,EAAID,EAAG,GACbC,EAAE,aAAa,wBAAwB,EAEvC,IAAIC,EAAW,EACXC,EAAW,EAETC,EAAQC,EAAO,IAAMH,GAAU,EAC/BI,EAAKC,EAAG,IAAIP,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAI,QAAQ,CAAE,QAAS,GAAM,GAAAA,EAAI,MAAAI,CAAM,CAAC,EACxEI,EAAKC,EAAcR,EAAGK,EAAII,EAASV,CAAE,EACrCW,EAAOC,EAAYZ,EAAG,aAAa,EAEnCa,EAAWR,EAAQS,GAAQb,EAAE,mBAAmBO,EAAIM,CAAG,CAAE,EACzDC,EAAWV,EAAQS,GAAQ,CACzB,IAAME,EAAQ,IAAI,aAAaL,EAAK,EAAIA,EAAK,EAAI,CAAC,EAC5CM,EAAO,CAAE,QAAShB,EAAE,cAAc,EAAG,OAAQA,EAAE,kBAAkB,CAAE,EACnEiB,EAAO,CAAE,QAASjB,EAAE,cAAc,EAAG,OAAQA,EAAE,kBAAkB,CAAE,EACzE,MAAO,CAAE,KAAAgB,EAAM,KAAAC,EAAM,MAAAF,EAAO,IAAKH,EAASC,CAAG,EAAG,KAAMV,EAAMU,CAAG,CAAE,CACzE,CAAC,EAEDd,EAAG,WAAY,CAACc,EAAaK,IAA6B,CAClDlB,EAAE,WAAYD,EAAG,QAAUQ,CAAG,EAC9BY,EAAcnB,EAAGY,EAASC,CAAG,EAAGK,CAAK,CAC7C,CAAC,EAEDnB,EAAG,WAAY,CAACc,EAAaK,IAAoB,CACzClB,EAAE,WAAYD,EAAG,QAAUQ,CAAG,EAC9B,GAAM,CAAE,KAAAS,EAAM,KAAAC,EAAM,KAAAG,EAAM,MAAAL,CAAM,EAAID,EAASD,CAAG,EAChDQ,EAAcrB,EAAGkB,EAAOR,EAAK,EAAGA,EAAK,EAAGM,EAAMC,EAAMG,EAAML,CAAK,CACvE,CAAC,EAEDhB,EAAG,QAAS,IAAM,CACVC,EAAE,cAAcO,CAAE,EAClBe,EAAatB,EAAGc,EAAS,IAAI,OAAO,CAAC,CAC7C,CAAC,EAEDf,EAAG,SAAU,IAAM,CACXC,EAAE,WAAYD,EAAG,QAAUQ,CAAG,EAC9B,IAAMgB,EAAcT,EAAS,IAAI,OAAO,EAAE,IAAI,CAAC,CAAE,KAAAE,EAAM,KAAAC,EAAM,IAAAO,EAAK,KAAAJ,CAAK,EAAGK,IAAU,CAC5E,GAAM,CAACC,EAAGC,CAAC,EAAIzB,EAAW,EAAI,CAACc,EAAMC,CAAI,EAAI,CAACA,EAAMD,CAAI,EACxD,OAAOY,EAAiB5B,EAAG0B,EAAGC,EAAGH,EAAKJ,EAAMK,CAAK,CACzD,CAAC,EACDzB,EAAE,YAAYuB,CAAW,EACzBvB,EAAE,WAAWA,EAAE,UAAW,EAAG,CAAC,EAC9BA,EAAE,gBAAgBA,EAAE,YAAa,IAAI,EACrCE,GACR,CAAC,CACT,EErDA,OAAS,UAAA2B,MAAc,OAKhB,IAAMC,EAAWC,GAAW,CAC3B,IAAMC,EAAS,CAAE,QAAS,GAAM,GAAAD,CAAG,EAC7BE,EAAIF,EAAG,GACPG,EAAKH,EAAG,GAAMI,EAAG,IAAIJ,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAG,SAASC,CAAM,EAAKI,EAChEC,EAAKN,EAAG,GAAMI,EAAG,IAAIJ,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAG,OAAOC,CAAM,EAAKM,EAC9DC,EAAKC,EAAcP,EAAGC,EAAIG,EAAIN,CAAE,EAClCU,EAAa,EAEXC,EAAQC,EAAO,IAAMF,GAAY,EACjCG,EAAWD,EAAQE,GAAQZ,EAAE,mBAAmBM,EAAIM,CAAG,CAAC,EACxDC,EAAaH,EAAO,CAACE,EAAKE,EAAiBC,EAAa,MAE/C,CAAE,OADMC,EAAUF,EAAM,OAAQC,EAAajB,EAAG,cAAgBA,EAAG,cAAeA,EAAG,KAAK,EAChF,SAAUE,EAAE,kBAAkBM,EAAIM,CAAG,EAAG,GAAGK,EAAajB,EAAGc,CAAK,CAAE,EAC1F,EAEDhB,EAAG,aAAc,CAACc,EAAaE,IAAoB,CAC3Cd,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC9B,IAAMY,EAAIL,EAAWD,EAAKE,CAAK,EAC/BK,EAAanB,EAAGkB,EAAE,MAAOA,EAAE,OAAQJ,CAAK,EACxCM,EAAapB,EAAGkB,EAAE,SAAUA,EAAE,OAAQA,EAAE,MAAM,CACtD,CAAC,EAEDpB,EAAG,YAAa,CAACc,EAAaE,IAAoB,CAC1Cd,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC9B,IAAMY,EAAIL,EAAWD,EAAKE,EAAO,EAAI,EACrCK,EAAanB,EAAGkB,EAAE,MAAOA,EAAE,OAAQJ,CAAK,EACxCO,EAAerB,EAAGkB,EAAE,SAAUA,EAAE,OAAQA,EAAE,MAAM,CACxD,CAAC,EAEDpB,EAAG,WAAY,CAACc,EAAaE,IAA6B,CAClDd,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC9BgB,EAActB,EAAGW,EAASC,CAAG,EAAGE,CAAK,CAC7C,CAAC,EAEDhB,EAAG,WAAY,CAACc,EAAaW,IAAgB,CACrCvB,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC9B,IAAMkB,EAAWb,EAASC,CAAG,EACvBa,EAAOhB,EAAMG,CAAG,EACtBc,EAAc1B,EAAG,KAAMwB,EAAUC,EAAM,EAAK,EAC5CE,EAAeJ,EAAK,CAACK,EAAQC,IAAY,CACjC7B,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC9B,IAAMwB,EAASJ,EAAc1B,EAAG4B,EAAQJ,EAAUC,EAAMI,CAAO,EAC3DC,GAAQhC,EAAG,CAAE,OAAAgC,CAAO,CAAC,CACjC,CAAC,CACT,CAAC,EAEDhC,EAAG,QAAS,IAAM,CACVE,EAAE,cAAcM,CAAE,CAC1B,CAAC,EAEDR,EAAG,SAAU,IAAM,CACXE,EAAE,WAAYF,EAAG,QAAUQ,CAAG,EAC1BR,EAAG,cAAgB,EACfE,EAAE,oBAAoBA,EAAE,UAAW,EAAGF,EAAG,cAAeA,EAAG,aAAa,EACzEE,EAAE,WAAWA,EAAE,UAAW,EAAGF,EAAG,aAAa,EACpDE,EAAE,gBAAgBA,EAAE,YAAa,IAAI,CAC7C,CAAC,CACT,ECzDO,IAAM+B,EAASC,GAAW,CACzB,IAAMC,EAAS,CAACD,EAAG,GACnB,GAAIC,EAAQ,CACJ,IAAMC,EAAKF,EAAG,GAAKA,EAAG,GAAG,WAAW,QAAQ,EAC5CA,EAAG,SAAU,IAAME,EAAE,SAAS,EAAG,EAAG,GAAGF,EAAG,IAAK,CAAC,CACxD,CAEAG,EAAQH,CAAE,EACVI,EAAQJ,CAAE,EAENC,IACID,EAAG,QAAS,IAAMK,EAAYL,EAAG,EAAE,CAAC,EAChCA,EAAG,SAASM,EAAYN,EAAG,EAAE,EAC7BA,EAAG,WAAWO,EAAgBP,EAAG,EAAE,EAEvD,ECpBA,OAAS,UAAAQ,OAAc,OCAvB,OAAS,UAAAC,MAAc,OAYhB,IAAMC,EAAgB,IAAM,CAC3B,IAAIC,EAAW,EACXC,EAAW,EACXC,EAAW,EACXC,EAAU,EACRC,EAAUC,EAAO,IAAM,CACrB,IAAMC,EAAQ,KAAK,MAAMN,EAAW,EAAE,EAChCO,EAAUP,EAAW,GAC3B,OAAAA,IACO,CAAE,MAAAM,EAAO,QAAAC,CAAQ,CAChC,CAAC,EACKC,EAAUH,EAAO,IAAM,CAErB,IAAMC,EADY,KAAK,MAAMN,EAAW,EAAE,EAAI,EACpB,KAAK,MAAMC,EAAW,CAAC,EAC3CM,EAAWN,EAAW,EAAK,EACjC,OAAAA,IACO,CAAE,MAAAK,EAAO,QAAAC,CAAQ,CAChC,CAAC,EACKE,EAAUJ,EAAO,IAAM,CAErB,IAAMC,EADY,KAAK,MAAMN,EAAW,EAAE,EAAI,KAAK,MAAMC,EAAW,CAAC,EAAI,EAC/C,KAAK,MAAMC,EAAW,EAAE,EAC5CK,EAAUL,EAAW,GAC3B,OAAAA,IACO,CAAE,MAAAI,EAAO,QAAAC,CAAQ,CAChC,CAAC,EACKG,EAASL,EAAO,IAAM,CACpB,IAAMM,EAAWR,EACjB,OAAAA,IACO,CAAE,SAAAQ,CAAS,CAC1B,CAAC,EACD,MAAO,CAAE,QAAAP,EAAS,QAAAI,EAAS,QAAAC,EAAS,OAAAC,CAAO,CACnD,EAOaE,GAAe,MAAOC,EAAqBC,EAAM,QAAQ,IAAKC,IAAyB,CAC5F,IAAMC,EAAM,UAAU,IAChBC,EAASD,EAAI,yBAAyB,EACtCE,EAAU,MAAMF,EAAI,eAAe,EACzC,GAAID,GAAQ,QAAS,MAAM,IAAI,aAAa,UAAW,YAAY,EACnE,IAAMI,EAAS,MAAMD,EAAS,cAAc,EAC5C,GAAIH,GAAQ,UACJI,EAAO,QAAQ,EACXJ,GAAQ,SAAS,MAAM,IAAI,aAAa,UAAW,YAAY,EAE3E,OAAAI,EAAO,kBAAqBC,GAAMN,EAAIM,EAAE,MAAM,OAAO,EACrDP,EAAE,UAAU,CAAE,OAAAM,EAAQ,OAAAF,EAAQ,UAAW,eAAgB,CAAC,EACnD,CAAE,OAAAE,EAAQ,OAAAF,CAAO,CAChC,EAKMI,GAAmBC,GACbA,IAAW,EAAU,YACrBA,IAAW,EAAU,YACrBA,IAAW,EAAU,YAClB,UAGTC,GAAuBC,GAAsB,CAC3C,IAAMC,EAA6B,CAAC,EAC9BC,EAAyC,CAAC,EAChD,OAAW,CAAE,OAAAC,EAAQ,SAAAhB,EAAU,OAAAW,EAAQ,WAAAM,CAAW,IAAKJ,EAAS,CACxDC,EAAcd,CAAQ,EAAIgB,EAC1B,IAAME,EAAgB,KAAK,IAAI,KAAK,IAAI,KAAK,MAAMP,CAAM,EAAG,CAAC,EAAG,CAAC,EAC3DQ,EAAc,KAAK,IAAI,EAAG,KAAK,KAAMD,EAAgB,EAAK,CAAC,EAAI,CAAC,EACtEH,EAAcf,CAAQ,EAAI,CAClB,YAAAmB,EACA,SAAUF,EAAa,WAAa,SACpC,WAAY,CACJ,CACQ,eAAgBjB,EAChB,OAAQ,EACR,OAAQU,GAAgBQ,CAAa,CAC7C,CACR,CACR,CACR,CACA,MAAO,CAAE,cAAAJ,EAAe,cAAAC,CAAc,CAC9C,EAEMK,GAAkB,CAACZ,EAAmBa,EAAqBC,EAAqBC,EAAsB,CAAC,IAAM,CAC3G,IAAMC,EAAS,IAAI,IACbC,EAAM,CAAE,WAAY,CAAC,EAAqB,iBAAkB,CAAC,CAA0B,EACvFC,EAAM,CAACC,EAAWC,EAAiChC,IAA+B,CAC3E4B,EAAO,IAAIG,CAAC,GAAGH,EAAO,IAAIG,EAAG,CAAE,QAAS,CAAC,EAAG,SAAU,CAAC,CAAE,CAAC,EAC/D,GAAM,CAAE,QAAAE,EAAS,SAAAC,CAAS,EAAIN,EAAO,IAAIG,CAAC,EAC1CE,EAAQ,KAAKD,CAAM,EACnBE,EAAS,KAAKlC,CAAO,CAC7B,EACA,OAAW,CAAE,QAAAA,EAAS,OAAAoB,EAAQ,MAAOW,CAAE,IAAKN,EACpCK,EAAIC,EAAG,CAAE,QAAA/B,EAAS,WAAY,EAAG,OAAQ,CAAE,KAAM,SAAU,CAAE,EAAG,CAAE,QAAAA,EAAS,SAAU,CAAE,OAAAoB,CAAO,CAAE,CAAC,EAEzG,OAAW,CAAE,QAAApB,EAAS,OAAAoB,EAAQ,MAAOW,CAAE,IAAKJ,EACpCG,EAAIC,EAAG,CAAE,QAAA/B,EAAS,WAAY,EAAG,OAAQ,CAAE,KAAM,SAAU,CAAE,EAAG,CAAE,QAAAA,EAAS,SAAU,CAAE,OAAAoB,CAAO,CAAE,CAAC,EAEzG,OAAW,CAAE,QAASe,EAAG,MAAOJ,EAAG,QAAAK,EAAS,KAAAC,CAAK,IAAKX,EAC9CI,EAAIC,EAAG,CAAE,QAASI,EAAG,WAAY,EAAG,QAAS,CAAC,CAAE,EAAG,CAAE,QAASA,EAAG,SAAUC,CAAQ,CAAC,EACpFN,EAAIC,EAAG,CAAE,QAASI,EAAI,EAAG,WAAY,EAAG,QAAS,CAAC,CAAE,EAAG,CAAE,QAASA,EAAI,EAAG,SAAUE,CAAK,CAAC,EAEjG,OAAW,CAACN,EAAG,CAAE,QAAAE,EAAS,SAAAC,CAAS,CAAC,IAAKN,EACjCC,EAAI,iBAAiBE,CAAC,EAAInB,EAAO,sBAAsB,CAAE,QAASqB,CAAQ,CAAC,EAC3EJ,EAAI,WAAWE,CAAC,EAAInB,EAAO,gBAAgB,CAAE,OAAQiB,EAAI,iBAAiBE,CAAC,EAAG,QAASG,CAAS,CAAC,EAEzG,OAAOL,CACf,EAEMS,GAAiB,CAAC1B,EAAmBF,EAA0BS,EAAwCoB,EAAwCC,EAAYC,IAClJ7B,EAAO,qBAAqB,CAC3B,OAAQ,CACA,OAAQA,EAAO,mBAAmB,CAAE,MAAO,OAAQ,KAAM4B,EAAG,KAAK,CAAE,CAAC,EACpE,WAAY,OACZ,QAASrB,CACjB,EACA,SAAU,CACF,OAAQP,EAAO,mBAAmB,CAAE,MAAO,OAAQ,KAAM6B,EAAG,KAAK,CAAE,CAAC,EACpE,WAAY,OACZ,QAAS,CAAC,CAAE,OAAA/B,CAAO,CAAC,CAC5B,EACA,OAAQE,EAAO,qBAAqB,CAAE,iBAAA2B,CAAiB,CAAC,EACxD,UAAW,CAAE,SAAU,eAAgB,EACvC,aAAc,CACN,kBAAmB,GACnB,aAAc,OACd,OAAQ,aAChB,CACR,CAAC,EAGHG,GAAwB,CAAC9B,EAAmB2B,EAAwCI,IAAe,CACjG,GAAKA,EACL,OAAO/B,EAAO,sBAAsB,CAC5B,QAAS,CACD,OAAQA,EAAO,mBAAmB,CAAE,MAAO,UAAW,KAAM+B,EAAG,KAAK,CAAE,CAAC,EACvE,WAAY,MACpB,EACA,OAAQ/B,EAAO,qBAAqB,CAAE,iBAAA2B,CAAiB,CAAC,CAChE,CAAC,CACT,EAEaK,GAAiB,CAAChC,EAAmBF,EAA0BO,EAAmBQ,EAAqBC,EAAqBC,EAAqBc,EAAYE,EAAYH,IAAe,CAC7L,GAAM,CAAE,cAAAtB,EAAe,cAAAC,CAAc,EAAIH,GAAoBC,CAAO,EAC9D,CAAE,WAAA4B,EAAY,iBAAAN,CAAiB,EAAIf,GAAgBZ,EAAQa,EAAUC,EAAUC,CAAQ,EACvFmB,EAAkBJ,GAAsB9B,EAAQ2B,EAAkBI,CAAE,EACpEI,EAAkBT,GAAe1B,EAAQF,EAAQS,EAAeoB,EAAkBC,EAAIC,CAAE,EAC9F,MAAO,CAAE,WAAAI,EAAY,cAAA3B,EAAe,gBAAA4B,EAAiB,gBAAAC,CAAgB,CAC7E,EAKMC,GAAeC,GACTA,IAAS,UAAkB,GAC3BA,IAAS,SAAiB,GACvB,IAGFC,EAAe,CAACtC,EAAmBuC,EAAgCF,IAA2C,CAC9GG,EAAUD,CAAK,IAAGA,EAAQ,IAAI,aAAaA,CAAK,GACrD,IAAME,EAAQL,GAAYC,CAAI,EACxBK,EAAOL,IAAS,UAAY,KAAK,KAAKE,EAAM,WAAa,GAAG,EAAI,IAAMA,EAAM,WAC5E/B,EAASR,EAAO,aAAa,CAAE,KAAA0C,EAAM,MAAAD,CAAM,CAAC,EAClD,MAAO,CAAE,MAAAF,EAAO,OAAA/B,CAAO,CAC/B,EAEamC,EAAe,CAAC3C,EAAmB4C,EAAgCL,EAAqB/B,IAAsB,CACnH+B,EAAM,IAAIK,CAAK,EACf5C,EAAO,MAAM,YAAYQ,EAAQ,EAAG+B,CAAmC,CAC/E,EAEaM,GAAmB,CAACnD,EAAqBoD,KACvC,CACC,iBAAkB,CAAC,CAAE,KAAMpD,EAAE,kBAAkB,EAAE,WAAW,EAAG,WAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,OAAQ,QAAS,QAAS,OAAQ,CAAC,EAC1I,uBAAwB,CAAE,KAAMoD,EAAa,WAAW,EAAG,gBAAiB,EAAK,YAAa,QAAS,aAAc,OAAQ,CACrI,GAMKC,EAAuB,CAAC/C,EAAmBgD,EAAQ,KAAMC,EAAS,MAAQ,CAC/E,IAAM5D,EAAUW,EAAO,cAAc,CAAE,KAAM,CAACgD,EAAOC,CAAM,EAAG,OAAQ,aAAc,MAAO,EAAG,CAAC,EACzFzB,EAAUxB,EAAO,cAAc,CAAE,UAAW,SAAU,UAAW,QAAS,CAAC,EACjF,MAAO,CAAE,QAAAX,EAAS,QAAAmC,EAAS,KAAMnC,EAAQ,WAAW,CAAE,CAC9D,EAEa6D,GAAqB,CAAClD,EAAmBgD,EAAeC,IACtDjD,EAAO,cAAc,CAAE,KAAM,CAACgD,EAAOC,CAAM,EAAG,OAAQ,cAAe,MAAO,EAAG,CAAC,EAMlFE,GAAiB,CAACC,EAAkCC,EAAgB,KAAO,CAC5EC,EAAG,IAAIF,CAAa,IAAGA,EAAgB,CAACA,CAAa,GACzD,GAAM,CAACG,EAAGC,EAAI,EAAGC,EAAI,CAAC,EAAIL,EAC1B,MAAO,CACC,EAAG,KAAK,IAAKG,EAAIC,EAAIC,EAAKJ,EAAe,KAAK,EAC9C,EAAG,EACH,EAAG,CACX,CACR,EDpNO,IAAMK,GAAU,CAACC,EAAQC,IAAsB,CAC9C,IAAIC,EACAC,EAEEC,EAAWC,GAAO,CAACC,EAAKC,KACf,CAAE,GAAGN,EAAS,QAAQK,CAAG,EAAG,GAAGE,EAAaR,EAAG,OAAQO,EAAO,SAAS,CAAE,EACvF,EAED,OAAAP,EAAG,WAAY,CAACM,EAAaC,IAAmC,CACxD,GAAM,CAAE,MAAAE,EAAO,OAAAC,CAAO,EAAIN,EAASE,EAAKC,CAAK,EAC7CI,EAAaX,EAAG,OAAQO,EAAOE,EAAOC,CAAM,CACpD,CAAC,EAEDV,EAAG,SAAU,IAAM,CACX,GAAI,CAACE,GAAY,CAACC,EAAY,OAC9B,IAAMS,EAAOZ,EAAG,QAAQ,iBAAiB,EACzCY,EAAK,YAAYV,CAAQ,EACzBC,EAAW,QAAQ,CAACU,EAAGC,IAAMF,EAAK,aAAaE,EAAGD,CAAC,CAAC,EACpD,GAAM,CAAE,EAAAE,EAAG,EAAAC,EAAG,EAAAC,CAAE,EAAIC,GAAelB,EAAG,aAAa,EACnDY,EAAK,mBAAmBG,EAAGC,EAAGC,CAAC,EAC/BL,EAAK,IAAI,CACjB,CAAC,EAEDZ,EAAG,QAAS,IAAM,CACV,OAAW,CAAE,OAAAU,CAAO,IAAKN,EAAS,IAAI,OAAO,EAAGM,EAAO,QAAQ,CACvE,CAAC,EAOM,CAAE,SAAAN,EAAU,IALP,CAACe,EAAgCC,IAAiC,CACtElB,EAAWiB,EACXhB,EAAaiB,CACrB,CAEuB,CAC/B,EEtCA,OAAS,UAAAC,MAAc,OAMhB,IAAMC,GAAU,CAACC,EAAQC,EAAmBC,EAAS,IAAM,CAAC,IAAM,CACjE,IAAIC,EACAC,EACAC,EACAC,EAEEC,EAAaC,EAAO,CAACC,EAAKC,EAAiBC,EAAa,GAAOC,EAASC,EAAUH,EAAM,OAAQC,EAAaX,EAAG,cAAgBA,EAAG,aAAa,KAC9IE,EAAO,EACA,CAAE,GAAGD,EAAS,OAAOQ,CAAG,EAAG,GAAGK,EAAad,EAAG,OAAQU,EAAO,QAAQ,EAAG,WAAAC,EAAY,OAAAC,CAAO,EACzG,EAEKG,EAAWP,EAAO,CAACC,EAAKC,KACtBR,EAAO,EACA,CAAE,GAAGD,EAAS,QAAQQ,CAAG,EAAG,GAAGK,EAAad,EAAG,OAAQU,EAAO,SAAS,CAAE,EACvF,EAEKM,EAAWR,EAAO,CAACC,EAAKQ,EAAQ,EAAGC,EAAS,KAC1ChB,EAAO,EACA,CAAE,GAAGD,EAAS,QAAQQ,CAAG,EAAG,GAAGU,EAAqBnB,EAAG,OAAQiB,EAAOC,CAAM,CAAE,EAC5F,EAED,OAAAlB,EAAG,aAAc,CAACS,EAAaC,IAAmC,CAC1D,IAAMU,EAAIb,EAAWE,EAAKC,CAAK,EAC/BW,EAAarB,EAAG,OAAQU,EAAOU,EAAE,MAAOA,EAAE,MAAM,CACxD,CAAC,EAEDpB,EAAG,YAAa,CAACS,EAAaC,IAAmC,CACzD,IAAMU,EAAIb,EAAWE,EAAKC,EAAO,EAAI,EACrCW,EAAarB,EAAG,OAAQU,EAAOU,EAAE,MAAOA,EAAE,MAAM,CACxD,CAAC,EAEDpB,EAAG,WAAY,CAACS,EAAaC,IAA4C,CAC7DY,EAAG,IAAIZ,CAAK,IAAGA,EAAQ,CAACA,CAAK,GACjC,IAAMa,EAAIR,EAASN,EAAKC,CAAK,EAC7BW,EAAarB,EAAG,OAAQU,EAAOa,EAAE,MAAOA,EAAE,MAAM,CACxD,CAAC,EAEDvB,EAAG,WAAY,CAACS,EAAae,IAAgB,CACrC,IAAMC,EAAIT,EAASP,CAAG,EACtBiB,EAAeF,EAAK,CAACG,EAAQC,IAAY,CACjC,GAAM,CAACX,EAAOC,CAAM,EAAIU,EAAU,CAACD,EAAO,WAAYA,EAAO,WAAW,EAAI,CAACA,EAAO,MAAOA,EAAO,MAAM,GACpGF,EAAE,QAAQ,QAAUR,GAASQ,EAAE,QAAQ,SAAWP,KAC9CO,EAAE,QAAQ,QAAQ,EAClB,OAAO,OAAOA,EAAGN,EAAqBnB,EAAG,OAAQiB,EAAOC,CAAM,CAAC,EAC/DhB,EAAO,GAEf,IAAM2B,EAAS,IAAM,KAAK7B,EAAG,OAAO,MAAM,2BAA2B,CAAE,OAAA2B,CAAO,EAAG,CAAE,QAASF,EAAE,OAAQ,EAAG,CAAE,MAAAR,EAAO,OAAAC,CAAO,CAAC,EACtHU,EAAS5B,EAAG,CAAE,OAAA6B,CAAO,CAAC,EACrBA,EAAO,CACpB,CAAC,CACT,CAAC,EAED7B,EAAG,SAAU,IAAM,CACX,GAAI,CAACG,GAAY,CAACC,GAAc,CAACC,EAAe,OAChD,IAAMyB,EAAO9B,EAAG,QAAQ,gBAAgB+B,GAAiB/B,EAAG,IAAKM,CAAY,CAAC,EAC9EwB,EAAK,YAAY3B,CAAQ,EACzBC,EAAW,QAAQ,CAAC4B,EAAGC,IAAMH,EAAK,aAAaG,EAAGD,CAAC,CAAC,EACpD3B,EAAc,QAAQ,CAAC2B,EAAGC,IAAMH,EAAK,gBAAgBG,EAAGD,CAAC,CAAC,EAC1DF,EAAK,KAAK9B,EAAG,cAAeA,EAAG,cAAe,EAAG,CAAC,EAClD8B,EAAK,IAAI,CACjB,CAAC,EAED9B,EAAG,SAAU,IAAM,CACX,IAAMkC,EAASlC,EAAG,GAClBM,GAAc,QAAQ,EACtBA,EAAe6B,GAAmBnC,EAAG,OAAQkC,EAAO,MAAOA,EAAO,MAAM,CAChF,CAAC,EAEDlC,EAAG,QAAS,IAAM,CACVM,GAAc,QAAQ,EACtB,OAAW,CAAE,OAAA8B,CAAO,IAAK7B,EAAW,IAAI,OAAO,EAAG6B,EAAO,QAAQ,EACjE,OAAW,CAAE,QAAAC,CAAQ,IAAKrB,EAAS,IAAI,OAAO,EAAGqB,EAAQ,QAAQ,EACjE,OAAW,CAAE,OAAAD,CAAO,IAAKrB,EAAS,IAAI,OAAO,EAAGqB,EAAO,QAAQ,CACvE,CAAC,EAQM,CAAE,SAAArB,EAAU,SAAAC,EAAU,WAAAT,EAAY,IAN7B,CAAC+B,EAA8BC,EAA6BC,IAAgC,CAChGrC,EAAWmC,EACXlC,EAAamC,EACblC,EAAgBmC,CACxB,CAE6C,CACrD,EClFO,IAAMC,GAAS,MAAOC,GAAW,CAChC,IAAIC,EAAW,GAEf,GADe,CAACD,EAAG,GACP,CACJ,IAAME,EAAMF,EAAG,GAAI,WAAW,QAAQ,EAChC,CAAE,OAAAG,EAAQ,OAAAC,CAAO,EAAI,MAAMC,GAAaH,EAAKF,EAAG,KAAK,EAC3DA,EAAG,CAAE,OAAAG,EAAQ,OAAAC,EAAQ,IAAAF,CAAI,CAAC,CAClC,CAEAF,EAAG,SAAU,IAAM,CACPC,GAAUK,EAAO,EACrBN,EAAG,QAAUA,EAAG,OAAO,qBAAqB,CACpD,CAAC,EAED,IAAMO,EAAUC,EAAc,EACxBC,EAAIC,GAAQV,EAAIO,CAAO,EACvBI,EAAIC,GAAQZ,EAAIO,EAAS,IAAON,EAAW,EAAK,EAChDK,EAAS,IAAM,CACbL,EAAW,GACX,IAAMY,EAAS,CAAE,QAAS,GAAO,GAAAb,EAAI,QAAAO,CAAQ,EACvCO,EAAKd,EAAG,GAAMe,EAAG,IAAIf,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAG,SAASa,CAAM,EAAKG,EAChEC,EAAKjB,EAAG,GAAMe,EAAG,IAAIf,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAG,OAAOa,CAAM,EAAKK,EAC9DC,EAAKnB,EAAG,GAAMe,EAAG,IAAIf,EAAG,EAAE,EAAIA,EAAG,GAAKA,EAAG,GAAG,QAAQa,CAAM,EAAK,GAC/DO,EAAIC,GAAerB,EAAG,OAAQA,EAAG,OAAQW,EAAE,WAAW,IAAI,OAAO,EAAGA,EAAE,SAAS,IAAI,OAAO,EAAGA,EAAE,SAAS,IAAI,OAAO,EAAGF,EAAE,SAAS,IAAI,OAAO,EAAGK,EAAIK,EAAIF,CAAE,EAC/JR,EAAE,IAAIW,EAAE,gBAAiBA,EAAE,UAAU,EACrCT,EAAE,IAAIS,EAAE,gBAAiBA,EAAE,WAAYA,EAAE,aAAa,CAC9D,EAEApB,EAAG,SAAU,IAAM,CACPA,EAAG,SAASA,EAAG,OAAO,MAAM,OAAO,CAACA,EAAG,QAAQ,OAAO,CAAC,CAAC,CACpE,CAAC,EAEDA,EAAG,QAAS,IAAM,CACVA,EAAG,OAAO,QAAQ,CAC1B,CAAC,CACT,EThCO,IAAMsB,GAAW,IACT,OAAO,OAAW,IAGpBC,GAAoB,IACrBD,GAAS,EAAU,GAChB,QAAS,UAGlBE,GAAeC,GACNA,EAAI,IAAMA,EAAI,MAAQA,EAAI,QAG5BC,GAAW,IAAIC,IAAwB,CAC5C,IAAMC,EAAKC,GAAM,CACT,SAAU,GACV,QAAS,GACT,QAAS,GACT,OAAQ,GACR,QAAS,GACT,QAAS,GACT,UAAW,GACX,KAAM,CAAC,EAAG,CAAC,EACX,MAAO,CAAC,EAAG,CAAC,EACZ,UAAW,QACX,OAAQ,CACAD,EAAG,QAAU,GACbA,EAAG,OAAS,GACZA,EAAG,MAAM,EACT,QAAQ,KAAK,cAAe,GAAG,SAAS,CAChD,CACR,CAAC,EAEGE,EAAQ,YAAY,IAAI,EAC5B,OAAAF,EAAG,MAAQG,GAAY,EACvBH,EAAG,MAAQI,GAAY,EAEvBJ,EAAG,UAAYK,EAAQ,CAACC,EAAGC,EAAG,IAAMP,EAAG,MAAM,IAAMA,EAAG,aAAaM,EAAGC,EAAG,CAAC,CAAC,EAAGP,CAAE,EAChFA,EAAG,SAAWK,EAAQ,CAACC,EAAGC,EAAGC,IAAOR,EAAG,MAAM,IAAMA,EAAG,YAAYM,EAAGC,EAAGC,CAAE,CAAC,EAAGR,CAAE,EAChFA,EAAG,QAAUK,EAAQ,CAACC,EAAGC,IAAMP,EAAG,MAAM,IAAMA,EAAG,WAAWM,EAAGC,CAAC,CAAC,EAAGP,CAAE,EACtEA,EAAG,QAAUK,EAAQ,CAACC,EAAGC,IAAMP,EAAG,MAAM,IAAMA,EAAG,WAAWM,EAAGC,CAAC,CAAC,EAAGP,CAAE,EACtEA,EAAG,QAAUK,EAAQ,CAACC,EAAGC,IAAMP,EAAG,MAAM,IAAMA,EAAG,WAAWM,EAAGC,CAAC,CAAC,EAAGP,CAAE,EACtEA,EAAG,QAAQ,CAAE,YAAaA,EAAG,KAAM,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAAE,CAAM,CAAC,EAE1DF,EAAG,QAAS,MAAOS,GAA0B,CACrCT,EAAG,GAAKJ,GAAYI,CAAE,GAAKS,GAAMV,EAAK,IAAIH,EAAW,EAAE,KAAK,OAAO,EACnE,IAAMc,EAAW,CAACV,EAAG,GACjBU,GAAY,CAACV,EAAG,WAAUA,EAAG,GAAK,SAAS,cAAc,QAAQ,GACrE,QAAWH,KAAOE,EACVC,EAAG,GAAKH,EAAI,IAAMA,EAAI,MAAQA,EAAI,UAAY,OAC9CG,EAAG,GAAKH,EAAI,IAAMA,EAAI,MAAQA,EAAI,SAAW,OAC7CG,EAAG,GAAKH,EAAI,IAAMA,EAAI,MAAQA,EAAI,QAAU,OAC5CG,EAAG,cAAgBH,EAAI,eAAiBA,EAAI,OAAS,EACrDG,EAAG,cAAgBH,EAAI,eAAiB,EACxCG,EAAG,cAAgBH,EAAI,eAAiB,KACxCG,EAAGH,CAAG,EACFc,EAAG,IAAId,EAAI,OAAO,IAAGG,EAAG,QAAUH,EAAI,SAAW,CAACF,GAAkB,GACpEK,EAAG,QAASY,EAAMZ,CAAE,EACnB,MAAMa,GAAOb,CAAE,EAChBH,EAAI,OAAOA,EAAI,MAAM,EAE7B,CAACG,EAAG,IAAMA,EAAG,UACjBA,EAAG,OAAO,EACVA,EAAG,MAAM,KACDA,EAAG,OAAO,EACHA,EAAG,OACjB,EACG,CAAAA,EAAG,WACHU,GAAU,SAAS,KAAK,YAAYV,EAAG,EAAE,EAC7C,OAAO,iBAAiB,SAAUA,EAAG,MAAM,EAC3CA,EAAG,GAAG,iBAAiB,YAAaA,EAAG,SAAS,GACxD,CAAC,EAEDA,EAAG,QAAS,IAAM,CACVA,EAAG,MAAM,KAAK,EACV,GAACA,EAAG,IAAMA,EAAG,YACjB,OAAO,oBAAoB,SAAUA,EAAG,MAAM,EAC9CA,EAAG,GAAG,oBAAoB,YAAaA,EAAG,SAAS,EAC3D,CAAC,EAEDA,EAAG,MAAQS,GAAiC,CAChCA,GACIT,EAAG,GAAKS,EACRT,EAAG,MAAM,GACVA,EAAG,MAAM,CACxB,CAAC,EAEDA,EAAG,SAAU,IAAM,CACX,IAAMc,EAAOd,EAAG,GAAG,eAAe,sBAAsB,EACxDA,EAAG,KAAK,CAAC,EAAIA,EAAG,GAAG,MAAQA,EAAG,OAASc,GAAM,OAAS,OAAO,WAC7Dd,EAAG,KAAK,CAAC,EAAIA,EAAG,GAAG,OAASA,EAAG,QAAUc,GAAM,QAAU,OAAO,YAChEd,EAAG,QAAQ,cAAeA,EAAG,IAAI,CACzC,CAAC,EAEDA,EAAG,YAAa,CAACe,EAASC,EAAID,EAAG,QAASE,EAAIF,EAAG,UAAY,CACrD,IAAMD,EAAOd,EAAG,GAAG,sBAAsB,EACzCA,EAAG,MAAM,CAAC,GAAKgB,EAAIF,EAAK,MAAQA,EAAK,MACrCd,EAAG,MAAM,CAAC,EAAI,EAAEiB,EAAIH,EAAK,KAAOA,EAAK,OAAS,EAC9Cd,EAAG,QAAQ,SAAUA,EAAG,KAAK,CACrC,CAAC,EAEDA,EAAG,SAAU,IAAM,CACXE,EAAQ,YAAY,IAAI,EAAI,IAC5BF,EAAG,QAAQ,QAASE,CAAK,EACzBF,EAAG,MAAM,MAAM,CACvB,CAAC,EAEMA,CACf,EAEOkB,GAAQpB","names":["durable","event","createFrame","createQueue","is","a","isFloat32","value","loadingImage","src","fun","el","loadingVideo","loadingTexture","is","isVideo","isValidStride","stride","calcStride","arrayLength","count","getStride","error","ret","GLSL_FS","GLSL_VS","WGSL_VS","WGSL_FS","nested","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createBuffer","data","array","buffer","updateBuffer","value","updateAttrib","loc","stride","updateInstance","updateUniform","is","l","createTexture","el","unit","isVideo","texture","createStorage","width","height","ping","pong","particleCount","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","storageSize","sqrt","size","x","y","z","yz","loseContext","ext","enableDepth","enableWireframe","compute","gl","c","_texture","_storage","units","nested","cs","is","pg","createProgram","GLSL_VS","size","storageSize","uniforms","key","storages","array","ping","pong","value","updateUniform","unit","createStorage","cleanStorage","attachments","loc","index","i","o","createAttachment","nested","graphic","gl","config","c","fs","is","GLSL_FS","vs","GLSL_VS","pg","createProgram","activeUnit","units","nested","uniforms","key","attributes","value","isInstance","getStride","createBuffer","a","updateBuffer","updateAttrib","updateInstance","updateUniform","src","location","unit","createTexture","loadingTexture","source","isVideo","render","webgl","gl","isInit","c","compute","graphic","loseContext","enableDepth","enableWireframe","nested","nested","createBinding","_uniform","_texture","_storage","_attrib","uniform","nested","group","binding","texture","storage","attrib","location","createDevice","c","log","signal","gpu","format","adapter","device","e","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","isInstance","componentSize","arrayStride","createBindGroup","uniforms","textures","storages","groups","ret","add","i","layout","layouts","bindings","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","createComputePipeline","cs","updatePipeline","bindGroups","computePipeline","graphicPipeline","bufferUsage","type","createBuffer","array","isFloat32","usage","size","updateBuffer","value","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","workgroupCount","particleCount","workgroupSize","is","x","y","z","compute","gl","bindings","pipeline","bindGroups","storages","nested","key","value","createBuffer","array","buffer","updateBuffer","pass","v","i","x","y","z","workgroupCount","_pipeline","_bindGroups","nested","graphic","gl","bindings","update","pipeline","bindGroups","vertexBuffers","depthTexture","attributes","nested","key","value","isInstance","stride","getStride","createBuffer","uniforms","textures","width","height","createTextureSampler","a","updateBuffer","is","u","src","t","loadingTexture","source","isVideo","render","pass","createDescriptor","v","i","canvas","createDepthTexture","buffer","texture","_pipeline","_bindGroups","_vertexBuffers","webgpu","gl","isUpdate","gpu","device","format","createDevice","update","binding","createBinding","c","compute","g","graphic","config","fs","is","WGSL_FS","vs","WGSL_VS","cs","p","updatePipeline","isServer","isWebGPUSupported","findElement","arg","createGL","args","gl","event","iTime","createQueue","createFrame","durable","k","v","at","el","isAppend","is","webgl","webgpu","rect","_e","x","y","src_default"]}
package/dist/native.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var G=(r,e)=>{for(var t in e)m(r,t,{get:e[t],enumerable:!0})},f=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of h(e))!g.call(r,a)&&a!==t&&m(r,a,{get:()=>e[a],enumerable:!(s=d(e,a))||s.enumerable});return r},n=(r,e,t)=>(f(r,e,"default"),t&&f(t,e,"default"));var L=r=>f(m({},"__esModule",{value:!0}),r);var i={};G(i,{useGL:()=>l});module.exports=L(i);var u=require("react"),o=require("./index.cjs");n(i,require("./index.cjs"),module.exports);var l=(r={})=>(0,u.useState)(()=>{let e=(0,o.isGL)(r)?r:(0,o.createGL)(r);return e.ref=t=>{e.el={},e({render(){t.flush(),t.endFrameEXP()}}),e.mount(),(()=>{e.width=t.drawingBufferWidth,e.height=t.drawingBufferHeight,e.resize()})()},e({isNative:!0})})[0];0&&(module.exports={useGL,...require("./index.cjs")});
1
+ "use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var r in e)a(t,r,{get:e[r],enumerable:!0})},f=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of d(e))!h.call(t,n)&&n!==r&&a(t,n,{get:()=>e[n],enumerable:!(s=p(e,n))||s.enumerable});return t},o=(t,e,r)=>(f(t,e,"default"),r&&f(r,e,"default"));var G=t=>f(a({},"__esModule",{value:!0}),t);var i={};g(i,{useGL:()=>L});module.exports=G(i);var m=require("react"),u=require("./index.cjs");o(i,require("./index.cjs"),module.exports);var L=(...t)=>(0,m.useState)(()=>{let e=(0,u.createGL)(...t);return e.isNative=!0,e.ref=r=>{e({render(){r.flush(),r.endFrameEXP()}}),e.mount(),(()=>{e.width=r.drawingBufferWidth,e.height=r.drawingBufferHeight,e.resize()})()},e()})[0];0&&(module.exports={useGL,...require("./index.cjs")});
2
2
  //# sourceMappingURL=native.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/native.ts"],"sourcesContent":["import { useState } from 'react' // @ts-ignore\n// import { Dimensions } from 'react-native'\nimport { createGL, isGL } from './index'\nimport type { GL } from './types'\nexport * from './index'\n\nexport const useGL = (props: Partial<GL> = {}) => {\n return useState(() => {\n const gl = isGL(props) ? props : createGL(props)\n gl.ref = (ctx: any) => {\n gl.el = {} as any\n gl({\n render() {\n ctx.flush()\n ctx.endFrameEXP()\n },\n })\n gl.mount()\n const resize = () => {\n gl.width = ctx.drawingBufferWidth\n gl.height = ctx.drawingBufferHeight\n gl.resize()\n }\n resize()\n // Dimensions.addEventListener('change', resize)\n }\n return gl({ isNative: true })\n })[0]\n}\n"],"mappings":"2dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAyB,iBAEzBC,EAA+B,uBAE/BC,EAAAN,EAAc,uBAJd,gBAMO,IAAME,EAAQ,CAACK,EAAqB,CAAC,OAC7B,YAAS,IAAM,CACd,IAAMC,KAAK,QAAKD,CAAK,EAAIA,KAAQ,YAASA,CAAK,EAC/C,OAAAC,EAAG,IAAOC,GAAa,CACfD,EAAG,GAAK,CAAC,EACTA,EAAG,CACK,QAAS,CACDC,EAAI,MAAM,EACVA,EAAI,YAAY,CACxB,CACR,CAAC,EACDD,EAAG,MAAM,GACM,IAAM,CACbA,EAAG,MAAQC,EAAI,mBACfD,EAAG,OAASC,EAAI,oBAChBD,EAAG,OAAO,CAClB,GACO,CAEf,EACOA,EAAG,CAAE,SAAU,EAAK,CAAC,CACpC,CAAC,EAAE,CAAC","names":["native_exports","__export","useGL","__toCommonJS","import_react","import_index","__reExport","props","gl","ctx"]}
1
+ {"version":3,"sources":["../src/native.ts"],"sourcesContent":["import { useState } from 'react'\nimport { createGL } from './index'\nimport type { GL } from './types'\nexport * from './index'\n\nexport const useGL = (...args: Partial<GL>[]) => {\n return useState(() => {\n const gl = createGL(...args)\n gl.isNative = true\n gl.ref = (ctx: any) => {\n gl({\n render() {\n ctx.flush()\n ctx.endFrameEXP()\n },\n })\n gl.mount()\n const resize = () => {\n gl.width = ctx.drawingBufferWidth\n gl.height = ctx.drawingBufferHeight\n gl.resize()\n }\n resize()\n // Dimensions.addEventListener('change', resize)\n }\n return gl()\n })[0]\n}\n"],"mappings":"2dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAyB,iBACzBC,EAAyB,uBAEzBC,EAAAN,EAAc,uBAHd,gBAKO,IAAME,EAAQ,IAAIK,OACV,YAAS,IAAM,CACd,IAAMC,KAAK,YAAS,GAAGD,CAAI,EAC3B,OAAAC,EAAG,SAAW,GACdA,EAAG,IAAOC,GAAa,CACfD,EAAG,CACK,QAAS,CACDC,EAAI,MAAM,EACVA,EAAI,YAAY,CACxB,CACR,CAAC,EACDD,EAAG,MAAM,GACM,IAAM,CACbA,EAAG,MAAQC,EAAI,mBACfD,EAAG,OAASC,EAAI,oBAChBD,EAAG,OAAO,CAClB,GACO,CAEf,EACOA,EAAG,CAClB,CAAC,EAAE,CAAC","names":["native_exports","__export","useGL","__toCommonJS","import_react","import_index","__reExport","args","gl","ctx"]}