typegpu 0.1.3 → 0.2.0-alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -1
- package/chunk-5EPBCOO4.js +8 -0
- package/chunk-5EPBCOO4.js.map +1 -0
- package/chunk-SBJR5ZQJ.cjs +8 -0
- package/chunk-SBJR5ZQJ.cjs.map +1 -0
- package/data/index.cjs +1 -7
- package/data/index.cjs.map +1 -1
- package/data/index.d.cts +476 -43
- package/data/index.d.ts +476 -43
- package/data/index.js +1 -7
- package/data/index.js.map +1 -1
- package/index.cjs +51 -1
- package/index.cjs.map +1 -1
- package/index.d.cts +288 -6
- package/index.d.ts +288 -6
- package/index.js +51 -1
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/{tgpuBuffer-BVk2wCHR.d.cts → types-qmW7FFqN.d.cts} +452 -113
- package/{tgpuBuffer-BVk2wCHR.d.ts → types-qmW7FFqN.d.ts} +452 -113
- package/chunk-2FWG5LPQ.js +0 -2
- package/chunk-2FWG5LPQ.js.map +0 -1
- package/chunk-7EYKOUWH.cjs +0 -2
- package/chunk-7EYKOUWH.cjs.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/data/std140.ts","../src/errors.ts","../src/data/numeric.ts","../src/gpuMode.ts","../src/data/struct.ts","../src/tgpuIdentifier.ts","../src/builtinIdentifiers.ts","../src/types.ts","../src/tgpuCode.ts","../src/data/alignIO.ts","../src/data/array.ts","../src/mathUtils.ts","../src/data/attributes.ts","../src/data/vector.ts","../src/data/matrix.ts","../src/data/vertexFormatData.ts","../src/data/pointer.ts","../src/data/atomic.ts"],"names":["MaxValue","Measurer","Schema","ResolutionError","_ResolutionError","cause","trace","entries","ancestor","newTrace","MissingSlotValueError","_MissingSlotValueError","slot","RecursiveDataTypeError","_RecursiveDataTypeError","NotUniformError","_NotUniformError","value","_a","SimpleTgpuData","schema","byteAlignment","code","__publicField","output","input","measurer","ctx","TB","gpuDepth","onGPU","callback","inGPUMode","primitiveNumeric","reference","prop","bool","u32Cast","v","u32","i32Cast","i32","f32Cast","f32","identifier","TgpuIdentifierImpl","label","builtinNames","builtinSymbolToName","name","builtinNameToSymbol","s","n","identifierMap","nameForBuiltin","key","idForBuiltin","id","UnknownData","isResolvable","isWgsl","isSamplerType","type","isDepthTextureType","isExternalTextureType","isDataLoose","data","isDataNotLoose","isGPUBuffer","isSlot","strings","params","segments","string","idx","param","TgpuCodeImpl","result","eventual","BoundTgpuCodeImpl","_BoundTgpuCodeImpl","_innerFn","_slotValuePair","_b","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","roundUp","modulo","invBitMask","attribute","attrib","isDecorated","DecoratedImpl","isLooseDecorated","LooseDecoratedImpl","align","alignment","size","location","getCustomAlignment","getAttributesString","field","BaseDecoratedImpl","inner","attributes","_c","_d","a","_","beginning","arrayOf","elementType","count","TgpuArrayImpl","looseArrayOf","TgpuLooseArrayImpl","isArraySchema","isLooseArraySchema","elementCount","i","elements","elementTypeResolved","arrayType","struct","properties","TgpuStructImpl","looseStruct","TgpuLooseStructImpl","isStructSchema","isLooseStructSchema","generateField","b","property","structMeasurer","maxing","ident","makeVecSchema","options","VecSchema","element","_value","_reference","_prop","args","values","vec2Impl","x","y","vec2fImpl","_vec2fImpl","z","vec3fImpl","w","vec4fImpl","vec2iImpl","_vec2iImpl","vec3iImpl","vec4iImpl","vec2uImpl","_vec2uImpl","vec3uImpl","vec4uImpl","vec3Impl","_vec3fImpl","_vec3iImpl","_vec3uImpl","vec4Impl","_vec4fImpl","_vec4iImpl","_vec4uImpl","vecProxyHandler","target","targetAsVec4","char","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","createMatSchema","MatSchema","col","columns","c","arg","mat2x2Impl","__yieldStar","mat2x2fImpl","e0","e1","mat3x3Impl","mat3x3fImpl","mat4x4Impl","mat4x4fImpl","mat2x2f","mat3x3f","v0","v1","v2","mat4x4f","v3","BufferReader","TgpuVertexFormatDataImpl","kind","formatToWGSLType","normalizedToIsSigned","elementSize","writeSizedVector","readBuffer","readView","vector","primitive","vectorKindToPrimitive","reader","readSizedPrimitive","isSigned","entry","writeSizedPrimitive","floatSigned","buffer","view","writef8","asInt","writef16","setter","readf8","readf16","getter","uint8x2","uint8x4","sint8x2","sint8x4","unorm8x2","unorm8x4","snorm8x2","snorm8x4","uint16x2","uint16x4","sint16x2","sint16x4","unorm16x2","unorm16x4","snorm16x2","snorm16x4","float16x2","float16x4","float32","float32x2","float32x3","float32x4","uint32","uint32x2","uint32x3","uint32x4","sint32","sint32x2","sint32x3","sint32x4","unorm10_10_10_2","ptr","pointsTo","atomic","AtomicImpl","isAtomicSchema","innerData"],"mappings":"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","sourcesContent":["/*\n * Typed-binary types that adhere to the `std140` layout rules.\n */\n\nimport {\n type AnySchema,\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\n\nexport class SimpleTgpuData<TSchema extends AnySchema>\n extends Schema<Unwrap<TSchema>>\n implements TgpuData<Unwrap<TSchema>>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly expressionCode: string;\n\n private readonly _innerSchema: TSchema;\n public readonly isLoose = false as const;\n public readonly label?: string | undefined;\n\n /**\n * byteAlignment has to be a power of 2\n */\n constructor({\n schema,\n byteAlignment,\n code,\n }: {\n schema: TSchema;\n byteAlignment: number;\n code: string;\n }) {\n super();\n\n this._innerSchema = schema;\n this.byteAlignment = byteAlignment;\n this.expressionCode = code;\n this.size = this.measure(MaxValue).size;\n this.label = code;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this._innerSchema.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n this._innerSchema.measure(value, measurer);\n\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return this.expressionCode;\n }\n}\n","import type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyTgpuData, TgpuResolvable, TgpuSlot } from './types';\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: TgpuResolvable[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(`Resolution of the following tree failed: \\n${entries.join('\\n')}`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: TgpuResolvable): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: TgpuSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class RecursiveDataTypeError extends Error {\n constructor() {\n super('Recursive types are not supported in WGSL');\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RecursiveDataTypeError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotUniformError extends Error {\n constructor(value: TgpuBuffer<AnyTgpuData>) {\n super(\n `Buffer '${value.label ?? '<unnamed>'}' is not bindable as a uniform. Use .$usage(tgu.Uniform) to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotUniformError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotStorageError extends Error {\n constructor(value: TgpuBuffer<AnyTgpuData>) {\n super(\n `Buffer '${value.label ?? '<unnamed>'}' is not bindable as storage. Use .$usage(tgu.Storage) to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotStorageError.prototype);\n }\n}\n\nexport class MissingLinksError extends Error {\n constructor(fnLabel: string | undefined, externalNames: string[]) {\n super(\n `The function '${fnLabel ?? '<unnamed>'}' is missing links to the following external values: ${externalNames}.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingLinksError.prototype);\n }\n}\n","import * as TB from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { inGPUMode } from '../gpuMode';\nimport type { TgpuData } from '../types';\nimport { SimpleTgpuData } from './std140';\n\nconst primitiveNumeric = <TKind extends string>(\n schema: TB.Uint32Schema | TB.Float32Schema | TB.Int32Schema,\n code: TKind,\n) => {\n return {\n // Type-token, not available at runtime\n __unwrapped: undefined as unknown as number,\n\n isLoose: false as const,\n kind: code,\n size: 4,\n byteAlignment: 4,\n expressionCode: code,\n\n write(output: TB.ISerialOutput, value: number): void {\n schema.write(output, value);\n },\n\n read(input: TB.ISerialInput): number {\n return schema.read(input);\n },\n\n measure(\n value: number | TB.MaxValue,\n measurer: TB.IMeasurer = new TB.Measurer(),\n ): TB.IMeasurer {\n schema.measure(value, measurer);\n return measurer;\n },\n\n resolveReferences(ctx: TB.IRefResolver): void {\n throw new RecursiveDataTypeError();\n },\n\n seekProperty(\n reference: number | TB.MaxValue,\n prop: never,\n ): { bufferOffset: number; schema: TB.ISchema<unknown> } | null {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return code;\n },\n\n toString(): string {\n return code;\n },\n };\n};\n\n/**\n * Boolean schema representing a single WGSL bool value.\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport type Bool = TgpuData<boolean>;\n/**\n * A schema that represents a boolean value. (equivalent to `bool` in WGSL)\n */\nexport const bool: Bool = new SimpleTgpuData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\n\n/**\n * Unsigned 32-bit integer schema representing a single WGSL u32 value.\n */\nexport type U32 = TgpuData<number> & { kind: 'u32' } & ((\n v: number | boolean,\n ) => number);\nconst u32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `u32(${v})` as unknown as number;\n }\n\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < 0 || v > 0xffffffff) {\n console.warn(`u32 value ${v} overflowed`);\n }\n const value = v & 0xffffffff;\n return value >>> 0;\n }\n return Math.max(0, Math.min(0xffffffff, Math.floor(v)));\n};\n/**\n * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)\n *\n * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = u32(3.14); // 3\n * @example\n * const value = u32(-1); // 4294967295\n * @example\n * const value = u32(-3.1); // 0\n */\nexport const u32: U32 = Object.assign(u32Cast, primitiveNumeric(TB.u32, 'u32'));\n\n/**\n * Signed 32-bit integer schema representing a single WGSL i32 value.\n */\nexport type I32 = TgpuData<number> & { kind: 'i32' } & ((\n v: number | boolean,\n ) => number);\nconst i32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `i32(${v})` as unknown as number;\n }\n\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < -0x80000000 || v > 0x7fffffff) {\n console.warn(`i32 value ${v} overflowed`);\n }\n const value = v | 0;\n return value & 0xffffffff;\n }\n // round towards zero\n const value = v < 0 ? Math.ceil(v) : Math.floor(v);\n return Math.max(-0x80000000, Math.min(0x7fffffff, value));\n};\n/**\n * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)\n *\n * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = i32(3.14); // 3\n * @example\n * const value = i32(-3.9); // -3\n * @example\n * const value = i32(10000000000) // 1410065408\n */\nexport const i32: I32 = Object.assign(i32Cast, primitiveNumeric(TB.i32, 'i32'));\n\n/**\n * 32-bit float schema representing a single WGSL f32 value.\n */\nexport type F32 = TgpuData<number> & { kind: 'f32' } & ((\n v: number | boolean,\n ) => number);\nconst f32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `f32(${v})` as unknown as number;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return v;\n};\n/**\n * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)\n *\n * Can also be called to cast a value to an f32.\n *\n * @example\n * const value = f32(true); // 1\n */\nexport const f32: F32 = Object.assign(f32Cast, primitiveNumeric(TB.f32, 'f32'));\n","let gpuDepth = 0;\n\nexport function onGPU<T>(callback: () => T): T {\n gpuDepth++;\n try {\n return callback();\n } finally {\n gpuDepth--;\n }\n}\n\nexport const inGPUMode = () => gpuDepth > 0;\n","import {\n type IMeasurer,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type UnwrapRecord,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { TgpuNamable } from '../namable';\nimport { code } from '../tgpuCode';\nimport { identifier } from '../tgpuIdentifier';\nimport type {\n AnyTgpuData,\n AnyTgpuLooseData,\n ResolutionCtx,\n TgpuData,\n TgpuLooseData,\n} from '../types';\nimport alignIO from './alignIO';\nimport { isArraySchema } from './array';\nimport { getAttributesString } from './attributes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBaseStruct<TProps extends Record<string, unknown>>\n extends ISchema<UnwrapRecord<TProps>> {\n readonly properties: TProps;\n}\n\n/**\n * Struct schema constructed via `d.struct` function.\n *\n * Responsible for handling reading and writing struct values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its members.\n */\nexport interface TgpuStruct<TProps extends Record<string, AnyTgpuData>>\n extends TgpuBaseStruct<TProps>,\n TgpuData<UnwrapRecord<TProps>>,\n TgpuNamable {}\n\n/**\n * Creates a struct schema that can be used to construct GPU buffers.\n * Ensures proper alignment and padding of properties (as opposed to a `d.looseStruct` schema).\n * The order of members matches the passed in properties object.\n *\n * @example\n * const CircleStruct = d.struct({ radius: d.f32, pos: d.vec3f });\n *\n * @param properties Record with `string` keys and `TgpuData` values,\n * each entry describing one struct member.\n */\nexport const struct = <TProps extends Record<string, AnyTgpuData>>(\n properties: TProps,\n): TgpuStruct<TProps> => new TgpuStructImpl(properties);\n\n/**\n * Struct schema constructed via `d.looseStruct` function.\n *\n * Useful for defining vertex buffers, as the standard layout restrictions do not apply.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface TgpuLooseStruct<\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n> extends TgpuBaseStruct<TProps>,\n TgpuLooseData<UnwrapRecord<TProps>> {}\n\n/**\n * Creates a loose struct schema that can be used to construct vertex buffers.\n * Describes structs with members of both loose and non-loose types.\n *\n * The order of members matches the passed in properties object.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const CircleStruct = d.looseStruct({ radius: d.f32, pos: d.vec3f }); // packed struct with no padding\n *\n * @example\n * const CircleStruct = d.looseStruct({ radius: d.f32, pos: d.align(16, d.vec3f) });\n *\n * @param properties Record with `string` keys and `TgpuData` or `TgpuLooseData` values,\n * each entry describing one struct member.\n */\nexport const looseStruct = <\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n>(\n properties: TProps,\n): TgpuLooseStruct<TProps> => new TgpuLooseStructImpl(properties);\n\n/**\n * Checks whether passed in value is a struct schema,\n * as opposed to, e.g., a looseStruct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas looseStruct schemas cannot.\n *\n * @example\n * isStructSchema(d.struct({ a: d.u32 })) // true\n * isStructSchema(d.looseStruct({ a: d.u32 })) // false\n * isStructSchema(d.vec3f) // false\n */\nexport function isStructSchema<\n T extends TgpuStruct<Record<string, AnyTgpuData>>,\n>(schema: T | unknown): schema is T {\n return schema instanceof TgpuStructImpl;\n}\n\n/**\n * Checks whether passed in value is a looseStruct schema,\n * as opposed to, e.g., a struct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas looseStruct schemas cannot. Loose structs are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isLooseStructSchema(d.struct({ a: d.u32 })) // false\n * isLooseStructSchema(d.looseStruct({ a: d.u32 })) // true\n * isLooseStructSchema(d.vec3f) // false\n */\nexport function isLooseStructSchema<\n T extends TgpuLooseStruct<Record<string, AnyTgpuData | AnyTgpuLooseData>>,\n>(schema: T | unknown): schema is T {\n return schema instanceof TgpuLooseStructImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction generateField([key, field]: [string, AnyTgpuData]) {\n return code` ${getAttributesString(field)}${key}: ${field},\\n`;\n}\n\nclass TgpuStructImpl<TProps extends Record<string, AnyTgpuData>>\n extends Schema<UnwrapRecord<TProps>>\n implements TgpuData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n\n private _size: number;\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n public readonly isRuntimeSized: boolean;\n\n constructor(public readonly properties: TProps) {\n super();\n\n this.byteAlignment = Object.values(properties)\n .map((prop) => prop.byteAlignment)\n .reduce((a, b) => (a > b ? a : b));\n\n this._size = this.measure(MaxValue).size;\n this.isRuntimeSized = Number.isNaN(this._size);\n }\n\n get size(): number {\n if (this.isRuntimeSized) {\n throw new Error(\n 'Cannot get size of struct with runtime sized properties',\n );\n }\n return this._size;\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n if (this.isRuntimeSized) {\n throw new Error('Cannot write struct with runtime sized properties');\n }\n alignIO(output, this.byteAlignment);\n\n for (const [key, property] of Object.entries(this.properties)) {\n alignIO(output, property.byteAlignment);\n property.write(output, value[key]);\n }\n\n alignIO(output, this.byteAlignment);\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n if (this.isRuntimeSized) {\n throw new Error('Cannot read struct with runtime sized properties');\n }\n alignIO(input, this.byteAlignment);\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(this.properties)) {\n alignIO(input, property.byteAlignment);\n result[key] = property.read(input);\n }\n\n alignIO(input, this.byteAlignment);\n return result as Parsed<UnwrapRecord<TProps>>;\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n let structMeasurer = measurer;\n alignIO(structMeasurer, this.byteAlignment);\n\n const maxing = value === MaxValue;\n for (const [key, property] of Object.entries(this.properties)) {\n if (structMeasurer.isUnbounded) {\n throw new Error('Only the last property of a struct can be unbounded');\n }\n\n alignIO(structMeasurer, property.byteAlignment);\n structMeasurer = property.measure(\n maxing ? MaxValue : value[key],\n structMeasurer,\n );\n\n if (structMeasurer.isUnbounded && !isArraySchema(property)) {\n throw new Error('Cannot nest unbounded struct within another struct');\n }\n }\n\n alignIO(structMeasurer, this.byteAlignment);\n return structMeasurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n\n ctx.addDeclaration(code`\nstruct ${ident} {\n${Object.entries(this.properties).map(generateField)}\\\n}\n`);\n\n return ctx.resolve(ident);\n }\n}\n\nclass TgpuLooseStructImpl<\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n >\n extends Schema<UnwrapRecord<TProps>>\n implements TgpuLooseData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n\n public readonly byteAlignment = 1;\n public readonly isLoose = true as const;\n public readonly size: number;\n\n constructor(public readonly properties: TProps) {\n super();\n this.size = this.measure(MaxValue).size;\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n for (const [key, property] of Object.entries(this.properties)) {\n property.write(output, value[key]);\n }\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(this.properties)) {\n result[key] = property.read(input);\n }\n\n return result as Parsed<UnwrapRecord<TProps>>;\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n const maxing = value === MaxValue;\n for (const [key, property] of Object.entries(this.properties)) {\n property.measure(maxing ? MaxValue : value[key], measurer);\n }\n\n return measurer;\n }\n}\n","import type { TgpuNamable } from './namable';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport function identifier() {\n return new TgpuIdentifierImpl();\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuIdentifierImpl implements TgpuResolvable, TgpuNamable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n","import { identifier } from './tgpuIdentifier';\nimport type { TgpuIdentifier } from './types';\n\nexport const builtinNames = [\n 'vertex_index',\n 'instance_index',\n 'position',\n 'clip_distances',\n 'front_facing',\n 'frag_depth',\n 'sample_index',\n 'sample_mask',\n 'fragment',\n 'local_invocation_id',\n 'local_invocation_index',\n 'global_invocation_id',\n 'workgroup_id',\n 'num_workgroups',\n] as const;\n\nexport type BuiltinName = (typeof builtinNames)[number];\n\nexport const builtinSymbolToName = new Map(\n builtinNames.map((name) => [Symbol(name), name]),\n);\n\nexport const builtinNameToSymbol = new Map(\n Array.from(builtinSymbolToName).map(([s, n]) => [n, s]),\n);\n\nconst identifierMap = new Map<symbol, TgpuIdentifier>();\n\nexport function nameForBuiltin(key: symbol): string {\n const name = builtinSymbolToName.get(key);\n if (!name) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return name;\n}\n\nexport function idForBuiltin(key: symbol) {\n let id = identifierMap.get(key);\n\n if (id === undefined) {\n id = identifier().$name(builtinSymbolToName.get(key));\n identifierMap.set(key, id);\n }\n\n return id;\n}\n","import type { ISchema, Unwrap } from 'typed-binary';\nimport type { TgpuBuffer } from './core/buffer/buffer';\nimport type { TgpuBufferUsage } from './core/buffer/bufferUsage';\nimport type { TgpuFnShellBase } from './core/function/fnCore';\nimport type { TgpuNamable } from './namable';\nimport type { Block } from './smol';\n\nexport type Wgsl = string | number | TgpuResolvable | symbol | boolean;\n\nexport const UnknownData = Symbol('Unknown data type');\nexport type UnknownData = typeof UnknownData;\n\nexport type Resource = {\n value: unknown;\n dataType: AnyTgpuData | UnknownData;\n};\n\nexport type TgpuShaderStage = 'compute' | 'vertex' | 'fragment';\n\nexport interface NumberArrayView {\n readonly length: number;\n [n: number]: number;\n}\n\n/**\n * Removes properties from record type that extend `Prop`\n */\nexport type OmitProps<T extends Record<string, unknown>, Prop> = Pick<\n T,\n {\n [Key in keyof T]: T[Key] extends Prop ? never : Key;\n }[keyof T]\n>;\n\n/**\n * Passed into each resolvable item. All sibling items share a resolution ctx,\n * and a new resolution ctx is made when going down each level in the tree.\n */\nexport interface ResolutionCtx {\n addDeclaration(item: TgpuResolvable): void;\n addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;\n addRenderResource(\n resource: TgpuRenderResource,\n identifier: TgpuIdentifier,\n ): void;\n addBuiltin(builtin: symbol): void;\n nameFor(token: TgpuResolvable): string;\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n };\n fnToWgsl(\n // biome-ignore lint/suspicious/noExplicitAny: <no need for generic magic>\n shell: TgpuFnShellBase<any, AnyTgpuData | undefined>,\n argNames: string[],\n body: Block,\n externalMap: Record<string, unknown>,\n ): {\n head: Wgsl;\n body: Wgsl;\n };\n}\n\nexport interface TgpuResolvable {\n readonly label?: string | undefined;\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport interface TgpuIdentifier extends TgpuNamable, TgpuResolvable {}\n\nexport interface Builtin {\n symbol: symbol;\n name: string;\n stage: 'vertex' | 'fragment' | 'compute';\n direction: 'input' | 'output';\n identifier: TgpuIdentifier;\n}\n\nexport function isResolvable(value: unknown): value is TgpuResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface TgpuResolvableSlot<T extends Wgsl>\n extends TgpuResolvable,\n TgpuSlot<T> {}\n\nexport type SlotValuePair<T> = [TgpuSlot<T>, T];\n\nexport interface TgpuBindable<\n TData extends AnyTgpuData = AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuResolvable {\n readonly allocatable: TgpuBuffer<TData>;\n readonly usage: TUsage;\n}\n\nexport type TgpuSamplerType = 'sampler' | 'sampler_comparison';\nexport type TgpuTypedTextureType =\n | 'texture_1d'\n | 'texture_2d'\n | 'texture_2d_array'\n | 'texture_3d'\n | 'texture_cube'\n | 'texture_cube_array'\n | 'texture_multisampled_2d';\nexport type TgpuDepthTextureType =\n | 'texture_depth_2d'\n | 'texture_depth_2d_array'\n | 'texture_depth_cube'\n | 'texture_depth_cube_array'\n | 'texture_depth_multisampled_2d';\nexport type TgpuStorageTextureType =\n | 'texture_storage_1d'\n | 'texture_storage_2d'\n | 'texture_storage_2d_array'\n | 'texture_storage_3d';\nexport type TgpuExternalTextureType = 'texture_external';\n\nexport type TgpuRenderResourceType =\n | TgpuSamplerType\n | TgpuTypedTextureType\n | TgpuDepthTextureType\n | TgpuStorageTextureType\n | TgpuExternalTextureType;\n\nexport interface TgpuRenderResource extends TgpuResolvable {\n readonly type: TgpuRenderResourceType;\n}\n\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\nexport type TextureUsage = 'sampled' | 'storage';\n\nexport function isSamplerType(\n type: TgpuRenderResourceType,\n): type is TgpuSamplerType {\n return type === 'sampler' || type === 'sampler_comparison';\n}\n\nexport function isTypedTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuTypedTextureType {\n return [\n 'texture_1d',\n 'texture_2d',\n 'texture_2d_array',\n 'texture_3d',\n 'texture_cube',\n 'texture_cube_array',\n 'texture_multisampled_2d',\n ].includes(type);\n}\n\nexport function isDepthTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuDepthTextureType {\n return [\n 'texture_depth_2d',\n 'texture_depth_2d_array',\n 'texture_depth_cube',\n 'texture_depth_cube_array',\n 'texture_depth_multisampled_2d',\n ].includes(type);\n}\n\nexport function isStorageTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuStorageTextureType {\n return [\n 'texture_storage_1d',\n 'texture_storage_2d',\n 'texture_storage_2d_array',\n 'texture_storage_3d',\n ].includes(type);\n}\n\nexport function isExternalTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuExternalTextureType {\n return type === 'texture_external';\n}\n\nexport type ValueOf<T> = T extends TgpuSlot<infer I>\n ? ValueOf<I>\n : T extends TgpuBufferUsage<infer D>\n ? ValueOf<D>\n : T extends TgpuData<unknown>\n ? Unwrap<T>\n : T;\n\nexport interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {\n readonly isLoose: false;\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport interface TgpuLooseData<TInner> extends ISchema<TInner> {\n readonly isLoose: true;\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport type AnyTgpuData = TgpuData<unknown>;\nexport type AnyTgpuLooseData = TgpuLooseData<unknown>;\n\nexport function isDataLoose<T>(\n data: TgpuData<T> | TgpuLooseData<T>,\n): data is TgpuLooseData<T> {\n return data.isLoose;\n}\nexport function isDataNotLoose<T>(\n data: TgpuData<T> | TgpuLooseData<T>,\n): data is TgpuData<T> {\n return !data.isLoose;\n}\n\nexport interface TgpuPointer<\n TScope extends 'function',\n TInner extends AnyTgpuData,\n> {\n readonly scope: TScope;\n readonly pointsTo: TInner;\n}\n\n/**\n * A virtual representation of a WGSL value.\n */\nexport type TgpuValue<TDataType> = {\n readonly __dataType: TDataType;\n};\n\nexport type AnyTgpuPointer = TgpuPointer<'function', AnyTgpuData>;\n\nexport type TgpuFnArgument = AnyTgpuPointer | AnyTgpuData;\n\nexport function isPointer(\n value: AnyTgpuPointer | AnyTgpuData,\n): value is AnyTgpuPointer {\n return 'pointsTo' in value;\n}\n\nexport function isGPUBuffer(value: unknown): value is GPUBuffer {\n return (\n !!value &&\n typeof value === 'object' &&\n 'getMappedRange' in value &&\n 'mapAsync' in value\n );\n}\n\n// -----------------\n// TypeGPU Resources\n// -----------------\n\n// Code\n\nexport interface BoundTgpuCode extends TgpuResolvable {\n with<T>(slot: TgpuSlot<T>, value: Eventual<T>): BoundTgpuCode;\n}\n\nexport interface TgpuCode extends BoundTgpuCode, TgpuNamable {}\n\n// Slot\n\nexport interface TgpuSlot<T> extends TgpuNamable {\n readonly __brand: 'TgpuSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n\n value: ValueOf<T>;\n}\n\nexport function isSlot<T>(value: unknown | TgpuSlot<T>): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>).__brand === 'TgpuSlot';\n}\n","import { idForBuiltin } from './builtinIdentifiers';\nimport {\n type BoundTgpuCode,\n type Eventual,\n type InlineResolve,\n type ResolutionCtx,\n type SlotValuePair,\n type TgpuCode,\n type TgpuSlot,\n type Wgsl,\n isResolvable,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): TgpuCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new TgpuCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuCodeImpl implements TgpuCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (typeof s === 'symbol') {\n ctx.addBuiltin(s);\n code += ctx.resolve(idForBuiltin(s));\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundTgpuCodeImpl<T> implements BoundTgpuCode {\n constructor(\n private readonly _innerFn: BoundTgpuCode,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `code:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import type * as TB from 'typed-binary';\nimport {\n type IMeasurer,\n type MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport type {\n AnyTgpuData,\n AnyTgpuLooseData,\n ResolutionCtx,\n TgpuData,\n TgpuLooseData,\n} from '../types';\nimport alignIO from './alignIO';\nimport { getCustomAlignment } from './attributes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBaseArray<\n TElement extends AnyTgpuData | AnyTgpuLooseData =\n | AnyTgpuData\n | AnyTgpuLooseData,\n> {\n readonly elementType: TElement;\n readonly elementCount: number;\n readonly stride: number;\n}\n\n/**\n * Array schema constructed via `d.arrayOf` function.\n *\n * Responsible for handling reading and writing array values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its elementType.\n */\nexport interface TgpuArray<TElement extends AnyTgpuData>\n extends TgpuBaseArray<TElement>,\n TgpuData<Unwrap<TElement>[]> {}\n\n/**\n * Creates an array schema that can be used to construct gpu buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * @example\n * const LENGTH = 3;\n * const array = d.arrayOf(d.u32, LENGTH);\n *\n * @param elementType The type of elements in the array.\n * @param count The number of elements in the array.\n */\nexport const arrayOf = <TElement extends AnyTgpuData>(\n elementType: TElement,\n count: number,\n): TgpuArray<TElement> => new TgpuArrayImpl(elementType, count);\n\n/**\n * Array schema constructed via `d.looseArrayOf` function.\n *\n * Useful for defining vertex buffers.\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface TgpuLooseArray<TElement extends AnyTgpuData | AnyTgpuLooseData>\n extends TgpuBaseArray<TElement>,\n TgpuLooseData<Unwrap<TElement>[]> {}\n\n/**\n * Creates an array schema that can be used to construct vertex buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const looseArray = d.looseArrayOf(d.vec3f, 3); // packed array of vec3f\n *\n * @example\n * const looseArray = d.looseArrayOf(d.align(16, d.vec3f), 3);\n *\n * @param elementType The type of elements in the array.\n * @param count The number of elements in the array.\n */\nexport const looseArrayOf = <TElement extends AnyTgpuData | AnyTgpuLooseData>(\n elementType: TElement,\n count: number,\n): TgpuLooseArray<TElement> => new TgpuLooseArrayImpl(elementType, count);\n\n/**\n * Checks whether passed in value is an array schema,\n * as opposed to, e.g., a looseArray schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas looseArray schemas cannot.\n *\n * @example\n * isArraySchema(d.arrayOf(d.u32, 4)) // true\n * isArraySchema(d.looseArrayOf(d.u32, 4)) // false\n * isArraySchema(d.vec3f) // false\n */\nexport function isArraySchema<T extends TgpuArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuArrayImpl;\n}\n\n/**\n * Checks whether the passed in value is a looseArray schema,\n * as opposed to, e.g., a regular array schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas looseArray schemas cannot. Loose arrays are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isLooseArraySchema(d.arrayOf(d.u32, 4)) // false\n * isLooseArraySchema(d.looseArrayOf(d.u32, 4)) // true\n * isLooseArraySchema(d.vec3f) // false\n */\nexport function isLooseArraySchema<T extends TgpuLooseArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuLooseArrayImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuArrayImpl<TElement extends AnyTgpuData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuArray<TElement>\n{\n private _size: number;\n public readonly isRuntimeSized: boolean;\n public readonly byteAlignment: number;\n public readonly stride: number;\n public readonly isLoose = false;\n\n constructor(\n public readonly elementType: TElement,\n public readonly elementCount: number,\n ) {\n super();\n this.byteAlignment = elementType.byteAlignment;\n this.stride = roundUp(elementType.size, elementType.byteAlignment);\n this._size = this.stride * elementCount;\n this.isRuntimeSized = elementCount === 0;\n }\n\n get size() {\n if (this.isRuntimeSized) {\n throw new Error('Cannot get the size of a runtime-sized array');\n }\n return this._size;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n if (this.isRuntimeSized) {\n throw new Error('Cannot write a runtime-sized array');\n }\n alignIO(output, this.byteAlignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n alignIO(output, this.byteAlignment);\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.size);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n if (this.isRuntimeSized) {\n throw new Error('Cannot read a runtime-sized array');\n }\n alignIO(input, this.byteAlignment);\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n alignIO(input, this.byteAlignment);\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n alignIO(input, this.byteAlignment);\n return elements;\n }\n\n measure(\n _: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n if (this.isRuntimeSized) {\n return measurer.unbounded;\n }\n alignIO(measurer, this.byteAlignment);\n return measurer.add(this.size);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const elementTypeResolved = ctx.resolve(this.elementType);\n const arrayType = this.isRuntimeSized\n ? `array<${elementTypeResolved}>`\n : `array<${elementTypeResolved}, ${this.elementCount}>`;\n return ctx.resolve(arrayType);\n }\n}\n\nclass TgpuLooseArrayImpl<TElement extends AnyTgpuData | AnyTgpuLooseData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuLooseArray<TElement>\n{\n public readonly byteAlignment: number;\n public readonly size: number;\n public readonly stride: number;\n public readonly isLoose = true;\n\n constructor(\n public readonly elementType: TElement,\n public readonly elementCount: number,\n ) {\n super();\n this.byteAlignment = getCustomAlignment(elementType) ?? 1;\n this.stride = roundUp(elementType.size, this.byteAlignment);\n this.size = this.stride * elementCount;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n alignIO(output, this.byteAlignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n alignIO(output, this.byteAlignment);\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.size);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n alignIO(input, this.byteAlignment);\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n alignIO(input, this.byteAlignment);\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n alignIO(input, this.byteAlignment);\n return elements;\n }\n\n measure(\n _: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n return measurer.add(this.size);\n }\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import {\n type IMeasurer,\n type IRefResolver,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport {\n type AnyTgpuData,\n type AnyTgpuLooseData,\n type ResolutionCtx,\n type TgpuData,\n type TgpuLooseData,\n isDataLoose,\n isDataNotLoose,\n} from '../types';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Align<T extends number> {\n type: 'align';\n alignment: T;\n}\n\nexport interface Size<T extends number> {\n type: 'size';\n size: T;\n}\n\nexport interface Location<T extends number> {\n type: 'location';\n location: T;\n}\n\nexport type AnyAttribute = Align<number> | Size<number> | Location<number>;\n\nexport interface BaseDecorated<\n TInner extends AnyTgpuData | AnyTgpuLooseData =\n | AnyTgpuData\n | AnyTgpuLooseData,\n TAttribs extends AnyAttribute[] = AnyAttribute[],\n> {\n readonly inner: TInner;\n readonly attributes: TAttribs;\n\n // Easy access to all attributes, if they exist\n readonly alignAttrib: number | undefined;\n readonly sizeAttrib: number | undefined;\n readonly locationAttrib: number | undefined;\n}\n\nexport interface Decorated<\n TInner extends AnyTgpuData,\n TAttribs extends AnyAttribute[],\n> extends BaseDecorated<TInner, TAttribs>,\n TgpuData<Unwrap<TInner>> {}\n\nexport interface LooseDecorated<\n TInner extends AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n> extends BaseDecorated<TInner, TAttribs>,\n TgpuLooseData<Unwrap<TInner>> {}\n\nexport type ExtractAttributes<T> = T extends BaseDecorated<\n AnyTgpuData,\n infer Attribs\n>\n ? Attribs\n : [];\n\nexport type UnwrapDecorated<T> = T extends BaseDecorated<infer Inner>\n ? Inner\n : T;\n\n/**\n * Decorates a data-type `TData` with an attribute `TAttrib`.\n *\n * - if `TData` is loose\n * - if `TData` is already `LooseDecorated`\n * - Prepend `TAttrib` to the existing attribute tuple.\n * - else\n * - Wrap `TData` with `LooseDecorated` and a single attribute `[TAttrib]`\n * - else\n * - if `TData` is already `Decorated`\n * - Prepend `TAttrib` to the existing attribute tuple.\n * - else\n * - Wrap `TData` with `Decorated` and a single attribute `[TAttrib]`\n */\nexport type Decorate<\n TData extends AnyTgpuData | AnyTgpuLooseData,\n TAttrib extends AnyAttribute,\n> = TData extends AnyTgpuData\n ? Decorated<UnwrapDecorated<TData>, [TAttrib, ...ExtractAttributes<TData>]>\n : TData extends AnyTgpuLooseData\n ? LooseDecorated<\n UnwrapDecorated<TData>,\n [TAttrib, ...ExtractAttributes<TData>]\n >\n : never;\n\nexport function attribute<\n TData extends AnyTgpuData | AnyTgpuLooseData,\n TAttrib extends AnyAttribute,\n>(data: TData, attrib: TAttrib) {\n if (isDecorated(data)) {\n return new DecoratedImpl(data.inner, [attrib, ...data.attributes]);\n }\n\n if (isLooseDecorated(data)) {\n return new LooseDecoratedImpl(data.inner, [attrib, ...data.attributes]);\n }\n\n if (isDataLoose(data)) {\n return new LooseDecoratedImpl(data, [attrib]);\n }\n\n return new DecoratedImpl(data, [attrib]);\n}\n\n/**\n * Gives the wrapped data-type a custom byte alignment. Useful in order to\n * fulfill uniform alignment requirements.\n *\n * @example\n * const Data = d.struct({\n * a: u32, // takes up 4 bytes\n * // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes\n * b: d.align(16, u32),\n * });\n *\n * @param alignment The multiple of bytes this data should align itself to.\n * @param data The data-type to align.\n */\nexport function align<\n TAlign extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(alignment: TAlign, data: TData): Decorate<TData, Align<TAlign>> {\n return attribute(data, { type: 'align', alignment }) as Decorate<\n TData,\n Align<TAlign>\n >;\n}\n\n/**\n * Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.\n *\n * @example\n * const Data = d.struct({\n * a: d.size(16, u32), // takes up 16 bytes, instead of 4\n * b: u32, // starts at byte 16, because `a` has a custom size\n * });\n *\n * @param size The amount of bytes that should be reserved for this data-type.\n * @param data The data-type to wrap.\n */\nexport function size<\n TSize extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(size: TSize, data: TData): Decorate<TData, Size<TSize>> {\n return attribute(data, { type: 'size', size }) as Decorate<\n TData,\n Size<TSize>\n >;\n}\n\n/**\n * Assigns an explicit numeric location to a struct member or a parameter that has this type.\n *\n * @example\n * const Data = d.ioStruct({\n * a: d.u32, // has implicit location 0\n * b: d.location(5, d.u32),\n * c: d.u32, // has implicit location 6\n * });\n *\n * @param location The explicit numeric location.\n * @param data The data-type to wrap.\n */\nexport function location<\n TLocation extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(location: TLocation, data: TData): Decorate<TData, Location<TLocation>> {\n return attribute(data, { type: 'location', location }) as Decorate<\n TData,\n Location<TLocation>\n >;\n}\n\nexport function isDecorated<T extends Decorated<AnyTgpuData, AnyAttribute[]>>(\n value: T | unknown,\n): value is T {\n return value instanceof DecoratedImpl;\n}\n\nexport function isLooseDecorated<\n T extends LooseDecorated<AnyTgpuLooseData, AnyAttribute[]>,\n>(value: T | unknown): value is T {\n return value instanceof LooseDecoratedImpl;\n}\n\nexport function getCustomAlignment(\n data: AnyTgpuData | AnyTgpuLooseData,\n): number | undefined {\n return (data as unknown as BaseDecorated).alignAttrib;\n}\n\nexport function getCustomLocation(\n data: AnyTgpuData | AnyTgpuLooseData,\n): number | undefined {\n return (data as unknown as BaseDecorated).locationAttrib;\n}\n\nexport function getAttributesString<T extends AnyTgpuData>(field: T): string {\n if (!isDecorated(field) && !isLooseDecorated(field)) {\n return '';\n }\n\n return field.attributes\n .map((attrib) => {\n if (attrib.type === 'align') {\n return `@align(${attrib.alignment}) `;\n }\n\n if (attrib.type === 'size') {\n return `@size(${attrib.size}) `;\n }\n\n if (attrib.type === 'location') {\n return `@location(${attrib.location}) `;\n }\n\n return '';\n })\n .join('');\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass BaseDecoratedImpl<\n TInner extends AnyTgpuData | AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n> {\n // Type-token, not available at runtime\n public readonly __unwrapped!: Unwrap<TInner>;\n\n public readonly label?: string | undefined;\n public readonly byteAlignment: number;\n public readonly size: number;\n\n public readonly alignAttrib: number | undefined;\n public readonly sizeAttrib: number | undefined;\n public readonly locationAttrib: number | undefined;\n\n constructor(\n public readonly inner: TInner,\n public readonly attributes: TAttribs,\n ) {\n this.alignAttrib = attributes.find(\n (a): a is Align<number> => a.type === 'align',\n )?.alignment;\n this.sizeAttrib = attributes.find(\n (a): a is Size<number> => a.type === 'size',\n )?.size;\n this.locationAttrib = attributes.find(\n (a): a is Location<number> => a.type === 'location',\n )?.location;\n\n this.byteAlignment = this.alignAttrib ?? inner.byteAlignment;\n this.size = this.measure(MaxValue).size;\n\n if (this.byteAlignment <= 0) {\n throw new Error(\n `Custom data alignment must be a positive number, got: ${this.byteAlignment}.`,\n );\n }\n\n if (Math.log2(this.byteAlignment) % 1 !== 0) {\n throw new Error(\n `Alignment has to be a power of 2, got: ${this.byteAlignment}.`,\n );\n }\n\n if (isDataNotLoose(this.inner)) {\n if (this.byteAlignment % this.inner.byteAlignment !== 0) {\n throw new Error(\n `Custom alignment has to be a multiple of the standard data byteAlignment. Got: ${this.byteAlignment}, expected multiple of: ${this.inner.byteAlignment}.`,\n );\n }\n }\n\n if (this.size < this.inner.size) {\n throw new Error(\n `Custom data size cannot be smaller then the standard data size. Got: ${this.size}, expected at least: ${this.inner.size}.`,\n );\n }\n\n if (this.size <= 0) {\n throw new Error(\n `Custom data size must be a positive number. Got: ${this.size}.`,\n );\n }\n }\n\n resolveReferences(_: IRefResolver): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<Unwrap<TInner>>): void {\n alignIO(output, this.alignAttrib ?? 1);\n\n const beginning = output.currentByteOffset;\n this.inner.write(output, value);\n output.seekTo(beginning + this.size);\n }\n\n read(input: ISerialInput): Parsed<Unwrap<TInner>> {\n alignIO(input, this.alignAttrib ?? 1);\n\n const beginning = input.currentByteOffset;\n const value = this.inner.read(input) as Parsed<Unwrap<TInner>>;\n input.seekTo(beginning + this.size);\n return value;\n }\n\n measure(\n value: MaxValue | Parsed<Unwrap<TInner>>,\n measurer: IMeasurer | undefined = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.alignAttrib ?? 1);\n\n if (this.sizeAttrib !== undefined) {\n return measurer.add(this.sizeAttrib);\n }\n\n return this.inner.measure(value, measurer);\n }\n\n seekProperty(\n reference: MaxValue | Parsed<Unwrap<TInner>>,\n prop: keyof Unwrap<TInner>,\n ): { bufferOffset: number; schema: ISchema<unknown> } | null {\n return this.inner.seekProperty(reference, prop as never);\n }\n}\n\nclass DecoratedImpl<TInner extends AnyTgpuData, TAttribs extends AnyAttribute[]>\n extends BaseDecoratedImpl<TInner, TAttribs>\n implements Decorated<TInner, TAttribs>\n{\n public readonly isLoose = false as const;\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this.inner);\n }\n}\n\nclass LooseDecoratedImpl<\n TInner extends AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n >\n extends BaseDecoratedImpl<TInner, TAttribs>\n implements LooseDecorated<TInner, TAttribs>\n{\n public readonly isLoose = true as const;\n}\n","import {\n type IMeasurer,\n type IRefResolver,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type Parsed,\n f32,\n i32,\n u32,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { inGPUMode } from '../gpuMode';\nimport type { NumberArrayView, TgpuData } from '../types';\n\n// --------------\n// Implementation\n// --------------\n\ninterface VecSchemaOptions<ValueType> {\n unitType: ISchema<number>;\n byteAlignment: number;\n length: number;\n label: string;\n make: (...args: number[]) => ValueType;\n makeFromScalar: (value: number) => ValueType;\n}\n\ntype VecSchemaBase<ValueType> = TgpuData<ValueType> & {\n kind: string;\n expressionCode: string; // TODO: to remove\n toString(): string;\n};\n\nfunction makeVecSchema<ValueType extends vecBase>(\n options: VecSchemaOptions<ValueType>,\n): VecSchemaBase<ValueType> & ((...args: number[]) => ValueType) {\n const VecSchema: VecSchemaBase<ValueType> = {\n // Type-token, not available at runtime\n __unwrapped: undefined as unknown as ValueType,\n isLoose: false as const,\n\n size: options.length * 4,\n label: options.label,\n byteAlignment: options.byteAlignment,\n kind: options.label,\n expressionCode: options.label,\n\n resolveReferences(ctx: IRefResolver): void {\n throw new RecursiveDataTypeError();\n },\n\n write(output: ISerialOutput, value: Parsed<ValueType>): void {\n for (const element of value) {\n options.unitType.write(output, element);\n }\n },\n\n read(input: ISerialInput): Parsed<ValueType> {\n return options.make(\n ...Array.from({ length: options.length }).map((_) =>\n options.unitType.read(input),\n ),\n ) as Parsed<ValueType>;\n },\n\n measure(\n _value: Parsed<ValueType> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.size);\n },\n\n seekProperty(\n _reference: Parsed<ValueType> | MaxValue,\n _prop: never,\n ): { bufferOffset: number; schema: ISchema<unknown> } | null {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return options.label;\n },\n\n toString(): string {\n return options.label;\n },\n };\n\n const construct = (...args: number[]): ValueType => {\n const values = args; // TODO: Allow users to pass in vectors that fill part of the values.\n\n if (inGPUMode()) {\n return `${VecSchema.kind}(${values.join(', ')})` as unknown as ValueType;\n }\n\n if (values.length <= 1) {\n return options.makeFromScalar(values[0] ?? 0);\n }\n\n if (values.length === options.length) {\n return options.make(...values);\n }\n\n throw new Error(\n `'${options.label}' constructor called with invalid number of arguments.`,\n );\n };\n\n return Object.assign(construct, VecSchema);\n}\n\nabstract class vec2Impl implements vec2 {\n public readonly length = 2;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n}\n\nclass vec2fImpl extends vec2Impl {\n readonly kind = 'vec2f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec2iImpl extends vec2Impl {\n readonly kind = 'vec2i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec2uImpl extends vec2Impl {\n readonly kind = 'vec2u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\nabstract class vec3Impl implements vec3 {\n public readonly length = 3;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n public z: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n get [2]() {\n return this.z;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n\n set [2](value: number) {\n this.z = value;\n }\n}\n\nclass vec3fImpl extends vec3Impl {\n readonly kind = 'vec3f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec3iImpl extends vec3Impl {\n readonly kind = 'vec3i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec3uImpl extends vec3Impl {\n readonly kind = 'vec3u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\nabstract class vec4Impl implements vec4 {\n public readonly length = 4;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n public z: number,\n public w: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n yield this.w;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n get [2]() {\n return this.z;\n }\n\n get [3]() {\n return this.w;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n\n set [2](value: number) {\n this.z = value;\n }\n\n set [3](value: number) {\n this.w = value;\n }\n}\n\nclass vec4fImpl extends vec4Impl {\n readonly kind = 'vec4f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec4iImpl extends vec4Impl {\n readonly kind = 'vec4i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec4uImpl extends vec4Impl {\n readonly kind = 'vec4u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\ninterface Swizzle2<T2, T3, T4> {\n readonly xx: T2;\n readonly xy: T2;\n readonly yx: T2;\n readonly yy: T2;\n\n readonly xxx: T3;\n readonly xxy: T3;\n readonly xyx: T3;\n readonly xyy: T3;\n readonly yxx: T3;\n readonly yxy: T3;\n readonly yyx: T3;\n readonly yyy: T3;\n\n readonly xxxx: T4;\n readonly xxxy: T4;\n readonly xxyx: T4;\n readonly xxyy: T4;\n readonly xyxx: T4;\n readonly xyxy: T4;\n readonly xyyx: T4;\n readonly xyyy: T4;\n readonly yxxx: T4;\n readonly yxxy: T4;\n readonly yxyx: T4;\n readonly yxyy: T4;\n readonly yyxx: T4;\n readonly yyxy: T4;\n readonly yyyx: T4;\n readonly yyyy: T4;\n}\n\ninterface Swizzle3<T2, T3, T4> extends Swizzle2<T2, T3, T4> {\n readonly xz: T2;\n readonly yz: T2;\n readonly zx: T2;\n readonly zy: T2;\n readonly zz: T2;\n\n readonly xxz: T3;\n readonly xyz: T3;\n readonly xzx: T3;\n readonly xzy: T3;\n readonly xzz: T3;\n readonly yxz: T3;\n readonly yyz: T3;\n readonly yzx: T3;\n readonly yzy: T3;\n readonly yzz: T3;\n readonly zxx: T3;\n readonly zxy: T3;\n readonly zxz: T3;\n readonly zyx: T3;\n readonly zyy: T3;\n readonly zyz: T3;\n readonly zzx: T3;\n readonly zzy: T3;\n readonly zzz: T3;\n\n readonly xxxz: T4;\n readonly xxyz: T4;\n readonly xxzx: T4;\n readonly xxzy: T4;\n readonly xxzz: T4;\n readonly xyxz: T4;\n readonly xyyz: T4;\n readonly xyzx: T4;\n readonly xyzy: T4;\n readonly xyzz: T4;\n readonly xzxx: T4;\n readonly xzxy: T4;\n readonly xzxz: T4;\n readonly xzyx: T4;\n readonly xzyy: T4;\n readonly xzyz: T4;\n readonly xzzx: T4;\n readonly xzzy: T4;\n readonly xzzz: T4;\n readonly yxxz: T4;\n readonly yxyz: T4;\n readonly yxzx: T4;\n readonly yxzy: T4;\n readonly yxzz: T4;\n readonly yyxz: T4;\n readonly yyyz: T4;\n readonly yyzx: T4;\n readonly yyzy: T4;\n readonly yyzz: T4;\n readonly yzxx: T4;\n readonly yzxy: T4;\n readonly yzxz: T4;\n readonly yzyx: T4;\n readonly yzyy: T4;\n readonly yzyz: T4;\n readonly yzzx: T4;\n readonly yzzy: T4;\n readonly yzzz: T4;\n readonly zxxx: T4;\n readonly zxxy: T4;\n readonly zxxz: T4;\n readonly zxyx: T4;\n readonly zxyy: T4;\n readonly zxyz: T4;\n readonly zxzx: T4;\n readonly zxzy: T4;\n readonly zxzz: T4;\n readonly zyxx: T4;\n readonly zyxy: T4;\n readonly zyxz: T4;\n readonly zyyx: T4;\n readonly zyyy: T4;\n readonly zyyz: T4;\n readonly zyzx: T4;\n readonly zyzy: T4;\n readonly zyzz: T4;\n readonly zzxx: T4;\n readonly zzxy: T4;\n readonly zzxz: T4;\n readonly zzyx: T4;\n readonly zzyy: T4;\n readonly zzyz: T4;\n readonly zzzx: T4;\n readonly zzzy: T4;\n readonly zzzz: T4;\n}\n\ninterface Swizzle4<T2, T3, T4> extends Swizzle3<T2, T3, T4> {\n readonly yw: T2;\n readonly zw: T2;\n readonly wx: T2;\n readonly wy: T2;\n readonly wz: T2;\n readonly ww: T2;\n\n readonly xxw: T3;\n readonly xyw: T3;\n readonly xzw: T3;\n readonly xwx: T3;\n readonly xwy: T3;\n readonly xwz: T3;\n readonly xww: T3;\n readonly yxw: T3;\n readonly yyw: T3;\n readonly yzw: T3;\n readonly ywx: T3;\n readonly ywy: T3;\n readonly ywz: T3;\n readonly yww: T3;\n readonly zxw: T3;\n readonly zyw: T3;\n readonly zzw: T3;\n readonly zwx: T3;\n readonly zwy: T3;\n readonly zwz: T3;\n readonly zww: T3;\n readonly wxx: T3;\n readonly wxz: T3;\n readonly wxy: T3;\n readonly wyy: T3;\n readonly wyz: T3;\n readonly wzz: T3;\n readonly wwx: T3;\n readonly wwy: T3;\n readonly wwz: T3;\n readonly www: T3;\n\n readonly xxxw: T4;\n readonly xxyw: T4;\n readonly xxzw: T4;\n readonly xxwx: T4;\n readonly xxwy: T4;\n readonly xxwz: T4;\n readonly xxww: T4;\n readonly xyxw: T4;\n readonly xyyw: T4;\n readonly xyzw: T4;\n readonly xywx: T4;\n readonly xywy: T4;\n readonly xywz: T4;\n readonly xyww: T4;\n readonly xzxw: T4;\n readonly xzyw: T4;\n readonly xzzw: T4;\n readonly xzwx: T4;\n readonly xzwy: T4;\n readonly xzwz: T4;\n readonly xzww: T4;\n readonly xwxx: T4;\n readonly xwxy: T4;\n readonly xwxz: T4;\n readonly xwyy: T4;\n readonly xwyz: T4;\n readonly xwzz: T4;\n readonly xwwx: T4;\n readonly xwwy: T4;\n readonly xwwz: T4;\n readonly xwww: T4;\n readonly yxxw: T4;\n readonly yxyw: T4;\n readonly yxzw: T4;\n readonly yxwx: T4;\n readonly yxwy: T4;\n readonly yxwz: T4;\n readonly yxww: T4;\n readonly yyxw: T4;\n readonly yyyw: T4;\n readonly yyzw: T4;\n readonly yywx: T4;\n readonly yywy: T4;\n readonly yywz: T4;\n readonly yyww: T4;\n readonly yzxw: T4;\n readonly yzyw: T4;\n readonly yzzw: T4;\n readonly yzwx: T4;\n readonly yzwy: T4;\n readonly yzwz: T4;\n readonly yzww: T4;\n readonly ywxx: T4;\n readonly ywxy: T4;\n readonly ywxz: T4;\n readonly ywxw: T4;\n readonly ywyy: T4;\n readonly ywyz: T4;\n readonly ywzz: T4;\n readonly ywwx: T4;\n readonly ywwy: T4;\n readonly ywwz: T4;\n readonly ywww: T4;\n readonly zxxw: T4;\n readonly zxyw: T4;\n readonly zxzw: T4;\n readonly zxwx: T4;\n readonly zxwy: T4;\n readonly zxwz: T4;\n readonly zxww: T4;\n readonly zyxw: T4;\n readonly zyyw: T4;\n readonly zyzw: T4;\n readonly zywx: T4;\n readonly zywy: T4;\n readonly zywz: T4;\n readonly zyww: T4;\n readonly zzxw: T4;\n readonly zzyw: T4;\n readonly zzzw: T4;\n readonly zzwx: T4;\n readonly zzwy: T4;\n readonly zzwz: T4;\n readonly zzww: T4;\n readonly zwxx: T4;\n readonly zwxy: T4;\n readonly zwxz: T4;\n readonly zwxw: T4;\n readonly zwyy: T4;\n readonly zwyz: T4;\n readonly zwzz: T4;\n readonly zwwx: T4;\n readonly zwwy: T4;\n readonly zwwz: T4;\n readonly zwww: T4;\n readonly wxxx: T4;\n readonly wxxy: T4;\n readonly wxxz: T4;\n readonly wxxw: T4;\n readonly wxyx: T4;\n readonly wxyy: T4;\n readonly wxyz: T4;\n readonly wxyw: T4;\n readonly wxzx: T4;\n readonly wxzy: T4;\n readonly wxzz: T4;\n readonly wxzw: T4;\n readonly wxwx: T4;\n readonly wxwy: T4;\n readonly wxwz: T4;\n readonly wxww: T4;\n readonly wyxx: T4;\n readonly wyxy: T4;\n readonly wyxz: T4;\n readonly wyxw: T4;\n readonly wyyy: T4;\n readonly wyyz: T4;\n readonly wyzw: T4;\n readonly wywx: T4;\n readonly wywy: T4;\n readonly wywz: T4;\n readonly wyww: T4;\n readonly wzxx: T4;\n readonly wzxy: T4;\n readonly wzxz: T4;\n readonly wzxw: T4;\n readonly wzyy: T4;\n readonly wzyz: T4;\n readonly wzzy: T4;\n readonly wzzw: T4;\n readonly wzwx: T4;\n readonly wzwy: T4;\n readonly wzwz: T4;\n readonly wzww: T4;\n readonly wwxx: T4;\n readonly wwxy: T4;\n readonly wwxz: T4;\n readonly wwxw: T4;\n readonly wwyy: T4;\n readonly wwyz: T4;\n readonly wwzz: T4;\n readonly wwwx: T4;\n readonly wwwy: T4;\n readonly wwwz: T4;\n readonly wwww: T4;\n}\n\ninterface vec2 extends NumberArrayView {\n x: number;\n y: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\ninterface vec3 extends NumberArrayView {\n x: number;\n y: number;\n z: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\ninterface vec4 extends NumberArrayView {\n x: number;\n y: number;\n z: number;\n w: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\nconst vecProxyHandler: ProxyHandler<vecBase> = {\n get: (target, prop) => {\n if (typeof prop === 'symbol' || !Number.isNaN(Number.parseInt(prop))) {\n return Reflect.get(target, prop);\n }\n\n const targetAsVec4 = target as unknown as vec4uImpl;\n const values = new Array(prop.length) as number[];\n\n let idx = 0;\n for (const char of prop as string) {\n switch (char) {\n case 'x':\n values[idx] = targetAsVec4.x;\n break;\n case 'y':\n values[idx] = targetAsVec4.y;\n break;\n case 'z':\n values[idx] = targetAsVec4.z;\n break;\n case 'w':\n values[idx] = targetAsVec4.w;\n break;\n default:\n return Reflect.get(targetAsVec4, prop);\n }\n idx++;\n }\n\n if (prop.length === 4) {\n return new Proxy(\n targetAsVec4.make4(\n values[0] as number,\n values[1] as number,\n values[2] as number,\n values[3] as number,\n ),\n vecProxyHandler,\n );\n }\n\n if (prop.length === 3) {\n return new Proxy(\n targetAsVec4.make3(\n values[0] as number,\n values[1] as number,\n values[2] as number,\n ),\n vecProxyHandler,\n );\n }\n\n if (prop.length === 2) {\n return new Proxy(\n targetAsVec4.make2(values[0] as number, values[1] as number),\n vecProxyHandler,\n );\n }\n\n return Reflect.get(target, prop);\n },\n};\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Type encompassing all available kinds of vector.\n */\nexport type VecKind =\n | 'vec2f'\n | 'vec2i'\n | 'vec2u'\n | 'vec3f'\n | 'vec3i'\n | 'vec3u'\n | 'vec4f'\n | 'vec4i'\n | 'vec4u';\n\n/**\n * Common interface for all vector types, no matter their size and inner type.\n */\nexport interface vecBase {\n kind: VecKind;\n [Symbol.iterator](): Iterator<number>;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2f or vec2<f32>.\n * A vector with 2 elements of type d.f32\n */\nexport interface vec2f extends vec2, Swizzle2<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2f';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec2i or vec2<i32>.\n * A vector with 2 elements of type d.i32\n */\nexport interface vec2i extends vec2, Swizzle2<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2i';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec2u or vec2<u32>.\n * A vector with 2 elements of type d.u32\n */\nexport interface vec2u extends vec2, Swizzle2<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2u';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3f or vec3<f32>.\n * A vector with 3 elements of type d.f32\n */\nexport interface vec3f extends vec3, Swizzle3<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3f';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3i or vec3<i32>.\n * A vector with 3 elements of type d.i32\n */\nexport interface vec3i extends vec3, Swizzle3<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3i';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3u or vec3<u32>.\n * A vector with 3 elements of type d.u32\n */\nexport interface vec3u extends vec3, Swizzle3<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3u';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4f or vec4<f32>.\n * A vector with 4 elements of type d.f32\n */\nexport interface vec4f extends vec4, Swizzle4<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4f';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec4i or vec4<i32>.\n * A vector with 4 elements of type d.i32\n */\nexport interface vec4i extends vec4, Swizzle4<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4i';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec4u or vec4<u32>.\n * A vector with 4 elements of type d.u32\n */\nexport interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4u';\n}\n\n/**\n * Type of the `d.vec2f` object/function: vector data type schema/constructor\n */\nexport type Vec2f = TgpuData<vec2f> & { kind: 'vec2f' } & ((\n x: number,\n y: number,\n ) => vec2f) &\n ((xy: number) => vec2f) &\n (() => vec2f);\n\n/**\n *\n * Schema representing vec2f - a vector with 2 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2f(); // (0.0, 0.0)\n * const vector = d.vec2f(1); // (1.0, 1.0)\n * const vector = d.vec2f(0.5, 0.1); // (0.5, 0.1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2f, d.vec2f(0, 1)); // buffer holding a d.vec2f value, with an initial value of vec2f(0, 1);\n */\nexport const vec2f = makeVecSchema({\n unitType: f32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2f',\n make: (x: number, y: number) =>\n new Proxy(new vec2fImpl(x, y), vecProxyHandler) as vec2f,\n makeFromScalar: (x) =>\n new Proxy(new vec2fImpl(x, x), vecProxyHandler) as vec2f,\n}) as Vec2f;\n\n/**\n * Type of the `d.vec2i` object/function: vector data type schema/constructor\n */\nexport type Vec2i = TgpuData<vec2i> & { kind: 'vec2i' } & ((\n x: number,\n y: number,\n ) => vec2i) &\n ((xy: number) => vec2i) &\n (() => vec2i);\n\n/**\n *\n * Schema representing vec2i - a vector with 2 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2i(); // (0, 0)\n * const vector = d.vec2i(1); // (1, 1)\n * const vector = d.vec2i(-1, 1); // (-1, 1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2i, d.vec2i(0, 1)); // buffer holding a d.vec2i value, with an initial value of vec2i(0, 1);\n */\nexport const vec2i = makeVecSchema({\n unitType: i32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2i',\n make: (x: number, y: number) =>\n new Proxy(new vec2iImpl(x, y), vecProxyHandler) as vec2i,\n makeFromScalar: (x) =>\n new Proxy(new vec2iImpl(x, x), vecProxyHandler) as vec2i,\n}) as Vec2i;\n\n/**\n * Type of the `d.vec2u` object/function: vector data type schema/constructor\n */\nexport type Vec2u = TgpuData<vec2u> & { kind: 'vec2u' } & ((\n x: number,\n y: number,\n ) => vec2u) &\n ((xy: number) => vec2u) &\n (() => vec2u);\n\n/**\n *\n * Schema representing vec2u - a vector with 2 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2u(); // (0, 0)\n * const vector = d.vec2u(1); // (1, 1)\n * const vector = d.vec2u(1, 2); // (1, 2)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2u, d.vec2u(0, 1)); // buffer holding a d.vec2u value, with an initial value of vec2u(0, 1);\n */\nexport const vec2u = makeVecSchema({\n unitType: u32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2u',\n make: (x: number, y: number) =>\n new Proxy(new vec2uImpl(x, y), vecProxyHandler) as vec2u,\n makeFromScalar: (x) =>\n new Proxy(new vec2uImpl(x, x), vecProxyHandler) as vec2u,\n}) as Vec2u;\n\n/**\n * Type of the `d.vec3f` object/function: vector data type schema/constructor\n */\nexport type Vec3f = TgpuData<vec3f> & { kind: 'vec3f' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3f) &\n ((xyz: number) => vec3f) &\n (() => vec3f);\n\n/**\n *\n * Schema representing vec3f - a vector with 3 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3f(); // (0.0, 0.0, 0.0)\n * const vector = d.vec3f(1); // (1.0, 1.0, 1.0)\n * const vector = d.vec3f(1, 2, 3.5); // (1.0, 2.0, 3.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3f, d.vec3f(0, 1, 2)); // buffer holding a d.vec3f value, with an initial value of vec3f(0, 1, 2);\n */\nexport const vec3f = makeVecSchema({\n unitType: f32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3f',\n make: (x, y, z) =>\n new Proxy(new vec3fImpl(x, y, z), vecProxyHandler) as vec3f,\n makeFromScalar: (x) =>\n new Proxy(new vec3fImpl(x, x, x), vecProxyHandler) as vec3f,\n}) as Vec3f;\n\n/**\n * Type of the `d.vec3i` object/function: vector data type schema/constructor\n */\nexport type Vec3i = TgpuData<vec3i> & { kind: 'vec3i' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3i) &\n ((xyz: number) => vec3i) &\n (() => vec3i);\n\n/**\n *\n * Schema representing vec3i - a vector with 3 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3i(); // (0, 0, 0)\n * const vector = d.vec3i(1); // (1, 1, 1)\n * const vector = d.vec3i(1, 2, -3); // (1, 2, -3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3i, d.vec3i(0, 1, 2)); // buffer holding a d.vec3i value, with an initial value of vec3i(0, 1, 2);\n */\nexport const vec3i = makeVecSchema({\n unitType: i32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3i',\n make: (x, y, z) =>\n new Proxy(new vec3iImpl(x, y, z), vecProxyHandler) as vec3i,\n makeFromScalar: (x) =>\n new Proxy(new vec3iImpl(x, x, x), vecProxyHandler) as vec3i,\n}) as Vec3i;\n\n/**\n * Type of the `d.vec3u` object/function: vector data type schema/constructor\n */\nexport type Vec3u = TgpuData<vec3u> & { kind: 'vec3u' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3u) &\n ((xyz: number) => vec3u) &\n (() => vec3u);\n\n/**\n *\n * Schema representing vec3u - a vector with 3 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3u(); // (0, 0, 0)\n * const vector = d.vec3u(1); // (1, 1, 1)\n * const vector = d.vec3u(1, 2, 3); // (1, 2, 3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3u, d.vec3u(0, 1, 2)); // buffer holding a d.vec3u value, with an initial value of vec3u(0, 1, 2);\n */\nexport const vec3u = makeVecSchema({\n unitType: u32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3u',\n make: (x, y, z) =>\n new Proxy(new vec3uImpl(x, y, z), vecProxyHandler) as vec3u,\n makeFromScalar: (x) =>\n new Proxy(new vec3uImpl(x, x, x), vecProxyHandler) as vec3u,\n}) as Vec3u;\n\n/**\n * Type of the `d.vec4f` object/function: vector data type schema/constructor\n */\nexport type Vec4f = TgpuData<vec4f> & { kind: 'vec4f' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4f) &\n ((xyzw: number) => vec4f) &\n (() => vec4f);\n\n/**\n *\n * Schema representing vec4f - a vector with 4 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4f(); // (0.0, 0.0, 0.0, 0.0)\n * const vector = d.vec4f(1); // (1.0, 1.0, 1.0, 1.0)\n * const vector = d.vec4f(1, 2, 3, 4.5); // (1.0, 2.0, 3.0, 4.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4f, d.vec4f(0, 1, 2, 3)); // buffer holding a d.vec4f value, with an initial value of vec4f(0, 1, 2, 3);\n */\nexport const vec4f = makeVecSchema({\n unitType: f32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4f',\n make: (x, y, z, w) =>\n new Proxy(new vec4fImpl(x, y, z, w), vecProxyHandler) as vec4f,\n makeFromScalar: (x) =>\n new Proxy(new vec4fImpl(x, x, x, x), vecProxyHandler) as vec4f,\n}) as Vec4f;\n\n/**\n * Type of the `d.vec4i` object/function: vector data type schema/constructor\n */\nexport type Vec4i = TgpuData<vec4i> & { kind: 'vec4i' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4i) &\n ((xyzw: number) => vec4i) &\n (() => vec4i);\n\n/**\n *\n * Schema representing vec4i - a vector with 4 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4i(); // (0, 0, 0, 0)\n * const vector = d.vec4i(1); // (1, 1, 1, 1)\n * const vector = d.vec4i(1, 2, 3, -4); // (1, 2, 3, -4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4i, d.vec4i(0, 1, 2, 3)); // buffer holding a d.vec4i value, with an initial value of vec4i(0, 1, 2, 3);\n */\nexport const vec4i = makeVecSchema({\n unitType: i32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4i',\n make: (x, y, z, w) =>\n new Proxy(new vec4iImpl(x, y, z, w), vecProxyHandler) as vec4i,\n makeFromScalar: (x) =>\n new Proxy(new vec4iImpl(x, x, x, x), vecProxyHandler) as vec4i,\n}) as Vec4i;\n\n/**\n * Type of the `d.vec4u` object/function: vector data type schema/constructor\n */\nexport type Vec4u = TgpuData<vec4u> & { kind: 'vec4u' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4u) &\n ((xyzw: number) => vec4u) &\n (() => vec4u);\n\n/**\n *\n * Schema representing vec4u - a vector with 4 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4u(); // (0, 0, 0, 0)\n * const vector = d.vec4u(1); // (1, 1, 1, 1)\n * const vector = d.vec4u(1, 2, 3, 4); // (1, 2, 3, 4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4u, d.vec4u(0, 1, 2, 3)); // buffer holding a d.vec4u value, with an initial value of vec4u(0, 1, 2, 3);\n */\nexport const vec4u = makeVecSchema({\n unitType: u32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4u',\n make: (x, y, z, w) =>\n new Proxy(new vec4uImpl(x, y, z, w), vecProxyHandler) as vec4u,\n makeFromScalar: (x) =>\n new Proxy(new vec4uImpl(x, x, x, x), vecProxyHandler) as vec4u,\n}) as Vec4u;\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type Parsed,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { roundUp } from '../mathUtils';\nimport type { NumberArrayView, TgpuData } from '../types';\nimport { vec2f, vec3f, vec4f, type vecBase } from './vector';\n\n// --------------\n// Implementation\n// --------------\n\ninterface MatSchemaOptions<ValueType, ColumnType extends vecBase> {\n label: string;\n columnType: TgpuData<ColumnType>;\n rows: number;\n columns: number;\n makeFromColumnVectors(...columns: ColumnType[]): ValueType;\n makeFromElements(...elements: number[]): ValueType;\n}\n\ntype MatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n> = TgpuData<ValueType> & ((...args: (number | ColumnType)[]) => ValueType);\n\nfunction createMatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n>(\n options: MatSchemaOptions<ValueType, ColumnType>,\n): MatSchema<ValueType, ColumnType> {\n const MatSchema: TgpuData<ValueType> = {\n // Type-token, not available at runtime.\n __unwrapped: undefined as unknown as ValueType,\n isLoose: false as const,\n\n label: options.label,\n byteAlignment: options.columnType.byteAlignment,\n size: roundUp(\n options.columnType.size * options.columns,\n options.columnType.byteAlignment,\n ),\n\n resolveReferences() {\n throw new RecursiveDataTypeError();\n },\n\n write(output: ISerialOutput, value: Parsed<ValueType>): void {\n for (const col of value.columns) {\n options.columnType.write(output, col as Parsed<ColumnType>);\n }\n },\n\n read(input: ISerialInput): Parsed<ValueType> {\n const columns = new Array(options.columns) as ColumnType[];\n\n for (let c = 0; c < options.columns; ++c) {\n columns[c] = options.columnType.read(input) as ColumnType;\n }\n\n return options.makeFromColumnVectors(...columns) as Parsed<ValueType>;\n },\n\n measure(_value: MaxValue, measurer: IMeasurer = new Measurer()): IMeasurer {\n return measurer.add(this.size);\n },\n\n seekProperty() {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return options.label;\n },\n };\n\n const construct = (...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 elements.push(...arg);\n }\n }\n\n // Fill the rest with zeros\n for (let i = elements.length; i < options.columns * options.rows; ++i) {\n elements.push(0);\n }\n\n return options.makeFromElements(...elements);\n };\n\n return Object.assign(construct, MatSchema);\n}\n\ninterface matBase<TColumn> extends NumberArrayView {\n readonly columns: readonly TColumn[];\n elements(): Iterable<number>;\n}\n\nabstract class mat2x2Impl<TColumn extends vec2f> implements mat2x2<TColumn> {\n public readonly columns: readonly [TColumn, TColumn];\n public readonly length = 4;\n [n: number]: number;\n\n constructor(...elements: number[]) {\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 *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n }\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\nclass mat2x2fImpl extends mat2x2Impl<vec2f> implements mat2x2f {\n makeColumn(e0: number, e1: number): vec2f {\n return vec2f(e0, e1);\n }\n}\n\nabstract class mat3x3Impl<TColumn extends vec3f> implements mat3x3<TColumn> {\n public readonly columns: readonly [TColumn, TColumn, TColumn];\n public readonly length = 12;\n [n: number]: number;\n\n constructor(...elements: number[]) {\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 *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n yield* this.columns[2];\n }\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\nclass mat3x3fImpl extends mat3x3Impl<vec3f> implements mat3x3f {\n makeColumn(x: number, y: number, z: number): vec3f {\n return vec3f(x, y, z);\n }\n}\n\nabstract class mat4x4Impl<TColumn extends vec4f> implements mat4x4<TColumn> {\n public readonly columns: readonly [TColumn, TColumn, TColumn, TColumn];\n\n constructor(...elements: number[]) {\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 *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n yield* this.columns[2];\n yield* this.columns[3];\n }\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\nclass mat4x4fImpl extends mat4x4Impl<vec4f> implements mat4x4f {\n makeColumn(x: number, y: number, z: number, w: number): vec4f {\n return vec4f(x, y, z, w);\n }\n}\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2\n * A matrix with 2 rows and 2 columns, with elements of type `TColumn`\n */\ninterface mat2x2<TColumn> extends matBase<TColumn> {\n readonly length: 4;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2f or mat2x2<f32>\n * A matrix with 2 rows and 2 columns, with elements of type d.f32\n */\nexport interface mat2x2f extends mat2x2<vec2f> {}\n\n/**\n * Type of the `d.mat2x2f` object/function: matrix data type schema/constructor\n */\nexport type Mat2x2f = TgpuData<mat2x2f> &\n ((...elements: number[]) => mat2x2f) &\n ((...columns: vec2f[]) => mat2x2f) &\n (() => mat2x2f);\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[0] // vec2f(0, 1)\n * mat[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({\n label: 'mat2x2f',\n columnType: vec2f,\n rows: 2,\n columns: 2,\n makeFromColumnVectors: (...columns: [vec2f, vec2f]) =>\n new mat2x2fImpl(...columns[0], ...columns[1]),\n makeFromElements: (...elements: number[]) => new mat2x2fImpl(...elements),\n}) as Mat2x2f;\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3\n * A matrix with 3 rows and 3 columns, with elements of type `TColumn`\n */\ninterface mat3x3<TColumn> extends matBase<TColumn> {\n readonly length: 12;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3f or mat3x3<f32>\n * A matrix with 3 rows and 3 columns, with elements of type d.f32\n */\nexport interface mat3x3f extends mat3x3<vec3f> {}\n\n/**\n * Type of the `d.mat3x3f` object/function: matrix data type schema/constructor\n */\nexport type Mat3x3f = TgpuData<mat3x3f> &\n ((...elements: number[]) => mat3x3f) &\n ((...columns: vec3f[]) => mat3x3f) &\n (() => mat3x3f);\n\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[0] // vec3f(0, 1, 2)\n * mat[1] // vec3f(3, 4, 5)\n * mat[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({\n label: 'mat3x3f',\n columnType: vec3f,\n rows: 3,\n columns: 3,\n makeFromColumnVectors(...[v0, v1, v2]: [vec3f, vec3f, vec3f]) {\n return new mat3x3fImpl(...v0, ...v1, ...v2);\n },\n makeFromElements: (...elements: number[]) => new mat3x3fImpl(...elements),\n}) as Mat3x3f;\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4\n * A matrix with 4 rows and 4 columns, with elements of type `TColumn`\n */\ninterface mat4x4<TColumn> extends matBase<TColumn> {\n readonly length: 16;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4f or mat4x4<f32>\n * A matrix with 4 rows and 4 columns, with elements of type d.f32\n */\nexport interface mat4x4f extends mat4x4<vec4f> {}\n\n/**\n * Type of the `d.mat4x4f` object/function: matrix data type schema/constructor\n */\nexport type Mat4x4f = TgpuData<mat4x4f> &\n ((...elements: number[]) => mat4x4f) &\n ((...columns: vec4f[]) => mat4x4f) &\n (() => mat4x4f);\n\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 = mat3x3f(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n * mat[0] // vec4f(0, 1, 2, 3)\n * mat[1] // vec4f(4, 5, 6, 7)\n * mat[2] // vec4f(8, 9, 10, 11)\n * mat[3] // vec4f(12, 13, 14, 15)\n *\n * @example\n * const mat = mat3x3f(\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({\n label: 'mat4x4f',\n columnType: vec4f,\n rows: 4,\n columns: 4,\n makeFromColumnVectors(...[v0, v1, v2, v3]: [vec4f, vec4f, vec4f, vec4f]) {\n return new mat4x4fImpl(...v0, ...v1, ...v2, ...v3);\n },\n makeFromElements: (...elements: number[]) => new mat4x4fImpl(...elements),\n}) as Mat4x4f;\n","import type {\n IMeasurer,\n ISerialInput,\n ISerialOutput,\n MaxValue,\n Parsed,\n} from 'typed-binary';\nimport { BufferReader, Measurer, Schema } from 'typed-binary';\nimport type { VertexFormat } from '../shared/vertexFormat';\nimport type { TgpuLooseData } from '../types';\nimport { f32, i32, u32 } from './numeric';\nimport {\n type Vec2f,\n type Vec2i,\n type Vec2u,\n type Vec3f,\n type Vec3i,\n type Vec3u,\n type Vec4f,\n type Vec4i,\n type Vec4u,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n} from './vector';\n\nexport type FormatToWGSLType<T extends VertexFormat> =\n (typeof formatToWGSLType)[T];\n\nexport interface TgpuVertexFormatData<T extends VertexFormat>\n extends TgpuLooseData<FormatToWGSLType<T>> {\n readonly kind: T;\n}\n\nclass TgpuVertexFormatDataImpl<T extends VertexFormat>\n extends Schema<FormatToWGSLType<T>>\n implements TgpuVertexFormatData<T>\n{\n private underlyingType: FormatToWGSLType<T>;\n private elementSize: 1 | 2 | 4;\n private elementCount: number;\n private isSigned: boolean;\n readonly byteAlignment = 1;\n readonly isLoose = true;\n\n constructor(\n readonly size: number,\n readonly kind: T,\n ) {\n super();\n this.underlyingType = formatToWGSLType[kind];\n this.isSigned = normalizedToIsSigned[kind] ?? false;\n this.elementCount = this.underlyingType.size / 4;\n const elementSize = size / this.elementCount;\n if (elementSize !== 1 && elementSize !== 2 && elementSize !== 4) {\n throw new Error('Invalid element size');\n }\n this.elementSize = elementSize;\n }\n\n write(\n output: ISerialOutput,\n value: Parsed<typeof this.underlyingType>,\n ): void {\n if (typeof value === 'number') {\n // since the value is not a vector, we can just write it directly\n // (all single component attributes are 32-bit)\n switch (this.underlyingType) {\n case u32:\n output.writeUint32(value);\n break;\n case f32:\n output.writeFloat32(value);\n break;\n case i32:\n output.writeInt32(value);\n break;\n default:\n throw new Error('Invalid underlying type');\n }\n return;\n }\n writeSizedVector(output, value, this.elementSize, this.isSigned);\n }\n\n read(input: ISerialInput): Parsed<typeof this.underlyingType> {\n const readBuffer = new ArrayBuffer(this.size);\n const readView = new DataView(readBuffer);\n for (let i = 0; i < this.size; i++) {\n readView.setUint8(i, input.readByte());\n }\n if (this.elementCount === 1) {\n switch (this.underlyingType) {\n case u32:\n return readView.getUint32(0) as Parsed<typeof this.underlyingType>;\n case f32:\n return readView.getFloat32(0) as Parsed<typeof this.underlyingType>;\n case i32:\n return readView.getInt32(0) as Parsed<typeof this.underlyingType>;\n default:\n throw new Error('Invalid underlying type');\n }\n }\n\n const vector = this.underlyingType as\n | Vec2u\n | Vec3u\n | Vec4u\n | Vec2f\n | Vec3f\n | Vec4f\n | Vec2i\n | Vec3i\n | Vec4i;\n const primitive =\n vectorKindToPrimitive[vector.label as keyof typeof vectorKindToPrimitive];\n\n const values = new Array(this.elementCount);\n const reader = new BufferReader(readBuffer);\n for (let i = 0; i < this.elementCount; i++) {\n values[i] = readSizedPrimitive(\n primitive,\n this.elementSize,\n reader,\n this.isSigned,\n );\n }\n\n switch (vector) {\n case vec2u:\n case vec2f:\n case vec2i:\n return vector(values[0], values[1]) as Parsed<\n typeof this.underlyingType\n >;\n case vec3u:\n case vec3f:\n case vec3i:\n return vector(values[0], values[1], values[2]) as Parsed<\n typeof this.underlyingType\n >;\n case vec4u:\n case vec4f:\n case vec4i:\n return vector(values[0], values[1], values[2], values[3]) as Parsed<\n typeof this.underlyingType\n >;\n default:\n throw new Error('Invalid underlying type');\n }\n }\n\n measure(\n _: Parsed<FormatToWGSLType<T>, Record<string, never>> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.size);\n }\n}\n\nconst vectorKindToPrimitive = {\n vec2u: 'u32',\n vec3u: 'u32',\n vec4u: 'u32',\n vec2f: 'f32',\n vec3f: 'f32',\n vec4f: 'f32',\n vec2i: 'i32',\n vec3i: 'i32',\n vec4i: 'i32',\n} as const;\n\nfunction writeSizedVector(\n output: ISerialOutput,\n value: vec2u | vec3u | vec4u | vec2f | vec3f | vec4f | vec2i | vec3i | vec4i,\n elementSize: 1 | 2 | 4,\n isSigned: boolean,\n): void {\n const primitive = vectorKindToPrimitive[value.kind];\n for (const entry of value) {\n writeSizedPrimitive(primitive, entry, elementSize, output, isSigned);\n }\n}\n\nfunction writeSizedPrimitive(\n primitive: 'u32' | 'f32' | 'i32',\n value: number,\n size: 1 | 2 | 4,\n output: ISerialOutput,\n floatSigned = true,\n): void {\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n\n const writef8 = (offset: number, value: number) => {\n const asInt = floatSigned ? value * 127 + 128 : value * 255;\n view.setUint8(offset, Math.floor(asInt));\n };\n const writef16 = (offset: number, value: number) => {\n const asInt = floatSigned ? value * 32767 + 32768 : value * 65535;\n view.setUint16(offset, Math.floor(asInt));\n };\n\n const setters = {\n u32: [view.setUint8, view.setUint16, view.setUint32],\n f32: [writef8, writef16, view.setFloat32],\n i32: [view.setInt8, view.setInt16, view.setInt32],\n };\n\n const setter = setters[primitive][Math.log2(size)];\n if (setter) {\n setter.call(view, 0, value);\n }\n for (let i = 0; i < size; i++) {\n output.writeByte(view.getUint8(i));\n }\n}\n\nfunction readSizedPrimitive(\n primitive: 'u32' | 'f32' | 'i32',\n size: 1 | 2 | 4,\n input: ISerialInput,\n floatSigned = true,\n): number {\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n for (let i = 0; i < size; i++) {\n view.setUint8(i, input.readByte());\n }\n\n const readf8 = (offset: number) => {\n const asInt = view.getUint8(offset);\n return floatSigned ? (asInt - 128) / 127 : asInt / 255;\n };\n const readf16 = (offset: number) => {\n const asInt = view.getUint16(offset);\n return floatSigned ? (asInt - 32768) / 32767 : asInt / 65535;\n };\n\n const getters = {\n u32: [view.getUint8, view.getUint16, view.getUint32],\n f32: [readf8, readf16, view.getFloat32],\n i32: [view.getInt8, view.getInt16, view.getInt32],\n };\n\n const getter = getters[primitive][Math.log2(size)];\n if (getter) {\n return getter.call(view, 0);\n }\n throw new Error('Invalid primitive');\n}\n\nconst formatToWGSLType = {\n uint8x2: vec2u,\n uint8x4: vec4u,\n sint8x2: vec2i,\n sint8x4: vec4i,\n unorm8x2: vec2f,\n unorm8x4: vec4f,\n snorm8x2: vec2f,\n snorm8x4: vec4f,\n uint16x2: vec2u,\n uint16x4: vec4u,\n sint16x2: vec2i,\n sint16x4: vec4i,\n unorm16x2: vec2f,\n unorm16x4: vec4f,\n snorm16x2: vec2f,\n snorm16x4: vec4f,\n float16x2: vec2f,\n float16x4: vec4f,\n float32: f32,\n float32x2: vec2f,\n float32x3: vec3f,\n float32x4: vec4f,\n uint32: u32,\n uint32x2: vec2u,\n uint32x3: vec3u,\n uint32x4: vec4u,\n sint32: i32,\n sint32x2: vec2i,\n sint32x3: vec3i,\n sint32x4: vec4i,\n unorm10_10_10_2: vec4f,\n} as const;\n\nconst normalizedToIsSigned = {\n unorm8x2: false,\n unorm8x4: false,\n snorm8x2: true,\n snorm8x4: true,\n unorm16x2: false,\n unorm16x4: false,\n snorm16x2: true,\n snorm16x4: true,\n float16x2: true,\n float16x4: true,\n unorm10_10_10_2: false,\n} as Record<VertexFormat, boolean | undefined>;\n\nexport type uint8x2 = TgpuVertexFormatData<'uint8x2'>;\nexport const uint8x2 = new TgpuVertexFormatDataImpl(2, 'uint8x2') as uint8x2;\n\nexport type uint8x4 = TgpuVertexFormatData<'uint8x4'>;\nexport const uint8x4 = new TgpuVertexFormatDataImpl(4, 'uint8x4') as uint8x4;\n\nexport type sint8x2 = TgpuVertexFormatData<'sint8x2'>;\nexport const sint8x2 = new TgpuVertexFormatDataImpl(2, 'sint8x2') as sint8x2;\n\nexport type sint8x4 = TgpuVertexFormatData<'sint8x4'>;\nexport const sint8x4 = new TgpuVertexFormatDataImpl(4, 'sint8x4') as sint8x4;\n\nexport type unorm8x2 = TgpuVertexFormatData<'unorm8x2'>;\nexport const unorm8x2 = new TgpuVertexFormatDataImpl(2, 'unorm8x2') as unorm8x2;\n\nexport type unorm8x4 = TgpuVertexFormatData<'unorm8x4'>;\nexport const unorm8x4 = new TgpuVertexFormatDataImpl(4, 'unorm8x4') as unorm8x4;\n\nexport type snorm8x2 = TgpuVertexFormatData<'snorm8x2'>;\nexport const snorm8x2 = new TgpuVertexFormatDataImpl(2, 'snorm8x2') as snorm8x2;\n\nexport type snorm8x4 = TgpuVertexFormatData<'snorm8x4'>;\nexport const snorm8x4 = new TgpuVertexFormatDataImpl(4, 'snorm8x4') as snorm8x4;\n\nexport type uint16x2 = TgpuVertexFormatData<'uint16x2'>;\nexport const uint16x2 = new TgpuVertexFormatDataImpl(4, 'uint16x2') as uint16x2;\n\nexport type uint16x4 = TgpuVertexFormatData<'uint16x4'>;\nexport const uint16x4 = new TgpuVertexFormatDataImpl(8, 'uint16x4') as uint16x4;\n\nexport type sint16x2 = TgpuVertexFormatData<'sint16x2'>;\nexport const sint16x2 = new TgpuVertexFormatDataImpl(4, 'sint16x2') as sint16x2;\n\nexport type sint16x4 = TgpuVertexFormatData<'sint16x4'>;\nexport const sint16x4 = new TgpuVertexFormatDataImpl(8, 'sint16x4') as sint16x4;\n\nexport type unorm16x2 = TgpuVertexFormatData<'unorm16x2'>;\nexport const unorm16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'unorm16x2',\n) as unorm16x2;\n\nexport type unorm16x4 = TgpuVertexFormatData<'unorm16x4'>;\nexport const unorm16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'unorm16x4',\n) as unorm16x4;\n\nexport type snorm16x2 = TgpuVertexFormatData<'snorm16x2'>;\nexport const snorm16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'snorm16x2',\n) as snorm16x2;\n\nexport type snorm16x4 = TgpuVertexFormatData<'snorm16x4'>;\nexport const snorm16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'snorm16x4',\n) as snorm16x4;\n\nexport type float16x2 = TgpuVertexFormatData<'float16x2'>;\nexport const float16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'float16x2',\n) as float16x2;\n\nexport type float16x4 = TgpuVertexFormatData<'float16x4'>;\nexport const float16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'float16x4',\n) as float16x4;\n\nexport type float32 = TgpuVertexFormatData<'float32'>;\nexport const float32 = new TgpuVertexFormatDataImpl(4, 'float32') as float32;\n\nexport type float32x2 = TgpuVertexFormatData<'float32x2'>;\nexport const float32x2 = new TgpuVertexFormatDataImpl(\n 8,\n 'float32x2',\n) as float32x2;\n\nexport type float32x3 = TgpuVertexFormatData<'float32x3'>;\nexport const float32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'float32x3',\n) as float32x3;\n\nexport type float32x4 = TgpuVertexFormatData<'float32x4'>;\nexport const float32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'float32x4',\n) as float32x4;\n\nexport type uint32 = TgpuVertexFormatData<'uint32'>;\nexport const uint32 = new TgpuVertexFormatDataImpl(4, 'uint32') as uint32;\n\nexport type uint32x2 = TgpuVertexFormatData<'uint32x2'>;\nexport const uint32x2 = new TgpuVertexFormatDataImpl(8, 'uint32x2') as uint32x2;\n\nexport type uint32x3 = TgpuVertexFormatData<'uint32x3'>;\nexport const uint32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'uint32x3',\n) as uint32x3;\n\nexport type uint32x4 = TgpuVertexFormatData<'uint32x4'>;\nexport const uint32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'uint32x4',\n) as uint32x4;\n\nexport type sint32 = TgpuVertexFormatData<'sint32'>;\nexport const sint32 = new TgpuVertexFormatDataImpl(4, 'sint32') as sint32;\n\nexport type sint32x2 = TgpuVertexFormatData<'sint32x2'>;\nexport const sint32x2 = new TgpuVertexFormatDataImpl(8, 'sint32x2') as sint32x2;\n\nexport type sint32x3 = TgpuVertexFormatData<'sint32x3'>;\nexport const sint32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'sint32x3',\n) as sint32x3;\n\nexport type sint32x4 = TgpuVertexFormatData<'sint32x4'>;\nexport const sint32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'sint32x4',\n) as sint32x4;\n\nexport type unorm10_10_10_2 = TgpuVertexFormatData<'unorm10_10_10_2'>;\nexport const unorm10_10_10_2 = new TgpuVertexFormatDataImpl(\n 4,\n 'unorm10_10_10_2',\n) as unorm10_10_10_2;\n","import type { AnyTgpuData, TgpuPointer } from '../types';\n\nexport function ptr<TDataType extends AnyTgpuData>(\n pointsTo: TDataType,\n): TgpuPointer<'function', TDataType> {\n return {\n scope: 'function',\n pointsTo,\n };\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\nimport type { I32, U32 } from './numeric';\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 * Atomic schema constructed via `d.atomic` function.\n */\nexport interface Atomic<TSchema extends U32 | I32>\n extends TgpuData<Unwrap<TSchema>> {}\n\n/**\n * Checks whether the passed in value is a d.atomic schema.\n *\n * @example\n * isAtomicSchema(d.atomic(d.u32)) // true\n * isAtomicSchema(d.u32) // false\n */\nexport function isAtomicSchema<T extends Atomic<U32 | I32>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof AtomicImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass AtomicImpl<TSchema extends U32 | I32>\n extends Schema<Unwrap<TSchema>>\n implements Atomic<TSchema>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n\n constructor(private readonly innerData: TSchema) {\n super();\n this.size = this.innerData.size;\n this.byteAlignment = this.innerData.byteAlignment;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this.innerData.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this.innerData.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return this.innerData.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return `atomic<${ctx.resolve(this.innerData)}>`;\n }\n}\n"]}
|
package/data/index.cjs
CHANGED
@@ -1,8 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
2
|
-
struct ${r} {
|
3
|
-
${Object.entries(this._properties).map(([s,o])=>{var N;return k`${(N=pe(o))!=null?N:""}${s}: ${o},\n`})}
|
4
|
-
}
|
5
|
-
`),t.resolve(r)}};function pe(e){if(R(e))return`@align(${e.byteAlignment}) `;if(B(e))return`@size(${e.size}) `}function V(e){return Object.entries(e)}var b=(e,n)=>{let t=n-1,r=~t;return e&t?(e&r)+n:e};var Te=(e,n)=>new h(e,n);function ye(e){return e instanceof h}var h=class extends _typedbinary.Schema{constructor(t,r){super();_chunk7EYKOUWHcjs.a.call(void 0, this,"elementType");_chunk7EYKOUWHcjs.a.call(void 0, this,"elementCount");_chunk7EYKOUWHcjs.a.call(void 0, this,"byteAlignment");_chunk7EYKOUWHcjs.a.call(void 0, this,"size");_chunk7EYKOUWHcjs.a.call(void 0, this,"stride");_chunk7EYKOUWHcjs.a.call(void 0, this,"isLoose",!1);_chunk7EYKOUWHcjs.a.call(void 0, this,"isCustomAligned",!1);this.elementType=t,this.elementCount=r,this.byteAlignment=t.byteAlignment,this.stride=b(this.elementType.size,this.elementType.byteAlignment),this.size=this.stride*this.elementCount}write(t,r){i(t,this.byteAlignment);let s=t.currentByteOffset;for(let o=0;o<Math.min(this.elementCount,r.length);o++)i(t,this.byteAlignment),this.elementType.write(t,r[o]);t.seekTo(s+this.stride*this.elementCount)}read(t){i(t,this.byteAlignment);let r=[];for(let s=0;s<this.elementCount;s++)i(t,this.byteAlignment),r.push(this.elementType.read(t));return r}measure(t,r=new _typedbinary.Measurer){return i(r,this.byteAlignment),r.add(this.stride*this.elementCount)}resolve(t){return t.resolve(`
|
6
|
-
array<${t.resolve(this.elementType)}, ${this.elementCount}>
|
7
|
-
`)}};function F(e){let n={__unwrapped:void 0,isLoose:!1,isCustomAligned:!1,label:e.label,byteAlignment:e.columnType.byteAlignment,size:b(e.columnType.size*e.columns,e.columnType.byteAlignment),resolveReferences(){throw new _chunk7EYKOUWHcjs.g},write(r,s){for(let o of s.columns())e.columnType.write(r,o)},read(r){let s=new Array(e.columns);for(let o=0;o<e.columns;++o)s[o]=e.columnType.read(r);return e.makeFromColumnVectors(...s)},measure(r,s=new _typedbinary.Measurer){return s.add(this.size)},seekProperty(){throw new Error("Method not implemented.")},resolve(){return e.label}};return Object.assign((...r)=>{let s=[];for(let o of r)typeof o=="number"?s.push(o):s.push(...o);for(let o=s.length;o<e.columns*e.rows;++o)s.push(0);return e.makeFromElements(...s)},n)}var O=class{constructor(...n){_chunk7EYKOUWHcjs.a.call(void 0, this,"_columns",new Array(2));this._columns[0]=this.makeColumn(n[0],n[1]),this._columns[1]=this.makeColumn(n[2],n[3])}*columns(){yield this._columns[0],yield this._columns[1]}*elements(){yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[0]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[1])}get 0(){return this._columns[0]}get 1(){return this._columns[1]}},x=class extends O{makeColumn(n,t){return _chunk7EYKOUWHcjs.h.call(void 0, n,t)}},L=class{constructor(...n){_chunk7EYKOUWHcjs.a.call(void 0, this,"_columns",new Array(3));this._columns[0]=this.makeColumn(n[0],n[1],n[2]),this._columns[1]=this.makeColumn(n[3],n[4],n[5]),this._columns[2]=this.makeColumn(n[6],n[7],n[8])}*columns(){yield this._columns[0],yield this._columns[1],yield this._columns[2]}*elements(){yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[0]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[1]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[2])}get 0(){return this._columns[0]}get 1(){return this._columns[1]}get 2(){return this._columns[2]}},w=class extends L{makeColumn(n,t,r){return _chunk7EYKOUWHcjs.k.call(void 0, n,t,r)}},$=class{constructor(...n){_chunk7EYKOUWHcjs.a.call(void 0, this,"_columns",new Array(4));this._columns[0]=this.makeColumn(n[0],n[1],n[2],n[3]),this._columns[1]=this.makeColumn(n[4],n[5],n[6],n[7]),this._columns[2]=this.makeColumn(n[8],n[9],n[10],n[11]),this._columns[3]=this.makeColumn(n[12],n[13],n[14],n[15])}*columns(){yield this._columns[0],yield this._columns[1],yield this._columns[2],yield this._columns[3]}*elements(){yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[0]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[1]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[2]),yield*_chunk7EYKOUWHcjs.b.call(void 0, this._columns[3])}get 0(){return this._columns[0]}get 1(){return this._columns[1]}get 2(){return this._columns[2]}get 3(){return this._columns[3]}},A=class extends ${makeColumn(n,t,r,s){return _chunk7EYKOUWHcjs.n.call(void 0, n,t,r,s)}},Ct= exports.mat2x2f =F({label:"mat2x2f",columnType:_chunk7EYKOUWHcjs.h,rows:2,columns:2,makeFromColumnVectors:(...e)=>new x(...e[0],...e[1]),makeFromElements:(...e)=>new x(...e)}),Dt= exports.mat3x3f =F({label:"mat3x3f",columnType:_chunk7EYKOUWHcjs.k,rows:3,columns:3,makeFromColumnVectors(...[e,n,t]){return new w(...e,...n,...t)},makeFromElements:(...e)=>new w(...e)}),vt= exports.mat4x4f =F({label:"mat4x4f",columnType:_chunk7EYKOUWHcjs.n,rows:4,columns:4,makeFromColumnVectors(...[e,n,t,r]){return new A(...e,...n,...t,...r)},makeFromElements:(...e)=>new A(...e)});function ge(e){return{scope:"function",pointsTo:e}}function xe(e){return new S(e)}function we(e){return e instanceof S}var S=class extends _typedbinary.Schema{constructor(t){super();this.innerData=t;_chunk7EYKOUWHcjs.a.call(void 0, this,"size");_chunk7EYKOUWHcjs.a.call(void 0, this,"byteAlignment");_chunk7EYKOUWHcjs.a.call(void 0, this,"isLoose",!1);_chunk7EYKOUWHcjs.a.call(void 0, this,"isCustomAligned");this.size=this.innerData.size,this.byteAlignment=this.innerData.byteAlignment,this.isCustomAligned=this.innerData.isCustomAligned}resolveReferences(){throw new _chunk7EYKOUWHcjs.g}write(t,r){this.innerData.write(t,r)}read(t){return this.innerData.read(t)}measure(t,r=new _typedbinary.Measurer){return this.innerData.measure(t,r)}resolve(t){return`atomic<${t.resolve(this.innerData)}>`}};exports.SimpleTgpuData = c; exports.align = re; exports.arrayOf = Te; exports.atomic = xe; exports.bool = Re; exports.f32 = Ve; exports.i32 = ze; exports.isAlignedSchema = R; exports.isArraySchema = ye; exports.isAtomicSchema = we; exports.isSizedSchema = B; exports.isStructSchema = me; exports.mat2x2f = Ct; exports.mat3x3f = Dt; exports.mat4x4f = vt; exports.ptr = ge; exports.size = oe; exports.struct = le; exports.u32 = Be; exports.vec2f = _chunk7EYKOUWHcjs.h; exports.vec2i = _chunk7EYKOUWHcjs.i; exports.vec2u = _chunk7EYKOUWHcjs.j; exports.vec3f = _chunk7EYKOUWHcjs.k; exports.vec3i = _chunk7EYKOUWHcjs.l; exports.vec3u = _chunk7EYKOUWHcjs.m; exports.vec4f = _chunk7EYKOUWHcjs.n; exports.vec4i = _chunk7EYKOUWHcjs.o; exports.vec4u = _chunk7EYKOUWHcjs.p;
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkSBJR5ZQJcjs = require('../chunk-SBJR5ZQJ.cjs');exports.SimpleTgpuData = _chunkSBJR5ZQJcjs.k; exports.align = _chunkSBJR5ZQJcjs.C; exports.arrayOf = _chunkSBJR5ZQJcjs.H; exports.atomic = _chunkSBJR5ZQJcjs.Fa; exports.bool = _chunkSBJR5ZQJcjs.l; exports.f32 = _chunkSBJR5ZQJcjs.o; exports.float16x2 = _chunkSBJR5ZQJcjs.pa; exports.float16x4 = _chunkSBJR5ZQJcjs.qa; exports.float32 = _chunkSBJR5ZQJcjs.ra; exports.float32x2 = _chunkSBJR5ZQJcjs.sa; exports.float32x3 = _chunkSBJR5ZQJcjs.ta; exports.float32x4 = _chunkSBJR5ZQJcjs.ua; exports.i32 = _chunkSBJR5ZQJcjs.n; exports.isArraySchema = _chunkSBJR5ZQJcjs.J; exports.isAtomicSchema = _chunkSBJR5ZQJcjs.Ga; exports.isDecorated = _chunkSBJR5ZQJcjs.F; exports.isLooseArraySchema = _chunkSBJR5ZQJcjs.K; exports.isLooseDecorated = _chunkSBJR5ZQJcjs.G; exports.isLooseStructSchema = _chunkSBJR5ZQJcjs.O; exports.isStructSchema = _chunkSBJR5ZQJcjs.N; exports.location = _chunkSBJR5ZQJcjs.E; exports.looseArrayOf = _chunkSBJR5ZQJcjs.I; exports.looseStruct = _chunkSBJR5ZQJcjs.M; exports.mat2x2f = _chunkSBJR5ZQJcjs.Y; exports.mat3x3f = _chunkSBJR5ZQJcjs.Z; exports.mat4x4f = _chunkSBJR5ZQJcjs._; exports.ptr = _chunkSBJR5ZQJcjs.Ea; exports.sint16x2 = _chunkSBJR5ZQJcjs.ja; exports.sint16x4 = _chunkSBJR5ZQJcjs.ka; exports.sint32 = _chunkSBJR5ZQJcjs.za; exports.sint32x2 = _chunkSBJR5ZQJcjs.Aa; exports.sint32x3 = _chunkSBJR5ZQJcjs.Ba; exports.sint32x4 = _chunkSBJR5ZQJcjs.Ca; exports.sint8x2 = _chunkSBJR5ZQJcjs.ba; exports.sint8x4 = _chunkSBJR5ZQJcjs.ca; exports.size = _chunkSBJR5ZQJcjs.D; exports.snorm16x2 = _chunkSBJR5ZQJcjs.na; exports.snorm16x4 = _chunkSBJR5ZQJcjs.oa; exports.snorm8x2 = _chunkSBJR5ZQJcjs.fa; exports.snorm8x4 = _chunkSBJR5ZQJcjs.ga; exports.struct = _chunkSBJR5ZQJcjs.L; exports.u32 = _chunkSBJR5ZQJcjs.m; exports.uint16x2 = _chunkSBJR5ZQJcjs.ha; exports.uint16x4 = _chunkSBJR5ZQJcjs.ia; exports.uint32 = _chunkSBJR5ZQJcjs.va; exports.uint32x2 = _chunkSBJR5ZQJcjs.wa; exports.uint32x3 = _chunkSBJR5ZQJcjs.xa; exports.uint32x4 = _chunkSBJR5ZQJcjs.ya; exports.uint8x2 = _chunkSBJR5ZQJcjs.$; exports.uint8x4 = _chunkSBJR5ZQJcjs.aa; exports.unorm10_10_10_2 = _chunkSBJR5ZQJcjs.Da; exports.unorm16x2 = _chunkSBJR5ZQJcjs.la; exports.unorm16x4 = _chunkSBJR5ZQJcjs.ma; exports.unorm8x2 = _chunkSBJR5ZQJcjs.da; exports.unorm8x4 = _chunkSBJR5ZQJcjs.ea; exports.vec2f = _chunkSBJR5ZQJcjs.P; exports.vec2i = _chunkSBJR5ZQJcjs.Q; exports.vec2u = _chunkSBJR5ZQJcjs.R; exports.vec3f = _chunkSBJR5ZQJcjs.S; exports.vec3i = _chunkSBJR5ZQJcjs.T; exports.vec3u = _chunkSBJR5ZQJcjs.U; exports.vec4f = _chunkSBJR5ZQJcjs.V; exports.vec4i = _chunkSBJR5ZQJcjs.W; exports.vec4u = _chunkSBJR5ZQJcjs.X;
|
8
2
|
//# sourceMappingURL=index.cjs.map
|
package/data/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/data/std140.ts","../../src/data/numeric.ts","../../src/data/struct.ts","../../src/builtin.ts","../../src/tgpuIdentifier.ts","../../src/builtinIdentifiers.ts","../../src/tgpuCode.ts","../../src/data/align.ts","../../src/data/alignIO.ts","../../src/data/size.ts","../../src/data/array.ts","../../src/mathUtils.ts","../../src/data/matrix.ts","../../src/data/pointer.ts","../../src/data/atomic.ts"],"names":["MaxValue","Measurer","Schema","SimpleTgpuData","schema","byteAlignment","code","__publicField","RecursiveDataTypeError","output","value","input","measurer","ctx","TB","primitiveNumeric","reference","prop","bool","u32Cast","v","u32","i32Cast","i32","f32Cast","f32","builtin","builtins","identifier","TgpuIdentifierImpl","label","_a","builtinToName","identifierMap","idForBuiltin","key","id","strings","params","segments","string","idx","param","TgpuCodeImpl","s","isResolvable","result","eventual","slot","BoundTgpuCodeImpl","_BoundTgpuCodeImpl","_innerFn","_slotValuePair","_b","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","align","data","isDataLoose","TgpuLooseAlignedImpl","isDataNotLoose","TgpuAlignedImpl","isAlignedSchema","AbstractTgpuAlignedImpl","size","TgpuSizedImpl","isSizedSchema","struct","properties","TgpuStructImpl","isStructSchema","_properties","a","b","property","exactEntries","ident","field","getAttribute","record","roundUp","modulo","invBitMask","arrayOf","elementType","count","TgpuArrayImpl","isArraySchema","beginning","i","elements","createMatSchema","options","MatSchema","col","columns","c","_value","args","arg","mat2x2Impl","__yieldStar","mat2x2fImpl","e0","e1","vec2f","mat3x3Impl","mat3x3fImpl","x","y","z","vec3f","mat4x4Impl","mat4x4fImpl","w","vec4f","mat2x2f","mat3x3f","v0","v1","v2","mat4x4f","v3","ptr","pointsTo","atomic","AtomicImpl","isAtomicSchema","innerData"],"mappings":"6IAIA,OAKE,YAAAA,EACA,YAAAC,EAEA,UAAAC,MAEK,eAIA,IAAMC,EAAN,cACGD,CAEV,CAaE,YAAY,CACV,OAAAE,EACA,cAAAC,EACA,KAAAC,CACF,EAIG,CACD,MAAM,EArBRC,EAAA,KAAgB,QAChBA,EAAA,KAAgB,iBAChBA,EAAA,KAAgB,kBAChBA,EAAA,KAAgB,kBAAkB,IAElCA,EAAA,KAAiB,gBACjBA,EAAA,KAAgB,UAAU,IAC1BA,EAAA,KAAgB,SAgBd,KAAK,aAAeH,EACpB,KAAK,cAAgBC,EACrB,KAAK,eAAiBC,EACtB,KAAK,KAAO,KAAK,QAAQN,CAAQ,EAAE,KACnC,KAAK,MAAQM,CACf,CAEA,mBAA0B,CACxB,MAAM,IAAIE,CACZ,CAEA,MAAMC,EAAuBC,EAAsC,CACjE,KAAK,aAAa,MAAMD,EAAQC,CAAK,CACvC,CAEA,KAAKC,EAA8C,CACjD,OAAO,KAAK,aAAa,KAAKA,CAAK,CACrC,CAEA,QACED,EACAE,EAAsB,IAAIX,EACf,CACX,YAAK,aAAa,QAAQS,EAAOE,CAAQ,EAElCA,CACT,CAEA,yBAAkC,CAChC,GAAI,OAAO,KAAK,gBAAmB,SACjC,OAAO,KAAK,eAEd,GAAI,kBAAmB,KAAK,aAG1B,OAFuB,KAAK,aACzB,cACmB,wBAAwB,EAEhD,MAAM,IAAI,MAAM,+CAA+C,CACjE,CAEA,mBAA+C,CAC7C,MAAI,kBAAmB,KAAK,aACH,KAAK,aACzB,cACmB,kBAAkB,EAEnC,IACT,CAEA,QAAQC,EAA4B,CAClC,OAAO,KAAK,cACd,CACF,ECjGA,UAAYC,MAAQ,eAKpB,IAAMC,EAAmB,CACvBX,EACAE,KAEO,CAEL,YAAa,OACb,QAAS,GACT,gBAAiB,GAEjB,KAAM,EACN,cAAe,EACf,eAAgBA,EAEhB,MAAMG,EAA0BC,EAAqB,CACnDN,EAAO,MAAMK,EAAQC,CAAK,CAC5B,EAEA,KAAKC,EAAgC,CACnC,OAAOP,EAAO,KAAKO,CAAK,CAC1B,EAEA,QACED,EACAE,EAAyB,IAAO,WAClB,CACd,OAAAR,EAAO,QAAQM,EAAOE,CAAQ,EACvBA,CACT,EAEA,kBAAkBC,EAA4B,CAC5C,MAAM,IAAIL,CACZ,EAEA,aACEQ,EACAC,EAC8D,CAC9D,MAAM,IAAI,MAAM,yBAAyB,CAC3C,EAEA,SAAkB,CAChB,OAAOX,CACT,EAEA,UAAmB,CACjB,OAAOA,CACT,CACF,GAIWY,GAAa,IAAIf,EAAe,CAC3C,OAAW,OACX,cAAe,EACf,KAAM,MACR,CAAC,EAGKgB,EAAWC,GACX,OAAOA,GAAM,UACRA,EAAI,EAAI,EAEb,OAAO,UAAUA,CAAC,IAChBA,EAAI,GAAKA,EAAI,aACf,QAAQ,KAAK,aAAaA,CAAC,aAAa,GAE5BA,EAAI,cACD,GAEZ,KAAK,IAAI,EAAG,KAAK,IAAI,WAAY,KAAK,MAAMA,CAAC,CAAC,CAAC,EAE3CC,GAAW,OAAO,OAAOF,EAASJ,EAAoB,MAAK,KAAK,CAAC,EAGxEO,EAAWF,GAAwB,CACvC,GAAI,OAAOA,GAAM,UACf,OAAOA,EAAI,EAAI,EAEjB,GAAI,OAAO,UAAUA,CAAC,EACpB,OAAIA,EAAI,aAAeA,EAAI,aACzB,QAAQ,KAAK,aAAaA,CAAC,aAAa,GAE5BA,EAAI,GACH,WAGjB,IAAMV,EAAQU,EAAI,EAAI,KAAK,KAAKA,CAAC,EAAI,KAAK,MAAMA,CAAC,EACjD,OAAO,KAAK,IAAI,YAAa,KAAK,IAAI,WAAYV,CAAK,CAAC,CAC1D,EACaa,GAAW,OAAO,OAAOD,EAASP,EAAoB,MAAK,KAAK,CAAC,EAGxES,EAAWJ,GACX,OAAOA,GAAM,UACRA,EAAI,EAAI,EAEVA,EAEIK,GAAW,OAAO,OAAOD,EAAST,EAAoB,MAAK,KAAK,CAAC,ECxG9E,OAKE,YAAAf,EACA,YAAAC,GAEA,UAAAC,OAEK,eCVA,IAAMwB,EAAU,CACrB,YAAa,OAAO,qBAAqB,EACzC,cAAe,OAAO,uBAAuB,EAC7C,SAAU,OAAO,kBAAkB,EACnC,cAAe,OAAO,uBAAuB,EAC7C,YAAa,OAAO,qBAAqB,EACzC,UAAW,OAAO,mBAAmB,EACrC,YAAa,OAAO,qBAAqB,EACzC,WAAY,OAAO,oBAAoB,EACvC,SAAU,OAAO,kBAAkB,EACnC,kBAAmB,OAAO,2BAA2B,EACrD,qBAAsB,OAAO,8BAA8B,EAC3D,mBAAoB,OAAO,4BAA4B,EACvD,YAAa,OAAO,qBAAqB,EACzC,cAAe,OAAO,uBAAuB,CAC/C,EAEMC,GAAW,OAAO,OAAOD,CAAO,ECP/B,SAASE,GAAa,CAC3B,OAAO,IAAIC,CACb,CAMA,IAAMA,EAAN,KAAgE,CAAhE,cACEtB,EAAA,cAEA,MAAMuB,EAA2B,CAC/B,YAAK,MAAQA,EACN,IACT,CAEA,QAAQjB,EAA4B,CAClC,OAAOA,EAAI,QAAQ,IAAI,CACzB,CAEA,UAAmB,CA9BrB,IAAAkB,EA+BI,MAAO,OAAMA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EACxC,CACF,EC7BA,IAAMC,EAAgB,CACpB,CAACN,EAAQ,WAAW,EAAG,eACvB,CAACA,EAAQ,aAAa,EAAG,iBACzB,CAACA,EAAQ,QAAQ,EAAG,WACpB,CAACA,EAAQ,aAAa,EAAG,iBACzB,CAACA,EAAQ,WAAW,EAAG,eACvB,CAACA,EAAQ,SAAS,EAAG,aACrB,CAACA,EAAQ,WAAW,EAAG,eACvB,CAACA,EAAQ,UAAU,EAAG,cACtB,CAACA,EAAQ,QAAQ,EAAG,WACpB,CAACA,EAAQ,iBAAiB,EAAG,sBAC7B,CAACA,EAAQ,oBAAoB,EAAG,yBAChC,CAACA,EAAQ,kBAAkB,EAAG,uBAC9B,CAACA,EAAQ,WAAW,EAAG,eACvB,CAACA,EAAQ,aAAa,EAAG,gBAC3B,EAEMO,EAAgB,IAAI,IAWnB,SAASC,EAAaC,EAAa,CACxC,IAAIC,EAAKH,EAAc,IAAIE,CAAG,EAE9B,OAAIC,IAAO,SACTA,EAAKR,EAAW,EAAE,MAAMI,EAAcG,CAAG,CAAC,EAC1CF,EAAc,IAAIE,EAAKC,CAAE,GAGpBA,CACT,CCxBO,SAAS9B,EACd+B,KACGC,EACO,CACV,IAAMC,EAAqCF,EAAQ,QAAQ,CAACG,EAAQC,IAAQ,CAC1E,IAAMC,EAAQJ,EAAOG,CAAG,EACxB,OAAIC,IAAU,OACL,CAACF,CAAM,EAGT,MAAM,QAAQE,CAAK,EAAI,CAACF,EAAQ,GAAGE,CAAK,EAAI,CAACF,EAAQE,CAAK,CACnE,CAAC,EAED,OAAO,IAAIC,EAAaJ,CAAQ,CAClC,CAMA,IAAMI,EAAN,KAAuC,CAGrC,YAA4BJ,EAAoC,CAApC,cAAAA,EAF5BhC,EAAA,KAAQ,SAEyD,CAEjE,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMuB,EAA4B,CAChC,YAAK,OAASA,EACP,IACT,CAEA,QAAQjB,EAAoB,CAC1B,IAAIP,EAAO,GAEX,QAAWsC,KAAK,KAAK,SACnB,GAAIC,EAAaD,CAAC,EAChBtC,GAAQO,EAAI,QAAQ+B,CAAC,UACZ,OAAOA,GAAM,WAAY,CAClC,IAAME,EAASF,EAAGG,GAAalC,EAAI,OAAOkC,CAAQ,CAAC,EACnDzC,GAAQO,EAAI,QAAQiC,CAAM,CAC5B,MAAW,OAAOF,GAAM,UACtB/B,EAAI,WAAW+B,CAAC,EAChBtC,GAAQO,EAAI,QAAQqB,EAAaU,CAAC,CAAC,GAEnCtC,GAAQ,OAAOsC,CAAC,EAIpB,OAAOtC,CACT,CAEA,KAAa0C,EAAwBtC,EAAwC,CAC3E,OAAO,IAAIuC,EAAkB,KAAM,CAACD,EAAMtC,CAAK,CAAC,CAClD,CAEA,UAAmB,CA3ErB,IAAAqB,EA4EI,MAAO,SAAQA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC3C,CACF,EAEMkB,EAAN,MAAMC,CAA8C,CAClD,YACmBC,EACAC,EACjB,CAFiB,cAAAD,EACA,oBAAAC,CAChB,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,SAAS,KACvB,CAEA,KAAaJ,EAAwBtC,EAAwC,CAC3E,OAAO,IAAIwC,EAAkB,KAAM,CAACF,EAAMtC,CAAK,CAAC,CAClD,CAEA,QAAQG,EAA4B,CAClC,OAAOA,EAAI,QAAQ,KAAK,SAAU,CAAC,KAAK,cAAc,CAAC,CACzD,CAEA,UAAmB,CAlGrB,IAAAkB,EAAAsB,EAmGI,GAAM,CAACL,EAAMtC,CAAK,EAAI,KAAK,eAC3B,MAAO,SAAQqB,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,KAAIsB,EAAAL,EAAK,QAAL,KAAAK,EAAc,WAAW,IAAI3C,CAAK,GAChF,CACF,ECtGA,OAKE,YAAAT,GAEA,UAAAC,OAEK,eCHP,SAASoD,GACPC,EACAC,EACA,CACA,IAAMC,EAAa,SAAUF,EAAKA,EAAG,KAAOA,EAAG,kBAEzCG,EAAUF,EAAgB,EAC1BG,EAASF,EAAaC,EAExB,cAAeH,EACjBA,EAAG,UAAWC,EAAgBG,EAAUD,CAAO,EAE/CH,EAAG,IAAKC,EAAgBG,EAAUD,CAAO,CAE7C,CAEA,IAAOE,EAAQN,GDaR,SAASO,GAIdxD,EACAyD,EAG6D,CAC7D,GAAIC,EAAYD,CAAI,EAClB,OAAO,IAAIE,EACTF,EACAzD,CACF,EAGF,GAAI4D,EAAeH,CAAI,EACrB,OAAO,IAAII,EACTJ,EACAzD,CACF,EAGF,MAAM,IAAI,MAAM,yBAAyByD,CAAI,EAAE,CACjD,CAoBO,SAASK,EACdzD,EACY,CACZ,OAAOA,aAAiBwD,CAC1B,CAMA,IAAME,EAAN,cAGUlE,EAAsB,CAI9B,YACU4D,EACQzD,EAChB,CACA,MAAM,EAHE,UAAAyD,EACQ,mBAAAzD,EALlBE,EAAA,KAAgB,QAChBA,EAAA,KAAgB,kBAAkB,IAQhC,QAAK,KAAO,KAAK,KAAK,KAElBF,GAAiB,EACnB,MAAM,IAAI,MACR,yDAAyDA,CAAa,GACxE,EAGF,GAAI,KAAK,KAAKA,CAAa,EAAI,IAAM,EACnC,MAAM,IAAI,MACR,0CAA0CA,CAAa,GACzD,EAGF,GAAI4D,EAAe,KAAK,IAAI,GACtB5D,EAAgB,KAAK,KAAK,gBAAkB,EAC9C,MAAM,IAAI,MACR,kFAAkFA,CAAa,2BAA2B,KAAK,KAAK,aAAa,GACnJ,CAGN,CAEA,MAAMI,EAAuBC,EAAoC,CAC/DkD,EAAQnD,EAAQ,KAAK,aAAa,EAClC,KAAK,KAAK,MAAMA,EAAQC,CAAK,CAC/B,CAEA,KAAKC,EAA4C,CAC/C,OAAAiD,EAAQjD,EAAO,KAAK,aAAa,EAC1B,KAAK,KAAK,KAAKA,CAAK,CAC7B,CAEA,QACED,EACAE,EAAsB,IAAIX,GACf,CACX,OAAA2D,EAAQhD,EAAU,KAAK,aAAa,EAC7B,KAAK,KAAK,QAAQF,EAAOE,CAAQ,CAC1C,CAEA,QAAQC,EAA4B,CAClC,OAAO,KAAK,KAAK,QAAQA,CAAG,CAC9B,CACF,EAEMqD,EAAN,cACUE,CAEV,CAHA,kCAIE7D,EAAA,KAAgB,UAAU,IAC5B,EAEMyD,EAAN,cAIUI,CAEV,CANA,kCAOE7D,EAAA,KAAgB,UAAU,IAC5B,EEnKA,OAKE,YAAAN,GAEA,UAAAC,OAEK,eAOA,SAASmE,GACdA,EACAP,EACyB,CACzB,OAAO,IAAIQ,EAAcR,EAAMO,CAAI,CACrC,CAOO,SAASE,EACd7D,EACY,CACZ,OAAOA,aAAiB4D,CAC1B,CAMA,IAAMA,EAAN,cACUpE,EAEV,CAKE,YACU4D,EACQO,EAChB,CACA,MAAM,EAHE,UAAAP,EACQ,UAAAO,EANlB9D,EAAA,KAAgB,iBAChBA,EAAA,KAAgB,UAAU,IAC1BA,EAAA,KAAgB,mBAQd,QAAK,cAAgB,KAAK,KAAK,cAC/B,KAAK,gBAAkB,KAAK,KAAK,gBAE7B8D,EAAO,KAAK,KAAK,KACnB,MAAM,IAAI,MACR,wEAAwEA,CAAI,wBAAwB,KAAK,KAAK,IAAI,GACpH,EAGF,GAAIA,GAAQ,EACV,MAAM,IAAI,MACR,oDAAoDA,CAAI,GAC1D,CAEJ,CAEA,MAAM5D,EAAuBC,EAAoC,CAC/D,KAAK,KAAK,MAAMD,EAAQC,CAAK,CAC/B,CAEA,KAAKC,EAA4C,CAC/C,OAAO,KAAK,KAAK,KAAKA,CAAK,CAC7B,CAEA,QACED,EACAE,EAAsB,IAAIX,GACf,CACX,OAAOW,EAAS,IAAI,KAAK,IAAI,CAC/B,CAEA,QAAQC,EAA4B,CAClC,OAAO,KAAK,KAAK,QAAQA,CAAG,CAC9B,CACF,EPzDO,IAAM2D,GACXC,GACuB,IAAIC,EAAeD,CAAU,EAE/C,SAASE,GAEdvE,EAAkC,CAClC,OAAOA,aAAkBsE,CAC3B,CAMA,IAAMA,EAAN,cACUxE,EAEV,CAQE,YAA6B0E,EAAqB,CAChD,MAAM,EADqB,iBAAAA,EAP7BrE,EAAA,KAAQ,UAERA,EAAA,KAAgB,iBAChBA,EAAA,KAAgB,QAChBA,EAAA,KAAgB,UAAU,IAC1BA,EAAA,KAAgB,kBAAkB,IAKhC,KAAK,cAAgB,OAAO,OAAOqE,CAAW,EAC3C,IAAK3D,GAASA,EAAK,aAAa,EAChC,OAAO,CAAC4D,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,CAAE,EAEnC,KAAK,KAAO,KAAK,QAAQ9E,CAAQ,EAAE,IACrC,CAEA,MAAM8B,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,mBAA0B,CACxB,MAAM,IAAItB,CACZ,CAEA,MAAMC,EAAuBC,EAA2C,CACtEkD,EAAQnD,EAAQ,KAAK,aAAa,EAGlC,OAAW,CAAC0B,EAAK4C,CAAQ,IAAKC,EAAa,KAAK,WAAW,EACzDpB,EAAQnD,EAAQsE,EAAS,aAAa,EACtCA,EAAS,MAAMtE,EAAQC,EAAMyB,CAAe,CAAC,CAEjD,CAEA,KAAKxB,EAAmD,CACtDiD,EAAQjD,EAAO,KAAK,aAAa,EAEjC,IAAMmC,EAAS,CAAC,EAEhB,OAAW,CAACX,EAAK4C,CAAQ,IAAKC,EAAa,KAAK,WAAW,EACzDpB,EAAQjD,EAAOoE,EAAS,aAAa,EACrCjC,EAAOX,CAAe,EAAI4C,EAAS,KAAKpE,CAAK,EAI/C,OAAOmC,CACT,CAEA,QACEpC,EACAE,EAAsB,IAAIX,GACf,CACX2D,EAAQhD,EAAU,KAAK,aAAa,EAGpC,OAAW,CAACuB,EAAK4C,CAAQ,IAAKC,EAAa,KAAK,WAAW,EACzDpB,EAAQhD,EAAUmE,EAAS,aAAa,EACxCA,EAAS,QACPrE,IAAUV,EAAWA,EAAWU,EAAMyB,CAAe,EACrDvB,CACF,EAGF,OAAAgD,EAAQhD,EAAU,KAAK,aAAa,EAC7BA,CACT,CAEA,QAAQC,EAA4B,CAClC,IAAMoE,EAAQrD,EAAW,EAAE,MAAM,KAAK,MAAM,EAE5C,OAAAf,EAAI,eAAeP;AAAA,eACR2E,CAAK;AAAA,UACV,OAAO,QAAQ,KAAK,WAAW,EAAE,IAAI,CAAC,CAAC9C,EAAK+C,CAAK,IAAG,CAzH9D,IAAAnD,EAyHiE,OAAAzB,KAAOyB,EAAAoD,GAAaD,CAAK,IAAlB,KAAAnD,EAAuB,EAAE,GAAGI,CAAG,KAAK+C,CAAK,MAAK,CAAC;AAAA;AAAA,KAElH,EAEMrE,EAAI,QAAQoE,CAAK,CAC1B,CACF,EAEA,SAASE,GAAoCD,EAA8B,CACzE,GAAIf,EAAgBe,CAAgB,EAClC,MAAO,UAAUA,EAAM,aAAa,KAGtC,GAAIX,EAAcW,CAAgB,EAChC,MAAO,SAASA,EAAM,IAAI,IAI9B,CAEO,SAASF,EACdI,EACyB,CACzB,OAAO,OAAO,QAAQA,CAAM,CAC9B,CQhJA,OAGE,YAAAnF,GAEA,UAAAC,OAEK,eCJA,IAAMmF,EAAU,CAAC3E,EAAe4E,IAAmB,CACxD,IAAM5B,EAAU4B,EAAS,EACnBC,EAAa,CAAC7B,EACpB,OAAQhD,EAAQgD,GAA0BhD,EAAQ6E,GAAcD,EAA/B5E,CACnC,EDoBO,IAAM8E,GAAU,CACrBC,EACAC,IACwB,IAAIC,EAAcF,EAAaC,CAAK,EAavD,SAASE,GACdxF,EACa,CACb,OAAOA,aAAkBuF,CAC3B,CAYA,IAAMA,EAAN,cACUzF,EAEV,CASE,YAAYuF,EAAuBC,EAAe,CAChD,MAAM,EATRnF,EAAA,KAAS,eACTA,EAAA,KAAS,gBACTA,EAAA,KAAS,iBACTA,EAAA,KAAS,QACTA,EAAA,KAAS,UACTA,EAAA,KAAS,UAAU,IACnBA,EAAA,KAAS,kBAAkB,IAIzB,KAAK,YAAckF,EACnB,KAAK,aAAeC,EACpB,KAAK,cAAgBD,EAAY,cACjC,KAAK,OAASJ,EACZ,KAAK,YAAY,KACjB,KAAK,YAAY,aACnB,EACA,KAAK,KAAO,KAAK,OAAS,KAAK,YACjC,CAEA,MAAM5E,EAA0BC,EAAmC,CACjEkD,EAAQnD,EAAQ,KAAK,aAAa,EAClC,IAAMoF,EAAYpF,EAAO,kBACzB,QAASqF,EAAI,EAAGA,EAAI,KAAK,IAAI,KAAK,aAAcpF,EAAM,MAAM,EAAGoF,IAC7DlC,EAAQnD,EAAQ,KAAK,aAAa,EAClC,KAAK,YAAY,MAAMA,EAAQC,EAAMoF,CAAC,CAAC,EAEzCrF,EAAO,OAAOoF,EAAY,KAAK,OAAS,KAAK,YAAY,CAC3D,CAEA,KAAKlF,EAAoD,CACvDiD,EAAQjD,EAAO,KAAK,aAAa,EACjC,IAAMoF,EAAuC,CAAC,EAC9C,QAASD,EAAI,EAAGA,EAAI,KAAK,aAAcA,IACrClC,EAAQjD,EAAO,KAAK,aAAa,EACjCoF,EAAS,KAAK,KAAK,YAAY,KAAKpF,CAAK,CAA6B,EAExE,OAAOoF,CACT,CAEA,QACErF,EACAE,EAAsB,IAAIX,GACf,CACX,OAAA2D,EAAQhD,EAAU,KAAK,aAAa,EAC7BA,EAAS,IAAI,KAAK,OAAS,KAAK,YAAY,CACrD,CAEA,QAAQC,EAA4B,CAClC,OAAOA,EAAI,QAAQ;AAAA,cACTA,EAAI,QAAQ,KAAK,WAAW,CAAC,KAAK,KAAK,YAAY;AAAA,KAC5D,CACH,CACF,EErHA,OAKE,YAAAZ,OAEK,eAwBP,SAAS+F,EAIPC,EACkC,CAClC,IAAMC,EAAiC,CAErC,YAAa,OACb,QAAS,GACT,gBAAiB,GAEjB,MAAOD,EAAQ,MACf,cAAeA,EAAQ,WAAW,cAClC,KAAMZ,EACJY,EAAQ,WAAW,KAAOA,EAAQ,QAClCA,EAAQ,WAAW,aACrB,EAEA,mBAAoB,CAClB,MAAM,IAAIzF,CACZ,EAEA,MAAMC,EAAuBC,EAAgC,CAC3D,QAAWyF,KAAOzF,EAAM,QAAQ,EAC9BuF,EAAQ,WAAW,MAAMxF,EAAQ0F,CAAyB,CAE9D,EAEA,KAAKxF,EAAwC,CAC3C,IAAMyF,EAAU,IAAI,MAAMH,EAAQ,OAAO,EAEzC,QAASI,EAAI,EAAGA,EAAIJ,EAAQ,QAAS,EAAEI,EACrCD,EAAQC,CAAC,EAAIJ,EAAQ,WAAW,KAAKtF,CAAK,EAG5C,OAAOsF,EAAQ,sBAAsB,GAAGG,CAAO,CACjD,EAEA,QAAQE,EAAkB1F,EAAsB,IAAIX,GAAuB,CACzE,OAAOW,EAAS,IAAI,KAAK,IAAI,CAC/B,EAEA,cAAe,CACb,MAAM,IAAI,MAAM,yBAAyB,CAC3C,EAEA,SAAkB,CAChB,OAAOqF,EAAQ,KACjB,CACF,EAqBA,OAAO,OAAO,OAnBI,IAAIM,IAA6C,CACjE,IAAMR,EAAqB,CAAC,EAE5B,QAAWS,KAAOD,EACZ,OAAOC,GAAQ,SACjBT,EAAS,KAAKS,CAAG,EAEjBT,EAAS,KAAK,GAAGS,CAAG,EAKxB,QAASV,EAAIC,EAAS,OAAQD,EAAIG,EAAQ,QAAUA,EAAQ,KAAM,EAAEH,EAClEC,EAAS,KAAK,CAAC,EAGjB,OAAOE,EAAQ,iBAAiB,GAAGF,CAAQ,CAC7C,EAEgCG,CAAS,CAC3C,CAOA,IAAeO,EAAf,KAA8E,CAG5E,eAAeV,EAAoB,CAFnCxF,EAAA,KAAQ,WAAW,IAAI,MAAM,CAAC,GAG5B,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBwF,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,CACF,CAIA,CAAC,SAAU,CACT,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,CACvB,CAEA,CAAC,UAAW,CACV,MAAAW,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,EACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAGF,EAEMC,EAAN,cAA0BF,CAAqC,CAC7D,WAAWG,EAAYC,EAAmB,CACxC,OAAOC,EAAMF,EAAIC,CAAE,CACrB,CACF,EAEeE,EAAf,KAA8E,CAG5E,eAAehB,EAAoB,CAFnCxF,EAAA,KAAQ,WAAW,IAAI,MAAM,CAAC,GAG5B,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBwF,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,CACF,CAIA,CAAC,SAAU,CACT,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,CACvB,CAEA,CAAC,UAAW,CACV,MAAAW,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,EACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAGF,EAEMM,EAAN,cAA0BD,CAAqC,CAC7D,WAAWE,EAAWC,EAAWC,EAAkB,CACjD,OAAOC,EAAMH,EAAGC,EAAGC,CAAC,CACtB,CACF,EAEeE,EAAf,KAA8E,CAQ5E,eAAetB,EAAoB,CAPnCxF,EAAA,KAAiB,WAAW,IAAI,MAAM,CAAC,GAQrC,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBwF,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,CAAC,CACZ,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,CAAC,EACVA,EAAS,CAAC,EACVA,EAAS,EAAE,EACXA,EAAS,EAAE,CACb,EACA,KAAK,SAAS,CAAC,EAAI,KAAK,WACtBA,EAAS,EAAE,EACXA,EAAS,EAAE,EACXA,EAAS,EAAE,EACXA,EAAS,EAAE,CACb,CACF,CAIA,CAAC,SAAU,CACT,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,EACrB,MAAM,KAAK,SAAS,CAAC,CACvB,CAEA,CAAC,UAAW,CACV,MAAAW,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,GACtB,MAAAA,EAAO,KAAK,SAAS,CAAC,EACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAEA,GAAK,IAAK,CACR,OAAO,KAAK,SAAS,CAAC,CACxB,CAGF,EAEMY,EAAN,cAA0BD,CAAqC,CAC7D,WAAWJ,EAAWC,EAAWC,EAAWI,EAAkB,CAC5D,OAAOC,EAAMP,EAAGC,EAAGC,EAAGI,CAAC,CACzB,CACF,EAmBaE,GAAUzB,EAAgB,CACrC,MAAO,UACP,WAAYc,EACZ,KAAM,EACN,QAAS,EACT,sBAAuB,IAAIV,IACzB,IAAIO,EAAY,GAAGP,EAAQ,CAAC,EAAG,GAAGA,EAAQ,CAAC,CAAC,EAC9C,iBAAkB,IAAIL,IAAuB,IAAIY,EAAY,GAAGZ,CAAQ,CAC1E,CAAC,EAgBY2B,GAAU1B,EAAgB,CACrC,MAAO,UACP,WAAYoB,EACZ,KAAM,EACN,QAAS,EACT,yBAAyB,CAACO,EAAIC,EAAIC,CAAE,EAA0B,CAC5D,OAAO,IAAIb,EAAY,GAAGW,EAAI,GAAGC,EAAI,GAAGC,CAAE,CAC5C,EACA,iBAAkB,IAAI9B,IAAuB,IAAIiB,EAAY,GAAGjB,CAAQ,CAC1E,CAAC,EAiBY+B,GAAU9B,EAAgB,CACrC,MAAO,UACP,WAAYwB,EACZ,KAAM,EACN,QAAS,EACT,yBAAyB,CAACG,EAAIC,EAAIC,EAAIE,CAAE,EAAiC,CACvE,OAAO,IAAIT,EAAY,GAAGK,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGE,CAAE,CACnD,EACA,iBAAkB,IAAIhC,IAAuB,IAAIuB,EAAY,GAAGvB,CAAQ,CAC1E,CAAC,ECvWM,SAASiC,GACdC,EACoC,CACpC,MAAO,CACL,MAAO,WACP,SAAAA,CACF,CACF,CCTA,OAKE,YAAAhI,GAEA,UAAAC,OAEK,eASA,SAASgI,GACdpE,EACiB,CACjB,OAAO,IAAIqE,EAAWrE,CAAI,CAC5B,CAKO,SAASsE,GACdhI,EACa,CACb,OAAOA,aAAkB+H,CAC3B,CAMA,IAAMA,EAAN,cACUjI,EAEV,CAME,YAA6BmI,EAAoB,CAC/C,MAAM,EADqB,eAAAA,EAL7B9H,EAAA,KAAgB,QAChBA,EAAA,KAAgB,iBAChBA,EAAA,KAAgB,UAAU,IAC1BA,EAAA,KAAgB,mBAId,KAAK,KAAO,KAAK,UAAU,KAC3B,KAAK,cAAgB,KAAK,UAAU,cACpC,KAAK,gBAAkB,KAAK,UAAU,eACxC,CAEA,mBAA0B,CACxB,MAAM,IAAIC,CACZ,CAEA,MAAMC,EAAuBC,EAAsC,CACjE,KAAK,UAAU,MAAMD,EAAQC,CAAK,CACpC,CAEA,KAAKC,EAA8C,CACjD,OAAO,KAAK,UAAU,KAAKA,CAAK,CAClC,CAEA,QACED,EACAE,EAAsB,IAAIX,GACf,CACX,OAAO,KAAK,UAAU,QAAQS,EAAOE,CAAQ,CAC/C,CAEA,QAAQC,EAA4B,CAClC,MAAO,UAAUA,EAAI,QAAQ,KAAK,SAAS,CAAC,GAC9C,CACF","sourcesContent":["/*\n * Typed-binary types that adhere to the `std140` layout rules.\n */\n\nimport {\n type AnySchema,\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\n\nexport class SimpleTgpuData<TSchema extends AnySchema>\n extends Schema<Unwrap<TSchema>>\n implements TgpuData<Unwrap<TSchema>>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly expressionCode: string;\n public readonly isCustomAligned = false;\n\n private readonly _innerSchema: TSchema;\n public readonly isLoose = false as const;\n public readonly label?: string | undefined;\n\n /**\n * byteAlignment has to be a power of 2\n */\n constructor({\n schema,\n byteAlignment,\n code,\n }: {\n schema: TSchema;\n byteAlignment: number;\n code: string;\n }) {\n super();\n\n this._innerSchema = schema;\n this.byteAlignment = byteAlignment;\n this.expressionCode = code;\n this.size = this.measure(MaxValue).size;\n this.label = code;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this._innerSchema.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n this._innerSchema.measure(value, measurer);\n\n return measurer;\n }\n\n getUnderlyingTypeString(): string {\n if (typeof this.expressionCode === 'string') {\n return this.expressionCode;\n }\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleTgpuData<AnySchema>;\n return underlyingType.getUnderlyingTypeString();\n }\n throw new Error('Unexpected type used as vertex buffer element');\n }\n\n getUnderlyingType(): SimpleTgpuData<AnySchema> {\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleTgpuData<AnySchema>;\n return underlyingType.getUnderlyingType();\n }\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return this.expressionCode;\n }\n}\n","import * as TB from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { TgpuData } from '../types';\nimport { SimpleTgpuData } from './std140';\n\nconst primitiveNumeric = (\n schema: TB.Uint32Schema | TB.Float32Schema | TB.Int32Schema,\n code: string,\n) => {\n return {\n // Type-token, not available at runtime\n __unwrapped: undefined as unknown as number,\n isLoose: false as const,\n isCustomAligned: false,\n\n size: 4,\n byteAlignment: 4,\n expressionCode: code,\n\n write(output: TB.ISerialOutput, value: number): void {\n schema.write(output, value);\n },\n\n read(input: TB.ISerialInput): number {\n return schema.read(input);\n },\n\n measure(\n value: number | TB.MaxValue,\n measurer: TB.IMeasurer = new TB.Measurer(),\n ): TB.IMeasurer {\n schema.measure(value, measurer);\n return measurer;\n },\n\n resolveReferences(ctx: TB.IRefResolver): void {\n throw new RecursiveDataTypeError();\n },\n\n seekProperty(\n reference: number | TB.MaxValue,\n prop: never,\n ): { bufferOffset: number; schema: TB.ISchema<unknown> } | null {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return code;\n },\n\n toString(): string {\n return code;\n },\n } as TgpuData<number>;\n};\n\nexport type Bool = TgpuData<boolean>;\nexport const bool: Bool = new SimpleTgpuData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\n\nexport type U32 = TgpuData<number> & ((v: number | boolean) => number);\nconst u32Cast = (v: number | boolean) => {\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < 0 || v > 0xffffffff) {\n console.warn(`u32 value ${v} overflowed`);\n }\n const value = v & 0xffffffff;\n return value >>> 0;\n }\n return Math.max(0, Math.min(0xffffffff, Math.floor(v)));\n};\nexport const u32: U32 = Object.assign(u32Cast, primitiveNumeric(TB.u32, 'u32'));\n\nexport type I32 = TgpuData<number> & ((v: number | boolean) => number);\nconst i32Cast = (v: number | boolean) => {\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < -0x80000000 || v > 0x7fffffff) {\n console.warn(`i32 value ${v} overflowed`);\n }\n const value = v | 0;\n return value & 0xffffffff;\n }\n // round towards zero\n const value = v < 0 ? Math.ceil(v) : Math.floor(v);\n return Math.max(-0x80000000, Math.min(0x7fffffff, value));\n};\nexport const i32: I32 = Object.assign(i32Cast, primitiveNumeric(TB.i32, 'i32'));\n\nexport type F32 = TgpuData<number> & ((v: number | boolean) => number);\nconst f32Cast = (v: number | boolean) => {\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return v;\n};\nexport const f32: F32 = Object.assign(f32Cast, primitiveNumeric(TB.f32, 'f32'));\n","import {\n type IMeasurer,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type UnwrapRecord,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { TgpuNamable } from '../namable';\nimport { code } from '../tgpuCode';\nimport { identifier } from '../tgpuIdentifier';\nimport type { AnyTgpuData, ResolutionCtx, TgpuData } from '../types';\nimport { isAlignedSchema } from './align';\nimport alignIO from './alignIO';\nimport { isSizedSchema } from './size';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuStruct<TProps extends Record<string, AnyTgpuData>>\n extends ISchema<UnwrapRecord<TProps>>,\n TgpuData<UnwrapRecord<TProps>>,\n TgpuNamable {}\n\nexport const struct = <TProps extends Record<string, AnyTgpuData>>(\n properties: TProps,\n): TgpuStruct<TProps> => new TgpuStructImpl(properties);\n\nexport function isStructSchema<\n T extends TgpuStruct<Record<string, AnyTgpuData>>,\n>(schema: T | unknown): schema is T {\n return schema instanceof TgpuStructImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuStructImpl<TProps extends Record<string, AnyTgpuData>>\n extends Schema<UnwrapRecord<TProps>>\n implements TgpuData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n public readonly isLoose = false as const;\n public readonly isCustomAligned = false;\n\n constructor(private readonly _properties: TProps) {\n super();\n\n this.byteAlignment = Object.values(_properties)\n .map((prop) => prop.byteAlignment)\n .reduce((a, b) => (a > b ? a : b));\n\n this.size = this.measure(MaxValue).size;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n alignIO(output, this.byteAlignment);\n type Property = keyof Parsed<UnwrapRecord<TProps>>;\n\n for (const [key, property] of exactEntries(this._properties)) {\n alignIO(output, property.byteAlignment);\n property.write(output, value[key as Property]);\n }\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n alignIO(input, this.byteAlignment);\n type Property = keyof Parsed<UnwrapRecord<TProps>>;\n const result = {} as Parsed<UnwrapRecord<TProps>>;\n\n for (const [key, property] of exactEntries(this._properties)) {\n alignIO(input, property.byteAlignment);\n result[key as Property] = property.read(input) as Parsed<\n UnwrapRecord<TProps>\n >[Property];\n }\n return result;\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n type Property = keyof Parsed<UnwrapRecord<TProps>>;\n\n for (const [key, property] of exactEntries(this._properties)) {\n alignIO(measurer, property.byteAlignment);\n property.measure(\n value === MaxValue ? MaxValue : value[key as Property],\n measurer,\n );\n }\n\n alignIO(measurer, this.byteAlignment);\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n\n ctx.addDeclaration(code`\n struct ${ident} {\n ${Object.entries(this._properties).map(([key, field]) => code`${getAttribute(field) ?? ''}${key}: ${field},\\n`)}\n }\n `);\n\n return ctx.resolve(ident);\n }\n}\n\nfunction getAttribute<T extends AnyTgpuData>(field: T): string | undefined {\n if (isAlignedSchema(field as unknown)) {\n return `@align(${field.byteAlignment}) `;\n }\n\n if (isSizedSchema(field as unknown)) {\n return `@size(${field.size}) `;\n }\n\n return undefined;\n}\n\nexport function exactEntries<T extends Record<keyof T, T[keyof T]>>(\n record: T,\n): [keyof T, T[keyof T]][] {\n return Object.entries(record) as [keyof T, T[keyof T]][];\n}\n","export const builtin = {\n vertexIndex: Symbol('builtin_vertexIndex'),\n instanceIndex: Symbol('builtin_instanceIndex'),\n position: Symbol('builtin_position'),\n clipDistances: Symbol('builtin_clipDistances'),\n frontFacing: Symbol('builtin_frontFacing'),\n fragDepth: Symbol('builtin_fragDepth'),\n sampleIndex: Symbol('builtin_sampleIndex'),\n sampleMask: Symbol('builtin_sampleMask'),\n fragment: Symbol('builtin_fragment'),\n localInvocationId: Symbol('builtin_localInvocationId'),\n localInvocationIndex: Symbol('builtin_localInvocationIndex'),\n globalInvocationId: Symbol('builtin_globalInvocationId'),\n workgroupId: Symbol('builtin_workgroupId'),\n numWorkgroups: Symbol('builtin_numWorkgroups'),\n} as const;\n\nconst builtins = Object.values(builtin);\n\nexport function getUsedBuiltinsNamed(\n o: Record<symbol, string>,\n): { name: string; builtin: symbol }[] {\n const res = Object.getOwnPropertySymbols(o).map((s) => {\n if (!builtins.includes(s)) {\n throw new Error('Symbol is not a member of `builtin`');\n }\n const name = o[s];\n if (!name) {\n throw new Error('Name is not provided');\n }\n return { name: name, builtin: s };\n });\n return res;\n}\n\nexport function getUsedBuiltins(o: Record<symbol, string>): symbol[] {\n const res = Object.getOwnPropertySymbols(o).map((s) => {\n if (!builtins.includes(s)) {\n throw new Error('Symbol is not a member of `builtin`');\n }\n return s;\n });\n\n return res;\n}\n","import type { TgpuNamable } from './namable';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport function identifier() {\n return new TgpuIdentifierImpl();\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuIdentifierImpl implements TgpuResolvable, TgpuNamable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n","import { builtin } from './builtin';\nimport { identifier } from './tgpuIdentifier';\nimport type { TgpuIdentifier } from './types';\n\nconst builtinToName = {\n [builtin.vertexIndex]: 'vertex_index',\n [builtin.instanceIndex]: 'instance_index',\n [builtin.position]: 'position',\n [builtin.clipDistances]: 'clip_distances',\n [builtin.frontFacing]: 'front_facing',\n [builtin.fragDepth]: 'frag_depth',\n [builtin.sampleIndex]: 'sample_index',\n [builtin.sampleMask]: 'sample_mask',\n [builtin.fragment]: 'fragment',\n [builtin.localInvocationId]: 'local_invocation_id',\n [builtin.localInvocationIndex]: 'local_invocation_index',\n [builtin.globalInvocationId]: 'global_invocation_id',\n [builtin.workgroupId]: 'workgroup_id',\n [builtin.numWorkgroups]: 'num_workgroups',\n};\n\nconst identifierMap = new Map<symbol, TgpuIdentifier>();\n\nexport function nameForBuiltin(key: symbol): string {\n const name = builtinToName[key];\n if (!name) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return name;\n}\n\nexport function idForBuiltin(key: symbol) {\n let id = identifierMap.get(key);\n\n if (id === undefined) {\n id = identifier().$name(builtinToName[key]);\n identifierMap.set(key, id);\n }\n\n return id;\n}\n","import { idForBuiltin } from './builtinIdentifiers';\nimport {\n type BoundTgpuCode,\n type Eventual,\n type InlineResolve,\n type ResolutionCtx,\n type SlotValuePair,\n type TgpuCode,\n type TgpuSlot,\n type Wgsl,\n isResolvable,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): TgpuCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new TgpuCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuCodeImpl implements TgpuCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (typeof s === 'symbol') {\n ctx.addBuiltin(s);\n code += ctx.resolve(idForBuiltin(s));\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundTgpuCodeImpl<T> implements BoundTgpuCode {\n constructor(\n private readonly _innerFn: BoundTgpuCode,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `code:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport {\n type AnyTgpuData,\n type AnyTgpuLooseData,\n type ResolutionCtx,\n type TgpuData,\n type TgpuLooseData,\n isDataLoose,\n isDataNotLoose,\n} from '../types';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport function align<TAlign extends number, TData extends AnyTgpuData>(\n byteAlignment: TAlign,\n data: TData,\n): TgpuAligned<TAlign, TData>;\n\nexport function align<TAlign extends number, TData extends AnyTgpuLooseData>(\n byteAlignment: TAlign,\n data: TData,\n): TgpuLooseAligned<TAlign, TData>;\n\nexport function align<\n TAlign extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(\n byteAlignment: TAlign,\n data: TData,\n):\n | TgpuAligned<TAlign, Extract<TData, AnyTgpuData>>\n | TgpuLooseAligned<TAlign, Extract<TData, AnyTgpuLooseData>> {\n if (isDataLoose(data)) {\n return new TgpuLooseAlignedImpl<TAlign, Extract<TData, AnyTgpuLooseData>>(\n data,\n byteAlignment,\n );\n }\n\n if (isDataNotLoose(data)) {\n return new TgpuAlignedImpl<TAlign, Extract<TData, AnyTgpuData>>(\n data,\n byteAlignment,\n );\n }\n\n throw new Error(`Could not align data: ${data}`);\n}\n\nexport interface TgpuAligned<TAlign extends number, TData extends AnyTgpuData>\n extends TgpuData<Unwrap<TData>> {\n readonly byteAlignment: TAlign;\n}\n\nexport interface TgpuLooseAligned<\n TAlign extends number,\n TData extends AnyTgpuLooseData,\n> extends TgpuLooseData<Unwrap<TData>> {\n readonly byteAlignment: TAlign;\n}\n\nexport function isLooseAlignedSchema<\n T extends TgpuLooseAligned<number, AnyTgpuLooseData>,\n>(value: T | unknown): value is T {\n return value instanceof TgpuLooseAlignedImpl;\n}\n\nexport function isAlignedSchema<T extends TgpuAligned<number, AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return value instanceof TgpuAlignedImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass AbstractTgpuAlignedImpl<\n TAlign extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n> extends Schema<Unwrap<TData>> {\n public readonly size: number;\n public readonly isCustomAligned = true;\n\n constructor(\n private data: AnyTgpuData | AnyTgpuLooseData,\n public readonly byteAlignment: TAlign,\n ) {\n super();\n\n this.size = this.data.size;\n\n if (byteAlignment <= 0) {\n throw new Error(\n `Custom data alignment must be a positive number, got: ${byteAlignment}.`,\n );\n }\n\n if (Math.log2(byteAlignment) % 1 !== 0) {\n throw new Error(\n `Alignment has to be a power of 2, got: ${byteAlignment}.`,\n );\n }\n\n if (isDataNotLoose(this.data)) {\n if (byteAlignment % this.data.byteAlignment !== 0) {\n throw new Error(\n `Custom alignment has to be a multiple of the standard data byteAlignment. Got: ${byteAlignment}, expected multiple of: ${this.data.byteAlignment}.`,\n );\n }\n }\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TData>): void {\n alignIO(output, this.byteAlignment);\n this.data.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TData> {\n alignIO(input, this.byteAlignment);\n return this.data.read(input) as ParseUnwrapped<TData>;\n }\n\n measure(\n value: MaxValue | ParseUnwrapped<TData>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n return this.data.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return this.data.resolve(ctx);\n }\n}\n\nclass TgpuAlignedImpl<TAlign extends number, TData extends AnyTgpuData>\n extends AbstractTgpuAlignedImpl<TAlign, TData>\n implements TgpuAligned<TAlign, TData>\n{\n public readonly isLoose = false as const;\n}\n\nclass TgpuLooseAlignedImpl<\n TAlign extends number,\n TData extends AnyTgpuLooseData,\n >\n extends AbstractTgpuAlignedImpl<TAlign, TData>\n implements TgpuLooseAligned<TAlign, TData>\n{\n public readonly isLoose = true as const;\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport type { AnyTgpuData, ResolutionCtx, TgpuData } from '../types';\n\n// ----------\n// Public API\n// ----------\n\nexport function size<TSize extends number, TData extends AnyTgpuData>(\n size: TSize,\n data: TData,\n): TgpuSized<TSize, TData> {\n return new TgpuSizedImpl(data, size);\n}\n\nexport interface TgpuSized<TSize extends number, TData extends AnyTgpuData>\n extends TgpuData<Unwrap<TData>> {\n readonly size: TSize;\n}\n\nexport function isSizedSchema<T extends TgpuSized<number, TgpuData<unknown>>>(\n value: T | unknown,\n): value is T {\n return value instanceof TgpuSizedImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuSizedImpl<TSize extends number, TData extends AnyTgpuData>\n extends Schema<Unwrap<TData>>\n implements TgpuSized<TSize, TData>\n{\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n public readonly isCustomAligned: boolean;\n\n constructor(\n private data: AnyTgpuData,\n public readonly size: TSize,\n ) {\n super();\n\n this.byteAlignment = this.data.byteAlignment;\n this.isCustomAligned = this.data.isCustomAligned;\n\n if (size < this.data.size) {\n throw new Error(\n `Custom data size cannot be smaller then the standard data size. Got: ${size}, expected at least: ${this.data.size}.`,\n );\n }\n\n if (size <= 0) {\n throw new Error(\n `Custom data size must be a positive number. Got: ${size}.`,\n );\n }\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TData>): void {\n this.data.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TData> {\n return this.data.read(input) as ParseUnwrapped<TData>;\n }\n\n measure(\n value: MaxValue | ParseUnwrapped<TData>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.size);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return this.data.resolve(ctx);\n }\n}\n","import type * as TB from 'typed-binary';\nimport {\n type IMeasurer,\n type MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport type {\n AnyTgpuData,\n ResolutionCtx,\n TgpuData,\n TgpuLooseData,\n} from '../types';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuArray<TElement extends AnyTgpuData>\n extends TgpuData<Unwrap<TElement>[]> {\n readonly elementType: TElement;\n readonly elementCount: number;\n}\n\nexport const arrayOf = <TElement extends AnyTgpuData>(\n elementType: TElement,\n count: number,\n): TgpuArray<TElement> => new TgpuArrayImpl(elementType, count);\n\nexport interface TgpuLooseArray<TElement extends AnyTgpuData>\n extends TgpuLooseData<Unwrap<TElement>[]> {\n readonly elementType: TElement;\n readonly elementCount: number;\n}\n\nexport const looseArrayOf = <TElement extends AnyTgpuData>(\n elementType: TElement,\n count: number,\n): TgpuLooseArray<TElement> => new TgpuLooseArrayImpl(elementType, count);\n\nexport function isArraySchema<T extends TgpuArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuArrayImpl;\n}\n\nexport function isLooseArraySchema<T extends TgpuLooseArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuLooseArrayImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuArrayImpl<TElement extends AnyTgpuData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuArray<TElement>\n{\n readonly elementType: TElement;\n readonly elementCount: number;\n readonly byteAlignment: number;\n readonly size: number;\n readonly stride: number;\n readonly isLoose = false;\n readonly isCustomAligned = false;\n\n constructor(elementType: TElement, count: number) {\n super();\n this.elementType = elementType;\n this.elementCount = count;\n this.byteAlignment = elementType.byteAlignment;\n this.stride = roundUp(\n this.elementType.size,\n this.elementType.byteAlignment,\n );\n this.size = this.stride * this.elementCount;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n alignIO(output, this.byteAlignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n alignIO(output, this.byteAlignment);\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.stride * this.elementCount);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n alignIO(input, this.byteAlignment);\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n alignIO(input, this.byteAlignment);\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n return elements;\n }\n\n measure(\n value: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n return measurer.add(this.stride * this.elementCount);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(`\n array<${ctx.resolve(this.elementType)}, ${this.elementCount}>\n `);\n }\n}\n\nclass TgpuLooseArrayImpl<TElement extends AnyTgpuData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuLooseArray<TElement>\n{\n readonly elementType: TElement;\n readonly elementCount: number;\n readonly size: number;\n readonly stride: number;\n readonly isLoose = true;\n\n constructor(elementType: TElement, count: number) {\n super();\n this.elementType = elementType;\n this.elementCount = count;\n\n this.stride = this.elementType.isCustomAligned\n ? roundUp(this.elementType.size, this.elementType.byteAlignment)\n : this.elementType.size;\n\n this.size = this.stride * this.elementCount;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n if (this.elementType.isCustomAligned) {\n alignIO(output, this.elementType.byteAlignment);\n }\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.stride * this.elementCount);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n if (this.elementType.isCustomAligned) {\n alignIO(input, this.elementType.byteAlignment);\n }\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n return elements;\n }\n\n measure(\n value: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.stride * this.elementCount);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(`\n array<${ctx.resolve(this.elementType)}, ${this.elementCount}>\n `);\n }\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type Parsed,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { roundUp } from '../mathUtils';\nimport type { TgpuData } from '../types';\nimport { vec2f, vec3f, vec4f, type vecBase } from './vector';\n\n// --------------\n// Implementation\n// --------------\n\ninterface MatSchemaOptions<ValueType, ColumnType extends vecBase> {\n label: string;\n columnType: TgpuData<ColumnType>;\n rows: number;\n columns: number;\n makeFromColumnVectors(...columns: ColumnType[]): ValueType;\n makeFromElements(...elements: number[]): ValueType;\n}\n\ntype MatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n> = TgpuData<ValueType> & ((...args: (number | ColumnType)[]) => ValueType);\n\nfunction createMatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n>(\n options: MatSchemaOptions<ValueType, ColumnType>,\n): MatSchema<ValueType, ColumnType> {\n const MatSchema: TgpuData<ValueType> = {\n // Type-token, not available at runtime.\n __unwrapped: undefined as unknown as ValueType,\n isLoose: false as const,\n isCustomAligned: false,\n\n label: options.label,\n byteAlignment: options.columnType.byteAlignment,\n size: roundUp(\n options.columnType.size * options.columns,\n options.columnType.byteAlignment,\n ),\n\n resolveReferences() {\n throw new RecursiveDataTypeError();\n },\n\n write(output: ISerialOutput, value: Parsed<ValueType>): void {\n for (const col of value.columns()) {\n options.columnType.write(output, col as Parsed<ColumnType>);\n }\n },\n\n read(input: ISerialInput): Parsed<ValueType> {\n const columns = new Array(options.columns) as ColumnType[];\n\n for (let c = 0; c < options.columns; ++c) {\n columns[c] = options.columnType.read(input) as ColumnType;\n }\n\n return options.makeFromColumnVectors(...columns) as Parsed<ValueType>;\n },\n\n measure(_value: MaxValue, measurer: IMeasurer = new Measurer()): IMeasurer {\n return measurer.add(this.size);\n },\n\n seekProperty() {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return options.label;\n },\n };\n\n const construct = (...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 elements.push(...arg);\n }\n }\n\n // Fill the rest with zeros\n for (let i = elements.length; i < options.columns * options.rows; ++i) {\n elements.push(0);\n }\n\n return options.makeFromElements(...elements);\n };\n\n return Object.assign(construct, MatSchema);\n}\n\ninterface matBase<TColumn> {\n columns(): Iterable<TColumn>;\n elements(): Iterable<number>;\n}\n\nabstract class mat2x2Impl<TColumn extends vecBase> implements mat2x2<TColumn> {\n private _columns = new Array(2) as [TColumn, TColumn];\n\n constructor(...elements: number[]) {\n this._columns[0] = this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n );\n this._columns[1] = this.makeColumn(\n elements[2] as number,\n elements[3] as number,\n );\n }\n\n abstract makeColumn(e0: number, e1: number): TColumn;\n\n *columns() {\n yield this._columns[0];\n yield this._columns[1];\n }\n\n *elements() {\n yield* this._columns[0];\n yield* this._columns[1];\n }\n\n get [0]() {\n return this._columns[0];\n }\n\n get [1]() {\n return this._columns[1];\n }\n\n [idx: number]: TColumn | undefined;\n}\n\nclass mat2x2fImpl extends mat2x2Impl<vec2f> implements mat2x2f {\n makeColumn(e0: number, e1: number): vec2f {\n return vec2f(e0, e1);\n }\n}\n\nabstract class mat3x3Impl<TColumn extends vecBase> implements mat3x3<TColumn> {\n private _columns = new Array(3) as [TColumn, TColumn, TColumn];\n\n constructor(...elements: number[]) {\n this._columns[0] = this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n );\n this._columns[1] = this.makeColumn(\n elements[3] as number,\n elements[4] as number,\n elements[5] as number,\n );\n this._columns[2] = this.makeColumn(\n elements[6] as number,\n elements[7] as number,\n elements[8] as number,\n );\n }\n\n abstract makeColumn(x: number, y: number, z: number): TColumn;\n\n *columns() {\n yield this._columns[0];\n yield this._columns[1];\n yield this._columns[2];\n }\n\n *elements() {\n yield* this._columns[0];\n yield* this._columns[1];\n yield* this._columns[2];\n }\n\n get [0]() {\n return this._columns[0];\n }\n\n get [1]() {\n return this._columns[1];\n }\n\n get [2]() {\n return this._columns[2];\n }\n\n [idx: number]: TColumn | undefined;\n}\n\nclass mat3x3fImpl extends mat3x3Impl<vec3f> implements mat3x3f {\n makeColumn(x: number, y: number, z: number): vec3f {\n return vec3f(x, y, z);\n }\n}\n\nabstract class mat4x4Impl<TColumn extends vecBase> implements mat4x4<TColumn> {\n private readonly _columns = new Array(4) as [\n TColumn,\n TColumn,\n TColumn,\n TColumn,\n ];\n\n constructor(...elements: number[]) {\n this._columns[0] = 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._columns[1] = 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._columns[2] = 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._columns[3] = 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 abstract makeColumn(x: number, y: number, z: number, w: number): TColumn;\n\n *columns() {\n yield this._columns[0];\n yield this._columns[1];\n yield this._columns[2];\n yield this._columns[3];\n }\n\n *elements() {\n yield* this._columns[0];\n yield* this._columns[1];\n yield* this._columns[2];\n yield* this._columns[3];\n }\n\n get [0]() {\n return this._columns[0];\n }\n\n get [1]() {\n return this._columns[1];\n }\n\n get [2]() {\n return this._columns[2];\n }\n\n get [3]() {\n return this._columns[3];\n }\n\n [idx: number]: TColumn | undefined;\n}\n\nclass mat4x4fImpl extends mat4x4Impl<vec4f> implements mat4x4f {\n makeColumn(x: number, y: number, z: number, w: number): vec4f {\n return vec4f(x, y, z, w);\n }\n}\n\n// ----------\n// Public API\n// ----------\n\nexport interface mat2x2<TColumn> extends matBase<TColumn> {\n [0]: TColumn;\n [1]: TColumn;\n [idx: number]: TColumn | undefined;\n}\n\nexport interface mat2x2f extends mat2x2<vec2f> {}\n\nexport type Mat2x2f = TgpuData<mat2x2f> &\n ((...elements: number[]) => mat2x2f) &\n ((...columns: vec2f[]) => mat2x2f) &\n (() => mat2x2f);\n\nexport const mat2x2f = createMatSchema({\n label: 'mat2x2f',\n columnType: vec2f,\n rows: 2,\n columns: 2,\n makeFromColumnVectors: (...columns: [vec2f, vec2f]) =>\n new mat2x2fImpl(...columns[0], ...columns[1]),\n makeFromElements: (...elements: number[]) => new mat2x2fImpl(...elements),\n}) as Mat2x2f;\n\nexport interface mat3x3<TColumn> extends matBase<TColumn> {\n [0]: TColumn;\n [1]: TColumn;\n [2]: TColumn;\n [idx: number]: TColumn | undefined;\n}\n\nexport interface mat3x3f extends mat3x3<vec3f> {}\n\nexport type Mat3x3f = TgpuData<mat3x3f> &\n ((...elements: number[]) => mat3x3f) &\n ((...columns: vec3f[]) => mat3x3f) &\n (() => mat3x3f);\n\nexport const mat3x3f = createMatSchema({\n label: 'mat3x3f',\n columnType: vec3f,\n rows: 3,\n columns: 3,\n makeFromColumnVectors(...[v0, v1, v2]: [vec3f, vec3f, vec3f]) {\n return new mat3x3fImpl(...v0, ...v1, ...v2);\n },\n makeFromElements: (...elements: number[]) => new mat3x3fImpl(...elements),\n}) as Mat3x3f;\n\nexport interface mat4x4<TColumn> extends matBase<TColumn> {\n [0]: TColumn;\n [1]: TColumn;\n [2]: TColumn;\n [3]: TColumn;\n [idx: number]: TColumn | undefined;\n}\n\nexport interface mat4x4f extends mat4x4<vec4f> {}\n\nexport type Mat4x4f = TgpuData<mat4x4f> &\n ((...elements: number[]) => mat4x4f) &\n ((...columns: vec4f[]) => mat4x4f) &\n (() => mat4x4f);\n\nexport const mat4x4f = createMatSchema({\n label: 'mat4x4f',\n columnType: vec4f,\n rows: 4,\n columns: 4,\n makeFromColumnVectors(...[v0, v1, v2, v3]: [vec4f, vec4f, vec4f, vec4f]) {\n return new mat4x4fImpl(...v0, ...v1, ...v2, ...v3);\n },\n makeFromElements: (...elements: number[]) => new mat4x4fImpl(...elements),\n}) as Mat4x4f;\n","import type { AnyTgpuData, TgpuPointer } from '../types';\n\nexport function ptr<TDataType extends AnyTgpuData>(\n pointsTo: TDataType,\n): TgpuPointer<'function', TDataType> {\n return {\n scope: 'function',\n pointsTo,\n };\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\nimport type { I32, U32 } from './numeric';\n\n// ----------\n// Public API\n// ----------\n\nexport function atomic<TSchema extends U32 | I32>(\n data: TSchema,\n): Atomic<TSchema> {\n return new AtomicImpl(data);\n}\n\nexport interface Atomic<TSchema extends U32 | I32>\n extends TgpuData<Unwrap<TSchema>> {}\n\nexport function isAtomicSchema<T extends Atomic<U32 | I32>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof AtomicImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass AtomicImpl<TSchema extends U32 | I32>\n extends Schema<Unwrap<TSchema>>\n implements Atomic<TSchema>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n public readonly isCustomAligned: boolean;\n\n constructor(private readonly innerData: TSchema) {\n super();\n this.size = this.innerData.size;\n this.byteAlignment = this.innerData.byteAlignment;\n this.isCustomAligned = this.innerData.isCustomAligned;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this.innerData.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this.innerData.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return this.innerData.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return `atomic<${ctx.resolve(this.innerData)}>`;\n }\n}\n"]}
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|