typegpu 0.8.0 → 0.8.2
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/{chunk-6WF2EZIT.js → chunk-6U5HPHCJ.js} +2 -2
- package/{chunk-B254XDWG.js → chunk-CGQB3SER.js} +2 -2
- package/{chunk-XEUNEHAZ.js → chunk-CRZWTZM2.js} +6 -6
- package/chunk-CRZWTZM2.js.map +1 -0
- package/chunk-ECR2EGZX.js +7 -0
- package/chunk-ECR2EGZX.js.map +1 -0
- package/chunk-PWBIFP67.js +2 -0
- package/chunk-PWBIFP67.js.map +1 -0
- package/common/index.d.ts +1 -1
- package/common/index.js +1 -1
- package/data/index.d.ts +3 -3
- package/data/index.js +1 -1
- package/index.d.ts +2 -2
- package/index.js +40 -40
- package/index.js.map +1 -1
- package/{matrix-C6mMH7pB.d.ts → matrix-DIfOiRyz.d.ts} +1 -1
- package/package.json +5 -13
- package/std/index.d.ts +2 -2
- package/std/index.js +1 -1
- package/std/index.js.map +1 -1
- package/{tgpuConstant-DzGgwe0I.d.ts → tgpuConstant-BTQFNlQH.d.ts} +13 -8
- package/chunk-A5APHF7K.cjs +0 -10
- package/chunk-A5APHF7K.cjs.map +0 -1
- package/chunk-LL6NPRFE.cjs +0 -7
- package/chunk-LL6NPRFE.cjs.map +0 -1
- package/chunk-M2P3FJT7.cjs +0 -2
- package/chunk-M2P3FJT7.cjs.map +0 -1
- package/chunk-PO6SIMTQ.js +0 -2
- package/chunk-PO6SIMTQ.js.map +0 -1
- package/chunk-T2GBOTUH.js +0 -7
- package/chunk-T2GBOTUH.js.map +0 -1
- package/chunk-TRAG63HY.cjs +0 -3
- package/chunk-TRAG63HY.cjs.map +0 -1
- package/chunk-U3CXOCRG.cjs +0 -2
- package/chunk-U3CXOCRG.cjs.map +0 -1
- package/chunk-XEUNEHAZ.js.map +0 -1
- package/common/index.cjs +0 -7
- package/common/index.cjs.map +0 -1
- package/common/index.d.cts +0 -24
- package/data/index.cjs +0 -2
- package/data/index.cjs.map +0 -1
- package/data/index.d.cts +0 -402
- package/index.cjs +0 -192
- package/index.cjs.map +0 -1
- package/index.d.cts +0 -369
- package/matrix-Cn2jQILV.d.cts +0 -122
- package/std/index.cjs +0 -2
- package/std/index.cjs.map +0 -1
- package/std/index.d.cts +0 -639
- package/tgpuConstant-DzGgwe0I.d.cts +0 -5196
- /package/{chunk-6WF2EZIT.js.map → chunk-6U5HPHCJ.js.map} +0 -0
- /package/{chunk-B254XDWG.js.map → chunk-CGQB3SER.js.map} +0 -0
package/chunk-T2GBOTUH.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/matrix.ts","../src/data/sampler.ts","../src/data/texture.ts","../src/data/atomic.ts","../src/data/numberOps.ts","../src/data/vectorOps.ts","../src/std/operators.ts","../src/std/numeric.ts","../src/tgsl/wgslGenerator.ts","../src/tgsl/generationHelpers.ts"],"sourcesContent":["import { createDualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { $repr } from '../shared/symbols.ts';\nimport { $internal, $resolve } from '../shared/symbols.ts';\nimport type { SelfResolvable } from '../types.ts';\nimport type { AnyData } from './dataTypes.ts';\nimport { type ResolvedSnippet, snip } from './snippet.ts';\nimport { vec2f, vec3f, vec4f } from './vector.ts';\nimport type {\n m2x2f,\n m3x3f,\n m4x4f,\n mat2x2,\n Mat2x2f,\n mat3x3,\n Mat3x3f,\n mat4x4,\n Mat4x4f,\n NumberArrayView,\n v2f,\n v3f,\n v4f,\n VecKind,\n} from './wgslTypes.ts';\n\n// --------------\n// Implementation\n// --------------\n\ntype vBase = {\n kind: VecKind;\n length: number;\n [n: number]: number;\n};\n\nexport abstract class MatBase<TColumn> implements NumberArrayView {\n abstract readonly [$internal]: true;\n abstract readonly columns: readonly TColumn[];\n\n abstract readonly length: number;\n abstract [Symbol.iterator](): Iterator<number>;\n [n: number]: number;\n}\n\ninterface MatSchemaOptions<TType extends string, ColumnType> {\n type: TType;\n rows: 2 | 3 | 4;\n columns: 2 | 3 | 4;\n MatImpl: new (...args: number[]) => MatBase<ColumnType>;\n}\n\ntype MatConstructor<\n ValueType extends MatBase<ColumnType>,\n ColumnType extends vBase,\n> = (...args: (number | ColumnType)[]) => ValueType;\n\nfunction createMatSchema<\n TType extends string,\n ValueType extends MatBase<ColumnType>,\n ColumnType extends vBase,\n>(\n options: MatSchemaOptions<TType, ColumnType>,\n): { type: TType; [$repr]: ValueType } & MatConstructor<ValueType, ColumnType> {\n const construct = createDualImpl(\n // CPU implementation\n (...args: (number | ColumnType)[]): ValueType => {\n const elements: number[] = [];\n\n for (const arg of args) {\n if (typeof arg === 'number') {\n elements.push(arg);\n } else {\n for (let i = 0; i < arg.length; ++i) {\n elements.push(arg[i] as number);\n }\n }\n }\n\n if (\n elements.length !== 0 &&\n elements.length !== options.columns * options.rows\n ) {\n throw new Error(\n `'${options.type}' constructor called with invalid number of arguments.`,\n );\n }\n\n for (let i = elements.length; i < options.columns * options.rows; ++i) {\n elements.push(0);\n }\n\n return new options.MatImpl(...elements) as ValueType;\n },\n // CODEGEN implementation\n (...args) =>\n snip(stitch`${options.type}(${args})`, schema as unknown as AnyData),\n options.type,\n );\n\n const schema = Object.assign(construct, {\n type: options.type,\n identity: identityFunctions[options.columns],\n translation: options.columns === 4 ? translation4 : undefined,\n scaling: options.columns === 4 ? scaling4 : undefined,\n rotationX: options.columns === 4 ? rotationX4 : undefined,\n rotationY: options.columns === 4 ? rotationY4 : undefined,\n rotationZ: options.columns === 4 ? rotationZ4 : undefined,\n }) as unknown as {\n type: TType;\n [$repr]: ValueType;\n } & MatConstructor<ValueType, ColumnType>;\n\n return schema;\n}\n\nabstract class mat2x2Impl<TColumn extends v2f> extends MatBase<TColumn>\n implements mat2x2<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn];\n public readonly length = 4;\n public abstract readonly kind: string;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(elements[0] as number, elements[1] as number),\n this.makeColumn(elements[2] as number, elements[3] as number),\n ];\n }\n\n abstract makeColumn(e0: number, e1: number): TColumn;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[1].x;\n }\n\n get 3() {\n return this.columns[1].y;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[1].x = value;\n }\n\n set 3(value: number) {\n this.columns[1].y = value;\n }\n\n *[Symbol.iterator]() {\n yield this[0];\n yield this[1];\n yield this[2];\n yield this[3];\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${\n Array.from({ length: this.length })\n .map((_, i) => this[i])\n .join(', ')\n })`,\n mat2x2f,\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat2x2fImpl extends mat2x2Impl<v2f> {\n public readonly kind = 'mat2x2f';\n\n makeColumn(e0: number, e1: number): v2f {\n return vec2f(e0, e1);\n }\n}\n\nabstract class mat3x3Impl<TColumn extends v3f> extends MatBase<TColumn>\n implements mat3x3<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn, TColumn];\n public readonly length = 12;\n public abstract readonly kind: string;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n ),\n this.makeColumn(\n elements[3] as number,\n elements[4] as number,\n elements[5] as number,\n ),\n this.makeColumn(\n elements[6] as number,\n elements[7] as number,\n elements[8] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number): TColumn;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[0].z;\n }\n\n get 3() {\n return 0;\n }\n\n get 4() {\n return this.columns[1].x;\n }\n\n get 5() {\n return this.columns[1].y;\n }\n\n get 6() {\n return this.columns[1].z;\n }\n\n get 7() {\n return 0;\n }\n\n get 8() {\n return this.columns[2].x;\n }\n\n get 9() {\n return this.columns[2].y;\n }\n\n get 10() {\n return this.columns[2].z;\n }\n\n get 11() {\n return 0;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[0].z = value;\n }\n\n set 3(_: number) {}\n\n set 4(value: number) {\n this.columns[1].x = value;\n }\n\n set 5(value: number) {\n this.columns[1].y = value;\n }\n\n set 6(value: number) {\n this.columns[1].z = value;\n }\n\n set 7(_: number) {}\n\n set 8(value: number) {\n this.columns[2].x = value;\n }\n\n set 9(value: number) {\n this.columns[2].y = value;\n }\n\n set 10(value: number) {\n this.columns[2].z = value;\n }\n\n set 11(_: number) {}\n\n *[Symbol.iterator]() {\n for (let i = 0; i < 12; i++) {\n yield this[i] as number;\n }\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${this[0]}, ${this[1]}, ${this[2]}, ${this[4]}, ${\n this[5]\n }, ${this[6]}, ${this[8]}, ${this[9]}, ${this[10]})`,\n mat3x3f,\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat3x3fImpl extends mat3x3Impl<v3f> {\n public readonly kind = 'mat3x3f';\n makeColumn(x: number, y: number, z: number): v3f {\n return vec3f(x, y, z);\n }\n}\n\nabstract class mat4x4Impl<TColumn extends v4f> extends MatBase<TColumn>\n implements mat4x4<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn, TColumn, TColumn];\n public abstract readonly kind: string;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n elements[3] as number,\n ),\n this.makeColumn(\n elements[4] as number,\n elements[5] as number,\n elements[6] as number,\n elements[7] as number,\n ),\n this.makeColumn(\n elements[8] as number,\n elements[9] as number,\n elements[10] as number,\n elements[11] as number,\n ),\n this.makeColumn(\n elements[12] as number,\n elements[13] as number,\n elements[14] as number,\n elements[15] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number, w: number): TColumn;\n\n public readonly length = 16;\n [n: number]: number;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[0].z;\n }\n\n get 3() {\n return this.columns[0].w;\n }\n\n get 4() {\n return this.columns[1].x;\n }\n\n get 5() {\n return this.columns[1].y;\n }\n\n get 6() {\n return this.columns[1].z;\n }\n\n get 7() {\n return this.columns[1].w;\n }\n\n get 8() {\n return this.columns[2].x;\n }\n\n get 9() {\n return this.columns[2].y;\n }\n\n get 10() {\n return this.columns[2].z;\n }\n\n get 11() {\n return this.columns[2].w;\n }\n\n get 12() {\n return this.columns[3].x;\n }\n\n get 13() {\n return this.columns[3].y;\n }\n\n get 14() {\n return this.columns[3].z;\n }\n\n get 15() {\n return this.columns[3].w;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[0].z = value;\n }\n\n set 3(value: number) {\n this.columns[0].w = value;\n }\n\n set 4(value: number) {\n this.columns[1].x = value;\n }\n\n set 5(value: number) {\n this.columns[1].y = value;\n }\n\n set 6(value: number) {\n this.columns[1].z = value;\n }\n\n set 7(value: number) {\n this.columns[1].w = value;\n }\n\n set 8(value: number) {\n this.columns[2].x = value;\n }\n\n set 9(value: number) {\n this.columns[2].y = value;\n }\n\n set 10(value: number) {\n this.columns[2].z = value;\n }\n\n set 11(value: number) {\n this.columns[2].w = value;\n }\n\n set 12(value: number) {\n this.columns[3].x = value;\n }\n\n set 13(value: number) {\n this.columns[3].y = value;\n }\n\n set 14(value: number) {\n this.columns[3].z = value;\n }\n\n set 15(value: number) {\n this.columns[3].w = value;\n }\n\n *[Symbol.iterator]() {\n for (let i = 0; i < 16; i++) {\n yield this[i] as number;\n }\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${\n Array.from({ length: this.length })\n .map((_, i) => this[i])\n .join(', ')\n })`,\n mat4x4f,\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat4x4fImpl extends mat4x4Impl<v4f> {\n public readonly kind = 'mat4x4f';\n\n makeColumn(x: number, y: number, z: number, w: number): v4f {\n return vec4f(x, y, z, w);\n }\n}\n\n// ----------\n// Matrix ops\n// ----------\n\n/**\n * Returns a 2-by-2 identity matrix.\n * @returns {m2x2f} The result matrix.\n */\nexport const identity2 = createDualImpl(\n // CPU implementation\n () => mat2x2f(1, 0, 0, 1),\n // CODEGEN implementation\n () => snip('mat2x2f(1, 0, 0, 1)', mat2x2f),\n 'identity2',\n);\n\n/**\n * Returns a 3-by-3 identity matrix.\n * @returns {m3x3f} The result matrix.\n */\nexport const identity3 = createDualImpl(\n // CPU implementation\n () => mat3x3f(1, 0, 0, 0, 1, 0, 0, 0, 1),\n // CODEGEN implementation\n () => snip('mat3x3f(1, 0, 0, 0, 1, 0, 0, 0, 1)', mat3x3f),\n 'identity3',\n);\n\n/**\n * Returns a 4-by-4 identity matrix.\n * @returns {m4x4f} The result matrix.\n */\nexport const identity4 = createDualImpl(\n // CPU implementation\n () => mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n // CODEGEN implementation\n () =>\n snip('mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)', mat4x4f),\n 'identity4',\n);\n\nconst identityFunctions = {\n 2: identity2,\n 3: identity3,\n 4: identity4,\n};\n\n/**\n * Creates a 4-by-4 matrix which translates by the given vector v.\n * @param {v3f} vector - The vector by which to translate.\n * @returns {m4x4f} The translation matrix.\n */\nexport const translation4 = createDualImpl(\n // CPU implementation\n (vector: v3f) =>\n // deno-fmt-ignore\n mat4x4f(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n vector.x, vector.y, vector.z, 1,\n ),\n // CODEGEN implementation\n (v) =>\n snip(\n stitch`mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ${v}.x, ${v}.y, ${v}.z, 1)`,\n mat4x4f,\n ),\n 'translation4',\n);\n\n/**\n * Creates a 4-by-4 matrix which scales in each dimension by an amount given by the corresponding entry in the given vector.\n * @param {v3f} vector - A vector of three entries specifying the factor by which to scale in each dimension.\n * @returns {m4x4f} The scaling matrix.\n */\nexport const scaling4 = createDualImpl(\n // CPU implementation\n (vector: v3f) =>\n // deno-fmt-ignore\n mat4x4f(\n vector.x, 0, 0, 0,\n 0, vector.y, 0, 0,\n 0, 0, vector.z, 0,\n 0, 0, 0, 1,\n ),\n // CODEGEN implementation\n (v) =>\n snip(\n stitch`mat4x4f(${v}.x, 0, 0, 0, 0, ${v}.y, 0, 0, 0, 0, ${v}.z, 0, 0, 0, 0, 1)`,\n mat4x4f,\n ),\n 'scaling4',\n);\n\n/**\n * Creates a 4-by-4 matrix which rotates around the x-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationX4 = createDualImpl(\n // CPU implementation\n (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n 1, 0, 0, 0,\n 0, Math.cos(a), Math.sin(a), 0,\n 0, -Math.sin(a), Math.cos(a), 0,\n 0, 0, 0, 1,\n ),\n // CODEGEN implementation\n (a) =>\n snip(\n stitch`mat4x4f(1, 0, 0, 0, 0, cos(${a}), sin(${a}), 0, 0, -sin(${a}), cos(${a}), 0, 0, 0, 0, 1)`,\n mat4x4f,\n ),\n 'rotationX4',\n);\n\n/**\n * Creates a 4-by-4 matrix which rotates around the y-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationY4 = createDualImpl(\n // CPU implementation\n (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n Math.cos(a), 0, -Math.sin(a), 0,\n 0, 1, 0, 0,\n Math.sin(a), 0, Math.cos(a), 0,\n 0, 0, 0, 1,\n ),\n // CODEGEN implementation\n (a) =>\n snip(\n stitch`mat4x4f(cos(${a}), 0, -sin(${a}), 0, 0, 1, 0, 0, sin(${a}), 0, cos(${a}), 0, 0, 0, 0, 1)`,\n mat4x4f,\n ),\n 'rotationY4',\n);\n\n/**\n * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationZ4 = createDualImpl(\n // CPU implementation\n (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n Math.cos(a), Math.sin(a), 0, 0,\n -Math.sin(a), Math.cos(a), 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n ),\n // CODEGEN implementation\n (a) =>\n snip(\n stitch`mat4x4f(cos(${a}), sin(${a}), 0, 0, -sin(${a}), cos(${a}), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)`,\n mat4x4f,\n ),\n 'rotationZ4',\n);\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Schema representing mat2x2f - a matrix with 2 rows and 2 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero2x2 = mat2x2f(); // filled with zeros\n *\n * @example\n * const mat = mat2x2f(0, 1, 2, 3);\n * mat.columns[0] // vec2f(0, 1)\n * mat.columns[1] // vec2f(2, 3)\n *\n * @example\n * const mat = mat2x2f(\n * vec2f(0, 1), // column 0\n * vec2f(1, 2), // column 1\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat2x2f, d.mat2x2f(0, 1, 2, 3)); // buffer holding a d.mat2x2f value, with an initial value of ((0, 1), (2, 3))\n */\nexport const mat2x2f = createMatSchema<'mat2x2f', m2x2f, v2f>({\n type: 'mat2x2f',\n rows: 2,\n columns: 2,\n MatImpl: mat2x2fImpl,\n}) as Mat2x2f;\n\n/**\n * Schema representing mat3x3f - a matrix with 3 rows and 3 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero3x3 = mat3x3f(); // filled with zeros\n *\n * @example\n * const mat = mat3x3f(0, 1, 2, 3, 4, 5, 6, 7, 8);\n * mat.columns[0] // vec3f(0, 1, 2)\n * mat.columns[1] // vec3f(3, 4, 5)\n * mat.columns[2] // vec3f(6, 7, 8)\n *\n * @example\n * const mat = mat3x3f(\n * vec3f(0, 1, 2), // column 0\n * vec3f(2, 3, 4), // column 1\n * vec3f(5, 6, 7), // column 2\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat3x3f, d.mat3x3f()); // buffer holding a d.mat3x3f value, with an initial value of mat3x3f filled with zeros\n */\nexport const mat3x3f = createMatSchema<'mat3x3f', m3x3f, v3f>({\n type: 'mat3x3f',\n rows: 3,\n columns: 3,\n MatImpl: mat3x3fImpl,\n}) as Mat3x3f;\n\n/**\n * Schema representing mat4x4f - a matrix with 4 rows and 4 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero4x4 = mat4x4f(); // filled with zeros\n *\n * @example\n * const mat = mat4x4f(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n * mat.columns[0] // vec4f(0, 1, 2, 3)\n * mat.columns[1] // vec4f(4, 5, 6, 7)\n * mat.columns[2] // vec4f(8, 9, 10, 11)\n * mat.columns[3] // vec4f(12, 13, 14, 15)\n *\n * @example\n * const mat = mat4x4f(\n * vec4f(0, 1, 2, 3), // column 0\n * vec4f(4, 5, 6, 7), // column 1\n * vec4f(8, 9, 10, 11), // column 2\n * vec4f(12, 13, 14, 15), // column 3\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat4x4f, d.mat4x4f()); // buffer holding a d.mat4x4f value, with an initial value of mat4x4f filled with zeros\n */\nexport const mat4x4f = createMatSchema<'mat4x4f', m4x4f, v4f>({\n type: 'mat4x4f',\n rows: 4,\n columns: 4,\n MatImpl: mat4x4fImpl,\n}) as Mat4x4f;\n\nexport function matToArray(mat: m2x2f | m3x3f | m4x4f): number[] {\n if (mat.kind === 'mat3x3f') {\n return [\n mat[0],\n mat[1],\n mat[2],\n mat[4],\n mat[5],\n mat[6],\n mat[8],\n mat[9],\n mat[10],\n ] as number[];\n }\n\n return Array.from({ length: mat.length }).map((_, idx) => mat[idx] as number);\n}\n","import { $internal, $repr } from '../shared/symbols.ts';\nimport type { BaseData } from './wgslTypes.ts';\n\nexport interface WgslSamplerProps {\n addressModeU?: GPUAddressMode;\n addressModeV?: GPUAddressMode;\n /**\n * Specifies the address modes for the texture width, height, and depth\n * coordinates, respectively.\n */\n addressModeW?: GPUAddressMode;\n /**\n * Specifies the sampling behavior when the sample footprint is smaller than or equal to one\n * texel.\n */\n magFilter?: GPUFilterMode;\n /**\n * Specifies the sampling behavior when the sample footprint is larger than one texel.\n */\n minFilter?: GPUFilterMode;\n /**\n * Specifies behavior for sampling between mipmap levels.\n */\n mipmapFilter?: GPUMipmapFilterMode;\n lodMinClamp?: number;\n /**\n * Specifies the minimum and maximum levels of detail, respectively, used internally when\n * sampling a texture.\n */\n lodMaxClamp?: number;\n /**\n * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is\n * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.\n * Anisotropic filtering improves the image quality of textures sampled at oblique viewing\n * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of\n * anisotropy supported when filtering.\n *\n * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range\n * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}\n * will be clamped to the maximum value that the platform supports.\n * The precise filtering behavior is implementation-dependent.\n */\n maxAnisotropy?: number;\n}\n\nexport interface WgslComparisonSamplerProps {\n compare: GPUCompareFunction;\n addressModeU?: GPUAddressMode;\n addressModeV?: GPUAddressMode;\n /**\n * Specifies the address modes for the texture width, height, and depth\n * coordinates, respectively.\n */\n addressModeW?: GPUAddressMode;\n /**\n * Specifies the sampling behavior when the sample footprint is smaller than or equal to one\n * texel.\n */\n magFilter?: GPUFilterMode;\n /**\n * Specifies the sampling behavior when the sample footprint is larger than one texel.\n */\n minFilter?: GPUFilterMode;\n /**\n * Specifies behavior for sampling between mipmap levels.\n */\n mipmapFilter?: GPUMipmapFilterMode;\n lodMinClamp?: number;\n /**\n * Specifies the minimum and maximum levels of detail, respectively, used internally when\n * sampling a texture.\n */\n lodMaxClamp?: number;\n /**\n * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is\n * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.\n * Anisotropic filtering improves the image quality of textures sampled at oblique viewing\n * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of\n * anisotropy supported when filtering.\n *\n * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range\n * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}\n * will be clamped to the maximum value that the platform supports.\n * The precise filtering behavior is implementation-dependent.\n */\n maxAnisotropy?: number;\n}\n\nconst SamplerPropsDefaults: WgslSamplerProps = {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'clamp-to-edge',\n magFilter: 'nearest',\n minFilter: 'nearest',\n mipmapFilter: 'nearest',\n lodMinClamp: 0,\n lodMaxClamp: 32,\n maxAnisotropy: 1,\n};\n\nexport interface sampler {\n [$internal]: true;\n type: 'sampler';\n}\n\nexport function sampler(): WgslSampler {\n return {\n [$internal]: true,\n type: 'sampler',\n [$repr]: undefined as unknown as sampler,\n };\n}\n\nexport interface comparisonSampler {\n [$internal]: true;\n type: 'sampler_comparison';\n}\n\nexport function comparisonSampler(): WgslComparisonSampler {\n return {\n [$internal]: true,\n type: 'sampler_comparison',\n [$repr]: undefined as unknown as comparisonSampler,\n };\n}\n\nexport interface WgslSampler extends BaseData {\n readonly [$repr]: sampler;\n readonly type: 'sampler';\n}\n\nexport interface WgslComparisonSampler extends BaseData {\n readonly [$repr]: comparisonSampler;\n readonly type: 'sampler_comparison';\n}\n\nexport function isWgslSampler(value: unknown): value is WgslSampler {\n return (\n !!(value as WgslSampler)[$internal] &&\n (value as WgslSampler).type === 'sampler'\n );\n}\n\nexport function isWgslComparisonSampler(\n value: unknown,\n): value is WgslComparisonSampler {\n return (\n !!(value as WgslComparisonSampler)[$internal] &&\n (value as WgslComparisonSampler).type === 'sampler_comparison'\n );\n}\n","import type { StorageTextureFormats } from '../core/texture/textureFormats.ts';\nimport { $internal, $repr } from '../shared/symbols.ts';\nimport type { Default, WithDefaults } from '../shared/utilityTypes.ts';\nimport { f32 } from './numeric.ts';\nimport type { F32 } from './wgslTypes.ts';\nimport type { BaseData, TextureSampleTypes } from './wgslTypes.ts';\n\nexport type StorageTextureDimension = '1d' | '2d' | '2d-array' | '3d';\n\nexport type WgslTextureProps = {\n dimension: GPUTextureViewDimension;\n sampleType: TextureSampleTypes;\n multisampled: boolean;\n};\n\nexport type WgslStorageTextureProps = {\n dimension: StorageTextureDimension;\n format: StorageTextureFormats;\n access: GPUStorageTextureAccess;\n};\n\ntype ResolvedTextureProps<\n TProps extends Partial<WgslTextureProps>,\n> = WithDefaults<TProps, WgslTextureProps>;\n\ntype ResolvedStorageTextureProps<\n TProps extends Partial<WgslStorageTextureProps>,\n> = WithDefaults<TProps, WgslStorageTextureProps>;\n\ntype SampledTextureLiteral = `texture_${\n | '1d'\n | '2d'\n | '2d_array'\n | '3d'\n | 'cube'\n | 'cube_array'\n | 'multisampled_2d'\n | 'depth_multisampled_2d'\n | 'depth_2d'\n | 'depth_2d_array'\n | 'depth_cube'\n | 'depth_cube_array'}`;\ntype StorageTextureLiteral = `texture_storage_${\n | '1d'\n | '2d'\n | '2d_array'\n | '3d'}`;\n\nexport interface WgslTexture<\n TProps extends Partial<WgslTextureProps> = WgslTextureProps,\n> extends BaseData {\n readonly [$repr]: unknown;\n readonly type: SampledTextureLiteral;\n\n readonly sampleType: ResolvedTextureProps<TProps>['sampleType'];\n readonly dimension: ResolvedTextureProps<TProps>['dimension'];\n readonly multisampled: ResolvedTextureProps<TProps>['multisampled'];\n readonly bindingSampleType: [GPUTextureSampleType, ...GPUTextureSampleType[]];\n}\n\nexport interface WgslStorageTexture<\n TProps extends Partial<WgslStorageTextureProps> = WgslStorageTextureProps,\n> extends BaseData {\n readonly [$repr]: unknown;\n readonly type: StorageTextureLiteral;\n\n readonly format: ResolvedStorageTextureProps<TProps>['format'];\n readonly dimension: ResolvedStorageTextureProps<TProps>['dimension'];\n readonly access: ResolvedStorageTextureProps<TProps>['access'];\n}\n\nexport interface WgslExternalTexture extends BaseData {\n readonly [$repr]: textureExternal;\n readonly type: 'texture_external';\n\n readonly dimension: '2d';\n}\n\nexport interface WgslTexture1d<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: '1d';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_1d';\n readonly [$repr]: texture1d<TSample>;\n}\n\nexport interface WgslTexture2d<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: '2d';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_2d';\n readonly [$repr]: texture2d<TSample>;\n}\n\nexport interface WgslTextureMultisampled2d<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: '2d';\n sampleType: TSample;\n multisampled: true;\n }> {\n readonly type: 'texture_multisampled_2d';\n readonly [$repr]: textureMultisampled2d<TSample>;\n}\n\nexport interface WgslTexture2dArray<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: '2d-array';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_2d_array';\n readonly [$repr]: texture2dArray<TSample>;\n}\n\nexport interface WgslTextureCube<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: 'cube';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_cube';\n readonly [$repr]: textureCube<TSample>;\n}\n\nexport interface WgslTextureCubeArray<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: 'cube-array';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_cube_array';\n readonly [$repr]: textureCubeArray<TSample>;\n}\n\nexport interface WgslTexture3d<\n TSample extends TextureSampleTypes = TextureSampleTypes,\n> extends\n WgslTexture<{\n dimension: '3d';\n sampleType: TSample;\n multisampled: false;\n }> {\n readonly type: 'texture_3d';\n readonly [$repr]: texture3d<TSample>;\n}\n\n// Depth textures (sample type is always f32)\nexport interface WgslTextureDepth2d extends\n WgslTexture<{\n dimension: '2d';\n sampleType: F32;\n multisampled: false;\n }> {\n readonly type: 'texture_depth_2d';\n readonly [$repr]: textureDepth2d;\n}\n\nexport interface WgslTextureDepthMultisampled2d extends\n WgslTexture<{\n dimension: '2d';\n sampleType: F32;\n multisampled: true;\n }> {\n readonly type: 'texture_depth_multisampled_2d';\n readonly [$repr]: textureMultisampled2d<F32>;\n}\n\nexport interface WgslTextureDepth2dArray extends\n WgslTexture<{\n dimension: '2d-array';\n sampleType: F32;\n multisampled: false;\n }> {\n readonly type: 'texture_depth_2d_array';\n readonly [$repr]: texture2dArray<F32>;\n}\n\nexport interface WgslTextureDepthCube extends\n WgslTexture<{\n dimension: 'cube';\n sampleType: F32;\n multisampled: false;\n }> {\n readonly type: 'texture_depth_cube';\n readonly [$repr]: textureCube<F32>;\n}\n\nexport interface WgslTextureDepthCubeArray extends\n WgslTexture<{\n dimension: 'cube-array';\n sampleType: F32;\n multisampled: false;\n }> {\n readonly type: 'texture_depth_cube_array';\n readonly [$repr]: textureCubeArray<F32>;\n}\n\n// Storage textures\nexport interface WgslStorageTexture1d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> extends\n WgslStorageTexture<{\n dimension: '1d';\n format: TFormat;\n access: TAccess;\n }> {\n readonly type: 'texture_storage_1d';\n readonly [$repr]: textureStorage1d<TFormat, TAccess>;\n}\n\nexport interface WgslStorageTexture2d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> extends\n WgslStorageTexture<{\n dimension: '2d';\n format: TFormat;\n access: TAccess;\n }> {\n readonly type: 'texture_storage_2d';\n readonly [$repr]: textureStorage2d<TFormat, TAccess>;\n}\n\nexport interface WgslStorageTexture2dArray<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> extends\n WgslStorageTexture<{\n dimension: '2d-array';\n format: TFormat;\n access: TAccess;\n }> {\n readonly type: 'texture_storage_2d_array';\n readonly [$repr]: textureStorage2dArray<TFormat, TAccess>;\n}\n\nexport interface WgslStorageTexture3d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> extends\n WgslStorageTexture<{\n dimension: '3d';\n format: TFormat;\n access: TAccess;\n }> {\n readonly type: 'texture_storage_3d';\n readonly [$repr]: textureStorage3d<TFormat, TAccess>;\n}\n\ntype SampledTextureSchemaMap<T extends WgslTextureProps> = {\n multisampled: {\n '1d': never;\n '2d': WgslTextureMultisampled2d<T['sampleType']>;\n '2d-array': never;\n '3d': never;\n cube: never;\n 'cube-array': never;\n };\n sampled: {\n '1d': WgslTexture1d<T['sampleType']>;\n '2d': WgslTexture2d<T['sampleType']>;\n '2d-array': WgslTexture2dArray<T['sampleType']>;\n '3d': WgslTexture3d<T['sampleType']>;\n cube: WgslTextureCube<T['sampleType']>;\n 'cube-array': WgslTextureCubeArray<T['sampleType']>;\n };\n};\n\ntype StorageTextureSchemaMap<T extends WgslStorageTextureProps> = {\n '1d': WgslStorageTexture1d<T['format'], T['access']>;\n '2d': WgslStorageTexture2d<T['format'], T['access']>;\n '2d-array': WgslStorageTexture2dArray<T['format'], T['access']>;\n '3d': WgslStorageTexture3d<T['format'], T['access']>;\n};\n\nexport type TextureSchemaForDescriptor<\n T extends WgslTextureProps | WgslStorageTextureProps,\n> = T extends WgslTextureProps\n ? T['multisampled'] extends true\n ? SampledTextureSchemaMap<T>['multisampled'][T['dimension']]\n : SampledTextureSchemaMap<T>['sampled'][T['dimension']]\n : T extends WgslStorageTextureProps\n ? StorageTextureSchemaMap<T>[T['dimension']]\n : never;\n\nexport function textureDescriptorToSchema<\n T extends WgslTextureProps | WgslStorageTextureProps,\n>(desc: T): TextureSchemaForDescriptor<T> {\n if ('multisampled' in desc) {\n if (desc.multisampled) {\n if (desc.dimension === '2d') {\n return textureMultisampled2d(\n desc.sampleType,\n ) as TextureSchemaForDescriptor<T>;\n }\n throw new Error(\n `Multisampled textures only support '2d' dimension, got '${desc.dimension}'`,\n );\n }\n\n switch (desc.dimension) {\n case '1d':\n return texture1d(desc.sampleType) as TextureSchemaForDescriptor<T>;\n case '2d':\n return texture2d(desc.sampleType) as TextureSchemaForDescriptor<T>;\n case '2d-array':\n return texture2dArray(\n desc.sampleType,\n ) as TextureSchemaForDescriptor<T>;\n case '3d':\n return texture3d(desc.sampleType) as TextureSchemaForDescriptor<T>;\n case 'cube':\n return textureCube(\n desc.sampleType,\n ) as TextureSchemaForDescriptor<T>;\n case 'cube-array':\n return textureCubeArray(\n desc.sampleType,\n ) as TextureSchemaForDescriptor<T>;\n default:\n throw new Error(\n // @ts-expect-error\n `Unsupported texture dimension: '${desc.dimension}'`,\n );\n }\n }\n if (!('access' in desc)) {\n throw new Error('Descriptor is neither a sampled nor a storage texture');\n }\n\n switch (desc.dimension) {\n case '1d':\n return textureStorage1d(\n desc.format,\n desc.access,\n ) as TextureSchemaForDescriptor<T>;\n case '2d':\n return textureStorage2d(\n desc.format,\n desc.access,\n ) as TextureSchemaForDescriptor<T>;\n case '2d-array':\n return textureStorage2dArray(\n desc.format,\n desc.access,\n ) as TextureSchemaForDescriptor<T>;\n case '3d':\n return textureStorage3d(\n desc.format,\n desc.access,\n ) as TextureSchemaForDescriptor<T>;\n default:\n throw new Error(\n // @ts-expect-error\n `Unsupported storage texture dimension: '${desc.dimension}'`,\n );\n }\n}\n\nfunction createTexture<TProps extends WgslTextureProps>(\n type: SampledTextureLiteral,\n props: TProps,\n): WgslTexture<TProps> {\n const isDepth = type.startsWith('texture_depth');\n const sampleTypes: [GPUTextureSampleType, ...GPUTextureSampleType[]] = isDepth\n ? ['depth', 'float', 'unfilterable-float']\n : props.sampleType.type === 'i32'\n ? ['sint']\n : props.sampleType.type === 'u32'\n ? ['uint']\n : ['float', 'unfilterable-float'];\n\n return {\n [$internal]: true,\n [$repr]: undefined as unknown as WgslTexture<TProps>,\n type,\n bindingSampleType: sampleTypes,\n ...props,\n };\n}\n\nfunction createStorageTexture<TProps extends WgslStorageTextureProps>(\n type: StorageTextureLiteral,\n props: TProps,\n): WgslStorageTexture<TProps> {\n return {\n [$internal]: true,\n [$repr]: undefined as unknown as WgslStorageTexture<TProps>,\n type,\n ...props,\n };\n}\n\nconst textureCache = new Map<\n string,\n WgslTexture | WgslStorageTexture | WgslExternalTexture\n>();\n\nexport const accessModeMap: Record<GPUStorageTextureAccess, string> = {\n 'write-only': 'write',\n 'read-only': 'read',\n 'read-write': 'read_write',\n};\n\nfunction getOrCreate<\n T extends WgslTexture | WgslStorageTexture | WgslExternalTexture,\n>(key: string, factory: () => T): T {\n let cached = textureCache.get(key) as T | undefined;\n if (!cached) {\n cached = factory();\n textureCache.set(key, cached);\n }\n return cached;\n}\n\nexport interface texture1d<T extends TextureSampleTypes = TextureSampleTypes> {\n readonly kind: `texture_1d<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function texture1d<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTexture1d<T>;\nexport function texture1d(): WgslTexture1d<F32>;\nexport function texture1d<T extends TextureSampleTypes>(sampleType?: T) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_1d<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_1d', {\n dimension: '1d',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface texture2d<T extends TextureSampleTypes = TextureSampleTypes> {\n readonly kind: `texture_2d<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function texture2d<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTexture2d<T>;\nexport function texture2d(): WgslTexture2d<F32>;\nexport function texture2d<T extends TextureSampleTypes>(sampleType?: T) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_2d<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_2d', {\n dimension: '2d',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface textureMultisampled2d<\n T extends TextureSampleTypes = TextureSampleTypes,\n> {\n readonly kind: `texture_multisampled_2d<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function textureMultisampled2d<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTextureMultisampled2d<T>;\nexport function textureMultisampled2d(): WgslTextureMultisampled2d<F32>;\nexport function textureMultisampled2d<T extends TextureSampleTypes>(\n sampleType?: T,\n) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_multisampled_2d<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_multisampled_2d', {\n dimension: '2d',\n sampleType: actualSampleType,\n multisampled: true,\n }));\n}\n\nexport interface texture2dArray<\n T extends TextureSampleTypes = TextureSampleTypes,\n> {\n readonly kind: `texture_2d_array<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function texture2dArray<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTexture2dArray<T>;\nexport function texture2dArray(): WgslTexture2dArray<F32>;\nexport function texture2dArray<T extends TextureSampleTypes>(sampleType?: T) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_2d_array<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_2d_array', {\n dimension: '2d-array',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface textureCube<\n T extends TextureSampleTypes = TextureSampleTypes,\n> {\n readonly kind: `texture_cube<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function textureCube<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTextureCube<T>;\nexport function textureCube(): WgslTextureCube<F32>;\nexport function textureCube<T extends TextureSampleTypes>(sampleType?: T) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_cube<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_cube', {\n dimension: 'cube',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface textureCubeArray<\n T extends TextureSampleTypes = TextureSampleTypes,\n> {\n readonly kind: `texture_cube_array<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function textureCubeArray<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTextureCubeArray<T>;\nexport function textureCubeArray(): WgslTextureCubeArray<F32>;\nexport function textureCubeArray<T extends TextureSampleTypes>(\n sampleType?: T,\n) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_cube_array<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_cube_array', {\n dimension: 'cube-array',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface texture3d<T extends TextureSampleTypes = TextureSampleTypes> {\n readonly kind: `texture_3d<${T['type']}>`;\n [$internal]: T;\n}\n\nexport function texture3d<T extends TextureSampleTypes>(\n sampleType: T,\n): WgslTexture3d<T>;\nexport function texture3d(): WgslTexture3d<F32>;\nexport function texture3d<T extends TextureSampleTypes>(sampleType?: T) {\n const actualSampleType = (sampleType || f32) as Default<T, F32>;\n const key = `texture_3d<${actualSampleType.type}>`;\n return getOrCreate(key, () =>\n createTexture('texture_3d', {\n dimension: '3d',\n sampleType: actualSampleType,\n multisampled: false,\n }));\n}\n\nexport interface textureStorage1d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> {\n readonly kind: `texture_storage_1d<${TFormat}, ${TAccess}>`;\n [$internal]: [TFormat, TAccess];\n}\n\nexport function textureStorage1d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access: TAccess): WgslStorageTexture1d<TFormat, TAccess>;\nexport function textureStorage1d<TFormat extends StorageTextureFormats>(\n format: TFormat,\n): WgslStorageTexture1d<TFormat, 'write-only'>;\nexport function textureStorage1d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access?: TAccess) {\n const actualAccess = (access || 'write-only') as Default<\n TAccess,\n 'write-only'\n >;\n const key = `texture_storage_1d<${format}, ${accessModeMap[actualAccess]}>`;\n return getOrCreate(key, () =>\n createStorageTexture('texture_storage_1d', {\n dimension: '1d',\n format,\n access: actualAccess,\n }));\n}\n\nexport interface textureStorage2d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> {\n readonly kind: `texture_storage_2d<${TFormat}, ${TAccess}>`;\n [$internal]: [TFormat, TAccess];\n}\n\nexport function textureStorage2d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access: TAccess): WgslStorageTexture2d<TFormat, TAccess>;\nexport function textureStorage2d<TFormat extends StorageTextureFormats>(\n format: TFormat,\n): WgslStorageTexture2d<TFormat, 'write-only'>;\nexport function textureStorage2d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access?: TAccess) {\n const actualAccess = (access || 'write-only') as Default<\n TAccess,\n 'write-only'\n >;\n const key = `texture_storage_2d<${format}, ${accessModeMap[actualAccess]}>`;\n return getOrCreate(key, () =>\n createStorageTexture('texture_storage_2d', {\n dimension: '2d',\n format,\n access: actualAccess,\n }));\n}\n\nexport interface textureStorage2dArray<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> {\n readonly kind: `texture_storage_2d_array<${TFormat}, ${TAccess}>`;\n [$internal]: [TFormat, TAccess];\n}\n\nexport function textureStorage2dArray<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(\n format: TFormat,\n access: TAccess,\n): WgslStorageTexture2dArray<TFormat, TAccess>;\nexport function textureStorage2dArray<TFormat extends StorageTextureFormats>(\n format: TFormat,\n): WgslStorageTexture2dArray<TFormat, 'write-only'>;\nexport function textureStorage2dArray<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access?: TAccess) {\n const actualAccess = (access || 'write-only') as Default<\n TAccess,\n 'write-only'\n >;\n const key = `texture_storage_2d_array<${format}, ${\n accessModeMap[actualAccess]\n }>`;\n return getOrCreate(\n key,\n () =>\n createStorageTexture('texture_storage_2d_array', {\n dimension: '2d-array',\n format,\n access: actualAccess,\n }),\n );\n}\n\nexport interface textureStorage3d<\n TFormat extends StorageTextureFormats = StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess = GPUStorageTextureAccess,\n> {\n readonly kind: `texture_storage_3d<${TFormat}, ${TAccess}>`;\n [$internal]: [TFormat, TAccess];\n}\n\nexport function textureStorage3d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access: TAccess): WgslStorageTexture3d<TFormat, TAccess>;\nexport function textureStorage3d<TFormat extends StorageTextureFormats>(\n format: TFormat,\n): WgslStorageTexture3d<TFormat, 'write-only'>;\nexport function textureStorage3d<\n TFormat extends StorageTextureFormats,\n TAccess extends GPUStorageTextureAccess,\n>(format: TFormat, access?: TAccess) {\n const actualAccess = (access || 'write-only') as Default<\n TAccess,\n 'write-only'\n >;\n const key = `texture_storage_3d<${format}, ${accessModeMap[actualAccess]}>`;\n return getOrCreate(key, () =>\n createStorageTexture('texture_storage_3d', {\n dimension: '3d',\n format,\n access: actualAccess,\n }));\n}\n\nexport interface textureDepth2d {\n readonly kind: 'texture_depth_2d';\n [$internal]: F32;\n}\n\nexport function textureDepth2d() {\n const key = 'texture_depth_2d';\n return getOrCreate(key, () =>\n createTexture('texture_depth_2d', {\n dimension: '2d',\n sampleType: f32,\n multisampled: false,\n })) as WgslTextureDepth2d;\n}\n\nexport interface textureDepthMultisampled2d {\n readonly kind: 'texture_depth_multisampled_2d';\n [$internal]: F32;\n}\n\nexport function textureDepthMultisampled2d() {\n const key = 'texture_depth_multisampled_2d';\n return getOrCreate(key, () =>\n createTexture('texture_depth_multisampled_2d', {\n dimension: '2d',\n sampleType: f32,\n multisampled: true,\n })) as WgslTextureDepthMultisampled2d;\n}\n\nexport interface textureDepth2dArray {\n readonly kind: 'texture_depth_2d_array';\n [$internal]: F32;\n}\n\nexport function textureDepth2dArray() {\n const key = 'texture_depth_2d_array';\n return getOrCreate(key, () =>\n createTexture('texture_depth_2d_array', {\n dimension: '2d-array',\n sampleType: f32,\n multisampled: false,\n })) as WgslTextureDepth2dArray;\n}\n\nexport interface textureDepthCube {\n readonly kind: 'texture_depth_cube';\n [$internal]: F32;\n}\n\nexport function textureDepthCube() {\n const key = 'texture_depth_cube';\n return getOrCreate(key, () =>\n createTexture('texture_depth_cube', {\n dimension: 'cube',\n sampleType: f32,\n multisampled: false,\n })) as WgslTextureDepthCube;\n}\n\nexport interface textureDepthCubeArray {\n readonly kind: 'texture_depth_cube_array';\n [$internal]: F32;\n}\n\nexport function textureDepthCubeArray() {\n const key = 'texture_depth_cube_array';\n return getOrCreate(key, () =>\n createTexture('texture_depth_cube_array', {\n dimension: 'cube-array',\n sampleType: f32,\n multisampled: false,\n })) as WgslTextureDepthCubeArray;\n}\n\nexport interface textureExternal {\n readonly kind: 'texture_external';\n [$internal]: true;\n}\n\nexport function textureExternal() {\n const key = 'texture_external';\n return getOrCreate(key, () => ({\n [$internal]: true,\n [$repr]: undefined as unknown as textureExternal,\n type: 'texture_external',\n dimension: '2d',\n })) as WgslExternalTexture;\n}\n\nexport function isWgslTexture(value: unknown): value is WgslTexture {\n return (\n !!(value as WgslTexture)[$internal] &&\n typeof (value as WgslTexture).multisampled === 'boolean'\n );\n}\n\nexport function isWgslStorageTexture(\n value: unknown,\n): value is WgslStorageTexture {\n return (\n !!(value as WgslStorageTexture)[$internal] &&\n typeof (value as WgslStorageTexture).format === 'string' &&\n typeof (value as WgslStorageTexture).access === 'string'\n );\n}\n\nexport function isWgslExternalTexture(\n value: unknown,\n): value is WgslExternalTexture {\n return (\n !!(value as WgslExternalTexture)[$internal] &&\n (value as WgslExternalTexture).type === 'texture_external'\n );\n}\n","import type { Infer, MemIdentity } from '../shared/repr.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport {\n $gpuRepr,\n $memIdent,\n $repr,\n $validStorageSchema,\n $validUniformSchema,\n $validVertexSchema,\n} from '../shared/symbols.ts';\nimport type { Atomic, atomicI32, atomicU32, I32, U32 } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Marks a concrete integer scalar type schema (u32 or i32) as a WGSL atomic.\n *\n * @example\n * const atomicU32 = d.atomic(d.u32);\n * const atomicI32 = d.atomic(d.i32);\n *\n * @param data Underlying type schema.\n */\nexport function atomic<TSchema extends U32 | I32>(\n data: TSchema,\n): Atomic<TSchema> {\n return new AtomicImpl(data);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass AtomicImpl<TSchema extends U32 | I32> implements Atomic<TSchema> {\n public readonly [$internal] = true;\n public readonly type = 'atomic';\n\n // Type-tokens, not available at runtime\n declare readonly [$repr]: Infer<TSchema>;\n declare readonly [$memIdent]: MemIdentity<TSchema>;\n declare readonly [$gpuRepr]: TSchema extends U32 ? atomicU32 : atomicI32;\n declare readonly [$validStorageSchema]: true;\n declare readonly [$validUniformSchema]: true;\n declare readonly [$validVertexSchema]: true;\n // ---\n\n constructor(public readonly inner: TSchema) {}\n}\n","export const smoothstepScalar = (\n edge0: number,\n edge1: number,\n x: number,\n): number => {\n if (edge0 === edge1) {\n return 0; // WGSL spec says this is an indeterminate value\n }\n const t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n return t * t * (3 - 2 * t);\n};\n\nexport const clamp = (value: number, low: number, high: number) =>\n Math.min(Math.max(low, value), high);\n\nexport const divInteger = (lhs: number, rhs: number) => {\n if (rhs === 0) {\n return lhs;\n }\n return Math.trunc(lhs / rhs);\n};\n\nexport function bitcastU32toF32Impl(n: number): number {\n const dataView = new DataView(new ArrayBuffer(4));\n dataView.setUint32(0, n, true);\n return dataView.getFloat32(0, true);\n}\n\nexport function bitcastU32toI32Impl(n: number): number {\n const dataView = new DataView(new ArrayBuffer(4));\n dataView.setUint32(0, n, true);\n return dataView.getInt32(0, true);\n}\n","import { $internal } from '../shared/symbols.ts';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix.ts';\nimport {\n bitcastU32toF32Impl,\n bitcastU32toI32Impl,\n clamp,\n divInteger,\n smoothstepScalar,\n} from './numberOps.ts';\nimport * as vectorConstructors from './vector.ts';\nimport type * as wgsl from './wgslTypes.ts';\nimport type { VecKind } from './wgslTypes.ts';\n\ntype vBase = { kind: VecKind };\ntype mBase = { kind: MatKind };\ntype v2 = wgsl.v2f | wgsl.v2h | wgsl.v2i | wgsl.v2u;\ntype v3 = wgsl.v3f | wgsl.v3h | wgsl.v3i | wgsl.v3u;\ntype v4 = wgsl.v4f | wgsl.v4h | wgsl.v4i | wgsl.v4u;\n\ntype MatKind = 'mat2x2f' | 'mat3x3f' | 'mat4x4f';\n\n// We're doing operations on the CPU, so we fallthrough directly to the JS impl\nconst vec2b = vectorConstructors.vec2b[$internal].jsImpl;\nconst vec2f = vectorConstructors.vec2f[$internal].jsImpl;\nconst vec2h = vectorConstructors.vec2h[$internal].jsImpl;\nconst vec2i = vectorConstructors.vec2i[$internal].jsImpl;\nconst vec2u = vectorConstructors.vec2u[$internal].jsImpl;\nconst vec3b = vectorConstructors.vec3b[$internal].jsImpl;\nconst vec3f = vectorConstructors.vec3f[$internal].jsImpl;\nconst vec3h = vectorConstructors.vec3h[$internal].jsImpl;\nconst vec3i = vectorConstructors.vec3i[$internal].jsImpl;\nconst vec3u = vectorConstructors.vec3u[$internal].jsImpl;\nconst vec4b = vectorConstructors.vec4b[$internal].jsImpl;\nconst vec4f = vectorConstructors.vec4f[$internal].jsImpl;\nconst vec4h = vectorConstructors.vec4h[$internal].jsImpl;\nconst vec4i = vectorConstructors.vec4i[$internal].jsImpl;\nconst vec4u = vectorConstructors.vec4u[$internal].jsImpl;\n\nconst lengthVec2 = (v: v2) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: v3) => Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: v4) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nconst dotVec2 = (lhs: v2, rhs: v2) => lhs.x * rhs.x + lhs.y * rhs.y;\nconst dotVec3 = (lhs: v3, rhs: v3) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z;\nconst dotVec4 = (lhs: v4, rhs: v4) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w;\n\ntype UnaryOp = (a: number) => number;\ntype BinaryOp = (a: number, b: number) => number;\n\nconst unary2f = (op: UnaryOp) => (a: wgsl.v2f) => vec2f(op(a.x), op(a.y));\nconst unary2h = (op: UnaryOp) => (a: wgsl.v2h) => vec2h(op(a.x), op(a.y));\nconst unary2i = (op: UnaryOp) => (a: wgsl.v2i) => vec2i(op(a.x), op(a.y));\nconst unary2u = (op: UnaryOp) => (a: wgsl.v2u) => vec2u(op(a.x), op(a.y));\n\nconst unary3f = (op: UnaryOp) => (a: wgsl.v3f) =>\n vec3f(op(a.x), op(a.y), op(a.z));\n\nconst unary3h = (op: UnaryOp) => (a: wgsl.v3h) =>\n vec3h(op(a.x), op(a.y), op(a.z));\n\nconst unary3i = (op: UnaryOp) => (a: wgsl.v3i) =>\n vec3i(op(a.x), op(a.y), op(a.z));\n\nconst unary3u = (op: UnaryOp) => (a: wgsl.v3u) =>\n vec3u(op(a.x), op(a.y), op(a.z));\n\nconst unary4f = (op: UnaryOp) => (a: wgsl.v4f) =>\n vec4f(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4h = (op: UnaryOp) => (a: wgsl.v4h) =>\n vec4h(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4i = (op: UnaryOp) => (a: wgsl.v4i) =>\n vec4i(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4u = (op: UnaryOp) => (a: wgsl.v4u) =>\n vec4u(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary2x2f = (op: UnaryOp) => (a: wgsl.m2x2f) => {\n const a_ = a.columns as [wgsl.v2f, wgsl.v2f];\n return mat2x2f(unary2f(op)(a_[0]), unary2f(op)(a_[1]));\n};\n\nconst unary3x3f = (op: UnaryOp) => (a: wgsl.m3x3f) => {\n const a_ = a.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n return mat3x3f(unary3f(op)(a_[0]), unary3f(op)(a_[1]), unary3f(op)(a_[2]));\n};\n\nconst unary4x4f = (op: UnaryOp) => (a: wgsl.m4x4f) => {\n const a_ = a.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n return mat4x4f(\n unary4f(op)(a_[0]),\n unary4f(op)(a_[1]),\n unary4f(op)(a_[2]),\n unary4f(op)(a_[3]),\n );\n};\n\nconst binaryComponentWise2f = (op: BinaryOp) => (a: wgsl.v2f, b: wgsl.v2f) =>\n vec2f(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2h = (op: BinaryOp) => (a: wgsl.v2h, b: wgsl.v2h) =>\n vec2h(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2i = (op: BinaryOp) => (a: wgsl.v2i, b: wgsl.v2i) =>\n vec2i(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2u = (op: BinaryOp) => (a: wgsl.v2u, b: wgsl.v2u) =>\n vec2u(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise3f = (op: BinaryOp) => (a: wgsl.v3f, b: wgsl.v3f) =>\n vec3f(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3h = (op: BinaryOp) => (a: wgsl.v3h, b: wgsl.v3h) =>\n vec3h(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3i = (op: BinaryOp) => (a: wgsl.v3i, b: wgsl.v3i) =>\n vec3i(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3u = (op: BinaryOp) => (a: wgsl.v3u, b: wgsl.v3u) =>\n vec3u(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise4f = (op: BinaryOp) => (a: wgsl.v4f, b: wgsl.v4f) =>\n vec4f(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4h = (op: BinaryOp) => (a: wgsl.v4h, b: wgsl.v4h) =>\n vec4h(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4i = (op: BinaryOp) => (a: wgsl.v4i, b: wgsl.v4i) =>\n vec4i(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4u = (op: BinaryOp) => (a: wgsl.v4u, b: wgsl.v4u) =>\n vec4u(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise2x2f =\n (op: BinaryOp) => (a: wgsl.m2x2f, b: wgsl.m2x2f) => {\n const a_ = a.columns as [wgsl.v2f, wgsl.v2f];\n const b_ = b.columns as [wgsl.v2f, wgsl.v2f];\n return mat2x2f(\n binaryComponentWise2f(op)(a_[0], b_[0]),\n binaryComponentWise2f(op)(a_[1], b_[1]),\n );\n };\n\nconst binaryComponentWise3x3f =\n (op: BinaryOp) => (a: wgsl.m3x3f, b: wgsl.m3x3f) => {\n const a_ = a.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n const b_ = b.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n return mat3x3f(\n binaryComponentWise3f(op)(a_[0], b_[0]),\n binaryComponentWise3f(op)(a_[1], b_[1]),\n binaryComponentWise3f(op)(a_[2], b_[2]),\n );\n };\n\nconst binaryComponentWise4x4f =\n (op: BinaryOp) => (a: wgsl.m4x4f, b: wgsl.m4x4f) => {\n const a_ = a.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n const b_ = b.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n return mat4x4f(\n binaryComponentWise4f(op)(a_[0], b_[0]),\n binaryComponentWise4f(op)(a_[1], b_[1]),\n binaryComponentWise4f(op)(a_[2], b_[2]),\n binaryComponentWise4f(op)(a_[3], b_[3]),\n );\n };\n\ntype TernaryOp = (a: number, b: number, c: number) => number;\n\nconst ternaryComponentWise2f =\n (op: TernaryOp) => (a: wgsl.v2f, b: wgsl.v2f, c: wgsl.v2f) =>\n vec2f(op(a.x, b.x, c.x), op(a.y, b.y, c.y));\n\nconst ternaryComponentWise2h =\n (op: TernaryOp) => (a: wgsl.v2h, b: wgsl.v2h, c: wgsl.v2h) =>\n vec2h(op(a.x, b.x, c.x), op(a.y, b.y, c.y));\n\nconst ternaryComponentWise3f =\n (op: TernaryOp) => (a: wgsl.v3f, b: wgsl.v3f, c: wgsl.v3f) =>\n vec3f(op(a.x, b.x, c.x), op(a.y, b.y, c.y), op(a.z, b.z, c.z));\n\nconst ternaryComponentWise3h =\n (op: TernaryOp) => (a: wgsl.v3h, b: wgsl.v3h, c: wgsl.v3h) =>\n vec3h(op(a.x, b.x, c.x), op(a.y, b.y, c.y), op(a.z, b.z, c.z));\n\nconst ternaryComponentWise4f =\n (op: TernaryOp) => (a: wgsl.v4f, b: wgsl.v4f, c: wgsl.v4f) =>\n vec4f(\n op(a.x, b.x, c.x),\n op(a.y, b.y, c.y),\n op(a.z, b.z, c.z),\n op(a.w, b.w, c.w),\n );\n\nconst ternaryComponentWise4h =\n (op: TernaryOp) => (a: wgsl.v4h, b: wgsl.v4h, c: wgsl.v4h) =>\n vec4h(\n op(a.x, b.x, c.x),\n op(a.y, b.y, c.y),\n op(a.z, b.z, c.z),\n op(a.w, b.w, c.w),\n );\n\nexport const VectorOps = {\n eq: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2i: (e1: wgsl.v2i, e2: wgsl.v2i) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2u: (e1: wgsl.v2u, e2: wgsl.v2u) => vec2b(e1.x === e2.x, e1.y === e2.y),\n 'vec2<bool>': (e1: wgsl.v2b, e2: wgsl.v2b) =>\n vec2b(e1.x === e2.x, e1.y === e2.y),\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3i: (e1: wgsl.v3i, e2: wgsl.v3i) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3u: (e1: wgsl.v3u, e2: wgsl.v3u) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n 'vec3<bool>': (e1: wgsl.v3b, e2: wgsl.v3b) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4i: (e1: wgsl.v4i, e2: wgsl.v4i) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4u: (e1: wgsl.v4u, e2: wgsl.v4u) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n 'vec4<bool>': (e1: wgsl.v4b, e2: wgsl.v4b) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyVecInstance>(\n e1: T,\n e2: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b\n >,\n\n lt: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2i: (e1: wgsl.v2i, e2: wgsl.v2i) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2u: (e1: wgsl.v2u, e2: wgsl.v2u) => vec2b(e1.x < e2.x, e1.y < e2.y),\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3i: (e1: wgsl.v3i, e2: wgsl.v3i) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3u: (e1: wgsl.v3u, e2: wgsl.v3u) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4i: (e1: wgsl.v4i, e2: wgsl.v4i) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4u: (e1: wgsl.v4u, e2: wgsl.v4u) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyNumericVecInstance>(\n e1: T,\n e2: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b\n >,\n\n or: {\n 'vec2<bool>': (e1: wgsl.v2b, e2: wgsl.v2b) =>\n vec2b(e1.x || e2.x, e1.y || e2.y),\n 'vec3<bool>': (e1: wgsl.v3b, e2: wgsl.v3b) =>\n vec3b(e1.x || e2.x, e1.y || e2.y, e1.z || e2.z),\n 'vec4<bool>': (e1: wgsl.v4b, e2: wgsl.v4b) =>\n vec4b(e1.x || e2.x, e1.y || e2.y, e1.z || e2.z, e1.w || e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyBooleanVecInstance>(e1: T, e2: T) => T\n >,\n\n all: {\n 'vec2<bool>': (e: wgsl.v2b) => e.x && e.y,\n 'vec3<bool>': (e: wgsl.v3b) => e.x && e.y && e.z,\n 'vec4<bool>': (e: wgsl.v4b) => e.x && e.y && e.z && e.w,\n } as Record<VecKind, (v: wgsl.AnyBooleanVecInstance) => boolean>,\n\n abs: {\n vec2f: unary2f(Math.abs),\n vec2h: unary2h(Math.abs),\n vec2i: unary2i(Math.abs),\n vec2u: unary2u(Math.abs),\n\n vec3f: unary3f(Math.abs),\n vec3h: unary3h(Math.abs),\n vec3i: unary3i(Math.abs),\n vec3u: unary3u(Math.abs),\n\n vec4f: unary4f(Math.abs),\n vec4h: unary4h(Math.abs),\n vec4i: unary4i(Math.abs),\n vec4u: unary4u(Math.abs),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atan2: {\n vec2f: binaryComponentWise2f(Math.atan2),\n vec2h: binaryComponentWise2h(Math.atan2),\n\n vec3f: binaryComponentWise3f(Math.atan2),\n vec3h: binaryComponentWise3h(Math.atan2),\n\n vec4f: binaryComponentWise4f(Math.atan2),\n vec4h: binaryComponentWise4h(Math.atan2),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n acos: {\n vec2f: unary2f(Math.acos),\n vec2h: unary2h(Math.acos),\n vec2i: unary2i(Math.acos),\n vec2u: unary2u(Math.acos),\n\n vec3f: unary3f(Math.acos),\n vec3h: unary3h(Math.acos),\n vec3i: unary3i(Math.acos),\n vec3u: unary3u(Math.acos),\n\n vec4f: unary4f(Math.acos),\n vec4h: unary4h(Math.acos),\n vec4i: unary4i(Math.acos),\n vec4u: unary4u(Math.acos),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n acosh: {\n vec2f: unary2f(Math.acosh),\n vec2h: unary2h(Math.acosh),\n\n vec3f: unary3f(Math.acosh),\n vec3h: unary3h(Math.acosh),\n\n vec4f: unary4f(Math.acosh),\n vec4h: unary4h(Math.acosh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n asin: {\n vec2f: unary2f(Math.asin),\n vec2h: unary2h(Math.asin),\n\n vec3f: unary3f(Math.asin),\n vec3h: unary3h(Math.asin),\n\n vec4f: unary4f(Math.asin),\n vec4h: unary4h(Math.asin),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n asinh: {\n vec2f: unary2f(Math.asinh),\n vec2h: unary2h(Math.asinh),\n\n vec3f: unary3f(Math.asinh),\n vec3h: unary3h(Math.asinh),\n\n vec4f: unary4f(Math.asinh),\n vec4h: unary4h(Math.asinh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atan: {\n vec2f: unary2f(Math.atan),\n vec2h: unary2h(Math.atan),\n\n vec3f: unary3f(Math.atan),\n vec3h: unary3h(Math.atan),\n\n vec4f: unary4f(Math.atan),\n vec4h: unary4h(Math.atan),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atanh: {\n vec2f: unary2f(Math.atanh),\n vec2h: unary2h(Math.atanh),\n\n vec3f: unary3f(Math.atanh),\n vec3h: unary3h(Math.atanh),\n\n vec4f: unary4f(Math.atanh),\n vec4h: unary4h(Math.atanh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n ceil: {\n vec2f: unary2f(Math.ceil),\n vec2h: unary2h(Math.ceil),\n\n vec3f: unary3f(Math.ceil),\n vec3h: unary3h(Math.ceil),\n\n vec4f: unary4f(Math.ceil),\n vec4h: unary4h(Math.ceil),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n clamp: {\n vec2f: (v: wgsl.v2f, low: wgsl.v2f, high: wgsl.v2f) =>\n vec2f(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2h: (v: wgsl.v2h, low: wgsl.v2h, high: wgsl.v2h) =>\n vec2h(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2i: (v: wgsl.v2i, low: wgsl.v2i, high: wgsl.v2i) =>\n vec2i(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2u: (v: wgsl.v2u, low: wgsl.v2u, high: wgsl.v2u) =>\n vec2u(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n\n vec3f: (v: wgsl.v3f, low: wgsl.v3f, high: wgsl.v3f) =>\n vec3f(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3h: (v: wgsl.v3h, low: wgsl.v3h, high: wgsl.v3h) =>\n vec3h(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3i: (v: wgsl.v3i, low: wgsl.v3i, high: wgsl.v3f) =>\n vec3i(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3u: (v: wgsl.v3u, low: wgsl.v3u, high: wgsl.v3f) =>\n vec3u(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n\n vec4f: (v: wgsl.v4f, low: wgsl.v4f, high: wgsl.v4f) =>\n vec4f(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4h: (v: wgsl.v4h, low: wgsl.v4h, high: wgsl.v4h) =>\n vec4h(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4i: (v: wgsl.v4i, low: wgsl.v4i, high: wgsl.v4i) =>\n vec4i(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4u: (v: wgsl.v4u, low: wgsl.v4u, high: wgsl.v4u) =>\n vec4u(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n } as Record<VecKind, <T extends vBase>(v: T, low: T, high: T) => T>,\n\n length: {\n vec2f: lengthVec2,\n vec2h: lengthVec2,\n\n vec3f: lengthVec3,\n vec3h: lengthVec3,\n\n vec4f: lengthVec4,\n vec4h: lengthVec4,\n } as Record<VecKind, (v: vBase) => number>,\n\n add: {\n vec2f: binaryComponentWise2f((a, b) => a + b),\n vec2h: binaryComponentWise2h((a, b) => a + b),\n vec2i: binaryComponentWise2i((a, b) => a + b),\n vec2u: binaryComponentWise2u((a, b) => a + b),\n\n vec3f: binaryComponentWise3f((a, b) => a + b),\n vec3h: binaryComponentWise3h((a, b) => a + b),\n vec3i: binaryComponentWise3i((a, b) => a + b),\n vec3u: binaryComponentWise3u((a, b) => a + b),\n\n vec4f: binaryComponentWise4f((a, b) => a + b),\n vec4h: binaryComponentWise4h((a, b) => a + b),\n vec4i: binaryComponentWise4i((a, b) => a + b),\n vec4u: binaryComponentWise4u((a, b) => a + b),\n\n mat2x2f: binaryComponentWise2x2f((a, b) => a + b),\n mat3x3f: binaryComponentWise3x3f((a, b) => a + b),\n mat4x4f: binaryComponentWise4x4f((a, b) => a + b),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | mBase>(lhs: T, rhs: T) => T\n >,\n\n smoothstep: {\n vec2f: ternaryComponentWise2f(smoothstepScalar),\n vec2h: ternaryComponentWise2h(smoothstepScalar),\n vec3f: ternaryComponentWise3f(smoothstepScalar),\n vec3h: ternaryComponentWise3h(smoothstepScalar),\n vec4f: ternaryComponentWise4f(smoothstepScalar),\n vec4h: ternaryComponentWise4h(smoothstepScalar),\n } as Record<\n VecKind,\n <T extends vBase>(\n edge0: T,\n edge1: T,\n x: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2f\n : T extends wgsl.AnyVec3Instance ? wgsl.v3f\n : T extends wgsl.AnyVec4Instance ? wgsl.v4f\n : wgsl.AnyVecInstance\n >,\n\n addMixed: {\n vec2f: (a: wgsl.v2f, b: number) => unary2f((e) => e + b)(a),\n vec2h: (a: wgsl.v2h, b: number) => unary2h((e) => e + b)(a),\n vec2i: (a: wgsl.v2i, b: number) => unary2i((e) => e + b)(a),\n vec2u: (a: wgsl.v2u, b: number) => unary2u((e) => e + b)(a),\n\n vec3f: (a: wgsl.v3f, b: number) => unary3f((e) => e + b)(a),\n vec3h: (a: wgsl.v3h, b: number) => unary3h((e) => e + b)(a),\n vec3i: (a: wgsl.v3i, b: number) => unary3i((e) => e + b)(a),\n vec3u: (a: wgsl.v3u, b: number) => unary3u((e) => e + b)(a),\n\n vec4f: (a: wgsl.v4f, b: number) => unary4f((e) => e + b)(a),\n vec4h: (a: wgsl.v4h, b: number) => unary4h((e) => e + b)(a),\n vec4i: (a: wgsl.v4i, b: number) => unary4i((e) => e + b)(a),\n vec4u: (a: wgsl.v4u, b: number) => unary4u((e) => e + b)(a),\n\n mat2x2f: (a: wgsl.m2x2f, b: number) => unary2x2f((e) => e + b)(a),\n mat3x3f: (a: wgsl.m3x3f, b: number) => unary3x3f((e) => e + b)(a),\n mat4x4f: (a: wgsl.m4x4f, b: number) => unary4x4f((e) => e + b)(a),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | mBase>(lhs: T, rhs: number) => T\n >,\n\n mulSxV: {\n vec2f: (s: number, v: wgsl.v2f) => unary2f((e) => s * e)(v),\n vec2h: (s: number, v: wgsl.v2h) => unary2h((e) => s * e)(v),\n vec2i: (s: number, v: wgsl.v2i) => unary2i((e) => s * e)(v),\n vec2u: (s: number, v: wgsl.v2u) => unary2u((e) => s * e)(v),\n\n vec3f: (s: number, v: wgsl.v3f) => unary3f((e) => s * e)(v),\n vec3h: (s: number, v: wgsl.v3h) => unary3h((e) => s * e)(v),\n vec3i: (s: number, v: wgsl.v3i) => unary3i((e) => s * e)(v),\n vec3u: (s: number, v: wgsl.v3u) => unary3u((e) => s * e)(v),\n\n vec4f: (s: number, v: wgsl.v4f) => unary4f((e) => s * e)(v),\n vec4h: (s: number, v: wgsl.v4h) => unary4h((e) => s * e)(v),\n vec4i: (s: number, v: wgsl.v4i) => unary4i((e) => s * e)(v),\n vec4u: (s: number, v: wgsl.v4u) => unary4u((e) => s * e)(v),\n\n mat2x2f: (s: number, m: wgsl.m2x2f) => unary2x2f((e) => s * e)(m),\n mat3x3f: (s: number, m: wgsl.m3x3f) => unary3x3f((e) => s * e)(m),\n mat4x4f: (s: number, m: wgsl.m4x4f) => unary4x4f((e) => s * e)(m),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | wgsl.AnyMatInstance>(s: number, v: T) => T\n >,\n\n mulVxV: {\n vec2f: binaryComponentWise2f((a, b) => a * b),\n vec2h: binaryComponentWise2h((a, b) => a * b),\n vec2i: binaryComponentWise2i((a, b) => a * b),\n vec2u: binaryComponentWise2u((a, b) => a * b),\n\n vec3f: binaryComponentWise3f((a, b) => a * b),\n vec3h: binaryComponentWise3h((a, b) => a * b),\n vec3i: binaryComponentWise3i((a, b) => a * b),\n vec3u: binaryComponentWise3u((a, b) => a * b),\n\n vec4f: binaryComponentWise4f((a, b) => a * b),\n vec4h: binaryComponentWise4h((a, b) => a * b),\n vec4i: binaryComponentWise4i((a, b) => a * b),\n vec4u: binaryComponentWise4u((a, b) => a * b),\n\n mat2x2f: (a: wgsl.m2x2f, b: wgsl.m2x2f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat2x2f(\n a_[0].x * b_[0].x + a_[1].x * b_[0].y,\n a_[0].y * b_[0].x + a_[1].y * b_[0].y,\n a_[0].x * b_[1].x + a_[1].x * b_[1].y,\n a_[0].y * b_[1].x + a_[1].y * b_[1].y,\n );\n },\n\n mat3x3f: (a: wgsl.m3x3f, b: wgsl.m3x3f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat3x3f(\n a_[0].x * b_[0].x + a_[1].x * b_[0].y + a_[2].x * b_[0].z,\n a_[0].y * b_[0].x + a_[1].y * b_[0].y + a_[2].y * b_[0].z,\n a_[0].z * b_[0].x + a_[1].z * b_[0].y + a_[2].z * b_[0].z,\n a_[0].x * b_[1].x + a_[1].x * b_[1].y + a_[2].x * b_[1].z,\n a_[0].y * b_[1].x + a_[1].y * b_[1].y + a_[2].y * b_[1].z,\n a_[0].z * b_[1].x + a_[1].z * b_[1].y + a_[2].z * b_[1].z,\n a_[0].x * b_[2].x + a_[1].x * b_[2].y + a_[2].x * b_[2].z,\n a_[0].y * b_[2].x + a_[1].y * b_[2].y + a_[2].y * b_[2].z,\n a_[0].z * b_[2].x + a_[1].z * b_[2].y + a_[2].z * b_[2].z,\n );\n },\n\n mat4x4f: (a: wgsl.m4x4f, b: wgsl.m4x4f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat4x4f(\n a_[0].x * b_[0].x +\n a_[1].x * b_[0].y +\n a_[2].x * b_[0].z +\n a_[3].x * b_[0].w,\n a_[0].y * b_[0].x +\n a_[1].y * b_[0].y +\n a_[2].y * b_[0].z +\n a_[3].y * b_[0].w,\n a_[0].z * b_[0].x +\n a_[1].z * b_[0].y +\n a_[2].z * b_[0].z +\n a_[3].z * b_[0].w,\n a_[0].w * b_[0].x +\n a_[1].w * b_[0].y +\n a_[2].w * b_[0].z +\n a_[3].w * b_[0].w,\n a_[0].x * b_[1].x +\n a_[1].x * b_[1].y +\n a_[2].x * b_[1].z +\n a_[3].x * b_[1].w,\n a_[0].y * b_[1].x +\n a_[1].y * b_[1].y +\n a_[2].y * b_[1].z +\n a_[3].y * b_[1].w,\n a_[0].z * b_[1].x +\n a_[1].z * b_[1].y +\n a_[2].z * b_[1].z +\n a_[3].z * b_[1].w,\n a_[0].w * b_[1].x +\n a_[1].w * b_[1].y +\n a_[2].w * b_[1].z +\n a_[3].w * b_[1].w,\n a_[0].x * b_[2].x +\n a_[1].x * b_[2].y +\n a_[2].x * b_[2].z +\n a_[3].x * b_[2].w,\n a_[0].y * b_[2].x +\n a_[1].y * b_[2].y +\n a_[2].y * b_[2].z +\n a_[3].y * b_[2].w,\n a_[0].z * b_[2].x +\n a_[1].z * b_[2].y +\n a_[2].z * b_[2].z +\n a_[3].z * b_[2].w,\n a_[0].w * b_[2].x +\n a_[1].w * b_[2].y +\n a_[2].w * b_[2].z +\n a_[3].w * b_[2].w,\n a_[0].x * b_[3].x +\n a_[1].x * b_[3].y +\n a_[2].x * b_[3].z +\n a_[3].x * b_[3].w,\n a_[0].y * b_[3].x +\n a_[1].y * b_[3].y +\n a_[2].y * b_[3].z +\n a_[3].y * b_[3].w,\n a_[0].z * b_[3].x +\n a_[1].z * b_[3].y +\n a_[2].z * b_[3].z +\n a_[3].z * b_[3].w,\n a_[0].w * b_[3].x +\n a_[1].w * b_[3].y +\n a_[2].w * b_[3].z +\n a_[3].w * b_[3].w,\n );\n },\n } as Record<\n VecKind | MatKind,\n <T extends vBase | wgsl.AnyMatInstance>(lhs: T, rhs: T) => T\n >,\n\n mulMxV: {\n mat2x2f: (m: wgsl.m2x2f, v: wgsl.v2f) => {\n const m_ = m.columns;\n return vec2f(\n m_[0].x * v.x + m_[1].x * v.y,\n m_[0].y * v.x + m_[1].y * v.y,\n );\n },\n\n mat3x3f: (m: wgsl.m3x3f, v: wgsl.v3f) => {\n const m_ = m.columns;\n return vec3f(\n m_[0].x * v.x + m_[1].x * v.y + m_[2].x * v.z,\n m_[0].y * v.x + m_[1].y * v.y + m_[2].y * v.z,\n m_[0].z * v.x + m_[1].z * v.y + m_[2].z * v.z,\n );\n },\n\n mat4x4f: (m: wgsl.m4x4f, v: wgsl.v4f) => {\n const m_ = m.columns;\n return vec4f(\n m_[0].x * v.x + m_[1].x * v.y + m_[2].x * v.z + m_[3].x * v.w,\n m_[0].y * v.x + m_[1].y * v.y + m_[2].y * v.z + m_[3].y * v.w,\n m_[0].z * v.x + m_[1].z * v.y + m_[2].z * v.z + m_[3].z * v.w,\n m_[0].w * v.x + m_[1].w * v.y + m_[2].w * v.z + m_[3].w * v.w,\n );\n },\n } as Record<\n MatKind,\n <T extends wgsl.AnyMatInstance>(\n m: T,\n v: wgsl.vBaseForMat<T>,\n ) => wgsl.vBaseForMat<T>\n >,\n\n mulVxM: {\n mat2x2f: (v: wgsl.v2f, m: wgsl.m2x2f) => {\n const m_ = m.columns;\n return vec2f(\n v.x * m_[0].x + v.y * m_[0].y,\n v.x * m_[1].x + v.y * m_[1].y,\n );\n },\n\n mat3x3f: (v: wgsl.v3f, m: wgsl.m3x3f) => {\n const m_ = m.columns;\n return vec3f(\n v.x * m_[0].x + v.y * m_[0].y + v.z * m_[0].z,\n v.x * m_[1].x + v.y * m_[1].y + v.z * m_[1].z,\n v.x * m_[2].x + v.y * m_[2].y + v.z * m_[2].z,\n );\n },\n\n mat4x4f: (v: wgsl.v4f, m: wgsl.m4x4f) => {\n const m_ = m.columns;\n return vec4f(\n v.x * m_[0].x + v.y * m_[0].y + v.z * m_[0].z + v.w * m_[0].w,\n v.x * m_[1].x + v.y * m_[1].y + v.z * m_[1].z + v.w * m_[1].w,\n v.x * m_[2].x + v.y * m_[2].y + v.z * m_[2].z + v.w * m_[2].w,\n v.x * m_[3].x + v.y * m_[3].y + v.z * m_[3].z + v.w * m_[3].w,\n );\n },\n } as Record<\n MatKind,\n <T extends wgsl.AnyMatInstance>(\n v: wgsl.vBaseForMat<T>,\n m: T,\n ) => wgsl.vBaseForMat<T>\n >,\n\n div: {\n vec2f: binaryComponentWise2f((a, b) => a / b),\n vec2h: binaryComponentWise2h((a, b) => a / b),\n vec2i: binaryComponentWise2i(divInteger),\n vec2u: binaryComponentWise2u(divInteger),\n\n vec3f: binaryComponentWise3f((a, b) => a / b),\n vec3h: binaryComponentWise3h((a, b) => a / b),\n vec3i: binaryComponentWise3i(divInteger),\n vec3u: binaryComponentWise3u(divInteger),\n\n vec4f: binaryComponentWise4f((a, b) => a / b),\n vec4h: binaryComponentWise4h((a, b) => a / b),\n vec4i: binaryComponentWise4i(divInteger),\n vec4u: binaryComponentWise4u(divInteger),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n dot: {\n vec2f: dotVec2,\n vec2h: dotVec2,\n vec2i: dotVec2,\n vec2u: dotVec2,\n vec3f: dotVec3,\n vec3h: dotVec3,\n vec3i: dotVec3,\n vec3u: dotVec3,\n vec4f: dotVec4,\n vec4h: dotVec4,\n vec4i: dotVec4,\n vec4u: dotVec4,\n } as Record<VecKind, <T extends vBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: wgsl.v2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2h: (v: wgsl.v2h) => {\n const len = lengthVec2(v);\n return vec2h(v.x / len, v.y / len);\n },\n vec2i: (v: wgsl.v2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: wgsl.v2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: wgsl.v3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3h: (v: wgsl.v3h) => {\n const len = lengthVec3(v);\n return vec3h(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: wgsl.v3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: wgsl.v3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: wgsl.v4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4h: (v: wgsl.v4h) => {\n const len = lengthVec4(v);\n return vec4h(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: wgsl.v4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: wgsl.v4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: wgsl.v3f, b: wgsl.v3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3h: (a: wgsl.v3h, b: wgsl.v3h) => {\n return vec3h(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3h',\n <T extends wgsl.v3f | wgsl.v3h>(a: T, b: T) => T\n >,\n\n mod: {\n vec2f: binaryComponentWise2f((a, b) => a % b),\n vec2h: binaryComponentWise2h((a, b) => a % b),\n vec2i: binaryComponentWise2i((a, b) => a % b),\n vec2u: binaryComponentWise2u((a, b) => a % b),\n\n vec3f: binaryComponentWise3f((a, b) => a % b),\n vec3h: binaryComponentWise3h((a, b) => a % b),\n vec3i: binaryComponentWise3i((a, b) => a % b),\n vec3u: binaryComponentWise3u((a, b) => a % b),\n\n vec4f: binaryComponentWise4f((a, b) => a % b),\n vec4h: binaryComponentWise4h((a, b) => a % b),\n vec4i: binaryComponentWise4i((a, b) => a % b),\n vec4u: binaryComponentWise4u((a, b) => a % b),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n floor: {\n vec2f: unary2f(Math.floor),\n vec2h: unary2h(Math.floor),\n\n vec3f: unary3f(Math.floor),\n vec3h: unary3h(Math.floor),\n\n vec4f: unary4f(Math.floor),\n vec4h: unary4h(Math.floor),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n max: {\n vec2f: binaryComponentWise2f(Math.max),\n vec2h: binaryComponentWise2h(Math.max),\n vec2i: binaryComponentWise2i(Math.max),\n vec2u: binaryComponentWise2u(Math.max),\n\n vec3f: binaryComponentWise3f(Math.max),\n vec3h: binaryComponentWise3h(Math.max),\n vec3i: binaryComponentWise3i(Math.max),\n vec3u: binaryComponentWise3u(Math.max),\n\n vec4f: binaryComponentWise4f(Math.max),\n vec4h: binaryComponentWise4h(Math.max),\n vec4i: binaryComponentWise4i(Math.max),\n vec4u: binaryComponentWise4u(Math.max),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n min: {\n vec2f: binaryComponentWise2f(Math.min),\n vec2h: binaryComponentWise2h(Math.min),\n vec2i: binaryComponentWise2i(Math.min),\n vec2u: binaryComponentWise2u(Math.min),\n\n vec3f: binaryComponentWise3f(Math.min),\n vec3h: binaryComponentWise3h(Math.min),\n vec3i: binaryComponentWise3i(Math.min),\n vec3u: binaryComponentWise3u(Math.min),\n\n vec4f: binaryComponentWise4f(Math.min),\n vec4h: binaryComponentWise4h(Math.min),\n vec4i: binaryComponentWise4i(Math.min),\n vec4u: binaryComponentWise4u(Math.min),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n pow: {\n vec2f: (base: wgsl.v2f, exponent: wgsl.v2f) =>\n vec2f(base.x ** exponent.x, base.y ** exponent.y),\n vec2h: (base: wgsl.v2h, exponent: wgsl.v2h) =>\n vec2h(base.x ** exponent.x, base.y ** exponent.y),\n\n vec3f: (base: wgsl.v3f, exponent: wgsl.v3f) =>\n vec3f(base.x ** exponent.x, base.y ** exponent.y, base.z ** exponent.z),\n vec3h: (base: wgsl.v3h, exponent: wgsl.v3h) =>\n vec3h(base.x ** exponent.x, base.y ** exponent.y, base.z ** exponent.z),\n\n vec4f: (base: wgsl.v4f, exponent: wgsl.v4f) =>\n vec4f(\n base.x ** exponent.x,\n base.y ** exponent.y,\n base.z ** exponent.z,\n base.w ** exponent.w,\n ),\n vec4h: (base: wgsl.v4h, exponent: wgsl.v4h) =>\n vec4h(\n base.x ** exponent.x,\n base.y ** exponent.y,\n base.z ** exponent.z,\n base.w ** exponent.w,\n ),\n } as Record<\n 'vec2f' | 'vec3f' | 'vec4f' | 'vec2h' | 'vec3h' | 'vec4h' | 'number',\n <T extends wgsl.AnyFloatVecInstance | number>(a: T, b: T) => T\n >,\n\n sign: {\n vec2f: unary2f(Math.sign),\n vec2h: unary2h(Math.sign),\n vec2i: unary2i(Math.sign),\n\n vec3f: unary3f(Math.sign),\n vec3h: unary3h(Math.sign),\n vec3i: unary3i(Math.sign),\n\n vec4f: unary4f(Math.sign),\n vec4h: unary4h(Math.sign),\n vec4i: unary4i(Math.sign),\n } as Record<VecKind, <T extends vBase>(e: T) => T>,\n\n sqrt: {\n vec2f: unary2f(Math.sqrt),\n vec2h: unary2h(Math.sqrt),\n\n vec3f: unary3f(Math.sqrt),\n vec3h: unary3h(Math.sqrt),\n\n vec4f: unary4f(Math.sqrt),\n vec4h: unary4h(Math.sqrt),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n mix: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f, e3: wgsl.v2f | number) => {\n if (typeof e3 === 'number') {\n return vec2f(e1.x * (1 - e3) + e2.x * e3, e1.y * (1 - e3) + e2.y * e3);\n }\n return vec2f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n );\n },\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h, e3: wgsl.v2h | number) => {\n if (typeof e3 === 'number') {\n return vec2h(e1.x * (1 - e3) + e2.x * e3, e1.y * (1 - e3) + e2.y * e3);\n }\n return vec2h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n );\n },\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f, e3: wgsl.v3f | number) => {\n if (typeof e3 === 'number') {\n return vec3f(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n );\n }\n return vec3f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n );\n },\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h, e3: wgsl.v3h | number) => {\n if (typeof e3 === 'number') {\n return vec3h(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n );\n }\n return vec3h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n );\n },\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f, e3: wgsl.v4f | number) => {\n if (typeof e3 === 'number') {\n return vec4f(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n e1.w * (1 - e3) + e2.w * e3,\n );\n }\n return vec4f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n e1.w * (1 - e3.w) + e2.w * e3.w,\n );\n },\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h, e3: wgsl.v4h | number) => {\n if (typeof e3 === 'number') {\n return vec4h(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n e1.w * (1 - e3) + e2.w * e3,\n );\n }\n return vec4h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n e1.w * (1 - e3.w) + e2.w * e3.w,\n );\n },\n } as Record<\n 'vec2f' | 'vec3f' | 'vec4f' | 'vec2h' | 'vec3h' | 'vec4h',\n <T extends wgsl.v2f | wgsl.v3f | wgsl.v4f | wgsl.v2h | wgsl.v3h | wgsl.v4h>(\n a: T,\n b: T,\n c: T | number,\n ) => T\n >,\n\n sin: {\n vec2f: unary2f(Math.sin),\n vec2h: unary2h(Math.sin),\n\n vec3f: unary3f(Math.sin),\n vec3h: unary3h(Math.sin),\n\n vec4f: unary4f(Math.sin),\n vec4h: unary4h(Math.sin),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cos: {\n vec2f: unary2f(Math.cos),\n vec2h: unary2h(Math.cos),\n\n vec3f: unary3f(Math.cos),\n vec3h: unary3h(Math.cos),\n\n vec4f: unary4f(Math.cos),\n vec4h: unary4h(Math.cos),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cosh: {\n vec2f: unary2f(Math.cosh),\n vec2h: unary2h(Math.cosh),\n\n vec3f: unary3f(Math.cosh),\n vec3h: unary3h(Math.cosh),\n\n vec4f: unary4f(Math.cosh),\n vec4h: unary4h(Math.cosh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n exp: {\n vec2f: unary2f(Math.exp),\n vec2h: unary2h(Math.exp),\n\n vec3f: unary3f(Math.exp),\n vec3h: unary3h(Math.exp),\n\n vec4f: unary4f(Math.exp),\n vec4h: unary4h(Math.exp),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n exp2: {\n vec2f: unary2f((val) => 2 ** val),\n vec2h: unary2h((val) => 2 ** val),\n\n vec3f: unary3f((val) => 2 ** val),\n vec3h: unary3h((val) => 2 ** val),\n\n vec4f: unary4f((val) => 2 ** val),\n vec4h: unary4h((val) => 2 ** val),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n log: {\n vec2f: unary2f(Math.log),\n vec2h: unary2h(Math.log),\n\n vec3f: unary3f(Math.log),\n vec3h: unary3h(Math.log),\n\n vec4f: unary4f(Math.log),\n vec4h: unary4h(Math.log),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n log2: {\n vec2f: unary2f(Math.log2),\n vec2h: unary2h(Math.log2),\n\n vec3f: unary3f(Math.log2),\n vec3h: unary3h(Math.log2),\n\n vec4f: unary4f(Math.log2),\n vec4h: unary4h(Math.log2),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n fract: {\n vec2f: unary2f((value) => value - Math.floor(value)),\n vec2h: unary2h((value) => value - Math.floor(value)),\n\n vec3f: unary3f((value) => value - Math.floor(value)),\n vec3h: unary3h((value) => value - Math.floor(value)),\n\n vec4f: unary4f((value) => value - Math.floor(value)),\n vec4h: unary4h((value) => value - Math.floor(value)),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n isCloseToZero: {\n vec2f: (v: wgsl.v2f, n: number) => Math.abs(v.x) <= n && Math.abs(v.y) <= n,\n vec2h: (v: wgsl.v2h, n: number) => Math.abs(v.x) <= n && Math.abs(v.y) <= n,\n\n vec3f: (v: wgsl.v3f, n: number) =>\n Math.abs(v.x) <= n && Math.abs(v.y) <= n && Math.abs(v.z) <= n,\n vec3h: (v: wgsl.v3h, n: number) =>\n Math.abs(v.x) <= n && Math.abs(v.y) <= n && Math.abs(v.z) <= n,\n\n vec4f: (v: wgsl.v4f, n: number) =>\n Math.abs(v.x) <= n &&\n Math.abs(v.y) <= n &&\n Math.abs(v.z) <= n &&\n Math.abs(v.w) <= n,\n vec4h: (v: wgsl.v4h, n: number) =>\n Math.abs(v.x) <= n &&\n Math.abs(v.y) <= n &&\n Math.abs(v.z) <= n &&\n Math.abs(v.w) <= n,\n } as Record<VecKind, <T extends vBase>(v: T, n: number) => boolean>,\n\n neg: {\n vec2f: unary2f((value) => -value),\n vec2h: unary2h((value) => -value),\n vec2i: unary2i((value) => -value),\n vec2u: unary2u((value) => -value),\n 'vec2<bool>': (e: wgsl.v2b) => vec2b(!e.x, !e.y),\n\n vec3f: unary3f((value) => -value),\n vec3h: unary3h((value) => -value),\n vec3i: unary3i((value) => -value),\n vec3u: unary3u((value) => -value),\n 'vec3<bool>': (e: wgsl.v3b) => vec3b(!e.x, !e.y, !e.z),\n\n vec4f: unary4f((value) => -value),\n vec4h: unary4h((value) => -value),\n vec4i: unary4i((value) => -value),\n vec4u: unary4u((value) => -value),\n 'vec4<bool>': (e: wgsl.v4b) => vec4b(!e.x, !e.y, !e.z, !e.w),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n select: {\n vec2f: (f: wgsl.v2f, t: wgsl.v2f, c: wgsl.v2b) =>\n vec2f(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2h: (f: wgsl.v2h, t: wgsl.v2h, c: wgsl.v2b) =>\n vec2h(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2i: (f: wgsl.v2i, t: wgsl.v2i, c: wgsl.v2b) =>\n vec2i(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2u: (f: wgsl.v2u, t: wgsl.v2u, c: wgsl.v2b) =>\n vec2u(c.x ? t.x : f.x, c.y ? t.y : f.y),\n 'vec2<bool>': (f: wgsl.v2b, t: wgsl.v2b, c: wgsl.v2b) =>\n vec2b(c.x ? t.x : f.x, c.y ? t.y : f.y),\n\n vec3f: (f: wgsl.v3f, t: wgsl.v3f, c: wgsl.v3b) =>\n vec3f(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3h: (f: wgsl.v3h, t: wgsl.v3h, c: wgsl.v3b) =>\n vec3h(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3i: (f: wgsl.v3i, t: wgsl.v3i, c: wgsl.v3b) =>\n vec3i(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3u: (f: wgsl.v3u, t: wgsl.v3u, c: wgsl.v3b) =>\n vec3u(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n 'vec3<bool>': (f: wgsl.v3b, t: wgsl.v3b, c: wgsl.v3b) =>\n vec3b(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n\n vec4f: (f: wgsl.v4f, t: wgsl.v4f, c: wgsl.v4b) =>\n vec4f(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4h: (f: wgsl.v4h, t: wgsl.v4h, c: wgsl.v4b) =>\n vec4h(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4i: (f: wgsl.v4i, t: wgsl.v4i, c: wgsl.v4b) =>\n vec4i(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4u: (f: wgsl.v4u, t: wgsl.v4u, c: wgsl.v4b) =>\n vec4u(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n 'vec4<bool>': (f: wgsl.v4b, t: wgsl.v4b, c: wgsl.v4b) =>\n vec4b(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyVecInstance>(\n f: T,\n t: T,\n c: T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b,\n ) => T\n >,\n\n tanh: {\n vec2f: unary2f(Math.tanh),\n vec2h: unary2h(Math.tanh),\n\n vec3f: unary3f(Math.tanh),\n vec3h: unary3h(Math.tanh),\n\n vec4f: unary4f(Math.tanh),\n vec4h: unary4h(Math.tanh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n bitcastU32toF32: {\n vec2u: (n: wgsl.v2u) =>\n vec2f(bitcastU32toF32Impl(n.x), bitcastU32toF32Impl(n.y)),\n vec3u: (n: wgsl.v3u) =>\n vec3f(\n bitcastU32toF32Impl(n.x),\n bitcastU32toF32Impl(n.y),\n bitcastU32toF32Impl(n.z),\n ),\n vec4u: (n: wgsl.v4u) =>\n vec4f(\n bitcastU32toF32Impl(n.x),\n bitcastU32toF32Impl(n.y),\n bitcastU32toF32Impl(n.z),\n bitcastU32toF32Impl(n.w),\n ),\n } as Record<\n VecKind,\n <T extends wgsl.AnyUnsignedVecInstance>(\n v: T,\n ) => T extends wgsl.v2u ? wgsl.v2f\n : T extends wgsl.v3u ? wgsl.v3f\n : wgsl.v4f\n >,\n\n bitcastU32toI32: {\n vec2u: (n: wgsl.v2u) =>\n vec2i(bitcastU32toI32Impl(n.x), bitcastU32toI32Impl(n.y)),\n vec3u: (n: wgsl.v3u) =>\n vec3i(\n bitcastU32toI32Impl(n.x),\n bitcastU32toI32Impl(n.y),\n bitcastU32toI32Impl(n.z),\n ),\n vec4u: (n: wgsl.v4u) =>\n vec4i(\n bitcastU32toI32Impl(n.x),\n bitcastU32toI32Impl(n.y),\n bitcastU32toI32Impl(n.z),\n bitcastU32toI32Impl(n.w),\n ),\n } as Record<\n VecKind,\n <T extends wgsl.AnyUnsignedVecInstance>(\n v: T,\n ) => T extends wgsl.v2u ? wgsl.v2i\n : T extends wgsl.v3u ? wgsl.v3i\n : wgsl.v4i\n >,\n};\n","import { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch, stitchWithExactTypes } from '../core/resolve/stitch.ts';\nimport { abstractFloat, f16, f32 } from '../data/numeric.ts';\nimport { vecTypeToConstructor } from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport {\n type AnyMatInstance,\n type AnyNumericVecInstance,\n isFloat32VecInstance,\n isMatInstance,\n isNumericSchema,\n isVecInstance,\n type mBaseForVec,\n type vBaseForMat,\n} from '../data/wgslTypes.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { unify } from '../tgsl/conversion.ts';\n\ntype NumVec = AnyNumericVecInstance;\ntype Mat = AnyMatInstance;\n\nfunction cpuAdd(lhs: number, rhs: number): number; // default addition\nfunction cpuAdd<T extends NumVec>(lhs: number, rhs: T): T; // mixed addition\nfunction cpuAdd<T extends NumVec>(lhs: T, rhs: number): T; // mixed addition\nfunction cpuAdd<T extends NumVec | Mat>(lhs: T, rhs: T): T; // component-wise addition\nfunction cpuAdd<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec\n : Lhs extends NumVec ? number | Lhs\n : Lhs extends Mat ? Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuAdd(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs + rhs; // default addition\n }\n if (typeof lhs === 'number' && isVecInstance(rhs)) {\n return VectorOps.addMixed[rhs.kind](rhs, lhs); // mixed addition\n }\n if (isVecInstance(lhs) && typeof rhs === 'number') {\n return VectorOps.addMixed[lhs.kind](lhs, rhs); // mixed addition\n }\n if (\n (isVecInstance(lhs) && isVecInstance(rhs)) ||\n (isMatInstance(lhs) && isMatInstance(rhs))\n ) {\n return VectorOps.add[lhs.kind](lhs, rhs); // component-wise addition\n }\n\n throw new Error('Add/Sub called with invalid arguments.');\n}\n\nexport const add = dualImpl({\n name: 'add',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return {\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n };\n },\n normalImpl: cpuAdd,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} + ${rhs})`,\n});\n\nfunction cpuSub(lhs: number, rhs: number): number; // default subtraction\nfunction cpuSub<T extends NumVec>(lhs: number, rhs: T): T; // mixed subtraction\nfunction cpuSub<T extends NumVec>(lhs: T, rhs: number): T; // mixed subtraction\nfunction cpuSub<T extends NumVec | Mat>(lhs: T, rhs: T): T; // component-wise subtraction\nfunction cpuSub<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec\n : Lhs extends NumVec ? number | Lhs\n : Lhs extends Mat ? Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuSub(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n // while illegal on the wgsl side, we can do this in js\n return cpuAdd(lhs, cpuMul(-1, rhs));\n}\n\nexport const sub = dualImpl({\n name: 'sub',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return {\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n };\n },\n normalImpl: cpuSub,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} - ${rhs})`,\n});\n\nfunction cpuMul(lhs: number, rhs: number): number; // default multiplication\nfunction cpuMul<MV extends NumVec | Mat>(lhs: number, rhs: MV): MV; // scale\nfunction cpuMul<MV extends NumVec | Mat>(lhs: MV, rhs: number): MV; // scale\nfunction cpuMul<V extends NumVec>(lhs: V, rhs: V): V; // component-wise multiplication\nfunction cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: V, rhs: M): V; // row-vector-matrix\nfunction cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: M, rhs: V): V; // matrix-column-vector\nfunction cpuMul<M extends Mat>(lhs: M, rhs: M): M; // matrix multiplication\nfunction cpuMul<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec | Mat\n : Lhs extends NumVec ? number | Lhs | mBaseForVec<Lhs>\n : Lhs extends Mat ? number | vBaseForMat<Lhs> | Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuMul(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs * rhs; // default multiplication\n }\n if (typeof lhs === 'number' && (isVecInstance(rhs) || isMatInstance(rhs))) {\n return VectorOps.mulSxV[rhs.kind](lhs, rhs); // scale\n }\n if ((isVecInstance(lhs) || isMatInstance(lhs)) && typeof rhs === 'number') {\n return VectorOps.mulSxV[lhs.kind](rhs, lhs); // scale\n }\n if (isVecInstance(lhs) && isVecInstance(rhs)) {\n return VectorOps.mulVxV[lhs.kind](lhs, rhs); // component-wise\n }\n if (isFloat32VecInstance(lhs) && isMatInstance(rhs)) {\n return VectorOps.mulVxM[rhs.kind](lhs, rhs); // row-vector-matrix\n }\n if (isMatInstance(lhs) && isFloat32VecInstance(rhs)) {\n return VectorOps.mulMxV[lhs.kind](lhs, rhs); // matrix-column-vector\n }\n if (isMatInstance(lhs) && isMatInstance(rhs)) {\n return VectorOps.mulVxV[lhs.kind](lhs, rhs); // matrix multiplication\n }\n\n throw new Error('Mul called with invalid arguments.');\n}\n\nexport const mul = dualImpl({\n name: 'mul',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n const returnType = isNumericSchema(uargs[0])\n // Scalar * Scalar/Vector/Matrix\n ? uargs[1]\n : isNumericSchema(uargs[1])\n // Vector/Matrix * Scalar\n ? uargs[0]\n : uargs[0].type.startsWith('vec')\n // Vector * Vector/Matrix\n ? uargs[0]\n : uargs[1].type.startsWith('vec')\n // Matrix * Vector\n ? uargs[1]\n // Matrix * Matrix\n : uargs[0];\n\n return ({ argTypes: uargs, returnType });\n },\n normalImpl: cpuMul,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} * ${rhs})`,\n});\n\nfunction cpuDiv(lhs: number, rhs: number): number; // default js division\nfunction cpuDiv<T extends NumVec>(lhs: T, rhs: T): T; // component-wise division\nfunction cpuDiv<T extends NumVec>(lhs: number, rhs: T): T; // mixed division\nfunction cpuDiv<T extends NumVec>(lhs: T, rhs: number): T; // mixed division\nfunction cpuDiv(lhs: NumVec | number, rhs: NumVec | number): NumVec | number {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs / rhs;\n }\n if (typeof lhs === 'number' && isVecInstance(rhs)) {\n const schema = vecTypeToConstructor[rhs.kind][$internal].jsImpl;\n return VectorOps.div[rhs.kind](schema(lhs), rhs);\n }\n if (isVecInstance(lhs) && typeof rhs === 'number') {\n const schema = vecTypeToConstructor[lhs.kind][$internal].jsImpl;\n return VectorOps.div[lhs.kind](lhs, schema(rhs));\n }\n if (isVecInstance(lhs) && isVecInstance(rhs)) {\n return VectorOps.div[lhs.kind](lhs, rhs);\n }\n throw new Error('Div called with invalid arguments.');\n}\n\nexport const div = dualImpl({\n name: 'div',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return ({\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n });\n },\n normalImpl: cpuDiv,\n codegenImpl: (lhs, rhs) => stitchWithExactTypes`(${lhs} / ${rhs})`,\n ignoreImplicitCastWarning: true,\n});\n\ntype ModOverload = {\n (a: number, b: number): number;\n <T extends NumVec>(a: T, b: T): T;\n <T extends NumVec>(a: number, b: T): T;\n <T extends NumVec>(a: T, b: number): T;\n};\n\n/**\n * @privateRemarks\n * Both JS and WGSL implementations use truncated definition of modulo\n */\nexport const mod: ModOverload = dualImpl({\n name: 'mod',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return {\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n };\n },\n normalImpl<T extends NumVec | number>(a: T, b: T): T {\n if (typeof a === 'number' && typeof b === 'number') {\n return (a % b) as T; // scalar % scalar\n }\n if (typeof a === 'number' && isVecInstance(b)) {\n // scalar % vector\n const schema = vecTypeToConstructor[b.kind];\n return VectorOps.mod[b.kind](schema(a), b) as T;\n }\n if (isVecInstance(a) && typeof b === 'number') {\n const schema = vecTypeToConstructor[a.kind];\n // vector % scalar\n return VectorOps.mod[a.kind](a, schema(b)) as T;\n }\n\n if (isVecInstance(a) && isVecInstance(b)) {\n // vector % vector\n return VectorOps.mod[a.kind](a, b) as T;\n }\n throw new Error(\n 'Mod called with invalid arguments, expected types: number or vector.',\n );\n },\n codegenImpl: (lhs, rhs) => stitch`(${lhs} % ${rhs})`,\n});\n\nfunction cpuNeg(value: number): number;\nfunction cpuNeg<T extends NumVec>(value: T): T;\nfunction cpuNeg(value: NumVec | number): NumVec | number {\n if (typeof value === 'number') {\n return -value;\n }\n return VectorOps.neg[value.kind](value);\n}\n\nexport const neg = dualImpl({\n name: 'neg',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuNeg,\n codegenImpl: (arg) => stitch`-(${arg})`,\n});\n","import {\n createDualImpl,\n dualImpl,\n MissingCpuImplError,\n} from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { smoothstepScalar } from '../data/numberOps.ts';\nimport {\n abstractFloat,\n abstractInt,\n f16,\n f32,\n i32,\n u32,\n} from '../data/numeric.ts';\nimport { snip } from '../data/snippet.ts';\nimport { abstruct } from '../data/struct.ts';\nimport {\n vec2f,\n vec2h,\n vec2i,\n vec3f,\n vec3h,\n vec3i,\n vec4f,\n vec4h,\n vec4i,\n} from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport {\n type AnyFloat32VecInstance,\n type AnyFloatVecInstance,\n type AnyIntegerVecInstance,\n type AnyMatInstance,\n type AnyNumericVecInstance,\n type AnySignedVecInstance,\n type AnyWgslData,\n isHalfPrecisionSchema,\n isNumericSchema,\n isVecInstance,\n type v2f,\n type v2h,\n type v2i,\n type v3f,\n type v3h,\n type v3i,\n type v4f,\n type v4h,\n type v4i,\n type VecData,\n} from '../data/wgslTypes.ts';\nimport type { Infer } from '../shared/repr.ts';\nimport { unify } from '../tgsl/conversion.ts';\nimport { mul, sub } from './operators.ts';\n\ntype NumVec = AnyNumericVecInstance;\n\nfunction cpuAbs(value: number): number;\nfunction cpuAbs<T extends NumVec | number>(value: T): T;\nfunction cpuAbs<T extends NumVec | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.abs(value) as T;\n }\n return VectorOps.abs[value.kind](value) as T;\n}\n\nexport const abs = dualImpl({\n name: 'abs',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAbs,\n codegenImpl: (value) => stitch`abs(${value})`,\n});\n\nfunction cpuAcos(value: number): number;\nfunction cpuAcos<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAcos<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.acos(value) as T;\n }\n return VectorOps.acos[value.kind](value) as T;\n}\n\nexport const acos = dualImpl({\n name: 'acos',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAcos,\n codegenImpl: (value) => stitch`acos(${value})`,\n});\n\nfunction cpuAcosh(value: number): number;\nfunction cpuAcosh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAcosh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.acosh(value) as T;\n }\n return VectorOps.acosh[value.kind](value) as T;\n}\n\nexport const acosh = dualImpl({\n name: 'acosh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAcosh,\n codegenImpl: (value) => stitch`acosh(${value})`,\n});\n\nfunction cpuAsin(value: number): number;\nfunction cpuAsin<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAsin<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.asin(value) as T;\n }\n return VectorOps.asin[value.kind](value) as T;\n}\n\nexport const asin = dualImpl({\n name: 'asin',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAsin,\n codegenImpl: (value) => stitch`asin(${value})`,\n});\n\nfunction cpuAsinh(value: number): number;\nfunction cpuAsinh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAsinh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.asinh(value) as T;\n }\n return VectorOps.asinh[value.kind](value) as T;\n}\n\nexport const asinh = dualImpl({\n name: 'asinh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAsinh,\n codegenImpl: (value) => stitch`asinh(${value})`,\n});\n\nfunction cpuAtan(value: number): number;\nfunction cpuAtan<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAtan<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.atan(value) as T;\n }\n return VectorOps.atan[value.kind](value) as T;\n}\n\nexport const atan = dualImpl({\n name: 'atan',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAtan,\n codegenImpl: (value) => stitch`atan(${value})`,\n});\n\nfunction cpuAtanh(value: number): number;\nfunction cpuAtanh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAtanh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.atanh(value) as T;\n }\n return VectorOps.atanh[value.kind](value) as T;\n}\n\nexport const atanh = dualImpl({\n name: 'atanh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuAtanh,\n codegenImpl: (value) => stitch`atanh(${value})`,\n});\n\nfunction cpuAtan2(y: number, x: number): number;\nfunction cpuAtan2<T extends AnyFloatVecInstance>(y: T, x: T): T;\nfunction cpuAtan2<T extends AnyFloatVecInstance | number>(y: T, x: T): T {\n if (typeof y === 'number' && typeof x === 'number') {\n return Math.atan2(y, x) as T;\n }\n return VectorOps.atan2[(y as AnyFloatVecInstance).kind](\n y as never,\n x as never,\n ) as T;\n}\n\nexport const atan2 = dualImpl({\n name: 'atan2',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return ({\n argTypes: uargs,\n returnType: uargs[0],\n });\n },\n normalImpl: cpuAtan2,\n codegenImpl: (y, x) => stitch`atan2(${y}, ${x})`,\n});\n\nfunction cpuCeil(value: number): number;\nfunction cpuCeil<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCeil<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.ceil(value) as T;\n }\n return VectorOps.ceil[value.kind](value) as T;\n}\n\nexport const ceil = dualImpl({\n name: 'ceil',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuCeil,\n codegenImpl: (value) => stitch`ceil(${value})`,\n});\n\nfunction cpuClamp(value: number, low: number, high: number): number;\nfunction cpuClamp<T extends NumVec | number>(value: T, low: T, high: T): T;\nfunction cpuClamp<T extends NumVec | number>(value: T, low: T, high: T): T {\n if (typeof value === 'number') {\n return Math.min(Math.max(low as number, value), high as number) as T;\n }\n return VectorOps.clamp[value.kind](\n value,\n low as NumVec,\n high as NumVec,\n ) as T;\n}\n\nexport const clamp = dualImpl({\n name: 'clamp',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return { argTypes: uargs, returnType: uargs[0] };\n },\n normalImpl: cpuClamp,\n codegenImpl: (value, low, high) => stitch`clamp(${value}, ${low}, ${high})`,\n});\n\nfunction cpuCos(value: number): number;\nfunction cpuCos<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCos<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.cos(value) as T;\n }\n return VectorOps.cos[value.kind](value) as T;\n}\n\nexport const cos = dualImpl({\n name: 'cos',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuCos,\n codegenImpl: (value) => stitch`cos(${value})`,\n});\n\nfunction cpuCosh(value: number): number;\nfunction cpuCosh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCosh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.cosh(value) as T;\n }\n return VectorOps.cosh[value.kind](value) as T;\n}\n\nexport const cosh = dualImpl({\n name: 'cosh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuCosh,\n codegenImpl: (value) => stitch`cosh(${value})`,\n});\n\nfunction cpuCountLeadingZeros(value: number): number;\nfunction cpuCountLeadingZeros<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountLeadingZeros<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countLeadingZeros = dualImpl<typeof cpuCountLeadingZeros>({\n name: 'countLeadingZeros',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for countLeadingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countLeadingZeros(${value})`,\n});\n\nfunction cpuCountOneBits(value: number): number;\nfunction cpuCountOneBits<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountOneBits<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countOneBits = dualImpl<typeof cpuCountOneBits>({\n name: 'countOneBits',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for countOneBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countOneBits(${value})`,\n});\n\nfunction cpuCountTrailingZeros(value: number): number;\nfunction cpuCountTrailingZeros<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountTrailingZeros<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countTrailingZeros = dualImpl<typeof cpuCountTrailingZeros>({\n name: 'countTrailingZeros',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for countTrailingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countTrailingZeros(${value})`,\n});\n\nexport const cross = dualImpl({\n name: 'cross',\n signature: (lhs, rhs) => ({ argTypes: [lhs, rhs], returnType: lhs }),\n normalImpl: <T extends v3f | v3h>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n codegenImpl: (a, b) => stitch`cross(${a}, ${b})`,\n});\n\nfunction cpuDegrees(value: number): number;\nfunction cpuDegrees<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuDegrees<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return ((value * 180) / Math.PI) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for degrees on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const degrees = dualImpl<typeof cpuDegrees>({\n name: 'degrees',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuDegrees,\n codegenImpl: (value) => stitch`degrees(${value})`,\n});\n\nexport const determinant = dualImpl<(value: AnyMatInstance) => number>({\n name: 'determinant',\n // TODO: The return type is potentially wrong here, it should return whatever the matrix element type is.\n signature: (arg) => ({ argTypes: [arg], returnType: f32 }),\n normalImpl:\n 'CPU implementation for determinant not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`determinant(${value})`,\n});\n\nfunction cpuDistance(a: number, b: number): number;\nfunction cpuDistance<T extends AnyFloatVecInstance>(a: T, b: T): number;\nfunction cpuDistance<T extends AnyFloatVecInstance | number>(\n a: T,\n b: T,\n): number {\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b);\n }\n return length(\n sub(a as AnyFloatVecInstance, b as AnyFloatVecInstance),\n ) as number;\n}\n\nexport const distance = dualImpl({\n name: 'distance',\n signature: (lhs, rhs) => ({\n argTypes: [lhs, rhs],\n returnType: isHalfPrecisionSchema(lhs) ? f16 : f32,\n }),\n normalImpl: cpuDistance,\n codegenImpl: (a, b) => stitch`distance(${a}, ${b})`,\n});\n\nexport const dot = dualImpl({\n name: 'dot',\n signature: (e1, e2) => ({\n argTypes: [e1, e2],\n returnType: (e1 as VecData).primitive,\n }),\n normalImpl: <T extends NumVec>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n codegenImpl: (lhs, rhs) => stitch`dot(${lhs}, ${rhs})`,\n});\n\nexport const dot4U8Packed = dualImpl<(e1: number, e2: number) => number>({\n name: 'dot4U8Packed',\n signature: (lhs, rhs) => ({ argTypes: [u32, u32], returnType: u32 }),\n normalImpl:\n 'CPU implementation for dot4U8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`dot4U8Packed(${e1}, ${e2})`,\n});\n\nexport const dot4I8Packed = dualImpl<(e1: number, e2: number) => number>({\n name: 'dot4I8Packed',\n signature: (lhs, rhs) => ({ argTypes: [u32, u32], returnType: i32 }),\n normalImpl:\n 'CPU implementation for dot4I8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`dot4I8Packed(${e1}, ${e2})`,\n});\n\nfunction cpuExp(value: number): number;\nfunction cpuExp<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuExp<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.exp(value) as T;\n }\n return VectorOps.exp[value.kind](value) as T;\n}\n\nexport const exp = dualImpl({\n name: 'exp',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuExp,\n codegenImpl: (value) => stitch`exp(${value})`,\n});\n\nfunction cpuExp2(value: number): number;\nfunction cpuExp2<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuExp2<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (2 ** value) as T;\n }\n return VectorOps.exp2[value.kind](value) as T;\n}\n\nexport const exp2 = dualImpl({\n name: 'exp2',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuExp2,\n codegenImpl: (value) => stitch`exp2(${value})`,\n});\n\nfunction cpuExtractBits(e: number, offset: number, count: number): number;\nfunction cpuExtractBits<T extends AnyIntegerVecInstance>(\n e: T,\n offset: number,\n count: number,\n): T;\nfunction cpuExtractBits<T extends AnyIntegerVecInstance | number>(\n e: T,\n offset: number,\n count: number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const extractBits = dualImpl<typeof cpuExtractBits>({\n name: 'extractBits',\n signature: (arg, offset, count) => ({\n argTypes: [arg, u32, u32],\n returnType: arg,\n }),\n normalImpl:\n 'CPU implementation for extractBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e, offset, count) =>\n stitch`extractBits(${e}, ${offset}, ${count})`,\n});\n\nexport const faceForward = dualImpl<\n <T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T) => T\n>({\n name: 'faceForward',\n signature: (arg1, arg2, arg3) => ({\n argTypes: [arg1, arg2, arg3],\n returnType: arg1,\n }),\n normalImpl:\n 'CPU implementation for faceForward not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2, e3) => stitch`faceForward(${e1}, ${e2}, ${e3})`,\n});\n\nfunction cpuFirstLeadingBit(value: number): number;\nfunction cpuFirstLeadingBit<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuFirstLeadingBit<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const firstLeadingBit = dualImpl<typeof cpuFirstLeadingBit>({\n name: 'firstLeadingBit',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for firstLeadingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`firstLeadingBit(${value})`,\n});\n\nfunction cpuFirstTrailingBit(value: number): number;\nfunction cpuFirstTrailingBit<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuFirstTrailingBit<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const firstTrailingBit = dualImpl<typeof cpuFirstTrailingBit>({\n name: 'firstTrailingBit',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for firstTrailingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`firstTrailingBit(${value})`,\n});\n\nfunction cpuFloor(value: number): number;\nfunction cpuFloor<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuFloor<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.floor(value) as T;\n }\n return VectorOps.floor[value.kind](value) as T;\n}\n\nexport const floor = dualImpl({\n name: 'floor',\n signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),\n normalImpl: cpuFloor,\n codegenImpl: (arg) => stitch`floor(${arg})`,\n});\n\nfunction cpuFma(e1: number, e2: number, e3: number): number;\nfunction cpuFma<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T): T;\nfunction cpuFma<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: T,\n e3: T,\n): T {\n if (typeof e1 === 'number') {\n return (e1 * (e2 as number) + (e3 as number)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for fma on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const fma = dualImpl({\n name: 'fma',\n signature: (arg1, arg2, arg3) => ({\n argTypes: [arg1, arg2, arg3],\n returnType: arg1,\n }),\n normalImpl: cpuFma,\n codegenImpl: (e1, e2, e3) => stitch`fma(${e1}, ${e2}, ${e3})`,\n});\n\nfunction cpuFract(value: number): number;\nfunction cpuFract<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuFract<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (value - Math.floor(value)) as T;\n }\n return VectorOps.fract[value.kind](value) as T;\n}\n\nexport const fract = dualImpl({\n name: 'fract',\n signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),\n normalImpl: cpuFract,\n codegenImpl: (a) => stitch`fract(${a})`,\n});\n\nconst FrexpResults = {\n f32: abstruct({ fract: f32, exp: i32 }),\n f16: abstruct({ fract: f16, exp: i32 }),\n abstractFloat: abstruct({ fract: abstractFloat, exp: abstractInt }),\n vec2f: abstruct({ fract: vec2f, exp: vec2i }),\n vec3f: abstruct({ fract: vec3f, exp: vec3i }),\n vec4f: abstruct({ fract: vec4f, exp: vec4i }),\n vec2h: abstruct({ fract: vec2h, exp: vec2i }),\n vec3h: abstruct({ fract: vec3h, exp: vec3i }),\n vec4h: abstruct({ fract: vec4h, exp: vec4i }),\n} as const;\n\ntype FrexpOverload = {\n (value: number): Infer<typeof FrexpResults['f32']>;\n <T extends AnyFloatVecInstance>(\n value: T,\n ): Infer<typeof FrexpResults[T['kind']]>;\n};\n\nexport const frexp: FrexpOverload = createDualImpl(\n // CPU implementation\n (value: number): {\n fract: number;\n exp: number;\n } => {\n throw new MissingCpuImplError(\n 'CPU implementation for frexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n },\n // GPU implementation\n (value) => {\n const returnType =\n FrexpResults[value.dataType.type as keyof typeof FrexpResults];\n\n if (!returnType) {\n throw new Error(\n `Unsupported data type for frexp: ${value.dataType.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`,\n );\n }\n\n return snip(stitch`frexp(${value})`, returnType);\n },\n 'frexp',\n);\n\nfunction cpuInsertBits(\n e: number,\n newbits: number,\n offset: number,\n count: number,\n): number;\nfunction cpuInsertBits<T extends AnyIntegerVecInstance>(\n e: T,\n newbits: T,\n offset: number,\n count: number,\n): T;\nfunction cpuInsertBits<T extends AnyIntegerVecInstance | number>(\n e: T,\n newbits: T,\n offset: number,\n count: number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const insertBits = dualImpl<typeof cpuInsertBits>({\n name: 'insertBits',\n signature: (e, newbits, offset, count) => ({\n argTypes: [e, newbits, u32, u32],\n returnType: e,\n }),\n normalImpl:\n 'CPU implementation for insertBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e, newbits, offset, count) =>\n stitch`insertBits(${e}, ${newbits}, ${offset}, ${count})`,\n});\n\nfunction cpuInverseSqrt(value: number): number;\nfunction cpuInverseSqrt<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuInverseSqrt<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (1 / Math.sqrt(value)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for inverseSqrt on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const inverseSqrt = dualImpl({\n name: 'inverseSqrt',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuInverseSqrt,\n codegenImpl: (value) => stitch`inverseSqrt(${value})`,\n});\n\nfunction cpuLdexp(e1: number, e2: number): number;\nfunction cpuLdexp<T extends v2f | v2h>(e1: T, e2: v2i): T;\nfunction cpuLdexp<T extends v3f | v3h>(e1: T, e2: v3i): T;\nfunction cpuLdexp<T extends v4f | v4h>(e1: T, e2: v4i): T;\nfunction cpuLdexp<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: AnyIntegerVecInstance | number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const ldexp = dualImpl<typeof cpuLdexp>({\n name: 'ldexp',\n signature: (e1, e2) => {\n switch (e1.type) {\n case 'abstractFloat':\n return { argTypes: [abstractFloat, abstractInt], returnType: e1 };\n case 'f32':\n case 'f16':\n return { argTypes: [e1, i32], returnType: e1 };\n case 'vec2f':\n case 'vec2h':\n return { argTypes: [e1, vec2i], returnType: e1 };\n case 'vec3f':\n case 'vec3h':\n return { argTypes: [e1, vec3i], returnType: e1 };\n case 'vec4f':\n case 'vec4h':\n return { argTypes: [e1, vec4i], returnType: e1 };\n default:\n throw new Error(\n `Unsupported data type for ldexp: ${e1.type}. Supported types are abstractFloat, f32, f16, vec2f, vec2h, vec3f, vec3h, vec4f, vec4h.`,\n );\n }\n },\n normalImpl:\n 'CPU implementation for ldexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`ldexp(${e1}, ${e2})`,\n});\n\nfunction cpuLength(value: number): number;\nfunction cpuLength<T extends AnyFloatVecInstance>(value: T): number;\nfunction cpuLength<T extends AnyFloatVecInstance | number>(value: T): number {\n if (typeof value === 'number') {\n return Math.abs(value);\n }\n return VectorOps.length[value.kind](value);\n}\n\nexport const length = dualImpl({\n name: 'length',\n signature: (arg) => ({\n argTypes: [arg],\n returnType: isHalfPrecisionSchema(arg) ? f16 : f32,\n }),\n normalImpl: cpuLength,\n codegenImpl: (arg) => stitch`length(${arg})`,\n});\n\nfunction cpuLog(value: number): number;\nfunction cpuLog<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuLog<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.log(value) as T;\n }\n return VectorOps.log[value.kind](value) as T;\n}\n\nexport const log = dualImpl({\n name: 'log',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuLog,\n codegenImpl: (value) => stitch`log(${value})`,\n});\n\nfunction cpuLog2(value: number): number;\nfunction cpuLog2<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuLog2<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.log2(value) as T;\n }\n return VectorOps.log2[value.kind](value) as T;\n}\n\nexport const log2 = dualImpl({\n name: 'log2',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuLog2,\n codegenImpl: (value) => stitch`log2(${value})`,\n});\n\nfunction cpuMax(a: number, b: number): number;\nfunction cpuMax<T extends NumVec>(a: T, b: T): T;\nfunction cpuMax<T extends NumVec | number>(a: T, b: T): T {\n if (typeof a === 'number') {\n return Math.max(a, b as number) as T;\n }\n return VectorOps.max[a.kind](a, b as NumVec) as T;\n}\n\nexport const max = dualImpl({\n name: 'max',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return ({\n argTypes: uargs,\n returnType: uargs[0],\n });\n },\n normalImpl: cpuMax,\n codegenImpl: (a, b) => stitch`max(${a}, ${b})`,\n});\n\nfunction cpuMin(a: number, b: number): number;\nfunction cpuMin<T extends NumVec>(a: T, b: T): T;\nfunction cpuMin<T extends NumVec | number>(a: T, b: T): T {\n if (typeof a === 'number') {\n return Math.min(a, b as number) as T;\n }\n return VectorOps.min[a.kind](a, b as NumVec) as T;\n}\n\nexport const min = dualImpl({\n name: 'min',\n signature: (...args) => {\n const uargs = unify(args) ?? args;\n return ({\n argTypes: uargs,\n returnType: uargs[0],\n });\n },\n normalImpl: cpuMin,\n codegenImpl: (a, b) => stitch`min(${a}, ${b})`,\n});\n\nfunction cpuMix(e1: number, e2: number, e3: number): number;\nfunction cpuMix<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: number): T;\nfunction cpuMix<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T): T;\nfunction cpuMix<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: T,\n e3: T,\n): T {\n if (typeof e1 === 'number') {\n if (typeof e3 !== 'number' || typeof e2 !== 'number') {\n throw new Error(\n 'When e1 and e2 are numbers, the blend factor must be a number.',\n );\n }\n return (e1 * (1 - e3) + e2 * e3) as T;\n }\n\n if (typeof e1 === 'number' || typeof e2 === 'number') {\n throw new Error('e1 and e2 need to both be vectors of the same kind.');\n }\n\n return VectorOps.mix[e1.kind](e1, e2, e3) as T;\n}\n\nexport const mix = dualImpl({\n name: 'mix',\n signature: (e1, e2, e3) => ({ argTypes: [e1, e2, e3], returnType: e1 }),\n normalImpl: cpuMix,\n codegenImpl: (e1, e2, e3) => stitch`mix(${e1}, ${e2}, ${e3})`,\n});\n\nconst ModfResult = {\n f32: abstruct({ fract: f32, whole: f32 }),\n f16: abstruct({ fract: f16, whole: f16 }),\n abstractFloat: abstruct({ fract: abstractFloat, whole: abstractFloat }),\n vec2f: abstruct({ fract: vec2f, whole: vec2f }),\n vec3f: abstruct({ fract: vec3f, whole: vec3f }),\n vec4f: abstruct({ fract: vec4f, whole: vec4f }),\n vec2h: abstruct({ fract: vec2h, whole: vec2h }),\n vec3h: abstruct({ fract: vec3h, whole: vec3h }),\n vec4h: abstruct({ fract: vec4h, whole: vec4h }),\n} as const;\n\ntype ModfOverload = {\n (value: number): Infer<typeof ModfResult['f32']>;\n <T extends AnyFloatVecInstance>(\n value: T,\n ): Infer<typeof ModfResult[T['kind']]>;\n};\nfunction cpuModf(e: number): Infer<typeof ModfResult['f32']>;\nfunction cpuModf<T extends AnyFloatVecInstance>(\n e: T,\n): Infer<typeof ModfResult[T['kind']]>;\nfunction cpuModf<T extends AnyFloatVecInstance | number>(\n value: T,\n): Infer<typeof ModfResult[keyof typeof ModfResult]> {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const modf: ModfOverload = dualImpl<typeof cpuModf>({\n name: 'modf',\n signature: (e) => {\n const returnType = ModfResult[e.type as keyof typeof ModfResult];\n\n if (!returnType) {\n throw new Error(\n `Unsupported data type for modf: ${e.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`,\n );\n }\n\n return { argTypes: [e], returnType };\n },\n normalImpl:\n 'CPU implementation for modf not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`modf(${value})`,\n});\n\nexport const normalize = dualImpl({\n name: 'normalize',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: <T extends AnyFloatVecInstance>(v: T): T =>\n VectorOps.normalize[v.kind](v),\n codegenImpl: (v) => stitch`normalize(${v})`,\n});\n\nfunction powCpu(base: number, exponent: number): number;\nfunction powCpu<T extends AnyFloatVecInstance>(\n base: T,\n exponent: T,\n): T;\nfunction powCpu<T extends AnyFloatVecInstance | number>(\n base: T,\n exponent: T,\n): T {\n if (typeof base === 'number' && typeof exponent === 'number') {\n return (base ** exponent) as T;\n }\n if (isVecInstance(base) && isVecInstance(exponent)) {\n return VectorOps.pow[base.kind](base, exponent) as T;\n }\n throw new Error('Invalid arguments to pow()');\n}\n\nexport const pow = dualImpl({\n name: 'pow',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return {\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n };\n },\n normalImpl: powCpu,\n codegenImpl: (lhs, rhs) => stitch`pow(${lhs}, ${rhs})`,\n});\nfunction cpuQuantizeToF16(value: number): number;\nfunction cpuQuantizeToF16<T extends AnyFloat32VecInstance>(value: T): T;\nfunction cpuQuantizeToF16<T extends AnyFloat32VecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const quantizeToF16 = dualImpl<typeof cpuQuantizeToF16>({\n name: 'quantizeToF16',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for quantizeToF16 not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`quantizeToF16(${value})`,\n});\n\nfunction cpuRadians(value: number): number;\nfunction cpuRadians<T extends AnyFloatVecInstance | number>(value: T): T;\nfunction cpuRadians<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return ((value * Math.PI) / 180) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for radians on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const radians = dualImpl({\n name: 'radians',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return ({ argTypes: uargs, returnType: uargs[0] });\n },\n normalImpl: cpuRadians,\n codegenImpl: (value) => stitch`radians(${value})`,\n});\n\nexport const reflect = dualImpl({\n name: 'reflect',\n signature: (lhs, rhs) => ({ argTypes: [lhs, rhs], returnType: lhs }),\n normalImpl: <T extends AnyFloatVecInstance>(e1: T, e2: T): T =>\n sub(e1, mul(2 * dot(e2, e1), e2)),\n codegenImpl: (e1, e2) => stitch`reflect(${e1}, ${e2})`,\n});\n\nexport const refract = createDualImpl(\n // CPU implementation\n <T extends AnyFloatVecInstance>(e1: T, e2: T, e3: number): T => {\n throw new MissingCpuImplError(\n 'CPU implementation for refract not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n },\n // GPU implementation\n (e1, e2, e3) => snip(stitch`refract(${e1}, ${e2}, ${e3})`, e1.dataType),\n 'refract',\n (e1, e2, e3) => [\n e1.dataType as AnyWgslData,\n e2.dataType as AnyWgslData,\n isHalfPrecisionSchema(e1) ? f16 : f32,\n ],\n);\nfunction cpuReverseBits(value: number): number;\nfunction cpuReverseBits<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuReverseBits<T extends AnyIntegerVecInstance | number>(value: T): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const reverseBits = dualImpl<typeof cpuReverseBits>({\n name: 'reverseBits',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for reverseBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`reverseBits(${value})`,\n});\n\nfunction cpuRound(value: number): number;\nfunction cpuRound<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuRound<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.round(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for round on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const round = dualImpl({\n name: 'round',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuRound,\n codegenImpl: (value) => stitch`round(${value})`,\n});\n\nfunction cpuSaturate(value: number): number;\nfunction cpuSaturate<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSaturate<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.max(0, Math.min(1, value)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for saturate on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const saturate = dualImpl({\n name: 'saturate',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuSaturate,\n codegenImpl: (value) => stitch`saturate(${value})`,\n});\n\nfunction cpuSign(e: number): number;\nfunction cpuSign<T extends AnySignedVecInstance>(e: T): T;\nfunction cpuSign<T extends AnySignedVecInstance | number>(e: T): T {\n if (typeof e === 'number') {\n return Math.sign(e) as T;\n }\n return VectorOps.sign[e.kind](e) as T;\n}\n\nexport const sign = dualImpl({\n name: 'sign',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuSign,\n codegenImpl: (e) => stitch`sign(${e})`,\n});\n\nfunction cpuSin(value: number): number;\nfunction cpuSin<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSin<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sin(value) as T;\n }\n return VectorOps.sin[value.kind](value) as T;\n}\n\nexport const sin = dualImpl({\n name: 'sin',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuSin,\n codegenImpl: (value) => stitch`sin(${value})`,\n});\n\nfunction cpuSinh(value: number): number;\nfunction cpuSinh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSinh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sinh(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for sinh on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const sinh = dualImpl({\n name: 'sinh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuSinh,\n codegenImpl: (value) => stitch`sinh(${value})`,\n});\n\nfunction cpuSmoothstep(edge0: number, edge1: number, x: number): number;\nfunction cpuSmoothstep<T extends AnyFloatVecInstance>(\n edge0: T,\n edge1: T,\n x: T,\n): T;\nfunction cpuSmoothstep<T extends AnyFloatVecInstance | number>(\n edge0: T,\n edge1: T,\n x: T,\n): T {\n if (typeof x === 'number') {\n return smoothstepScalar(\n edge0 as number,\n edge1 as number,\n x as number,\n ) as T;\n }\n return VectorOps.smoothstep[x.kind](\n edge0 as AnyFloatVecInstance,\n edge1 as AnyFloatVecInstance,\n x as AnyFloatVecInstance,\n ) as T;\n}\n\nexport const smoothstep = dualImpl({\n name: 'smoothstep',\n signature: (edge0, edge1, x) => ({\n argTypes: [edge0, edge1, x],\n returnType: x,\n }),\n normalImpl: cpuSmoothstep,\n codegenImpl: (edge0, edge1, x) =>\n stitch`smoothstep(${edge0}, ${edge1}, ${x})`,\n});\n\nfunction cpuSqrt(value: number): number;\nfunction cpuSqrt<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSqrt<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sqrt(value) as T;\n }\n return VectorOps.sqrt[value.kind](value) as T;\n}\n\nexport const sqrt = dualImpl({\n name: 'sqrt',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuSqrt,\n codegenImpl: (value) => stitch`sqrt(${value})`,\n});\n\nfunction cpuStep(edge: number, x: number): number;\nfunction cpuStep<T extends AnyFloatVecInstance | number>(edge: T, x: T): T;\nfunction cpuStep<T extends AnyFloatVecInstance | number>(edge: T, x: T): T {\n if (typeof edge === 'number') {\n return (edge <= (x as number) ? 1.0 : 0.0) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for step on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const step = dualImpl({\n name: 'step',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return { argTypes: uargs, returnType: uargs[0] };\n },\n normalImpl: cpuStep,\n codegenImpl: (edge, x) => stitch`step(${edge}, ${x})`,\n});\n\nfunction cpuTan(value: number): number;\nfunction cpuTan<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTan<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.tan(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for tan on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const tan = dualImpl({\n name: 'tan',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuTan,\n codegenImpl: (value) => stitch`tan(${value})`,\n});\n\nfunction cpuTanh(value: number): number;\nfunction cpuTanh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTanh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.tanh(value) as T;\n }\n return VectorOps.tanh[value.kind](value) as T;\n}\n\nexport const tanh = dualImpl({\n name: 'tanh',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl: cpuTanh,\n codegenImpl: (value) => stitch`tanh(${value})`,\n});\n\nexport const transpose = dualImpl<<T extends AnyMatInstance>(e: T) => T>({\n name: 'transpose',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for transpose not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e) => stitch`transpose(${e})`,\n});\n\nfunction cpuTrunc(value: number): number;\nfunction cpuTrunc<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTrunc<T extends AnyFloatVecInstance | number>(value: T): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const trunc = dualImpl<typeof cpuTrunc>({\n name: 'trunc',\n signature: (arg) => ({ argTypes: [arg], returnType: arg }),\n normalImpl:\n 'CPU implementation for trunc not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`trunc(${value})`,\n});\n","import * as tinyest from 'tinyest';\nimport { stitch, stitchWithExactTypes } from '../core/resolve/stitch.ts';\nimport { arrayOf } from '../data/array.ts';\nimport {\n type AnyData,\n ConsoleLog,\n InfixDispatch,\n isData,\n isLooseData,\n MatrixColumnsAccess,\n UnknownData,\n} from '../data/dataTypes.ts';\nimport { abstractInt, bool, u32 } from '../data/numeric.ts';\nimport { isSnippet, snip, type Snippet } from '../data/snippet.ts';\nimport * as wgsl from '../data/wgslTypes.ts';\nimport { invariant, ResolutionError, WgslTypeError } from '../errors.ts';\nimport { getName } from '../shared/meta.ts';\nimport { isMarkedInternal } from '../shared/symbols.ts';\nimport { safeStringify } from '../shared/stringify.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { pow } from '../std/numeric.ts';\nimport { add, div, mul, sub } from '../std/operators.ts';\nimport type { FnArgsConversionHint } from '../types.ts';\nimport {\n convertStructValues,\n convertToCommonType,\n tryConvertSnippet,\n} from './conversion.ts';\nimport {\n coerceToSnippet,\n concretize,\n type GenerationCtx,\n getTypeForIndexAccess,\n getTypeForPropAccess,\n numericLiteralToSnippet,\n} from './generationHelpers.ts';\nimport type { ShaderGenerator } from './shaderGenerator.ts';\n\nconst { NodeTypeCatalog: NODE } = tinyest;\n\nconst parenthesizedOps = [\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '|',\n '^',\n '&',\n '&&',\n '||',\n];\n\nconst binaryLogicalOps = ['&&', '||', '==', '!=', '<', '<=', '>', '>='];\n\nconst infixKinds = [\n 'vec2f',\n 'vec3f',\n 'vec4f',\n 'vec2h',\n 'vec3h',\n 'vec4h',\n 'vec2i',\n 'vec3i',\n 'vec4i',\n 'vec2u',\n 'vec3u',\n 'vec4u',\n 'mat2x2f',\n 'mat3x3f',\n 'mat4x4f',\n];\n\nexport const infixOperators = {\n add,\n sub,\n mul,\n div,\n} as const;\n\nexport type InfixOperator = keyof typeof infixOperators;\n\ntype Operator =\n | tinyest.BinaryOperator\n | tinyest.AssignmentOperator\n | tinyest.LogicalOperator\n | tinyest.UnaryOperator;\n\nfunction operatorToType<\n TL extends AnyData | UnknownData,\n TR extends AnyData | UnknownData,\n>(lhs: TL, op: Operator, rhs?: TR): TL | TR | wgsl.Bool {\n if (!rhs) {\n if (op === '!' || op === '~') {\n return bool;\n }\n\n return lhs;\n }\n\n if (binaryLogicalOps.includes(op)) {\n return bool;\n }\n\n if (op === '=') {\n return rhs;\n }\n\n return lhs;\n}\n\nconst opCodeToCodegen = {\n '+': add[$internal].gpuImpl,\n '-': sub[$internal].gpuImpl,\n '*': mul[$internal].gpuImpl,\n '/': div[$internal].gpuImpl,\n '**': pow[$internal].gpuImpl,\n} satisfies Partial<\n Record<tinyest.BinaryOperator, (...args: never[]) => unknown>\n>;\n\nclass WgslGenerator implements ShaderGenerator {\n #ctx: GenerationCtx | undefined = undefined;\n\n public initGenerator(ctx: GenerationCtx) {\n this.#ctx = ctx;\n }\n\n private get ctx(): GenerationCtx {\n if (!this.#ctx) {\n throw new Error(\n 'WGSL Generator has not yet been initialized. Please call initialize(ctx) before using the generator.',\n );\n }\n return this.#ctx;\n }\n\n public block(\n [_, statements]: tinyest.Block,\n ): string {\n this.ctx.pushBlockScope();\n try {\n this.ctx.indent();\n const body = statements.map((statement) => this.statement(statement))\n .join('\\n');\n this.ctx.dedent();\n return `{\n${body}\n${this.ctx.pre}}`;\n } finally {\n this.ctx.popBlockScope();\n }\n }\n\n public blockVariable(\n id: string,\n dataType: wgsl.AnyWgslData | UnknownData,\n ): Snippet {\n const snippet = snip(this.ctx.makeNameValid(id), dataType);\n this.ctx.defineVariable(id, snippet);\n return snippet;\n }\n\n public identifier(id: string): Snippet {\n if (!id) {\n throw new Error('Cannot resolve an empty identifier');\n }\n const res = this.ctx.getById(id);\n\n if (!res) {\n throw new Error(`Identifier ${id} not found`);\n }\n\n return res;\n }\n\n /**\n * A wrapper for `generateExpression` that updates `ctx.expectedType`\n * and tries to convert the result when it does not match the expected type.\n */\n public typedExpression(\n expression: tinyest.Expression,\n expectedType: AnyData,\n ) {\n const prevExpectedType = this.ctx.expectedType;\n this.ctx.expectedType = expectedType;\n\n try {\n const result = this.expression(expression);\n return tryConvertSnippet(result, expectedType);\n } finally {\n this.ctx.expectedType = prevExpectedType;\n }\n }\n\n public expression(\n expression: tinyest.Expression,\n ): Snippet {\n if (typeof expression === 'string') {\n return this.identifier(expression);\n }\n\n if (typeof expression === 'boolean') {\n return snip(expression, bool);\n }\n\n if (\n expression[0] === NODE.logicalExpr ||\n expression[0] === NODE.binaryExpr ||\n expression[0] === NODE.assignmentExpr\n ) {\n // Logical/Binary/Assignment Expression\n const [_, lhs, op, rhs] = expression;\n const lhsExpr = this.expression(lhs);\n const rhsExpr = this.expression(rhs);\n\n const codegen = opCodeToCodegen[op as keyof typeof opCodeToCodegen];\n if (codegen) {\n return codegen(lhsExpr, rhsExpr);\n }\n\n const forcedType = expression[0] === NODE.assignmentExpr\n ? lhsExpr.dataType.type === 'ptr'\n ? [lhsExpr.dataType.inner as AnyData]\n : [lhsExpr.dataType as AnyData]\n : undefined;\n\n const [convLhs, convRhs] =\n convertToCommonType([lhsExpr, rhsExpr], forcedType) ??\n [lhsExpr, rhsExpr];\n\n const lhsStr = this.ctx.resolve(convLhs.value, convLhs.dataType).value;\n const rhsStr = this.ctx.resolve(convRhs.value, convRhs.dataType).value;\n const type = operatorToType(convLhs.dataType, op, convRhs.dataType);\n\n return snip(\n parenthesizedOps.includes(op)\n ? `(${lhsStr} ${op} ${rhsStr})`\n : `${lhsStr} ${op} ${rhsStr}`,\n type,\n );\n }\n\n if (expression[0] === NODE.postUpdate) {\n // Post-Update Expression\n const [_, op, arg] = expression;\n const argExpr = this.expression(arg);\n const argStr = this.ctx.resolve(argExpr.value).value;\n\n return snip(`${argStr}${op}`, argExpr.dataType);\n }\n\n if (expression[0] === NODE.unaryExpr) {\n // Unary Expression\n const [_, op, arg] = expression;\n const argExpr = this.expression(arg);\n const argStr = this.ctx.resolve(argExpr.value).value;\n\n const type = operatorToType(argExpr.dataType, op);\n return snip(`${op}${argStr}`, type);\n }\n\n if (expression[0] === NODE.memberAccess) {\n // Member Access\n const [_, targetNode, property] = expression;\n const target = this.expression(targetNode);\n\n if (target.value === console) {\n return snip(\n new ConsoleLog(property),\n UnknownData,\n );\n }\n\n if (\n infixKinds.includes(target.dataType.type) &&\n property in infixOperators\n ) {\n return {\n value: new InfixDispatch(\n property,\n target,\n infixOperators[property as InfixOperator][$internal].gpuImpl,\n ),\n dataType: UnknownData,\n };\n }\n\n if (target.dataType.type === 'unknown') {\n // No idea what the type is, so we act on the snippet's value and try to guess\n\n // biome-ignore lint/suspicious/noExplicitAny: we're inspecting the value, and it could be any value\n const propValue = (target.value as any)[property];\n\n // We try to extract any type information based on the prop's value\n return coerceToSnippet(propValue);\n }\n\n if (wgsl.isPtr(target.dataType)) {\n return snip(\n `(*${this.ctx.resolve(target.value).value}).${property}`,\n getTypeForPropAccess(target.dataType.inner as AnyData, property),\n );\n }\n\n if (wgsl.isWgslArray(target.dataType) && property === 'length') {\n if (target.dataType.elementCount === 0) {\n // Dynamically-sized array\n return snip(\n `arrayLength(&${this.ctx.resolve(target.value).value})`,\n u32,\n );\n }\n\n return snip(String(target.dataType.elementCount), abstractInt);\n }\n\n if (wgsl.isMat(target.dataType) && property === 'columns') {\n return snip(new MatrixColumnsAccess(target), UnknownData);\n }\n\n if (\n wgsl.isVec(target.dataType) && wgsl.isVecInstance(target.value)\n ) {\n // We're operating on a vector that's known at resolution time\n // biome-ignore lint/suspicious/noExplicitAny: it's probably a swizzle\n return coerceToSnippet((target.value as any)[property]);\n }\n\n return snip(\n `${this.ctx.resolve(target.value).value}.${property}`,\n getTypeForPropAccess(target.dataType, property),\n );\n }\n\n if (expression[0] === NODE.indexAccess) {\n // Index Access\n const [_, targetNode, propertyNode] = expression;\n const target = this.expression(targetNode);\n const property = this.expression(propertyNode);\n const propertyStr =\n this.ctx.resolve(property.value, property.dataType).value;\n\n if (target.value instanceof MatrixColumnsAccess) {\n return snip(\n stitch`${target.value.matrix}[${propertyStr}]`,\n getTypeForIndexAccess(target.value.matrix.dataType as AnyData),\n );\n }\n const targetStr = this.ctx.resolve(target.value, target.dataType).value;\n\n if (target.dataType.type === 'unknown') {\n // No idea what the type is, so we act on the snippet's value and try to guess\n\n if (\n Array.isArray(propertyNode) && propertyNode[0] === NODE.numericLiteral\n ) {\n return coerceToSnippet(\n // biome-ignore lint/suspicious/noExplicitAny: we're inspecting the value, and it could be any value\n (target.value as any)[propertyNode[1] as number],\n );\n }\n\n throw new Error(\n `Cannot index value ${targetStr} of unknown type with index ${propertyStr}`,\n );\n }\n\n if (wgsl.isMat(target.dataType)) {\n throw new Error(\n \"The only way of accessing matrix elements in TGSL is through the 'columns' property.\",\n );\n }\n\n if (wgsl.isPtr(target.dataType)) {\n return snip(\n `(*${targetStr})[${propertyStr}]`,\n getTypeForIndexAccess(target.dataType.inner as AnyData),\n );\n }\n\n return snip(\n `${targetStr}[${propertyStr}]`,\n isData(target.dataType)\n ? getTypeForIndexAccess(target.dataType)\n : UnknownData,\n );\n }\n\n if (expression[0] === NODE.numericLiteral) {\n // Numeric Literal\n const type = typeof expression[1] === 'string'\n ? numericLiteralToSnippet(parseNumericString(expression[1]))\n : numericLiteralToSnippet(expression[1]);\n if (!type) {\n throw new Error(`Invalid numeric literal ${expression[1]}`);\n }\n return type;\n }\n\n if (expression[0] === NODE.call) {\n // Function Call\n const [_, calleeNode, argNodes] = expression;\n const callee = this.expression(calleeNode);\n\n if (wgsl.isWgslStruct(callee.value) || wgsl.isWgslArray(callee.value)) {\n // Struct/array schema call.\n if (argNodes.length > 1) {\n throw new WgslTypeError(\n 'Array and struct schemas should always be called with at most 1 argument',\n );\n }\n\n // No arguments `Struct()`, resolve struct name and return.\n if (!argNodes[0]) {\n // the schema becomes the data type\n return snip(\n `${this.ctx.resolve(callee.value).value}()`,\n callee.value,\n );\n }\n\n const arg = this.typedExpression(\n argNodes[0],\n callee.value,\n );\n\n // Either `Struct({ x: 1, y: 2 })`, or `Struct(otherStruct)`.\n // In both cases, we just let the argument resolve everything.\n return snip(\n this.ctx.resolve(arg.value, callee.value).value,\n callee.value,\n );\n }\n\n if (callee.value instanceof InfixDispatch) {\n // Infix operator dispatch.\n if (!argNodes[0]) {\n throw new WgslTypeError(\n `An infix operator '${callee.value.name}' was called without any arguments`,\n );\n }\n const rhs = this.expression(argNodes[0]);\n return callee.value.operator(callee.value.lhs, rhs);\n }\n\n if (!isMarkedInternal(callee.value)) {\n const args = argNodes.map((arg) => this.expression(arg));\n const shellless = this.ctx.shelllessRepo.get(\n callee.value as (...args: never[]) => unknown,\n args,\n );\n if (shellless) {\n return this.ctx.withResetIndentLevel(() => {\n const snippet = this.ctx.resolve(shellless);\n return snip(stitch`${snippet.value}(${args})`, snippet.dataType);\n });\n }\n\n throw new Error(\n `Function '${\n getName(callee.value) ?? String(callee.value)\n }' is not marked with the 'use gpu' directive and cannot be used in a shader`,\n );\n }\n\n // Other, including tgsl functions, std and vector/matrix schema calls.\n\n const argConversionHint =\n (callee.value[$internal] as Record<string, unknown>)\n ?.argConversionHint as FnArgsConversionHint ?? 'keep';\n try {\n let convertedArguments: Snippet[];\n\n if (Array.isArray(argConversionHint)) {\n // The hint is an array of schemas.\n convertedArguments = argNodes.map((arg, i) => {\n const argType = argConversionHint[i];\n if (!argType) {\n throw new WgslTypeError(\n `Function '${\n getName(callee.value)\n }' was called with too many arguments`,\n );\n }\n return this.typedExpression(arg, argType);\n });\n } else {\n const snippets = argNodes.map((arg) => this.expression(arg));\n\n if (argConversionHint === 'keep') {\n // The hint tells us to do nothing.\n convertedArguments = snippets;\n } else if (argConversionHint === 'unify') {\n // The hint tells us to unify the types.\n convertedArguments = convertToCommonType(snippets) ?? snippets;\n } else {\n // The hint is a function that converts the arguments.\n convertedArguments = argConversionHint(...snippets)\n .map((type, i) => [type, snippets[i] as Snippet] as const)\n .map(([type, sn]) => tryConvertSnippet(sn, type));\n }\n }\n\n if (callee.value instanceof ConsoleLog) {\n return this.ctx.generateLog(callee.value.op, convertedArguments);\n }\n\n // Assuming that `callee` is callable\n const fnRes =\n (callee.value as unknown as (...args: unknown[]) => unknown)(\n ...convertedArguments,\n );\n\n if (!isSnippet(fnRes)) {\n throw new Error(\n 'Functions running in codegen mode must return snippets',\n );\n }\n return fnRes;\n } catch (error) {\n throw new ResolutionError(error, [{\n toString: () => getName(callee.value),\n }]);\n }\n }\n\n if (expression[0] === NODE.objectExpr) {\n // Object Literal\n const obj = expression[1];\n\n const structType = this.ctx.expectedType;\n\n if (!structType || !wgsl.isWgslStruct(structType)) {\n throw new WgslTypeError(\n `No target type could be inferred for object with keys [${\n Object.keys(obj).join(', ')\n }], please wrap the object in the corresponding schema.`,\n );\n }\n\n const entries = Object.fromEntries(\n Object.entries(structType.propTypes).map(([key, value]) => {\n const val = obj[key];\n if (val === undefined) {\n throw new WgslTypeError(\n `Missing property ${key} in object literal for struct ${structType}`,\n );\n }\n const result = this.typedExpression(\n val,\n value as AnyData,\n );\n return [key, result];\n }),\n );\n\n const convertedSnippets = convertStructValues(structType, entries);\n\n return snip(\n stitch`${this.ctx.resolve(structType).value}(${convertedSnippets})`,\n structType,\n );\n }\n\n if (expression[0] === NODE.arrayExpr) {\n const [_, valueNodes] = expression;\n // Array Expression\n const arrType = this.ctx.expectedType;\n let elemType: AnyData;\n let values: Snippet[];\n\n if (wgsl.isWgslArray(arrType)) {\n elemType = arrType.elementType as AnyData;\n // The array is typed, so its elements should be as well.\n values = valueNodes.map((value) =>\n this.typedExpression(value, elemType)\n );\n // Since it's an expected type, we enforce the length\n if (values.length !== arrType.elementCount) {\n throw new WgslTypeError(\n `Cannot create value of type '${arrType}' from an array of length: ${values.length}`,\n );\n }\n } else {\n // The array is not typed, so we try to guess the types.\n const valuesSnippets = valueNodes.map((value) =>\n this.expression(value as tinyest.Expression)\n );\n\n if (valuesSnippets.length === 0) {\n throw new WgslTypeError(\n 'Cannot infer the type of an empty array literal.',\n );\n }\n\n const converted = convertToCommonType(valuesSnippets);\n if (!converted) {\n throw new WgslTypeError(\n 'The given values cannot be automatically converted to a common type. Consider wrapping the array in an appropriate schema',\n );\n }\n\n values = converted;\n elemType = concretize(values[0]?.dataType as wgsl.AnyWgslData);\n }\n\n const arrayType = `array<${\n this.ctx.resolve(elemType).value\n }, ${values.length}>`;\n\n return snip(\n stitch`${arrayType}(${values})`,\n arrayOf[$internal].jsImpl(\n elemType as wgsl.AnyWgslData,\n values.length,\n ) as wgsl.AnyWgslData,\n );\n }\n\n if (expression[0] === NODE.stringLiteral) {\n return snip(expression[1], UnknownData);\n }\n\n if (expression[0] === NODE.preUpdate) {\n throw new Error('Cannot use pre-updates in TGSL.');\n }\n\n assertExhaustive(expression);\n }\n\n public functionDefinition(\n body: tinyest.Block,\n ): string {\n return this.block(body);\n }\n\n public statement(\n statement: tinyest.Statement,\n ): string {\n if (typeof statement === 'string') {\n return `${this.ctx.pre}${\n this.ctx.resolve(this.identifier(statement).value).value\n };`;\n }\n\n if (typeof statement === 'boolean') {\n return `${this.ctx.pre}${statement ? 'true' : 'false'};`;\n }\n\n if (statement[0] === NODE.return) {\n const returnNode = statement[1];\n\n if (returnNode !== undefined) {\n const expectedReturnType = this.ctx.topFunctionReturnType;\n const returnSnippet = expectedReturnType\n ? this.typedExpression(\n returnNode,\n expectedReturnType,\n )\n : this.expression(returnNode);\n\n invariant(\n returnSnippet.dataType.type !== 'unknown',\n 'Return type should be known',\n );\n\n this.ctx.reportReturnType(returnSnippet.dataType);\n return stitch`${this.ctx.pre}return ${returnSnippet};`;\n }\n\n return `${this.ctx.pre}return;`;\n }\n\n if (statement[0] === NODE.if) {\n const [_, condNode, consNode, altNode] = statement;\n const condition = this.typedExpression(condNode, bool);\n\n const consequent = condition.value === false\n ? undefined\n : this.block(blockifySingleStatement(consNode));\n const alternate = condition.value === true || !altNode\n ? undefined\n : this.block(blockifySingleStatement(altNode));\n\n if (condition.value === true) {\n return `${this.ctx.pre}${consequent}`;\n }\n\n if (condition.value === false) {\n return alternate ? `${this.ctx.pre}${alternate}` : '';\n }\n\n if (!alternate) {\n return stitch`${this.ctx.pre}if (${condition}) ${consequent}`;\n }\n\n return stitch`\\\n${this.ctx.pre}if (${condition}) ${consequent}\n${this.ctx.pre}else ${alternate}`;\n }\n\n if (statement[0] === NODE.let || statement[0] === NODE.const) {\n const [_, rawId, rawValue] = statement;\n const eq = rawValue !== undefined ? this.expression(rawValue) : undefined;\n\n if (!eq) {\n throw new Error(\n `Cannot create variable '${rawId}' without an initial value.`,\n );\n }\n\n if (isLooseData(eq.dataType)) {\n throw new Error(\n `Cannot create variable '${rawId}' with loose data type.`,\n );\n }\n\n const snippet = this.blockVariable(\n rawId,\n concretize(eq.dataType as wgsl.AnyWgslData),\n );\n return stitchWithExactTypes`${this.ctx.pre}var ${snippet\n .value as string} = ${eq};`;\n }\n\n if (statement[0] === NODE.block) {\n return this.block(statement);\n }\n\n if (statement[0] === NODE.for) {\n const [_, init, condition, update, body] = statement;\n\n const [initStatement, conditionExpr, updateStatement] = this.ctx\n .withResetIndentLevel(\n () => [\n init ? this.statement(init) : undefined,\n condition ? this.typedExpression(condition, bool) : undefined,\n update ? this.statement(update) : undefined,\n ],\n );\n\n const initStr = initStatement ? initStatement.slice(0, -1) : '';\n const updateStr = updateStatement ? updateStatement.slice(0, -1) : '';\n\n const bodyStr = this.block(blockifySingleStatement(body));\n return stitch`${this.ctx.pre}for (${initStr}; ${conditionExpr}; ${updateStr}) ${bodyStr}`;\n }\n\n if (statement[0] === NODE.while) {\n const [_, condition, body] = statement;\n const condSnippet = this.typedExpression(condition, bool);\n const conditionStr = this.ctx.resolve(condSnippet.value).value;\n\n const bodyStr = this.block(blockifySingleStatement(body));\n return `${this.ctx.pre}while (${conditionStr}) ${bodyStr}`;\n }\n\n if (statement[0] === NODE.continue) {\n return `${this.ctx.pre}continue;`;\n }\n\n if (statement[0] === NODE.break) {\n return `${this.ctx.pre}break;`;\n }\n\n return `${this.ctx.pre}${\n this.ctx.resolve(this.expression(statement).value).value\n };`;\n }\n}\n\nfunction assertExhaustive(value: never): never {\n throw new Error(\n `'${safeStringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nfunction parseNumericString(str: string): number {\n // Hex literals\n if (/^0x[0-9a-f]+$/i.test(str)) {\n return Number.parseInt(str);\n }\n\n // Binary literals\n if (/^0b[01]+$/i.test(str)) {\n return Number.parseInt(str.slice(2), 2);\n }\n\n return Number.parseFloat(str);\n}\n\nfunction blockifySingleStatement(statement: tinyest.Statement): tinyest.Block {\n return typeof statement !== 'object' ||\n statement[0] !== NODE.block\n ? [NODE.block, [statement]]\n : statement;\n}\n\nconst wgslGenerator: WgslGenerator = new WgslGenerator();\nexport default wgslGenerator;\n","import {\n type AnyData,\n isDisarray,\n isUnstruct,\n UnknownData,\n} from '../data/dataTypes.ts';\nimport { mat2x2f, mat3x3f, mat4x4f } from '../data/matrix.ts';\nimport {\n abstractFloat,\n abstractInt,\n bool,\n f16,\n f32,\n i32,\n u32,\n} from '../data/numeric.ts';\nimport { isSnippet, snip, type Snippet } from '../data/snippet.ts';\nimport {\n vec2b,\n vec2f,\n vec2h,\n vec2i,\n vec2u,\n vec3b,\n vec3f,\n vec3h,\n vec3i,\n vec3u,\n vec4b,\n vec4f,\n vec4h,\n vec4i,\n vec4u,\n} from '../data/vector.ts';\nimport {\n type AnyWgslData,\n type F32,\n type I32,\n isMatInstance,\n isNumericSchema,\n isVec,\n isVecInstance,\n isWgslArray,\n isWgslStruct,\n} from '../data/wgslTypes.ts';\nimport { getOwnSnippet, type ResolutionCtx } from '../types.ts';\nimport type { ShelllessRepository } from './shellless.ts';\n\ntype SwizzleableType = 'f' | 'h' | 'i' | 'u' | 'b';\ntype SwizzleLength = 1 | 2 | 3 | 4;\n\nconst swizzleLenToType: Record<\n SwizzleableType,\n Record<SwizzleLength, AnyData>\n> = {\n f: {\n 1: f32,\n 2: vec2f,\n 3: vec3f,\n 4: vec4f,\n },\n h: {\n 1: f16,\n 2: vec2h,\n 3: vec3h,\n 4: vec4h,\n },\n i: {\n 1: i32,\n 2: vec2i,\n 3: vec3i,\n 4: vec4i,\n },\n u: {\n 1: u32,\n 2: vec2u,\n 3: vec3u,\n 4: vec4u,\n },\n b: {\n 1: bool,\n 2: vec2b,\n 3: vec3b,\n 4: vec4b,\n },\n} as const;\n\nconst kindToSchema = {\n vec2f: vec2f,\n vec2h: vec2h,\n vec2i: vec2i,\n vec2u: vec2u,\n 'vec2<bool>': vec2b,\n vec3f: vec3f,\n vec3h: vec3h,\n vec3i: vec3i,\n vec3u: vec3u,\n 'vec3<bool>': vec3b,\n vec4f: vec4f,\n vec4h: vec4h,\n vec4i: vec4i,\n vec4u: vec4u,\n 'vec4<bool>': vec4b,\n mat2x2f: mat2x2f,\n mat3x3f: mat3x3f,\n mat4x4f: mat4x4f,\n} as const;\n\nexport function getTypeForPropAccess(\n targetType: AnyData,\n propName: string,\n): AnyData | UnknownData {\n if (isWgslStruct(targetType) || isUnstruct(targetType)) {\n return targetType.propTypes[propName] as AnyData ?? UnknownData;\n }\n\n if (targetType === bool || isNumericSchema(targetType)) {\n // No props to be accessed here\n return UnknownData;\n }\n\n const propLength = propName.length;\n if (\n isVec(targetType) &&\n propLength >= 1 &&\n propLength <= 4\n ) {\n const swizzleTypeChar = targetType.type.includes('bool')\n ? 'b'\n : (targetType.type[4] as SwizzleableType);\n const swizzleType =\n swizzleLenToType[swizzleTypeChar][propLength as SwizzleLength];\n if (swizzleType) {\n return swizzleType;\n }\n }\n\n return UnknownData;\n}\n\nconst indexableTypeToResult = {\n mat2x2f: vec2f,\n mat3x3f: vec3f,\n mat4x4f: vec4f,\n} as const;\n\nexport function getTypeForIndexAccess(\n dataType: AnyData,\n): AnyData | UnknownData {\n // array\n if (isWgslArray(dataType) || isDisarray(dataType)) {\n return dataType.elementType as AnyData;\n }\n\n // vector\n if (isVec(dataType)) {\n return dataType.primitive;\n }\n\n // matrix\n if (dataType.type in indexableTypeToResult) {\n return indexableTypeToResult[\n dataType.type as keyof typeof indexableTypeToResult\n ];\n }\n\n return UnknownData;\n}\n\nexport function numericLiteralToSnippet(value: number): Snippet {\n if (value >= 2 ** 63 || value < -(2 ** 63)) {\n return snip(value, abstractFloat);\n }\n // WGSL AbstractInt uses 64-bit precision, but JS numbers are only safe up to 2^53 - 1.\n // Warn when values exceed this range to prevent precision loss.\n if (Number.isInteger(value)) {\n if (!Number.isSafeInteger(value)) {\n console.warn(\n `The integer ${value} exceeds the safe integer range and may have lost precision.`,\n );\n }\n return snip(value, abstractInt);\n }\n return snip(value, abstractFloat);\n}\n\nexport function concretize<T extends AnyData>(type: T): T | F32 | I32 {\n if (type.type === 'abstractFloat') {\n return f32;\n }\n\n if (type.type === 'abstractInt') {\n return i32;\n }\n\n return type;\n}\n\nexport function concretizeSnippets(args: Snippet[]): Snippet[] {\n return args.map((snippet) =>\n snip(snippet.value, concretize(snippet.dataType as AnyWgslData))\n );\n}\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n /**\n * Used by `generateTypedExpression` to signal downstream\n * expression resolution what type is expected of them.\n *\n * It is used exclusively for inferring the types of structs and arrays.\n * It is modified exclusively by `generateTypedExpression` function.\n */\n expectedType: AnyData | undefined;\n\n readonly topFunctionReturnType: AnyData | undefined;\n\n indent(): string;\n dedent(): string;\n pushBlockScope(): void;\n popBlockScope(): void;\n generateLog(op: string, args: Snippet[]): Snippet;\n getById(id: string): Snippet | null;\n defineVariable(id: string, snippet: Snippet): void;\n\n /**\n * Types that are used in `return` statements are\n * reported using this function, and used to infer\n * the return type of the owning function.\n */\n reportReturnType(dataType: AnyData): void;\n\n readonly shelllessRepo: ShelllessRepository;\n};\n\nexport function coerceToSnippet(value: unknown): Snippet {\n if (isSnippet(value)) {\n // Already a snippet\n return value;\n }\n\n // Maybe the value can tell us what snippet it is\n const ownSnippet = getOwnSnippet(value);\n if (ownSnippet) {\n return ownSnippet;\n }\n\n if (isVecInstance(value) || isMatInstance(value)) {\n return snip(value, kindToSchema[value.kind]);\n }\n\n if (\n typeof value === 'string' || typeof value === 'function' ||\n typeof value === 'object' || typeof value === 'symbol' ||\n typeof value === 'undefined' || value === null\n ) {\n // Nothing representable in WGSL as-is, so unknown\n return snip(value, UnknownData);\n }\n\n if (typeof value === 'number') {\n return numericLiteralToSnippet(value);\n }\n\n if (typeof value === 'boolean') {\n return snip(value, bool);\n }\n\n return snip(value, UnknownData);\n}\n"],"mappings":"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LL,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAChBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EAClBpB,EAAG,CAAC,EAAE,EAAIoB,EAAG,CAAC,EAAE,EACdpB,EAAG,CAAC,EAAE,EAAIoB,EAAG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","names":["MatBase","createMatSchema","options","construct","createDualImpl","args","elements","arg","i","snip","stitch","schema","identityFunctions","translation4","scaling4","rotationX4","rotationY4","rotationZ4","mat2x2Impl","$internal","value","$resolve","_","mat2x2f","mat2x2fImpl","e0","e1","vec2f","mat3x3Impl","mat3x3f","mat3x3fImpl","x","y","z","vec3f","mat4x4Impl","mat4x4f","mat4x4fImpl","w","vec4f","identity2","identity3","identity4","vector","v","a","matToArray","mat","idx","sampler","$internal","$repr","comparisonSampler","isWgslSampler","value","isWgslComparisonSampler","textureDescriptorToSchema","desc","textureMultisampled2d","texture1d","texture2d","texture2dArray","texture3d","textureCube","textureCubeArray","textureStorage1d","textureStorage2d","textureStorage2dArray","textureStorage3d","createTexture","type","props","sampleTypes","$internal","$repr","createStorageTexture","textureCache","accessModeMap","getOrCreate","key","factory","cached","sampleType","actualSampleType","f32","format","access","actualAccess","textureDepth2d","textureDepthMultisampled2d","textureDepth2dArray","textureDepthCube","textureDepthCubeArray","textureExternal","isWgslTexture","value","isWgslStorageTexture","atomic","data","AtomicImpl","inner","$internal","smoothstepScalar","edge0","edge1","x","t","clamp","value","low","high","divInteger","lhs","rhs","bitcastU32toF32Impl","n","dataView","bitcastU32toI32Impl","vec2b","$internal","vec2f","vec2h","vec2i","vec2u","vec3b","vec3f","vec3h","vec3i","vec3u","vec4b","vec4f","vec4h","vec4i","vec4u","lengthVec2","v","lengthVec3","lengthVec4","dotVec2","lhs","rhs","dotVec3","dotVec4","unary2f","op","a","unary2h","unary2i","unary2u","unary3f","unary3h","unary3i","unary3u","unary4f","unary4h","unary4i","unary4u","unary2x2f","a_","mat2x2f","unary3x3f","mat3x3f","unary4x4f","mat4x4f","binaryComponentWise2f","b","binaryComponentWise2h","binaryComponentWise2i","binaryComponentWise2u","binaryComponentWise3f","binaryComponentWise3h","binaryComponentWise3i","binaryComponentWise3u","binaryComponentWise4f","binaryComponentWise4h","binaryComponentWise4i","binaryComponentWise4u","binaryComponentWise2x2f","b_","binaryComponentWise3x3f","binaryComponentWise4x4f","ternaryComponentWise2f","c","ternaryComponentWise2h","ternaryComponentWise3f","ternaryComponentWise3h","ternaryComponentWise4f","ternaryComponentWise4h","VectorOps","e1","e2","low","high","clamp","smoothstepScalar","e","s","m","m_","divInteger","len","base","exponent","e3","val","value","n","f","bitcastU32toF32Impl","bitcastU32toI32Impl","cpuAdd","lhs","rhs","isVecInstance","VectorOps","isMatInstance","add","dualImpl","args","uargs","unify","isNumericSchema","stitch","cpuSub","cpuMul","sub","isFloat32VecInstance","mul","returnType","cpuDiv","schema","vecTypeToConstructor","$internal","div","f32","f16","abstractFloat","stitchWithExactTypes","mod","a","b","cpuNeg","value","neg","arg","cpuAbs","value","VectorOps","abs","dualImpl","arg","stitch","cpuAcos","acos","cpuAcosh","acosh","cpuAsin","asin","cpuAsinh","asinh","cpuAtan","atan","cpuAtanh","atanh","cpuAtan2","y","x","atan2","args","uargs","unify","f32","f16","abstractFloat","cpuCeil","ceil","cpuClamp","low","high","clamp","cpuCos","cos","cpuCosh","cosh","countLeadingZeros","dualImpl","arg","value","stitch","countOneBits","dualImpl","arg","value","stitch","countTrailingZeros","dualImpl","arg","value","stitch","cross","lhs","rhs","a","b","VectorOps","cpuDegrees","MissingCpuImplError","degrees","determinant","f32","cpuDistance","length","sub","distance","isHalfPrecisionSchema","f16","dot","e1","e2","dot4U8Packed","u32","dot4I8Packed","i32","cpuExp","exp","cpuExp2","exp2","extractBits","dualImpl","arg","offset","count","u32","stitch","faceForward","arg1","arg2","arg3","e1","e2","e3","firstLeadingBit","dualImpl","arg","value","stitch","firstTrailingBit","dualImpl","arg","value","stitch","cpuFloor","VectorOps","floor","argTypes","cpuFma","e1","e2","e3","MissingCpuImplError","fma","arg1","arg2","arg3","cpuFract","fract","a","FrexpResults","abstruct","f32","i32","f16","abstractFloat","abstractInt","vec2f","vec2i","vec3f","vec3i","vec4f","vec4i","vec2h","vec3h","vec4h","frexp","createDualImpl","returnType","snip","insertBits","dualImpl","newbits","offset","count","u32","stitch","cpuInverseSqrt","value","MissingCpuImplError","inverseSqrt","arg","ldexp","dualImpl","e1","e2","abstractFloat","abstractInt","i32","vec2i","vec3i","vec4i","stitch","cpuLength","value","VectorOps","length","arg","isHalfPrecisionSchema","f16","f32","cpuLog","log","cpuLog2","log2","cpuMax","a","b","max","args","uargs","unify","cpuMin","min","cpuMix","e3","mix","ModfResult","abstruct","vec2f","vec3f","vec4f","vec2h","vec3h","vec4h","modf","dualImpl","returnType","ModfResult","value","stitch","normalize","arg","v","VectorOps","powCpu","base","exponent","isVecInstance","pow","args","uargs","unify","f32","f16","abstractFloat","isNumericSchema","lhs","rhs","quantizeToF16","dualImpl","arg","value","stitch","cpuRadians","MissingCpuImplError","radians","args","uargs","unify","f32","f16","abstractFloat","reflect","lhs","rhs","e1","e2","sub","mul","dot","refract","createDualImpl","e3","snip","isHalfPrecisionSchema","reverseBits","dualImpl","arg","value","stitch","cpuRound","MissingCpuImplError","round","cpuSaturate","saturate","cpuSign","VectorOps","sign","cpuSin","sin","cpuSinh","sinh","cpuSmoothstep","edge0","edge1","x","smoothstepScalar","smoothstep","cpuSqrt","sqrt","cpuStep","edge","step","args","uargs","unify","f32","f16","abstractFloat","cpuTan","tan","cpuTanh","tanh","transpose","trunc","dualImpl","arg","value","stitch","tinyest","swizzleLenToType","f32","vec2f","vec3f","vec4f","f16","vec2h","vec3h","vec4h","i32","vec2i","vec3i","vec4i","u32","vec2u","vec3u","vec4u","bool","vec2b","vec3b","vec4b","kindToSchema","mat2x2f","mat3x3f","mat4x4f","getTypeForPropAccess","targetType","propName","isWgslStruct","isUnstruct","UnknownData","isNumericSchema","propLength","isVec","swizzleTypeChar","swizzleType","indexableTypeToResult","getTypeForIndexAccess","dataType","isWgslArray","isDisarray","numericLiteralToSnippet","value","snip","abstractFloat","abstractInt","concretize","type","concretizeSnippets","args","snippet","coerceToSnippet","isSnippet","ownSnippet","getOwnSnippet","isVecInstance","isMatInstance","NODE","tinyest","parenthesizedOps","binaryLogicalOps","infixKinds","infixOperators","add","sub","mul","div","operatorToType","lhs","op","rhs","bool","opCodeToCodegen","$internal","pow","WgslGenerator","#ctx","ctx","_","statements","body","statement","id","dataType","snippet","snip","res","expression","expectedType","prevExpectedType","result","tryConvertSnippet","lhsExpr","rhsExpr","codegen","forcedType","convLhs","convRhs","convertToCommonType","lhsStr","rhsStr","type","arg","argExpr","argStr","targetNode","property","target","ConsoleLog","UnknownData","InfixDispatch","propValue","coerceToSnippet","isPtr","getTypeForPropAccess","isWgslArray","u32","abstractInt","isMat","MatrixColumnsAccess","isVec","isVecInstance","propertyNode","propertyStr","stitch","getTypeForIndexAccess","targetStr","isData","numericLiteralToSnippet","parseNumericString","calleeNode","argNodes","callee","isWgslStruct","WgslTypeError","isMarkedInternal","args","shellless","getName","argConversionHint","convertedArguments","i","argType","snippets","sn","fnRes","isSnippet","error","ResolutionError","obj","structType","entries","key","value","val","convertedSnippets","convertStructValues","valueNodes","arrType","elemType","values","valuesSnippets","converted","concretize","arrayType","arrayOf","assertExhaustive","returnNode","expectedReturnType","returnSnippet","invariant","condNode","consNode","altNode","condition","consequent","blockifySingleStatement","alternate","rawId","rawValue","eq","isLooseData","stitchWithExactTypes","init","update","initStatement","conditionExpr","updateStatement","initStr","updateStr","bodyStr","condSnippet","conditionStr","safeStringify","str","wgslGenerator","wgslGenerator_default"]}
|