glre 0.41.0 → 0.42.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/dist/addons.cjs +1 -1
- package/dist/addons.cjs.map +1 -1
- package/dist/addons.d.ts +378 -7
- package/dist/addons.js +1 -1
- package/dist/addons.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/node.cjs +12 -12
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +12 -12
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
- package/src/addons/color/blend/add.ts +35 -0
- package/src/addons/color/blend/average.ts +35 -0
- package/src/addons/color/blend/color.ts +28 -0
- package/src/addons/color/blend/colorBurn.ts +35 -0
- package/src/addons/color/blend/colorDodge.ts +39 -0
- package/src/addons/color/blend/darken.ts +35 -0
- package/src/addons/color/blend/difference.ts +35 -0
- package/src/addons/color/blend/exclusion.ts +35 -0
- package/src/addons/color/blend/glow.ts +36 -0
- package/src/addons/color/blend/hardLight.ts +36 -0
- package/src/addons/color/blend/hardMix.ts +39 -0
- package/src/addons/color/blend/hue.ts +29 -0
- package/src/addons/color/blend/index.ts +28 -0
- package/src/addons/color/blend/lighten.ts +35 -0
- package/src/addons/color/blend/linearBurn.ts +39 -0
- package/src/addons/color/blend/linearDodge.ts +39 -0
- package/src/addons/color/blend/linearLight.ts +44 -0
- package/src/addons/color/blend/luminosity.ts +28 -0
- package/src/addons/color/blend/multiply.ts +35 -0
- package/src/addons/color/blend/negation.ts +35 -0
- package/src/addons/color/blend/overlay.ts +38 -0
- package/src/addons/color/blend/phoenix.ts +35 -0
- package/src/addons/color/blend/pinLight.ts +40 -0
- package/src/addons/color/blend/reflect.ts +35 -0
- package/src/addons/color/blend/saturation.ts +28 -0
- package/src/addons/color/blend/screen.ts +39 -0
- package/src/addons/color/blend/softLight.ts +63 -0
- package/src/addons/color/blend/subtract.ts +37 -0
- package/src/addons/color/blend/vividLight.ts +44 -0
- package/src/addons/color/composite/compositeXor.ts +40 -0
- package/src/addons/color/composite/destinationAtop.ts +42 -0
- package/src/addons/color/composite/destinationIn.ts +42 -0
- package/src/addons/color/composite/destinationOut.ts +42 -0
- package/src/addons/color/composite/destinationOver.ts +42 -0
- package/src/addons/color/composite/index.ts +9 -0
- package/src/addons/color/composite/sourceAtop.ts +42 -0
- package/src/addons/color/composite/sourceIn.ts +40 -0
- package/src/addons/color/composite/sourceOut.ts +40 -0
- package/src/addons/color/composite/sourceOver.ts +40 -0
- package/src/addons/color/palette/macbeth.ts +31 -33
- package/src/addons/draw/arrows.ts +34 -48
- package/src/addons/draw/axis.ts +24 -42
- package/src/addons/draw/bridge.ts +4 -4
- package/src/addons/draw/char.ts +235 -18
- package/src/addons/draw/circle.ts +22 -1
- package/src/addons/draw/colorChecker.ts +42 -0
- package/src/addons/draw/colorPicker.ts +66 -0
- package/src/addons/draw/digits.ts +334 -0
- package/src/addons/draw/index.ts +4 -0
- package/src/addons/draw/matrix.ts +26 -0
- package/src/addons/draw/point.ts +24 -11
- package/src/addons/geometry/triangle/closestPoint.ts +7 -7
- package/src/addons/index.ts +3 -0
- package/src/addons/math/const.ts +4 -4
- package/src/addons/math/mod289.ts +1 -6
- package/src/addons/math/powFast.ts +4 -10
- package/src/addons/math/quartic.ts +6 -11
- package/src/addons/math/quat/quatLerp.ts +3 -3
- package/src/addons/math/quintic.ts +7 -12
- package/src/addons/math/rotate2d.ts +1 -6
- package/src/addons/math/rotate3d.ts +4 -10
- package/src/addons/math/rotate3dX.ts +3 -12
- package/src/addons/math/rotate3dY.ts +3 -12
- package/src/addons/math/rotate3dZ.ts +3 -12
- package/src/addons/math/rotate4d.ts +4 -10
- package/src/addons/math/rotate4dX.ts +3 -13
- package/src/addons/math/rotate4dY.ts +1 -6
- package/src/addons/math/rotate4dZ.ts +3 -13
- package/src/addons/math/scale2d.ts +16 -32
- package/src/addons/math/toMat3.ts +1 -6
- package/src/addons/math/toMat4.ts +1 -6
- package/src/addons/sdf/arrowSDF.ts +61 -0
- package/src/addons/sdf/boxFrameSDF.ts +31 -0
- package/src/addons/sdf/boxSDF.ts +4 -6
- package/src/addons/sdf/capsuleSDF.ts +17 -0
- package/src/addons/sdf/coneSDF.ts +60 -0
- package/src/addons/sdf/crossSDF.ts +4 -7
- package/src/addons/sdf/cubeSDF.ts +13 -0
- package/src/addons/sdf/cylinderSDF.ts +65 -0
- package/src/addons/sdf/dodecahedronSDF.ts +32 -0
- package/src/addons/sdf/ellipsoidSDF.ts +14 -0
- package/src/addons/sdf/flowerSDF.ts +16 -0
- package/src/addons/sdf/gearSDF.ts +22 -0
- package/src/addons/sdf/heartSDF.ts +17 -0
- package/src/addons/sdf/hexPrismSDF.ts +15 -0
- package/src/addons/sdf/hexSDF.ts +8 -15
- package/src/addons/sdf/icosahedronSDF.ts +23 -0
- package/src/addons/sdf/index.ts +41 -0
- package/src/addons/sdf/juliaSDF.ts +39 -0
- package/src/addons/sdf/kochSDF.ts +49 -0
- package/src/addons/sdf/linkSDF.ts +15 -0
- package/src/addons/sdf/mandelbulbSDF.ts +41 -0
- package/src/addons/sdf/octahedronSDF.ts +30 -0
- package/src/addons/sdf/octogonPrismSDF.ts +19 -0
- package/src/addons/sdf/opElongate.ts +35 -0
- package/src/addons/sdf/opExtrude.ts +14 -0
- package/src/addons/sdf/opIntersection.ts +25 -0
- package/src/addons/sdf/opOnion.ts +12 -0
- package/src/addons/sdf/opRepeat.ts +49 -0
- package/src/addons/sdf/opRevolve.ts +12 -0
- package/src/addons/sdf/opRound.ts +12 -0
- package/src/addons/sdf/opSubtraction.ts +50 -0
- package/src/addons/sdf/opUnion.ts +39 -0
- package/src/addons/sdf/planeSDF.ts +21 -0
- package/src/addons/sdf/polySDF.ts +32 -0
- package/src/addons/sdf/pyramidSDF.ts +29 -0
- package/src/addons/sdf/raysSDF.ts +14 -0
- package/src/addons/sdf/rhombSDF.ts +10 -0
- package/src/addons/sdf/spiralSDF.ts +15 -0
- package/src/addons/sdf/starSDF.ts +47 -0
- package/src/addons/sdf/superShapeSDF.ts +73 -0
- package/src/addons/sdf/tetrahedronSDF.ts +21 -0
- package/src/addons/sdf/torusSDF.ts +27 -0
- package/src/addons/sdf/triPrismSDF.ts +13 -0
- package/src/addons/sdf/triSDF.ts +19 -11
- package/src/addons/sdf/vesicaSDF.ts +23 -0
- package/src/addons/space/bracketing.ts +1 -2
- package/src/addons/space/kaleidoscope.ts +1 -2
- package/src/addons/space/scale.ts +42 -7
- package/src/addons/space/windmillTile.ts +2 -1
- package/src/node/create.ts +2 -3
- package/src/node/utils/index.ts +2 -2
- package/src/utils/webgl.ts +2 -0
package/dist/index.js.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 isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n instanceCount: 1,\n particleCount: 1024,\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 mediump float;\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 {\n createArrayBuffer,\n cleanStorage,\n createAttachment,\n createProgram,\n createStorage,\n createTexture,\n setArrayBuffer,\n storageSize,\n updateAttrib,\n updateInstance,\n updateUniform,\n} from './program'\nimport type { GL, WebGLState } 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.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 = 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 = 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.depthFunc(c.LEQUAL)\n c.enable(c.CULL_FACE)\n }\n\n const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, 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 = (\n c: WebGL2RenderingContext,\n array: Float32Array,\n buffer: WebGLBuffer,\n value: number[]\n) => {\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 = (\n c: WebGL2RenderingContext,\n el: HTMLImageElement | HTMLVideoElement,\n loc: WebGLUniformLocation,\n unit: number,\n isVideo = false\n) => {\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 = (\n c: WebGL2RenderingContext,\n value: number[],\n width: number,\n height: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\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 = (\n c: WebGL2RenderingContext,\n map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>\n) => {\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 = (\n c: WebGL2RenderingContext,\n i: TextureBuffer,\n o: TextureBuffer,\n loc: WebGLUniformLocation,\n unit: number,\n index: number\n) => {\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)) {\n console.warn(\n `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 )\n }\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(\n `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 )\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":["durable","event","createFrame","createQueue","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","cached","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","cached","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","layout","layouts","bindings","i","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","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","v","render","config","WGSL_FS","WGSL_VS","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","event","createQueue","createFrame","durable","k","v","i","at","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}
|
|
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 isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n instanceCount: 1,\n particleCount: 1024,\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 mediump float;\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 {\n createArrayBuffer,\n cleanStorage,\n createAttachment,\n createProgram,\n createStorage,\n createTexture,\n setArrayBuffer,\n storageSize,\n updateAttrib,\n updateInstance,\n updateUniform,\n} from './program'\nimport type { GL, WebGLState } 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.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 = 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 = 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 const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, 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 = (\n c: WebGL2RenderingContext,\n array: Float32Array,\n buffer: WebGLBuffer,\n value: number[]\n) => {\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 = (\n c: WebGL2RenderingContext,\n el: HTMLImageElement | HTMLVideoElement,\n loc: WebGLUniformLocation,\n unit: number,\n isVideo = false\n) => {\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 = (\n c: WebGL2RenderingContext,\n value: number[],\n width: number,\n height: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\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 = (\n c: WebGL2RenderingContext,\n map: Iterable<{ ping: TextureBuffer; pong: TextureBuffer }>\n) => {\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 = (\n c: WebGL2RenderingContext,\n i: TextureBuffer,\n o: TextureBuffer,\n loc: WebGLUniformLocation,\n unit: number,\n index: number\n) => {\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)) {\n console.warn(\n `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 )\n }\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(\n `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 )\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":["durable","event","createFrame","createQueue","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","cached","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","cached","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","layout","layouts","bindings","i","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","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","v","render","config","WGSL_FS","WGSL_VS","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","event","createQueue","createFrame","durable","k","v","i","at","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}
|
package/dist/node.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var O=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var nt=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:!0})},rt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of et(t))!tt.call(e,s)&&s!==n&&O(e,s,{get:()=>t[s],enumerable:!(r=Qe(t,s))||r.enumerable});return e};var ot=e=>rt(O({},"__esModule",{value:!0}),e);var mr={};nt(mr,{Break:()=>vt,Continue:()=>bt,Fn:()=>_t,If:()=>Ct,Loop:()=>ht,Return:()=>Me,Scope:()=>S,Switch:()=>Et,abs:()=>Xn,acos:()=>Sn,acosh:()=>Rn,addToScope:()=>E,all:()=>xn,any:()=>dn,asin:()=>Yn,asinh:()=>Ln,assign:()=>ee,atan:()=>Fn,atan2:()=>ir,atanh:()=>An,attribute:()=>We,bool:()=>kt,builtin:()=>b,bvec2:()=>rn,bvec3:()=>on,bvec4:()=>sn,ceil:()=>Un,clamp:()=>ar,color:()=>pn,compute:()=>J,constant:()=>Be,conversion:()=>T,cos:()=>Nn,cosh:()=>In,create:()=>x,cross:()=>Cn,cubeTexture:()=>hn,dFdx:()=>On,dFdy:()=>wn,degrees:()=>Gn,determinant:()=>Tn,distance:()=>mn,dot:()=>gn,element:()=>ne,exp:()=>Pn,exp2:()=>Dn,float:()=>Ke,floor:()=>Mn,fract:()=>Wn,fragDepth:()=>Ft,fragment:()=>K,frontFacing:()=>Lt,function_:()=>c,fwidth:()=>Vn,gather:()=>He,iMouse:()=>cn,iResolution:()=>Ze,iTime:()=>fn,id:()=>It,instance:()=>Ve,instanceIndex:()=>Yt,int:()=>Bt,inverseSqrt:()=>Bn,ivec2:()=>Zt,ivec3:()=>Jt,ivec4:()=>Qt,length:()=>vn,lengthSq:()=>bn,log:()=>zn,log2:()=>kn,luminance:()=>$n,mat2:()=>qt,mat3:()=>jt,mat4:()=>Kt,max:()=>ur,member:()=>I,min:()=>pr,mix:()=>cr,mod:()=>q,negate:()=>Hn,normalLocal:()=>Pt,normalView:()=>Mt,normalWorld:()=>Dt,normalize:()=>qn,oneMinus:()=>jn,operator:()=>re,pointCoord:()=>Nt,position:()=>je,positionLocal:()=>Ot,positionView:()=>Gt,positionWorld:()=>wt,pow:()=>fr,radians:()=>Kn,reciprocal:()=>Zn,reflect:()=>lr,refract:()=>xr,round:()=>Jn,sampleIndex:()=>At,sampleMask:()=>Ut,sampler2D:()=>un,scatter:()=>St,scoped:()=>te,screenCoordinate:()=>Wt,screenUV:()=>Vt,select:()=>qe,sign:()=>Qn,sin:()=>er,sinh:()=>tr,smoothstep:()=>dr,sqrt:()=>nr,step:()=>Tr,storage:()=>Xt,struct:()=>$t,tan:()=>rr,tanh:()=>or,texelFetch:()=>_n,texture:()=>En,texture2D:()=>an,textureLod:()=>yn,toVar:()=>Q,trunc:()=>sr,uint:()=>zt,uniform:()=>L,uv:()=>ln,uvec2:()=>en,uvec3:()=>tn,uvec4:()=>nn,variable:()=>ze,vec2:()=>se,vec3:()=>oe,vec4:()=>Ht,vertex:()=>Z,vertexIndex:()=>Rt,vertexStage:()=>ke});module.exports=ot(mr);var G=["toBool","toUInt","toInt","toFloat","toBVec2","toIVec2","toUVec2","toVec2","toBVec3","toIVec3","toUVec3","toVec3","toBVec4","toIVec4","toUVec4","toVec4","toColor","toMat2","toMat3","toMat4"],P={bool:"bool",uint:"u32",int:"i32",float:"f32",bvec2:"vec2<bool>",ivec2:"vec2i",uvec2:"vec2u",vec2:"vec2f",bvec3:"vec3<bool>",ivec3:"vec3i",uvec3:"vec3u",vec3:"vec3f",bvec4:"vec4<bool>",ivec4:"vec4i",uvec4:"vec4u",vec4:"vec4f",color:"color",mat2:"mat2x2f",mat3:"mat3x3f",mat4:"mat4x4f",texture:"texture_2d<f32>",sampler2D:"sampler",struct:"struct"},D=Object.keys(P),M={not:"",add:"+",sub:"-",mul:"*",div:"/",mod:"%",equal:"==",notEqual:"!=",lessThan:"<",lessThanEqual:"<=",greaterThan:">",greaterThanEqual:">=",and:"&&",or:"||",bitAnd:"&",bitOr:"|",bitXor:"^",shiftLeft:"<<",shiftRight:">>",addAssign:"+=",subAssign:"-=",mulAssign:"*=",divAssign:"/=",modAssign:"%=",bitAndAssign:"&=",bitOrAssign:"|=",bitXorAssign:"^=",shiftLeftAssign:"<<=",shiftRightAssign:">>="},ie=Object.keys(M),W={1:"float",2:"vec2",3:"vec3",4:"vec4",9:"mat3",16:"mat4"},ae={position:"vec4",vertex_index:"uint",instance_index:"uint",front_facing:"bool",frag_depth:"float",sample_index:"uint",sample_mask:"uint",point_coord:"vec2",global_invocation_id:"uvec3",positionLocal:"vec3",positionWorld:"vec3",positionView:"vec3",normalLocal:"vec3",normalWorld:"vec3",normalView:"vec3",screenCoordinate:"vec2",screenUV:"vec2",gl_FragCoord:"vec4",gl_VertexID:"uint",gl_InstanceID:"uint",gl_FrontFacing:"bool",gl_FragDepth:"float",gl_SampleID:"uint",gl_SampleMask:"uint",gl_PointCoord:"vec2",normal:"vec3",uv:"vec2",color:"vec4"},ue=["equal","notEqual","lessThan","lessThanEqual","greaterThan","greaterThanEqual"],pe=["and","or"],ce=[["float","vec2","vec2"],["float","vec3","vec3"],["float","vec4","vec4"],["int","ivec2","ivec2"],["int","ivec3","ivec3"],["int","ivec4","ivec4"],["uint","uvec2","uvec2"],["uint","uvec3","uvec3"],["uint","uvec4","uvec4"],["mat2","vec2","vec2"],["mat3","vec3","vec3"],["mat4","vec4","vec4"],["vec2","mat2","vec2"],["vec3","mat3","vec3"],["vec4","mat4","vec4"]],fe={position:"gl_FragCoord",vertex_index:"gl_VertexID",instance_index:"gl_InstanceID",front_facing:"gl_FrontFacing",frag_depth:"gl_FragDepth",sample_index:"gl_SampleID",sample_mask:"gl_SampleMask",point_coord:"gl_PointCoord",uv:"gl_FragCoord.xy"},V={all:"bool",any:"bool",determinant:"float",distance:"float",dot:"float",length:"float",lengthSq:"float",luminance:"float",cross:"vec3",cubeTexture:"vec4",texture:"vec4",texelFetch:"vec4",textureLod:"vec4"},le=[...Object.keys(V),"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"],w=(e,t)=>e===t,st=(e,t)=>ce.some(([n,r,s])=>n===e&&r===t||n===t&&r===e),xe=(e,t,n)=>ue.includes(n)||pe.includes(n)?w(e,t):w(e,t)?!0:st(e,t),de=(e,t,n)=>{if(ue.includes(n)||pe.includes(n))return"bool";if(w(e,t))return e;let r=ce.find(([s,o,a])=>s===e&&o===t||s===t&&o===e);return r?r[2]:e};var l={arr:Array.isArray,bol:e=>typeof e=="boolean",str:e=>typeof e=="string",num:e=>typeof e=="number",int:e=>Number.isInteger(e),fun:e=>typeof e=="function",und:e=>typeof e>"u",nul:e=>e===null,set:e=>e instanceof Set,map:e=>e instanceof Map,obj:e=>!!e&&e.constructor.name==="Object",nan:e=>typeof e=="number"&&Number.isNaN(e)};var it=e=>[1,2,3,4,9,16].includes(e),at=(e,t=3)=>e%t===0?Math.floor(e/t):-1,B=(e,t=1,n=console.warn)=>{let r=at(e,t);return it(r)||n(`glre attribute error: Invalid attribute length ${e}. Must divide by vertex count (${t}) with valid stride (1,2,3,4,9,16)`),r};var br=`
|
|
2
2
|
struct In { @builtin(vertex_index) vertex_index: u32 }
|
|
3
3
|
struct Out { @builtin(position) position: vec4f }
|
|
4
4
|
@vertex
|
|
@@ -9,7 +9,7 @@ fn main(in: In) -> Out {
|
|
|
9
9
|
out.position = vec4f(x, y, 0.0, 1.0);
|
|
10
10
|
return out;
|
|
11
11
|
}
|
|
12
|
-
`.trim();var
|
|
12
|
+
`.trim();var F=(e=1024)=>{if(l.num(e)){let s=Math.sqrt(e),o=Math.ceil(s);return Number.isInteger(s)||console.warn(`GLRE Storage Warning: particleCount (${e}) is not a square. Using ${o}x${o} texture may waste GPU memory. Consider using [width, height] format for optimal storage.`),{x:o,y:o}}let[t,n,r]=e;if(r!==void 0){let s=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} = ${s}.`),{x:t,y:s}}return{x:t,y:n}};var Te=e=>l.str(e)&&/^[xyzwrgbastpq]{1,4}$/.test(e),me=e=>ie.includes(e),ge=e=>le.includes(e),ve=e=>l.obj(e)?!1:e instanceof Element,be=e=>G.includes(e),R=e=>!e||typeof e!="object"?!1:e.isProxy,z=e=>l.str(e)?D.includes(e):!1,$e=e=>{let t=(e>>16&255)/255,n=(e>>8&255)/255,r=(e&255)/255;return[t,n,r]},ut=0,v=()=>`x${ut++}`,Ce=(e,t)=>{if(t==="global_invocation_id")return`uvec3(uint(gl_FragCoord.y) * uint(${F(e.gl?.particleCount).x}) + uint(gl_FragCoord.x), 0u, 0u)`;let n=fe[t];if(!n)throw new Error(`Error: unknown builtin variable ${t}`);return n},h=(e,t)=>l.str(e)?t?.isWebGL?e:P[e]||e:"",k=e=>M[e]||e,he=e=>{let t=G.indexOf(e);return t!==-1?D[t]:"float"},Ee=e=>(e.code||(e.code={headers:new Map,fragInputs:new Map,vertInputs:new Map,vertOutputs:new Map,vertVaryings:new Map,computeInputs:new Map,dependencies:new Map,structStructFields:new Map},e.isWebGL)||(e.code.fragInputs.set("position","@builtin(position) position: vec4f"),e.code.vertOutputs.set("position","@builtin(position) position: vec4f")),e),_e=e=>l.num(e)||l.str(e)&&/^\d+$/.test(e),A=(e,t="",n)=>{e.code?.dependencies?.has(t)||e.code.dependencies.set(t,new Set),z(n)||e.code.dependencies.get(t).add(n)},pt=(e,t,n)=>e.isWebGL?n==="attribute"?r=>e.gl?.attribute?.(t,r):n==="instance"?r=>e.gl?.instance?.(t,r):n==="texture"?r=>e.gl?.texture?.(t,r):r=>e.gl?.uniform?.(t,r):n==="attribute"?r=>e.gl?._attribute?.(t,r):n==="instance"?r=>e.gl?._instance?.(t,r):n==="texture"?r=>e.gl?._texture?.(t,r):r=>e.gl?._uniform?.(t,r),ct=(e,t)=>{if(l.und(e))return;if(!R(e))return t(e);if(e.type!=="conversion")return;let n=e.props.children?.slice(1);l.und(n?.[0])||t(n.map(r=>r??n[0]))},H=(e,t,n,r,s)=>{let o=pt(e,t,n);return ct(s,o),r.listeners.add(o),o};var ft=e=>ae[e],lt=(e,t,n)=>(xe(e,t,n)||console.warn(`GLRE Type Warning: Invalid operator '${n}' between types '${e}' and '${t}'`),de(e,t,n)),xt=e=>l.bol(e)?"bool":l.str(e)?"texture":l.num(e)?"float":l.arr(e)?W[e.length]:ve(e)?"texture":"void",U=e=>{let t=W[e];if(!t)throw`glre node system error: Cannot infer type from array length ${e}. Check your data size. Supported: 1(float), 2(vec2), 3(vec3), 4(vec4), 9(mat3), 16(mat4)`;return t},ye=(e,t)=>{if(e.length===0)return"void";let[n]=e;return l.str(n)?n:g(n,t)},dt=e=>V[e],Tt=(e,t)=>{let{type:n,props:r}=e,{id:s,children:o=[],inferFrom:a,layout:f}=r,[i,u,m]=o;if(n==="conversion")return i;if(n==="operator")return lt(g(u,t),g(m,t),i);if(n==="builtin")return ft(s);if(n==="function")return dt(i)||g(u,t);if(n==="define")return z(f?.type)?f?.type:!a||a.length===0?"void":ye(a,t);if(n==="attribute"&&l.arr(i)){let $=B(i.length,t.gl?.count,t.gl?.error);return U($)}if(n==="instance"&&l.arr(i)){let $=B(i.length,t.gl?.instanceCount,t.gl?.error);return U($)}if(n==="member"){if(Te(u))return U(u.length);if(R(i)){let $=g(i,t),C=t.code?.structStructFields?.get($);if(C&&C[u])return g(C[u],t)}return"float"}return a?ye(a,t):i?g(i,t):"void"},g=(e,t)=>{if(t||(t={}),!R(e))return xt(e);if(l.arr(e))return U(e.length);if(t.infers||(t.infers=new WeakMap),t.infers.has(e))return t.infers.get(e);let n=Tt(e,t);return t.infers.set(e,n),n};var y=(e,t)=>e.filter(n=>!l.und(n)&&!l.nul(n)).map(n=>p(n,t)).join(", "),Xe=(e,t,n,r)=>{let s=()=>{let u=g(r,e);if(u==="float")return".x";if(u==="vec2")return".xy";if(u==="vec3")return".xyz";if(u==="vec4")return"";throw new Error(`Unsupported storage scatter type: ${u}`)},o=p(n,e),a=F(e.gl?.particleCount),f=`int(${o}) % ${a.x}`,i=`int(${o}) / ${a.x}`;return`texelFetch(${p(t,e)}, ivec2(${f}, ${i}), 0)${s()}`},Se=(e,t,n)=>{let r=p(t,e),s=p(n,e),o=g(n,e);if(o==="float")return`_${r} = vec4(${s}, 0.0, 0.0, 1.0);`;if(o==="vec2")return`_${r} = vec4(${s}, 0.0, 1.0);`;if(o==="vec3")return`_${r} = vec4(${s}, 1.0);`;if(o==="vec4")return`_${r} = ${s};`;throw new Error(`Unsupported storage scatter type: ${o}`)},Re=(e,t,n,r)=>{if(e.isWebGL)return`texture(${y(r?[t,n,r]:[t,n],e)})`;let s=p(t,e),o=[s,s+"Sampler",p(n,e)];return r?(o.push(p(r,e)),`textureSampleLevel(${o})`):`textureSample(${o})`},Ye=(e,t,n,r)=>{let s=`if (${p(t,e)}) {
|
|
13
13
|
${p(n,e)}
|
|
14
14
|
}`;for(let o=2;o<r.length;o+=2){let a=o>=r.length-1;s+=a?` else {
|
|
15
15
|
${p(r[o],e)}
|
|
@@ -22,10 +22,10 @@ break;
|
|
|
22
22
|
`:s+1<n.length&&(r+=`case ${p(n[s],e)}:
|
|
23
23
|
${p(n[s+1],e)}
|
|
24
24
|
break;
|
|
25
|
-
`);return r+="}",r},Fe=(e,t,n)=>{let r=g(t,e),s=n?.props?.id;if(e.isWebGL)return`${r} ${s} = ${p(t,e)};`;let o=h(r);return`var ${s}: ${o} = ${p(t,e)};`},Ae=(e,t,n={})=>{e.code?.structStructFields?.set(t,n);let r=[];for(let o in n){let a=n[o],f=g(a,e);e.isWebGL&&
|
|
25
|
+
`);return r+="}",r},Fe=(e,t,n)=>{let r=g(t,e),s=n?.props?.id;if(e.isWebGL)return`${r} ${s} = ${p(t,e)};`;let o=h(r);return`var ${s}: ${o} = ${p(t,e)};`},Ae=(e,t,n={})=>{e.code?.structStructFields?.set(t,n);let r=[];for(let o in n){let a=n[o],f=g(a,e);e.isWebGL&&A(e,t,f),r.push(e.isWebGL?`${f} ${o};`:`${o}: ${h(f,e)},`)}let s=r.join(`
|
|
26
26
|
`);return`struct ${t} {
|
|
27
27
|
${s}
|
|
28
|
-
};`},Ue=(e,t,n="",r)=>{let s=e.code?.structStructFields?.get(t)||{};if(e.isWebGL)if(r){let o=[];for(let a in s)o.push(r[a]);return`${t} ${n} = ${t}(${y(o,e)});`}else return`${t} ${n};`;else if(r){let o=[];for(let a in s)o.push(r[a]);return`var ${n}: ${t} = ${t}(${y(o,e)});`}else return`var ${n}: ${t};`},Ne=(e,t,n)=>{let{id:r,children:s=[],layout:o}=t,[a,...f]=s,i=[],u=[];for(let
|
|
28
|
+
};`},Ue=(e,t,n="",r)=>{let s=e.code?.structStructFields?.get(t)||{};if(e.isWebGL)if(r){let o=[];for(let a in s)o.push(r[a]);return`${t} ${n} = ${t}(${y(o,e)});`}else return`${t} ${n};`;else if(r){let o=[];for(let a in s)o.push(r[a]);return`var ${n}: ${t} = ${t}(${y(o,e)});`}else return`var ${n}: ${t};`},Ne=(e,t,n)=>{let{id:r,children:s=[],layout:o}=t,[a,...f]=s,i=[],u=[];for(let d=0;d<f.length;d++){let _=o?.inputs?.[d];_?i.push([_.name,_.type==="auto"?g(f[d],e):_.type]):i.push([`p${d}`,g(f[d],e)])}let m=p(a,e),$=g(n,e),C=[];if(e?.isWebGL){for(let[d,_]of i)A(e,r,_),u.push(`${_} ${d}`);A(e,r,$),C.push(`${$} ${r}(${u}) {`)}else{for(let[_,Je]of i)u.push(`${_}: ${h(Je,e)}`);$==="void"?C.push(`fn ${r}(${u}) {`):C.push(`fn ${r}(${u}) -> ${h($,e)} {`)}return m&&C.push(m),C.push("}"),C.join(`
|
|
29
29
|
`)},Ie=(e,t,n)=>e.isWebGL?`${n} ${t};`:`@location(${e.code?.vertVaryings?.size||0}) ${t}: ${h(n,e)}`,Oe=(e,t,n)=>{if(e.isWebGL)return`${n} ${t};`;let{location:r=0}=e.gl?.webgpu?.attribs.map.get(t)||{},s=h(n,e);return`@location(${r}) ${t}: ${s}`},we=(e,t,n)=>{let r=n==="sampler2D"||n==="texture";if(e.isWebGL)return r?`uniform sampler2D ${t};`:`uniform ${n} ${t};`;if(r){let{group:f=1,binding:i=0}=e.gl?.webgpu?.textures.map.get(t)||{};return`@group(${f}) @binding(${i}) var ${t}Sampler: sampler;
|
|
30
30
|
@group(${f}) @binding(${i+1}) var ${t}: texture_2d<f32>;`}let{group:s=0,binding:o=0}=e.gl?.webgpu?.uniforms.map.get(t)||{},a=h(n,e);return`@group(${s}) @binding(${o}) var<uniform> ${t}: ${a};`},Ge=(e,t,n)=>{if(e.isWebGL){let a=`uniform sampler2D ${t};`;if(e.label!=="compute")return a;let f=e.units?.(t);return`${a}
|
|
31
31
|
layout(location = ${f}) out vec4 _${t};`}let{group:r=0,binding:s=0}=e.gl?.webgpu?.storages.map.get(t)||{},o=h(n,e);return`@group(${r}) @binding(${s}) var<storage, read_write> ${t}: array<${o}>;`},Pe=(e,t,n,r)=>{let s=g(t,e),o=p(n,e),a=p(t,e);return e.isWebGL?s==="int"?`for (int ${r} = 0; ${r} < ${a}; ${r} += 1) {
|
|
@@ -48,22 +48,22 @@ ${o}
|
|
|
48
48
|
${o}
|
|
49
49
|
}`:`for (var ${r}: i32 = 0; ${r} < ${a}; ${r}++) {
|
|
50
50
|
${o}
|
|
51
|
-
}`},De=(e,t,n,r)=>e.isWebGL?`const ${n} ${t} = ${r};`:`const ${t}: ${h(n,e)} = ${r};`;var p=(e,t)=>{if(t||(t={}),Ee(t),l.arr(e))return y(e,t);if(l.str(e))return e;if(l.num(e)){let
|
|
52
|
-
`);if(n==="assign")return`${p(i,t)} = ${p(u,t)};`;if(n==="return")return`return ${p(i,t)};`;if(n==="break")return"break;";if(n==="continue")return"continue;";if(n==="loop")return Pe(t,i,u,s);if(n==="if")return Ye(t,i,u,o);if(n==="switch")return Le(t,i,o);if(n==="declare")return Fe(t,i,u);if(n==="define")return t.code?.headers.has(s)||t.code?.headers.set(s,Ne(t,r,e)),`${s}(${y(o.slice(1),t)})`;if(n==="struct")return t.code?.headers.has(s)||t.code?.headers.set(s,Ae(t,s,a)),Ue(t,s,i.props.id,f);if(n==="varying"){if(t.code?.vertOutputs.has(s))return t.isWebGL?`${s}`:`out.${s}`;let
|
|
51
|
+
}`},De=(e,t,n,r)=>e.isWebGL?`const ${n} ${t} = ${r};`:`const ${t}: ${h(n,e)} = ${r};`;var p=(e,t)=>{if(t||(t={}),Ee(t),l.arr(e))return y(e,t);if(l.str(e))return e;if(l.num(e)){let d=`${e}`;return d.includes(".")?d:d+".0"}if(l.bol(e))return e?"true":"false";if(!e||!R(e))return"";let{type:n,props:r={}}=e,{id:s="i",children:o=[],fields:a,initialValues:f}=r,[i,u,m,$]=o;if(n==="variable")return s;if(n==="member")return`${p(i,t)}.${p(u,t)}`;if(n==="element")return`${p(i,t)}[${p(u,t)}]`;if(n==="gather")return t.isWebGL?Xe(t,i,u,e):`${p(i,t)}[${p(u,t)}]`;if(n==="scatter"){let[d,_]=i.props.children??[];return t.isWebGL?Se(t,d,u):`${p(d,t)}[${p(_,t)}] = ${p(u,t)};`}if(n==="ternary")return t.isWebGL?`(${p(m,t)} ? ${p(i,t)} : ${p(u,t)})`:`select(${p(i,t)}, ${p(u,t)}, ${p(m,t)})`;if(n==="conversion")return`${h(i,t)}(${y(o.slice(1),t)})`;if(n==="operator")return i==="not"||i==="bitNot"?`!${p(u,t)}`:i==="mod"?p(q(u,m),t):i.endsWith("Assign")?`${p(u,t)} ${k(i)} ${p(m,t)};`:`(${p(u,t)} ${k(i)} ${p(m,t)})`;if(n==="function"){if(i==="negate")return`(-${p(u,t)})`;if(i==="reciprocal")return`(1.0 / ${p(u,t)})`;if(i==="oneMinus")return`(1.0-${p(u,t)})`;if(i==="saturate")return`clamp(${p(u,t)}, 0.0, 1.0)`;if(i==="texture")return Re(t,u,m,$);if(i==="atan2"&&t.isWebGL)return`atan(${p(u,t)}, ${p(m,t)})`;if(!t.isWebGL){if(i==="dFdx")return`dpdx(${p(u,t)})`;if(i==="dFdy")return`dpdy(${p(u,t)})`}return`${i}(${y(o.slice(1),t)})`}if(n==="scope")return o.map(d=>p(d,t)).join(`
|
|
52
|
+
`);if(n==="assign")return`${p(i,t)} = ${p(u,t)};`;if(n==="return")return`return ${p(i,t)};`;if(n==="break")return"break;";if(n==="continue")return"continue;";if(n==="loop")return Pe(t,i,u,s);if(n==="if")return Ye(t,i,u,o);if(n==="switch")return Le(t,i,o);if(n==="declare")return Fe(t,i,u);if(n==="define")return t.code?.headers.has(s)||t.code?.headers.set(s,Ne(t,r,e)),`${s}(${y(o.slice(1),t)})`;if(n==="struct")return t.code?.headers.has(s)||t.code?.headers.set(s,Ae(t,s,a)),Ue(t,s,i.props.id,f);if(n==="varying"){if(t.code?.vertOutputs.has(s))return t.isWebGL?`${s}`:`out.${s}`;let d=Ie(t,s,g(e,t));return t.code?.fragInputs.set(s,d),t.code?.vertOutputs.set(s,d),t.code?.vertVaryings.set(s,p(i,t)),t.isWebGL?`${s}`:`out.${s}`}if(n==="builtin"){if(t.isWebGL)return Ce(t,s);if(s==="position")return"out.position";let d=`@builtin(${s}) ${s}: ${h(g(e,t),t)}`;return t.label==="compute"?t.code?.computeInputs.set(s,d):t.label==="frag"?t.code?.fragInputs.set(s,d):t.label==="vert"&&t.code?.vertInputs.set(s,d),`in.${s}`}if(n==="attribute"||n==="instance")return H(t,s,n,e,i),t.code?.vertInputs.set(s,Oe(t,s,g(e,t))),t.isWebGL?`${s}`:`in.${s}`;if(t.code?.headers.has(s))return s;let C="";if(n==="uniform"){let d=g(e,t);H(t,s,d,e,i),C=we(t,s,d)}return n==="storage"&&(C=Ge(t,s,g(e,t))),n==="constant"&&(C=De(t,s,g(e,t),p(i,t))),C?(t.code?.headers.set(s,C),s):p(i,t)};var mt=`
|
|
53
53
|
#version 300 es
|
|
54
54
|
precision mediump float;
|
|
55
55
|
out vec4 fragColor;
|
|
56
|
-
`.trim(),gt=(e,t)=>{let n=[],r=new Set,s=new Set,o=a=>{if(s.has(a)||r.has(a))return;s.add(a);let f=t.get(a)||new Set;for(let i of f)e.has(i)&&o(i);s.delete(a),r.add(a),e.has(a)&&n.push([a,e.get(a)])};for(let[a]of e)o(a);return n},
|
|
56
|
+
`.trim(),gt=(e,t)=>{let n=[],r=new Set,s=new Set,o=a=>{if(s.has(a)||r.has(a))return;s.add(a);let f=t.get(a)||new Set;for(let i of f)e.has(i)&&o(i);s.delete(a),r.add(a),e.has(a)&&n.push([a,e.get(a)])};for(let[a]of e)o(a);return n},j=(e,t)=>{let n=p(e,t),r="";t.isWebGL&&t.code?.dependencies?r=gt(t.code.headers,t.code.dependencies).map(([,f])=>f).join(`
|
|
57
57
|
`):r=Array.from(t.code?.headers?.values()||[]).join(`
|
|
58
|
-
`);let[s,o]=n.split("return ");return o?o=o.replace(";",""):[s,o]=["",n],[r,s.trim(),o]},
|
|
58
|
+
`);let[s,o]=n.split("return ");return o?o=o.replace(";",""):[s,o]=["",n],[r,s.trim(),o]},N=(e,t)=>`struct ${e} {
|
|
59
59
|
${Array.from(t.values()).join(`,
|
|
60
60
|
`)}
|
|
61
|
-
}`,
|
|
61
|
+
}`,K=(e,t={})=>{t.code?.headers?.clear(),t.label="frag";let[n,r,s]=j(e,t),o=[];if(t.isWebGL){o.push(mt);for(let f of t.code?.fragInputs?.values()||[])o.push(`in ${f}`);o.push(n),o.push("void main() {"),o.push(` ${r}`),o.push(` fragColor = ${s};`)}else t.code?.fragInputs?.size&&o.push(N("Out",t.code.fragInputs)),o.push(n),o.push(`@fragment
|
|
62
62
|
fn main(out: Out) -> @location(0) vec4f {`),o.push(` ${r}`),o.push(` return ${s};`);o.push("}");let a=o.filter(Boolean).join(`
|
|
63
63
|
`).trim();return t.gl?.isDebug&&console.log(`\u2193\u2193\u2193generated\u2193\u2193\u2193
|
|
64
|
-
${a}`),a},
|
|
64
|
+
${a}`),a},Z=(e,t={})=>{t.code?.headers?.clear(),t.label="vert";let[n,r,s]=j(e,t),o=[];if(t.isWebGL){o.push("#version 300 es");for(let f of t.code?.vertInputs?.values()||[])o.push(`in ${f}`);for(let f of t.code?.vertOutputs?.values()||[])o.push(`out ${f}`);o.push(n),o.push("void main() {"),o.push(` ${r}`),o.push(` gl_Position = ${s};`);for(let[f,i]of t.code?.vertVaryings?.entries()||[])o.push(` ${f} = ${i};`)}else{t.code?.vertInputs?.size&&o.push(N("In",t.code.vertInputs)),t.code?.vertOutputs?.size&&o.push(N("Out",t.code.vertOutputs)),o.push(n),o.push("@vertex"),o.push(`fn main(${t.code?.vertInputs?.size?"in: In":""}) -> Out {`),o.push(" var out: Out;"),o.push(` ${r}`),o.push(` out.position = ${s};`);for(let[f,i]of t.code?.vertVaryings?.entries()||[])o.push(` out.${f} = ${i};`);o.push(" return out;")}o.push("}");let a=o.filter(Boolean).join(`
|
|
65
65
|
`).trim();return t.gl?.isDebug&&console.log(`\u2193\u2193\u2193generated\u2193\u2193\u2193
|
|
66
|
-
${a}`),a},
|
|
66
|
+
${a}`),a},J=(e,t={})=>{t.code?.headers?.clear(),t.label="compute";let[n,r,s]=j(e,t),o=[];t.isWebGL?(o.push("#version 300 es"),o.push("precision mediump float;"),o.push(n),o.push("void main() {"),o.push(` ${r}`),o.push(` ${s};`),o.push("}")):(t.code?.computeInputs?.size&&o.push(N("In",t.code.computeInputs)),o.push(n),o.push("@compute @workgroup_size(32)"),o.push(`fn main(${t.code?.computeInputs?.size?"in: In":""}) {`),o.push(` ${r}`),o.push(` ${s};`),o.push("}"));let a=o.filter(Boolean).join(`
|
|
67
67
|
`).trim();return t.gl?.isDebug&&console.log(`\u2193\u2193\u2193generated\u2193\u2193\u2193
|
|
68
|
-
${a}`),a};var X=null,
|
|
68
|
+
${a}`),a};var X=null,Y=null,E=e=>{if(!X)return;if(X.props.children||(X.props.children=[]),X.props.children.push(e),e.type!=="return"||!Y)return e;let{props:t}=Y;return t.inferFrom||(t.inferFrom=[]),t.inferFrom.push(e),e};function Q(e,t){t||(t=v());let n=x("variable",{id:t,inferFrom:[e]}),r=x("declare",null,e,n);return E(r),n}var ee=(e,t=!1,n)=>{let r=x(t?"scatter":"assign",null,e,n);return E(r),e},Me=e=>E(x("return",{inferFrom:[e]},e)),vt=()=>E(x("break")),bt=()=>E(x("continue")),$t=(e,t=v())=>(n={},r=v())=>{let s=x("variable",{id:r,inferFrom:[t]}),o=x("struct",{id:t,fields:e,initialValues:n},s);return E(o),s},te=(e,t,n=Y)=>{let[r,s]=[X,Y];[X,Y]=[e,n];let o=t();o&&Me(o),[X,Y]=[r,s]},S=e=>{let t=x("scope");return te(t,e),t},Ct=(e,t)=>{let n=S(t),r=x("if",null,e,n);E(r);let s=()=>({ElseIf:(o,a)=>{let f=S(a);return r.props.children.push(o,f),s()},Else:o=>{let a=S(o);r.props.children.push(a)}});return s()},ht=(e,t)=>{let n=v(),r=S(()=>t({i:x("variable",{id:n,inferFrom:[T("int",0)]})})),s=x("loop",{id:n},e,r);return E(s)},Et=e=>{let t=x("switch",null,e);E(t);let n=()=>({Case:(...r)=>s=>{let o=S(s);for(let a of r)t.props.children.push(a,o);return n()},Default:r=>{let s=S(r);t.props.children.push(s)}});return n()};function _t(e,t){let n=v(),r=(...s)=>{let o=t?.name||n,a=[],f=[];for(let m=0;m<s.length;m++){let $=t?.inputs?.[m];$?f.push({id:$.name,inferFrom:$.type==="auto"?[s[m]]:[T($.type,s[m])]}):f.push({id:`p${m}`,inferFrom:[s[m]]})}for(let m of f)a.push(x("variable",m));let i=x("scope"),u=x("define",{id:o,layout:t},i,...s);return te(i,()=>e(a),u),u};return r.getLayout=()=>t,r.setLayout=s=>(t=s,r),r}var yt=(e,t)=>{if(t==="string")return p(e,null)},x=(e,t,...n)=>{t||(t={}),n.length&&(t.children=n);let r=new Set,s=(f,i)=>{if(i==="type")return e;if(i==="props")return t;if(i==="toVar")return Q.bind(null,a);if(i==="isProxy")return!0;if(i==="toString")return p.bind(null,a);if(i==="fragment")return K.bind(null,a);if(i==="compute")return J.bind(null,a);if(i==="vertex")return Z.bind(null,a);if(i===Symbol.toPrimitive)return yt.bind(null,a);if(i==="listeners")return r;if(i==="attribute")return(u=v())=>We(a,u);if(i==="instance")return(u=v())=>Ve(a,u);if(i==="constant")return(u=v())=>Be(a,u);if(i==="uniform")return(u=v())=>L(a,u);if(i==="variable")return(u=v())=>ze(u);if(i==="builtin")return(u=v())=>b(u);if(i==="vertexStage")return(u=v())=>ke(a,u);if(i==="element")return u=>e==="storage"?He(a,u):ne(a,u);if(i==="member")return u=>I(a,u);if(i==="assign")return ee.bind(null,a,a.type==="gather");if(i==="select")return qe.bind(null,a);if(me(i))return i.endsWith("Assign")?(...u)=>E(re(i,a,...u)):(...u)=>re(i,a,...u);if(ge(i))return(...u)=>c(i,a,...u);if(be(i))return()=>T(he(i),a);if(l.str(i))return _e(i)?ne(a,i):I(a,i)},o=(f,i,u)=>(i==="value"&&r.forEach(m=>m(u)),l.str(i)&&I(a,i).assign(u),!0),a=new Proxy({},{get:s,set:o});return a},We=(e,t=v())=>x("attribute",{id:t},e),Ve=(e,t=v())=>x("instance",{id:t},e),Be=(e,t=v())=>x("constant",{id:t},e),L=(e,t=v())=>x("uniform",{id:t},e),Xt=(e,t=v())=>x("storage",{id:t},e),ze=(e=v())=>x("variable",{id:e}),b=(e=v())=>x("builtin",{id:e}),ke=(e,t=v())=>x("varying",{id:t,inferFrom:[e]},e),I=(e,t)=>x("member",null,e,t),ne=(e,t)=>x("element",null,e,t),He=(e,t)=>x("gather",null,e,t),St=(e,t)=>x("scatter",null,e,t),qe=(e,t,n)=>x("ternary",null,e,t,n),re=(e,...t)=>x("operator",null,e,...t),c=(e,...t)=>x("function",null,e,...t),T=(e,...t)=>x("conversion",null,e,...t);var je=b("position"),Rt=b("vertex_index"),Yt=b("instance_index"),Lt=b("front_facing"),Ft=b("frag_depth"),At=b("sample_index"),Ut=b("sample_mask"),Nt=b("point_coord"),It=b("global_invocation_id"),Ot=b("position"),wt=b("positionWorld"),Gt=b("positionView"),Pt=b("normalLocal"),Dt=b("normalWorld"),Mt=b("normalView"),Wt=b("screenCoordinate"),Vt=b("screenUV"),Ke=e=>T("float",e),Bt=e=>T("int",e),zt=e=>T("uint",e),kt=e=>T("bool",e),se=(e,t)=>T("vec2",e,t),oe=(e,t,n)=>T("vec3",e,t,n),Ht=(e,t,n,r)=>T("vec4",e,t,n,r),qt=(...e)=>T("mat2",...e),jt=(...e)=>T("mat3",...e),Kt=(...e)=>T("mat4",...e),Zt=(e,t)=>T("ivec2",e,t),Jt=(e,t,n)=>T("ivec3",e,t,n),Qt=(e,t,n,r)=>T("ivec4",e,t,n,r),en=(e,t)=>T("uvec2",e,t),tn=(e,t,n)=>T("uvec3",e,t,n),nn=(e,t,n,r)=>T("uvec4",e,t,n,r),rn=(e,t)=>T("bvec2",e,t),on=(e,t,n)=>T("bvec3",e,t,n),sn=(e,t,n,r)=>T("bvec4",e,t,n,r),an=e=>T("texture",e),un=()=>T("sampler2D"),pn=(e,t,n)=>l.num(e)&&l.und(t)&&l.und(n)?oe(...$e(e)):oe(e,t,n),Ze=L(se(),"iResolution"),cn=L(se(),"iMouse"),fn=L(Ke(),"iTime"),ln=je.xy.div(Ze),xn=e=>c("all",e),dn=e=>c("any",e),Tn=e=>c("determinant",e),mn=(e,t)=>c("distance",e,t),gn=(e,t)=>c("dot",e,t),vn=e=>c("length",e),bn=e=>c("lengthSq",e),$n=e=>c("luminance",e),Cn=(e,t)=>c("cross",e,t),hn=(e,t,n)=>c("cubeTexture",e,t,n),En=(e,t,n)=>c("texture",e,t,n),_n=(e,t,n)=>c("texelFetch",e,t,n),yn=(e,t,n)=>c("textureLod",e,t,n),Xn=e=>c("abs",e),Sn=e=>c("acos",e),Rn=e=>c("acosh",e),Yn=e=>c("asin",e),Ln=e=>c("asinh",e),Fn=e=>c("atan",e),An=e=>c("atanh",e),Un=e=>c("ceil",e),Nn=e=>c("cos",e),In=e=>c("cosh",e),On=e=>c("dFdx",e),wn=e=>c("dFdy",e),Gn=e=>c("degrees",e),Pn=e=>c("exp",e),Dn=e=>c("exp2",e),Mn=e=>c("floor",e),Wn=e=>c("fract",e),Vn=e=>c("fwidth",e),Bn=e=>c("inverseSqrt",e),zn=e=>c("log",e),kn=e=>c("log2",e),Hn=e=>c("negate",e),qn=e=>c("normalize",e),jn=e=>c("oneMinus",e),Kn=e=>c("radians",e),Zn=e=>c("reciprocal",e),Jn=e=>c("round",e),Qn=e=>c("sign",e),er=e=>c("sin",e),tr=e=>c("sinh",e),nr=e=>c("sqrt",e),rr=e=>c("tan",e),or=e=>c("tanh",e),sr=e=>c("trunc",e),ir=(e,t)=>c("atan2",e,t),ar=(e,t,n)=>c("clamp",e,t,n),ur=(e,t)=>c("max",e,t),pr=(e,t)=>c("min",e,t),cr=(e,t,n)=>c("mix",e,t,n),fr=(e,t)=>c("pow",e,t),lr=(e,t)=>c("reflect",e,t),xr=(e,t,n)=>c("refract",e,t,n),dr=(e,t,n)=>c("smoothstep",e,t,n),Tr=(e,t)=>c("step",e,t),q=(e,t)=>e.sub(e.div(t).floor().mul(t));0&&(module.exports={Break,Continue,Fn,If,Loop,Return,Scope,Switch,abs,acos,acosh,addToScope,all,any,asin,asinh,assign,atan,atan2,atanh,attribute,bool,builtin,bvec2,bvec3,bvec4,ceil,clamp,color,compute,constant,conversion,cos,cosh,create,cross,cubeTexture,dFdx,dFdy,degrees,determinant,distance,dot,element,exp,exp2,float,floor,fract,fragDepth,fragment,frontFacing,function_,fwidth,gather,iMouse,iResolution,iTime,id,instance,instanceIndex,int,inverseSqrt,ivec2,ivec3,ivec4,length,lengthSq,log,log2,luminance,mat2,mat3,mat4,max,member,min,mix,mod,negate,normalLocal,normalView,normalWorld,normalize,oneMinus,operator,pointCoord,position,positionLocal,positionView,positionWorld,pow,radians,reciprocal,reflect,refract,round,sampleIndex,sampleMask,sampler2D,scatter,scoped,screenCoordinate,screenUV,select,sign,sin,sinh,smoothstep,sqrt,step,storage,struct,tan,tanh,texelFetch,texture,texture2D,textureLod,toVar,trunc,uint,uniform,uv,uvec2,uvec3,uvec4,variable,vec2,vec3,vec4,vertex,vertexIndex,vertexStage});
|
|
69
69
|
//# sourceMappingURL=node.cjs.map
|