glre 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -18
- package/dist/index.d.ts +60 -220
- package/dist/index.js +35 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -37
- package/dist/index.mjs.map +1 -1
- package/dist/native.d.ts +49 -5
- package/dist/native.js +35 -37
- package/dist/native.js.map +1 -1
- package/dist/native.mjs +35 -37
- package/dist/native.mjs.map +1 -1
- package/dist/react.d.ts +1 -2
- package/dist/react.js +35 -37
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +35 -37
- package/dist/react.mjs.map +1 -1
- package/dist/solid.d.ts +1 -2
- package/dist/solid.js +35 -37
- package/dist/solid.js.map +1 -1
- package/dist/solid.mjs +35 -37
- package/dist/solid.mjs.map +1 -1
- package/package.json +5 -1
- package/src/code/glsl.ts +7 -45
- package/src/code/wgsl.ts +10 -46
- package/src/index.ts +31 -29
- package/src/native.ts +9 -4
- package/src/node/cache.ts +3 -10
- package/src/node/const.ts +2 -19
- package/src/node/conv.ts +6 -17
- package/src/node/index.ts +3 -6
- package/src/node/node.ts +8 -22
- package/src/node/uniform.ts +6 -13
- package/src/react.ts +0 -1
- package/src/solid.ts +0 -1
- package/src/types.ts +20 -21
- package/src/{utils.ts → utils/helpers.ts} +0 -9
- package/src/utils/pipeline.ts +128 -0
- package/src/utils/program.ts +94 -0
- package/src/webgl.ts +78 -0
- package/src/webgpu.ts +70 -0
- package/src/webgl/buffer.ts +0 -78
- package/src/webgl/index.ts +0 -79
- package/src/webgl/program.ts +0 -61
- package/src/webgl/shader.ts +0 -60
- package/src/webgl/texture.ts +0 -93
- package/src/webgpu/buffer.ts +0 -96
- package/src/webgpu/device.ts +0 -91
- package/src/webgpu/index.ts +0 -40
- package/src/webgpu/pipeline.ts +0 -94
- package/src/webgpu/texture.ts +0 -139
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/webgl/index.ts","../src/webgl/buffer.ts","../src/webgl/program.ts","../src/webgl/shader.ts","../src/webgl/texture.ts","../src/utils.ts","../src/code/glsl.ts","../src/webgpu/device.ts","../src/webgpu/pipeline.ts","../src/code/wgsl.ts","../src/webgpu/buffer.ts","../src/webgpu/texture.ts","../src/webgpu/index.ts","../src/node/const.ts","../src/node/node.ts","../src/node/uniform.ts","../src/node/cache.ts","../src/node/conv.ts","../src/node/index.ts"],"sourcesContent":["import { durable, event } from 'reev'\nimport { createFrame, createQueue } from 'refr'\nimport { webgl } from './webgl/index'\nimport { webgpu } from './webgpu/index'\nimport { is, isWebGPUSupported } from './utils'\nimport type { EventState } from 'reev'\nimport type { GL } from './types'\nexport * from './code/glsl'\nexport * from './code/wgsl'\nexport * from './node'\nexport * from './types'\nexport * from './utils'\nexport * from './webgl'\nexport * from './webgpu'\n\nlet iTime = performance.now(),\n iPrevTime = 0,\n iDeltaTime = 0\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 createGL = (props?: Partial<GL>) => {\n const gl = event<Partial<GL>>({\n isNative: false,\n isWebGL: true,\n isLoop: true,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 6,\n counter: 0,\n }) as EventState<GL>\n\n gl('mount', () => {\n if (!isWebGPUSupported()) gl.isWebGL = true\n if (gl.isWebGL) {\n webgl(gl)\n } else webgpu(gl)\n gl.init()\n gl.resize()\n gl.frame(() => {\n gl.loop()\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 gl.frame.clean(gl.render)\n if (gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('loop', () => {\n iPrevTime = iTime\n iTime = performance.now() / 1000\n iDeltaTime = iTime - iPrevTime\n gl.uniform({ iPrevTime, iTime, iDeltaTime })\n // if (gl.fragmentNode) updateUniforms({ time: iTime }) // @TODO FIX\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.queue = createQueue()\n gl.frame = createFrame()\n\n gl.attribute = durable((key, value, iboValue) => {\n gl.queue(() => void gl._attribute?.(key, value, iboValue))\n })\n\n gl.uniform = durable((key, value, isMatrix) => {\n gl.queue(() => void gl._uniform?.(key, value, isMatrix))\n })\n\n gl.texture = durable((key, value) => {\n gl.queue(() => void gl._texture?.(key, value))\n })\n\n return gl(props)\n}\n\nexport default createGL\n","import { nested } from 'reev'\nimport { createAttribute, createIbo, createVbo, vertexStride } from './buffer'\nimport { createProgram, deleteProgram, getUniformType } from './program'\nimport { createFragmentShader, createVertexShader } from './shader'\nimport { activeTexture, createTexture } from './texture'\nimport { glsl } from '../code/glsl'\nimport { is } from '../utils'\nimport type { X } from '../node'\nimport type { GL } from '../types'\nexport * from './buffer'\nexport * from './program'\nexport * from './shader'\nexport * from './texture'\n\nconst a_position = [-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]\n\nexport const webgl = (gl: GL) => {\n gl('init', () => {\n const c = gl.gl\n let vs = gl.vs || gl.vert || gl.vertex\n let fs = gl.fs || gl.frag || gl.fragment\n if (is.obj(fs)) fs = glsl(fs as X)\n if (is.obj(vs)) vs = glsl(vs as X)\n if (gl.count === 6) gl.attribute({ a_position })\n gl.pg = createProgram(c, createVertexShader(c, vs), createFragmentShader(c, fs))\n gl.location = nested((key, isAttribute = false) => {\n return isAttribute ? c.getAttribLocation(gl.pg, key) : c.getUniformLocation(gl.pg, key)\n })\n })\n\n gl('clean', () => {\n const c = gl.gl\n deleteProgram(c, gl.pg)\n })\n\n gl('render', () => {\n const c = gl.gl\n c.useProgram(gl.pg)\n gl.queue.flush()\n c.clear(c.COLOR_BUFFER_BIT)\n c.viewport(0, 0, ...gl.size)\n c.drawArrays(c.TRIANGLES, 0, gl.count)\n })\n\n gl('_attribute', (key = '', value: number[], iboValue: number[]) => {\n const c = gl.gl\n const n = gl.count\n const loc = gl.location(key, true)\n const vbo = createVbo(c, value)\n const ibo = createIbo(c, iboValue)\n const stride = vertexStride(n, value, iboValue)\n createAttribute(c, stride, loc, vbo, ibo)\n })\n\n gl('_uniform', (key: string, value = 0, isMatrix = false) => {\n const type = getUniformType(value, isMatrix)\n const c = gl.gl\n const loc = gl.location(key)\n if (isMatrix) c[type](loc, false, value)\n else c[type](loc, value)\n })\n\n const _loadFn = (image: HTMLImageElement) => {\n const loc = gl.location(image.alt)\n const unit = gl.activeUnit(image.alt)\n const tex = createTexture(gl.gl, image)\n activeTexture(gl.gl, loc, unit, tex)\n }\n\n gl('_texture', (alt: string, src: string) => {\n const image = new Image()\n image.addEventListener('load', _loadFn.bind(null, image), false)\n Object.assign(image, { src, alt, crossOrigin: 'anonymous' })\n })\n\n let _activeUnit = 0\n gl.activeUnit = nested(() => _activeUnit++)\n return gl\n}\n","// WebGLバッファー作成と管理\nexport const createVbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n if (!buffer) throw new Error('Failed to create VBO')\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\n// インデックスバッファーオブジェクト作成\nexport const createIbo = (c: WebGLRenderingContext, data: number[]) => {\n const buffer = c.createBuffer()\n if (!buffer) throw new Error('Failed to create IBO')\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, buffer)\n c.bufferData(\n c.ELEMENT_ARRAY_BUFFER,\n new Int16Array(data),\n c.STATIC_DRAW\n )\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, null)\n return buffer\n}\n\n// アトリビュート設定\nexport const createAttribute = (\n c: WebGLRenderingContext,\n stride: number,\n location: number,\n vbo: WebGLBuffer,\n ibo?: WebGLBuffer\n) => {\n c.bindBuffer(c.ARRAY_BUFFER, vbo)\n c.enableVertexAttribArray(location)\n c.vertexAttribPointer(location, stride, c.FLOAT, false, 0, 0)\n if (ibo) c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, ibo)\n}\n\n// バッファーの削除\nexport const deleteBuffer = (c: WebGLRenderingContext, buffer: WebGLBuffer) => {\n c.deleteBuffer(buffer)\n}\n\n// 頂点ストライドを計算\nexport const vertexStride = (\n count: number,\n value: number[],\n iboValue?: number[]\n) => {\n if (iboValue) count = Math.max(...iboValue) + 1\n const stride = value.length / count\n if (stride !== Math.floor(stride))\n console.warn(`Vertex Stride Error: count ${count} is mismatch`)\n return Math.floor(stride)\n}\n\n// バッファーデータの更新\nexport const updateVbo = (\n c: WebGLRenderingContext,\n buffer: WebGLBuffer,\n data: number[],\n usage = c.STATIC_DRAW\n) => {\n c.bindBuffer(c.ARRAY_BUFFER, buffer)\n c.bufferData(c.ARRAY_BUFFER, new Float32Array(data), usage)\n c.bindBuffer(c.ARRAY_BUFFER, null)\n}\n\nexport const updateIbo = (\n c: WebGLRenderingContext,\n buffer: WebGLBuffer,\n data: number[],\n usage = c.STATIC_DRAW\n) => {\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, buffer)\n c.bufferData(c.ELEMENT_ARRAY_BUFFER, new Int16Array(data), usage)\n c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, null)\n}\n","// WebGLプログラム作成と管理\nexport const createProgram = (\n c: WebGLRenderingContext,\n vs: WebGLShader,\n fs: WebGLShader\n) => {\n const pg = c.createProgram()\n if (!pg) throw new Error('Failed to create pg')\n c.attachShader(pg, vs)\n c.attachShader(pg, fs)\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 throw new Error(`Could not link pg: ${error}`)\n}\n\n// プログラムの削除\nexport const deleteProgram = (c: WebGLRenderingContext, pg: WebGLProgram) => {\n c.deleteProgram(pg)\n}\n\n// プログラムの情報を取得\nexport const getProgramInfo = (c: WebGLRenderingContext, pg: WebGLProgram) => {\n return {\n linked: c.getProgramParameter(pg, c.LINK_STATUS),\n log: c.getProgramInfoLog(pg),\n activeAttributes: c.getProgramParameter(\n pg,\n c.ACTIVE_ATTRIBUTES\n ),\n activeUniforms: c.getProgramParameter(pg, c.ACTIVE_UNIFORMS),\n }\n}\n\n// ユニフォームタイプの取得\nexport const getUniformType = (value: number | number[], isMatrix = false) => {\n let length = typeof value === 'number' ? 0 : value?.length\n if (!length) return `uniform1f`\n if (!isMatrix) return `uniform${length}fv`\n length = Math.sqrt(length) << 0\n return `uniformMatrix${length}fv`\n}\n\n// ユニフォーム位置を取得\nexport const getUniformLocation = (\n c: WebGLRenderingContext,\n pg: WebGLProgram,\n name: string\n) => {\n return c.getUniformLocation(pg, name)\n}\n\n// アトリビュート位置を取得\nexport const getAttribLocation = (\n c: WebGLRenderingContext,\n pg: WebGLProgram,\n name: string\n) => {\n return c.getAttribLocation(pg, name)\n}\n","const defaultVertexShader = /* cpp */ `\nattribute vec4 a_position;\nvoid main() {\n gl_Position = a_position;\n}\n`\n\nconst defaultFragmentShader = /* cpp */ `\nprecision mediump float;\nuniform vec2 iResolution;\nvoid main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);\n}\n`\n\nexport const deleteShader = (c: WebGLRenderingContext, shader: WebGLShader) => {\n c.deleteShader(shader)\n}\n\n// WebGLシェーダー作成と管理\nconst createShader = (\n c: WebGLRenderingContext,\n source: string,\n type: number\n) => {\n const shader = c.createShader(type)\n if (!shader) throw new Error('Failed to create shader')\n c.shaderSource(shader, source)\n c.compileShader(shader)\n if (c.getShaderParameter(shader, c.COMPILE_STATUS)) return shader\n const error = c.getShaderInfoLog(shader)\n deleteShader(c, shader)\n throw new Error(`Could not compile shader: ${error}`)\n}\n\nexport const createVertexShader = (\n c: WebGLRenderingContext,\n source = defaultVertexShader\n) => {\n return createShader(c, source, c.VERTEX_SHADER)\n}\n\nexport const createFragmentShader = (\n c: WebGLRenderingContext,\n source = defaultFragmentShader\n) => {\n return createShader(c, source, c.FRAGMENT_SHADER)\n}\n\n// シェーダーの情報を取得\nexport const getShaderInfo = (\n c: WebGLRenderingContext,\n shader: WebGLShader\n) => {\n return {\n compiled: c.getShaderParameter(shader, c.COMPILE_STATUS),\n log: c.getShaderInfoLog(shader),\n source: c.getShaderSource(shader),\n }\n}\n","// WebGLテクスチャ作成と管理\nexport const createTexture = (\n c: WebGLRenderingContext,\n img: HTMLImageElement\n) => {\n const texture = c.createTexture()\n if (!texture) throw new Error('Failed to create texture')\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 return texture\n}\n\n// テクスチャユニットをアクティブ化\nexport const activeTexture = (\n c: WebGLRenderingContext,\n location: WebGLUniformLocation | null,\n unit: number,\n texture: WebGLTexture\n) => {\n if (!location) return\n c.uniform1i(location, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n}\n\n// テクスチャの削除\nexport const deleteTexture = (\n c: WebGLRenderingContext,\n texture: WebGLTexture\n) => {\n c.deleteTexture(texture)\n}\n\n// 空のテクスチャを作成\nexport const createEmptyTexture = (\n c: WebGLRenderingContext,\n w = 1280,\n h = 800,\n format = c.RGBA,\n type = c.UNSIGNED_BYTE\n) => {\n const texture = c.createTexture()\n if (!texture) throw new Error('Failed to create empty texture')\n c.bindTexture(c.TEXTURE_2D, texture)\n // prettier-ignore\n c.texImage2D(c.TEXTURE_2D, 0, format, w, h, 0, format, type, null)\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 return texture\n}\n\n// キューブマップテクスチャを作成\nexport const createCubeTexture = (\n c: WebGLRenderingContext,\n imgs: HTMLImageElement[]\n) => {\n if (imgs.length !== 6)\n throw new Error('Cube texture requires exactly 6 imgs')\n const texture = c.createTexture()\n if (!texture) throw new Error('Failed to create cube texture')\n c.bindTexture(c.TEXTURE_CUBE_MAP, texture)\n const faces = [\n c.TEXTURE_CUBE_MAP_POSITIVE_X,\n c.TEXTURE_CUBE_MAP_NEGATIVE_X,\n c.TEXTURE_CUBE_MAP_POSITIVE_Y,\n c.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n c.TEXTURE_CUBE_MAP_POSITIVE_Z,\n c.TEXTURE_CUBE_MAP_NEGATIVE_Z,\n ]\n // prettier-ignore\n faces.forEach((face, index) => {\n c.texImage2D( face, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, imgs[index])\n })\n c.generateMipmap(c.TEXTURE_CUBE_MAP)\n // prettier-ignore\n c.texParameteri(c.TEXTURE_CUBE_MAP, c.TEXTURE_MIN_FILTER, c.LINEAR_MIPMAP_LINEAR)\n c.texParameteri(c.TEXTURE_CUBE_MAP, c.TEXTURE_MAG_FILTER, c.LINEAR)\n c.texParameteri(c.TEXTURE_CUBE_MAP, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE)\n c.texParameteri(c.TEXTURE_CUBE_MAP, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE)\n\n c.bindTexture(c.TEXTURE_CUBE_MAP, null)\n\n return texture\n}\n","export const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\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\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","import { is } from './../utils'\nimport type { Node, NodeType, X, ConversionContext } from '../node'\n\n// GLSLコード生成コンテキスト\ninterface GLSLContext extends ConversionContext {\n target: 'webgl'\n precision: 'lowp' | 'mediump' | 'highp'\n version: '100' | '300 es'\n}\n\n// ノードからGLSLコードを生成\nexport const nodeToGLSL = (\n nodeProxy: X,\n context?: Partial<GLSLContext>\n): string => {\n const ctx: GLSLContext = {\n target: 'webgl',\n precision: 'mediump',\n version: '300 es',\n nodes: new Map(),\n variables: new Map(),\n functions: new Map(),\n ...context,\n }\n\n return generateGLSLExpression(nodeProxy as any, ctx)\n}\n\n// GLSL式を生成\nconst generateGLSLExpression = (node: Node, context: GLSLContext): string => {\n if (!node) return '0.0'\n // 値ノード\n if (!is.und(node.value)) return formatGLSLValue(node.value, node.type)\n // プロパティアクセス(スウィズル)\n if (node.property && node.parent) {\n const parentExpr = generateGLSLExpression(node.parent, context)\n return `${parentExpr}.${node.property}`\n }\n // 演算子ノード\n if (node.operator && node.children && node.children.length >= 2)\n return generateGLSLOperator(node, context)\n // 数学関数ノード\n if (node.mathFunction && node.children && node.children.length >= 1)\n return generateGLSLMathFunction(node, context)\n return '0.0'\n}\n\n// GLSL値をフォーマット\nconst formatGLSLValue = (value: any, type: NodeType): string => {\n if (type === 'float') {\n const num = Number(value)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n }\n if (type === 'int') return `${Math.floor(Number(value))}`\n if (type === 'bool') return Boolean(value) ? 'true' : 'false'\n if (is.arr(value)) {\n const values = value\n .map((v) => {\n const num = Number(v)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n })\n .join(', ')\n if (type === 'vec2') return `vec2(${values})`\n if (type === 'vec3') return `vec3(${values})`\n if (type === 'vec4') return `vec4(${values})`\n if (type === 'color') return `vec3(${values})`\n }\n return '0.0'\n}\n\n// GLSL演算子を生成\nconst generateGLSLOperator = (node: Node, context: GLSLContext): string => {\n if (!node.children || node.children.length < 2) return '0.0'\n const left = generateGLSLExpression(node.children[0], context)\n const right = generateGLSLExpression(node.children[1], context)\n if (node.operator === 'add') return `(${left} + ${right})`\n if (node.operator === 'sub') return `(${left} - ${right})`\n if (node.operator === 'mul') return `(${left} * ${right})`\n if (node.operator === 'div') return `(${left} / ${right})`\n if (node.operator === 'mod') return `mod(${left}, ${right})`\n if (node.operator === 'equal') return `(${left} == ${right})`\n if (node.operator === 'notEqual') return `(${left} != ${right})`\n if (node.operator === 'lessThan') return `(${left} < ${right})`\n if (node.operator === 'lessThanEqual') return `(${left} <= ${right})`\n if (node.operator === 'greaterThan') return `(${left} > ${right})`\n if (node.operator === 'greaterThanEqual') return `(${left} >= ${right})`\n if (node.operator === 'and') return `(${left} && ${right})`\n if (node.operator === 'or') return `(${left} || ${right})`\n return `(${left} + ${right})`\n}\n\n// GLSL数学関数を生成\nconst generateGLSLMathFunction = (node: Node, context: GLSLContext): string => {\n if (!node.children || node.children.length < 1) return '0.0'\n const fun = node.mathFunction\n const args = node.children.map((child) => {\n return generateGLSLExpression(child, context)\n })\n const [x, y, z] = args\n // @TODO FIX\n // if (fun === 'toVar') return x // toVarは変数化のヒントなので、そのまま返す\n // 単項関数\n if (args.length === 1) {\n if (fun === 'abs') return `abs(${x})`\n if (fun === 'acos') return `acos(${x})`\n if (fun === 'asin') return `asin(${x})`\n if (fun === 'atan') return `atan(${x})`\n if (fun === 'ceil') return `ceil(${x})`\n if (fun === 'cos') return `cos(${x})`\n if (fun === 'floor') return `floor(${x})`\n if (fun === 'fract') return `fract(${x})`\n if (fun === 'length') return `length(${x})`\n if (fun === 'normalize') return `normalize(${x})`\n if (fun === 'sin') return `sin(${x})`\n if (fun === 'sqrt') return `sqrt(${x})`\n if (fun === 'tan') return `tan(${x})`\n }\n // 二項関数\n if (args.length === 2) {\n if (fun === 'atan2') return `atan(${x}, ${y})`\n if (fun === 'pow') return `pow(${x}, ${y})`\n if (fun === 'min') return `min(${x}, ${y})`\n if (fun === 'max') return `max(${x}, ${y})`\n if (fun === 'dot') return `dot(${x}, ${y})`\n if (fun === 'cross') return `cross(${x}, ${y})`\n if (fun === 'distance') return `distance(${x}, ${y})`\n if (fun === 'reflect') return `reflect(${x}, ${y})`\n }\n // 三項関数\n if (args.length === 3) {\n if (fun === 'mix') return `mix(${x}, ${y}, ${z})`\n if (fun === 'clamp') return `clamp(${x}, ${y}, ${z})`\n if (fun === 'smoothstep') return `smoothstep(${x}, ${y}, ${z})`\n if (fun === 'refract') return `refract(${x}, ${y}, ${z})`\n }\n\n return x || '0.0'\n}\n\n// 値からGLSL型を推定\nconst inferGLSLType = (value: unknown): string => {\n if (is.num(value)) return 'float'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2'\n if (len === 3) return 'vec3'\n if (len === 4) return 'vec4'\n }\n return 'float'\n}\n\n// 完全なGLSLシェーダーを生成\nexport const glsl = (\n fragmentNode: X,\n options?: {\n precision?: 'lowp' | 'mediump' | 'highp'\n version?: '100' | '300 es'\n uniforms?: Record<string, any>\n }\n) => {\n const precision = options?.precision || 'mediump'\n const version = options?.version || '300 es'\n const is300ES = version === '300 es'\n const fragment = nodeToGLSL(fragmentNode)\n let shader = ''\n if (is300ES) shader += '#version 300 es\\n'\n shader += `precision ${precision} float;\\n\\n`\n // ユニフォーム変数の追加\n if (options?.uniforms) {\n Object.entries(options.uniforms).forEach(([name, value]) => {\n const type = inferGLSLType(value)\n shader += `uniform ${type} ${name};\\n`\n })\n shader += '\\n'\n }\n // 出力変数\n if (is300ES) shader += 'out vec4 fragColor;\\n\\n'\n shader += 'void main() {\\n'\n shader += is300ES\n ? ` fragColor = ${fragment};\\n`\n : ` gl_FragColor = ${fragment};\\n`\n shader += '}\\n'\n\n return shader\n}\n","// WebGPUデバイス管理\nexport const requestWebGPUDevice = async (): Promise<{\n adapter: any // GPUAdapter @TODO FIX\n device: any // GPUDevice @TODO FIX\n}> => {\n // @ts-ignore @TODO FIX\n if (!navigator.gpu)\n throw new Error('WebGPU is not supported in this browser')\n // @ts-ignore\n const adapter = await navigator.gpu.requestAdapter()\n if (!adapter) throw new Error('Failed to get WebGPU adapter')\n const device = await adapter.requestDevice()\n if (!device) throw new Error('Failed to get WebGPU device')\n return { adapter, device }\n}\n\n// WebGPUデバイスの機能チェック\nexport const checkWebGPUSupport = (): boolean => {\n return 'gpu' in navigator\n}\n\n// デバイスの制限情報を取得\nexport const getDeviceLimits = (device: any) => {\n return {\n maxTextureDimension1D: device.limits.maxTextureDimension1D,\n maxTextureDimension2D: device.limits.maxTextureDimension2D,\n maxTextureDimension3D: device.limits.maxTextureDimension3D,\n maxTextureArrayLayers: device.limits.maxTextureArrayLayers,\n maxBindGroups: device.limits.maxBindGroups,\n maxDynamicUniformBuffersPerPipelineLayout:\n device.limits.maxDynamicUniformBuffersPerPipelineLayout,\n maxDynamicStorageBuffersPerPipelineLayout:\n device.limits.maxDynamicStorageBuffersPerPipelineLayout,\n maxSampledTexturesPerShaderStage:\n device.limits.maxSampledTexturesPerShaderStage,\n maxSamplersPerShaderStage:\n device.limits.maxSamplersPerShaderStage,\n maxStorageBuffersPerShaderStage:\n device.limits.maxStorageBuffersPerShaderStage,\n maxStorageTexturesPerShaderStage:\n device.limits.maxStorageTexturesPerShaderStage,\n maxUniformBuffersPerShaderStage:\n device.limits.maxUniformBuffersPerShaderStage,\n maxUniformBufferBindingSize:\n device.limits.maxUniformBufferBindingSize,\n maxStorageBufferBindingSize:\n device.limits.maxStorageBufferBindingSize,\n maxVertexBuffers: device.limits.maxVertexBuffers,\n maxVertexAttributes: device.limits.maxVertexAttributes,\n maxVertexBufferArrayStride:\n device.limits.maxVertexBufferArrayStride,\n maxComputeWorkgroupStorageSize:\n device.limits.maxComputeWorkgroupStorageSize,\n maxComputeInvocationsPerWorkgroup:\n device.limits.maxComputeInvocationsPerWorkgroup,\n maxComputeWorkgroupSizeX:\n device.limits.maxComputeWorkgroupSizeX,\n maxComputeWorkgroupSizeY:\n device.limits.maxComputeWorkgroupSizeY,\n maxComputeWorkgroupSizeZ:\n device.limits.maxComputeWorkgroupSizeZ,\n maxComputeWorkgroupsPerDimension:\n device.limits.maxComputeWorkgroupsPerDimension,\n }\n}\n\n// デバイスエラーハンドリング\nexport const setupDeviceErrorHandling = (device: any) => {\n device.addEventListener('uncapturederror', (event: any) => {\n console.error('WebGPU uncaptured error:', event.error)\n })\n}\n\n// キャンバスコンテキストの設定\nexport const configureCanvasContext = (\n canvas: HTMLCanvasElement,\n device: any,\n format: any = 'bgra8unorm'\n) => {\n const context = canvas.getContext('webgpu')\n if (!context) throw new Error('Failed to get WebGPU canvas context')\n\n // @ts-ignore\n context.configure({\n device,\n format,\n alphaMode: 'premultiplied',\n })\n\n return context\n}\n","// デフォルトの頂点シェーダー\nconst defaultVertexShader = `\n@vertex\nfn main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {\n var pos = array<vec2<f32>, 6>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>( 1.0, 1.0)\n );\n return vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n}\n`\n\n// デフォルトのフラグメントシェーダー\nconst defaultFragmentShader = `\n@fragment\nfn main() -> @location(0) vec4<f32> {\n return vec4<f32>(1.0, 0.0, 0.0, 1.0);\n}\n`\n\n// WebGPUパイプライン管理\nexport const createRenderPipeline = (\n device: any,\n vertexShader = defaultVertexShader,\n fragmentShader = defaultFragmentShader,\n format = 'bgra8unorm'\n) => {\n const v = device.createShaderModule({ code: vertexShader })\n const f = device.createShaderModule({ code: fragmentShader })\n return device.createRenderPipeline({\n layout: 'auto',\n vertex: {\n module: v,\n entryPoint: 'main',\n },\n fragment: {\n module: f,\n entryPoint: 'main',\n targets: [\n {\n format,\n },\n ],\n },\n primitive: {\n topology: 'triangle-list',\n },\n })\n}\n\n// コンピュートパイプライン作成\nexport const createComputePipeline = (device: any, computeShader: string) => {\n const computeModule = device.createShaderModule({ code: computeShader })\n return device.createComputePipeline({\n layout: 'auto',\n compute: { module: computeModule, entryPoint: 'main' },\n })\n}\n\n// シェーダーモジュール作成\nexport const createShaderModule = (device: any, code: string) => {\n return device.createShaderModule({ code })\n}\n\n// バインドグループレイアウト作成\nexport const createBindGroupLayout = (device: any, entries: any[]) => {\n return device.createBindGroupLayout({ entries })\n}\n\n// バインドグループ作成\nexport const createBindGroup = (device: any, layout: any, entries: any[]) => {\n return device.createBindGroup({ layout, entries })\n}\n\n// レンダーパス作成\nexport const createRenderPass = (\n encoder: any,\n colorAttachment: any,\n depthStencilAttachment?: any\n) => {\n const descriptor: any = { colorAttachments: [colorAttachment] }\n if (depthStencilAttachment)\n descriptor.depthStencilAttachment = depthStencilAttachment\n return encoder.beginRenderPass(descriptor)\n}\n\n// コマンドエンコーダー作成\nexport const createCommandEncoder = (device: any) => {\n return device.createCommandEncoder()\n}\n","import { is } from '../utils'\nimport type { Node, NodeType, ConversionContext, X } from '../node'\n\n// WGSLコード生成コンテキスト\ninterface WGSLContext extends ConversionContext {\n target: 'webgpu'\n}\n\n// ノードからWGSLコードを生成\nexport const nodeToWGSL = (\n nodeProxy: X,\n context?: Partial<WGSLContext>\n): string => {\n const ctx: WGSLContext = {\n target: 'webgpu',\n nodes: new Map(),\n variables: new Map(),\n functions: new Map(),\n ...context,\n }\n return generateWGSLExpression(nodeProxy as any, ctx)\n}\n\n// WGSL式を生成\nconst generateWGSLExpression = (node: Node, context: WGSLContext): string => {\n if (!node) return '0.0'\n // 値ノード\n if (node.value !== undefined)\n return formatWGSLValue(node.value, node.type)\n // プロパティアクセス(スウィズル)\n if (node.property && node.parent) {\n const parentExpr = generateWGSLExpression(node.parent, context)\n return `${parentExpr}.${node.property}`\n }\n // 演算子ノード\n if (node.operator && node.children && node.children.length >= 2)\n return generateWGSLOperator(node, context)\n // 数学関数ノード\n if (node.mathFunction && node.children && node.children.length >= 1)\n return generateWGSLMathFunction(node, context)\n return '0.0'\n}\n\n// WGSL値をフォーマット\nconst formatWGSLValue = (value: any, type: NodeType): string => {\n if (type === 'float') {\n const num = Number(value)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n }\n if (type === 'int') return `${Math.floor(Number(value))}`\n if (type === 'bool') return Boolean(value) ? 'true' : 'false'\n if (is.arr(value)) {\n const values = value\n .map((v) => {\n const num = Number(v)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n })\n .join(', ')\n if (type === 'vec2') return `vec2<f32>(${values})`\n if (type === 'vec3') return `vec3<f32>(${values})`\n if (type === 'vec4') return `vec4<f32>(${values})`\n if (type === 'color') return `vec3<f32>(${values})`\n }\n\n return '0.0'\n}\n\n// WGSL演算子を生成\nconst generateWGSLOperator = (node: Node, context: WGSLContext): string => {\n if (!node.children || node.children.length < 2) return '0.0'\n const left = generateWGSLExpression(node.children[0], context)\n const right = generateWGSLExpression(node.children[1], context)\n if (node.operator === 'add') return `(${left} + ${right})`\n if (node.operator === 'sub') return `(${left} - ${right})`\n if (node.operator === 'mul') return `(${left} * ${right})`\n if (node.operator === 'div') return `(${left} / ${right})`\n if (node.operator === 'mod') return `(${left} % ${right})`\n if (node.operator === 'equal') return `(${left} == ${right})`\n if (node.operator === 'notEqual') return `(${left} != ${right})`\n if (node.operator === 'lessThan') return `(${left} < ${right})`\n if (node.operator === 'lessThanEqual') return `(${left} <= ${right})`\n if (node.operator === 'greaterThan') return `(${left} > ${right})`\n if (node.operator === 'greaterThanEqual') return `(${left} >= ${right})`\n if (node.operator === 'and') return `(${left} && ${right})`\n if (node.operator === 'or') return `(${left} || ${right})`\n return `(${left} + ${right})`\n}\n\n// WGSL数学関数を生成\nconst generateWGSLMathFunction = (node: Node, context: WGSLContext): string => {\n if (!node.children || node.children.length < 1) return '0.0'\n const fun = node.mathFunction\n const args = node.children.map((child) =>\n generateWGSLExpression(child, context)\n )\n const [x, y, z] = args\n // 単項関数\n if (args.length === 1) {\n if (fun === 'abs') return `abs(${x})`\n if (fun === 'acos') return `acos(${x})`\n if (fun === 'asin') return `asin(${x})`\n if (fun === 'atan') return `atan(${x})`\n if (fun === 'ceil') return `ceil(${x})`\n if (fun === 'cos') return `cos(${x})`\n if (fun === 'floor') return `floor(${x})`\n if (fun === 'fract') return `fract(${x})`\n if (fun === 'length') return `length(${x})`\n if (fun === 'normalize') return `normalize(${x})`\n if (fun === 'sin') return `sin(${x})`\n if (fun === 'sqrt') return `sqrt(${x})`\n if (fun === 'tan') return `tan(${x})`\n }\n // 二項関数\n if (args.length === 2) {\n if (fun === 'atan2') return `atan2(${x}, ${y})`\n if (fun === 'pow') return `pow(${x}, ${y})`\n if (fun === 'min') return `min(${x}, ${y})`\n if (fun === 'max') return `max(${x}, ${y})`\n if (fun === 'dot') return `dot(${x}, ${y})`\n if (fun === 'cross') return `cross(${x}, ${y})`\n if (fun === 'distance') return `distance(${x}, ${y})`\n if (fun === 'reflect') return `reflect(${x}, ${y})`\n }\n // 三項関数\n if (args.length === 3) {\n if (fun === 'mix') return `mix(${x}, ${y}, ${z})`\n if (fun === 'clamp') return `clamp(${x}, ${y}, ${z})`\n if (fun === 'smoothstep') return `smoothstep(${x}, ${y}, ${z})`\n return x\n }\n return x || '0.0'\n}\n\n// 完全なWGSLシェーダーを生成\nexport const wgsl = (\n fragmentNode: X,\n options?: {\n uniforms?: Record<string, any>\n }\n) => {\n let shader = ''\n // ユニフォーム変数の追加\n if (options?.uniforms) {\n Object.entries(options.uniforms).forEach(([name, value]) => {\n const type = inferWGSLType(value)\n shader += `@group(0) @binding(0) var<uniform> ${name}: ${type};\\n`\n })\n shader += '\\n'\n }\n shader += '@fragment\\n'\n shader += 'fn main() -> @location(0) vec4<f32> {\\n'\n const fragmentExpr = nodeToWGSL(fragmentNode)\n shader += ` return ${fragmentExpr};\\n`\n shader += '}\\n'\n\n return shader\n}\n\n// 値からWGSL型を推定\nconst inferWGSLType = (value: any): string => {\n if (is.num(value)) return 'f32'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2<f32>'\n if (len === 3) return 'vec3<f32>'\n if (len === 4) return 'vec4<f32>'\n }\n return 'f32'\n}\n","import { is } from '../utils'\n\n// WebGPUバッファー管理\nexport const createBuffer = (\n device: any,\n data: Float32Array | Uint32Array | number[],\n usage: number\n) => {\n const array = is.arr(data) ? new Float32Array(data) : data\n const buffer = device.createBuffer({\n size: array.byteLength,\n usage,\n mappedAtCreation: true,\n })\n if (array instanceof Float32Array)\n new Float32Array(buffer.getMappedRange()).set(array)\n else if (array instanceof Uint32Array)\n new Uint32Array(buffer.getMappedRange()).set(array)\n buffer.unmap()\n return buffer\n}\n\n// 頂点バッファー作成\nexport const createVertexBuffer = (device: any, data: number[]) => {\n return createBuffer(device, data, 0x20) // GPUBufferUsage.VERTEX\n}\n\n// インデックスバッファー作成\nexport const createIndexBuffer = (device: any, data: number[]) => {\n return createBuffer(device, new Uint32Array(data), 0x40) // GPUBufferUsage.INDEX\n}\n\n// ユニフォームバッファー作成\nexport const createUniformBuffer = (device: any, size: number) => {\n return device.createBuffer({\n size,\n usage: 0x40 | 0x4, // GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n mappedAtCreation: false,\n })\n}\n\n// ストレージバッファー作成\nexport const createStorageBuffer = (device: any, size: number) => {\n return device.createBuffer({\n size,\n usage: 0x80 | 0x4, // GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n mappedAtCreation: false,\n })\n}\n\n// バッファーデータ更新\nexport const updateBuffer = (\n device: any,\n buffer: any,\n data: Float32Array | Uint32Array | number[],\n offset = 0\n) => {\n const array = is.arr(data) ? new Float32Array(data) : data\n device.queue.writeBuffer(buffer, offset, array)\n}\n\n// バッファーの削除\nexport const destroyBuffer = (buffer: any) => buffer.destroy()\n\n// バッファーサイズの計算\nexport const calculateBufferSize = (data: number[]) => data.length * 4 // 4 bytes per float\n\n// アライメント調整\nexport const alignBufferSize = (size: number, alignment = 256) => {\n return Math.ceil(size / alignment) * alignment\n}\n\n// 複数のバッファーを作成\nexport const createBuffers = (\n device: any,\n bufferConfigs: Array<{\n data: number[]\n usage: number\n }>\n): any[] => {\n return bufferConfigs.map((config) => {\n return createBuffer(device, config.data, config.usage)\n })\n}\n\n// バッファー使用量の定数\nexport const BufferUsage = {\n VERTEX: 0x20,\n INDEX: 0x40,\n UNIFORM: 0x40,\n STORAGE: 0x80,\n COPY_SRC: 0x4,\n COPY_DST: 0x8,\n MAP_READ: 0x1,\n MAP_WRITE: 0x2,\n} as const\n","// WebGPUテクスチャ管理\nconst createTexture = (\n device: any,\n w = 1280,\n h = 800,\n format = 'rgba8unorm',\n usage = 0x14 // GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n) => {\n return device.createTexture({\n size: { width: w, height: h, depthOrArrayLayers: 1 },\n format,\n usage,\n })\n}\n\n// 画像からテクスチャ作成\nexport const createTextureFromImage = (\n device: any,\n image: HTMLImageElement | ImageBitmap,\n format = 'rgba8unorm'\n) => {\n const texture = createTexture(\n device,\n image.width,\n image.height,\n format,\n 0x14 | 0x4 // TEXTURE_BINDING | COPY_DST\n )\n\n device.queue.copyExternalImageToTexture(\n { source: image },\n { texture },\n { width: image.width, height: image.height }\n )\n\n return texture\n}\n\n// キューブマップテクスチャ作成\nconst createCubeTexture = (\n device: any,\n size: number,\n format = 'rgba8unorm'\n) => {\n return device.createTexture({\n size: { width: size, height: size, depthOrArrayLayers: 6 },\n format,\n usage: 0x14, // GPUTextureUsage.TEXTURE_BINDING\n dimension: '2d',\n })\n}\n\n// 深度テクスチャ作成\nexport const createDepthTexture = (\n device: any,\n w = 1280,\n h = 800,\n format = 'depth24plus'\n) => {\n return device.createTexture({\n size: { width: w, height: h, depthOrArrayLayers: 1 },\n format,\n usage: 0x10, // GPUTextureUsage.RENDER_ATTACHMENT\n })\n}\n\n// サンプラー作成\nexport const createSampler = (\n device: any,\n options: {\n magFilter?: string\n minFilter?: string\n addressModeU?: string\n addressModeV?: string\n addressModeW?: string\n } = {}\n) => {\n return device.createSampler({\n magFilter: options.magFilter || 'linear',\n minFilter: options.minFilter || 'linear',\n addressModeU: options.addressModeU || 'repeat',\n addressModeV: options.addressModeV || 'repeat',\n addressModeW: options.addressModeW || 'repeat',\n })\n}\n\n// テクスチャビュー作成\nexport const createTextureView = (\n texture: any,\n options: {\n format?: string\n dimension?: string\n aspect?: string\n baseMipLevel?: number\n mipLevelCount?: number\n baseArrayLayer?: number\n arrayLayerCount?: number\n } = {}\n) => {\n return texture.createView(options)\n}\n\n// テクスチャデータ更新\nexport const updateTexture = (\n device: any,\n texture: any,\n data: Uint8Array | Uint8ClampedArray,\n w = 1280,\n h = 800\n) => {\n device.queue.writeTexture(\n { texture },\n data,\n { bytesPerRow: w * 4 },\n { width: w, height: h }\n )\n}\n\n// テクスチャの削除\nexport const destroyTexture = (texture: any) => texture.destroy()\n\n// テクスチャ使用量の定数\nexport const TextureUsage = {\n COPY_SRC: 0x1,\n COPY_DST: 0x2,\n TEXTURE_BINDING: 0x4,\n STORAGE_BINDING: 0x8,\n RENDER_ATTACHMENT: 0x10,\n} as const\n\n// テクスチャフォーマットの定数\nexport const TextureFormat = {\n RGBA8_UNORM: 'rgba8unorm',\n RGBA8_SRGB: 'rgba8unorm-srgb',\n BGRA8_UNORM: 'bgra8unorm',\n BGRA8_SRGB: 'bgra8unorm-srgb',\n DEPTH24_PLUS: 'depth24plus',\n DEPTH32_FLOAT: 'depth32float',\n} as const\n","import { requestWebGPUDevice } from './device'\nimport { createCommandEncoder, createRenderPass, createRenderPipeline } from './pipeline'\nimport { wgsl } from '../code/wgsl'\nimport { is } from '../utils'\nimport type { X } from '../node'\nimport type { GL } from '../types'\nexport * from './buffer'\nexport * from './device'\nexport * from './pipeline'\nexport * from './texture'\n\nexport const webgpu = (gl: GL) => {\n const init = async () => {\n const { device } = await requestWebGPUDevice()\n gl.gl = { device }\n let vs = gl.vs || gl.vert || gl.vertex\n let fs = gl.fs || gl.frag || gl.fragment\n if (is.obj(vs)) vs = wgsl(fs as X)\n if (is.obj(fs)) fs = wgsl(fs as X)\n gl.gl.pipeline = createRenderPipeline(device, vs, fs)\n }\n\n const loop = () => {\n const { device, context, pipeline } = gl.gl\n const encoder = createCommandEncoder(device)\n const pass = createRenderPass(encoder, {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n })\n pass.setPipeline(pipeline)\n pass.draw(gl.count)\n pass.end()\n device.queue.submit([encoder.finish()])\n }\n\n // @TODO add uniform and attribute\n return gl({ init, loop })\n}\n","// 基本型定数\nexport const TYPES = [\n 'float',\n 'int',\n 'uint',\n 'bool',\n 'color',\n 'vec2',\n 'vec3',\n 'vec4',\n 'mat2',\n 'mat3',\n 'mat4',\n 'ivec2',\n 'ivec3',\n 'ivec4',\n 'uvec2',\n 'uvec3',\n 'uvec4',\n 'bvec2',\n 'bvec3',\n 'bvec4',\n] as const\n\nexport type NodeType = (typeof TYPES)[number]\n\n// スウィズル定数\nexport const SWIZZLES = [\n 'x',\n 'y',\n 'z',\n 'w',\n 'r',\n 'g',\n 'b',\n 'a',\n 's',\n 't',\n 'p',\n 'q',\n] as const\n\ntype AllSwizzles<T extends string> =\n | T\n | `${T}${T}`\n | `${T}${T}${T}`\n | `${T}${T}${T}${T}`\n\nexport type Swillzes =\n | AllSwizzles<'x' | 'y' | 'z' | 'w'>\n | AllSwizzles<'r' | 'g' | 'b' | 'a'>\n | AllSwizzles<'p' | 'q'>\n | AllSwizzles<'s' | 't'>\n\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 'not',\n 'assign',\n 'xor',\n 'bitAnd',\n 'bitNot',\n 'bitOr',\n 'bitXor',\n 'shiftLeft',\n 'shiftRight',\n] as const\n\nexport type Operator = (typeof OPERATORS)[number]\n\n// 数学関数定数\nexport const FUNCTIONS = [\n 'abs',\n 'acos',\n 'asin',\n 'atan',\n 'atan2',\n 'ceil',\n 'clamp',\n 'cos',\n 'cross',\n 'degrees',\n 'distance',\n 'dot',\n 'exp',\n 'exp2',\n 'faceforward',\n 'floor',\n 'fract',\n 'length',\n 'all',\n 'any',\n 'bitcast',\n 'cbrt',\n 'dFdx',\n 'dFdy',\n 'difference',\n 'equals',\n 'fwidth',\n 'inverseSqrt',\n 'lengthSq',\n 'log',\n 'log2',\n 'max',\n 'min',\n 'mix',\n 'negate',\n 'normalize',\n 'oneMinus',\n 'pow',\n 'pow2',\n 'pow3',\n 'pow4',\n 'radians',\n 'reciprocal',\n 'reflect',\n 'refract',\n 'round',\n 'saturate',\n 'sign',\n 'sin',\n 'smoothstep',\n 'sqrt',\n 'step',\n 'tan',\n 'transformDirection',\n 'trunc',\n] as const\n\nexport type MathFunction = (typeof FUNCTIONS)[number]\n\n// キャッシュ用定数\nexport const CACHE_BOOLS = [true, false] as const\nexport const CACHE_INTS = [0, 1, 2, 3, 4, 5] as const\nexport const CACHE_FLOATS = [0.0, 1.0, 0.5, 2.0] as const\n","import { OPERATORS, FUNCTIONS, SWIZZLES, NodeType } from './const'\nimport { is } from '../utils'\nimport type { Node, ProxyCallback, X } from './types'\n\nlet nodeIdCounter = 0\n\n// ノードIDを生成\nconst generateNodeId = () => `node_${++nodeIdCounter}`\n\n// ノードを作成\nexport const createNode = (\n type: NodeType,\n value?: any,\n options?: Partial<Node>\n): Node => {\n return {\n id: generateNodeId(),\n type,\n value,\n children: [],\n ...options,\n }\n}\n\nconst isSwizzleProperty = (key = '') => SWIZZLES.includes(key as any)\nconst isOperatorMethod = (key = '') => OPERATORS.includes(key as any)\nconst isMathMethod = (key = '') => FUNCTIONS.includes(key as any)\n\n// Proxyハンドラーを作成\nconst createNodeProxy = (node: Node, callback?: (info: ProxyCallback) => X) => {\n const get = (_target: unknown, key: unknown) => {\n if (!is.str(key) || key === 'then') return void 0\n\n if (key === 'id') return node.id\n if (key === 'type') return node.type\n if (key === 'value') return node.value\n if (key === 'property') return node.property\n\n // swizzle prooerty\n if (isSwizzleProperty(key))\n return createNodeProxy(\n createNode(getSwizzleType(key), undefined, {\n parent: node,\n property: key,\n }),\n callback\n )\n\n // 演算子メソッド\n if (isOperatorMethod(key))\n return (...args: any[]) => {\n return createNodeProxy(\n createNode(node.type, undefined, {\n operator: key as any,\n children: [node, ...args],\n }),\n callback\n )\n }\n\n // 数学関数メソッド\n if (isMathMethod(key))\n return (...args: any[]) => {\n return createNodeProxy(\n createNode(\n getMathReturnType(\n key,\n node.type\n ),\n undefined,\n {\n mathFunction:\n key as any,\n children: [\n node,\n ...args,\n ],\n }\n ),\n callback\n )\n }\n\n return callback?.({ path: [key], args: [] })\n }\n const apply = (_target: unknown, _thisArg: unknown, args: any) => {\n return callback?.({ path: [], args })\n }\n\n return new Proxy(() => {}, { get, apply }) as X\n}\n\n// スウィズルの戻り値型を取得\nconst getSwizzleType = (swizzle: string): NodeType => {\n if (swizzle.length === 1) return 'float'\n if (swizzle.length === 2) return 'vec2'\n if (swizzle.length === 3) return 'vec3'\n if (swizzle.length === 4) return 'vec4'\n return 'float'\n}\n\n// 数学関数の戻り値型を取得\nconst getMathReturnType = (func: string, inputType: NodeType): NodeType => {\n if (func === 'length') return 'float'\n if (func === 'normalize') return inputType\n if (func === 'toVar') return inputType\n return inputType\n}\n\n// 公開API\nexport const node = (type: NodeType, value?: any, options?: Partial<Node>) => {\n const nodeInstance = createNode(type, value, options)\n return createNodeProxy(nodeInstance)\n}\n","import { node } from './node'\nimport { is } from '../utils'\nimport type { UniformNode } from './types'\nimport type { NodeType } from './const'\n\n// ユニフォーム更新コンテキスト\ninterface UpdateContext {\n object?: any\n camera?: any\n renderer?: any\n scene?: any\n time?: number\n}\n\n// ユニフォーム値の型を推定\nconst inferUniformType = (value: any): NodeType => {\n if (is.num(value)) return 'float'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2'\n if (len === 3) return 'vec3'\n if (len === 4) return 'vec4'\n if (len === 9) return 'mat3'\n if (len === 16) return 'mat4'\n }\n if (is.obj(value) && 'r' in value && 'g' in value && 'b' in value)\n return 'color'\n return 'float'\n}\n\n// ユニフォーム変数を作成\nexport const uniform = (initialValue: any): UniformNode => {\n const type = inferUniformType(initialValue)\n let currentValue = initialValue\n let objectUpdateCallback: ((context: UpdateContext) => any) | null =\n null\n let renderUpdateCallback: ((context: UpdateContext) => any) | null =\n null\n\n const baseNode = node(type, currentValue) as any\n\n // 値を設定\n const set = (value: any) => {\n currentValue = value\n baseNode.value = value\n }\n // オブジェクト更新時のコールバックを設定\n const onObjectUpdate = (\n callback: (context: UpdateContext) => any\n ): UniformNode => {\n objectUpdateCallback = callback\n return uniformNode\n }\n // レンダー更新時のコールバックを設定\n const onRenderUpdate = (\n callback: (context: UpdateContext) => any\n ): UniformNode => {\n renderUpdateCallback = callback\n return uniformNode\n }\n // 内部更新関数(外部から呼び出される)\n const _updateFromContext = (context: UpdateContext) => {\n if (objectUpdateCallback) {\n const newValue = objectUpdateCallback(context)\n if (newValue !== undefined) set(newValue)\n }\n if (renderUpdateCallback) {\n const newValue = renderUpdateCallback(context)\n if (newValue !== undefined) set(newValue)\n }\n }\n // UniformNodeインターフェースを実装\n const uniformNode = Object.create(baseNode)\n uniformNode.set = set\n uniformNode.onObjectUpdate = onObjectUpdate\n uniformNode.onRenderUpdate = onRenderUpdate\n uniformNode._updateFromContext = _updateFromContext\n uniformNode.isUniform = true\n return uniformNode as UniformNode\n}\n\n// 組み込みユニフォーム変数\nexport const iTime = uniform(0.0)\nexport const iPrevTime = uniform(0.0)\nexport const iDeltaTime = uniform(0.0)\nexport const iResolution = uniform([1920, 1080])\nexport const iMouse = uniform([0, 0])\n\n// ユニフォーム変数の更新(レンダーループで呼び出される)\nexport const updateUniforms = (context: UpdateContext) => {\n // 時間の更新\n if (context.time !== undefined) {\n const prevTime = iTime.value || 0\n iTime.set(context.time)\n iPrevTime.set(prevTime)\n iDeltaTime.set(context.time - prevTime)\n }\n}\n","import { CACHE_BOOLS, CACHE_INTS, CACHE_FLOATS } from './const'\nimport { node } from '.'\nimport type { X } from './types'\n\nconst boolCache = new Map<boolean, X>()\nconst intCache = new Map<number, X>()\nconst floatCache = new Map<number, X>()\n\nconst initializeCache = () => {\n CACHE_BOOLS.forEach((value) => {\n boolCache.set(value, node('bool', value))\n })\n CACHE_INTS.forEach((value) => {\n intCache.set(value, node('int', value))\n })\n CACHE_FLOATS.forEach((value) => {\n floatCache.set(value, node('float', value))\n })\n}\n\nexport const getCachedBool = (x: boolean): X => {\n if (!boolCache.has(x)) initializeCache()\n return boolCache.get(x) || node('bool', x)\n}\n\n// キャッシュされたintノードを取得\nexport const getCachedInt = (x: number): X => {\n if (intCache.has(x)) return intCache.get(x)!\n return node('int', x)\n}\n\n// キャッシュされたfloatノードを取得\nexport const getCachedFloat = (x: number): X => {\n if (floatCache.has(x)) return floatCache.get(x)!\n return node('float', x)\n}\n\n// ノードの重複を検出\nexport const findDuplicateNodes = (nodes: X[]): Map<string, X[]> => {\n const duplicates = new Map<string, X[]>()\n const signatures = new Map<string, X>()\n\n nodes.forEach((nodeProxy) => {\n const signature = generateNodeSignature(nodeProxy)\n if (signatures.has(signature)) {\n if (!duplicates.has(signature))\n duplicates.set(signature, [\n signatures.get(signature)!,\n ])\n duplicates.get(signature)!.push(nodeProxy)\n } else signatures.set(signature, nodeProxy)\n })\n return duplicates\n}\n\n// ノードのシグネチャを生成\nconst generateNodeSignature = (nodeProxy: X): string => {\n const parts = [\n nodeProxy.type,\n `${nodeProxy.value}`,\n nodeProxy.property || '',\n ]\n return parts.join('|')\n}\n\n// 初期化を実行\ninitializeCache()\n","import { node } from '.'\nimport { getCachedBool, getCachedInt, getCachedFloat } from './cache'\nimport { is } from '../utils'\nimport type { X } from './types'\n\n// JavaScript値をノードに変換\nexport const convertToNode = (x: unknown): X => {\n if (is.bol(x)) return getCachedBool(x)\n if (is.num(x)) {\n if (is.int(x)) return getCachedInt(x)\n return getCachedFloat(x)\n }\n if (is.arr(x)) return convertArrayToNode(x)\n if (is.obj(x)) return convertObjectToNode(x)\n return node('float', 0)\n}\n\n// 配列をベクトル/行列ノードに変換\nconst convertArrayToNode = (array: number[]): X => {\n const len = array.length\n if (len === 2) return node('vec2', array)\n if (len === 3) return node('vec3', array)\n if (len === 4) return node('vec4', array)\n if (len === 9) return node('mat3', array)\n if (len === 16) return node('mat4', array)\n return node('float', array[0])\n}\n\n// オブジェクトをノードに変換\nconst convertObjectToNode = (obj: any): X => {\n // カラーオブジェクトの検出\n if ('r' in obj && 'g' in obj && 'b' in obj) {\n const arr = [obj.r, obj.g, obj.b]\n if ('a' in obj) arr.push(obj.a)\n return node('color', arr)\n }\n // ベクトルライクオブジェクトの検出\n if ('x' in obj && 'y' in obj) {\n const arr = [obj.x, obj.y]\n if ('z' in obj) arr.push(obj.z)\n if ('w' in obj) arr.push(obj.w)\n return convertArrayToNode(arr)\n }\n return node('float', 0)\n}\n\n// 型変換関数\nexport const float = (x: unknown): X => {\n if (is.num(x)) return getCachedFloat(x)\n return node('float', Number(x))\n}\n\nexport const int = (x: unknown): X => {\n if (is.num(x) && Number.isInteger(x)) return getCachedInt(x)\n return node('int', Math.floor(Number(x)))\n}\n\nexport const bool = (x: unknown): X => {\n return getCachedBool(Boolean(x))\n}\n\nexport const vec2 = (x?: any, y?: any): X => {\n if (is.und(x)) return node('vec2', [0, 0])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec2', x.slice(0, 2))\n if (is.obj(x) && 'x' in x && 'y' in x)\n return node('vec2', [x.x, x.y])\n return node('vec2', [Number(x), Number(x)])\n }\n return node('vec2', [Number(x), Number(y)])\n}\n\nexport const vec3 = (x?: any, y?: any, z?: any): X => {\n if (is.und(x)) return node('vec3', [0, 0, 0])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec3', x.slice(0, 3))\n if (is.obj(x) && 'x' in x && 'y' in x && 'z' in x)\n return node('vec3', [x.x, x.y, x.z])\n return node('vec3', [Number(x), Number(x), Number(x)])\n }\n if (z === undefined) {\n return node('vec3', [Number(x), Number(y), 0])\n }\n return node('vec3', [Number(x), Number(y), Number(z)])\n}\n\nexport const vec4 = (x?: any, y?: any, z?: any, w?: any): X => {\n if (is.und(x)) return node('vec4', [0, 0, 0, 1])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec4', x.slice(0, 4))\n if (is.obj(x) && 'x' in x && 'y' in x && 'z' in x && 'w' in x)\n return node('vec4', [x.x, x.y, x.z, x.w])\n return node('vec4', [Number(x), Number(x), Number(x), 1])\n }\n return node('vec4', [Number(x), Number(y), Number(z), Number(w)])\n}\n\nexport const color = (r?: any, g?: any, b?: any): X => {\n if (r === undefined) return node('color', [1, 1, 1])\n\n // 16進数カラーの処理\n if (is.str(r) && r.startsWith('#')) {\n const hex = r.slice(1)\n const num = parseInt(hex, 16)\n return node('color', [\n ((num >> 16) & 255) / 255,\n ((num >> 8) & 255) / 255,\n (num & 255) / 255,\n ])\n }\n\n // 数値カラーの処理\n if (is.num(r) && g === undefined && b === undefined) {\n return node('color', [\n ((r >> 16) & 255) / 255,\n ((r >> 8) & 255) / 255,\n (r & 255) / 255,\n ])\n }\n\n return vec3(r, g, b)\n}\n","import { node } from './node'\nimport { uniform } from './uniform'\nimport { float } from './conv'\nimport { is } from '../utils'\nimport type { X, FunctionNode, ConditionalNode } from './types'\nexport type { X, FunctionNode, ConditionalNode }\nexport * from './cache'\nexport * from './const'\nexport * from './conv'\nexport * from './node'\nexport * from './types'\nexport * from './uniform'\n\n// 関数定義\nexport const Fn = (jsFunc: Function): FunctionNode => {\n const functionNode = (...args: any[]) => {\n const inputs = args.map((arg) => {\n if (is.obj(arg) && 'type' in arg && arg.type) return arg\n return float(arg)\n })\n const result = jsFunc(inputs)\n return result || float(0)\n }\n functionNode.call = (inputs: X[]) => jsFunc(inputs)\n return functionNode as FunctionNode\n}\n\n// 条件分岐\nexport const If = (condition: X, callback: () => void): ConditionalNode => {\n callback()\n\n const conditionalNode = {\n ElseIf(\n newCondition: X,\n newCallback: () => void\n ): ConditionalNode {\n newCallback()\n return conditionalNode\n },\n Else(elseCallback: () => void) {\n elseCallback()\n },\n }\n\n return conditionalNode\n}\n\n// 組み込み変数\nexport const gl_FragCoord = node('vec4', undefined)\nexport const gl_Position = node('vec4', undefined)\nexport const iTime = uniform(0.0)\nexport const iResolution = uniform([1920, 1080])\nexport const iMouse = uniform([0, 0])\n\n// 数学関数\nexport const abs = (x: X) => x.abs()\nexport const sin = (x: X) => x.sin()\nexport const cos = (x: X) => x.cos()\nexport const tan = (x: X) => x.tan()\nexport const sqrt = (x: X) => x.sqrt()\nexport const floor = (x: X) => x.floor()\nexport const ceil = (x: X) => x.ceil()\nexport const fract = (x: X) => x.fract()\nexport const normalize = (x: X) => x.normalize()\nexport const length = (x: X) => x.length()\n\n/**\n * @TODO FIX\nexport const min = (a: X, b: X) => {\n return node('float', undefined, {\n mathFunction: 'min',\n children: [a as any, b as any],\n })\n}\n\nexport const max = (a: X, b: X) => {\n return node('float', undefined, {\n mathFunction: 'max',\n children: [a as any, b as any],\n })\n}\n\nexport const mix = (a: X, b: X, t: X) => {\n return node('float', undefined, {\n mathFunction: 'mix',\n children: [a as any, b as any, t as any],\n })\n}\n\nexport const clamp = (x: X, min: X, max: X) => {\n return node('float', undefined, {\n mathFunction: 'clamp',\n children: [x as any, min as any, max as any],\n })\n}\n*/\n"],"mappings":"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AMA,EAAG,MAAQA,EAAG,OAC5BI,EAAKJ,EAAG,IAAMA,EAAG,MAAQA,EAAG,SAC5BK,EAAG,IAAIF,CAAE,IAAGA,EAAKG,EAAKF,CAAO,GAC7BC,EAAG,IAAID,CAAE,IAAGA,EAAKE,EAAKF,CAAO,GACjCJ,EAAG,GAAG,SAAWO,EAAqBN,EAAQE,EAAIC,CAAE,CAC5D,EAkBkB,KAhBL,IAAM,CACX,GAAM,CAAE,OAAAH,EAAQ,QAAAO,EAAS,SAAAC,CAAS,EAAIT,EAAG,GACnCU,EAAUC,EAAqBV,CAAM,EACrCW,EAAOC,EAAiBH,EAAS,CAC/B,KAAMF,EAAQ,kBAAkB,EAAE,WAAW,EAC7C,WAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACrC,OAAQ,QACR,QAAS,OACjB,CAAC,EACDI,EAAK,YAAYH,CAAQ,EACzBG,EAAK,KAAKZ,EAAG,KAAK,EAClBY,EAAK,IAAI,EACTX,EAAO,MAAM,OAAO,CAACS,EAAQ,OAAO,CAAC,CAAC,CAC9C,CAGuB,CAAC,ECrCzB,IAAMI,GAAQ,CACb,QACA,MACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OACR,EAKaC,EAAW,CAChB,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACR,EAeaC,EAAY,CACjB,MACA,MACA,MACA,MACA,MACA,QACA,WACA,WACA,gBACA,cACA,mBACA,MACA,KACA,MACA,SACA,MACA,SACA,SACA,QACA,SACA,YACA,YACR,EAKaC,EAAY,CACjB,MACA,OACA,OACA,OACA,QACA,OACA,QACA,MACA,QACA,UACA,WACA,MACA,MACA,OACA,cACA,QACA,QACA,SACA,MACA,MACA,UACA,OACA,OACA,OACA,aACA,SACA,SACA,cACA,WACA,MACA,OACA,MACA,MACA,MACA,SACA,YACA,WACA,MACA,OACA,OACA,OACA,UACA,aACA,UACA,UACA,QACA,WACA,OACA,MACA,aACA,OACA,OACA,MACA,qBAC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","names":["src_exports","__export","BufferUsage","CACHE_BOOLS","CACHE_FLOATS","CACHE_INTS","FUNCTIONS","Fn","If","OPERATORS","SWIZZLES","TYPES","TextureFormat","TextureUsage","abs","activeTexture","alignBufferSize","bool","calculateBufferSize","ceil","checkWebGPUSupport","color","configureCanvasContext","convertToNode","cos","createAttribute","createBindGroup","createBindGroupLayout","createBuffer","createBuffers","createCommandEncoder","createComputePipeline","createCubeTexture","createDepthTexture","createEmptyTexture","createFragmentShader","createGL","createIbo","createIndexBuffer","createNode","createProgram","createRenderPass","createRenderPipeline","createSampler","createShaderModule","createStorageBuffer","createTexture","createTextureFromImage","createTextureView","createUniformBuffer","createVbo","createVertexBuffer","createVertexShader","src_default","deleteBuffer","deleteProgram","deleteShader","deleteTexture","destroyBuffer","destroyTexture","dig","each","ext","fig","findDuplicateNodes","float","floor","flush","fract","getAttribLocation","getCachedBool","getCachedFloat","getCachedInt","getDeviceLimits","getProgramInfo","getShaderInfo","getUniformLocation","getUniformType","gl_FragCoord","gl_Position","glsl","iDeltaTime","iMouse","iPrevTime","iResolution","iTime","int","is","isGL","isServer","isWebGPUSupported","length","node","nodeToGLSL","nodeToWGSL","normalize","replace","requestWebGPUDevice","setupDeviceErrorHandling","sig","sin","sqrt","tan","uniform","updateBuffer","updateIbo","updateTexture","updateUniforms","updateVbo","vec2","vec3","vec4","vertexStride","webgl","webgpu","wgsl","__toCommonJS","import_reev","import_refr","import_reev","createVbo","c","data","buffer","createIbo","createAttribute","stride","location","vbo","ibo","deleteBuffer","vertexStride","count","value","iboValue","updateVbo","usage","updateIbo","createProgram","c","vs","fs","pg","error","deleteProgram","getProgramInfo","getUniformType","value","isMatrix","length","getUniformLocation","name","getAttribLocation","defaultVertexShader","defaultFragmentShader","deleteShader","c","shader","createShader","source","type","error","createVertexShader","createFragmentShader","getShaderInfo","createTexture","c","img","texture","activeTexture","location","unit","deleteTexture","createEmptyTexture","w","h","format","type","createCubeTexture","imgs","face","index","is","a","isServer","isWebGPUSupported","each","obj","fn","flush","args","f","replace","x","from","to","ext","src","fig","dig","sig","value","digit","nodeToGLSL","nodeProxy","context","ctx","generateGLSLExpression","node","is","generateGLSLOperator","generateGLSLMathFunction","formatGLSLValue","value","type","num","values","v","left","right","fun","args","child","x","y","z","inferGLSLType","len","glsl","fragmentNode","options","precision","is300ES","fragment","shader","name","a_position","webgl","gl","c","vs","fs","is","glsl","createProgram","createVertexShader","createFragmentShader","key","isAttribute","deleteProgram","value","iboValue","n","loc","vbo","createVbo","ibo","createIbo","stride","vertexStride","createAttribute","isMatrix","type","getUniformType","_loadFn","image","unit","tex","createTexture","activeTexture","alt","src","_activeUnit","requestWebGPUDevice","adapter","device","checkWebGPUSupport","getDeviceLimits","setupDeviceErrorHandling","event","configureCanvasContext","canvas","format","context","defaultVertexShader","defaultFragmentShader","createRenderPipeline","device","vertexShader","fragmentShader","format","v","f","createComputePipeline","computeShader","computeModule","createShaderModule","code","createBindGroupLayout","entries","createBindGroup","layout","createRenderPass","encoder","colorAttachment","depthStencilAttachment","descriptor","createCommandEncoder","nodeToWGSL","nodeProxy","context","ctx","generateWGSLExpression","node","formatWGSLValue","generateWGSLOperator","generateWGSLMathFunction","value","type","num","is","values","v","left","right","fun","args","child","x","y","z","wgsl","fragmentNode","options","shader","name","inferWGSLType","fragmentExpr","len","createBuffer","device","data","usage","array","is","buffer","createVertexBuffer","createIndexBuffer","createUniformBuffer","size","createStorageBuffer","updateBuffer","offset","destroyBuffer","calculateBufferSize","alignBufferSize","alignment","createBuffers","bufferConfigs","config","BufferUsage","createTexture","device","w","h","format","usage","createTextureFromImage","image","texture","createDepthTexture","device","w","h","format","createSampler","options","createTextureView","texture","updateTexture","data","destroyTexture","TextureUsage","TextureFormat","webgpu","gl","device","requestWebGPUDevice","vs","fs","is","wgsl","createRenderPipeline","context","pipeline","encoder","createCommandEncoder","pass","createRenderPass","TYPES","SWIZZLES","OPERATORS","FUNCTIONS","CACHE_BOOLS","CACHE_INTS","CACHE_FLOATS","nodeIdCounter","generateNodeId","createNode","type","value","options","isSwizzleProperty","key","SWIZZLES","isOperatorMethod","OPERATORS","isMathMethod","FUNCTIONS","createNodeProxy","node","callback","get","_target","is","getSwizzleType","args","getMathReturnType","apply","_thisArg","swizzle","func","inputType","nodeInstance","inferUniformType","value","is","len","uniform","initialValue","type","currentValue","objectUpdateCallback","renderUpdateCallback","baseNode","node","set","onObjectUpdate","callback","uniformNode","onRenderUpdate","_updateFromContext","context","newValue","iTime","iPrevTime","iDeltaTime","iResolution","iMouse","updateUniforms","prevTime","boolCache","intCache","floatCache","initializeCache","CACHE_BOOLS","value","node","CACHE_INTS","CACHE_FLOATS","getCachedBool","x","getCachedInt","getCachedFloat","findDuplicateNodes","nodes","duplicates","signatures","nodeProxy","signature","generateNodeSignature","convertToNode","x","is","getCachedBool","getCachedInt","getCachedFloat","convertArrayToNode","convertObjectToNode","node","array","len","obj","arr","float","int","bool","vec2","y","vec3","z","vec4","w","color","r","g","b","hex","num","Fn","jsFunc","functionNode","args","inputs","arg","is","float","If","condition","callback","conditionalNode","newCondition","newCallback","elseCallback","gl_FragCoord","node","gl_Position","iTime","uniform","iResolution","iMouse","abs","x","sin","cos","tan","sqrt","floor","ceil","fract","normalize","length","iTime","iPrevTime","iDeltaTime","isGL","a","is","createGL","props","gl","isWebGPUSupported","webgl","webgpu","w","h","_e","x","y","top","left","key","value","iboValue","isMatrix","src_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/webgl.ts","../src/utils/helpers.ts","../src/code/glsl.ts","../src/utils/program.ts","../src/code/wgsl.ts","../src/utils/pipeline.ts","../src/webgpu.ts","../src/node/const.ts","../src/node/cache.ts","../src/node/conv.ts","../src/node/node.ts","../src/node/uniform.ts","../src/node/index.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'\nexport * from './code/glsl'\nexport * from './code/wgsl'\nexport * from './node'\nexport * from './types'\nexport * from './utils/helpers'\nexport * from './utils/pipeline'\nexport * from './utils/program'\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}\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 iPrevTime = 0,\n iDeltaTime = 0\n\nexport const createGL = (props?: Partial<GL>) => {\n const gl = event<Partial<GL>>({\n isNative: false,\n isWebGL: true,\n isLoop: true,\n isGL: true,\n size: [0, 0],\n mouse: [0, 0],\n count: 3,\n webgl: {},\n webgpu: {},\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)))\n gl.uniform = durable((k, v, i) => gl.queue(() => gl._uniform?.(k, v, i)))\n gl.texture = durable((k, v) => gl.queue(() => gl._texture?.(k, v)))\n\n gl('mount', async () => {\n if (!isWebGPUSupported()) gl.isWebGL = true\n if (gl.isWebGL) {\n await webgl(gl)\n } else await webgpu(gl)\n gl.resize()\n gl.frame(() => {\n gl.loop()\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 gl.frame.clean(gl.render)\n if (gl.isNative) return\n window.removeEventListener('resize', gl.resize)\n gl.el.removeEventListener('mousemove', gl.mousemove)\n })\n\n gl('loop', () => {\n iPrevTime = iTime\n iTime = performance.now() / 1000\n iDeltaTime = iTime - iPrevTime\n gl.uniform({ iPrevTime, iTime, iDeltaTime })\n // if (gl.fragmentNode) updateUniforms({ time: iTime }) // @TODO FIX\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 return gl(props)\n}\n\nexport default createGL\n","import { nested } from 'reev'\nimport { glsl } from './code/glsl'\nimport { is } from './utils/helpers'\nimport type { X } from './node'\nimport type { GL } from './types'\nimport { activeTexture, createAttrib, createIbo, createProgram, createTexture, createVbo } from './utils/program'\n\nexport const webgl = async (gl: GL) => {\n let vs = gl.vs || gl.vert || gl.vertex\n let fs = gl.fs || gl.frag || gl.fragment\n if (is.obj(fs)) fs = glsl(fs as X)\n if (is.obj(vs)) vs = glsl(vs as X)\n const c = gl.el.getContext('webgl2')!\n const pg = createProgram(c, vs, fs)\n\n let _activeUnit = 0\n const activeUnits = nested(() => _activeUnit++)\n\n const locations = nested((key, bool = false) => {\n if (bool) return c.getAttribLocation(pg, key)\n return c.getUniformLocation(pg, key) as WebGLUniformLocation\n })\n\n const strides = nested((_, count: number, value: number[], iboValue?: number[]) => {\n if (iboValue) count = Math.max(...iboValue) + 1\n const stride = value.length / count\n if (stride !== Math.floor(stride)) console.warn(`Vertex Stride Error: count ${count} is mismatch`)\n return Math.floor(stride)\n })\n\n const uniforms = nested((key, value: number | number[]) => {\n const loc = locations(key)\n if (is.num(value)) return (value: any) => c.uniform1f(loc, value)\n let l = value.length as 3\n if (l <= 4) return (value: any) => c[`uniform${l}fv`](loc, value)\n l = (Math.sqrt(l) << 0) as 3\n return (value: any) => c[`uniformMatrix${l}fv`](loc, false, value)\n })\n\n gl('clean', () => c.deleteProgram(pg))\n\n gl('render', () => {\n c.useProgram(pg)\n gl.queue.flush()\n c.clear(c.COLOR_BUFFER_BIT)\n c.viewport(0, 0, ...gl.size)\n c.drawArrays(c.TRIANGLES, 0, 3)\n })\n\n gl('_attribute', (key = '', value: number[], iboValue: number[]) => {\n const loc = locations(key, true)\n const vbo = createVbo(c, value)\n const ibo = createIbo(c, iboValue)\n const str = strides(key, gl.count, value, iboValue)\n createAttrib(c, str, loc, vbo, ibo)\n })\n\n gl('_uniform', (key: string, value: number | number[]) => {\n uniforms(key, value)(value)\n })\n\n const _loadFn = (image: HTMLImageElement) => {\n const loc = locations(image.alt)\n const unit = activeUnits(image.alt)\n const tex = createTexture(c, image)\n activeTexture(c, loc, unit, tex)\n }\n\n gl('_texture', (alt: string, src: string) => {\n const image = new Image()\n image.addEventListener('load', _loadFn.bind(null, image), false)\n Object.assign(image, { src, alt, crossOrigin: 'anonymous' })\n })\n\n gl.webgl = { context: c, program: pg }\n\n return gl\n}\n","export const is = {\n arr: Array.isArray,\n bol: (a: unknown): a is boolean => typeof a === 'boolean',\n str: (a: unknown): a is string => typeof a === 'string',\n num: (a: unknown): a is number => typeof a === 'number',\n int: (a: unknown): a is number => Number.isInteger(a),\n fun: (a: unknown): a is Function => typeof a === 'function',\n und: (a: unknown): a is undefined => typeof a === 'undefined',\n nul: (a: unknown): a is null => a === null,\n set: (a: unknown): a is Set<unknown> => a instanceof Set,\n map: (a: unknown): a is Map<unknown, unknown> => a instanceof Map,\n obj: (a: unknown): a is object => !!a && a.constructor.name === 'Object',\n nan: (a: unknown): a is number => typeof a === 'number' && Number.isNaN(a),\n}\n\n/**\n * each\n */\ntype EachFn<Value, Key, This> = (this: This, value: Value, key: Key) => void\ntype Eachable<Value = any, Key = any, This = any> = {\n forEach(cb: EachFn<Value, Key, This>, ctx?: This): void\n}\n\nexport const each = <Value, Key, This>(obj: Eachable<Value, Key, This>, fn: EachFn<Value, Key, This>) => obj.forEach(fn)\n\nexport const flush = <Value extends Function, Key, This>(obj: Eachable<Value, Key, This>, ...args: any[]) => {\n each(obj, (f) => f(...args))\n}\n\n/**\n * other\n */\nexport const replace = (x = '', from = '_', to = '/') => x.split(from).join(to)\nexport const ext = (src = '.pdf') => src.split('.').pop()?.toLowerCase() ?? ''\nexport const fig = (x = 0) => `${x}`.split('.')[1]?.length ?? 0\nexport const dig = (x = 0) => `${x}`.split('.')[0]?.length - (x < 0 ? 1 : 0)\nexport const sig = (value = 0, digit = -2) => {\n digit *= -1\n digit = Math.pow(10, digit)\n value *= digit\n value = Math.round(value)\n value /= digit\n return value\n}\n","import { is } from './../utils/helpers'\nimport type { Node, NodeType, X, ConversionContext } from '../node'\n\n// GLSLコード生成コンテキスト\ninterface GLSLContext extends ConversionContext {\n target: 'webgl'\n precision: 'lowp' | 'mediump' | 'highp'\n version: '100' | '300 es'\n}\n\n// ノードからGLSLコードを生成\nexport const nodeToGLSL = (nodeProxy: X, context?: Partial<GLSLContext>): string => {\n const ctx: GLSLContext = {\n target: 'webgl',\n precision: 'mediump',\n version: '300 es',\n nodes: new Map(),\n variables: new Map(),\n functions: new Map(),\n ...context,\n }\n\n return generateGLSLExpression(nodeProxy as any, ctx)\n}\n\n// GLSL式を生成\nconst generateGLSLExpression = (node: Node, context: GLSLContext): string => {\n if (!node) return '0.0'\n // 値ノード\n if (!is.und(node.value)) return formatGLSLValue(node.value, node.type)\n // プロパティアクセス(スウィズル)\n if (node.property && node.parent) {\n const parentExpr = generateGLSLExpression(node.parent, context)\n return `${parentExpr}.${node.property}`\n }\n // 演算子ノード\n if (node.operator && node.children && node.children.length >= 2) return generateGLSLOperator(node, context)\n // 数学関数ノード\n if (node.mathFunction && node.children && node.children.length >= 1)\n return generateGLSLMathFunction(node, context)\n return '0.0'\n}\n\n// GLSL値をフォーマット\nconst formatGLSLValue = (value: any, type: NodeType): string => {\n if (type === 'float') {\n const num = Number(value)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n }\n if (type === 'int') return `${Math.floor(Number(value))}`\n if (type === 'bool') return Boolean(value) ? 'true' : 'false'\n if (is.arr(value)) {\n const values = value\n .map((v) => {\n const num = Number(v)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n })\n .join(', ')\n if (type === 'vec2') return `vec2(${values})`\n if (type === 'vec3') return `vec3(${values})`\n if (type === 'vec4') return `vec4(${values})`\n if (type === 'color') return `vec3(${values})`\n }\n return '0.0'\n}\n\n// GLSL演算子を生成\nconst generateGLSLOperator = (node: Node, context: GLSLContext): string => {\n if (!node.children || node.children.length < 2) return '0.0'\n const left = generateGLSLExpression(node.children[0], context)\n const right = generateGLSLExpression(node.children[1], context)\n if (node.operator === 'add') return `(${left} + ${right})`\n if (node.operator === 'sub') return `(${left} - ${right})`\n if (node.operator === 'mul') return `(${left} * ${right})`\n if (node.operator === 'div') return `(${left} / ${right})`\n if (node.operator === 'mod') return `mod(${left}, ${right})`\n if (node.operator === 'equal') return `(${left} == ${right})`\n if (node.operator === 'notEqual') return `(${left} != ${right})`\n if (node.operator === 'lessThan') return `(${left} < ${right})`\n if (node.operator === 'lessThanEqual') return `(${left} <= ${right})`\n if (node.operator === 'greaterThan') return `(${left} > ${right})`\n if (node.operator === 'greaterThanEqual') return `(${left} >= ${right})`\n if (node.operator === 'and') return `(${left} && ${right})`\n if (node.operator === 'or') return `(${left} || ${right})`\n return `(${left} + ${right})`\n}\n\n// GLSL数学関数を生成\nconst generateGLSLMathFunction = (node: Node, context: GLSLContext): string => {\n if (!node.children || node.children.length < 1) return '0.0'\n const fun = node.mathFunction\n const args = node.children.map((child) => {\n return generateGLSLExpression(child, context)\n })\n const [x, y, z] = args\n // @TODO FIX\n // if (fun === 'toVar') return x // toVarは変数化のヒントなので、そのまま返す\n if (args.length === 1) return `${fun}(${x})`\n if (args.length === 2) return `${fun}(${x}, ${y})`\n if (args.length === 3) return `${fun}(${x}, ${y}, ${z})`\n return x || '0.0'\n}\n\n// 値からGLSL型を推定\nconst inferGLSLType = (value: unknown): string => {\n if (is.num(value)) return 'float'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2'\n if (len === 3) return 'vec3'\n if (len === 4) return 'vec4'\n }\n return 'float'\n}\n\n// 完全なGLSLシェーダーを生成\nexport const glsl = (\n fragmentNode: X,\n options?: {\n precision?: 'lowp' | 'mediump' | 'highp'\n version?: '100' | '300 es'\n uniforms?: Record<string, any>\n }\n) => {\n const precision = options?.precision || 'mediump'\n const version = options?.version || '300 es'\n const is300ES = version === '300 es'\n const fragment = nodeToGLSL(fragmentNode)\n let shader = ''\n if (is300ES) shader += '#version 300 es\\n'\n shader += `precision ${precision} float;\\n\\n`\n // ユニフォーム変数の追加\n if (options?.uniforms) {\n Object.entries(options.uniforms).forEach(([name, value]) => {\n const type = inferGLSLType(value)\n shader += `uniform ${type} ${name};\\n`\n })\n shader += '\\n'\n }\n // 出力変数\n if (is300ES) shader += 'out vec4 fragColor;\\n\\n'\n shader += 'void main() {\\n'\n shader += is300ES ? ` fragColor = ${fragment};\\n` : ` gl_FragColor = ${fragment};\\n`\n shader += '}\\n'\n\n return shader\n}\n","export const defaultVertexGLSL = /* 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`\n\nexport const defaultFragmentGLSL = /* cpp */ `\n#version 300 es\nprecision mediump float;\nuniform vec2 iResolution;\nout vec4 fragColor;\nvoid main() {\n fragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);\n}\n`\n\nexport const createShader = (c: WebGLRenderingContext, source: string, type: number) => {\n const shader = c.createShader(type)\n if (!shader) throw new Error('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 throw new Error(`Could not compile shader: ${error}`)\n}\n\nexport const createProgram = (c: WebGLRenderingContext, vs = defaultVertexGLSL, fs = defaultFragmentGLSL) => {\n const pg = c.createProgram()\n c.attachShader(pg, createShader(c, vs, c.VERTEX_SHADER))\n c.attachShader(pg, createShader(c, fs, c.FRAGMENT_SHADER))\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 throw new Error(`Could not link pg: ${error}`)\n}\n\nexport const 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\nexport const 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\nexport const createAttrib = (\n c: WebGLRenderingContext,\n stride: number,\n location: any,\n vbo: WebGLBuffer,\n ibo?: WebGLBuffer\n) => {\n c.bindBuffer(c.ARRAY_BUFFER, vbo)\n c.enableVertexAttribArray(location)\n c.vertexAttribPointer(location, stride, c.FLOAT, false, 0, 0)\n if (ibo) c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, ibo)\n}\n\nexport const createTexture = (c: WebGLRenderingContext, img: HTMLImageElement) => {\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 return texture\n}\n\nexport const activeTexture = (\n c: WebGLRenderingContext,\n location: WebGLUniformLocation | null,\n unit: number,\n texture: WebGLTexture\n) => {\n if (!location) return\n c.uniform1i(location, unit)\n c.activeTexture(c.TEXTURE0 + unit)\n c.bindTexture(c.TEXTURE_2D, texture)\n}\n","import { is } from '../utils/helpers'\nimport type { Node, NodeType, ConversionContext, X } from '../node'\n\n// WGSLコード生成コンテキスト\ninterface WGSLContext extends ConversionContext {\n target: 'webgpu'\n}\n\n// ノードからWGSLコードを生成\nexport const nodeToWGSL = (nodeProxy: X, context?: Partial<WGSLContext>): string => {\n const ctx: WGSLContext = {\n target: 'webgpu',\n nodes: new Map(),\n variables: new Map(),\n functions: new Map(),\n ...context,\n }\n return generateWGSLExpression(nodeProxy as any, ctx)\n}\n\n// WGSL式を生成\nconst generateWGSLExpression = (node: Node, context: WGSLContext): string => {\n if (!node) return '0.0'\n // 値ノード\n if (node.value !== undefined) return formatWGSLValue(node.value, node.type)\n // プロパティアクセス(スウィズル)\n if (node.property && node.parent) {\n const parentExpr = generateWGSLExpression(node.parent, context)\n return `${parentExpr}.${node.property}`\n }\n // 演算子ノード\n if (node.operator && node.children && node.children.length >= 2) return generateWGSLOperator(node, context)\n // 数学関数ノード\n if (node.mathFunction && node.children && node.children.length >= 1)\n return generateWGSLMathFunction(node, context)\n return '0.0'\n}\n\n// WGSL値をフォーマット\nconst formatWGSLValue = (value: any, type: NodeType): string => {\n if (type === 'float') {\n const num = Number(value)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n }\n if (type === 'int') return `${Math.floor(Number(value))}`\n if (type === 'bool') return Boolean(value) ? 'true' : 'false'\n if (is.arr(value)) {\n const values = value\n .map((v) => {\n const num = Number(v)\n return num % 1 === 0 ? `${num}.0` : `${num}`\n })\n .join(', ')\n if (type === 'vec2') return `vec2<f32>(${values})`\n if (type === 'vec3') return `vec3<f32>(${values})`\n if (type === 'vec4') return `vec4<f32>(${values})`\n if (type === 'color') return `vec3<f32>(${values})`\n }\n\n return '0.0'\n}\n\n// WGSL演算子を生成\nconst generateWGSLOperator = (node: Node, context: WGSLContext): string => {\n if (!node.children || node.children.length < 2) return '0.0'\n const left = generateWGSLExpression(node.children[0], context)\n const right = generateWGSLExpression(node.children[1], context)\n if (node.operator === 'add') return `(${left} + ${right})`\n if (node.operator === 'sub') return `(${left} - ${right})`\n if (node.operator === 'mul') return `(${left} * ${right})`\n if (node.operator === 'div') return `(${left} / ${right})`\n if (node.operator === 'mod') return `(${left} % ${right})`\n if (node.operator === 'equal') return `(${left} == ${right})`\n if (node.operator === 'notEqual') return `(${left} != ${right})`\n if (node.operator === 'lessThan') return `(${left} < ${right})`\n if (node.operator === 'lessThanEqual') return `(${left} <= ${right})`\n if (node.operator === 'greaterThan') return `(${left} > ${right})`\n if (node.operator === 'greaterThanEqual') return `(${left} >= ${right})`\n if (node.operator === 'and') return `(${left} && ${right})`\n if (node.operator === 'or') return `(${left} || ${right})`\n return `(${left} + ${right})`\n}\n\n// WGSL数学関数を生成\nconst generateWGSLMathFunction = (node: Node, context: WGSLContext): string => {\n if (!node.children || node.children.length < 1) return '0.0'\n const fun = node.mathFunction\n const args = node.children.map((child) => generateWGSLExpression(child, context))\n const [x, y, z] = args\n // @TODO FIX\n // if (fun === 'toVar') return x // toVarは変数化のヒントなので、そのまま返す\n if (args.length === 1) return `${fun}(${x})`\n if (args.length === 2) return `${fun}(${x}, ${y})`\n if (args.length === 3) return `${fun}(${x}, ${y}, ${z})`\n return x || '0.0'\n}\n\n// 完全なWGSLシェーダーを生成\nexport const wgsl = (\n fragmentNode: X,\n options?: {\n uniforms?: Record<string, any>\n }\n) => {\n let shader = ''\n // ユニフォーム変数の追加\n if (options?.uniforms) {\n Object.entries(options.uniforms).forEach(([name, value]) => {\n const type = inferWGSLType(value)\n shader += `@group(0) @binding(0) var<uniform> ${name}: ${type};\\n`\n })\n shader += '\\n'\n }\n shader += '@fragment\\n'\n shader += 'fn main() -> @location(0) vec4<f32> {\\n'\n const fragmentExpr = nodeToWGSL(fragmentNode)\n shader += ` return ${fragmentExpr};\\n`\n shader += '}\\n'\n\n return shader\n}\n\n// 値からWGSL型を推定\nconst inferWGSLType = (value: any): string => {\n if (is.num(value)) return 'f32'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2<f32>'\n if (len === 3) return 'vec3<f32>'\n if (len === 4) return 'vec4<f32>'\n }\n return 'f32'\n}\n","import { GPUContext, GPUDevice, GPUPipeline } from '../types'\n\nexport const initWebGPUDevice = async (el: HTMLCanvasElement) => {\n const gpu = (navigator as any).gpu\n if (!gpu) return null\n const adapter = await gpu.requestAdapter()\n if (!adapter) return null\n const device = await adapter.requestDevice()\n const context = el.getContext('webgpu') as GPUContext\n if (!context) return null\n const format = gpu.getPreferredCanvasFormat()\n context.configure({ device, format })\n return { device, context, format }\n}\n\nconst defaultVertexWGSL = `\n@vertex\nfn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {\n let x = f32(vertex_index % 2u) * 4.0 - 1.0;\n let y = f32(vertex_index / 2u) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n`\n\nconst defaultFragmentWGSL = `\n@fragment\nfn main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n return vec4f(position.xy / vec2f(1280, 800), 0.0, 1.0);\n}\n`\n\nexport const createRenderPipeline = (\n device: GPUDevice,\n format: string,\n vs = defaultVertexWGSL,\n fs = defaultFragmentWGSL,\n buffers: any[]\n) => {\n return device.createRenderPipeline({\n vertex: {\n module: device.createShaderModule({ code: vs.trim() }),\n entryPoint: 'main',\n buffers,\n },\n fragment: {\n module: device.createShaderModule({ code: fs.trim() }),\n entryPoint: 'main',\n targets: [{ format }],\n },\n layout: 'auto',\n primitive: { topology: 'triangle-list' },\n }) as GPUPipeline\n}\n\nexport const createDescriptor = (c: GPUContext) => {\n return {\n colorAttachments: [\n {\n view: c.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n }\n}\nexport const alignTo256 = (size: number) => Math.ceil(size / 256) * 256\n\nexport const createUniformBuffer = (device: GPUDevice, size: number) => {\n return device.createBuffer({ size: alignTo256(size), usage: 0x40 | 0x4 }) as Buffer\n}\n\nexport const createVertexBuffer = (device: GPUDevice, value: number[]) => {\n const array = new Float32Array(value)\n const buffer = device.createBuffer({ size: array.byteLength, usage: 0x20 | 0x4 })\n device.queue.writeBuffer(buffer, 0, array)\n return buffer as Buffer\n}\n\nexport const createBindGroup = (device: GPUDevice, pipeline: GPUPipeline, entries: any[]) => {\n const layout = pipeline.getBindGroupLayout(0)\n return device.createBindGroup({ layout, entries })\n}\n\nexport const updateBindGroup = (\n device: GPUDevice,\n pipeline: GPUPipeline,\n uniformBuffer: Buffer,\n textures: any = {},\n sampler: any = null\n) => {\n const entries = [{ binding: 0, resource: { buffer: uniformBuffer } }]\n let binding = 1\n Object.values(textures).forEach((texture: any) => {\n entries.push({ binding: binding++, resource: texture.createView() })\n })\n if (sampler && Object.keys(textures).length > 0) entries.push({ binding: binding++, resource: sampler })\n return createBindGroup(device, pipeline, entries)\n}\n\nexport const createUniform = (device: GPUDevice, buffer: any, data: Float32Array, offset = 0) => {\n device.queue.writeBuffer(buffer, offset, data)\n}\n\nexport const createDeviceTexture = (device: GPUDevice, image: HTMLImageElement) => {\n const texture = device.createTexture({\n size: { width: image.width, height: image.height },\n format: 'rgba8unorm',\n usage: 0x4 | 0x2,\n })\n device.queue.copyExternalImageToTexture(\n { source: image },\n { texture },\n { width: image.width, height: image.height }\n )\n return texture\n}\n\nexport const createSampler = (device: GPUDevice) => {\n return device.createSampler({\n magFilter: 'linear',\n minFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n })\n}\n\nexport const getDefaultVertices = () => new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1])\n","import { wgsl } from './code/wgsl'\nimport { is } from './utils/helpers'\nimport {\n createRenderPipeline,\n createDescriptor,\n // createUniformBuffer,\n // updateBindGroup,\n // createVertexBuffer,\n // createUniform,\n // createDeviceTexture,\n // createSampler,\n} from './utils/pipeline'\nimport type { X } from './node'\nimport type { GL, GPUPipeline } from './types'\n\nconst quadVertexCount = 3\n\nexport const webgpu = async (gl: GL) => {\n let vs = gl.vs || gl.vert || gl.vertex\n let fs = gl.fs || gl.frag || gl.fragment\n if (is.obj(vs)) vs = wgsl(vs as X)\n if (is.obj(fs)) fs = wgsl(fs as X)\n const c = gl.el.getContext('webgpu') as any\n const gpu = (navigator as any).gpu\n const adapter = await gpu.requestAdapter()\n const device = await adapter.requestDevice()\n const format = gpu.getPreferredCanvasFormat()\n c.configure({ device, format, alphaMode: 'opaque' })\n\n gl('clean', () => {})\n\n let pipeline: GPUPipeline\n\n gl('render', () => {\n if (!pipeline) pipeline = createRenderPipeline(device, format, vs, fs, [])\n const encoder = device.createCommandEncoder()\n const pass = encoder.beginRenderPass(createDescriptor(c))\n pass.setPipeline(pipeline)\n pass.draw(quadVertexCount, 1, 0, 0)\n pass.end()\n device.queue.submit([encoder.finish()])\n })\n\n gl('_attribute', (key = '', value: number[]) => {\n // @TODO FIX\n // vertexBuffers(key, value)\n })\n\n gl('_uniform', (key: string, value = 0) => {\n // @TODO FIX\n // if (!device || !uniformBuffer) return\n // uniforms[key] = value\n // const uniformData = new Float32Array(Object.values(uniforms))\n // createUniform(device, uniformBuffer, uniformData)\n })\n\n // const _loadFun = (image: HTMLImageElement, gl: GL) => {\n // const texture = createDeviceTexture(device, image)\n // // bindGroup = updateBindGroup(device, pipeline, uniformBuffer, textures, sampler)\n // }\n\n gl('_texture', (alt: string, src: string) => {\n // @TODO FIX\n // const image = new Image()\n // image.addEventListener('load', _loadFun.bind(null, image, gl), false)\n // Object.assign(image, { src, alt, crossOrigin: 'anonymous' })\n })\n\n return gl\n}\n","// 基本型定数\nexport const TYPES = [\n 'float',\n 'int',\n 'uint',\n 'bool',\n 'color',\n 'vec2',\n 'vec3',\n 'vec4',\n 'mat2',\n 'mat3',\n 'mat4',\n 'ivec2',\n 'ivec3',\n 'ivec4',\n 'uvec2',\n 'uvec3',\n 'uvec4',\n 'bvec2',\n 'bvec3',\n 'bvec4',\n] as const\n\nexport type NodeType = (typeof TYPES)[number]\n\n// スウィズル定数\nexport const SWIZZLES = ['x', 'y', 'z', 'w', 'r', 'g', 'b', 'a', 's', 't', 'p', 'q'] as const\n\ntype AllSwizzles<T extends string> = T | `${T}${T}` | `${T}${T}${T}` | `${T}${T}${T}${T}`\n\nexport type Swillzes =\n | AllSwizzles<'x' | 'y' | 'z' | 'w'>\n | AllSwizzles<'r' | 'g' | 'b' | 'a'>\n | AllSwizzles<'p' | 'q'>\n | AllSwizzles<'s' | 't'>\n\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 'not',\n 'assign',\n 'xor',\n 'bitAnd',\n 'bitNot',\n 'bitOr',\n 'bitXor',\n 'shiftLeft',\n 'shiftRight',\n] as const\n\nexport type Operator = (typeof OPERATORS)[number]\n\n// 数学関数定数\nexport const FUNCTIONS = [\n 'abs',\n 'acos',\n 'asin',\n 'atan',\n 'atan2',\n 'ceil',\n 'clamp',\n 'cos',\n 'cross',\n 'degrees',\n 'distance',\n 'dot',\n 'exp',\n 'exp2',\n 'faceforward',\n 'floor',\n 'fract',\n 'length',\n 'all',\n 'any',\n 'bitcast',\n 'cbrt',\n 'dFdx',\n 'dFdy',\n 'difference',\n 'equals',\n 'fwidth',\n 'inverseSqrt',\n 'lengthSq',\n 'log',\n 'log2',\n 'max',\n 'min',\n 'mix',\n 'negate',\n 'normalize',\n 'oneMinus',\n 'pow',\n 'pow2',\n 'pow3',\n 'pow4',\n 'radians',\n 'reciprocal',\n 'reflect',\n 'refract',\n 'round',\n 'saturate',\n 'sign',\n 'sin',\n 'smoothstep',\n 'sqrt',\n 'step',\n 'tan',\n 'transformDirection',\n 'trunc',\n] as const\n\nexport type MathFunction = (typeof FUNCTIONS)[number]\n\n// キャッシュ用定数\nexport const CACHE_BOOLS = [true, false] as const\nexport const CACHE_INTS = [0, 1, 2, 3, 4, 5] as const\nexport const CACHE_FLOATS = [0.0, 1.0, 0.5, 2.0] as const\n","import { CACHE_BOOLS, CACHE_INTS, CACHE_FLOATS } from './const'\nimport { node } from '.'\nimport type { X } from './types'\n\nconst boolCache = new Map<boolean, X>()\nconst intCache = new Map<number, X>()\nconst floatCache = new Map<number, X>()\n\nconst initializeCache = () => {\n CACHE_BOOLS.forEach((value) => {\n boolCache.set(value, node('bool', value))\n })\n CACHE_INTS.forEach((value) => {\n intCache.set(value, node('int', value))\n })\n CACHE_FLOATS.forEach((value) => {\n floatCache.set(value, node('float', value))\n })\n}\n\nexport const getCachedBool = (x: boolean): X => {\n if (!boolCache.has(x)) initializeCache()\n return boolCache.get(x) || node('bool', x)\n}\n\n// キャッシュされたintノードを取得\nexport const getCachedInt = (x: number): X => {\n if (intCache.has(x)) return intCache.get(x)!\n return node('int', x)\n}\n\n// キャッシュされたfloatノードを取得\nexport const getCachedFloat = (x: number): X => {\n if (floatCache.has(x)) return floatCache.get(x)!\n return node('float', x)\n}\n\n// ノードの重複を検出\nexport const findDuplicateNodes = (nodes: X[]): Map<string, X[]> => {\n const duplicates = new Map<string, X[]>()\n const signatures = new Map<string, X>()\n\n nodes.forEach((nodeProxy) => {\n const signature = generateNodeSignature(nodeProxy)\n if (signatures.has(signature)) {\n if (!duplicates.has(signature)) duplicates.set(signature, [signatures.get(signature)!])\n duplicates.get(signature)!.push(nodeProxy)\n } else signatures.set(signature, nodeProxy)\n })\n return duplicates\n}\n\n// ノードのシグネチャを生成\nconst generateNodeSignature = (nodeProxy: X): string => {\n const parts = [nodeProxy.type, `${nodeProxy.value}`, nodeProxy.property || '']\n return parts.join('|')\n}\n\n// 初期化を実行\n// initializeCache()\n","import { node } from '.'\nimport { getCachedBool, getCachedInt, getCachedFloat } from './cache'\nimport { is } from '../utils/helpers'\nimport type { X } from './types'\n\n// JavaScript値をノードに変換\nexport const convertToNode = (x: unknown): X => {\n if (is.bol(x)) return getCachedBool(x)\n if (is.num(x)) {\n if (is.int(x)) return getCachedInt(x)\n return getCachedFloat(x)\n }\n if (is.arr(x)) return convertArrayToNode(x)\n if (is.obj(x)) return convertObjectToNode(x)\n return node('float', 0)\n}\n\n// 配列をベクトル/行列ノードに変換\nconst convertArrayToNode = (array: number[]): X => {\n const len = array.length\n if (len === 2) return node('vec2', array)\n if (len === 3) return node('vec3', array)\n if (len === 4) return node('vec4', array)\n if (len === 9) return node('mat3', array)\n if (len === 16) return node('mat4', array)\n return node('float', array[0])\n}\n\n// オブジェクトをノードに変換\nconst convertObjectToNode = (obj: any): X => {\n // カラーオブジェクトの検出\n if ('r' in obj && 'g' in obj && 'b' in obj) {\n const arr = [obj.r, obj.g, obj.b]\n if ('a' in obj) arr.push(obj.a)\n return node('color', arr)\n }\n // ベクトルライクオブジェクトの検出\n if ('x' in obj && 'y' in obj) {\n const arr = [obj.x, obj.y]\n if ('z' in obj) arr.push(obj.z)\n if ('w' in obj) arr.push(obj.w)\n return convertArrayToNode(arr)\n }\n return node('float', 0)\n}\n\n// 型変換関数\nexport const float = (x: unknown): X => {\n if (is.num(x)) return getCachedFloat(x)\n return node('float', Number(x))\n}\n\nexport const int = (x: unknown): X => {\n if (is.num(x) && Number.isInteger(x)) return getCachedInt(x)\n return node('int', Math.floor(Number(x)))\n}\n\nexport const bool = (x: unknown): X => {\n return getCachedBool(Boolean(x))\n}\n\nexport const vec2 = (x?: any, y?: any): X => {\n if (is.und(x)) return node('vec2', [0, 0])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec2', x.slice(0, 2))\n if (is.obj(x) && 'x' in x && 'y' in x) return node('vec2', [x.x, x.y])\n return node('vec2', [Number(x), Number(x)])\n }\n return node('vec2', [Number(x), Number(y)])\n}\n\nexport const vec3 = (x?: any, y?: any, z?: any): X => {\n if (is.und(x)) return node('vec3', [0, 0, 0])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec3', x.slice(0, 3))\n if (is.obj(x) && 'x' in x && 'y' in x && 'z' in x) return node('vec3', [x.x, x.y, x.z])\n return node('vec3', [Number(x), Number(x), Number(x)])\n }\n if (z === undefined) {\n return node('vec3', [Number(x), Number(y), 0])\n }\n return node('vec3', [Number(x), Number(y), Number(z)])\n}\n\nexport const vec4 = (x?: any, y?: any, z?: any, w?: any): X => {\n if (is.und(x)) return node('vec4', [0, 0, 0, 1])\n if (is.und(y)) {\n if (is.arr(x)) return node('vec4', x.slice(0, 4))\n if (is.obj(x) && 'x' in x && 'y' in x && 'z' in x && 'w' in x) return node('vec4', [x.x, x.y, x.z, x.w])\n return node('vec4', [Number(x), Number(x), Number(x), 1])\n }\n return node('vec4', [Number(x), Number(y), Number(z), Number(w)])\n}\n\nexport const color = (r?: any, g?: any, b?: any): X => {\n if (r === undefined) return node('color', [1, 1, 1])\n\n // 16進数カラーの処理\n if (is.str(r) && r.startsWith('#')) {\n const hex = r.slice(1)\n const num = parseInt(hex, 16)\n return node('color', [((num >> 16) & 255) / 255, ((num >> 8) & 255) / 255, (num & 255) / 255])\n }\n\n // 数値カラーの処理\n if (is.num(r) && g === undefined && b === undefined) {\n return node('color', [((r >> 16) & 255) / 255, ((r >> 8) & 255) / 255, (r & 255) / 255])\n }\n\n return vec3(r, g, b)\n}\n","import { OPERATORS, FUNCTIONS, SWIZZLES } from './const'\nimport { is } from '../utils/helpers'\nimport type { NodeType } from './const'\nimport type { Node, ProxyCallback, X } from './types'\n\nlet nodeIdCounter = 0\n\n// ノードIDを生成\nconst generateNodeId = () => `node_${++nodeIdCounter}`\n\n// ノードを作成\nexport const createNode = (type: NodeType, value?: any, options?: Partial<Node>): Node => {\n return {\n id: generateNodeId(),\n type,\n value,\n children: [],\n ...options,\n }\n}\n\nconst isSwizzleProperty = (key = '') => SWIZZLES.includes(key as any)\nconst isOperatorMethod = (key = '') => OPERATORS.includes(key as any)\nconst isMathMethod = (key = '') => FUNCTIONS.includes(key as any)\n\n// Proxyハンドラーを作成\nconst createNodeProxy = (node: Node, callback?: (info: ProxyCallback) => X) => {\n const get = (_target: unknown, key: unknown) => {\n if (!is.str(key) || key === 'then') return void 0\n\n if (key === 'id') return node.id\n if (key === 'type') return node.type\n if (key === 'value') return node.value\n if (key === 'property') return node.property\n\n // swizzle prooerty\n if (isSwizzleProperty(key))\n return createNodeProxy(\n createNode(getSwizzleType(key), undefined, {\n parent: node,\n property: key,\n }),\n callback\n )\n\n // 演算子メソッド\n if (isOperatorMethod(key))\n return (...args: any[]) => {\n return createNodeProxy(\n createNode(node.type, undefined, {\n operator: key as any,\n children: [node, ...args],\n }),\n callback\n )\n }\n\n // 数学関数メソッド\n if (isMathMethod(key))\n return (...args: any[]) => {\n return createNodeProxy(\n createNode(getMathReturnType(key, node.type), undefined, {\n mathFunction: key as any,\n children: [node, ...args],\n }),\n callback\n )\n }\n\n return callback?.({ path: [key], args: [] })\n }\n const apply = (_target: unknown, _thisArg: unknown, args: any) => {\n return callback?.({ path: [], args })\n }\n\n return new Proxy(() => {}, { get, apply }) as X\n}\n\n// スウィズルの戻り値型を取得\nconst getSwizzleType = (swizzle: string): NodeType => {\n if (swizzle.length === 1) return 'float'\n if (swizzle.length === 2) return 'vec2'\n if (swizzle.length === 3) return 'vec3'\n if (swizzle.length === 4) return 'vec4'\n return 'float'\n}\n\n// 数学関数の戻り値型を取得\nconst getMathReturnType = (func: string, inputType: NodeType): NodeType => {\n if (func === 'length') return 'float'\n if (func === 'normalize') return inputType\n if (func === 'toVar') return inputType\n return inputType\n}\n\n// 公開API\nexport const node = (type: NodeType, value?: any, options?: Partial<Node>) => {\n const nodeInstance = createNode(type, value, options)\n return createNodeProxy(nodeInstance)\n}\n","import { node } from './node'\nimport { is } from '../utils/helpers'\nimport type { UniformNode } from './types'\nimport type { NodeType } from './const'\n\n// ユニフォーム更新コンテキスト\ninterface UpdateContext {\n object?: any\n camera?: any\n renderer?: any\n scene?: any\n time?: number\n}\n\n// ユニフォーム値の型を推定\nconst inferUniformType = (value: any): NodeType => {\n if (is.num(value)) return 'float'\n if (is.bol(value)) return 'bool'\n if (is.arr(value)) {\n const len = value.length\n if (len === 2) return 'vec2'\n if (len === 3) return 'vec3'\n if (len === 4) return 'vec4'\n if (len === 9) return 'mat3'\n if (len === 16) return 'mat4'\n }\n if (is.obj(value) && 'r' in value && 'g' in value && 'b' in value) return 'color'\n return 'float'\n}\n\n// ユニフォーム変数を作成\nexport const uniform = (initialValue: any): UniformNode => {\n const type = inferUniformType(initialValue)\n let currentValue = initialValue\n let objectUpdateCallback: ((context: UpdateContext) => any) | null = null\n let renderUpdateCallback: ((context: UpdateContext) => any) | null = null\n\n const baseNode = node(type, currentValue) as any\n\n // 値を設定\n const set = (value: any) => {\n currentValue = value\n baseNode.value = value\n }\n // オブジェクト更新時のコールバックを設定\n const onObjectUpdate = (callback: (context: UpdateContext) => any): UniformNode => {\n objectUpdateCallback = callback\n return uniformNode\n }\n // レンダー更新時のコールバックを設定\n const onRenderUpdate = (callback: (context: UpdateContext) => any): UniformNode => {\n renderUpdateCallback = callback\n return uniformNode\n }\n // 内部更新関数(外部から呼び出される)\n const _updateFromContext = (context: UpdateContext) => {\n if (objectUpdateCallback) {\n const newValue = objectUpdateCallback(context)\n if (newValue !== undefined) set(newValue)\n }\n if (renderUpdateCallback) {\n const newValue = renderUpdateCallback(context)\n if (newValue !== undefined) set(newValue)\n }\n }\n // UniformNodeインターフェースを実装\n const uniformNode = Object.create(baseNode)\n uniformNode.set = set\n uniformNode.onObjectUpdate = onObjectUpdate\n uniformNode.onRenderUpdate = onRenderUpdate\n uniformNode._updateFromContext = _updateFromContext\n uniformNode.isUniform = true\n return uniformNode as UniformNode\n}\n\n// 組み込みユニフォーム変数\nexport const iTime = uniform(0.0)\nexport const iPrevTime = uniform(0.0)\nexport const iDeltaTime = uniform(0.0)\nexport const iResolution = uniform([1920, 1080])\nexport const iMouse = uniform([0, 0])\n\n// ユニフォーム変数の更新(レンダーループで呼び出される)\nexport const updateUniforms = (context: UpdateContext) => {\n // 時間の更新\n if (context.time !== undefined) {\n const prevTime = iTime.value || 0\n iTime.set(context.time)\n iPrevTime.set(prevTime)\n iDeltaTime.set(context.time - prevTime)\n }\n}\n","import { float } from './conv'\nimport { node } from './node'\nimport { uniform } from './uniform'\nimport { is } from '../utils/helpers'\nimport type { X, FunctionNode, ConditionalNode } from './types'\nexport type { X, FunctionNode, ConditionalNode }\nexport * from './cache'\nexport * from './const'\nexport * from './conv'\nexport * from './node'\nexport * from './types'\nexport * from './uniform'\n\n// 関数定義\nexport const Fn = (jsFunc: Function): FunctionNode => {\n const functionNode = (...args: any[]) => {\n const inputs = args.map((arg) => {\n if (is.obj(arg) && 'type' in arg && arg.type) return arg\n return float(arg)\n })\n const result = jsFunc(inputs)\n return result || float(0)\n }\n functionNode.call = (inputs: X[]) => jsFunc(inputs)\n return functionNode as FunctionNode\n}\n\n// 条件分岐\nexport const If = (condition: X, callback: () => void): ConditionalNode => {\n callback()\n\n const conditionalNode = {\n ElseIf(newCondition: X, newCallback: () => void): ConditionalNode {\n newCallback()\n return conditionalNode\n },\n Else(elseCallback: () => void) {\n elseCallback()\n },\n }\n\n return conditionalNode\n}\n\n// 組み込み変数\nexport const gl_FragCoord = node('vec4', undefined)\nexport const gl_Position = node('vec4', undefined)\nexport const iTime = uniform(0.0)\nexport const iResolution = uniform([1920, 1080])\nexport const iMouse = uniform([0, 0])\n\n// 数学関数\nexport const abs = (x: X) => x.abs()\nexport const sin = (x: X) => x.sin()\nexport const cos = (x: X) => x.cos()\nexport const tan = (x: X) => x.tan()\nexport const sqrt = (x: X) => x.sqrt()\nexport const floor = (x: X) => x.floor()\nexport const ceil = (x: X) => x.ceil()\nexport const fract = (x: X) => x.fract()\nexport const normalize = (x: X) => x.normalize()\nexport const length = (x: X) => x.length()\n\n/**\n * @TODO FIX\nexport const min = (a: X, b: X) => {\n return node('float', undefined, {\n mathFunction: 'min',\n children: [a as any, b as any],\n })\n}\n\nexport const max = (a: X, b: X) => {\n return node('float', undefined, {\n mathFunction: 'max',\n children: [a as any, b as any],\n })\n}\n\nexport const mix = (a: X, b: X, t: X) => {\n return node('float', undefined, {\n mathFunction: 'mix',\n children: [a as any, b as any, t as any],\n })\n}\n\nexport const clamp = (x: X, min: X, max: X) => {\n return node('float', undefined, {\n mathFunction: 'clamp',\n children: [x as any, min as any, max as any],\n })\n}\n*/\n"],"mappings":"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","names":["src_exports","__export","CACHE_BOOLS","CACHE_FLOATS","CACHE_INTS","FUNCTIONS","Fn","If","OPERATORS","SWIZZLES","TYPES","abs","activeTexture","alignTo256","bool","ceil","color","convertToNode","cos","createAttrib","createBindGroup","createDescriptor","createDeviceTexture","createGL","createIbo","createNode","createProgram","createRenderPipeline","createSampler","createShader","createTexture","createUniform","createUniformBuffer","createVbo","createVertexBuffer","src_default","defaultFragmentGLSL","defaultVertexGLSL","dig","each","ext","fig","findDuplicateNodes","float","floor","flush","fract","getCachedBool","getCachedFloat","getCachedInt","getDefaultVertices","gl_FragCoord","gl_Position","glsl","iDeltaTime","iMouse","iPrevTime","iResolution","iTime","initWebGPUDevice","int","is","isGL","isServer","isWebGPUSupported","length","node","nodeToGLSL","nodeToWGSL","normalize","replace","sig","sin","sqrt","tan","uniform","updateBindGroup","updateUniforms","vec2","vec3","vec4","webgl","webgpu","wgsl","__toCommonJS","import_reev","import_refr","import_reev","is","a","each","obj","fn","flush","args","f","replace","x","from","to","ext","src","fig","dig","sig","value","digit","nodeToGLSL","nodeProxy","context","ctx","generateGLSLExpression","node","is","generateGLSLOperator","generateGLSLMathFunction","formatGLSLValue","value","type","num","values","v","left","right","fun","args","child","x","y","z","inferGLSLType","len","glsl","fragmentNode","options","precision","is300ES","fragment","shader","name","defaultVertexGLSL","defaultFragmentGLSL","createShader","c","source","type","shader","error","createProgram","vs","fs","pg","createVbo","data","buffer","createIbo","createAttrib","stride","location","vbo","ibo","createTexture","img","texture","activeTexture","unit","webgl","gl","vs","fs","is","glsl","c","pg","createProgram","_activeUnit","activeUnits","locations","key","bool","strides","_","count","value","iboValue","stride","uniforms","loc","l","vbo","createVbo","ibo","createIbo","str","createAttrib","_loadFn","image","unit","tex","createTexture","activeTexture","alt","src","nodeToWGSL","nodeProxy","context","ctx","generateWGSLExpression","node","formatWGSLValue","generateWGSLOperator","generateWGSLMathFunction","value","type","num","is","values","v","left","right","fun","args","child","x","y","z","wgsl","fragmentNode","options","shader","name","inferWGSLType","fragmentExpr","len","initWebGPUDevice","el","gpu","adapter","device","context","format","defaultVertexWGSL","defaultFragmentWGSL","createRenderPipeline","vs","fs","buffers","createDescriptor","c","alignTo256","size","createUniformBuffer","createVertexBuffer","value","array","buffer","createBindGroup","pipeline","entries","layout","updateBindGroup","uniformBuffer","textures","sampler","binding","texture","createUniform","data","offset","createDeviceTexture","image","createSampler","getDefaultVertices","quadVertexCount","webgpu","gl","vs","fs","is","wgsl","c","gpu","device","format","pipeline","createRenderPipeline","encoder","pass","createDescriptor","key","value","alt","src","TYPES","SWIZZLES","OPERATORS","FUNCTIONS","CACHE_BOOLS","CACHE_INTS","CACHE_FLOATS","boolCache","intCache","floatCache","initializeCache","CACHE_BOOLS","value","node","CACHE_INTS","CACHE_FLOATS","getCachedBool","x","getCachedInt","getCachedFloat","findDuplicateNodes","nodes","duplicates","signatures","nodeProxy","signature","generateNodeSignature","convertToNode","x","is","getCachedBool","getCachedInt","getCachedFloat","convertArrayToNode","convertObjectToNode","node","array","len","obj","arr","float","int","bool","vec2","y","vec3","z","vec4","w","color","r","g","b","hex","num","nodeIdCounter","generateNodeId","createNode","type","value","options","isSwizzleProperty","key","SWIZZLES","isOperatorMethod","OPERATORS","isMathMethod","FUNCTIONS","createNodeProxy","node","callback","get","_target","is","getSwizzleType","args","getMathReturnType","apply","_thisArg","swizzle","func","inputType","nodeInstance","inferUniformType","value","is","len","uniform","initialValue","type","currentValue","objectUpdateCallback","renderUpdateCallback","baseNode","node","set","onObjectUpdate","callback","uniformNode","onRenderUpdate","_updateFromContext","context","newValue","iTime","iPrevTime","iDeltaTime","iResolution","iMouse","updateUniforms","prevTime","Fn","jsFunc","functionNode","args","inputs","arg","is","float","If","condition","callback","conditionalNode","newCondition","newCallback","elseCallback","gl_FragCoord","node","gl_Position","iTime","uniform","iResolution","iMouse","abs","x","sin","cos","tan","sqrt","floor","ceil","fract","normalize","length","isGL","a","is","isServer","isWebGPUSupported","iTime","iPrevTime","iDeltaTime","createGL","props","gl","k","v","i","webgl","webgpu","w","h","_e","x","y","top","left","src_default"]}
|