glre 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -26
- package/dist/addons.d.ts +41 -51
- package/dist/index.cjs +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +43 -91
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +1 -1
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.ts +51 -94
- package/dist/native.js +1 -1
- package/dist/native.js.map +1 -1
- package/dist/node.cjs +15 -15
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +41 -52
- package/dist/node.js +14 -14
- package/dist/node.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.ts +43 -92
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/solid.cjs +1 -1
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.ts +43 -92
- package/dist/solid.js +1 -1
- package/dist/solid.js.map +1 -1
- package/package.json +1 -1
- package/src/{utils/helpers.ts → helpers.ts} +10 -32
- package/src/index.ts +45 -42
- package/src/native.ts +6 -7
- package/src/node/build.ts +6 -21
- package/src/node/create.ts +2 -4
- package/src/node/index.ts +8 -20
- package/src/node/types.ts +9 -1
- package/src/node/utils/index.ts +5 -25
- package/src/node/utils/infer.ts +4 -12
- package/src/node/utils/parse.ts +18 -34
- package/src/node/utils/utils.ts +3 -11
- package/src/react.ts +9 -12
- package/src/solid.ts +3 -10
- package/src/types.ts +30 -22
- package/src/webgl/compute.ts +56 -0
- package/src/webgl/graphic.ts +65 -0
- package/src/webgl/index.ts +21 -0
- package/src/{utils/program.ts → webgl/utils.ts} +30 -8
- package/src/webgpu/compute.ts +39 -0
- package/src/webgpu/graphic.ts +89 -0
- package/src/webgpu/index.ts +42 -0
- package/src/{utils/pipeline.ts → webgpu/utils.ts} +75 -78
- package/src/utils/webgl.ts +0 -135
- package/src/utils/webgpu.ts +0 -178
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/helpers.ts","../src/utils/webgl.ts","../src/utils/program.ts","../src/utils/webgpu.ts","../src/utils/pipeline.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { is } from './utils/helpers'\nimport { webgl } from './utils/webgl'\nimport { webgpu } from './utils/webgpu'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './types'\n\nexport const isGL = (a: unknown): a is EventState<GL> => {\n if (!is.obj(a)) return false\n if ('isGL' in a) return true\n return false\n}\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\nlet iTime = performance.now()\n\nexport const createGL = (props?: 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 isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n instanceCount: 1,\n particleCount: 1024,\n precision: 'highp',\n webgl: {},\n webgpu: {},\n loading: 0,\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 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.uniform = durable((k, v) => gl.queue(() => gl._uniform?.(k, v)), gl)\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)), gl)\n gl.uniform({ iResolution: gl.size, iMouse: [0, 0], iTime })\n\n gl('mount', async () => {\n if (!isWebGPUSupported()) gl.isWebGL = true\n gl.vs = gl.vs || gl.vert || gl.vertex\n gl.fs = gl.fs || gl.frag || gl.fragment\n gl.cs = gl.cs || gl.comp || gl.compute\n if (gl.isWebGL) {\n gl((await webgl(gl)) as GL)\n } else gl((await webgpu(gl)) as GL)\n if (gl.isError) return // stop if error\n gl.resize()\n gl.frame(() => {\n gl.loop()\n gl.queue.flush()\n if (gl.loading) return true // wait for textures @TODO FIX\n gl.render()\n return gl.isLoop\n })\n if (gl.isNative) return\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.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('resize', () => {\n const w = gl.width || window.innerWidth\n const h = gl.height || window.innerHeight\n gl.size[0] = gl.el.width = w\n gl.size[1] = gl.el.height = h\n gl.uniform('iResolution', gl.size)\n })\n\n gl('mousemove', (_e: any, x = _e.clientX, y = _e.clientY) => {\n const [w, h] = gl.size\n const { top, left } = gl.el.getBoundingClientRect()\n gl.mouse[0] = (x - top - w / 2) / (w / 2)\n gl.mouse[1] = -(y - left - h / 2) / (h / 2)\n gl.uniform('iMouse', gl.mouse)\n })\n\n gl('loop', () => {\n iTime = performance.now() / 1000\n gl.uniform('iTime', iTime)\n })\n\n return gl(props)\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\n/**\n * other\n */\nexport const replace = (x = '', from = '_', to = '/') => x.split(from).join(to)\nexport const ext = (src = '.pdf') => src.split('.').pop()?.toLowerCase() ?? ''\nexport const fig = (x = 0) => `${x}`.split('.')[1]?.length ?? 0\nexport const dig = (x = 0) => `${x}`.split('.')[0]?.length - (x < 0 ? 1 : 0)\nexport const sig = (value = 0, digit = -2) => {\n digit *= -1\n digit = Math.pow(10, digit)\n value *= digit\n value = Math.round(value)\n value /= digit\n return value\n}\n\nexport const isFloat32 = (value: unknown): value is Float32Array => {\n return value instanceof Float32Array\n}\n\nconst loadingImage = (src: string, fun: (source: HTMLImageElement) => void) => {\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => fun(source))\n}\n\nconst loadingVideo = (src: string, fun: (source: HTMLVideoElement) => void) => {\n const source = document.createElement('video')\n source.crossOrigin = 'anonymous'\n source.muted = true\n source.loop = true\n source.src = src\n source.load()\n source.play()\n source.addEventListener('canplay', fun.bind(null, source), { 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) => {\n const ret = calcStride(arrayLength, count)\n if (!isValidStride(ret))\n error(\n `glre attribute error: Invalid attribute length ${arrayLength}. Must divide by vertex count (${count}) with valid stride (1,2,3,4,9,16)`\n )\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 as cached } from 'reev'\nimport { is, getStride, GLSL_VS, GLSL_FS, loadingTexture } from './helpers'\nimport { createArrayBuffer, cleanStorage, createAttachment, createProgram, createStorage, createTexture, setArrayBuffer, storageSize, updateAttrib, updateInstance, updateUniform } from './program'\nimport type { GL } from '../types'\n\nconst computeProgram = (gl: GL, c: WebGL2RenderingContext) => {\n if (!gl.cs) return null // ignore if no compute shader\n c.getExtension('EXT_color_buffer_float')\n\n let activeUnit = 0 // for texture units\n let currentNum = 0 // for storage buffers\n\n const units = cached(() => activeUnit++)\n const cs = is.str(gl.cs) ? gl.cs : gl.cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, GLSL_VS, gl)!\n const size = storageSize(gl.particleCount)\n\n const uniforms = cached((key) => c.getUniformLocation(pg, key)!)\n const storages = cached((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 const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n updateUniform(c, uniforms(key), value)\n }\n\n const _storage = (key: string, value: number[]) => {\n const { ping, pong, unit, array } = storages(key)\n createStorage(c, value, size.x, size.y, ping, pong, unit, array)\n }\n\n const clean = () => {\n c.deleteProgram(pg)\n cleanStorage(c, storages.map.values())\n }\n\n const render = () => {\n c.useProgram(pg)\n const attachments = storages.map.values().map(({ ping, pong, loc, unit }, index) => {\n const [i, o] = currentNum % 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 currentNum++\n }\n\n return { render, clean, _uniform, _storage, storages }\n}\n\nexport const webgl = async (gl: GL) => {\n const config = { isWebGL: true, gl }\n const c = (gl.webgl.context = gl.el!.getContext('webgl2')!)\n const cp = computeProgram(gl, c)\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs!.fragment(config)) : GLSL_FS\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs!.vertex(config)) : GLSL_VS\n const pg = (gl.webgl.program = createProgram(c, fs, vs, gl)!)\n c.useProgram(pg)\n\n let activeUnit = 0 // for texture units\n\n const units = cached(() => activeUnit++)\n const uniforms = (gl.webgl.uniforms = cached((key) => c.getUniformLocation(pg, key)))\n\n const attribs = cached((key, value: number[], isInstance = false) => {\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count, gl.error)\n const location = c.getAttribLocation(pg, key)\n const { array, buffer } = createArrayBuffer(c, value)\n return { array, buffer, location, stride }\n })\n\n const _attribute = (key = '', value: number[]) => {\n const { array, buffer, location, stride } = attribs(key, value)\n setArrayBuffer(c, array, buffer, value)\n updateAttrib(c, location, stride, buffer)\n }\n\n const _instance = (key: string, value: number[]) => {\n const { array, buffer, location, stride } = attribs(key, value, true)\n setArrayBuffer(c, array, buffer, value)\n updateInstance(c, location, stride, buffer)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n updateUniform(c, uniforms(key)!, value)\n cp?._uniform(key, value)\n }\n\n const _texture = (key: string, src: string) => {\n gl.loading++\n c.useProgram(pg)\n loadingTexture(src, (source, isVideo) => {\n const unit = units(key)\n const loop = createTexture(c, source, uniforms(key)!, unit, isVideo)\n if (loop) gl({ loop })\n gl.loading--\n })\n }\n\n const clean = () => {\n cp?.clean()\n c.deleteProgram(pg)\n c.getExtension('WEBGL_lose_context')?.loseContext()\n }\n\n const render = () => {\n cp?.render()\n c.useProgram(pg)\n c.viewport(0, 0, ...gl.size)\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 if (gl.isDepth) {\n c.enable(c.DEPTH_TEST)\n c.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n c.cullFace(c.BACK)\n }\n\n if (gl.wireframe) {\n const ext = c.getExtension('WEBGL_polygon_mode')\n ext.polygonModeWEBGL(c.FRONT_AND_BACK, ext.LINE_WEBGL)\n }\n\n return { render, clean, _attribute, _instance, _uniform, _texture, _storage: cp?._storage }\n}\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 createArrayBuffer = (c: WebGL2RenderingContext, data: number[]) => {\n const array = new Float32Array(data)\n const buffer = c.createBuffer()\n return { array, buffer }\n}\n\nexport const setArrayBuffer = (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, value: number | number[]) => {\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, loc: WebGLUniformLocation, unit: number, isVideo = false) => {\n const texture = c.createTexture()\n c.bindTexture(c.TEXTURE_2D, texture)\n c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, el)\n if (!isVideo) c.generateMipmap(c.TEXTURE_2D)\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","import { nested as cached } from 'reev'\nimport { is, getStride, WGSL_FS, WGSL_VS, loadingTexture } from './helpers'\nimport {\n createArrayBuffer,\n createBindGroup,\n createBindings,\n createComputePipeline,\n createDepthTexture,\n createDescriptor,\n createDevice,\n createPipeline,\n createTextureSampler,\n createVertexBuffers,\n workgroupCount,\n} from './pipeline'\nimport type { GL, WebGPUState } from '../types'\n\nconst computeProgram = (gl: GL, device: GPUDevice, bindings: any) => {\n let flush = (_pass: GPUComputePassEncoder) => {}\n\n const storages = cached((_key, value: number[] | Float32Array) => {\n const { array, buffer } = createArrayBuffer(device, value, 'storage')\n const { binding, group } = bindings.storage()\n return { array, buffer, binding, group }\n })\n\n const _storage = (key: string, value: number[] | Float32Array) => {\n const { array, buffer } = storages(key, value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const update = (bindGroups: GPUBindGroup[], bindGroupLayouts: GPUBindGroupLayout[], comp: string) => {\n const pipeline = createComputePipeline(device, bindGroupLayouts, comp!)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const { x, y, z } = workgroupCount(gl.particleCount)\n pass.dispatchWorkgroups(x, y, z)\n pass.end()\n }\n }\n\n const render = (pass: GPUComputePassEncoder) => {\n flush(pass)\n }\n\n const clean = () => {\n for (const { buffer } of storages.map.values()) buffer.destroy()\n }\n\n return { storages, _storage, update, render, clean }\n}\n\nexport const webgpu = async (gl: GL) => {\n const context = gl.el!.getContext('webgpu') as GPUCanvasContext\n const { device, format } = await createDevice(context, gl.error)\n const bindings = createBindings()\n const cp = computeProgram(gl, device, bindings)\n let frag: string\n let comp: string\n let vert: string\n let flush = (_pass: GPURenderPassEncoder) => {}\n let needsUpdate = true\n let depthTexture: GPUTexture\n\n const attribs = cached((_key, value: number[], isInstance = false) => {\n needsUpdate = true\n const stride = getStride(value.length, isInstance ? gl.instanceCount : gl.count)\n const { location } = bindings.attrib()\n const { array, buffer } = createArrayBuffer(device, value, 'attrib')\n return { array, buffer, location, stride, isInstance }\n })\n\n const uniforms = cached((_key, value: number[]) => {\n needsUpdate = true\n const { binding, group } = bindings.uniform()\n const { array, buffer } = createArrayBuffer(device, value, 'uniform')\n return { array, buffer, binding, group }\n })\n\n const textures = cached((_key, width = 0, height = 0) => {\n needsUpdate = true\n const { binding, group } = bindings.texture()\n const { texture, sampler } = createTextureSampler(device, width, height)\n return { texture, sampler, binding, group, view: texture.createView() }\n })\n\n const _attribute = (key = '', value: number[]) => {\n const { array, buffer } = attribs(key, value)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _instance = (key: string, value: number[]) => {\n const { array, buffer } = attribs(key, value, true)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n if (is.num(value)) value = [value]\n const { array, buffer } = uniforms(key, value)\n array.set(value)\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _texture = (key: string, src: string) => {\n gl.loading++\n loadingTexture(src, (source, isVideo) => {\n const [width, height] = isVideo\n ? [source.videoWidth, source.videoHeight]\n : [source.width, source.height]\n const { texture } = textures(key, width, height)\n const loop = () => {\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\n }\n loop()\n if (isVideo) gl({ loop })\n gl.loading--\n })\n }\n\n const update = () => {\n const { vertexBuffers, bufferLayouts } = createVertexBuffers(attribs.map.values())\n const { bindGroups, bindGroupLayouts } = createBindGroup(\n device,\n uniforms.map.values(),\n textures.map.values(),\n cp.storages.map.values()\n )\n const pipeline = createPipeline(device, format, bufferLayouts, bindGroupLayouts, vert, frag)\n flush = (pass) => {\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => pass.setVertexBuffer(i, v))\n pass.draw(gl.count, gl.instanceCount, 0, 0)\n pass.end()\n }\n if (gl.cs) cp.update(bindGroups, bindGroupLayouts, comp)\n }\n\n const render = () => {\n if (!frag || !vert) {\n const config = { isWebGL: false, gl }\n frag = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : WGSL_FS\n vert = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : WGSL_VS\n comp = gl.cs ? (is.str(gl.cs) ? gl.cs : gl.cs.compute(config)) : ''\n }\n if (gl.loading) return // MEMO: loading after build node\n if (needsUpdate) update()\n needsUpdate = false\n const encoder = device.createCommandEncoder()\n if (gl.cs) cp.render(encoder.beginComputePass())\n flush(encoder.beginRenderPass(createDescriptor(context, depthTexture)))\n device.queue.submit([encoder.finish()])\n }\n\n const resize = () => {\n const canvas = gl.el as HTMLCanvasElement\n depthTexture?.destroy()\n depthTexture = createDepthTexture(device, canvas.width, canvas.height)\n }\n\n const clean = () => {\n device.destroy()\n depthTexture?.destroy()\n for (const { texture } of textures.map.values()) texture.destroy()\n for (const { buffer } of uniforms.map.values()) buffer.destroy()\n for (const { buffer } of attribs.map.values()) buffer.destroy()\n cp.clean()\n }\n\n resize()\n\n const webgpu = { device, uniforms, textures, attribs, storages: cp.storages } as WebGPUState\n\n return { webgpu, render, resize, clean, _attribute, _instance, _uniform, _texture, _storage: cp._storage }\n}\n","import { is, isFloat32 } from './helpers'\nimport type { AttribData, TextureData, UniformData, StorageData } from '../types'\n\n/**\n * initialize\n */\nexport const createDevice = async (c: GPUCanvasContext, log = console.log) => {\n const gpu = navigator.gpu\n const format = gpu.getPreferredCanvasFormat()\n const adapter = await gpu.requestAdapter()\n const device = await adapter!.requestDevice()\n device.onuncapturederror = (e) => log(e.error.message)\n c.configure({ device, format, alphaMode: 'opaque' })\n return { device, format }\n}\n\nexport const createBindings = () => {\n let uniform = 0\n let texture = 0\n let storage = 0\n let attrib = 0\n return {\n uniform: () => {\n const group = Math.floor(uniform / 12)\n const binding = uniform % 12\n uniform++\n return { group, binding }\n },\n texture: () => {\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 storage: () => {\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 attrib: () => {\n const location = attrib\n attrib++\n return { location }\n },\n }\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\nexport const createVertexBuffers = (attribs: Iterable<AttribData & { isInstance?: boolean }>) => {\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\nexport const createBindGroup = (\n device: GPUDevice,\n uniforms: Iterable<UniformData>,\n textures: Iterable<TextureData>,\n storages: Iterable<StorageData> = []\n) => {\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: i } of uniforms) {\n add(i, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group: i } of storages) {\n add(i, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group: i, sampler, view } of textures) {\n add(i, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(i, { 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\nexport const createPipeline = (\n device: GPUDevice,\n format: GPUTextureFormat,\n bufferLayouts: GPUVertexBufferLayout[],\n bindGroupLayouts: GPUBindGroupLayout[],\n vs: string,\n fs: string\n) => {\n return device.createRenderPipeline({\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 layout: device.createPipelineLayout({ bindGroupLayouts }),\n primitive: { topology: 'triangle-list' },\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n })\n}\n\nexport const createComputePipeline = (device: GPUDevice, bindGroupLayouts: GPUBindGroupLayout[], cs: string) => {\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\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n}\n\nexport const createArrayBuffer = (\n device: GPUDevice,\n array: number[] | Float32Array,\n type: 'uniform' | 'storage' | 'attrib'\n) => {\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 createDescriptor = (c: GPUCanvasContext, depthTexture: GPUTexture) => {\n return {\n colorAttachments: [\n {\n view: c.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear' as GPULoadOp,\n storeOp: 'store' as GPUStoreOp,\n },\n ],\n depthStencilAttachment: {\n view: depthTexture.createView(),\n depthClearValue: 1.0,\n depthLoadOp: 'clear' as GPULoadOp,\n depthStoreOp: 'store' as GPUStoreOp,\n },\n } as GPURenderPassDescriptor\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 }\n}\n\nexport const createDepthTexture = (device: GPUDevice, width: number, height: number) => {\n return device.createTexture({\n size: [width, height],\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n })\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"],"mappings":"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","names":["src_exports","__export","createGL","src_default","isGL","isServer","isWebGPUSupported","__toCommonJS","import_reev","import_refr","is","a","isFloat32","value","loadingImage","src","fun","source","loadingVideo","loadingTexture","is","isVideo","el","isValidStride","stride","calcStride","arrayLength","count","getStride","error","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","createArrayBuffer","data","array","buffer","setArrayBuffer","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","computeProgram","gl","c","activeUnit","currentNum","units","cached","cs","is","pg","createProgram","GLSL_VS","size","storageSize","uniforms","key","storages","array","ping","pong","attachments","loc","unit","index","i","o","createAttachment","cleanStorage","value","updateUniform","createStorage","webgl","config","cp","fs","GLSL_FS","vs","attribs","isInstance","stride","getStride","location","buffer","createArrayBuffer","_attribute","setArrayBuffer","updateAttrib","_instance","updateInstance","_uniform","_texture","src","loadingTexture","source","isVideo","loop","createTexture","clean","render","ext","import_reev","createDevice","c","log","gpu","format","device","e","createBindings","uniform","texture","storage","attrib","group","binding","location","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","createComputePipeline","cs","bufferUsage","type","createArrayBuffer","array","isFloat32","usage","size","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","workgroupCount","particleCount","workgroupSize","is","x","y","z","computeProgram","gl","device","bindings","flush","_pass","storages","cached","_key","value","array","buffer","createArrayBuffer","binding","group","key","bindGroups","bindGroupLayouts","comp","pipeline","createComputePipeline","pass","v","i","x","y","z","workgroupCount","webgpu","context","format","createDevice","createBindings","cp","frag","vert","needsUpdate","depthTexture","attribs","isInstance","stride","getStride","location","uniforms","textures","width","height","texture","sampler","createTextureSampler","_attribute","_instance","_uniform","is","_texture","src","loadingTexture","source","isVideo","loop","update","vertexBuffers","bufferLayouts","createVertexBuffers","createBindGroup","createPipeline","render","config","WGSL_FS","WGSL_VS","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","k","v","i","at","webgl","webgpu","w","h","_e","x","y","top","left","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) gl.el = document.createElement('canvas')\n for (const arg of args) {\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 || arg.count || 6\n gl.instanceCount = arg.instanceCount || 1\n gl.particleCount = arg.particleCount || 1024\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)\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) => {\n const ret = calcStride(arrayLength, count)\n if (!isValidStride(ret)) error(`glre attribute error: Invalid attribute length ${arrayLength}. 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 if (!gl.cs) return\n const c = gl.gl\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 const cs = is.str(gl.cs) ? gl.cs : gl.cs!.compute({ isWebGL: true, gl, units })\n const pg = createProgram(c, cs, GLSL_VS, gl)!\n const size = storageSize(gl.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 const config = { isWebGL: true, gl }\n const c = gl.gl\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : GLSL_FS\n const 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.triangleCount, gl.error)\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.triangleCount, gl.instanceCount)\n } else c.drawArrays(c.TRIANGLES, 0, gl.triangleCount)\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 { Binding } from './utils'\nimport type { GL } from '../types'\n\nexport const compute = (gl: GL, bindings: Binding) => {\n let pipeline: GPUComputePipeline | undefined\n let bindGroups: GPUBindGroup[] | undefined\n\n const storages = nested((key, value: number[] | Float32Array) => {\n return { ...bindings.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.encoder.beginComputePass()\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n const { x, y, z } = workgroupCount(gl.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: i } of uniforms) {\n add(i, { binding, visibility: 7, buffer: { type: 'uniform' } }, { binding, resource: { buffer } })\n }\n for (const { binding, buffer, group: i } of storages) {\n add(i, { binding, visibility: 6, buffer: { type: 'storage' } }, { binding, resource: { buffer } })\n }\n for (const { binding: b, group: i, sampler, view } of textures) {\n add(i, { binding: b, visibility: 2, sampler: {} }, { binding: b, resource: sampler })\n add(i, { 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) => {\n return device.createRenderPipeline({\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 layout: device.createPipelineLayout({ bindGroupLayouts }),\n primitive: { topology: 'triangle-list' },\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n })\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) => {\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)\n return { bindGroups, vertexBuffers, computePipeline, graphicPipeline }\n}\n\n/**\n * buffers\n */\nconst bufferUsage = (type: 'uniform' | 'storage' | 'attrib') => {\n if (type === 'uniform') return 72 // GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n if (type === 'attrib') return 40 // GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST\n return 140 // 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 return {\n colorAttachments: [{ view: c.getCurrentTexture().createView(), clearValue: { r: 0, g: 0, b: 0, a: 0 }, loadOp: 'clear', storeOp: 'store' }],\n depthStencilAttachment: { view: depthTexture.createView(), depthClearValue: 1.0, depthLoadOp: 'clear', depthStoreOp: 'store' },\n } as GPURenderPassDescriptor\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 { is, getStride, loadingTexture } from '../helpers'\nimport { createBuffer, createDepthTexture, createDescriptor, createTextureSampler, updateBuffer } from './utils'\nimport type { Binding } from './utils'\nimport type { GL } from '../types'\n\nexport const graphic = (gl: GL, bindings: Binding, update = () => {}) => {\n let pipeline: GPURenderPipeline\n let bindGroups: GPUBindGroup[]\n let vertexBuffers: GPUBuffer[]\n let depthTexture: GPUTexture\n\n const attributes = nested((key, value: number[], isInstance = false, stride = getStride(value.length, isInstance ? gl.instanceCount : gl.triangleCount)) => {\n update()\n return { ...bindings.attrib(key), ...createBuffer(gl.device, value, 'attrib'), isInstance, stride }\n })\n\n const uniforms = nested((key, value: number[] | Float32Array) => {\n update()\n return { ...bindings.uniform(key), ...createBuffer(gl.device, value, 'uniform') }\n })\n\n const textures = nested((key, width = 1, height = 1) => {\n update()\n return { ...bindings.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 if (t.texture.width !== width || t.texture.height !== 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 }\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 const pass = gl.encoder.beginRenderPass(createDescriptor(gl.gpu, depthTexture))\n pass.setPipeline(pipeline)\n bindGroups.forEach((v, i) => pass.setBindGroup(i, v))\n vertexBuffers.forEach((v, i) => pass.setVertexBuffer(i, v))\n pass.draw(gl.triangleCount, gl.instanceCount, 0, 0)\n pass.end()\n })\n\n gl('resize', () => {\n const canvas = gl.el as HTMLCanvasElement\n depthTexture?.destroy()\n depthTexture = createDepthTexture(gl.device, canvas.width, canvas.height)\n })\n\n gl('clean', () => {\n depthTexture?.destroy()\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, createDevice, updatePipeline } from './utils'\nimport { is, WGSL_FS, WGSL_VS } from '../helpers'\nimport type { GL } from '../types'\n\nexport const webgpu = async (gl: GL) => {\n let isUpdate = false\n const isInit = !gl.gl\n if (isInit) {\n const gpu = gl.el!.getContext('webgpu') as GPUCanvasContext\n const { device, format } = await createDevice(gpu, gl.error)\n gl({ device, format, gpu })\n }\n\n gl('render', () => {\n if (isUpdate) update()\n gl.encoder = gl.device.createCommandEncoder()\n })\n\n const binding = createBinding()\n const c = compute(gl, binding)\n const g = graphic(gl, binding, () => (isUpdate = true))\n const update = () => {\n isUpdate = false\n const config = { isWebGL: false, gl, binding }\n const fs = gl.fs ? (is.str(gl.fs) ? gl.fs : gl.fs.fragment(config)) : WGSL_FS\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : WGSL_VS\n const cs = gl.cs ? (is.str(gl.cs) ? gl.cs : gl.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)\n c.set(p.computePipeline, p.bindGroups)\n g.set(p.graphicPipeline, p.bindGroups, p.vertexBuffers)\n }\n\n gl('render', () => {\n if (gl.encoder) gl.device.queue.submit([gl.encoder.finish()])\n })\n\n gl('clean', () => {\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","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","c","_texture","_storage","units","cs","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","config","c","fs","is","GLSL_FS","vs","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","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","bindings","pipeline","bindGroups","storages","key","value","createBuffer","array","buffer","updateBuffer","pass","v","i","x","y","z","workgroupCount","_pipeline","_bindGroups","import_reev","graphic","gl","bindings","update","pipeline","bindGroups","vertexBuffers","depthTexture","attributes","key","value","isInstance","stride","getStride","createBuffer","uniforms","textures","width","height","createTextureSampler","a","updateBuffer","is","u","src","t","loadingTexture","source","isVideo","render","pass","createDescriptor","v","i","canvas","createDepthTexture","buffer","texture","_pipeline","_bindGroups","_vertexBuffers","webgpu","gl","isUpdate","gpu","device","format","createDevice","update","binding","createBinding","c","compute","g","graphic","config","fs","is","WGSL_FS","vs","WGSL_VS","cs","p","updatePipeline","isServer","isWebGPUSupported","findElement","arg","createGL","args","gl","iTime","k","v","at","el","isAppend","is","webgl","webgpu","rect","_e","x","y","src_default"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as reev from 'reev';
|
|
2
|
+
import { EventState } from 'reev';
|
|
2
3
|
import { Queue, Frame } from 'refr';
|
|
3
|
-
import { EventState, Nested } from 'reev';
|
|
4
4
|
|
|
5
5
|
declare const CONVERSIONS: readonly ["toBool", "toUInt", "toInt", "toFloat", "toBVec2", "toIVec2", "toUVec2", "toVec2", "toBVec3", "toIVec3", "toUVec3", "toVec3", "toBVec4", "toIVec4", "toUVec4", "toVec4", "toColor", "toMat2", "toMat3", "toMat4"];
|
|
6
6
|
declare const TYPE_MAPPING: {
|
|
@@ -69,6 +69,28 @@ declare const OPERATOR_TYPE_RULES: readonly [readonly ["float", "vec2", "vec2"],
|
|
|
69
69
|
*/
|
|
70
70
|
declare const FUNCTIONS: readonly [...("texture" | "all" | "any" | "determinant" | "distance" | "dot" | "length" | "lengthSq" | "luminance" | "cross" | "cubeTexture" | "texelFetch" | "textureLod")[], "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "cos", "cosh", "dFdx", "dFdy", "degrees", "exp", "exp2", "floor", "fract", "fwidth", "inverse", "inverseSqrt", "log", "log2", "negate", "normalize", "oneMinus", "radians", "reciprocal", "round", "sign", "sin", "sinh", "sqrt", "tan", "tanh", "trunc", "saturate", "atan2", "clamp", "max", "min", "mix", "pow", "reflect", "refract", "smoothstep", "step"];
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* binding
|
|
74
|
+
*/
|
|
75
|
+
declare const createBinding: () => {
|
|
76
|
+
uniform: reev.Nested<{
|
|
77
|
+
group: number;
|
|
78
|
+
binding: number;
|
|
79
|
+
}, []>;
|
|
80
|
+
texture: reev.Nested<{
|
|
81
|
+
group: number;
|
|
82
|
+
binding: number;
|
|
83
|
+
}, []>;
|
|
84
|
+
storage: reev.Nested<{
|
|
85
|
+
group: number;
|
|
86
|
+
binding: number;
|
|
87
|
+
}, []>;
|
|
88
|
+
attrib: reev.Nested<{
|
|
89
|
+
location: number;
|
|
90
|
+
}, []>;
|
|
91
|
+
};
|
|
92
|
+
type Binding = ReturnType<typeof createBinding>;
|
|
93
|
+
|
|
72
94
|
type Constants = (typeof CONSTANTS)[number] | 'void';
|
|
73
95
|
type Conversions = (typeof CONVERSIONS)[number];
|
|
74
96
|
type Functions = (typeof FUNCTIONS)[number];
|
|
@@ -101,6 +123,7 @@ interface NodeProps {
|
|
|
101
123
|
}
|
|
102
124
|
interface NodeContext {
|
|
103
125
|
gl?: Partial<GL>;
|
|
126
|
+
binding?: Binding;
|
|
104
127
|
label?: 'vert' | 'frag' | 'compute';
|
|
105
128
|
isWebGL?: boolean;
|
|
106
129
|
units?: any;
|
|
@@ -111,7 +134,7 @@ interface NodeContext {
|
|
|
111
134
|
fragInputs: Map<string, string>;
|
|
112
135
|
vertInputs: Map<string, string>;
|
|
113
136
|
vertOutputs: Map<string, string>;
|
|
114
|
-
vertVaryings: Map<string,
|
|
137
|
+
vertVaryings: Map<string, VaryingInfo>;
|
|
115
138
|
computeInputs: Map<string, string>;
|
|
116
139
|
dependencies: Map<string, Set<string>>;
|
|
117
140
|
structStructFields: Map<string, StructFields>;
|
|
@@ -207,6 +230,10 @@ type Mat4 = XImpl<'mat4'>;
|
|
|
207
230
|
type Texture$1 = XImpl<'texture'>;
|
|
208
231
|
type Sampler2D = XImpl<'sampler2D'>;
|
|
209
232
|
type StructBase = XImpl<'struct'>;
|
|
233
|
+
interface VaryingInfo {
|
|
234
|
+
node: Y;
|
|
235
|
+
code?: string;
|
|
236
|
+
}
|
|
210
237
|
interface ConstantsToType {
|
|
211
238
|
void: Void;
|
|
212
239
|
bool: Bool;
|
|
@@ -243,6 +270,7 @@ type XImpl<T extends C> = _X<T> & {
|
|
|
243
270
|
};
|
|
244
271
|
type C = Constants;
|
|
245
272
|
type X<T extends C = C> = T extends keyof ConstantsToType ? ConstantsToType[T] : _X<T>;
|
|
273
|
+
type Y<T extends C = C> = number | number[] | string | boolean | undefined | HTMLElement | X<T>;
|
|
246
274
|
type Methods = Functions | Operators | Conversions | Swizzles | '__nodeType' | 'type' | 'props' | 'isProxy' | 'assign' | 'toVar' | 'toString' | 'element' | 'select';
|
|
247
275
|
interface _X<T extends C> {
|
|
248
276
|
readonly __nodeType?: T;
|
|
@@ -391,16 +419,17 @@ type GL = EventState<{
|
|
|
391
419
|
isDebug: boolean;
|
|
392
420
|
isDepth: boolean;
|
|
393
421
|
wireframe: boolean;
|
|
394
|
-
isGL: true;
|
|
395
422
|
width?: number;
|
|
396
423
|
height?: number;
|
|
397
424
|
size: [number, number];
|
|
398
425
|
mouse: [number, number];
|
|
399
426
|
count: number;
|
|
427
|
+
triangleCount: number;
|
|
400
428
|
instanceCount: number;
|
|
401
429
|
particleCount: number | [number, number] | [number, number, number];
|
|
402
430
|
precision: 'lowp' | 'mediump' | 'highp';
|
|
403
|
-
|
|
431
|
+
element?: HTMLCanvasElement;
|
|
432
|
+
elem?: HTMLCanvasElement;
|
|
404
433
|
el: HTMLCanvasElement;
|
|
405
434
|
vs?: string | Vec4;
|
|
406
435
|
cs?: string | Void;
|
|
@@ -411,11 +440,16 @@ type GL = EventState<{
|
|
|
411
440
|
vertex?: string | Vec4;
|
|
412
441
|
compute?: string | Void;
|
|
413
442
|
fragment?: string | Vec4;
|
|
443
|
+
program: WebGLProgram;
|
|
444
|
+
gl: WebGL2RenderingContext;
|
|
445
|
+
gpu: GPUCanvasContext;
|
|
446
|
+
device: GPUDevice;
|
|
447
|
+
format: GPUTextureFormat;
|
|
448
|
+
encoder: GPUCommandEncoder;
|
|
449
|
+
binding: Binding;
|
|
414
450
|
/**
|
|
415
451
|
* core state
|
|
416
452
|
*/
|
|
417
|
-
webgpu: WebGPUState;
|
|
418
|
-
webgl: WebGLState;
|
|
419
453
|
queue: Queue;
|
|
420
454
|
frame: Frame;
|
|
421
455
|
/**
|
|
@@ -428,7 +462,6 @@ type GL = EventState<{
|
|
|
428
462
|
render(): void;
|
|
429
463
|
resize(e?: Event): void;
|
|
430
464
|
mousemove(e: MouseEvent): void;
|
|
431
|
-
loop(): void;
|
|
432
465
|
/**
|
|
433
466
|
* setter
|
|
434
467
|
*/
|
|
@@ -491,90 +524,9 @@ interface StorageData {
|
|
|
491
524
|
binding: number;
|
|
492
525
|
group: number;
|
|
493
526
|
}
|
|
494
|
-
interface WebGPUState {
|
|
495
|
-
device: GPUDevice;
|
|
496
|
-
uniforms: Nested<UniformData>;
|
|
497
|
-
textures: Nested<TextureData>;
|
|
498
|
-
attribs: Nested<AttribData>;
|
|
499
|
-
storages: Nested<StorageData>;
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* for webgl
|
|
503
|
-
*/
|
|
504
|
-
interface WebGLState {
|
|
505
|
-
context: WebGL2RenderingContext;
|
|
506
|
-
program: WebGLProgram;
|
|
507
|
-
uniforms: Nested<WebGLUniformLocation | null>;
|
|
508
|
-
}
|
|
509
527
|
|
|
510
|
-
declare const isGL: (a: unknown) => a is EventState<GL>;
|
|
511
528
|
declare const isServer: () => boolean;
|
|
512
529
|
declare const isWebGPUSupported: () => boolean;
|
|
513
|
-
declare const createGL: (
|
|
514
|
-
isNative: boolean;
|
|
515
|
-
isWebGL: boolean;
|
|
516
|
-
isError: boolean;
|
|
517
|
-
isLoop: boolean;
|
|
518
|
-
isDebug: boolean;
|
|
519
|
-
isDepth: boolean;
|
|
520
|
-
wireframe: boolean;
|
|
521
|
-
isGL: true;
|
|
522
|
-
width?: number;
|
|
523
|
-
height?: number;
|
|
524
|
-
size: [number, number];
|
|
525
|
-
mouse: [number, number];
|
|
526
|
-
count: number;
|
|
527
|
-
instanceCount: number;
|
|
528
|
-
particleCount: number | [number, number] | [number, number, number];
|
|
529
|
-
precision: "lowp" | "mediump" | "highp";
|
|
530
|
-
loading: number;
|
|
531
|
-
el: HTMLCanvasElement;
|
|
532
|
-
vs?: string | Vec4;
|
|
533
|
-
cs?: string | Void;
|
|
534
|
-
fs?: string | Vec4;
|
|
535
|
-
vert?: string | Vec4;
|
|
536
|
-
comp?: string | Void;
|
|
537
|
-
frag?: string | Vec4;
|
|
538
|
-
vertex?: string | Vec4;
|
|
539
|
-
compute?: string | Void;
|
|
540
|
-
fragment?: string | Vec4;
|
|
541
|
-
webgpu: WebGPUState;
|
|
542
|
-
webgl: WebGLState;
|
|
543
|
-
queue: refr.Queue;
|
|
544
|
-
frame: refr.Frame;
|
|
545
|
-
ref?: any;
|
|
546
|
-
mount(): void;
|
|
547
|
-
clean(): void;
|
|
548
|
-
error(e?: string): void;
|
|
549
|
-
render(): void;
|
|
550
|
-
resize(e?: Event): void;
|
|
551
|
-
mousemove(e: MouseEvent): void;
|
|
552
|
-
loop(): void;
|
|
553
|
-
_uniform?(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
|
|
554
|
-
uniform(key: string, value: number | number[] | Float32Array<ArrayBufferLike>, isMatrix?: boolean): GL;
|
|
555
|
-
uniform(target: {
|
|
556
|
-
[key: string]: number | number[] | Float32Array<ArrayBufferLike>;
|
|
557
|
-
}): GL;
|
|
558
|
-
_texture?(key: string, value: string | HTMLImageElement | HTMLVideoElement): GL;
|
|
559
|
-
texture(key: string, value: string | HTMLImageElement | HTMLVideoElement): GL;
|
|
560
|
-
texture(target: {
|
|
561
|
-
[key: string]: string | HTMLImageElement | HTMLVideoElement;
|
|
562
|
-
}): GL;
|
|
563
|
-
_attribute?(key: string, value: number[] | Float32Array<ArrayBufferLike>, iboValue?: number[] | Float32Array<ArrayBufferLike>): GL;
|
|
564
|
-
attribute(key: string, value: number[] | Float32Array<ArrayBufferLike>, iboValue?: number[] | Float32Array<ArrayBufferLike>): GL;
|
|
565
|
-
attribute(target: {
|
|
566
|
-
[key: string]: number[] | Float32Array<ArrayBufferLike>;
|
|
567
|
-
}): GL;
|
|
568
|
-
_instance?(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
|
|
569
|
-
instance(key: string, value: number[] | Float32Array<ArrayBufferLike>, at?: number): GL;
|
|
570
|
-
instance(target: {
|
|
571
|
-
[key: string]: number[] | Float32Array<ArrayBufferLike>;
|
|
572
|
-
}): GL;
|
|
573
|
-
_storage?(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
|
|
574
|
-
storage(key: string, value: number[] | Float32Array<ArrayBufferLike>): GL;
|
|
575
|
-
storage(target: {
|
|
576
|
-
[key: string]: number[] | Float32Array<ArrayBufferLike>;
|
|
577
|
-
}): GL;
|
|
578
|
-
}, any[] | unknown[]>;
|
|
530
|
+
declare const createGL: (...args: Partial<GL>[]) => EventState<GL>;
|
|
579
531
|
|
|
580
|
-
export { type AttribData, type GL, type StorageData, type TextureData, type UniformData,
|
|
532
|
+
export { type AttribData, type GL, type StorageData, type TextureData, type UniformData, createGL, createGL as default, isServer, isWebGPUSupported };
|