glre 0.44.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 +41 -51
  3. package/dist/index.cjs +6 -6
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.ts +43 -91
  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 +51 -94
  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 +41 -52
  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 +43 -92
  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 +43 -92
  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 +6 -21
  33. package/src/node/create.ts +2 -4
  34. package/src/node/index.ts +8 -20
  35. package/src/node/types.ts +9 -1
  36. package/src/node/utils/index.ts +5 -25
  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 -11
  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/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![ npm version ](https://img.shields.io/npm/v/glre?style=flat&colorA=000&colorB=000)](https://www.npmjs.com/package/glre)
9
9
  [![ downloads ](https://img.shields.io/npm/dm/glre.svg?style=flat&colorA=000&colorB=000)](https://www.npmtrends.com/glre)
10
10
  [![ license MIT ](https://img.shields.io/npm/l/glre?style=flat&colorA=000&colorB=000)](https://github.com/tseijp/glre)
11
- [![ docs available ](https://img.shields.io/badge/docs-available-000.svg?style=flat&colorA=000)](https://glre.tsei.jp/>)
11
+ [![ docs available ](https://img.shields.io/badge/docs-available-000.svg?style=flat&colorA=000)](https://glre.dev)
12
12
  [![ bundle size ](https://img.shields.io/bundlephobia/minzip/glre?style=flat&colorA=000&colorB=000)](https://bundlephobia.com/package/glre@latest)
13
13
 
14
14
  glre is a simple glsl and wgsl Reactive Engine on the web and native via TypeScript, React, Solid and more.
@@ -101,7 +101,7 @@ npm install glre
101
101
  <tbody>
102
102
  <tr>
103
103
  <td width="7500px" align="center" valign="center">
104
- glre simplifies WebGl2 / WebGPU programming via TypeScript, React, Solid and more (<a href="https://codesandbox.io/s/glre-basic-demo-ppzo3d">live demo</a>).
104
+ glre simplifies WebGL2 / WebGPU programming via TypeScript, React, Solid and more (<a href="https://codesandbox.io/s/glre-basic-demo-ppzo3d">live demo</a>).
105
105
  </td>
106
106
  <td width="2500px" valign="top">
107
107
  <a href="https://codesandbox.io/s/glre-basic-demo-ppzo3d">
@@ -173,12 +173,10 @@ esm supported ([codesandbox demo](https://codesandbox.io/s/glre-basic-demo3-3bhr
173
173
  </summary>
174
174
 
175
175
  ```html
176
- <canvas id="canvas"></canvas>
177
176
  <script type="module">
178
177
  import { createGL } from 'https://esm.sh/glre'
179
- import { vec4, uv } from 'https://esm.sh/node'
180
- const el = document.getElementById('canvas')
181
- createGL({ el, fs: vec4(uv, 0, 1) }).mount()
178
+ import { vec4, uv } from 'https://esm.sh/glre/node'
179
+ createGL({ fs: vec4(uv, 0, 1) }).mount()
182
180
  </script>
183
181
  ```
184
182
 
@@ -285,26 +283,6 @@ const worldPosition = positions.transform(modelMatrix)
285
283
  const viewNormal = normals.transform(normalMatrix)
286
284
  ```
287
285
 
288
- ### Cross-Platform Transparency
289
-
290
- The system dissolves platform-specific shader languages into unified abstractions.
291
- WebGL2 GLSL and WebGPU WGSL become implementation details, hidden beneath consistent node operations.
292
-
293
- ```ts
294
- // Same code generates different targets
295
- const shader = {
296
- vertex: worldPosition.transform(projectionMatrix),
297
- fragment: lighting(worldNormal, worldPosition),
298
- }
299
-
300
- // Backend selection becomes transparent
301
- // WebGL2: Generates GLSL ES 3.0
302
- // WebGPU: Generates WGSL
303
- ```
304
-
305
- This architectural dissolution enables shader code to exist as pure mathematical relationships,
306
- freed from the constraints of traditional GPU programming models.
307
-
308
286
  ## PRs
309
287
 
310
288
  ###### welcome✨
package/dist/addons.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { EventState, Nested } from 'reev';
1
+ import * as reev from 'reev';
2
+ import { EventState } from 'reev';
2
3
  import { Queue, Frame } from 'refr';
3
4
 
4
5
  declare const CONVERSIONS: readonly ["toBool", "toUInt", "toInt", "toFloat", "toBVec2", "toIVec2", "toUVec2", "toVec2", "toBVec3", "toIVec3", "toUVec3", "toVec3", "toBVec4", "toIVec4", "toUVec4", "toVec4", "toColor", "toMat2", "toMat3", "toMat4"];
@@ -68,6 +69,28 @@ declare const OPERATOR_TYPE_RULES: readonly [readonly ["float", "vec2", "vec2"],
68
69
  */
69
70
  declare const FUNCTIONS: readonly [...("texture" | "all" | "any" | "determinant" | "distance" | "dot" | "length" | "lengthSq" | "luminance" | "cross" | "cubeTexture" | "texelFetch" | "textureLod")[], "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "cos", "cosh", "dFdx", "dFdy", "degrees", "exp", "exp2", "floor", "fract", "fwidth", "inverse", "inverseSqrt", "log", "log2", "negate", "normalize", "oneMinus", "radians", "reciprocal", "round", "sign", "sin", "sinh", "sqrt", "tan", "tanh", "trunc", "saturate", "atan2", "clamp", "max", "min", "mix", "pow", "reflect", "refract", "smoothstep", "step"];
70
71
 
72
+ /**
73
+ * binding
74
+ */
75
+ declare const createBinding: () => {
76
+ uniform: reev.Nested<{
77
+ group: number;
78
+ binding: number;
79
+ }, []>;
80
+ texture: reev.Nested<{
81
+ group: number;
82
+ binding: number;
83
+ }, []>;
84
+ storage: reev.Nested<{
85
+ group: number;
86
+ binding: number;
87
+ }, []>;
88
+ attrib: reev.Nested<{
89
+ location: number;
90
+ }, []>;
91
+ };
92
+ type Binding = ReturnType<typeof createBinding>;
93
+
71
94
  type GL = EventState<{
72
95
  /**
73
96
  * initial value
@@ -79,16 +102,17 @@ type GL = EventState<{
79
102
  isDebug: boolean;
80
103
  isDepth: boolean;
81
104
  wireframe: boolean;
82
- isGL: true;
83
105
  width?: number;
84
106
  height?: number;
85
107
  size: [number, number];
86
108
  mouse: [number, number];
87
109
  count: number;
110
+ triangleCount: number;
88
111
  instanceCount: number;
89
112
  particleCount: number | [number, number] | [number, number, number];
90
113
  precision: 'lowp' | 'mediump' | 'highp';
91
- loading: number;
114
+ element?: HTMLCanvasElement;
115
+ elem?: HTMLCanvasElement;
92
116
  el: HTMLCanvasElement;
93
117
  vs?: string | Vec4;
94
118
  cs?: string | Void;
@@ -99,11 +123,16 @@ type GL = EventState<{
99
123
  vertex?: string | Vec4;
100
124
  compute?: string | Void;
101
125
  fragment?: string | Vec4;
126
+ program: WebGLProgram;
127
+ gl: WebGL2RenderingContext;
128
+ gpu: GPUCanvasContext;
129
+ device: GPUDevice;
130
+ format: GPUTextureFormat;
131
+ encoder: GPUCommandEncoder;
132
+ binding: Binding;
102
133
  /**
103
134
  * core state
104
135
  */
105
- webgpu: WebGPUState;
106
- webgl: WebGLState;
107
136
  queue: Queue;
108
137
  frame: Frame;
109
138
  /**
@@ -116,7 +145,6 @@ type GL = EventState<{
116
145
  render(): void;
117
146
  resize(e?: Event): void;
118
147
  mousemove(e: MouseEvent): void;
119
- loop(): void;
120
148
  /**
121
149
  * setter
122
150
  */
@@ -150,50 +178,6 @@ type Uniform = number | number[] | Float32Array;
150
178
  type Texture$1 = string | HTMLImageElement | HTMLVideoElement;
151
179
  type Attribute = number[] | Float32Array;
152
180
  type Storage = number[] | Float32Array;
153
- /**
154
- * for webgpu
155
- */
156
- interface UniformData {
157
- array: Float32Array;
158
- buffer: GPUBuffer;
159
- binding: number;
160
- group: number;
161
- }
162
- interface TextureData {
163
- binding: number;
164
- group: number;
165
- texture: GPUTexture;
166
- sampler: GPUSampler;
167
- view: GPUTextureView;
168
- }
169
- interface AttribData {
170
- array: Float32Array;
171
- buffer: GPUBuffer;
172
- location: number;
173
- stride: number;
174
- isInstance?: boolean;
175
- }
176
- interface StorageData {
177
- array: Float32Array;
178
- buffer: GPUBuffer;
179
- binding: number;
180
- group: number;
181
- }
182
- interface WebGPUState {
183
- device: GPUDevice;
184
- uniforms: Nested<UniformData>;
185
- textures: Nested<TextureData>;
186
- attribs: Nested<AttribData>;
187
- storages: Nested<StorageData>;
188
- }
189
- /**
190
- * for webgl
191
- */
192
- interface WebGLState {
193
- context: WebGL2RenderingContext;
194
- program: WebGLProgram;
195
- uniforms: Nested<WebGLUniformLocation | null>;
196
- }
197
181
 
198
182
  type Constants = (typeof CONSTANTS)[number] | 'void';
199
183
  type Conversions = (typeof CONVERSIONS)[number];
@@ -235,6 +219,7 @@ interface NodeProps {
235
219
  }
236
220
  interface NodeContext {
237
221
  gl?: Partial<GL>;
222
+ binding?: Binding;
238
223
  label?: 'vert' | 'frag' | 'compute';
239
224
  isWebGL?: boolean;
240
225
  units?: any;
@@ -245,7 +230,7 @@ interface NodeContext {
245
230
  fragInputs: Map<string, string>;
246
231
  vertInputs: Map<string, string>;
247
232
  vertOutputs: Map<string, string>;
248
- vertVaryings: Map<string, string>;
233
+ vertVaryings: Map<string, VaryingInfo>;
249
234
  computeInputs: Map<string, string>;
250
235
  dependencies: Map<string, Set<string>>;
251
236
  structStructFields: Map<string, StructFields>;
@@ -341,6 +326,10 @@ type Mat4 = XImpl<'mat4'>;
341
326
  type Texture = XImpl<'texture'>;
342
327
  type Sampler2D = XImpl<'sampler2D'>;
343
328
  type StructBase = XImpl<'struct'>;
329
+ interface VaryingInfo {
330
+ node: Y;
331
+ code?: string;
332
+ }
344
333
  type Struct<T extends StructFields = any> = Omit<StructBase, keyof T> & {
345
334
  [K in keyof T]: T[K] extends X<infer U> ? X<U> : never;
346
335
  } & {
@@ -382,6 +371,7 @@ type XImpl<T extends C> = _X<T> & {
382
371
  };
383
372
  type C = Constants;
384
373
  type X<T extends C = C> = T extends keyof ConstantsToType ? ConstantsToType[T] : _X<T>;
374
+ type Y<T extends C = C> = number | number[] | string | boolean | undefined | HTMLElement | X<T>;
385
375
  type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element' | 'select';
386
376
  interface _X<T extends C> {
387
377
  readonly __nodeType?: T;
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var X=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var Le=Object.prototype.hasOwnProperty;var _e=(e,t)=>{for(var r in t)X(e,r,{get:t[r],enumerable:!0})},he=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ye(t))!Le.call(e,o)&&o!==r&&X(e,o,{get:()=>t[o],enumerable:!(n=Ge(t,o))||n.enumerable});return e};var Re=e=>he(X({},"__esModule",{value:!0}),e);var Ce={};_e(Ce,{createGL:()=>Te,default:()=>Me,isGL:()=>De,isServer:()=>xe,isWebGPUSupported:()=>Ee});module.exports=Re(Ce);var S=require("reev"),I=require("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 H=e=>e instanceof Float32Array,Ue=(e,t)=>{let r=new Image;Object.assign(r,{src:e,crossOrigin:"anonymous"}),r.decode().then(()=>t(r))},ve=(e,t)=>{let r=document.createElement("video");r.crossOrigin="anonymous",r.muted=!0,r.loop=!0,r.src=e,r.load(),r.play(),r.addEventListener("canplay",t.bind(null,r),{once:!0})};function M(e,t){if(!T.str(e))return t(e,e instanceof HTMLVideoElement);let r=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(r?ve:Ue)(e,o=>{t(o,r)})}var Pe=e=>[1,2,3,4,9,16].includes(e),Ae=(e,t=3)=>e%t===0?Math.floor(e/t):-1,C=(e,t=1,r=console.warn)=>{let n=Ae(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},$=`
1
+ "use strict";var F=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Te=Object.prototype.hasOwnProperty;var Ee=(e,t)=>{for(var r in t)F(e,r,{get:t[r],enumerable:!0})},ge=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xe(t))!Te.call(e,o)&&o!==r&&F(e,o,{get:()=>t[o],enumerable:!(n=le(t,o))||n.enumerable});return e};var Ge=e=>ge(F({},"__esModule",{value:!0}),e);var Fe={};Ee(Fe,{createGL:()=>be,default:()=>Se,isServer:()=>de,isWebGPUSupported:()=>ce});module.exports=Ge(Fe);var E=require("reev"),S=require("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 I=e=>e instanceof Float32Array,ye=(e,t)=>{let r=new Image;Object.assign(r,{src:e,crossOrigin:"anonymous"}),r.decode().then(()=>t(r))},Le=(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 h(e,t){if(!b.str(e))return t(e,e instanceof HTMLVideoElement);let r=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(r?Le:ye)(e,o=>{t(o,r)})}var he=e=>[1,2,3,4,9,16].includes(e),Re=(e,t=3)=>e%t===0?Math.floor(e/t):-1,R=(e,t=1,r=console.warn)=>{let n=Re(e,t);return he(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},W=`
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
- `,V=`
10
+ `,v=`
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
- }`,K=`
16
+ }`,X=`
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(),Y=`
27
+ `.trim(),V=`
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
- `;var B=require("reev");var j=(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
+ `;var U=require("reev");var N=(e,t,r,n=console.warn)=>{let o=e.createShader(r);if(!o)return n("Failed to create shader");if(e.shaderSource(o,t.trim()),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))return o;let 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}`)},N=(e,t,r,n)=>{let o=e.createProgram(),i=j(e,t,e.FRAGMENT_SHADER,n.error),a=j(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}`)},Q=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},O=(e,t,r,n)=>{t.set(n),e.bindBuffer(e.ARRAY_BUFFER,r),e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null)},J=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0)},Z=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0),e.vertexAttribDivisor(t,1)},z=(e,t,r)=>{if(T.num(r))return e.uniform1f(t,r);let n=r.length;if(n<=4)return e[`uniform${n}fv`](t,r);n=Math.sqrt(n)<<0,e[`uniformMatrix${n}fv`](t,!1,r)},ee=(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)}},te=(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)},re=(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)},ne=(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},oe=(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 we=(e,t)=>{if(!e.cs)return null;t.getExtension("EXT_color_buffer_float");let r=0,n=0,o=(0,B.nested)(()=>r++),i=T.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),a=N(t,i,V,e),s=oe(e.particleCount),f=(0,B.nested)(b=>t.getUniformLocation(a,b)),u=(0,B.nested)(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 ne(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),re(t,u.map.values())},_uniform:(b,_)=>{t.useProgram(a),z(t,f(b),_)},_storage:(b,_)=>{let{ping:U,pong:m,unit:g,array:h}=u(b);te(t,_,s.x,s.y,U,m,g,h)},storages:u}},ie=async e=>{let t={isWebGL:!0,gl:e},r=e.webgl.context=e.el.getContext("webgl2"),n=we(e,r),o=e.fs?T.str(e.fs)?e.fs:e.fs.fragment(t):$,i=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(t):V,a=e.webgl.program=N(r,o,i,e);r.useProgram(a);let s=0,f=(0,B.nested)(()=>s++),u=e.webgl.uniforms=(0,B.nested)(m=>r.getUniformLocation(a,m)),d=(0,B.nested)((m,g,h=!1)=>{let R=C(g.length,h?e.instanceCount:e.count,e.error),v=r.getAttribLocation(a,m),{array:P,buffer:q}=Q(r,g);return{array:P,buffer:q,location:v,stride:R}}),x=(m="",g)=>{let{array:h,buffer:R,location:v,stride:P}=d(m,g);O(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);O(r,h,R,g),Z(r,v,P,R)},L=(m,g)=>{r.useProgram(a),z(r,u(m),g),n?._uniform(m,g)},b=(m,g)=>{e.loading++,r.useProgram(a),M(g,(h,R)=>{let v=f(m),P=ee(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}};var D=require("reev");var ae=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}},se=()=>{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}}}},Se=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",ue=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:Se(s)}]}}return{vertexBuffers:t,bufferLayouts:r}},fe=(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},me=(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"}}),ce=(e,t,r)=>e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})}),Be=e=>e==="uniform"?72:e==="attrib"?40:140,W=(e,t,r)=>{H(t)||(t=new Float32Array(t));let n=Be(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,i=e.createBuffer({size:o,usage:n});return{array:t,buffer:i}},pe=(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"}}),de=(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}},le=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT}),be=(e,t=32)=>{T.num(e)&&(e=[e]);let[r,n=1,o=1]=e;return{x:Math.min(r*n*o/t,65535),y:1,z:1}};var Fe=(e,t,r)=>{let n=u=>{},o=(0,D.nested)((u,d)=>{let{array:x,buffer:y}=W(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=ce(t,d,x);n=L=>{L.setPipeline(y),u.forEach((m,g)=>L.setBindGroup(g,m));let{x:b,y:_,z:U}=be(e.particleCount);L.dispatchWorkgroups(b,_,U),L.end()}},render:u=>{n(u)},clean:()=>{for(let{buffer:u}of o.map.values())u.destroy()}}},ge=async e=>{let t=e.el.getContext("webgpu"),{device:r,format:n}=await ae(t,e.error),o=se(),i=Fe(e,r,o),a,s,f,u=c=>{},d=!0,x,y=(0,D.nested)((c,p,l=!1)=>{d=!0;let E=C(p.length,l?e.instanceCount:e.count),{location:A}=o.attrib(),{array:G,buffer:w}=W(r,p,"attrib");return{array:G,buffer:w,location:A,stride:E,isInstance:l}}),L=(0,D.nested)((c,p)=>{d=!0;let{binding:l,group:E}=o.uniform(),{array:A,buffer:G}=W(r,p,"uniform");return{array:A,buffer:G,binding:l,group:E}}),b=(0,D.nested)((c,p=0,l=0)=>{d=!0;let{binding:E,group:A}=o.texture(),{texture:G,sampler:w}=de(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++,M(p,(l,E)=>{let[A,G]=E?[l.videoWidth,l.videoHeight]:[l.width,l.height],{texture:w}=b(c,A,G),F=()=>{r.queue.copyExternalImageToTexture({source:l},{texture:w},{width:A,height:G})};F(),E&&e({loop:F}),e.loading--})},h=()=>{let{vertexBuffers:c,bufferLayouts:p}=ue(y.map.values()),{bindGroups:l,bindGroupLayouts:E}=fe(r,L.map.values(),b.map.values(),i.storages.map.values()),A=me(r,n,p,E,f,a);u=G=>{G.setPipeline(A),l.forEach((w,F)=>G.setBindGroup(F,w)),c.forEach((w,F)=>G.setVertexBuffer(F,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):Y,f=e.vs?T.str(e.vs)?e.vs:e.vs.vertex(p):K,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(pe(t,x))),r.queue.submit([c.finish()])},v=()=>{let c=e.el;x?.destroy(),x=le(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 De=e=>T.obj(e)?"isGL"in e:!1,xe=()=>typeof window>"u",Ee=()=>xe()?!1:"gpu"in navigator,k=performance.now(),Te=e=>{let t=(0,S.event)({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=(0,I.createQueue)(),t.frame=(0,I.createFrame)(),t.attribute=(0,S.durable)((r,n,o)=>t.queue(()=>t._attribute?.(r,n,o)),t),t.instance=(0,S.durable)((r,n,o)=>t.queue(()=>t._instance?.(r,n,o)),t),t.storage=(0,S.durable)((r,n)=>t.queue(()=>t._storage?.(r,n)),t),t.uniform=(0,S.durable)((r,n)=>t.queue(()=>t._uniform?.(r,n)),t),t.texture=(0,S.durable)((r,n)=>t.queue(()=>t._texture?.(r,n)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:k}),t("mount",async()=>{Ee()||(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 ie(t)):t(await ge(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",()=>{k=performance.now()/1e3,t.uniform("iTime",k)}),t(e)},Me=Te;0&&(module.exports={createGL,isGL,isServer,isWebGPUSupported});
37
+ ${t}`)},_=(e,t,r,n)=>{let o=e.createProgram(),i=N(e,t,e.FRAGMENT_SHADER,n.error),u=N(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}`)},O=(e,t)=>{let r=new Float32Array(t),n=e.createBuffer();return{array:r,buffer:n}},D=(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)},z=(e,t,r,n)=>{e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0)},H=(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)},P=(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)},w=(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)}},k=(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)},$=(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)},q=(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},K=(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}},Y=e=>{let t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()},j=e=>{e.enable(e.DEPTH_TEST),e.depthFunc(e.LEQUAL),e.enable(e.CULL_FACE),e.cullFace(e.BACK)},Q=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=(0,U.nested)(()=>r++),i=b.str(e.cs)?e.cs:e.cs.compute({isWebGL:!0,gl:e,units:o}),u=_(t,i,v,e),s=K(e.particleCount),p=(0,U.nested)(m=>t.getUniformLocation(u,m)),d=(0,U.nested)(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),P(t,p(m),a)}),e("_storage",(m,a)=>{t.useProgram(e.program=u);let{ping:f,pong:c,unit:l,array:x}=d(m);k(t,a,s.x,s.y,f,c,l,x)}),e("clean",()=>{t.deleteProgram(u),$(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 q(t,T,G,c,l,x)});t.drawBuffers(m),t.drawArrays(t.TRIANGLES,0,3),t.bindFramebuffer(t.FRAMEBUFFER,null),n++})};var A=require("reev");var Z=e=>{let t={isWebGL:!0,gl:e},r=e.gl,n=e.fs?b.str(e.fs)?e.fs:e.fs.fragment(t):W,o=e.vs?b.str(e.vs)?e.vs:e.vs.vertex(t):v,i=_(r,n,o,e),u=0,s=(0,A.nested)(()=>u++),p=(0,A.nested)(m=>r.getUniformLocation(i,m)),d=(0,A.nested)((m,a,f=!1)=>({stride:R(a.length,f?e.instanceCount:e.triangleCount,e.error),location:r.getAttribLocation(i,m),...O(r,a)}));e("_attribute",(m,a)=>{r.useProgram(e.program=i);let f=d(m,a);D(r,f.array,f.buffer,a),z(r,f.location,f.stride,f.buffer)}),e("_instance",(m,a)=>{r.useProgram(e.program=i);let f=d(m,a,!0);D(r,f.array,f.buffer,a),H(r,f.location,f.stride,f.buffer)}),e("_uniform",(m,a)=>{r.useProgram(e.program=i),P(r,p(m),a)}),e("_texture",(m,a)=>{r.useProgram(e.program=i);let f=p(m),c=s(m);w(r,null,f,c,!1),h(a,(l,x)=>{r.useProgram(e.program=i);let T=w(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 ee=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),Z(e),t&&(e("clean",()=>Y(e.gl)),e.isDepth&&j(e.gl),e.wireframe&&Q(e.gl))};var se=require("reev");var y=require("reev");var te=()=>{let e=0,t=0,r=0,n=0,o=(0,y.nested)(()=>{let p=Math.floor(e/12),d=e%12;return e++,{group:p,binding:d}}),i=(0,y.nested)(()=>{let d=Math.floor(e/12)+1+Math.floor(t/6),m=t%6*2;return t++,{group:d,binding:m}}),u=(0,y.nested)(()=>{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=(0,y.nested)(()=>{let p=n;return n++,{location:p}});return{uniform:o,texture:i,storage:u,attrib:s}},re=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}},ve=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",_e=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:ve(s)}]}}return{vertexBuffers:t,bufferLayouts:r}},Pe=(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},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"}}),Ae=(e,t,r)=>{if(r)return e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:r.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})})},ne=(e,t,r,n,o,i,u,s,p)=>{let{vertexBuffers:d,bufferLayouts:m}=_e(r),{bindGroups:a,bindGroupLayouts:f}=Pe(e,n,o,i),c=Ae(e,f,s),l=Ue(e,t,m,f,p,u);return{bindGroups:a,vertexBuffers:d,computePipeline:c,graphicPipeline:l}},Be=e=>e==="uniform"?72:e==="attrib"?40:140,L=(e,t,r)=>{I(t)||(t=new Float32Array(t));let n=Be(r),o=r==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,i=e.createBuffer({size:o,usage:n});return{array:t,buffer:i}},g=(e,t,r,n)=>{r.set(t),e.queue.writeBuffer(n,0,r)},oe=(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"}}),C=(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()}},ie=(e,t,r)=>e.createTexture({size:[t,r],format:"depth24plus",usage:16}),ae=(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 ue=(e,t)=>{let r,n,o=(0,se.nested)((u,s)=>({...t.storage(u),...L(e.device,s,"storage")}));return e("_storage",(u,s)=>{let{array:p,buffer:d}=o(u,s);g(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}=ae(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}}};var B=require("reev");var fe=(e,t,r=()=>{})=>{let n,o,i,u,s=(0,B.nested)((a,f,c=!1,l=R(f.length,c?e.instanceCount:e.triangleCount))=>(r(),{...t.attrib(a),...L(e.device,f,"attrib"),isInstance:c,stride:l})),p=(0,B.nested)((a,f)=>(r(),{...t.uniform(a),...L(e.device,f,"uniform")})),d=(0,B.nested)((a,f=1,c=1)=>(r(),{...t.texture(a),...C(e.device,f,c)}));return e("_attribute",(a,f)=>{let c=s(a,f);g(e.device,f,c.array,c.buffer)}),e("_instance",(a,f)=>{let c=s(a,f,!0);g(e.device,f,c.array,c.buffer)}),e("_uniform",(a,f)=>{b.num(f)&&(f=[f]);let c=p(a,f);g(e.device,f,c.array,c.buffer)}),e("_texture",(a,f)=>{let c=d(a);h(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,C(e.device,T,G)),r());let M=()=>void e.device.queue.copyExternalImageToTexture({source:l},{texture:c.texture},{width:T,height:G});x?e({render:M}):M()})}),e("render",()=>{if(!n||!o||!i)return;let a=e.encoder.beginRenderPass(oe(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=ie(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 me=async e=>{let t=!1;if(!e.gl){let s=e.el.getContext("webgpu"),{device:p,format:d}=await re(s,e.error);e({device:p,format:d,gpu:s})}e("render",()=>{t&&u(),e.encoder=e.device.createCommandEncoder()});let n=te(),o=ue(e,n),i=fe(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):V,d=e.vs?b.str(e.vs)?e.vs:e.vs.vertex(s):X,m=e.cs?b.str(e.cs)?e.cs:e.cs.compute(s):"",a=ne(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 de=()=>typeof window>"u",ce=()=>de()?!1:"gpu"in navigator,pe=e=>e.el||e.elem||e.element,be=(...e)=>{let t=(0,E.event)({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=(0,S.createQueue)(),t.frame=(0,S.createFrame)(),t.attribute=(0,E.durable)((n,o,i)=>t.queue(()=>t._attribute?.(n,o,i)),t),t.instance=(0,E.durable)((n,o,i)=>t.queue(()=>t._instance?.(n,o,i)),t),t.storage=(0,E.durable)((n,o)=>t.queue(()=>t._storage?.(n,o)),t),t.texture=(0,E.durable)((n,o)=>t.queue(()=>t._texture?.(n,o)),t),t.uniform=(0,E.durable)((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=pe(t)||n||e.map(pe).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||!ce()),t.isWebGL?ee(t):await me(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},Se=be;0&&(module.exports={createGL,isServer,isWebGPUSupported});
38
38
  //# sourceMappingURL=index.cjs.map