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/README.md +1017 -29
- package/dist/addons.d.ts +60 -55
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +84 -79
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +65 -58
- package/dist/node.cjs +42 -42
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +63 -58
- package/dist/node.js +15 -15
- package/dist/node.js.map +1 -1
- package/dist/react.d.ts +84 -79
- package/dist/solid.d.ts +84 -79
- package/package.json +1 -1
- package/src/helpers.ts +2 -2
- package/src/index.ts +9 -4
- package/src/node/create.ts +10 -9
- package/src/node/scope.ts +3 -15
- package/src/node/types.ts +20 -45
- package/src/node/utils/const.ts +27 -10
- package/src/node/utils/index.ts +15 -8
- package/src/node/utils/infer.ts +26 -20
- package/src/node/utils/parse.ts +5 -5
- package/src/types.ts +6 -4
- package/src/webgl/compute.ts +4 -4
- package/src/webgl/graphic.ts +6 -6
- package/src/webgpu/compute.ts +5 -5
- package/src/webgpu/graphic.ts +15 -27
- package/src/webgpu/index.ts +36 -17
- package/src/webgpu/utils.ts +23 -27
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
|
|
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
|
-
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
}`,
|
|
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
|
|
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
|