glre 0.45.0 → 0.47.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.
- package/README.md +4 -26
- package/dist/addons.d.ts +35 -50
- package/dist/index.cjs +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +37 -90
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +1 -1
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.ts +45 -93
- package/dist/native.js +1 -1
- package/dist/native.js.map +1 -1
- package/dist/node.cjs +15 -15
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +35 -50
- package/dist/node.js +15 -15
- package/dist/node.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +37 -91
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/solid.cjs +1 -1
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.ts +37 -91
- package/dist/solid.js +1 -1
- package/dist/solid.js.map +1 -1
- package/package.json +1 -1
- package/src/{utils/helpers.ts → helpers.ts} +10 -32
- package/src/index.ts +45 -42
- package/src/native.ts +6 -7
- package/src/node/build.ts +3 -19
- package/src/node/create.ts +2 -4
- package/src/node/index.ts +8 -20
- package/src/node/types.ts +2 -0
- package/src/node/utils/index.ts +5 -2
- package/src/node/utils/infer.ts +5 -13
- package/src/node/utils/parse.ts +18 -34
- package/src/node/utils/utils.ts +15 -10
- package/src/react.ts +9 -12
- package/src/solid.ts +3 -10
- package/src/types.ts +30 -22
- package/src/webgl/compute.ts +56 -0
- package/src/webgl/graphic.ts +65 -0
- package/src/webgl/index.ts +21 -0
- package/src/{utils/program.ts → webgl/utils.ts} +30 -8
- package/src/webgpu/compute.ts +39 -0
- package/src/webgpu/graphic.ts +89 -0
- package/src/webgpu/index.ts +42 -0
- package/src/{utils/pipeline.ts → webgpu/utils.ts} +75 -78
- package/src/utils/webgl.ts +0 -135
- package/src/utils/webgpu.ts +0 -178
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://www.npmjs.com/package/glre)
|
|
9
9
|
[](https://www.npmtrends.com/glre)
|
|
10
10
|
[](https://github.com/tseijp/glre)
|
|
11
|
-
[](https://glre.
|
|
11
|
+
[](https://glre.dev)
|
|
12
12
|
[](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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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;
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
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
|
-
`,
|
|
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
|
+
}`,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(),
|
|
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
|
|
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
|