glre 0.48.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/helpers.ts","../src/webgl/compute.ts","../src/webgl/utils.ts","../src/webgl/graphic.ts","../src/webgl/index.ts","../src/webgpu/compute.ts","../src/webgpu/utils.ts","../src/webgpu/graphic.ts","../src/webgpu/index.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './helpers'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\n\nexport const isServer = () => {\n return typeof window === 'undefined'\n}\n\nexport const isWebGPUSupported = () => {\n if (isServer()) return false\n return 'gpu' in navigator\n}\n\nconst findElement = (arg: Partial<GL>) => {\n return arg.el || arg.elem || arg.element\n}\n\nexport const createGL = (...args: Partial<GL>[]) => {\n const gl = event({\n isNative: false,\n isWebGL: true,\n isError: false,\n isLoop: true,\n isDebug: false,\n isDepth: false,\n wireframe: false,\n size: [0, 0],\n mouse: [0, 0],\n precision: 'highp',\n error() {\n gl.isError = true\n gl.isLoop = false\n gl.clean()\n console.warn('GLRE Error:', ...arguments)\n },\n }) as EventState<GL>\n\n let iTime = performance.now()\n gl.queue = createQueue()\n gl.frame = createFrame()\n\n gl.attribute = durable((k, v, i) => gl.queue(() => gl._attribute?.(k, v, i)), gl)\n gl.instance = durable((k, v, at) => gl.queue(() => gl._instance?.(k, v, at)), gl)\n gl.storage = durable((k, v) => gl.queue(() => gl._storage?.(k, v)), gl)\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async (el: HTMLCanvasElement) => {\n gl.el = findElement(gl) || el || args.map(findElement).find(Boolean)\n const isAppend = !gl.el // Check first: canvas may unmount during WebGPU async processing\n if (isAppend && !gl.isNative) gl.el = document.createElement('canvas')\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n gl.fs = arg.fs || arg.frag || arg.fragment || undefined\n gl.cs = arg.cs || arg.comp || arg.compute || undefined\n gl.vs = arg.vs || arg.vert || arg.vertex || undefined\n gl.triangleCount = arg.triangleCount || 2\n gl.instanceCount = arg.instanceCount || 1\n gl.particleCount = arg.particleCount || 1024\n gl.count = arg.count || gl.triangleCount * 3 || 6\n gl(arg)\n if (is.bol(arg.isWebGL)) gl.isWebGL = arg.isWebGL || !isWebGPUSupported()\n if (gl.isWebGL) webgl(gl)\n else await webgpu(gl, i === args.length - 1)\n if (arg.mount) arg.mount() // events added in mount phase need explicit call to execute\n }\n if (!gl.el || gl.isError) return // stop if error or canvas was unmounted during async\n gl.resize()\n gl.frame(() => {\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\n if (isAppend) document.body.appendChild(gl.el)\n window.addEventListener('resize', gl.resize)\n gl.el.addEventListener('mousemove', gl.mousemove)\n })\n\n gl('clean', () => {\n gl.frame.stop()\n if (!gl.el || gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('ref', (el: HTMLCanvasElement | null) => {\n if (el) {\n gl.el = el\n gl.mount()\n } else gl.clean()\n })\n\n gl('resize', () => {\n const rect = gl.el.parentElement?.getBoundingClientRect()\n gl.size[0] = gl.el.width = gl.width || rect?.width || window.innerWidth\n gl.size[1] = gl.el.height = gl.height || rect?.height || window.innerHeight\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const rect = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - rect.left) / rect.width\n gl.mouse[1] = -(y - rect.top) / rect.height + 1\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('render', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n gl.queue.flush()\n })\n\n return gl\n}\n\nexport default createGL\n","export const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\n/**\n * each\n */\ntype EachFn<Value, Key, This> = (this: This, value: Value, key: Key) => void\ntype Eachable<Value = any, Key = any, This = any> = {\n forEach(cb: EachFn<Value, Key, This>, ctx?: This): void\n}\n\nexport const each = <Value, Key, This>(obj: Eachable<Value, Key, This>, fn: EachFn<Value, Key, This>) => obj.forEach(fn)\n\nexport const flush = <Value extends Function, Key, This>(obj: Eachable<Value, Key, This>, ...args: any[]) => {\n each(obj, (f) => f(...args))\n}\n\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nconst loadingImage = (src: string, fun: (el: HTMLImageElement) => void) => {\n const el = new Image()\n Object.assign(el, { src, crossOrigin: 'anonymous' })\n el.decode().then(() => fun(el))\n}\n\nconst loadingVideo = (src: string, fun: (source: HTMLVideoElement) => void) => {\n const el = document.createElement('video')\n Object.assign(el, { src, loop: true, muted: true, crossOrigin: 'anonymous' })\n el.load()\n el.play()\n el.addEventListener('canplay', fun.bind(null, el), { once: true })\n}\n\nexport function loadingTexture(src: string, fun: (source: HTMLVideoElement, isVideo: true) => void): void\n\nexport function loadingTexture(src: string, fun: (source: HTMLImageElement, isVideo: false) => void): void\n\nexport function loadingTexture(src: string | HTMLImageElement | HTMLVideoElement, fun: Function) {\n if (!is.str(src)) return fun(src, src instanceof HTMLVideoElement)\n const isVideo = /\\.(mp4|webm|ogg|avi|mov)$/i.test(src)\n const loader = isVideo ? loadingVideo : loadingImage\n loader(src, (el: HTMLImageElement | HTMLVideoElement) => {\n fun(el as HTMLVideoElement, isVideo)\n })\n}\nconst isValidStride = (stride: number) => [1, 2, 3, 4, 9, 16].includes(stride)\n\nconst calcStride = (arrayLength: number, count = 3) => {\n if (arrayLength % count === 0) return Math.floor(arrayLength / count)\n return -1\n}\n\nexport const getStride = (arrayLength: number, count = 1, error = console.warn, id = '') => {\n const ret = calcStride(arrayLength, count)\n if (!isValidStride(ret)) error(`glre attribute error: Invalid attribute length ${arrayLength}, ${id ? `${id} ` : ' '}must divide by vertex count (${count}) with valid stride (1,2,3,4,9,16)`)\n return ret\n}\n\nexport const GLSL_FS = /* cpp */ `\n#version 300 es\nprecision highp float;\nprecision highp int;\nout vec4 fragColor;\nuniform vec2 iResolution;\nvoid main() {\n fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);\n}\n`\n\nexport const GLSL_VS = /* cpp */ `\n#version 300 es\nvoid main() {\n float x = float(gl_VertexID % 2) * 4.0 - 1.0;\n float y = float(gl_VertexID / 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}`\n\nexport const WGSL_VS = /* rust */ `\nstruct In { @builtin(vertex_index) vertex_index: u32 }\nstruct Out { @builtin(position) position: vec4f }\n@vertex\nfn main(in: In) -> Out {\n var out: Out;\n var x = f32(in.vertex_index % 2) * 4.0 - 1.0;\n var y = f32(in.vertex_index / 2) * 4.0 - 1.0;\n out.position = vec4f(x, y, 0.0, 1.0);\n return out;\n}\n`.trim()\n\nexport const WGSL_FS = /* rust */ `\nstruct Out { @builtin(position) position: vec4f }\n@group(0) @binding(0) var<uniform> iResolution: vec2f;\n@fragment\nfn main(out: Out) -> @location(0) vec4f {\n return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);\n}\n`\n","import { nested } from 'reev'\nimport { cleanStorage, createAttachment, createProgram, createStorage, storageSize, updateUniform } from './utils'\nimport { GLSL_VS, is } from '../helpers'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL) => {\n let { cs, particleCount, gl: c } = gl\n if (!cs) return\n c.getExtension('EXT_color_buffer_float') // Enable high precision GPGPU by writing to float textures\n\n let _texture = 0 // for texture active units\n let _storage = 0 // for storage current num\n\n const units = nested(() => _texture++)\n cs = is.str(cs) ? cs : cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, GLSL_VS, gl)!\n const size = storageSize(particleCount)\n\n const uniforms = nested((key) => c.getUniformLocation(pg, key)!)\n const storages = nested((key) => {\n const array = new Float32Array(size.x * size.y * 4) // RGBA texture data\n const ping = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n const pong = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n return { ping, pong, array, loc: uniforms(key), unit: units(key) }\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_storage', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size.x, size.y, ping, pong, unit, array)\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = _storage % 2 ? [ping, pong] : [pong, ping]\n return createAttachment(c, i, o, loc, unit, index)\n })\n c.drawBuffers(attachments)\n c.drawArrays(c.TRIANGLES, 0, 3)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n _storage++\n })\n}\n\nexport type WebGLCompute = ReturnType<typeof compute>\n","import { is } from '../helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGL2RenderingContext, source: string, type: number, onError = console.warn) => {\n const shader = c.createShader(type)\n if (!shader) return onError('Failed to create shader')\n c.shaderSource(shader, source.trim())\n c.compileShader(shader)\n if (c.getShaderParameter(shader, c.COMPILE_STATUS)) return shader\n const error = c.getShaderInfoLog(shader)\n c.deleteShader(shader)\n onError(`Could not compile shader: ${error}\\n\\n↓↓↓generated↓↓↓\\n${source}`)\n}\n\nexport const createProgram = (c: WebGL2RenderingContext, frag: string, vert: string, gl: GL) => {\n const pg = c.createProgram()\n const fs = createShader(c, frag, c.FRAGMENT_SHADER, gl.error)\n const vs = createShader(c, vert, c.VERTEX_SHADER, gl.error)\n if (!fs || !vs) return\n c.attachShader(pg, fs!)\n c.attachShader(pg, vs!)\n c.linkProgram(pg)\n if (c.getProgramParameter(pg, c.LINK_STATUS)) return pg\n const error = c.getProgramInfoLog(pg)\n c.deleteProgram(pg)\n gl.error(`Could not link program: ${error}`)\n}\n\nexport const createBuffer = (c: WebGL2RenderingContext, data: number[]) => {\n const array = new Float32Array(data)\n const buffer = c.createBuffer()\n return { array, buffer }\n}\n\nexport const updateBuffer = (c: WebGL2RenderingContext, array: Float32Array, buffer: WebGLBuffer, value: number[]) => {\n array.set(value)\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, array, c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n}\n\nexport const updateAttrib = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n}\n\nexport const updateInstance = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n c.vertexAttribDivisor(loc, 1) // divisor is 1\n}\n\nexport const updateUniform = (c: WebGL2RenderingContext, loc: WebGLUniformLocation | null, value: number | number[]) => {\n if (is.nul(loc)) return\n if (is.num(value)) return c.uniform1f(loc, value)\n let l = value.length\n if (l <= 4) return c[`uniform${l as 2}fv`](loc, value)\n l = Math.sqrt(l) << 0\n c[`uniformMatrix${l as 2}fv`](loc, false, value)\n}\n\nexport const createTexture = (c: WebGL2RenderingContext, el: HTMLImageElement | HTMLVideoElement | null, loc: WebGLUniformLocation | null, unit: number, isVideo = false) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n if (el) {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el)\n if (!isVideo) c.generateMipmap(c.TEXTURE_2D)\n } else {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, 1, 1, 0, c.RGBA, c.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]))\n }\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, null)\n c.uniform1i(loc, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n if (isVideo)\n return () => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el!)\n }\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (c: WebGL2RenderingContext, value: number[], width: number, height: number, ping: TextureBuffer, pong: TextureBuffer, unit: number, array: Float32Array) => {\n const particleCount = width * height\n const vectorSize = value.length / particleCount\n for (let i = 0; i < particleCount; i++) {\n for (let j = 0; j < Math.min(vectorSize, 4); j++) {\n array[4 * i + j] = value[i * vectorSize + j] || 0\n }\n }\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, ping.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, pong.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n}\n\nexport const cleanStorage = (c: WebGL2RenderingContext, map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>) => {\n for (const { ping, pong } of map) {\n c.deleteTexture(ping.texture)\n c.deleteTexture(pong.texture)\n c.deleteFramebuffer(ping.buffer)\n c.deleteFramebuffer(pong.buffer)\n }\n}\n\nexport const createAttachment = (c: WebGL2RenderingContext, i: TextureBuffer, o: TextureBuffer, loc: WebGLUniformLocation, unit: number, index: number) => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, i.texture)\n c.uniform1i(loc, unit)\n if (index === 0) c.bindFramebuffer(c.FRAMEBUFFER, o.buffer)\n const attachment = c.COLOR_ATTACHMENT0 + index\n c.framebufferTexture2D(c.FRAMEBUFFER, attachment, c.TEXTURE_2D, o.texture, 0)\n return attachment\n}\n\n/**\n * utils\n */\nexport const storageSize = (particleCount: number | number[] = 1024) => {\n if (is.num(particleCount)) {\n const sqrt = Math.sqrt(particleCount)\n const size = Math.ceil(sqrt)\n if (!Number.isInteger(sqrt)) console.warn(`GLRE Storage Warning: particleCount (${particleCount}) is not a square. Using ${size}x${size} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`)\n return { x: size, y: size }\n }\n const [x, y, z] = particleCount\n if (z !== undefined) {\n const yz = y * z\n console.warn(`GLRE Storage Warning: 3D particleCount [${x}, ${y}, ${z}] specified but WebGL storage textures only support 2D. Flattening to 2D by multiplying height=${y} * depth=${z} = ${yz}.`)\n return { x, y: yz }\n }\n return { x, y }\n}\n\nexport const loseContext = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_lose_context')\n if (ext) ext.loseContext()\n}\n\nexport const enableDepth = (c: WebGL2RenderingContext) => {\n c.enable(c.DEPTH_TEST)\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n c.cullFace(c.BACK)\n}\n\nexport const enableWireframe = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_polygon_mode')\n if (ext) ext.polygonModeWEBGL(c.FRONT_AND_BACK, ext.LINE_WEBGL)\n}\n","import { nested } from 'reev'\nimport { getStride, GLSL_FS, GLSL_VS, is, loadingTexture } from '../helpers'\nimport { createBuffer, createProgram, createTexture, updateAttrib, updateBuffer, updateInstance, updateUniform } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL) => {\n let { fs, vs, gl: c } = gl // @TODO Save this WebGPU instance's count (overwritten per args) but no change now for top page\n const config = { isWebGL: true, gl }\n fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : GLSL_FS\n vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : GLSL_VS\n const pg = createProgram(c, fs, vs, gl)!\n let activeUnit = 0\n\n const units = nested(() => activeUnit++)\n const uniforms = nested((key) => c.getUniformLocation(pg, key))\n const attributes = nested((key, value: number[], isInstance = false) => {\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count, gl.error, key)\n return { stride, location: c.getAttribLocation(pg, key), ...createBuffer(c, value) }\n })\n\n gl('_attribute', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value)\n updateBuffer(c, a.array, a.buffer, value)\n updateAttrib(c, a.location, a.stride, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value, true)\n updateBuffer(c, a.array, a.buffer, value)\n updateInstance(c, a.location, a.stride, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_texture', (key: string, src: string) => {\n c.useProgram((gl.program = pg))\n const location = uniforms(key)\n const unit = units(key)\n createTexture(c, null, location, unit, false)\n loadingTexture(src, (source, isVideo) => {\n c.useProgram((gl.program = pg))\n const render = createTexture(c, source, location, unit, isVideo)\n if (render) gl({ render })\n })\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n if (gl.instanceCount > 1) {\n c.drawArraysInstanced(c.TRIANGLES, 0, gl.count, gl.instanceCount)\n } else c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n })\n}\n\nexport type WebGLGraphic = ReturnType<typeof graphic>\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { enableDepth, enableWireframe, loseContext } from './utils'\nimport type { GL } from '../types'\n\nexport const webgl = (gl: GL) => {\n const isInit = !gl.gl\n if (isInit) {\n const c = (gl.gl = gl.el.getContext('webgl2')!)\n gl('render', () => c.viewport(0, 0, ...gl.size!)) // Run before other renderers' events to prevent flickering\n }\n\n compute(gl)\n graphic(gl)\n\n if (isInit) {\n gl('clean', () => loseContext(gl.gl))\n if (gl.isDepth) enableDepth(gl.gl)\n if (gl.wireframe) enableWireframe(gl.gl)\n }\n}\n","import { nested } from 'reev'\nimport { createBuffer, updateBuffer, workgroupCount } from './utils'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL) => {\n const { particleCount } = gl // Save this WebGPU instance's particleCount (overwritten per args)\n let pipeline: GPUComputePipeline | undefined\n let bindGroups: GPUBindGroup[] | undefined\n\n const storages = nested((key, value: number[] | Float32Array) => {\n return { ...gl.binding.storage(key), ...createBuffer(gl.device, value, 'storage') }\n })\n\n gl('_storage', (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n updateBuffer(gl.device, value, array, buffer)\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups) return\n const pass = gl.commandEncoder.beginComputePass()\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const { x, y, z } = workgroupCount(particleCount)\n pass.dispatchWorkgroups(x, y, z)\n pass.end()\n })\n\n gl('clean', () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline?: GPUComputePipeline, _bindGroups?: GPUBindGroup[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n }\n\n return { storages, set }\n}\n","import { nested } from 'reev'\nimport { is, isFloat32 } from '../helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\ntype IAttribs = Iterable<AttribData & { isInstance?: boolean }>\ntype IUniforms = Iterable<UniformData>\ntype ITextures = Iterable<TextureData>\ntype IStorages = Iterable<StorageData>\n\n/**\n * binding\n */\nexport const createBinding = () => {\n let _uniform = 0\n let _texture = 0\n let _storage = 0\n let _attrib = 0\n const uniform = nested(() => {\n const group = Math.floor(_uniform / 12)\n const binding = _uniform % 12\n _uniform++\n return { group, binding }\n })\n const texture = nested(() => {\n const baseGroup = Math.floor(_uniform / 12) + 1\n const group = baseGroup + Math.floor(_texture / 6)\n const binding = (_texture % 6) * 2\n _texture++\n return { group, binding }\n })\n const storage = nested(() => {\n const baseGroup = Math.floor(_uniform / 12) + Math.floor(_texture / 6) + 2\n const group = baseGroup + Math.floor(_storage / 12)\n const binding = _storage % 12\n _storage++\n return { group, binding }\n })\n const attrib = nested(() => {\n const location = _attrib\n _attrib++\n return { location }\n })\n return { uniform, texture, storage, attrib }\n}\n\nexport type Binding = ReturnType<typeof createBinding>\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log, signal?: AbortSignal) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n const device = await adapter!.requestDevice()\n if (signal?.aborted) {\n device.destroy()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n }\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'premultiplied' })\n return { device, format }\n}\n\n/**\n * pipeline update\n */\nconst getVertexFormat = (stride: number): GPUVertexFormat => {\n if (stride === 2) return 'float32x2'\n if (stride === 3) return 'float32x3'\n if (stride === 4) return 'float32x4'\n return 'float32'\n}\n\nconst createVertexBuffers = (attribs: IAttribs) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride, isInstance } of attribs) {\n vertexBuffers[location] = buffer\n const componentSize = Math.min(Math.max(Math.floor(stride), 1), 4)\n const arrayStride = Math.max(4, Math.ceil((componentSize * 4) / 4) * 4)\n bufferLayouts[location] = {\n arrayStride,\n stepMode: isInstance ? 'instance' : 'vertex',\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(componentSize),\n },\n ],\n }\n }\n return { vertexBuffers, bufferLayouts }\n}\n\nconst createBindGroup = (device: GPUDevice, uniforms: IUniforms, textures: ITextures, storages: IStorages = []) => {\n const groups = new Map<number, { layouts: GPUBindGroupLayoutEntry[]; bindings: GPUBindGroupEntry[] }>()\n const ret = { bindGroups: [] as GPUBindGroup[], bindGroupLayouts: [] as GPUBindGroupLayout[] }\n const add = (i: number, layout: GPUBindGroupLayoutEntry, binding: GPUBindGroupEntry) => {\n if (!groups.has(i)) groups.set(i, { layouts: [], bindings: [] })\n const { layouts, bindings } = groups.get(i)!\n layouts.push(layout)\n bindings.push(binding)\n }\n for (const { binding, buffer, group } of uniforms) {\n add(group, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group } of storages) {\n add(group, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group, sampler, view } of textures) {\n add(group, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(group, { binding: b + 1, visibility: 2, texture: {} }, { binding: b + 1, resource: view })\n }\n for (const [i, { layouts, bindings }] of groups) {\n ret.bindGroupLayouts[i] = device.createBindGroupLayout({ entries: layouts })\n ret.bindGroups[i] = device.createBindGroup({ layout: ret.bindGroupLayouts[i], entries: bindings })\n }\n return ret\n}\n\nconst createPipeline = (device: GPUDevice, format: GPUTextureFormat, bufferLayouts: GPUVertexBufferLayout[], bindGroupLayouts: GPUBindGroupLayout[], vs: string, fs: string, isDepth: boolean) => {\n const config: GPURenderPipelineDescriptor = {\n primitive: { topology: 'triangle-list' },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n vertex: {\n module: device.createShaderModule({ label: 'vert', code: vs.trim() }),\n entryPoint: 'main',\n buffers: bufferLayouts,\n },\n fragment: {\n module: device.createShaderModule({ label: 'frag', code: fs.trim() }),\n entryPoint: 'main',\n targets: [{ format }],\n },\n }\n if (isDepth) config.depthStencil = { depthWriteEnabled: true, depthCompare: 'less', format: 'depth24plus' }\n return device.createRenderPipeline(config)\n}\n\nconst createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\n if (!cs) return\n return device.createComputePipeline({\n compute: {\n module: device.createShaderModule({ label: 'compute', code: cs.trim() }),\n entryPoint: 'main',\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n })\n}\n\nexport const updatePipeline = (device: GPUDevice, format: GPUTextureFormat, attribs: IAttribs, uniforms: IUniforms, textures: ITextures, storages: IStorages, fs: string, cs: string, vs: string, isDepth: boolean) => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs)\n const { bindGroups, bindGroupLayouts } = createBindGroup(device, uniforms, textures, storages)\n const computePipeline = createComputePipeline(device, bindGroupLayouts, cs)\n const graphicPipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vs, fs, isDepth)\n return { bindGroups, vertexBuffers, computePipeline, graphicPipeline }\n}\n\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // 72 is GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // 40 is GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // 140 is GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n}\n\nexport const createBuffer = (device: GPUDevice, array: number[] | Float32Array, type: 'uniform' | 'storage' | 'attrib') => {\n if (!isFloat32(array)) array = new Float32Array(array)\n const usage = bufferUsage(type)\n const size = type === 'uniform' ? Math.ceil(array.byteLength / 256) * 256 : array.byteLength\n const buffer = device.createBuffer({ size, usage })\n return { array, buffer }\n}\n\nexport const updateBuffer = (device: GPUDevice, value: number[] | Float32Array, array: Float32Array, buffer: GPUBuffer) => {\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as GPUAllowSharedBufferSource)\n}\n\nexport const createDescriptor = (c: GPUCanvasContext, depthTexture?: GPUTexture) => {\n const ret: GPURenderPassDescriptor = { colorAttachments: [{ view: c.getCurrentTexture().createView(), clearValue: { r: 0, g: 0, b: 0, a: 0 }, loadOp: 'clear', storeOp: 'store' }] }\n if (depthTexture) ret.depthStencilAttachment = { view: depthTexture.createView(), depthClearValue: 1.0, depthLoadOp: 'clear', depthStoreOp: 'store' }\n return ret\n}\n\n/**\n * textures\n */\nexport const createTextureSampler = (device: GPUDevice, width = 1280, height = 800) => {\n const texture = device.createTexture({ size: [width, height], format: 'rgba8unorm', usage: 22 }) // 22 is GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' })\n return { texture, sampler, view: texture.createView() }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({ size: [width, height], format: 'depth24plus', usage: 16 }) // 16 is GPUTextureUsage.RENDER_ATTACHMENT\n}\n\n/**\n * utils\n */\nexport const workgroupCount = (particleCount: number | number[], workgroupSize = 32) => {\n if (is.num(particleCount)) particleCount = [particleCount]\n const [x, y = 1, z = 1] = particleCount\n return {\n x: Math.min((x * y * z) / workgroupSize, 65535),\n y: 1,\n z: 1,\n }\n}\n","import { nested } from 'reev'\nimport { getStride, is, loadingTexture } from '../helpers'\nimport { createBuffer, createTextureSampler, updateBuffer } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL, update = () => {}) => {\n const { count, instanceCount } = gl // // Save this WebGPU item's count (overwritten per args)\n let pipeline: GPURenderPipeline\n let bindGroups: GPUBindGroup[]\n let vertexBuffers: GPUBuffer[]\n\n const attributes = nested((key, value: number[], isInstance = false, stride = getStride(value.length, isInstance ? instanceCount : count, gl.error, key)) => {\n update()\n return { ...gl.binding.attrib(key), ...createBuffer(gl.device, value, 'attrib'), isInstance, stride }\n })\n\n const uniforms = nested((key, value: number[] | Float32Array) => {\n update()\n return { ...gl.binding.uniform(key), ...createBuffer(gl.device, value, 'uniform') }\n })\n\n const textures = nested((key, width = 1, height = 1) => {\n update()\n return { ...gl.binding.texture(key), ...createTextureSampler(gl.device, width, height) }\n })\n\n gl('_attribute', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value, true)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[] | Float32Array) => {\n if (is.num(value)) value = [value]\n const u = uniforms(key, value)\n updateBuffer(gl.device, value, u.array, u.buffer)\n })\n\n gl('_texture', (key: string, src: string) => {\n const t = textures(key)\n loadingTexture(src, (source, isVideo) => {\n const [width, height] = isVideo ? [source.videoWidth, source.videoHeight] : [source.width, source.height]\n t.texture.destroy()\n Object.assign(t, createTextureSampler(gl.device, width, height))\n update() // Rebuilding BindGroups because the texture size has changed\n const render = () => void gl.device.queue.copyExternalImageToTexture({ source }, { texture: t.texture }, { width, height })\n if (isVideo) gl({ render })\n else render()\n })\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups || !vertexBuffers) return\n gl.passEncoder.setPipeline(pipeline)\n bindGroups.forEach((v, i) => gl.passEncoder.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => gl.passEncoder.setVertexBuffer(i, v))\n gl.passEncoder.draw(count, instanceCount, 0, 0)\n })\n\n gl('clean', () => {\n for (const { buffer } of attributes.map.values()) buffer.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline: GPURenderPipeline, _bindGroups: GPUBindGroup[], _vertexBuffers: GPUBuffer[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n vertexBuffers = _vertexBuffers\n }\n\n return { uniforms, textures, attributes, set }\n}\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { createBinding, createDepthTexture, createDescriptor, createDevice, updatePipeline } from './utils'\nimport { is, WGSL_FS, WGSL_VS } from '../helpers'\nimport type { GL } from '../types'\n\nexport const webgpu = async (gl: GL, isLast = false) => {\n let { vs, fs, cs } = gl\n let isUpdate = true\n const isInit = !gl.gpu\n if (isInit) {\n const gpu = gl.el!.getContext('webgpu') as GPUCanvasContext\n const binding = createBinding()\n const { device, format } = await createDevice(gpu, gl.error)\n gl({ device, format, binding, gpu })\n gl('resize', () => {\n gl.depthTexture?.destroy()\n if (gl.isDepth) gl.depthTexture = createDepthTexture(gl.device, ...gl.size)\n })\n }\n\n gl('render', () => {\n if (isUpdate) update()\n })\n\n if (isInit)\n gl('render', () => {\n gl.commandEncoder = gl.device.createCommandEncoder()\n })\n\n const c = compute(gl)\n\n if (isInit)\n gl('render', () => {\n gl.passEncoder = gl.commandEncoder.beginRenderPass(createDescriptor(gl.gpu, gl.depthTexture))\n })\n\n const g = graphic(gl, () => (isUpdate = true))\n\n const update = () => {\n isUpdate = false\n const config = { isWebGL: false, gl }\n fs = fs ? (is.str(fs) ? fs : fs.fragment(config)) : WGSL_FS\n vs = vs ? (is.str(vs) ? vs : vs.vertex(config)) : WGSL_VS\n cs = cs ? (is.str(cs) ? cs : cs.compute(config)) : ''\n const p = updatePipeline(gl.device, gl.format, g.attributes.map.values(), g.uniforms.map.values(), g.textures.map.values(), c.storages.map.values(), fs, cs, vs, gl.isDepth)\n c.set(p.computePipeline, p.bindGroups)\n g.set(p.graphicPipeline, p.bindGroups, p.vertexBuffers)\n }\n\n if (isLast)\n gl('render', () => {\n gl.passEncoder.end()\n gl.device.queue.submit([gl.commandEncoder.finish()])\n })\n\n gl('clean', () => {\n gl.depthTexture?.destroy()\n gl.device.destroy()\n })\n}\n"],"mappings":"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","names":["src_exports","__export","createGL","src_default","isServer","isWebGPUSupported","__toCommonJS","import_reev","import_refr","is","a","isFloat32","value","loadingImage","src","fun","el","loadingVideo","loadingTexture","is","isVideo","isValidStride","stride","calcStride","arrayLength","count","getStride","error","id","ret","GLSL_FS","GLSL_VS","WGSL_VS","WGSL_FS","import_reev","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createBuffer","data","array","buffer","updateBuffer","value","updateAttrib","loc","stride","updateInstance","updateUniform","is","l","createTexture","el","unit","isVideo","texture","createStorage","width","height","ping","pong","particleCount","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","storageSize","sqrt","size","x","y","z","yz","loseContext","ext","enableDepth","enableWireframe","compute","gl","cs","particleCount","c","_texture","_storage","units","is","pg","createProgram","GLSL_VS","size","storageSize","uniforms","key","storages","array","ping","pong","value","updateUniform","unit","createStorage","cleanStorage","attachments","loc","index","i","o","createAttachment","import_reev","graphic","gl","fs","vs","c","config","is","GLSL_FS","GLSL_VS","pg","createProgram","activeUnit","units","uniforms","key","attributes","value","isInstance","getStride","createBuffer","a","updateBuffer","updateAttrib","updateInstance","updateUniform","src","location","unit","createTexture","loadingTexture","source","isVideo","render","webgl","gl","isInit","c","compute","graphic","loseContext","enableDepth","enableWireframe","import_reev","import_reev","createBinding","_uniform","_texture","_storage","_attrib","uniform","group","binding","texture","storage","attrib","location","createDevice","c","log","signal","gpu","format","adapter","device","e","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","isInstance","componentSize","arrayStride","createBindGroup","uniforms","textures","storages","groups","ret","add","i","layout","layouts","bindings","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","isDepth","config","createComputePipeline","cs","updatePipeline","bindGroups","computePipeline","graphicPipeline","bufferUsage","type","createBuffer","array","isFloat32","usage","size","updateBuffer","value","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","workgroupCount","particleCount","workgroupSize","is","x","y","z","compute","gl","particleCount","pipeline","bindGroups","storages","key","value","createBuffer","array","buffer","updateBuffer","pass","v","i","x","y","z","workgroupCount","_pipeline","_bindGroups","import_reev","graphic","gl","update","count","instanceCount","pipeline","bindGroups","vertexBuffers","attributes","key","value","isInstance","stride","getStride","createBuffer","uniforms","textures","width","height","createTextureSampler","a","updateBuffer","is","u","src","t","loadingTexture","source","isVideo","render","v","i","buffer","texture","_pipeline","_bindGroups","_vertexBuffers","webgpu","gl","isLast","vs","fs","cs","isUpdate","isInit","gpu","binding","createBinding","device","format","createDevice","createDepthTexture","update","c","compute","createDescriptor","g","graphic","config","is","WGSL_FS","WGSL_VS","p","updatePipeline","isServer","isWebGPUSupported","findElement","arg","createGL","args","gl","iTime","k","v","i","at","el","isAppend","is","webgl","webgpu","rect","_e","x","y","src_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/helpers.ts","../src/webgl/compute.ts","../src/webgl/utils.ts","../src/webgl/graphic.ts","../src/webgl/index.ts","../src/webgpu/compute.ts","../src/webgpu/utils.ts","../src/webgpu/graphic.ts","../src/webgpu/index.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './helpers'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\n\nexport const isServer = () => {\n return typeof window === 'undefined'\n}\n\nexport const isWebGPUSupported = () => {\n if (isServer()) return false\n return 'gpu' in navigator\n}\n\nconst findElement = (arg: Partial<GL>) => {\n return arg.el || arg.elem || arg.element\n}\n\nexport const createGL = (...args: Partial<GL>[]) => {\n const gl = event({\n isNative: false,\n isWebGL: true,\n isError: false,\n isLoop: true,\n isDebug: false,\n isDepth: false,\n wireframe: false,\n size: [0, 0],\n mouse: [0, 0],\n precision: 'highp',\n error() {\n gl.isError = true\n gl.isLoop = false\n gl.clean()\n console.warn('GLRE Error:', ...arguments)\n },\n }) as EventState<GL>\n\n let iTime = performance.now()\n gl.queue = createQueue()\n gl.frame = createFrame()\n\n gl.attribute = durable((k, v, i) => gl.queue(() => gl._attribute?.(k, v, i)), gl)\n gl.instance = durable((k, v, at) => gl.queue(() => gl._instance?.(k, v, at)), gl)\n gl.storage = durable((k, v) => gl.queue(() => gl._storage?.(k, v)), gl)\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async (el: HTMLCanvasElement) => {\n gl.el = findElement(gl) || el || args.map(findElement).find(Boolean)\n const isAppend = !gl.el // Check first: canvas may unmount during WebGPU async processing\n if (isAppend && !gl.isNative) {\n gl.el = document.createElement('canvas')\n Object.assign(gl.el.style, { top: 0, left: 0, position: 'fixed' })\n }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n gl.fs = arg.fs || arg.frag || arg.fragment || undefined\n gl.cs = arg.cs || arg.comp || arg.compute || undefined\n gl.vs = arg.vs || arg.vert || arg.vertex || undefined\n gl.triangleCount = arg.triangleCount || 2\n gl.instanceCount = arg.instanceCount || 1\n gl.particleCount = arg.particleCount || 1024\n gl.count = arg.count || gl.triangleCount * 3 || 6\n gl(arg)\n if (is.bol(arg.isWebGL)) gl.isWebGL = arg.isWebGL || !isWebGPUSupported()\n if (gl.isWebGL) webgl(gl)\n else await webgpu(gl, i === args.length - 1)\n if (arg.mount) arg.mount() // events added in mount phase need explicit call to execute\n }\n if (!gl.el || gl.isError) return // stop if error or canvas was unmounted during async\n gl.resize()\n gl.frame(() => {\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\n if (isAppend) document.body.appendChild(gl.el)\n window.addEventListener('resize', gl.resize)\n gl.el.addEventListener('mousemove', gl.mousemove)\n })\n\n gl('clean', () => {\n gl.frame.stop()\n if (!gl.el || gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('ref', (el: HTMLCanvasElement | null) => {\n if (el) {\n gl.el = el\n gl.mount()\n } else gl.clean()\n })\n\n gl('resize', () => {\n const rect = gl.el.parentElement?.getBoundingClientRect()\n gl.size[0] = gl.el.width = gl.width || rect?.width || window.innerWidth\n gl.size[1] = gl.el.height = gl.height || rect?.height || window.innerHeight\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const rect = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - rect.left) / rect.width\n gl.mouse[1] = -(y - rect.top) / rect.height + 1\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('render', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n gl.queue.flush()\n })\n\n return gl\n}\n\nexport default createGL\n","export const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\n/**\n * each\n */\ntype EachFn<Value, Key, This> = (this: This, value: Value, key: Key) => void\ntype Eachable<Value = any, Key = any, This = any> = {\n forEach(cb: EachFn<Value, Key, This>, ctx?: This): void\n}\n\nexport const each = <Value, Key, This>(obj: Eachable<Value, Key, This>, fn: EachFn<Value, Key, This>) => obj.forEach(fn)\n\nexport const flush = <Value extends Function, Key, This>(obj: Eachable<Value, Key, This>, ...args: any[]) => {\n each(obj, (f) => f(...args))\n}\n\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nconst loadingImage = (src: string, fun: (el: HTMLImageElement) => void) => {\n const el = new Image()\n Object.assign(el, { src, crossOrigin: 'anonymous' })\n el.decode().then(() => fun(el))\n}\n\nconst loadingVideo = (src: string, fun: (source: HTMLVideoElement) => void) => {\n const el = document.createElement('video')\n Object.assign(el, { src, loop: true, muted: true, crossOrigin: 'anonymous' })\n el.load()\n el.play()\n el.addEventListener('canplay', fun.bind(null, el), { once: true })\n}\n\nexport function loadingTexture(src: string, fun: (source: HTMLVideoElement, isVideo: true) => void): void\n\nexport function loadingTexture(src: string, fun: (source: HTMLImageElement, isVideo: false) => void): void\n\nexport function loadingTexture(src: string | HTMLImageElement | HTMLVideoElement, fun: Function) {\n if (!is.str(src)) return fun(src, src instanceof HTMLVideoElement)\n const isVideo = /\\.(mp4|webm|ogg|avi|mov)$/i.test(src)\n const loader = isVideo ? loadingVideo : loadingImage\n loader(src, (el: HTMLImageElement | HTMLVideoElement) => {\n fun(el as HTMLVideoElement, isVideo)\n })\n}\nconst isValidStride = (stride: number) => [1, 2, 3, 4, 9, 16].includes(stride)\n\nconst calcStride = (arrayLength: number, count = 3) => {\n if (arrayLength % count === 0) return Math.floor(arrayLength / count)\n return -1\n}\n\nexport const getStride = (arrayLength: number, count = 1, error = console.warn, id = '') => {\n const ret = calcStride(arrayLength, count)\n if (!isValidStride(ret)) error(`glre attribute error: Invalid attribute length ${arrayLength}, ${id ? `${id} ` : ' '}must divide by vertex count (${count}) with valid stride (1,2,3,4,9,16)`)\n return ret\n}\n\nexport const GLSL_FS = /* cpp */ `\n#version 300 es\nprecision highp float;\nprecision highp int;\nout vec4 fragColor;\nuniform vec2 iResolution;\nvoid main() {\n fragColor = vec4(fract((gl_FragCoord.xy / iResolution)), 0.0, 1.0);\n}\n`\n\nexport const GLSL_VS = /* cpp */ `\n#version 300 es\nvoid main() {\n float x = float(gl_VertexID % 2) * 4.0 - 1.0;\n float y = float(gl_VertexID / 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}`\n\nexport const WGSL_VS = /* rust */ `\nstruct In { @builtin(vertex_index) vertex_index: u32 }\nstruct Out { @builtin(position) position: vec4f }\n@vertex\nfn main(in: In) -> Out {\n var out: Out;\n var x = f32(in.vertex_index % 2) * 4.0 - 1.0;\n var y = f32(in.vertex_index / 2) * 4.0 - 1.0;\n out.position = vec4f(x, y, 0.0, 1.0);\n return out;\n}\n`.trim()\n\nexport const WGSL_FS = /* rust */ `\nstruct Out { @builtin(position) position: vec4f }\n@group(0) @binding(0) var<uniform> iResolution: vec2f;\n@fragment\nfn main(out: Out) -> @location(0) vec4f {\n return vec4f(fract((out.position.xy / iResolution)), 0.0, 1.0);\n}\n`\n","import { nested } from 'reev'\nimport { cleanStorage, createAttachment, createProgram, createStorage, storageSize, updateUniform } from './utils'\nimport { GLSL_VS, is } from '../helpers'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL) => {\n let { cs, particleCount, gl: c } = gl\n if (!cs) return\n c.getExtension('EXT_color_buffer_float') // Enable high precision GPGPU by writing to float textures\n\n let _texture = 0 // for texture active units\n let _storage = 0 // for storage current num\n\n const units = nested(() => _texture++)\n cs = is.str(cs) ? cs : cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, GLSL_VS, gl)!\n const size = storageSize(particleCount)\n\n const uniforms = nested((key) => c.getUniformLocation(pg, key)!)\n const storages = nested((key) => {\n const array = new Float32Array(size.x * size.y * 4) // RGBA texture data\n const ping = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n const pong = { texture: c.createTexture(), buffer: c.createFramebuffer() }\n return { ping, pong, array, loc: uniforms(key), unit: units(key) }\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_storage', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size.x, size.y, ping, pong, unit, array)\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = _storage % 2 ? [ping, pong] : [pong, ping]\n return createAttachment(c, i, o, loc, unit, index)\n })\n c.drawBuffers(attachments)\n c.drawArrays(c.TRIANGLES, 0, 3)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n _storage++\n })\n}\n\nexport type WebGLCompute = ReturnType<typeof compute>\n","import { is } from '../helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGL2RenderingContext, source: string, type: number, onError = console.warn) => {\n const shader = c.createShader(type)\n if (!shader) return onError('Failed to create shader')\n c.shaderSource(shader, source.trim())\n c.compileShader(shader)\n if (c.getShaderParameter(shader, c.COMPILE_STATUS)) return shader\n const error = c.getShaderInfoLog(shader)\n c.deleteShader(shader)\n onError(`Could not compile shader: ${error}\\n\\n↓↓↓generated↓↓↓\\n${source}`)\n}\n\nexport const createProgram = (c: WebGL2RenderingContext, frag: string, vert: string, gl: GL) => {\n const pg = c.createProgram()\n const fs = createShader(c, frag, c.FRAGMENT_SHADER, gl.error)\n const vs = createShader(c, vert, c.VERTEX_SHADER, gl.error)\n if (!fs || !vs) return\n c.attachShader(pg, fs!)\n c.attachShader(pg, vs!)\n c.linkProgram(pg)\n if (c.getProgramParameter(pg, c.LINK_STATUS)) return pg\n const error = c.getProgramInfoLog(pg)\n c.deleteProgram(pg)\n gl.error(`Could not link program: ${error}`)\n}\n\nexport const createBuffer = (c: WebGL2RenderingContext, data: number[]) => {\n const array = new Float32Array(data)\n const buffer = c.createBuffer()\n return { array, buffer }\n}\n\nexport const updateBuffer = (c: WebGL2RenderingContext, array: Float32Array, buffer: WebGLBuffer, value: number[]) => {\n array.set(value)\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, array, c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n}\n\nexport const updateAttrib = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n}\n\nexport const updateInstance = (c: WebGL2RenderingContext, loc: number, stride: number, buffer: WebGLBuffer) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, stride, c.FLOAT, false, 0, 0)\n c.vertexAttribDivisor(loc, 1) // divisor is 1\n}\n\nexport const updateUniform = (c: WebGL2RenderingContext, loc: WebGLUniformLocation | null, value: number | number[]) => {\n if (is.nul(loc)) return\n if (is.num(value)) return c.uniform1f(loc, value)\n let l = value.length\n if (l <= 4) return c[`uniform${l as 2}fv`](loc, value)\n l = Math.sqrt(l) << 0\n c[`uniformMatrix${l as 2}fv`](loc, false, value)\n}\n\nexport const createTexture = (c: WebGL2RenderingContext, el: HTMLImageElement | HTMLVideoElement | null, loc: WebGLUniformLocation | null, unit: number, isVideo = false) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n if (el) {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el)\n if (!isVideo) c.generateMipmap(c.TEXTURE_2D)\n } else {\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, 1, 1, 0, c.RGBA, c.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]))\n }\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, null)\n c.uniform1i(loc, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n if (isVideo)\n return () => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el!)\n }\n}\n\n/**\n * for gpgpu\n */\ninterface TextureBuffer {\n texture: WebGLTexture\n buffer: WebGLFramebuffer\n}\n\nexport const createStorage = (c: WebGL2RenderingContext, value: number[], width: number, height: number, ping: TextureBuffer, pong: TextureBuffer, unit: number, array: Float32Array) => {\n const particleCount = width * height\n const vectorSize = value.length / particleCount\n for (let i = 0; i < particleCount; i++) {\n for (let j = 0; j < Math.min(vectorSize, 4); j++) {\n array[4 * i + j] = value[i * vectorSize + j] || 0\n }\n }\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, ping.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n c.bindTexture(c.TEXTURE_2D, pong.texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA32F, width, height, 0, c.RGBA, c.FLOAT, array)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n}\n\nexport const cleanStorage = (c: WebGL2RenderingContext, map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>) => {\n for (const { ping, pong } of map) {\n c.deleteTexture(ping.texture)\n c.deleteTexture(pong.texture)\n c.deleteFramebuffer(ping.buffer)\n c.deleteFramebuffer(pong.buffer)\n }\n}\n\nexport const createAttachment = (c: WebGL2RenderingContext, i: TextureBuffer, o: TextureBuffer, loc: WebGLUniformLocation, unit: number, index: number) => {\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, i.texture)\n c.uniform1i(loc, unit)\n if (index === 0) c.bindFramebuffer(c.FRAMEBUFFER, o.buffer)\n const attachment = c.COLOR_ATTACHMENT0 + index\n c.framebufferTexture2D(c.FRAMEBUFFER, attachment, c.TEXTURE_2D, o.texture, 0)\n return attachment\n}\n\n/**\n * utils\n */\nexport const storageSize = (particleCount: number | number[] = 1024) => {\n if (is.num(particleCount)) {\n const sqrt = Math.sqrt(particleCount)\n const size = Math.ceil(sqrt)\n if (!Number.isInteger(sqrt)) console.warn(`GLRE Storage Warning: particleCount (${particleCount}) is not a square. Using ${size}x${size} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`)\n return { x: size, y: size }\n }\n const [x, y, z] = particleCount\n if (z !== undefined) {\n const yz = y * z\n console.warn(`GLRE Storage Warning: 3D particleCount [${x}, ${y}, ${z}] specified but WebGL storage textures only support 2D. Flattening to 2D by multiplying height=${y} * depth=${z} = ${yz}.`)\n return { x, y: yz }\n }\n return { x, y }\n}\n\nexport const loseContext = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_lose_context')\n if (ext) ext.loseContext()\n}\n\nexport const enableDepth = (c: WebGL2RenderingContext) => {\n c.enable(c.DEPTH_TEST)\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n c.cullFace(c.BACK)\n}\n\nexport const enableWireframe = (c: WebGL2RenderingContext) => {\n const ext = c.getExtension('WEBGL_polygon_mode')\n if (ext) ext.polygonModeWEBGL(c.FRONT_AND_BACK, ext.LINE_WEBGL)\n}\n","import { nested } from 'reev'\nimport { getStride, GLSL_FS, GLSL_VS, is, loadingTexture } from '../helpers'\nimport { createBuffer, createProgram, createTexture, updateAttrib, updateBuffer, updateInstance, updateUniform } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL) => {\n let { fs, vs, gl: c } = gl // @TODO Save this WebGPU instance's count (overwritten per args) but no change now for top page\n const config = { isWebGL: true, gl }\n fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : GLSL_FS\n vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : GLSL_VS\n const pg = createProgram(c, fs, vs, gl)!\n let activeUnit = 0\n\n const units = nested(() => activeUnit++)\n const uniforms = nested((key) => c.getUniformLocation(pg, key))\n const attributes = nested((key, value: number[], isInstance = false) => {\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count, gl.error, key)\n return { stride, location: c.getAttribLocation(pg, key), ...createBuffer(c, value) }\n })\n\n gl('_attribute', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value)\n updateBuffer(c, a.array, a.buffer, value)\n updateAttrib(c, a.location, a.stride, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[]) => {\n c.useProgram((gl.program = pg))\n const a = attributes(key, value, true)\n updateBuffer(c, a.array, a.buffer, value)\n updateInstance(c, a.location, a.stride, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n c.useProgram((gl.program = pg))\n updateUniform(c, uniforms(key), value)\n })\n\n gl('_texture', (key: string, src: string) => {\n c.useProgram((gl.program = pg))\n const location = uniforms(key)\n const unit = units(key)\n createTexture(c, null, location, unit, false)\n loadingTexture(src, (source, isVideo) => {\n c.useProgram((gl.program = pg))\n const render = createTexture(c, source, location, unit, isVideo)\n if (render) gl({ render })\n })\n })\n\n gl('clean', () => {\n c.deleteProgram(pg)\n })\n\n gl('render', () => {\n c.useProgram((gl.program = pg))\n if (gl.instanceCount > 1) {\n c.drawArraysInstanced(c.TRIANGLES, 0, gl.count, gl.instanceCount)\n } else c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n })\n}\n\nexport type WebGLGraphic = ReturnType<typeof graphic>\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { enableDepth, enableWireframe, loseContext } from './utils'\nimport type { GL } from '../types'\n\nexport const webgl = (gl: GL) => {\n const isInit = !gl.gl\n if (isInit) {\n const c = (gl.gl = gl.el.getContext('webgl2')!)\n gl('render', () => c.viewport(0, 0, ...gl.size!)) // Run before other renderers' events to prevent flickering\n }\n\n compute(gl)\n graphic(gl)\n\n if (isInit) {\n gl('clean', () => loseContext(gl.gl))\n if (gl.isDepth) enableDepth(gl.gl)\n if (gl.wireframe) enableWireframe(gl.gl)\n }\n}\n","import { nested } from 'reev'\nimport { createBuffer, updateBuffer, workgroupCount } from './utils'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL) => {\n const { particleCount } = gl // Save this WebGPU instance's particleCount (overwritten per args)\n let pipeline: GPUComputePipeline | undefined\n let bindGroups: GPUBindGroup[] | undefined\n\n const storages = nested((key, value: number[] | Float32Array) => {\n return { ...gl.binding.storage(key), ...createBuffer(gl.device, value, 'storage') }\n })\n\n gl('_storage', (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n updateBuffer(gl.device, value, array, buffer)\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups) return\n const pass = gl.commandEncoder.beginComputePass()\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const { x, y, z } = workgroupCount(particleCount)\n pass.dispatchWorkgroups(x, y, z)\n pass.end()\n })\n\n gl('clean', () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline?: GPUComputePipeline, _bindGroups?: GPUBindGroup[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n }\n\n return { storages, set }\n}\n","import { nested } from 'reev'\nimport { is, isFloat32 } from '../helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\ntype IAttribs = Iterable<AttribData & { isInstance?: boolean }>\ntype IUniforms = Iterable<UniformData>\ntype ITextures = Iterable<TextureData>\ntype IStorages = Iterable<StorageData>\n\n/**\n * binding\n */\nexport const createBinding = () => {\n let _uniform = 0\n let _texture = 0\n let _storage = 0\n let _attrib = 0\n const uniform = nested(() => {\n const group = Math.floor(_uniform / 12)\n const binding = _uniform % 12\n _uniform++\n return { group, binding }\n })\n const texture = nested(() => {\n const baseGroup = Math.floor(_uniform / 12) + 1\n const group = baseGroup + Math.floor(_texture / 6)\n const binding = (_texture % 6) * 2\n _texture++\n return { group, binding }\n })\n const storage = nested(() => {\n const baseGroup = Math.floor(_uniform / 12) + Math.floor(_texture / 6) + 2\n const group = baseGroup + Math.floor(_storage / 12)\n const binding = _storage % 12\n _storage++\n return { group, binding }\n })\n const attrib = nested(() => {\n const location = _attrib\n _attrib++\n return { location }\n })\n return { uniform, texture, storage, attrib }\n}\n\nexport type Binding = ReturnType<typeof createBinding>\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log, signal?: AbortSignal) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n const device = await adapter!.requestDevice()\n if (signal?.aborted) {\n device.destroy()\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n }\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'premultiplied' })\n return { device, format }\n}\n\n/**\n * pipeline update\n */\nconst getVertexFormat = (stride: number): GPUVertexFormat => {\n if (stride === 2) return 'float32x2'\n if (stride === 3) return 'float32x3'\n if (stride === 4) return 'float32x4'\n return 'float32'\n}\n\nconst createVertexBuffers = (attribs: IAttribs) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride, isInstance } of attribs) {\n vertexBuffers[location] = buffer\n const componentSize = Math.min(Math.max(Math.floor(stride), 1), 4)\n const arrayStride = Math.max(4, Math.ceil((componentSize * 4) / 4) * 4)\n bufferLayouts[location] = {\n arrayStride,\n stepMode: isInstance ? 'instance' : 'vertex',\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(componentSize),\n },\n ],\n }\n }\n return { vertexBuffers, bufferLayouts }\n}\n\nconst createBindGroup = (device: GPUDevice, uniforms: IUniforms, textures: ITextures, storages: IStorages = []) => {\n const groups = new Map<number, { layouts: GPUBindGroupLayoutEntry[]; bindings: GPUBindGroupEntry[] }>()\n const ret = { bindGroups: [] as GPUBindGroup[], bindGroupLayouts: [] as GPUBindGroupLayout[] }\n const add = (i: number, layout: GPUBindGroupLayoutEntry, binding: GPUBindGroupEntry) => {\n if (!groups.has(i)) groups.set(i, { layouts: [], bindings: [] })\n const { layouts, bindings } = groups.get(i)!\n layouts.push(layout)\n bindings.push(binding)\n }\n for (const { binding, buffer, group } of uniforms) {\n add(group, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group } of storages) {\n add(group, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group, sampler, view } of textures) {\n add(group, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(group, { binding: b + 1, visibility: 2, texture: {} }, { binding: b + 1, resource: view })\n }\n for (const [i, { layouts, bindings }] of groups) {\n ret.bindGroupLayouts[i] = device.createBindGroupLayout({ entries: layouts })\n ret.bindGroups[i] = device.createBindGroup({ layout: ret.bindGroupLayouts[i], entries: bindings })\n }\n return ret\n}\n\nconst createPipeline = (device: GPUDevice, format: GPUTextureFormat, bufferLayouts: GPUVertexBufferLayout[], bindGroupLayouts: GPUBindGroupLayout[], vs: string, fs: string, isDepth: boolean) => {\n const config: GPURenderPipelineDescriptor = {\n primitive: { topology: 'triangle-list' },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n vertex: {\n module: device.createShaderModule({ label: 'vert', code: vs.trim() }),\n entryPoint: 'main',\n buffers: bufferLayouts,\n },\n fragment: {\n module: device.createShaderModule({ label: 'frag', code: fs.trim() }),\n entryPoint: 'main',\n targets: [{ format }],\n },\n }\n if (isDepth) config.depthStencil = { depthWriteEnabled: true, depthCompare: 'less', format: 'depth24plus' }\n return device.createRenderPipeline(config)\n}\n\nconst createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\n if (!cs) return\n return device.createComputePipeline({\n compute: {\n module: device.createShaderModule({ label: 'compute', code: cs.trim() }),\n entryPoint: 'main',\n },\n layout: device.createPipelineLayout({ bindGroupLayouts }),\n })\n}\n\nexport const updatePipeline = (device: GPUDevice, format: GPUTextureFormat, attribs: IAttribs, uniforms: IUniforms, textures: ITextures, storages: IStorages, fs: string, cs: string, vs: string, isDepth: boolean) => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs)\n const { bindGroups, bindGroupLayouts } = createBindGroup(device, uniforms, textures, storages)\n const computePipeline = createComputePipeline(device, bindGroupLayouts, cs)\n const graphicPipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vs, fs, isDepth)\n return { bindGroups, vertexBuffers, computePipeline, graphicPipeline }\n}\n\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // 72 is GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // 40 is GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // 140 is GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n}\n\nexport const createBuffer = (device: GPUDevice, array: number[] | Float32Array, type: 'uniform' | 'storage' | 'attrib') => {\n if (!isFloat32(array)) array = new Float32Array(array)\n const usage = bufferUsage(type)\n const size = type === 'uniform' ? Math.ceil(array.byteLength / 256) * 256 : array.byteLength\n const buffer = device.createBuffer({ size, usage })\n return { array, buffer }\n}\n\nexport const updateBuffer = (device: GPUDevice, value: number[] | Float32Array, array: Float32Array, buffer: GPUBuffer) => {\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as GPUAllowSharedBufferSource)\n}\n\nexport const createDescriptor = (c: GPUCanvasContext, depthTexture?: GPUTexture) => {\n const ret: GPURenderPassDescriptor = { colorAttachments: [{ view: c.getCurrentTexture().createView(), clearValue: { r: 0, g: 0, b: 0, a: 0 }, loadOp: 'clear', storeOp: 'store' }] }\n if (depthTexture) ret.depthStencilAttachment = { view: depthTexture.createView(), depthClearValue: 1.0, depthLoadOp: 'clear', depthStoreOp: 'store' }\n return ret\n}\n\n/**\n * textures\n */\nexport const createTextureSampler = (device: GPUDevice, width = 1280, height = 800) => {\n const texture = device.createTexture({ size: [width, height], format: 'rgba8unorm', usage: 22 }) // 22 is GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' })\n return { texture, sampler, view: texture.createView() }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({ size: [width, height], format: 'depth24plus', usage: 16 }) // 16 is GPUTextureUsage.RENDER_ATTACHMENT\n}\n\n/**\n * utils\n */\nexport const workgroupCount = (particleCount: number | number[], workgroupSize = 32) => {\n if (is.num(particleCount)) particleCount = [particleCount]\n const [x, y = 1, z = 1] = particleCount\n return {\n x: Math.min((x * y * z) / workgroupSize, 65535),\n y: 1,\n z: 1,\n }\n}\n","import { nested } from 'reev'\nimport { getStride, is, loadingTexture } from '../helpers'\nimport { createBuffer, createTextureSampler, updateBuffer } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL, update = () => {}) => {\n const { count, instanceCount } = gl // // Save this WebGPU item's count (overwritten per args)\n let pipeline: GPURenderPipeline\n let bindGroups: GPUBindGroup[]\n let vertexBuffers: GPUBuffer[]\n\n const attributes = nested((key, value: number[], isInstance = false, stride = getStride(value.length, isInstance ? instanceCount : count, gl.error, key)) => {\n update()\n return { ...gl.binding.attrib(key), ...createBuffer(gl.device, value, 'attrib'), isInstance, stride }\n })\n\n const uniforms = nested((key, value: number[] | Float32Array) => {\n update()\n return { ...gl.binding.uniform(key), ...createBuffer(gl.device, value, 'uniform') }\n })\n\n const textures = nested((key, width = 1, height = 1) => {\n update()\n return { ...gl.binding.texture(key), ...createTextureSampler(gl.device, width, height) }\n })\n\n gl('_attribute', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_instance', (key: string, value: number[] | Float32Array) => {\n const a = attributes(key, value, true)\n updateBuffer(gl.device, value, a.array, a.buffer)\n })\n\n gl('_uniform', (key: string, value: number | number[] | Float32Array) => {\n if (is.num(value)) value = [value]\n const u = uniforms(key, value)\n updateBuffer(gl.device, value, u.array, u.buffer)\n })\n\n gl('_texture', (key: string, src: string) => {\n const t = textures(key)\n loadingTexture(src, (source, isVideo) => {\n const [width, height] = isVideo ? [source.videoWidth, source.videoHeight] : [source.width, source.height]\n t.texture.destroy()\n Object.assign(t, createTextureSampler(gl.device, width, height))\n update() // Rebuilding BindGroups because the texture size has changed\n const render = () => void gl.device.queue.copyExternalImageToTexture({ source }, { texture: t.texture }, { width, height })\n if (isVideo) gl({ render })\n else render()\n })\n })\n\n gl('render', () => {\n if (!pipeline || !bindGroups || !vertexBuffers) return\n gl.passEncoder.setPipeline(pipeline)\n bindGroups.forEach((v, i) => gl.passEncoder.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => gl.passEncoder.setVertexBuffer(i, v))\n gl.passEncoder.draw(count, instanceCount, 0, 0)\n })\n\n gl('clean', () => {\n for (const { buffer } of attributes.map.values()) buffer.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n })\n\n const set = (_pipeline: GPURenderPipeline, _bindGroups: GPUBindGroup[], _vertexBuffers: GPUBuffer[]) => {\n pipeline = _pipeline\n bindGroups = _bindGroups\n vertexBuffers = _vertexBuffers\n }\n\n return { uniforms, textures, attributes, set }\n}\n","import { compute } from './compute'\nimport { graphic } from './graphic'\nimport { createBinding, createDepthTexture, createDescriptor, createDevice, updatePipeline } from './utils'\nimport { is, WGSL_FS, WGSL_VS } from '../helpers'\nimport type { GL } from '../types'\n\nexport const webgpu = async (gl: GL, isLast = false) => {\n let { vs, fs, cs } = gl\n let isUpdate = true\n const isInit = !gl.gpu\n if (isInit) {\n const gpu = gl.el!.getContext('webgpu') as GPUCanvasContext\n const binding = createBinding()\n const { device, format } = await createDevice(gpu, gl.error)\n gl({ device, format, binding, gpu })\n gl('resize', () => {\n gl.depthTexture?.destroy()\n if (gl.isDepth) gl.depthTexture = createDepthTexture(gl.device, ...gl.size)\n })\n }\n\n gl('render', () => {\n if (isUpdate) update()\n })\n\n if (isInit)\n gl('render', () => {\n gl.commandEncoder = gl.device.createCommandEncoder()\n })\n\n const c = compute(gl)\n\n if (isInit)\n gl('render', () => {\n gl.passEncoder = gl.commandEncoder.beginRenderPass(createDescriptor(gl.gpu, gl.depthTexture))\n })\n\n const g = graphic(gl, () => (isUpdate = true))\n\n const update = () => {\n isUpdate = false\n const config = { isWebGL: false, gl }\n fs = fs ? (is.str(fs) ? fs : fs.fragment(config)) : WGSL_FS\n vs = vs ? (is.str(vs) ? vs : vs.vertex(config)) : WGSL_VS\n cs = cs ? (is.str(cs) ? cs : cs.compute(config)) : ''\n const p = updatePipeline(gl.device, gl.format, g.attributes.map.values(), g.uniforms.map.values(), g.textures.map.values(), c.storages.map.values(), fs, cs, vs, gl.isDepth)\n c.set(p.computePipeline, p.bindGroups)\n g.set(p.graphicPipeline, p.bindGroups, p.vertexBuffers)\n }\n\n if (isLast)\n gl('render', () => {\n gl.passEncoder.end()\n gl.device.queue.submit([gl.commandEncoder.finish()])\n })\n\n gl('clean', () => {\n gl.depthTexture?.destroy()\n gl.device.destroy()\n })\n}\n"],"mappings":"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","names":["src_exports","__export","createGL","src_default","isServer","isWebGPUSupported","__toCommonJS","import_reev","import_refr","is","a","isFloat32","value","loadingImage","src","fun","el","loadingVideo","loadingTexture","is","isVideo","isValidStride","stride","calcStride","arrayLength","count","getStride","error","id","ret","GLSL_FS","GLSL_VS","WGSL_VS","WGSL_FS","import_reev","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createBuffer","data","array","buffer","updateBuffer","value","updateAttrib","loc","stride","updateInstance","updateUniform","is","l","createTexture","el","unit","isVideo","texture","createStorage","width","height","ping","pong","particleCount","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","storageSize","sqrt","size","x","y","z","yz","loseContext","ext","enableDepth","enableWireframe","compute","gl","cs","particleCount","c","_texture","_storage","units","is","pg","createProgram","GLSL_VS","size","storageSize","uniforms","key","storages","array","ping","pong","value","updateUniform","unit","createStorage","cleanStorage","attachments","loc","index","i","o","createAttachment","import_reev","graphic","gl","fs","vs","c","config","is","GLSL_FS","GLSL_VS","pg","createProgram","activeUnit","units","uniforms","key","attributes","value","isInstance","getStride","createBuffer","a","updateBuffer","updateAttrib","updateInstance","updateUniform","src","location","unit","createTexture","loadingTexture","source","isVideo","render","webgl","gl","isInit","c","compute","graphic","loseContext","enableDepth","enableWireframe","import_reev","import_reev","createBinding","_uniform","_texture","_storage","_attrib","uniform","group","binding","texture","storage","attrib","location","createDevice","c","log","signal","gpu","format","adapter","device","e","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","isInstance","componentSize","arrayStride","createBindGroup","uniforms","textures","storages","groups","ret","add","i","layout","layouts","bindings","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","isDepth","config","createComputePipeline","cs","updatePipeline","bindGroups","computePipeline","graphicPipeline","bufferUsage","type","createBuffer","array","isFloat32","usage","size","updateBuffer","value","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","workgroupCount","particleCount","workgroupSize","is","x","y","z","compute","gl","particleCount","pipeline","bindGroups","storages","key","value","createBuffer","array","buffer","updateBuffer","pass","v","i","x","y","z","workgroupCount","_pipeline","_bindGroups","import_reev","graphic","gl","update","count","instanceCount","pipeline","bindGroups","vertexBuffers","attributes","key","value","isInstance","stride","getStride","createBuffer","uniforms","textures","width","height","createTextureSampler","a","updateBuffer","is","u","src","t","loadingTexture","source","isVideo","render","v","i","buffer","texture","_pipeline","_bindGroups","_vertexBuffers","webgpu","gl","isLast","vs","fs","cs","isUpdate","isInit","gpu","binding","createBinding","device","format","createDevice","createDepthTexture","update","c","compute","createDescriptor","g","graphic","config","is","WGSL_FS","WGSL_VS","p","updatePipeline","isServer","isWebGPUSupported","findElement","arg","createGL","args","gl","iTime","k","v","i","at","el","isAppend","is","webgl","webgpu","rect","_e","x","y","src_default"]}
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: "*";
@@ -78,7 +124,7 @@ type Operators = (typeof OPERATOR_KEYS)[number];
78
124
  */
79
125
  interface FnLayout {
80
126
  name: string;
81
- type: C | 'auto';
127
+ type?: C | 'auto';
82
128
  inputs?: Array<{
83
129
  name: string;
84
130
  type: C | 'auto';
@@ -117,6 +163,15 @@ interface NodeContext {
117
163
  structStructFields: Map<string, StructFields>;
118
164
  };
119
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;
120
175
  /**
121
176
  * infer
122
177
  */
@@ -127,57 +182,6 @@ type ExtractPairs<T> = T extends readonly [infer L, infer R, string] ? [L, R] |
127
182
  type OperatorTypeRules = ExtractPairs<_OperatorTypeRulesMap[number]>;
128
183
  type IsInRules<L extends C, R extends C> = [L, R] extends OperatorTypeRules ? 1 : 0;
129
184
  type ValidateOperator<L extends C, R extends C> = L extends R ? 1 : IsInRules<L, R>;
130
- /**
131
- * swizzle
132
- */
133
- 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;
134
- type _SwizzleBaseMap = {
135
- float: 'float';
136
- vec2: 'float';
137
- vec3: 'float';
138
- vec4: 'float';
139
- int: 'int';
140
- ivec2: 'int';
141
- ivec3: 'int';
142
- ivec4: 'int';
143
- uint: 'uint';
144
- uvec2: 'uint';
145
- uvec3: 'uint';
146
- uvec4: 'uint';
147
- bool: 'bool';
148
- bvec2: 'bool';
149
- bvec3: 'bool';
150
- bvec4: 'bool';
151
- };
152
- type _SwizzleResultMap = {
153
- float: {
154
- 1: 'float';
155
- 2: 'vec2';
156
- 3: 'vec3';
157
- 4: 'vec4';
158
- };
159
- int: {
160
- 1: 'int';
161
- 2: 'ivec2';
162
- 3: 'ivec3';
163
- 4: 'ivec4';
164
- };
165
- uint: {
166
- 1: 'uint';
167
- 2: 'uvec2';
168
- 3: 'uvec3';
169
- 4: 'uvec4';
170
- };
171
- bool: {
172
- 1: 'bool';
173
- 2: 'bvec2';
174
- 3: 'bvec3';
175
- 4: 'bvec4';
176
- };
177
- };
178
- type _SwizzleBase<T extends C> = T extends keyof _SwizzleBaseMap ? _SwizzleBaseMap[T] : never;
179
- type _SwizzleResult<T extends C, L extends 1 | 2 | 3 | 4> = _SwizzleResultMap[_SwizzleBase<T>][L];
180
- type InferSwizzleType<T extends C, S extends string> = _SwizzleLength<S> extends infer L extends 1 | 2 | 3 | 4 ? _SwizzleResult<_SwizzleBase<T>, L> : never;
181
185
  /**
182
186
  * Swizzles
183
187
  */
package/dist/index.js CHANGED
@@ -34,5 +34,5 @@ fn main(out: Out) -> @location(0) vec4f {
34
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}`)},_=(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"));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};
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