glre 0.37.0 → 0.39.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.
Files changed (49) hide show
  1. package/dist/addons.cjs +2 -0
  2. package/dist/addons.cjs.map +1 -0
  3. package/dist/addons.d.ts +457 -0
  4. package/dist/addons.js +2 -0
  5. package/dist/addons.js.map +1 -0
  6. package/dist/index.cjs +31 -40
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +170 -1791
  9. package/dist/index.js +31 -40
  10. package/dist/index.js.map +1 -1
  11. package/dist/native.cjs +1 -45
  12. package/dist/native.cjs.map +1 -1
  13. package/dist/native.d.ts +511 -11
  14. package/dist/native.js +1 -45
  15. package/dist/native.js.map +1 -1
  16. package/dist/node.cjs +40 -0
  17. package/dist/node.cjs.map +1 -0
  18. package/dist/node.d.ts +614 -0
  19. package/dist/node.js +40 -0
  20. package/dist/node.js.map +1 -0
  21. package/dist/react.cjs +1 -45
  22. package/dist/react.cjs.map +1 -1
  23. package/dist/react.d.ts +506 -4
  24. package/dist/react.js +1 -45
  25. package/dist/react.js.map +1 -1
  26. package/dist/solid.cjs +1 -45
  27. package/dist/solid.cjs.map +1 -1
  28. package/dist/solid.d.ts +506 -4
  29. package/dist/solid.js +1 -45
  30. package/dist/solid.js.map +1 -1
  31. package/package.json +56 -3
  32. package/src/addons/index.ts +6 -0
  33. package/src/index.ts +6 -22
  34. package/src/node/{core.ts → build.ts} +3 -7
  35. package/src/node/create.ts +73 -0
  36. package/src/node/index.ts +63 -47
  37. package/src/node/scope.ts +65 -50
  38. package/src/node/types.ts +222 -164
  39. package/src/node/utils/const.ts +64 -3
  40. package/src/node/utils/index.ts +8 -5
  41. package/src/node/utils/infer.ts +23 -35
  42. package/src/node/utils/parse.ts +15 -18
  43. package/src/node/utils/utils.ts +13 -12
  44. package/src/types.ts +5 -7
  45. package/src/utils/pipeline.ts +3 -3
  46. package/src/utils/program.ts +7 -2
  47. package/src/{webgl.ts → utils/webgl.ts} +24 -14
  48. package/src/{webgpu.ts → utils/webgpu.ts} +28 -7
  49. package/src/node/node.ts +0 -64
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/webgl.ts","../src/utils/helpers.ts","../src/utils/program.ts","../src/node/utils/const.ts","../src/node/utils/utils.ts","../src/node/utils/infer.ts","../src/node/utils/parse.ts","../src/node/utils/index.ts","../src/node/scope.ts","../src/node/node.ts","../src/node/core.ts","../src/node/index.ts","../src/webgpu.ts","../src/utils/pipeline.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { webgl } from './webgl'\nimport { webgpu } from './webgpu'\nimport { is } from './utils/helpers'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nimport { float, fract, int, iResolution, position, vec4, vertexIndex } from './node'\nexport * from './node'\nexport * from './types'\nexport * from './webgl'\nexport * from './webgpu'\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\nconst defaultFragment = () => vec4(fract(position.xy.div(iResolution)), 0, 1)\nconst defaultVertex = () =>\n vec4(\n float(int(vertexIndex).mod(int(2)))\n .mul(4)\n .sub(1),\n float(int(vertexIndex).div(int(2)))\n .mul(4)\n .sub(1),\n 0,\n 1\n )\n\nexport const createGL = (props?: Partial<GL>) => {\n const gl = event({\n isNative: false,\n isWebGL: true,\n isError: false,\n isLoop: true,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n particles: 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.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 gl.vs = gl.vs || gl.vert || gl.vertex || defaultVertex()\n gl.fs = gl.fs || gl.frag || gl.fragment || defaultFragment()\n gl.cs = gl.cs || gl.comp || gl.compute\n if (!isWebGPUSupported()) gl.isWebGL = true\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","import { nested as cached } from 'reev'\nimport { loadingImage } from './utils/helpers'\nimport {\n cleanStorage,\n createAttachment,\n createAttrib,\n createProgram,\n createStorage,\n createTexture,\n createUniform,\n} from './utils/program'\nimport { compute, fragment, vertex } from './node'\nimport type { GL, WebGLState } from './types'\n\nconst vert = /* 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}`.trim()\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 config = { isWebGL: true, gl, units }\n\n const pg = createProgram(c, compute(gl.cs, config), vert, gl)!\n const size = Math.ceil(Math.sqrt(gl.particles))\n\n const uniforms = cached((key) => c.getUniformLocation(pg, key)!)\n const storages = cached((key) => {\n const array = new Float32Array(size * size * 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 createUniform(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, 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 pg = createProgram(c, fragment(gl.fs, config), vertex(gl.vs, config), gl)!\n c.useProgram(pg)\n\n let activeUnit = 0 // for texture units\n\n const units = cached(() => activeUnit++)\n const attribs = cached((key) => c.getAttribLocation(pg, key))\n const uniforms = cached((key) => c.getUniformLocation(pg, key))\n\n const _attribute = (key = '', value: number[], iboValue: number[]) => {\n const loc = attribs(key, true)\n createAttrib(c, loc, gl.count, value, iboValue)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n createUniform(c, uniforms(key)!, value)\n cp?._uniform(key, value)\n }\n\n const _texture = (key: string, src: string) => {\n c.useProgram(pg)\n loadingImage(gl, src, (source) => {\n createTexture(c, source, uniforms(key), units(key))\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 c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n }\n\n const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, render, clean, _attribute, _uniform, _texture, _storage: cp?._storage }\n}\n","import type { GL } from './../types'\n\nexport 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\nexport const loadingImage = (gl: GL, src: string, fun: (source: HTMLImageElement) => void) => {\n gl.loading++\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => {\n fun(source)\n gl.loading--\n })\n}\n","import { is } from './helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGLRenderingContext, 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\nexport const createProgram = (c: WebGLRenderingContext, 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\nconst createVbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, new Float32Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n return buffer\n}\n\nconst createIbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, buffer)\n c.bufferData(c.ELEMENT_ARRAY_BUFFER, new Int16Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, null)\n return buffer\n}\n\nconst getStride = (count: number, value: number[], iboValue?: number[]) => {\n if (iboValue) count = Math.max(...iboValue) + 1\n const stride = value.length / count\n return Math.floor(stride)\n}\n\nexport const createAttrib = (\n c: WebGLRenderingContext,\n loc: number,\n count: number,\n value: number[],\n iboValue: number[]\n) => {\n const vbo = createVbo(c, value)\n const ibo = createIbo(c, iboValue)\n const str = getStride(count, value, iboValue)\n c.bindBuffer(c.ARRAY_BUFFER, vbo)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, str, c.FLOAT, false, 0, 0)\n if (ibo) c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, ibo)\n}\n\nexport const createUniform = (c: WebGLRenderingContext, loc: WebGLUniformLocation, value: number | number[]) => {\n if (is.num(value)) return c.uniform1f(loc, value)\n let l = value.length\n if (l <= 4) return c[`uniform${l as 2}fv`](loc, value)\n l = Math.sqrt(l) << 0\n c[`uniformMatrix${l as 2}fv`](loc, false, value)\n}\n\nexport const createTexture = (c: WebGLRenderingContext, img: HTMLImageElement, loc: any, unit: number) => {\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, img)\n 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}\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 size: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\n const particles = size * size\n const vectorSize = value.length / particles\n for (let i = 0; i < particles; 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, size, size, 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, size, size, 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","export const SWIZZLES = ['x', 'y', 'z', 'w', 'r', 'g', 'b', 'a', 's', 't', 'p', 'q'] as const\n\n// Unified order with TYPE_MAPPING array\nexport const CONVERSIONS = [\n 'toBool',\n 'toUint',\n 'toInt',\n 'toFloat',\n 'toBvec2',\n 'toIvec2',\n 'toUvec2',\n 'toVec2',\n 'toBvec3',\n 'toIvec3',\n 'toUvec3',\n 'toVec3',\n 'toBvec4',\n 'toIvec4',\n 'toUvec4',\n 'toVec4',\n 'toColor',\n 'toMat2',\n 'toMat3',\n 'toMat4',\n] as const\n\n// Unified order with CONVERSIONS array\nexport const TYPE_MAPPING = {\n bool: 'bool',\n uint: 'u32',\n int: 'i32',\n float: 'f32',\n bvec2: 'vec2<bool>',\n ivec2: 'vec2i',\n uvec2: 'vec2u',\n vec2: 'vec2f',\n bvec3: 'vec3<bool>',\n ivec3: 'vec3i',\n uvec3: 'vec3u',\n vec3: 'vec3f',\n bvec4: 'vec4<bool>',\n ivec4: 'vec4i',\n uvec4: 'vec4u',\n vec4: 'vec4f',\n color: 'color',\n mat2: 'mat2x2f',\n mat3: 'mat3x3f',\n mat4: 'mat4x4f',\n texture: 'texture_2d<f32>',\n sampler2D: 'sampler',\n struct: 'struct',\n} as const\n\nexport const CONSTANTS = Object.keys(TYPE_MAPPING) as unknown as keyof typeof TYPE_MAPPING\n\nexport const OPERATORS = {\n add: '+',\n sub: '-',\n mul: '*',\n div: '/',\n mod: '%',\n equal: '==',\n notEqual: '!=',\n lessThan: '<',\n lessThanEqual: '<=',\n greaterThan: '>',\n greaterThanEqual: '>=',\n and: '&&',\n or: '||',\n bitAnd: '&',\n bitOr: '|',\n bitXor: '^',\n shiftLeft: '<<',\n shiftRight: '>>',\n} as const\n\nexport const OPERATOR_KEYS = Object.keys(OPERATORS) as (keyof typeof OPERATORS)[]\n\nexport const COMPONENT_COUNT_TO_TYPE = {\n 1: 'float',\n 2: 'vec2',\n 3: 'vec3',\n 4: 'vec4',\n 9: 'mat3',\n 16: 'mat4',\n} as const\n\nexport const BUILTIN_TYPES = {\n // WGSL builtin variables\n position: 'vec4',\n vertex_index: 'uint',\n instance_index: 'uint',\n front_facing: 'bool',\n frag_depth: 'float',\n sample_index: 'uint',\n sample_mask: 'uint',\n point_coord: 'vec2',\n global_invocation_id: 'uvec3',\n\n // TSL compatible variables\n positionLocal: 'vec3',\n positionWorld: 'vec3',\n positionView: 'vec3',\n normalLocal: 'vec3',\n normalWorld: 'vec3',\n normalView: 'vec3',\n screenCoordinate: 'vec2',\n screenUV: 'vec2',\n\n // Legacy GLSL variables (for backward compatibility)\n gl_FragCoord: 'vec4',\n gl_VertexID: 'uint',\n gl_InstanceID: 'uint',\n gl_FrontFacing: 'bool',\n gl_FragDepth: 'float',\n gl_SampleID: 'uint',\n gl_SampleMask: 'uint',\n gl_PointCoord: 'vec2',\n\n // Common variables\n normal: 'vec3',\n uv: 'vec2',\n color: 'vec4',\n} as const\n\nexport const COMPARISON_OPERATORS = [\n 'equal',\n 'notEqual',\n 'lessThan',\n 'lessThanEqual',\n 'greaterThan',\n 'greaterThanEqual',\n] as const\n\nexport const LOGICAL_OPERATORS = ['and', 'or'] as const\n\nexport const WGSL_TO_GLSL_BUILTIN = {\n position: 'gl_FragCoord',\n vertex_index: 'gl_VertexID',\n instance_index: 'gl_InstanceID',\n front_facing: 'gl_FrontFacing',\n frag_depth: 'gl_FragDepth',\n sample_index: 'gl_SampleID',\n sample_mask: 'gl_SampleMask',\n point_coord: 'gl_PointCoord',\n uv: 'gl_FragCoord.xy',\n} as const\n\n/**\n * 2.1. unified with:\n * 1.1. index.ts functions and\n * 3.1. types.ts BaseNodeProxy\n */\n// Function return type mapping for method chaining\nexport const FUNCTION_RETURN_TYPES = {\n // 0. Always return bool\n all: 'bool',\n any: 'bool',\n // 2. Always return float\n determinant: 'float',\n distance: 'float',\n dot: 'float',\n length: 'float',\n lengthSq: 'float',\n luminance: 'float',\n // 3. Always return vec3\n cross: 'vec3',\n // 4. Always return vec4\n cubeTexture: 'vec4',\n texture: 'vec4',\n texelFetch: 'vec4',\n textureLod: 'vec4',\n} as const\n\n/**\n * 2.2. unified with:\n * 1.2. index.ts functions and\n * 3.2. types.ts BaseNodeProxy\n */\n// All shader functions (type inference now handled by inferFrom)\nexport const FUNCTIONS = [\n ...(Object.keys(FUNCTION_RETURN_TYPES) as (keyof typeof FUNCTION_RETURN_TYPES)[]),\n // 0. Component-wise functions\n 'abs',\n 'acos',\n 'acosh',\n 'asin',\n 'asinh',\n 'atan',\n 'atanh',\n 'ceil',\n 'cos',\n 'cosh',\n 'dFdx',\n 'dFdy',\n 'degrees',\n 'exp',\n 'exp2',\n 'floor',\n 'fract',\n 'fwidth',\n 'inverseSqrt',\n 'log',\n 'log2',\n 'negate',\n 'normalize',\n 'oneMinus',\n 'radians',\n 'reciprocal',\n 'round',\n 'saturate',\n 'sign',\n 'sin',\n 'sinh',\n 'sqrt',\n 'tan',\n 'tanh',\n 'trunc',\n // 1. Functions where first argument determines return type\n 'atan2',\n 'clamp',\n 'max',\n 'min',\n 'mix',\n 'pow',\n 'reflect',\n 'refract',\n // 2. Functions where not first argument determines return type\n 'smoothstep',\n 'step',\n // @NOTE: mod is operator\n] as const\n","import {\n CONSTANTS,\n CONVERSIONS,\n FUNCTIONS,\n OPERATOR_KEYS,\n OPERATORS,\n TYPE_MAPPING,\n WGSL_TO_GLSL_BUILTIN,\n} from './const'\nimport { is } from '../../utils/helpers'\nimport type { Constants, Conversions, Functions, NodeContext, NodeProxy, Operators, Swizzles, X } from '../types'\n\nexport const isSwizzle = (key: unknown): key is Swizzles => {\n return is.str(key) && /^[xyzwrgbastpq]{1,4}$/.test(key)\n}\n\nexport const isOperator = (key: unknown): key is Operators => {\n return OPERATOR_KEYS.includes(key as Operators)\n}\n\nexport const isFunction = (key: unknown): key is Functions => {\n return FUNCTIONS.includes(key as Functions)\n}\n\nexport const isConversion = (key: unknown): key is Conversions => {\n return CONVERSIONS.includes(key as Conversions)\n}\n\nexport const isNodeProxy = <T extends Constants>(x: unknown): x is NodeProxy<T> => {\n if (!x) return false\n if (typeof x !== 'object') return false // @ts-ignore\n return x.isProxy\n}\n\nexport const isConstants = (type?: unknown): type is Constants => {\n if (!is.str(type)) return false\n return CONSTANTS.includes(type)\n}\n\nexport const hex2rgb = (hex: number) => {\n const r = ((hex >> 16) & 0xff) / 255\n const g = ((hex >> 8) & 0xff) / 255\n const b = (hex & 0xff) / 255\n return [r, g, b]\n}\n\nlet count = 0\n\nexport const getId = () => `x${count++}`\n\nexport const getBluiltin = (c: NodeContext, id: string) => {\n if (id === 'global_invocation_id') {\n const size = Math.floor(Math.sqrt(c.gl?.particles || 1024))\n return `uvec3(uint(gl_FragCoord.y) * uint(${size}) + uint(gl_FragCoord.x), 0u, 0u)`\n }\n const ret = WGSL_TO_GLSL_BUILTIN[id as keyof typeof WGSL_TO_GLSL_BUILTIN]\n if (!ret) throw new Error(`Error: unknown builtin variable ${id}`)\n return ret\n}\n\nexport const getConversions = <T extends Constants>(x: X<T>, c?: NodeContext) => {\n if (!is.str(x)) return ''\n if (c?.isWebGL) return x\n return TYPE_MAPPING[x as keyof typeof TYPE_MAPPING] || x // for struct type\n}\n\nexport const getOperator = (op: X<string>) => {\n return OPERATORS[op as keyof typeof OPERATORS] || op\n}\n\nexport const getConstant = (conversionKey: string): Constants => {\n const index = CONVERSIONS.indexOf(conversionKey as Conversions)\n return index !== -1 ? CONSTANTS[index] : 'float'\n}\n\nexport const getEventFun = (c: NodeContext, id: string, isAttribute = false, isTexture = false) => {\n if (c.isWebGL) {\n if (isAttribute) return (value: any) => c.gl?.attribute?.(id, value)\n if (isTexture) return (value: any) => c.gl?.texture?.(id, value)\n return (value: any) => c.gl?.uniform?.(id, value)\n }\n if (isAttribute) return (value: any) => c.gl?._attribute?.(id, value)\n if (isTexture) return (value: any) => c.gl?._texture?.(id, value)\n return (value: any) => c.gl?._uniform?.(id, value)\n}\n\nexport const safeEventCall = <T extends Constants>(x: X<T>, fun: (value: unknown) => void) => {\n if (is.und(x)) return\n if (!isNodeProxy(x)) return fun(x) // for uniform(1)\n if (x.type !== 'conversion') return\n const value = x.props.children?.slice(1).filter(Boolean)\n if (!value?.length) return // for uniform(vec2())\n fun(value)\n}\n\nexport const initNodeContext = (c: NodeContext) => {\n if (c.code) return c\n c.code = {\n headers: new Map(),\n fragInputs: new Map(),\n vertInputs: new Map(),\n vertOutputs: new Map(),\n vertVaryings: new Map(),\n computeInputs: new Map(),\n dependencies: new Map(),\n }\n if (c.isWebGL) return c\n c.code.fragInputs.set('position', '@builtin(position) position: vec4f')\n c.code.vertOutputs.set('position', '@builtin(position) position: vec4f')\n return c\n}\n\nexport const isArrayAccess = (key: unknown): boolean => {\n return is.num(key) || (is.str(key) && /^\\d+$/.test(key))\n}\n\nexport const addDependency = (c: NodeContext, id = '', type: string) => {\n if (!c.code?.dependencies?.has(id)) c.code!.dependencies.set(id, new Set())\n if (!isConstants(type)) c.code!.dependencies.get(id)!.add(type)\n}\n","import { isConstants, isNodeProxy, isSwizzle } from './utils'\nimport {\n BUILTIN_TYPES,\n COMPARISON_OPERATORS,\n COMPONENT_COUNT_TO_TYPE,\n FUNCTION_RETURN_TYPES,\n LOGICAL_OPERATORS,\n} from './const'\nimport { is } from '../../utils/helpers'\nimport type { Constants as C, NodeContext, NodeProxy, X } from '../types'\n\nconst inferBuiltin = <T extends C>(id: string | undefined) => {\n return BUILTIN_TYPES[id as keyof typeof BUILTIN_TYPES] as T\n}\n\n// Unified logic with types.ts InferOperator type\nconst inferOperator = <T extends C>(L: T, R: T, op: string): T => {\n if (COMPARISON_OPERATORS.includes(op as any) || LOGICAL_OPERATORS.includes(op as any)) return 'bool' as T\n if (L === R) return L\n // broadcast\n if (L === 'float' || L === 'int') return R\n if (R === 'float' || R === 'int') return L\n // mat * vec → vec\n if (L === 'mat4' && R === 'vec4') return R\n if (L === 'mat3' && R === 'vec3') return R\n if (L === 'mat2' && R === 'vec2') return R\n // vec * mat → vec\n if (L === 'vec4' && R === 'mat4') return L\n if (L === 'vec3' && R === 'mat3') return L\n if (L === 'vec2' && R === 'mat2') return L\n return L\n}\n\nexport const inferPrimitiveType = <T extends C>(x: X) => {\n if (is.bol(x)) return 'bool' as T\n if (is.str(x)) return 'texture' as T\n if (is.num(x)) return 'float' as T // @TODO FIX: Number.isInteger(x) ? 'int' : 'float'\n if (is.arr(x)) return COMPONENT_COUNT_TO_TYPE[x.length as keyof typeof COMPONENT_COUNT_TO_TYPE] as T\n return 'float' as T\n}\n\nconst inferFromCount = <T extends C>(count: number) => {\n return COMPONENT_COUNT_TO_TYPE[count as keyof typeof COMPONENT_COUNT_TO_TYPE] as T\n}\n\nconst inferFromArray = <T extends C>(arr: X<T>[], c: NodeContext) => {\n if (arr.length === 0) return 'void' as T\n const [x] = arr\n if (is.str(x)) return x as T // for struct\n const ret = infer(x, c)\n for (const x of arr.slice(1))\n if (ret !== infer(x, c)) throw new Error(`glre node system error: defined scope return mismatch`)\n return ret\n}\n\nexport const inferFunction = <T extends C>(x: X) => {\n return FUNCTION_RETURN_TYPES[x as keyof typeof FUNCTION_RETURN_TYPES] as T\n}\n\nexport const inferImpl = <T extends C>(target: NodeProxy<T>, c: NodeContext): T => {\n const { type, props } = target\n const { id, children = [], inferFrom, layout } = props\n const [x, y, z] = children\n if (type === 'conversion') return x\n if (type === 'operator') return inferOperator(infer(y, c), infer(z, c), x)\n if (type === 'ternary') return inferOperator(infer(y, c), infer(z, c), 'add')\n if (type === 'builtin') return inferBuiltin(id)\n if (type === 'function') return inferFunction(x) || infer(y, c)\n if (type === 'define') {\n if (isConstants(layout?.type)) return layout?.type as T\n if (!inferFrom || inferFrom.length === 0) return 'void' as T\n return inferFromArray(inferFrom, c)\n }\n if (type === 'attribute' && is.arr(x) && c.gl?.count) return inferFromCount(x.length / c.gl.count)\n if (type === 'member') {\n if (isSwizzle(y)) return inferFromCount(y.length)\n if (isNodeProxy(x)) {\n const field = (x as any).props.fields[y] // for variable node of struct member\n if (field) return infer(field, c)\n }\n return 'float' as T // fallback @TODO FIX\n }\n if (inferFrom) return inferFromArray(inferFrom, c)\n return infer(x, c) // for uniform and storage gather and scatter\n}\n\nexport const infer = <T extends C>(target: X<T>, c?: NodeContext | null): T => {\n if (!c) c = {}\n if (!isNodeProxy(target)) return inferPrimitiveType(target)\n if (is.arr(target)) return inferFromCount(target.length)\n if (!c.infers) c.infers = new WeakMap<NodeProxy<T>, C>()\n if (c.infers.has(target)) return c.infers.get(target) as T\n const ret = inferImpl(target, c)\n c.infers.set(target, ret)\n return ret\n}\n","import { code } from '.'\nimport { infer } from './infer'\nimport { getConversions, addDependency } from './utils'\nimport { is } from '../../utils/helpers'\nimport type { Constants, NodeContext, NodeProps, NodeProxy, X } from '../types'\n\nexport const parseArray = (children: X[], c: NodeContext) => {\n return children\n .filter((x) => !is.und(x) && !is.nul(x))\n .map((x) => code(x, c))\n .join(', ')\n}\n\n// only for webgl\nexport const parseGather = (c: NodeContext, x: X, y: X, target: X) => {\n const parseSwizzle = () => {\n const valueType = infer(target, c)\n if (valueType === 'float') return '.x'\n if (valueType === 'vec2') return '.xy'\n if (valueType === 'vec3') return '.xyz'\n if (valueType === 'vec4') return ''\n throw new Error(`Unsupported storage scatter type: ${valueType}`)\n }\n const indexVar = code(y, c)\n const texSize = Math.floor(Math.sqrt(c.gl?.particles || 1024))\n const coordX = `int(${indexVar}) % ${texSize}`\n const coordY = `int(${indexVar}) / ${texSize}`\n return `texelFetch(${code(x, c)}, ivec2(${coordX}, ${coordY}), 0)${parseSwizzle()}`\n}\n\n// only for webgl\nexport const parseScatter = (c: NodeContext, storageNode: X, valueNode: X) => {\n const storageId = code(storageNode, c)\n const valueCode = code(valueNode, c)\n const valueType = infer(valueNode, c)\n if (valueType === 'float') return `_${storageId} = vec4(${valueCode}, 0.0, 0.0, 1.0);`\n if (valueType === 'vec2') return `_${storageId} = vec4(${valueCode}, 0.0, 1.0);`\n if (valueType === 'vec3') return `_${storageId} = vec4(${valueCode}, 1.0);`\n if (valueType === 'vec4') return `_${storageId} = ${valueCode};`\n throw new Error(`Unsupported storage scatter type: ${valueType}`)\n}\n\nexport const parseTexture = (c: NodeContext, y: X, z: X, w: X) => {\n if (c.isWebGL) {\n const args = w ? [y, z, w] : [y, z]\n return `texture(${parseArray(args, c)})`\n }\n const _y = code(y, c)\n const args = [_y, _y + 'Sampler', code(z, c)]\n if (!w) return `textureSample(${args})`\n args.push(code(w, c))\n return `textureSampleLevel(${args})`\n}\n\n/**\n * scopes\n */\nexport const parseIf = (c: NodeContext, x: X, y: X, children: X[]) => {\n let ret = `if (${code(x, c)}) {\\n${code(y, c)}\\n}`\n for (let i = 2; i < children.length; i += 2) {\n const isElse = i >= children.length - 1\n ret += !isElse\n ? ` else if (${code(children[i], c)}) {\\n${code(children[i + 1], c)}\\n}`\n : ` else {\\n${code(children[i], c)}\\n}`\n }\n return ret\n}\n\nexport const parseSwitch = (c: NodeContext, x: X, children: X[]) => {\n let ret = `switch (${code(x, c)}) {\\n`\n for (let i = 1; i < children.length; i += 2) {\n const isDefault = i >= children.length - 1\n if (isDefault && children.length % 2 === 0) {\n ret += `default:\\n${code(children[i], c)}\\nbreak;\\n`\n } else if (i + 1 < children.length)\n ret += `case ${code(children[i], c)}:\\n${code(children[i + 1], c)}\\nbreak;\\n`\n }\n ret += '}'\n return ret\n}\n\nexport const parseDeclare = (c: NodeContext, x: X, y: X) => {\n const type = infer(x, c)\n const varName = (y as any)?.props?.id\n if (c.isWebGL) return `${type} ${varName} = ${code(x, c)};`\n const wgslType = getConversions(type)\n return `var ${varName}: ${wgslType} = ${code(x, c)};`\n}\n\nexport const parseStructHead = (c: NodeContext, id: string, fields: Record<string, NodeProxy> = {}) => {\n const lines: string[] = []\n for (const key in fields) {\n const fieldType = fields[key]\n const type = infer(fieldType, c)\n if (c.isWebGL) addDependency(c, id, type)\n lines.push(c.isWebGL ? `${type} ${key};` : `${key}: ${getConversions(type, c)},`)\n }\n const ret = lines.join('\\n ')\n return `struct ${id} {\\n ${ret}\\n};`\n}\n\nexport const parseStruct = (\n c: NodeContext,\n id: string,\n instanceId = '',\n fields?: Record<string, NodeProxy>,\n initialValues?: Record<string, NodeProxy>\n) => {\n if (c.isWebGL) {\n if (initialValues) {\n const ordered = []\n for (const key in fields) ordered.push(initialValues[key])\n return `${id} ${instanceId} = ${id}(${parseArray(ordered, c)});`\n } else return `${id} ${instanceId};`\n } else {\n if (initialValues) {\n const ordered = []\n for (const key in fields) ordered.push(initialValues[key])\n return `var ${instanceId}: ${id} = ${id}(${parseArray(ordered, c)});`\n } else return `var ${instanceId}: ${id};`\n }\n}\n\n/**\n * define\n */\nexport const parseDefine = (c: NodeContext, props: NodeProps, returnType: Constants) => {\n const { id, children = [], layout } = props\n const [x, ...args] = children\n const argParams: [name: string, type: string][] = []\n const params: string[] = []\n if (layout?.inputs)\n for (const input of layout.inputs) {\n argParams.push([input.name, input.type])\n }\n else\n for (let i = 0; i < args.length; i++) {\n argParams.push([`p${i}`, infer(args[i], c)])\n }\n const ret = []\n if (c?.isWebGL) {\n for (const [paramId, type] of argParams) {\n addDependency(c, id!, type)\n params.push(`${type} ${paramId}`)\n }\n addDependency(c, id!, returnType)\n ret.push(`${returnType} ${id}(${params}) {`)\n } else {\n for (const [paramId, type] of argParams) params.push(`${paramId}: ${getConversions(type, c)}`)\n const isVoid = returnType === 'void'\n if (isVoid) {\n ret.push(`fn ${id}(${params}) {`)\n } else ret.push(`fn ${id}(${params}) -> ${getConversions(returnType, c)} {`)\n }\n const scopeCode = code(x, c)\n if (scopeCode) ret.push(scopeCode)\n ret.push('}')\n return ret.join('\\n')\n}\n\n/**\n * headers\n */\nexport const parseVaryingHead = (c: NodeContext, id: string, type: string) => {\n return c.isWebGL\n ? `${type} ${id};`\n : `@location(${c.code?.vertVaryings?.size || 0}) ${id}: ${getConversions(type, c)}`\n}\n\nexport const parseAttribHead = (c: NodeContext, id: string, type: Constants) => {\n if (c.isWebGL) return `${type} ${id};`\n const { location = 0 } = c.gl?.webgpu?.attribs.map.get(id) || {}\n const wgslType = getConversions(type, c)\n return `@location(${location}) ${id}: ${wgslType}`\n}\n\nexport const parseUniformHead = (c: NodeContext, id: string, type: Constants) => {\n const isTexture = type === 'sampler2D' || type === 'texture'\n if (c.isWebGL)\n return isTexture //\n ? `uniform sampler2D ${id};`\n : `uniform ${type} ${id};`\n if (isTexture) {\n const { group = 1, binding = 0 } = c.gl?.webgpu?.textures.map.get(id) || {}\n return (\n `@group(${group}) @binding(${binding}) var ${id}Sampler: sampler;\\n` +\n `@group(${group}) @binding(${binding + 1}) var ${id}: texture_2d<f32>;`\n )\n }\n const { group = 0, binding = 0 } = c.gl?.webgpu?.uniforms.map.get(id) || {}\n const wgslType = getConversions(type, c)\n return `@group(${group}) @binding(${binding}) var<uniform> ${id}: ${wgslType};`\n}\n\nexport const parseStorageHead = (c: NodeContext, id: string, type: Constants) => {\n if (c.isWebGL) {\n const ret = `uniform sampler2D ${id};`\n if (c.label !== 'compute') return ret\n const location = c.units?.(id)\n return `${ret}\\nlayout(location = ${location}) out vec4 _${id};` // out texture buffer\n }\n const { group = 0, binding = 0 } = c.gl?.webgpu?.storages.map.get(id) || {}\n const wgslType = getConversions(type, c)\n return `@group(${group}) @binding(${binding}) var<storage, read_write> ${id}: array<${wgslType}>;`\n}\n\nexport const parseConstantHead = (c: NodeContext, id: string, type: Constants, value: string) => {\n return c.isWebGL ? `const ${type} ${id} = ${value};` : `const ${id}: ${getConversions(type, c)} = ${value};`\n}\n","import { infer } from './infer'\nimport {\n parseArray,\n parseAttribHead,\n parseConstantHead,\n parseDeclare,\n parseDefine,\n parseGather,\n parseIf,\n parseScatter,\n parseStorageHead,\n parseStruct,\n parseStructHead,\n parseSwitch,\n parseTexture,\n parseUniformHead,\n parseVaryingHead,\n} from './parse'\nimport { getBluiltin, getOperator, getConversions, safeEventCall, getEventFun, initNodeContext } from './utils'\nimport { is } from '../../utils/helpers'\nimport type { Constants, NodeContext, X } from '../types'\n\nexport * from './utils'\n\nexport const code = <T extends Constants>(target: X<T>, c?: NodeContext | null): string => {\n if (!c) c = {}\n initNodeContext(c)\n if (is.arr(target)) return parseArray(target, c)\n if (is.str(target)) return target\n if (is.num(target)) {\n const ret = `${target}`\n if (ret.includes('.')) return ret\n // Check if this number should be an integer based on the inferred type\n // For now, keep the original behavior to maintain compatibility\n return ret + '.0'\n }\n if (is.bol(target)) return target ? 'true' : 'false'\n if (!target) return ''\n const { type, props = {} } = target\n const { id = 'i', children = [], fields, initialValues } = props\n const [x, y, z, w] = children\n /**\n * variables\n */\n if (type === 'variable') return id\n if (type === 'member') return `${code(x, c)}.${code(y, c)}`\n if (type === 'element') return `${code(x, c)}[${code(y, c)}]`\n if (type === 'gather')\n return c.isWebGL //\n ? parseGather(c, x, y, target)\n : `${code(x, c)}[${code(y, c)}]`\n if (type === 'scatter') {\n const [storageNode, indexNode] = x.props.children ?? [] // x is gather node\n return c.isWebGL\n ? parseScatter(c, storageNode, y) // indexNode is not using\n : `${code(storageNode, c)}[${code(indexNode, c)}] = ${code(y, c)};`\n }\n if (type === 'ternary')\n return c.isWebGL\n ? `(${code(z, c)} ? ${code(x, c)} : ${code(y, c)})`\n : `select(${code(x, c)}, ${code(y, c)}, ${code(z, c)})`\n if (type === 'conversion') return `${getConversions(x, c)}(${parseArray(children.slice(1), c)})`\n if (type === 'operator') {\n if (x === 'not' || x === 'bitNot') return `!${code(y, c)}`\n return `(${code(y, c)} ${getOperator(x)} ${code(z, c)})`\n }\n if (type === 'function') {\n if (x === 'negate') return `(-${code(y, c)})`\n if (x === 'oneMinus') return `(1.0-${code(y, c)})`\n if (x === 'texture') return parseTexture(c, y, z, w)\n if (x === 'atan2' && c.isWebGL) return `atan(${code(y, c)}, ${code(z, c)})`\n return `${x}(${parseArray(children.slice(1), c)})`\n }\n /**\n * scopes\n */\n if (type === 'scope') return children.map((child: any) => code(child, c)).join('\\n')\n if (type === 'assign') return `${code(x, c)} = ${code(y, c)};`\n if (type === 'return') return `return ${code(x, c)};`\n if (type === 'loop')\n return c.isWebGL\n ? `for (int ${id} = 0; ${id} < ${code(x, c)}; ${id} += 1) {\\n${code(y, c)}\\n}`\n : `for (var ${id}: i32 = 0; ${id} < ${code(x, c)}; ${id}++) {\\n${code(y, c)}\\n}`\n if (type === 'if') return parseIf(c, x, y, children)\n if (type === 'switch') return parseSwitch(c, x, children)\n if (type === 'declare') return parseDeclare(c, x, y)\n if (type === 'define') {\n if (!c.code?.headers.has(id)) c.code?.headers.set(id, parseDefine(c, props, infer(target, c)))\n return `${id}(${parseArray(children.slice(1), c)})`\n }\n if (type === 'struct') {\n if (!c.code?.headers.has(id)) c.code?.headers.set(id, parseStructHead(c, id, fields))\n return parseStruct(c, id, x.props.id, fields, initialValues)\n }\n /**\n * headers\n */\n if (type === 'varying') {\n if (c.code?.vertOutputs.has(id)) return c.isWebGL ? `${id}` : `out.${id}`\n const field = parseVaryingHead(c, id, infer(target, c))\n c.code?.fragInputs.set(id, field)\n c.code?.vertOutputs.set(id, field)\n c.code?.vertVaryings.set(id, code(x, c))\n return c.isWebGL ? `${id}` : `out.${id}`\n }\n if (type === 'builtin') {\n if (c.isWebGL) return getBluiltin(c, id)\n if (id === 'position') return 'out.position'\n const field = `@builtin(${id}) ${id}: ${getConversions(infer(target, c), c)}`\n if (c.label === 'compute') c.code?.computeInputs.set(id, field)\n else if (c.label === 'frag') c.code?.fragInputs.set(id, field)\n else if (c.label === 'vert') c.code?.vertInputs.set(id, field)\n return `in.${id}`\n }\n if (type === 'attribute') {\n const fun = getEventFun(c, id, true)\n safeEventCall(x, fun)\n target.listeners.add(fun)\n c.code?.vertInputs.set(id, parseAttribHead(c, id, infer(target, c)))\n return c.isWebGL ? `${id}` : `in.${id}`\n }\n if (c.code?.headers.has(id)) return id // must last\n let head = ''\n if (type === 'uniform') {\n const varType = infer(target, c)\n const fun = getEventFun(c, id, false, varType === 'texture')\n safeEventCall(x, fun)\n target.listeners.add(fun)\n head = parseUniformHead(c, id, varType)\n }\n if (type === 'storage') head = parseStorageHead(c, id, infer(target, c))\n if (type === 'constant') head = parseConstantHead(c, id, infer(target, c), code(x, c))\n if (head) {\n c.code?.headers.set(id, head)\n return id\n }\n return code(x, c)\n}\n","import { getId } from './utils'\nimport { conversion, node } from './node'\nimport type { FnLayout, NodeProps, NodeProxy, X, Constants, Int } from './types'\n\nlet scope: NodeProxy | null = null\nlet define: NodeProxy | null = null\n\nconst addToScope = (x: NodeProxy) => {\n if (!scope) return\n if (!scope.props.children) scope.props.children = []\n scope.props.children.push(x)\n if (x.type !== 'return' || !define) return\n // define nodes\n const { props } = define\n if (!props.inferFrom) props.inferFrom = []\n props.inferFrom.push(x)\n}\n\nexport const toVar = <T extends Constants>(x: X<T>, id?: string): NodeProxy<T> => {\n if (!id) id = getId()\n const y = node<T>('variable', { id, inferFrom: [x] })\n const z = node('declare', null, x, y)\n addToScope(z)\n return y\n}\n\nexport const assign = <T extends Constants>(x: NodeProxy<T>, isScatter = false, y: X<T>): X<T> => {\n const z = node(isScatter ? 'scatter' : 'assign', null, x, y)\n addToScope(z)\n return x\n}\n\nexport const Return = <T extends Constants>(x: X<T>): NodeProxy<T> => {\n const y = node<T>('return', { inferFrom: [x] }, x)\n addToScope(y)\n return y\n}\n\nexport const struct = <T extends Record<string, NodeProxy>>(fields: T, id = getId()) => {\n return (initialValues: T = {} as T, instanceId = getId()) => {\n const x = node('variable', { id: instanceId, inferFrom: [id] })\n const y = node('struct', { id, fields, initialValues }, x)\n addToScope(y)\n return x\n }\n}\n\nconst scoped = (x: NodeProxy, fun: () => NodeProxy | void, y = define) => {\n const [_scope, _define] = [scope, define]\n ;[scope, define] = [x, y]\n const z = fun()\n if (z) Return(z)\n ;[scope, define] = [_scope, _define]\n}\n\nexport const If = (x: NodeProxy, fun: () => void) => {\n const y = node('scope')\n scoped(y, fun)\n const ifNode = node('if', null, x, y)\n addToScope(ifNode)\n const ret = () => ({\n ElseIf: (_x: X, _fun: () => void) => {\n const _y = node('scope')\n scoped(_y, _fun)\n ifNode.props.children!.push(_x, _y)\n return ret()\n },\n Else: (_fun: () => void) => {\n const _x = node('scope')\n scoped(_x, _fun)\n ifNode.props.children!.push(_x)\n },\n })\n return ret()\n}\n\nexport const Loop = (x: NodeProxy, fun: (params: { i: Int }) => void) => {\n const y = node('scope')\n const id = getId()\n scoped(y, () => fun({ i: node<'int'>('variable', { id, inferFrom: [conversion('int', 0)] }) }))\n const ret = node('loop', { id }, x, y)\n addToScope(ret)\n return ret\n}\n\nexport const Switch = (x: NodeProxy) => {\n const switchNode = node('switch', null, x)\n addToScope(switchNode)\n const ret = () => ({\n Case: (...values: X[]) => {\n return (fun: () => void) => {\n const y = node('scope')\n scoped(y, fun)\n for (const _x of values) switchNode.props.children!.push(_x, y)\n return ret()\n }\n },\n Default: (fun: () => void) => {\n const scope = node('scope')\n scoped(scope, fun)\n switchNode.props.children!.push(scope)\n },\n })\n return ret()\n}\n\nexport const Fn = <ReturnType extends Constants, Args extends Constants[]>(\n fun: (paramVars: NodeProxy[]) => NodeProxy<ReturnType> | void,\n defaultId = getId()\n) => {\n let layout: FnLayout\n const ret = (...args: X<Args[number]>[]): NodeProxy<ReturnType> => {\n const id = layout?.name || defaultId\n const x = node('scope')\n const paramVars: NodeProxy[] = []\n const paramDefs: NodeProps[] = []\n if (layout?.inputs)\n for (const input of layout.inputs) {\n paramDefs.push({ id: input.name, inferFrom: [conversion(input.type)] })\n }\n else\n for (let i = 0; i < args.length; i++) {\n paramDefs.push({ id: `p${i}`, inferFrom: [args[i]] })\n }\n for (const props of paramDefs) paramVars.push(node('variable', props))\n const y = node<ReturnType>('define', { id, layout }, x, ...args)\n scoped(x, () => fun(paramVars), y)\n return y\n }\n ret.setLayout = (_layout: FnLayout) => {\n layout = _layout\n return ret\n }\n return ret\n}\n","import { code, getConstant, isConversion, isFunction, isOperator, getId, isArrayAccess } from './utils'\nimport { assign, toVar } from './scope'\nimport { is } from '../utils/helpers'\nimport type { Functions, NodeProps, NodeProxy, NodeTypes, Operators, X, Constants as C } from './types'\n\nconst toPrimitive = (x: X, hint: string) => {\n if (hint === 'string') return code(x, null)\n}\n\nexport const node = <T extends C>(type: NodeTypes, props?: NodeProps | null, ...args: X[]) => {\n if (!props) props = {}\n if (args.length) props.children = args\n const listeners = new Set<(value: any) => void>()\n const get = (_: unknown, y: string | Symbol) => {\n if (y === 'type') return type\n if (y === 'props') return props\n if (y === 'toVar') return toVar.bind(null, x)\n if (y === 'isProxy') return true\n if (y === 'toString') return code.bind(null, x)\n if (y === Symbol.toPrimitive) return toPrimitive.bind(null, x)\n if (y === 'listeners') return listeners\n if (y === 'attribute') return (id = getId()) => attribute(x, id)\n if (y === 'constant') return (id = getId()) => constant(x, id)\n if (y === 'uniform') return (id = getId()) => uniform(x, id)\n if (y === 'variable') return (id = getId()) => variable(id)\n if (y === 'builtin') return (id = getId()) => builtin(id)\n if (y === 'vertexStage') return (id = getId()) => vertexStage(x, id)\n if (y === 'element') return (z: X) => (type === 'storage' ? gather(x, z) : element(x, z))\n if (y === 'member') return (z: X) => member(x, z)\n if (y === 'assign') return assign.bind(null, x, x.type === 'gather')\n if (isOperator(y)) return (...z: X[]) => operator(y, x, ...z)\n if (isFunction(y)) return (...z: X[]) => function_(y, x, ...z)\n if (isConversion(y)) return () => conversion(getConstant(y), x)\n if (is.str(y)) return isArrayAccess(y) ? element(x, y) : member(x, y)\n }\n const set = (_: unknown, y: string, z: X) => {\n if (y === 'value') listeners.forEach((fun) => fun(z))\n if (is.str(y)) member(x, y).assign(z)\n return true\n }\n const x = new Proxy({}, { get, set }) as unknown as NodeProxy<T>\n return x\n}\n\n// headers with proper type inference\nexport const attribute = <T extends C>(x: X, id = getId()) => node<T>('attribute', { id }, x)\nexport const constant = <T extends C>(x: X<T>, id = getId()) => node<T>('constant', { id }, x)\nexport const uniform = <T extends C>(x: X<T>, id = getId()) => node<T>('uniform', { id }, x)\nexport const storage = <T extends C>(x: X<T>, id = getId()) => node<T>('storage', { id }, x)\nexport const variable = <T extends C>(id = getId()) => node<T>('variable', { id })\nexport const builtin = <T extends C>(id = getId()) => node<T>('builtin', { id })\nexport const vertexStage = <T extends C>(x: X<T>, id = getId()) => {\n return node<T>('varying', { id, inferFrom: [x] }, x)\n}\n\n// Node shorthands with proper typing\nexport const member = <T extends C>(x: X, index: X) => node<T>('member', null, x, index)\nexport const element = <T extends C>(x: X, index: X) => node<T>('element', null, x, index)\nexport const gather = <T extends C>(x: X, index: X) => node<T>('gather', null, x, index)\nexport const scatter = <T extends C>(x: X, index: X) => node<T>('scatter', null, x, index)\nexport const select = <T extends C>(x: X<T>, y: X<T>, z: X) => node<T>('ternary', null, x, y, z) // z ? x : y @TODO REMOVE\nexport const operator = <T extends C>(key: Operators, ...x: X[]) => node<T>('operator', null, key, ...x)\nexport const function_ = <T extends C>(key: Functions, ...x: X[]) => node<T>('function', null, key, ...x)\nexport const conversion = <T extends C>(key: T, ...x: X[]) => node<T>('conversion', null, key, ...x)\n","import { code } from './utils'\nimport { is } from '../utils/helpers'\nimport type { NodeContext, X } from './types'\n\nconst GLSL_FRAGMENT_HEAD = `\n#version 300 es\nprecision mediump float;\nout vec4 fragColor;\n`.trim()\n\nconst topological = (headers: Map<string, string>, dependencies: Map<string, Set<string>>) => {\n const sorted: [string, string][] = []\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const visit = (id: string) => {\n if (visiting.has(id)) return\n if (visited.has(id)) return\n visiting.add(id)\n const deps = dependencies.get(id) || new Set()\n for (const dep of deps) if (headers.has(dep)) visit(dep)\n visiting.delete(id)\n visited.add(id)\n if (headers.has(id)) sorted.push([id, headers.get(id)!])\n }\n for (const [id] of headers) visit(id)\n return sorted\n}\n\nconst generateHead = (x: X, c: NodeContext) => {\n const body = code(x, c)\n let head = ''\n if (c.isWebGL && c.code?.dependencies) {\n const sorted = topological(c.code.headers, c.code.dependencies)\n head = sorted.map(([, value]) => value).join('\\n')\n } else head = Array.from(c.code?.headers?.values() || []).join('\\n')\n return [head, body]\n}\n\nconst generateStruct = (id: string, map: Map<string, string>) => {\n return `struct ${id} {\\n ${Array.from(map.values()).join(',\\n ')}\\n}`\n}\n\nexport const fragment = (x: X, c: NodeContext) => {\n if (is.str(x)) return x.trim()\n c.code?.headers?.clear()\n c.label = 'frag' // for varying inputs or outputs\n const [head, body] = generateHead(x, c)\n const ret = []\n if (c.isWebGL) {\n ret.push(GLSL_FRAGMENT_HEAD)\n for (const code of c.code?.fragInputs?.values() || []) ret.push(`in ${code}`)\n ret.push(head)\n ret.push(`void main() {\\n fragColor = ${body};`)\n } else {\n if (c.code?.fragInputs?.size) ret.push(generateStruct('Out', c.code.fragInputs))\n ret.push(head)\n ret.push(`@fragment\\nfn main(out: Out) -> @location(0) vec4f {`)\n ret.push(` return ${body};`)\n }\n ret.push('}')\n const main = ret.filter(Boolean).join('\\n').trim()\n // console.log(`↓↓↓generated↓↓↓\\n${main}`)\n return main\n}\n\nexport const vertex = (x: X, c: NodeContext) => {\n if (is.str(x)) return x.trim()\n c.code?.headers?.clear()\n c.label = 'vert' // for varying inputs or outputs\n const [head, body] = generateHead(x, c)\n const ret = []\n if (c.isWebGL) {\n ret.push('#version 300 es')\n for (const code of c.code?.vertInputs?.values() || []) ret.push(`in ${code}`)\n for (const code of c.code?.vertOutputs?.values() || []) ret.push(`out ${code}`)\n ret.push(head)\n ret.push('void main() {')\n ret.push(` gl_Position = ${body};`)\n for (const [id, code] of c.code?.vertVaryings?.entries() || []) ret.push(` ${id} = ${code};`)\n } else {\n if (c.code?.vertInputs?.size) ret.push(generateStruct('In', c.code.vertInputs))\n if (c.code?.vertOutputs?.size) ret.push(generateStruct('Out', c.code.vertOutputs))\n ret.push(head)\n ret.push('@vertex')\n ret.push(`fn main(${c.code?.vertInputs?.size ? 'in: In' : ''}) -> Out {`)\n ret.push(' var out: Out;')\n ret.push(` out.position = ${body};`)\n for (const [id, code] of c.code?.vertVaryings?.entries() || []) ret.push(` out.${id} = ${code};`)\n ret.push(' return out;')\n }\n ret.push('}')\n const main = ret.filter(Boolean).join('\\n').trim()\n // console.log(`↓↓↓generated↓↓↓\\n${main}`)\n return main\n}\n\nexport const compute = (x: X, c: NodeContext) => {\n if (is.str(x)) return x.trim()\n c.code?.headers?.clear()\n c.label = 'compute'\n const [head, body] = generateHead(x, c)\n const ret = []\n if (c.isWebGL) {\n ret.push('#version 300 es')\n ret.push('precision mediump float;')\n ret.push(head)\n ret.push('void main() {')\n ret.push(` ${body};`)\n ret.push('}')\n } else {\n if (c.code?.computeInputs?.size) ret.push(generateStruct('In', c.code.computeInputs))\n ret.push(head)\n ret.push('@compute @workgroup_size(32)')\n ret.push(`fn main(${c.code?.computeInputs?.size ? 'in: In' : ''}) {`)\n ret.push(` ${body};`)\n ret.push('}')\n }\n const main = ret.filter(Boolean).join('\\n').trim()\n // console.log(`↓↓↓generated↓↓↓\\n${main}`)\n return main\n}\n","import { hex2rgb } from './utils'\nimport { builtin as b, conversion as c, function_ as f, uniform as u } from './node'\nimport { is } from '../utils/helpers'\nimport type { Constants as C, X, NodeProxy } from './types'\nexport * from './core'\nexport * from './node'\nexport * from './scope'\nexport * from './types'\n\n// Builtin Variables\nexport const position = b<'vec4'>('position')\nexport const vertexIndex = b<'uint'>('vertex_index')\nexport const instanceIndex = b<'uint'>('instance_index')\nexport const frontFacing = b<'bool'>('front_facing')\nexport const fragDepth = b<'float'>('frag_depth')\nexport const sampleIndex = b<'uint'>('sample_index')\nexport const sampleMask = b<'uint'>('sample_mask')\nexport const pointCoord = b<'vec2'>('point_coord')\nexport const id = b<'vec3'>('global_invocation_id')\n\n// TSL Compatible Builtin Variables\nexport const positionLocal = b<'vec3'>('position')\nexport const positionWorld = b<'vec3'>('positionWorld')\nexport const positionView = b<'vec3'>('positionView')\nexport const normalLocal = b<'vec3'>('normalLocal')\nexport const normalWorld = b<'vec3'>('normalWorld')\nexport const normalView = b<'vec3'>('normalView')\nexport const screenCoordinate = b<'vec2'>('screenCoordinate')\nexport const screenUV = b<'vec2'>('screenUV')\n\n// Type constructors with proper type inference\nexport const float = (x?: X) => c('float', x)\nexport const int = (x?: X) => c('int', x)\nexport const uint = (x?: X) => c('uint', x)\nexport const bool = (x?: X) => c('bool', x)\nexport const vec2 = (x?: X, y?: X) => c('vec2', x, y)\nexport const vec3 = (x?: X, y?: X, z?: X) => c('vec3', x, y, z)\nexport const vec4 = (x?: X, y?: X, z?: X, w?: X) => c('vec4', x, y, z, w)\nexport const mat2 = (...args: X[]) => c('mat2', ...args)\nexport const mat3 = (...args: X[]) => c('mat3', ...args)\nexport const mat4 = (...args: X[]) => c('mat4', ...args)\nexport const ivec2 = (x?: X, y?: X) => c('ivec2', x, y)\nexport const ivec3 = (x?: X, y?: X, z?: X) => c('ivec3', x, y, z)\nexport const ivec4 = (x?: X, y?: X, z?: X, w?: X) => c('ivec4', x, y, z, w)\nexport const uvec2 = (x?: X, y?: X) => c('uvec2', x, y)\nexport const uvec3 = (x?: X, y?: X, z?: X) => c('uvec3', x, y, z)\nexport const uvec4 = (x?: X, y?: X, z?: X, w?: X) => c('uvec4', x, y, z, w)\nexport const bvec2 = (x?: X, y?: X) => c('bvec2', x, y)\nexport const bvec3 = (x?: X, y?: X, z?: X) => c('bvec3', x, y, z)\nexport const bvec4 = (x?: X, y?: X, z?: X, w?: X) => c('bvec4', x, y, z, w)\nexport const texture2D = (x?: X) => c('texture', x)\nexport const sampler2D = () => c('sampler2D')\nexport const color = (r?: X, g?: X, b?: X) => {\n if (is.num(r) && is.und(g) && is.und(b)) return vec3(...hex2rgb(r))\n return vec3(r, g, b)\n}\n\n// Default uniforms with proper typing\nexport const iResolution = u(vec2(), 'iResolution')\nexport const iMouse = u(vec2(), 'iMouse')\nexport const iTime = u(float(), 'iTime')\nexport const uv = position.xy.div(iResolution)\n\n/**\n * 1.1. unified with:\n * 2.1. const.ts BUILTIN_VARIABLES and\n * 3.1. types.ts BaseNodeProxy\n */\n// 0. Always return bool\nexport const all = <T extends C>(x: X<T>) => f<'bool'>('all', x)\nexport const any = <T extends C>(x: X<T>) => f<'bool'>('any', x)\n\n// 2. Always return float\nexport const length = (x: X) => f<'float'>('length', x)\nexport const lengthSq = (x: X) => f<'float'>('lengthSq', x)\nexport const distance = (x: X, y: X) => f<'float'>('distance', x, y)\nexport const dot = (x: X, y: X) => f<'float'>('dot', x, y)\n\n// 3. Always return vec3\nexport const cross = (x: X<'vec3'>, y: X<'vec3'>) => f<'vec3'>('cross', x, y)\n\n// 4. Always return vec4\nexport const cubeTexture = (x: X, y: X, z?: X) => f<'vec4'>('cubeTexture', x, y, z)\nexport const texture = (x: X, y: X, z?: X) => f<'vec4'>('texture', x, y, z)\nexport const texelFetch = (x: X, y: X, z?: X) => f<'vec4'>('texelFetch', x, y, z)\nexport const textureLod = (x: X, y: X, z?: X) => f<'vec4'>('textureLod', x, y, z)\n\n/**\n * 1.2. unified with:\n * 2.2. const.ts FUNCTIONS and\n * 3.2. types.ts BaseNodeProxy\n */\n// 0. Component-wise functions\nexport const abs = <T extends C>(x: X<T>) => f<T>('abs', x)\nexport const acos = <T extends C>(x: X<T>) => f<T>('acos', x)\nexport const acosh = <T extends C>(x: X<T>) => f<T>('acosh', x)\nexport const asin = <T extends C>(x: X<T>) => f<T>('asin', x)\nexport const asinh = <T extends C>(x: X<T>) => f<T>('asinh', x)\nexport const atan = <T extends C>(x: X<T>) => f<T>('atan', x)\nexport const atanh = <T extends C>(x: X<T>) => f<T>('atanh', x)\nexport const ceil = <T extends C>(x: X<T>) => f<T>('ceil', x)\nexport const cos = <T extends C>(x: X<T>) => f<T>('cos', x)\nexport const cosh = <T extends C>(x: X<T>) => f<T>('cosh', x)\nexport const dFdx = <T extends C>(x: X<T>) => f<T>('dFdx', x)\nexport const dFdy = <T extends C>(x: X<T>) => f<T>('dFdy', x)\nexport const degrees = <T extends C>(x: X<T>) => f<T>('degrees', x)\nexport const exp = <T extends C>(x: X<T>) => f<T>('exp', x)\nexport const exp2 = <T extends C>(x: X<T>) => f<T>('exp2', x)\nexport const floor = <T extends C>(x: X<T>) => f<T>('floor', x)\nexport const fract = <T extends C>(x: X<T>) => f<T>('fract', x)\nexport const fwidth = <T extends C>(x: X<T>) => f<T>('fwidth', x)\nexport const inverseSqrt = <T extends C>(x: X<T>) => f<T>('inverseSqrt', x)\nexport const log = <T extends C>(x: X<T>) => f<T>('log', x)\nexport const log2 = <T extends C>(x: X<T>) => f<T>('log2', x)\nexport const negate = <T extends C>(x: X<T>) => f<T>('negate', x)\nexport const normalize = <T extends C>(x: X<T>) => f<T>('normalize', x)\nexport const oneMinus = <T extends C>(x: X<T>) => f<T>('oneMinus', x)\nexport const radians = <T extends C>(x: X<T>) => f<T>('radians', x)\nexport const reciprocal = <T extends C>(x: X<T>) => f<T>('reciprocal', x)\nexport const round = <T extends C>(x: X<T>) => f<T>('round', x)\nexport const saturate = <T extends C>(x: X<T>) => f<T>('saturate', x)\nexport const sign = <T extends C>(x: X<T>) => f<T>('sign', x)\nexport const sin = <T extends C>(x: X<T>) => f<T>('sin', x)\nexport const sinh = <T extends C>(x: X<T>) => f<T>('sinh', x)\nexport const sqrt = <T extends C>(x: X<T>) => f<T>('sqrt', x)\nexport const tan = <T extends C>(x: X<T>) => f<T>('tan', x)\nexport const tanh = <T extends C>(x: X<T>) => f<T>('tanh', x)\nexport const trunc = <T extends C>(x: X<T>) => f<T>('trunc', x)\n\n// 1. Functions where first argument determines return type\nexport const atan2 = <T extends C>(x: X<T>, y: X) => f<T>('atan2', x, y)\nexport const clamp = <T extends C>(x: X<T>, y: X, z: X) => f<T>('clamp', x, y, z)\nexport const max = <T extends C>(x: X<T>, y: X) => f<T>('max', x, y)\nexport const min = <T extends C>(x: X<T>, y: X) => f<T>('min', x, y)\nexport const mix = <T extends C>(x: X<T>, y: X, a: X) => f<T>('mix', x, y, a)\nexport const pow = <T extends C>(x: X<T>, y: X) => f<T>('pow', x, y)\nexport const reflect = <T extends C>(I: X<T>, N: X) => f<T>('reflect', I, N)\nexport const refract = <T extends C>(I: X<T>, N: X, eta: X) => f<T>('refract', I, N, eta)\n\n// 2. Functions where not first argument determines return type\nexport const smoothstep = <T extends C>(e0: X, e1: X, x: X<T>) => f<T>('smoothstep', e0, e1, x)\nexport const step = <T extends C>(edge: X, x: X<T>) => f<T>('step', edge, x)\nexport const mod = <T extends C>(x: NodeProxy<T>, y: X<T>) => x.sub(x.div(y).toFloat().floor().mul(y))\n","import { nested as cached } from 'reev'\nimport { is, loadingImage } from './utils/helpers'\nimport {\n createArrayBuffer,\n createBindGroup,\n createBindings,\n createComputePipeline,\n createDepthTexture,\n createDescriptor,\n createDevice,\n createPipeline,\n createTextureSampler,\n createVertexBuffers,\n} from './utils/pipeline'\nimport type { GL, WebGPUState } from './types'\nimport { compute, fragment, vertex } from './node'\n\nconst WORKING_GROUP_SIZE = 32\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 workgroupCount = Math.ceil(gl.particles / WORKING_GROUP_SIZE)\n pass.dispatchWorkgroups(workgroupCount, 1, 1)\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[]) => {\n needsUpdate = true\n const stride = value.length / gl.count\n const { location } = bindings.attrib()\n const { array, buffer } = createArrayBuffer(device, value, 'attrib')\n return { array, buffer, location, stride }\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 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) // needs to set leatest value\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _texture = (key: string, src: string) => {\n loadingImage(gl, src, (source) => {\n const { width, height } = source\n const { texture } = textures(key, width, height)\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\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, 1, 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 = fragment(gl.fs, config) // needs to be before vertex\n vert = vertex(gl.vs, config)\n comp = compute(gl.cs, 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, _uniform, _texture, _storage: cp._storage }\n}\n","import { 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>) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride } of attribs) {\n vertexBuffers[location] = buffer\n bufferLayouts[location] = {\n arrayStride: stride * 4,\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(stride),\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 }),\n entryPoint: 'main',\n buffers: bufferLayouts,\n },\n fragment: {\n module: device.createShaderModule({ label: 'frag', code: fs }),\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 }),\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"],"mappings":"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","names":["src_exports","__export","Fn","If","Loop","Return","Switch","abs","acos","acosh","all","any","asin","asinh","assign","atan","atan2","atanh","attribute","bool","builtin","bvec2","bvec3","bvec4","ceil","clamp","color","compute","constant","conversion","cos","cosh","createGL","cross","cubeTexture","dFdx","dFdy","src_default","degrees","distance","dot","element","exp","exp2","float","floor","fract","fragDepth","fragment","frontFacing","function_","fwidth","gather","iMouse","iResolution","iTime","id","instanceIndex","int","inverseSqrt","isGL","isServer","isWebGPUSupported","ivec2","ivec3","ivec4","length","lengthSq","log","log2","mat2","mat3","mat4","max","member","min","mix","mod","negate","node","normalLocal","normalView","normalWorld","normalize","oneMinus","operator","pointCoord","position","positionLocal","positionView","positionWorld","pow","radians","reciprocal","reflect","refract","round","sampleIndex","sampleMask","sampler2D","saturate","scatter","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","webgl","webgpu","__toCommonJS","import_reev","import_refr","import_reev","is","a","isFloat32","value","loadingImage","gl","src","fun","source","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createVbo","data","buffer","createIbo","getStride","count","value","iboValue","stride","createAttrib","loc","vbo","ibo","str","createUniform","is","l","createTexture","img","unit","texture","createStorage","size","ping","pong","array","particles","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","CONVERSIONS","TYPE_MAPPING","CONSTANTS","OPERATORS","OPERATOR_KEYS","COMPONENT_COUNT_TO_TYPE","BUILTIN_TYPES","COMPARISON_OPERATORS","LOGICAL_OPERATORS","WGSL_TO_GLSL_BUILTIN","FUNCTION_RETURN_TYPES","FUNCTIONS","isSwizzle","key","is","isOperator","OPERATOR_KEYS","isFunction","FUNCTIONS","isConversion","CONVERSIONS","isNodeProxy","x","isConstants","type","CONSTANTS","hex2rgb","hex","r","g","b","count","getId","getBluiltin","c","id","ret","WGSL_TO_GLSL_BUILTIN","getConversions","TYPE_MAPPING","getOperator","op","OPERATORS","getConstant","conversionKey","index","getEventFun","isAttribute","isTexture","value","safeEventCall","fun","initNodeContext","isArrayAccess","addDependency","inferBuiltin","id","BUILTIN_TYPES","inferOperator","L","R","op","COMPARISON_OPERATORS","LOGICAL_OPERATORS","inferPrimitiveType","x","is","COMPONENT_COUNT_TO_TYPE","inferFromCount","count","inferFromArray","arr","c","ret","infer","inferFunction","FUNCTION_RETURN_TYPES","inferImpl","target","type","props","children","inferFrom","layout","y","z","isConstants","isSwizzle","isNodeProxy","field","parseArray","children","c","x","is","code","parseGather","y","target","parseSwizzle","valueType","infer","indexVar","texSize","coordX","coordY","parseScatter","storageNode","valueNode","storageId","valueCode","parseTexture","z","w","_y","args","parseIf","ret","i","isElse","parseSwitch","parseDeclare","type","varName","wgslType","getConversions","parseStructHead","id","fields","lines","key","fieldType","addDependency","parseStruct","instanceId","initialValues","ordered","parseDefine","props","returnType","layout","argParams","params","input","paramId","scopeCode","parseVaryingHead","parseAttribHead","location","parseUniformHead","isTexture","group","binding","parseStorageHead","parseConstantHead","value","code","target","c","initNodeContext","is","parseArray","ret","type","props","id","children","fields","initialValues","x","y","z","w","parseGather","storageNode","indexNode","parseScatter","getConversions","getOperator","parseTexture","child","parseIf","parseSwitch","parseDeclare","parseDefine","infer","parseStructHead","parseStruct","field","parseVaryingHead","getBluiltin","fun","getEventFun","safeEventCall","parseAttribHead","head","varType","parseUniformHead","parseStorageHead","parseConstantHead","scope","define","addToScope","x","props","toVar","id","getId","y","node","z","assign","isScatter","Return","struct","fields","initialValues","instanceId","scoped","fun","_scope","_define","If","ifNode","ret","_x","_fun","_y","Loop","conversion","Switch","switchNode","values","Fn","defaultId","layout","args","paramVars","paramDefs","input","i","_layout","toPrimitive","x","hint","code","node","type","props","args","listeners","get","_","y","toVar","id","getId","attribute","constant","uniform","variable","builtin","vertexStage","z","gather","element","member","assign","isOperator","operator","isFunction","function_","isConversion","conversion","getConstant","is","isArrayAccess","set","fun","storage","index","scatter","select","key","GLSL_FRAGMENT_HEAD","topological","headers","dependencies","sorted","visited","visiting","visit","id","deps","dep","generateHead","x","c","body","code","head","value","generateStruct","map","fragment","is","ret","vertex","compute","position","builtin","vertexIndex","instanceIndex","frontFacing","fragDepth","sampleIndex","sampleMask","pointCoord","id","positionLocal","positionWorld","positionView","normalLocal","normalWorld","normalView","screenCoordinate","screenUV","float","x","conversion","int","uint","bool","vec2","y","vec3","z","vec4","w","mat2","args","mat3","mat4","ivec2","ivec3","ivec4","uvec2","uvec3","uvec4","bvec2","bvec3","bvec4","texture2D","sampler2D","color","r","g","b","is","hex2rgb","iResolution","uniform","iMouse","iTime","uv","all","function_","any","length","lengthSq","distance","dot","cross","cubeTexture","texture","texelFetch","textureLod","abs","acos","acosh","asin","asinh","atan","atanh","ceil","cos","cosh","dFdx","dFdy","degrees","exp","exp2","floor","fract","fwidth","inverseSqrt","log","log2","negate","normalize","oneMinus","radians","reciprocal","round","saturate","sign","sin","sinh","sqrt","tan","tanh","trunc","atan2","clamp","max","min","mix","a","pow","reflect","I","N","refract","eta","smoothstep","e0","e1","step","edge","mod","vert","computeProgram","gl","c","activeUnit","currentNum","units","cached","config","pg","createProgram","compute","size","uniforms","key","storages","array","ping","pong","attachments","loc","unit","index","i","o","createAttachment","cleanStorage","value","createUniform","createStorage","webgl","cp","fragment","vertex","attribs","_attribute","iboValue","createAttrib","_uniform","_texture","src","loadingImage","source","createTexture","clean","render","import_reev","createDevice","c","log","gpu","format","device","e","createBindings","uniform","texture","storage","attrib","group","binding","location","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","createBindGroup","uniforms","textures","storages","groups","ret","add","i","layout","layouts","bindings","b","sampler","view","createPipeline","bindGroupLayouts","vs","fs","createComputePipeline","cs","bufferUsage","type","createArrayBuffer","array","isFloat32","usage","size","createDescriptor","depthTexture","createTextureSampler","width","height","createDepthTexture","WORKING_GROUP_SIZE","computeProgram","gl","device","bindings","flush","_pass","storages","cached","_key","value","array","buffer","createArrayBuffer","binding","group","key","bindGroups","bindGroupLayouts","comp","pipeline","createComputePipeline","pass","i","workgroupCount","webgpu","context","format","createDevice","createBindings","cp","frag","vert","needsUpdate","depthTexture","attribs","stride","location","uniforms","textures","width","height","texture","sampler","createTextureSampler","_attribute","_uniform","is","_texture","src","loadingImage","source","update","vertexBuffers","bufferLayouts","createVertexBuffers","createBindGroup","createPipeline","v","render","config","fragment","vertex","compute","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","defaultFragment","vec4","fract","position","iResolution","defaultVertex","float","int","vertexIndex","createGL","props","gl","k","v","i","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 isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n particles: 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.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\n","import type { GL } from './../types'\n\nexport 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\nexport const loadingImage = (gl: GL, src: string, fun: (source: HTMLImageElement) => void) => {\n gl.loading++\n const source = new Image()\n Object.assign(source, { src, crossOrigin: 'anonymous' })\n source.decode().then(() => {\n fun(source)\n gl.loading--\n })\n}\n","import { nested as cached } from 'reev'\nimport { is, loadingImage } from './helpers'\nimport {\n cleanStorage,\n createAttachment,\n createAttrib,\n createProgram,\n createStorage,\n createTexture,\n createUniform,\n} from './program'\nimport type { GL, WebGLState } from '../types'\n\nconst DEFAULT_FRAGMENT = /* 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\nconst DEFAULT_VERTEX = /* 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\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, DEFAULT_VERTEX, gl)!\n const size = Math.ceil(Math.sqrt(gl.particles))\n\n const uniforms = cached((key) => c.getUniformLocation(pg, key)!)\n const storages = cached((key) => {\n const array = new Float32Array(size * size * 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 createUniform(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, 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)) : DEFAULT_FRAGMENT\n const vs = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs!.vertex(config)) : DEFAULT_VERTEX\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 attribs = cached((key) => c.getAttribLocation(pg, key))\n const uniforms = cached((key) => c.getUniformLocation(pg, key))\n\n const _attribute = (key = '', value: number[], iboValue: number[]) => {\n const loc = attribs(key, true)\n createAttrib(c, loc, gl.count, value, iboValue)\n }\n\n const _uniform = (key: string, value: number | number[]) => {\n c.useProgram(pg)\n createUniform(c, uniforms(key)!, value)\n cp?._uniform(key, value)\n }\n\n const _texture = (key: string, src: string) => {\n c.useProgram(pg)\n loadingImage(gl, src, (source) => {\n createTexture(c, source, uniforms(key)!, units(key))\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 c.drawArrays(c.TRIANGLES, 0, gl.count)\n c.bindFramebuffer(c.FRAMEBUFFER, null)\n }\n\n const webgl: WebGLState = { context: c, program: pg, storages: cp?.storages }\n\n return { webgl, render, clean, _attribute, _uniform, _texture, _storage: cp?._storage }\n}\n","import { is } from './helpers'\nimport type { GL } from '../types'\n\nconst createShader = (c: WebGLRenderingContext, 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: WebGLRenderingContext, 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\nconst createVbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, new Float32Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n return buffer\n}\n\nconst createIbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, buffer)\n c.bufferData(c.ELEMENT_ARRAY_BUFFER, new Int16Array(data), c.STATIC_DRAW)\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, null)\n return buffer\n}\n\nconst getStride = (count: number, value: number[], iboValue?: number[]) => {\n if (iboValue) count = Math.max(...iboValue) + 1\n const stride = value.length / count\n return Math.floor(stride)\n}\n\nexport const createAttrib = (\n c: WebGLRenderingContext,\n loc: number,\n count: number,\n value: number[],\n iboValue: number[]\n) => {\n const vbo = createVbo(c, value)\n const ibo = createIbo(c, iboValue)\n const str = getStride(count, value, iboValue)\n c.bindBuffer(c.ARRAY_BUFFER, vbo)\n c.enableVertexAttribArray(loc)\n c.vertexAttribPointer(loc, str, c.FLOAT, false, 0, 0)\n if (ibo) c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, ibo)\n}\n\nexport const createUniform = (c: WebGLRenderingContext, 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: WebGLRenderingContext,\n img: HTMLImageElement,\n loc: WebGLUniformLocation,\n unit: number\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, img)\n 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}\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 size: number,\n ping: TextureBuffer,\n pong: TextureBuffer,\n unit: number,\n array: Float32Array\n) => {\n const particles = size * size\n const vectorSize = value.length / particles\n for (let i = 0; i < particles; 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, size, size, 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, size, size, 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","import { nested as cached } from 'reev'\nimport { is, loadingImage } from './helpers'\nimport {\n createArrayBuffer,\n createBindGroup,\n createBindings,\n createComputePipeline,\n createDepthTexture,\n createDescriptor,\n createDevice,\n createPipeline,\n createTextureSampler,\n createVertexBuffers,\n} from './pipeline'\nimport type { GL, WebGPUState } from '../types'\n\nconst WORKING_GROUP_SIZE = 32\n\nconst DEFAULT_VERTEX = /* 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\nconst DEFAULT_FRAGMENT = /* 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\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 workgroupCount = Math.ceil(gl.particles / WORKING_GROUP_SIZE)\n pass.dispatchWorkgroups(workgroupCount, 1, 1)\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[]) => {\n needsUpdate = true\n const stride = value.length / gl.count\n const { location } = bindings.attrib()\n const { array, buffer } = createArrayBuffer(device, value, 'attrib')\n return { array, buffer, location, stride }\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 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) // needs to set leatest value\n device.queue.writeBuffer(buffer, 0, array as any)\n }\n\n const _texture = (key: string, src: string) => {\n loadingImage(gl, src, (source) => {\n const { width, height } = source\n const { texture } = textures(key, width, height)\n device.queue.copyExternalImageToTexture({ source }, { texture }, { width, height })\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, 1, 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)) : DEFAULT_FRAGMENT\n vert = gl.vs ? (is.str(gl.vs) ? gl.vs : gl.vs.vertex(config)) : DEFAULT_VERTEX\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, _uniform, _texture, _storage: cp._storage }\n}\n","import { 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>) => {\n const vertexBuffers: GPUBuffer[] = []\n const bufferLayouts: GPUVertexBufferLayout[] = []\n for (const { buffer, location, stride } of attribs) {\n vertexBuffers[location] = buffer\n bufferLayouts[location] = {\n arrayStride: stride * 4,\n attributes: [\n {\n shaderLocation: location,\n offset: 0,\n format: getVertexFormat(stride),\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"],"mappings":"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","names":["src_exports","__export","createGL","src_default","isGL","isServer","isWebGPUSupported","__toCommonJS","import_reev","import_refr","is","a","isFloat32","value","loadingImage","gl","src","fun","source","import_reev","createShader","c","source","type","onError","shader","error","createProgram","frag","vert","gl","pg","fs","vs","createVbo","data","buffer","createIbo","getStride","count","value","iboValue","stride","createAttrib","loc","vbo","ibo","str","createUniform","is","l","createTexture","img","unit","texture","createStorage","size","ping","pong","array","particles","vectorSize","i","j","cleanStorage","map","createAttachment","o","index","attachment","DEFAULT_FRAGMENT","DEFAULT_VERTEX","computeProgram","gl","c","activeUnit","currentNum","units","cached","cs","is","pg","createProgram","size","uniforms","key","storages","array","ping","pong","attachments","loc","unit","index","i","o","createAttachment","cleanStorage","value","createUniform","createStorage","webgl","config","cp","fs","vs","attribs","_attribute","iboValue","createAttrib","_uniform","_texture","src","loadingImage","source","createTexture","clean","render","import_reev","createDevice","c","log","gpu","format","device","e","createBindings","uniform","texture","storage","attrib","group","binding","location","getVertexFormat","stride","createVertexBuffers","attribs","vertexBuffers","bufferLayouts","buffer","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","WORKING_GROUP_SIZE","DEFAULT_VERTEX","DEFAULT_FRAGMENT","computeProgram","gl","device","bindings","flush","_pass","storages","cached","_key","value","array","buffer","createArrayBuffer","binding","group","key","bindGroups","bindGroupLayouts","comp","pipeline","createComputePipeline","pass","v","i","workgroupCount","webgpu","context","format","createDevice","createBindings","cp","frag","vert","needsUpdate","depthTexture","attribs","stride","location","uniforms","textures","width","height","texture","sampler","createTextureSampler","_attribute","_uniform","is","_texture","src","loadingImage","source","update","vertexBuffers","bufferLayouts","createVertexBuffers","createBindGroup","createPipeline","render","config","encoder","createDescriptor","resize","canvas","createDepthTexture","clean","isGL","a","is","isServer","isWebGPUSupported","iTime","createGL","props","gl","k","v","i","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}