glre 0.47.0 → 0.49.1

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.
package/dist/index.d.ts CHANGED
@@ -29,8 +29,54 @@ declare const TYPE_MAPPING: {
29
29
  readonly struct: "struct";
30
30
  };
31
31
  declare const CONSTANTS: (keyof typeof TYPE_MAPPING)[];
32
+ declare const SWIZZLE_BASE_MAP: {
33
+ readonly float: "float";
34
+ readonly vec2: "float";
35
+ readonly vec3: "float";
36
+ readonly vec4: "float";
37
+ readonly int: "int";
38
+ readonly ivec2: "int";
39
+ readonly ivec3: "int";
40
+ readonly ivec4: "int";
41
+ readonly uint: "uint";
42
+ readonly uvec2: "uint";
43
+ readonly uvec3: "uint";
44
+ readonly uvec4: "uint";
45
+ readonly bool: "bool";
46
+ readonly bvec2: "bool";
47
+ readonly bvec3: "bool";
48
+ readonly bvec4: "bool";
49
+ };
50
+ declare const SWIZZLE_RESULT_MAP: {
51
+ float: {
52
+ readonly 1: "float";
53
+ readonly 2: "vec2";
54
+ readonly 3: "vec3";
55
+ readonly 4: "vec4";
56
+ readonly 9: "mat3";
57
+ readonly 16: "mat4";
58
+ };
59
+ int: {
60
+ readonly 1: "int";
61
+ readonly 2: "ivec2";
62
+ readonly 3: "ivec3";
63
+ readonly 4: "ivec4";
64
+ };
65
+ uint: {
66
+ readonly 1: "uint";
67
+ readonly 2: "uvec2";
68
+ readonly 3: "uvec3";
69
+ readonly 4: "uvec4";
70
+ };
71
+ bool: {
72
+ readonly 1: "bool";
73
+ readonly 2: "bvec2";
74
+ readonly 3: "bvec3";
75
+ readonly 4: "bvec4";
76
+ };
77
+ };
32
78
  declare const OPERATORS: {
33
- readonly not: "";
79
+ readonly not: "!";
34
80
  readonly add: "+";
35
81
  readonly sub: "-";
36
82
  readonly mul: "*";
@@ -69,28 +115,6 @@ declare const OPERATOR_TYPE_RULES: readonly [readonly ["float", "vec2", "vec2"],
69
115
  */
70
116
  declare const FUNCTIONS: readonly [...("texture" | "all" | "any" | "determinant" | "distance" | "dot" | "length" | "lengthSq" | "luminance" | "cross" | "cubeTexture" | "texelFetch" | "textureLod")[], "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "cos", "cosh", "dFdx", "dFdy", "degrees", "exp", "exp2", "floor", "fract", "fwidth", "inverse", "inverseSqrt", "log", "log2", "negate", "normalize", "oneMinus", "radians", "reciprocal", "round", "sign", "sin", "sinh", "sqrt", "tan", "tanh", "trunc", "saturate", "atan2", "clamp", "max", "min", "mix", "pow", "reflect", "refract", "smoothstep", "step"];
71
117
 
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
-
94
118
  type Constants = (typeof CONSTANTS)[number] | 'void';
95
119
  type Conversions = (typeof CONVERSIONS)[number];
96
120
  type Functions = (typeof FUNCTIONS)[number];
@@ -100,7 +124,7 @@ type Operators = (typeof OPERATOR_KEYS)[number];
100
124
  */
101
125
  interface FnLayout {
102
126
  name: string;
103
- type: C | 'auto';
127
+ type?: C | 'auto';
104
128
  inputs?: Array<{
105
129
  name: string;
106
130
  type: C | 'auto';
@@ -123,7 +147,6 @@ interface NodeProps {
123
147
  }
124
148
  interface NodeContext {
125
149
  gl?: Partial<GL>;
126
- binding?: Binding;
127
150
  label?: 'vert' | 'frag' | 'compute';
128
151
  isWebGL?: boolean;
129
152
  units?: any;
@@ -140,6 +163,15 @@ interface NodeContext {
140
163
  structStructFields: Map<string, StructFields>;
141
164
  };
142
165
  }
166
+ /**
167
+ * swizzle
168
+ */
169
+ type _SwizzleLength<A extends string> = A extends `${infer _}${infer A}` ? A extends '' ? 1 : A extends `${infer _}${infer B}` ? B extends '' ? 2 : B extends `${infer _}${infer C}` ? C extends '' ? 3 : 4 : never : never : never;
170
+ type _SwizzleBaseMap = typeof SWIZZLE_BASE_MAP;
171
+ type _SwizzleResultMap = typeof SWIZZLE_RESULT_MAP;
172
+ type _SwizzleBase<T extends C> = T extends keyof _SwizzleBaseMap ? _SwizzleBaseMap[T] : never;
173
+ type _SwizzleResult<T extends C, L extends 1 | 2 | 3 | 4> = _SwizzleResultMap[_SwizzleBase<T>][L];
174
+ type InferSwizzleType<T extends C, S extends string> = _SwizzleLength<S> extends infer L extends 1 | 2 | 3 | 4 ? _SwizzleResult<_SwizzleBase<T>, L> : never;
143
175
  /**
144
176
  * infer
145
177
  */
@@ -150,57 +182,6 @@ type ExtractPairs<T> = T extends readonly [infer L, infer R, string] ? [L, R] |
150
182
  type OperatorTypeRules = ExtractPairs<_OperatorTypeRulesMap[number]>;
151
183
  type IsInRules<L extends C, R extends C> = [L, R] extends OperatorTypeRules ? 1 : 0;
152
184
  type ValidateOperator<L extends C, R extends C> = L extends R ? 1 : IsInRules<L, R>;
153
- /**
154
- * swizzle
155
- */
156
- type _SwizzleLength<A extends string> = A extends `${infer _}${infer A}` ? A extends '' ? 1 : A extends `${infer _}${infer B}` ? B extends '' ? 2 : B extends `${infer _}${infer C}` ? C extends '' ? 3 : 4 : never : never : never;
157
- type _SwizzleBaseMap = {
158
- float: 'float';
159
- vec2: 'float';
160
- vec3: 'float';
161
- vec4: 'float';
162
- int: 'int';
163
- ivec2: 'int';
164
- ivec3: 'int';
165
- ivec4: 'int';
166
- uint: 'uint';
167
- uvec2: 'uint';
168
- uvec3: 'uint';
169
- uvec4: 'uint';
170
- bool: 'bool';
171
- bvec2: 'bool';
172
- bvec3: 'bool';
173
- bvec4: 'bool';
174
- };
175
- type _SwizzleResultMap = {
176
- float: {
177
- 1: 'float';
178
- 2: 'vec2';
179
- 3: 'vec3';
180
- 4: 'vec4';
181
- };
182
- int: {
183
- 1: 'int';
184
- 2: 'ivec2';
185
- 3: 'ivec3';
186
- 4: 'ivec4';
187
- };
188
- uint: {
189
- 1: 'uint';
190
- 2: 'uvec2';
191
- 3: 'uvec3';
192
- 4: 'uvec4';
193
- };
194
- bool: {
195
- 1: 'bool';
196
- 2: 'bvec2';
197
- 3: 'bvec3';
198
- 4: 'bvec4';
199
- };
200
- };
201
- type _SwizzleBase<T extends C> = T extends keyof _SwizzleBaseMap ? _SwizzleBaseMap[T] : never;
202
- type _SwizzleResult<T extends C, L extends 1 | 2 | 3 | 4> = _SwizzleResultMap[_SwizzleBase<T>][L];
203
- type InferSwizzleType<T extends C, S extends string> = _SwizzleLength<S> extends infer L extends 1 | 2 | 3 | 4 ? _SwizzleResult<_SwizzleBase<T>, L> : never;
204
185
  /**
205
186
  * Swizzles
206
187
  */
@@ -408,6 +389,28 @@ interface _X<T extends C> {
408
389
  step<U extends C>(edge: number | X<U>): X<InferOperator<T, U>>;
409
390
  }
410
391
 
392
+ /**
393
+ * binding
394
+ */
395
+ declare const createBinding: () => {
396
+ uniform: reev.Nested<{
397
+ group: number;
398
+ binding: number;
399
+ }, []>;
400
+ texture: reev.Nested<{
401
+ group: number;
402
+ binding: number;
403
+ }, []>;
404
+ storage: reev.Nested<{
405
+ group: number;
406
+ binding: number;
407
+ }, []>;
408
+ attrib: reev.Nested<{
409
+ location: number;
410
+ }, []>;
411
+ };
412
+ type Binding = ReturnType<typeof createBinding>;
413
+
411
414
  type GL = EventState<{
412
415
  /**
413
416
  * initial value
@@ -445,7 +448,9 @@ type GL = EventState<{
445
448
  gpu: GPUCanvasContext;
446
449
  device: GPUDevice;
447
450
  format: GPUTextureFormat;
448
- encoder: GPUCommandEncoder;
451
+ passEncoder: GPURenderPassEncoder;
452
+ commandEncoder: GPUCommandEncoder;
453
+ depthTexture?: GPUTexture;
449
454
  binding: Binding;
450
455
  /**
451
456
  * core state
@@ -499,10 +504,10 @@ type Storage = number[] | Float32Array;
499
504
  * for webgpu
500
505
  */
501
506
  interface UniformData {
502
- array: Float32Array;
503
- buffer: GPUBuffer;
504
507
  binding: number;
505
508
  group: number;
509
+ array: Float32Array;
510
+ buffer: GPUBuffer;
506
511
  }
507
512
  interface TextureData {
508
513
  binding: number;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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=`
1
+ import{durable as G,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 n=new Image;Object.assign(n,{src:e,crossOrigin:"anonymous"}),n.decode().then(()=>t(n))},me=(e,t)=>{let n=document.createElement("video");Object.assign(n,{src:e,loop:!0,muted:!0,crossOrigin:"anonymous"}),n.load(),n.play(),n.addEventListener("canplay",t.bind(null,n),{once:!0})};function h(e,t){if(!b.str(e))return t(e,e instanceof HTMLVideoElement);let n=/\.(mp4|webm|ogg|avi|mov)$/i.test(e);(n?me:fe)(e,o=>{t(o,n)})}var pe=e=>[1,2,3,4,9,16].includes(e),de=(e,t=3)=>e%t===0?Math.floor(e/t):-1,R=(e,t=1,n=console.warn,r="")=>{let o=de(e,t);return pe(o)||n(`glre attribute error: Invalid attribute length ${e}, ${r?`${r} `:" "}must divide by vertex count (${t}) with valid stride (1,2,3,4,9,16)`),o},I=`
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
- `,R=`
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
- }`,I=`
16
+ }`,M=`
17
17
  struct In { @builtin(vertex_index) vertex_index: u32 }
18
18
  struct Out { @builtin(position) position: vec4f }
19
19
  @vertex
@@ -31,8 +31,8 @@ struct Out { @builtin(position) position: vec4f }
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 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}
34
+ `;import{nested as D}from"reev";var X=(e,t,n,r=console.warn)=>{let o=e.createShader(n);if(!o)return r("Failed to create shader");if(e.shaderSource(o,t.trim()),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS))return o;let s=e.getShaderInfoLog(o);e.deleteShader(o),r(`Could not compile shader: ${s}
35
35
 
36
36
  \u2193\u2193\u2193generated\u2193\u2193\u2193
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};
37
+ ${t}`)},_=(e,t,n,r)=>{let o=e.createProgram(),s=X(e,t,e.FRAGMENT_SHADER,r.error),i=X(e,n,e.VERTEX_SHADER,r.error);if(!s||!i)return;if(e.attachShader(o,s),e.attachShader(o,i),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;let u=e.getProgramInfoLog(o);e.deleteProgram(o),r.error(`Could not link program: ${u}`)},V=(e,t)=>{let n=new Float32Array(t),r=e.createBuffer();return{array:n,buffer:r}},A=(e,t,n,r)=>{t.set(r),e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null)},N=(e,t,n,r)=>{e.bindBuffer(e.ARRAY_BUFFER,r),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,n,e.FLOAT,!1,0,0)},O=(e,t,n,r)=>{e.bindBuffer(e.ARRAY_BUFFER,r),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,n,e.FLOAT,!1,0,0),e.vertexAttribDivisor(t,1)},P=(e,t,n)=>{if(b.nul(t))return;if(b.num(n))return e.uniform1f(t,n);let r=n.length;if(r<=4)return e[`uniform${r}fv`](t,n);r=Math.sqrt(r)<<0,e[`uniformMatrix${r}fv`](t,!1,n)},B=(e,t,n,r,o=!1)=>{let s=e.createTexture();if(e.bindTexture(e.TEXTURE_2D,s),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(n,r),e.activeTexture(e.TEXTURE0+r),e.bindTexture(e.TEXTURE_2D,s),o)return()=>{e.activeTexture(e.TEXTURE0+r),e.bindTexture(e.TEXTURE_2D,s),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)}},z=(e,t,n,r,o,s,i,u)=>{let m=n*r,d=t.length/m;for(let p=0;p<m;p++)for(let a=0;a<Math.min(d,4);a++)u[4*p+a]=t[p*d+a]||0;e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,o.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,n,r,0,e.RGBA,e.FLOAT,u),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,s.texture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,n,r,0,e.RGBA,e.FLOAT,u),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:n,pong:r}of t)e.deleteTexture(n.texture),e.deleteTexture(r.texture),e.deleteFramebuffer(n.buffer),e.deleteFramebuffer(r.buffer)},$=(e,t,n,r,o,s)=>{e.activeTexture(e.TEXTURE0+o),e.bindTexture(e.TEXTURE_2D,t.texture),e.uniform1i(r,o),s===0&&e.bindFramebuffer(e.FRAMEBUFFER,n.buffer);let i=e.COLOR_ATTACHMENT0+s;return e.framebufferTexture2D(e.FRAMEBUFFER,i,e.TEXTURE_2D,n.texture,0),i},k=(e=1024)=>{if(b.num(e)){let o=Math.sqrt(e),s=Math.ceil(o);return Number.isInteger(o)||console.warn(`GLRE Storage Warning: particleCount (${e}) is not a square. Using ${s}x${s} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`),{x:s,y:s}}let[t,n,r]=e;if(r!==void 0){let o=n*r;return console.warn(`GLRE Storage Warning: 3D particleCount [${t}, ${n}, ${r}] specified but WebGL storage textures only support 2D. Flattening to 2D by multiplying height=${n} * depth=${r} = ${o}.`),{x:t,y:o}}return{x:t,y:n}},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=>{let{cs:t,particleCount:n,gl:r}=e;if(!t)return;r.getExtension("EXT_color_buffer_float");let o=0,s=0,i=D(()=>o++);t=b.str(t)?t:t.compute({isWebGL:!0,gl:e,units:i});let u=_(r,t,v,e),m=k(n),d=D(a=>r.getUniformLocation(u,a)),p=D(a=>{let f=new Float32Array(m.x*m.y*4),c={texture:r.createTexture(),buffer:r.createFramebuffer()},l={texture:r.createTexture(),buffer:r.createFramebuffer()};return{ping:c,pong:l,array:f,loc:d(a),unit:i(a)}});e("_uniform",(a,f)=>{r.useProgram(e.program=u),P(r,d(a),f)}),e("_storage",(a,f)=>{r.useProgram(e.program=u);let{ping:c,pong:l,unit:x,array:E}=p(a);z(r,f,m.x,m.y,c,l,x,E)}),e("clean",()=>{r.deleteProgram(u),H(r,p.map.values())}),e("render",()=>{r.useProgram(e.program=u);let a=p.map.values().map(({ping:f,pong:c,loc:l,unit:x},E)=>{let[y,L]=s%2?[f,c]:[c,f];return $(r,y,L,l,x,E)});r.drawBuffers(a),r.drawArrays(r.TRIANGLES,0,3),r.bindFramebuffer(r.FRAMEBUFFER,null),s++})};import{nested as S}from"reev";var Q=e=>{let{fs:t,vs:n,gl:r}=e,o={isWebGL:!0,gl:e};t=e.fs?b.str(e.fs)?e.fs:e.fs.fragment(o):I,n=e.vs?b.str(e.vs)?e.vs:e.vs.vertex(o):v;let s=_(r,t,n,e),i=0,u=S(()=>i++),m=S(p=>r.getUniformLocation(s,p)),d=S((p,a,f=!1)=>({stride:R(a.length,f?e.instanceCount:e.count,e.error,p),location:r.getAttribLocation(s,p),...V(r,a)}));e("_attribute",(p,a)=>{r.useProgram(e.program=s);let f=d(p,a);A(r,f.array,f.buffer,a),N(r,f.location,f.stride,f.buffer)}),e("_instance",(p,a)=>{r.useProgram(e.program=s);let f=d(p,a,!0);A(r,f.array,f.buffer,a),O(r,f.location,f.stride,f.buffer)}),e("_uniform",(p,a)=>{r.useProgram(e.program=s),P(r,m(p),a)}),e("_texture",(p,a)=>{r.useProgram(e.program=s);let f=m(p),c=u(p);B(r,null,f,c,!1),h(a,(l,x)=>{r.useProgram(e.program=s);let E=B(r,l,f,c,x);E&&e({render:E})})}),e("clean",()=>{r.deleteProgram(s)}),e("render",()=>{r.useProgram(e.program=s),e.instanceCount>1?r.drawArraysInstanced(r.TRIANGLES,0,e.count,e.instanceCount):r.drawArrays(r.TRIANGLES,0,e.count),r.bindFramebuffer(r.FRAMEBUFFER,null)})};var J=e=>{let t=!e.gl;if(t){let n=e.gl=e.el.getContext("webgl2");e("render",()=>n.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 U}from"reev";var Z=()=>{let e=0,t=0,n=0,r=0,o=U(()=>{let m=Math.floor(e/12),d=e%12;return e++,{group:m,binding:d}}),s=U(()=>{let d=Math.floor(e/12)+1+Math.floor(t/6),p=t%6*2;return t++,{group:d,binding:p}}),i=U(()=>{let d=Math.floor(e/12)+Math.floor(t/6)+2+Math.floor(n/12),p=n%12;return n++,{group:d,binding:p}}),u=U(()=>{let m=r;return r++,{location:m}});return{uniform:o,texture:s,storage:i,attrib:u}},ee=async(e,t=console.log,n)=>{let r=navigator.gpu,o=r.getPreferredCanvasFormat(),s=await r.requestAdapter();if(n?.aborted)throw new DOMException("Aborted","AbortError");let i=await s.requestDevice();if(n?.aborted&&(i.destroy(),n?.aborted))throw new DOMException("Aborted","AbortError");return i.onuncapturederror=u=>t(u.error.message),e.configure({device:i,format:o,alphaMode:"premultiplied"}),{device:i,format:o}},ce=e=>e===2?"float32x2":e===3?"float32x3":e===4?"float32x4":"float32",be=e=>{let t=[],n=[];for(let{buffer:r,location:o,stride:s,isInstance:i}of e){t[o]=r;let u=Math.min(Math.max(Math.floor(s),1),4),m=Math.max(4,Math.ceil(u*4/4)*4);n[o]={arrayStride:m,stepMode:i?"instance":"vertex",attributes:[{shaderLocation:o,offset:0,format:ce(u)}]}}return{vertexBuffers:t,bufferLayouts:n}},le=(e,t,n,r=[])=>{let o=new Map,s={bindGroups:[],bindGroupLayouts:[]},i=(u,m,d)=>{o.has(u)||o.set(u,{layouts:[],bindings:[]});let{layouts:p,bindings:a}=o.get(u);p.push(m),a.push(d)};for(let{binding:u,buffer:m,group:d}of t)i(d,{binding:u,visibility:7,buffer:{type:"uniform"}},{binding:u,resource:{buffer:m}});for(let{binding:u,buffer:m,group:d}of r)i(d,{binding:u,visibility:6,buffer:{type:"storage"}},{binding:u,resource:{buffer:m}});for(let{binding:u,group:m,sampler:d,view:p}of n)i(m,{binding:u,visibility:2,sampler:{}},{binding:u,resource:d}),i(m,{binding:u+1,visibility:2,texture:{}},{binding:u+1,resource:p});for(let[u,{layouts:m,bindings:d}]of o)s.bindGroupLayouts[u]=e.createBindGroupLayout({entries:m}),s.bindGroups[u]=e.createBindGroup({layout:s.bindGroupLayouts[u],entries:d});return s},xe=(e,t,n,r,o,s,i)=>{let u={primitive:{topology:"triangle-list"},layout:e.createPipelineLayout({bindGroupLayouts:r}),vertex:{module:e.createShaderModule({label:"vert",code:o.trim()}),entryPoint:"main",buffers:n},fragment:{module:e.createShaderModule({label:"frag",code:s.trim()}),entryPoint:"main",targets:[{format:t}]}};return i&&(u.depthStencil={depthWriteEnabled:!0,depthCompare:"less",format:"depth24plus"}),e.createRenderPipeline(u)},Ee=(e,t,n)=>{if(n)return e.createComputePipeline({compute:{module:e.createShaderModule({label:"compute",code:n.trim()}),entryPoint:"main"},layout:e.createPipelineLayout({bindGroupLayouts:t})})},te=(e,t,n,r,o,s,i,u,m,d)=>{let{vertexBuffers:p,bufferLayouts:a}=be(n),{bindGroups:f,bindGroupLayouts:c}=le(e,r,o,s),l=Ee(e,c,u),x=xe(e,t,a,c,m,i,d);return{bindGroups:f,vertexBuffers:p,computePipeline:l,graphicPipeline:x}},Te=e=>e==="uniform"?72:e==="attrib"?40:140,g=(e,t,n)=>{C(t)||(t=new Float32Array(t));let r=Te(n),o=n==="uniform"?Math.ceil(t.byteLength/256)*256:t.byteLength,s=e.createBuffer({size:o,usage:r});return{array:t,buffer:s}},T=(e,t,n,r)=>{n.set(t),e.queue.writeBuffer(r,0,n)},re=(e,t)=>{let n={colorAttachments:[{view:e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]};return t&&(n.depthStencilAttachment={view:t.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}),n},F=(e,t=1280,n=800)=>{let r=e.createTexture({size:[t,n],format:"rgba8unorm",usage:22}),o=e.createSampler({magFilter:"linear",minFilter:"linear"});return{texture:r,sampler:o,view:r.createView()}},ne=(e,t,n)=>e.createTexture({size:[t,n],format:"depth24plus",usage:16}),oe=(e,t=32)=>{b.num(e)&&(e=[e]);let[n,r=1,o=1]=e;return{x:Math.min(n*r*o/t,65535),y:1,z:1}};var ie=e=>{let{particleCount:t}=e,n,r,o=ge((i,u)=>({...e.binding.storage(i),...g(e.device,u,"storage")}));return e("_storage",(i,u)=>{let{array:m,buffer:d}=o(i,u);T(e.device,u,m,d)}),e("render",()=>{if(!n||!r)return;let i=e.commandEncoder.beginComputePass();i.setPipeline(n),r.forEach((p,a)=>i.setBindGroup(a,p));let{x:u,y:m,z:d}=oe(t);i.dispatchWorkgroups(u,m,d),i.end()}),e("clean",()=>{for(let{buffer:i}of o.map.values())i.destroy()}),{storages:o,set:(i,u)=>{n=i,r=u}}};import{nested as w}from"reev";var ae=(e,t=()=>{})=>{let{count:n,instanceCount:r}=e,o,s,i,u=w((a,f,c=!1,l=R(f.length,c?r:n,e.error,a))=>(t(),{...e.binding.attrib(a),...g(e.device,f,"attrib"),isInstance:c,stride:l})),m=w((a,f)=>(t(),{...e.binding.uniform(a),...g(e.device,f,"uniform")})),d=w((a,f=1,c=1)=>(t(),{...e.binding.texture(a),...F(e.device,f,c)}));return e("_attribute",(a,f)=>{let c=u(a,f);T(e.device,f,c.array,c.buffer)}),e("_instance",(a,f)=>{let c=u(a,f,!0);T(e.device,f,c.array,c.buffer)}),e("_uniform",(a,f)=>{b.num(f)&&(f=[f]);let c=m(a,f);T(e.device,f,c.array,c.buffer)}),e("_texture",(a,f)=>{let c=d(a);h(f,(l,x)=>{let[E,y]=x?[l.videoWidth,l.videoHeight]:[l.width,l.height];c.texture.destroy(),Object.assign(c,F(e.device,E,y)),t();let L=()=>void e.device.queue.copyExternalImageToTexture({source:l},{texture:c.texture},{width:E,height:y});x?e({render:L}):L()})}),e("render",()=>{!o||!s||!i||(e.passEncoder.setPipeline(o),s.forEach((a,f)=>e.passEncoder.setBindGroup(f,a)),i.forEach((a,f)=>e.passEncoder.setVertexBuffer(f,a)),e.passEncoder.draw(n,r,0,0))}),e("clean",()=>{for(let{buffer:a}of u.map.values())a.destroy();for(let{texture:a}of d.map.values())a.destroy();for(let{buffer:a}of m.map.values())a.destroy()}),{uniforms:m,textures:d,attributes:u,set:(a,f,c)=>{o=a,s=f,i=c}}};var se=async(e,t=!1)=>{let{vs:n,fs:r,cs:o}=e,s=!0,i=!e.gpu;if(i){let p=e.el.getContext("webgpu"),a=Z(),{device:f,format:c}=await ee(p,e.error);e({device:f,format:c,binding:a,gpu:p}),e("resize",()=>{e.depthTexture?.destroy(),e.isDepth&&(e.depthTexture=ne(e.device,...e.size))})}e("render",()=>{s&&d()}),i&&e("render",()=>{e.commandEncoder=e.device.createCommandEncoder()});let u=ie(e);i&&e("render",()=>{e.passEncoder=e.commandEncoder.beginRenderPass(re(e.gpu,e.depthTexture))});let m=ae(e,()=>s=!0),d=()=>{s=!1;let p={isWebGL:!1,gl:e};r=r?b.str(r)?r:r.fragment(p):W,n=n?b.str(n)?n:n.vertex(p):M,o=o?b.str(o)?o:o.compute(p):"";let a=te(e.device,e.format,m.attributes.map.values(),m.uniforms.map.values(),m.textures.map.values(),u.storages.map.values(),r,o,n,e.isDepth);u.set(a.computePipeline,a.bindGroups),m.set(a.graphicPipeline,a.bindGroups,a.vertexBuffers)};t&&e("render",()=>{e.passEncoder.end(),e.device.queue.submit([e.commandEncoder.finish()])}),e("clean",()=>{e.depthTexture?.destroy(),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)}}),n=performance.now();return t.queue=Le(),t.frame=ye(),t.attribute=G((r,o,s)=>t.queue(()=>t._attribute?.(r,o,s)),t),t.instance=G((r,o,s)=>t.queue(()=>t._instance?.(r,o,s)),t),t.storage=G((r,o)=>t.queue(()=>t._storage?.(r,o)),t),t.texture=G((r,o)=>t.queue(()=>t._texture?.(r,o)),t),t.uniform=G((r,o)=>t.queue(()=>t._uniform?.(r,o)),t),t.uniform({iResolution:t.size,iMouse:[0,0],iTime:n}),t("mount",async r=>{t.el=ue(t)||r||e.map(ue).find(Boolean);let o=!t.el;o&&!t.isNative&&(t.el=document.createElement("canvas"),Object.assign(t.el.style,{top:0,left:0,position:"fixed"}));for(let s=0;s<e.length;s++){let i=e[s];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||2,t.instanceCount=i.instanceCount||1,t.particleCount=i.particleCount||1024,t.count=i.count||t.triangleCount*3||6,t(i),b.bol(i.isWebGL)&&(t.isWebGL=i.isWebGL||!Re()),t.isWebGL?J(t):await se(t,s===e.length-1),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",r=>{r?(t.el=r,t.mount()):t.clean()}),t("resize",()=>{let r=t.el.parentElement?.getBoundingClientRect();t.size[0]=t.el.width=t.width||r?.width||window.innerWidth,t.size[1]=t.el.height=t.height||r?.height||window.innerHeight,t.uniform("iResolution",t.size)}),t("mousemove",(r,o=r.clientX,s=r.clientY)=>{let i=t.el.getBoundingClientRect();t.mouse[0]=(o-i.left)/i.width,t.mouse[1]=-(s-i.top)/i.height+1,t.uniform("iMouse",t.mouse)}),t("render",()=>{n=performance.now()/1e3,t.uniform("iTime",n),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