typegpu 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
package/data/index.js.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/size.ts","../../src/data/array.ts","../../src/mathUtils.ts","../../src/data/matrix.ts","../../src/data/pointer.ts","../../src/data/atomic.ts"],"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';\nimport alignIO from './alignIO';\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\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 }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n alignIO(output, this.byteAlignment);\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n alignIO(input, this.byteAlignment);\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 alignIO(measurer, this.byteAlignment);\n\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 type { TgpuData } from '../types';\nimport { SimpleTgpuData } from './std140';\n\nexport type Bool = TgpuData<boolean>;\nexport const bool: Bool = new SimpleTgpuData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\nexport type U32 = TgpuData<number>;\nexport const u32: U32 = new SimpleTgpuData({\n schema: TB.u32,\n byteAlignment: 4,\n code: 'u32',\n});\nexport type I32 = TgpuData<number>;\nexport const i32: I32 = new SimpleTgpuData({\n schema: TB.i32,\n byteAlignment: 4,\n code: 'i32',\n});\nexport type F32 = TgpuData<number>;\nexport const f32: F32 = new SimpleTgpuData({\n schema: TB.f32,\n byteAlignment: 4,\n code: 'f32',\n});\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 object,\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 { TgpuAlignedImpl } from './align';\nimport alignIO from './alignIO';\nimport { TgpuSizedImpl } 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\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 private _innerSchema: ISchema<UnwrapRecord<TProps>>;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n\n constructor(private readonly _properties: TProps) {\n super();\n\n this._innerSchema = object(_properties);\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 this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n alignIO(input, this.byteAlignment);\n return this._innerSchema.read(input);\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n this._innerSchema.measure(value, measurer);\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(field: AnyTgpuData): string | undefined {\n if (field instanceof TgpuAlignedImpl) {\n return `@align(${field.byteAlignment}) `;\n }\n if (field instanceof TgpuSizedImpl) {\n return `@size(${field.size}) `;\n }\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 type { AnyTgpuData, ResolutionCtx, TgpuData } from '../types';\nimport alignIO from './alignIO';\n\nexport function align<TAlign extends number, TData extends AnyTgpuData>(\n byteAlignment: TAlign,\n data: TData,\n): TgpuAligned<TAlign, TData> {\n return new TgpuAlignedImpl(data, byteAlignment);\n}\n\nexport interface TgpuAligned<TAlign extends number, TData extends AnyTgpuData>\n extends TgpuData<Unwrap<TData>> {}\n\nexport class TgpuAlignedImpl<TAlign extends number, TData extends AnyTgpuData>\n extends Schema<Unwrap<TData>>\n implements TgpuAligned<TAlign, TData>\n{\n public readonly size: number;\n\n constructor(\n private data: AnyTgpuData,\n public readonly byteAlignment: number,\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 (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 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","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\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\nexport class TgpuSizedImpl<TSize extends number, TData extends AnyTgpuData>\n extends Schema<Unwrap<TData>>\n implements TgpuSized<TSize, TData>\n{\n public readonly byteAlignment: number;\n\n constructor(\n private data: AnyTgpuData,\n public readonly size: number,\n ) {\n super();\n\n this.byteAlignment = this.data.byteAlignment;\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 { AnyTgpuData, ResolutionCtx, TgpuData } from '../types';\nimport alignIO from './alignIO';\n\nexport interface TgpuArray<TElement extends AnyTgpuData>\n extends TgpuData<Unwrap<TElement>[]> {\n readonly elementType: TElement;\n readonly elementCount: number;\n}\n\nexport class 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 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 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 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\nexport const arrayOf = <TElement extends AnyTgpuData>(\n elementType: TElement,\n count: number,\n): TgpuArray<TElement> => new TgpuArrayImpl(elementType, count);\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 alignIO from './alignIO';\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\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 alignIO(measurer, this.byteAlignment);\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\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\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\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"],"mappings":"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","names":["MaxValue","Measurer","Schema","SimpleTgpuData","Schema","schema","byteAlignment","code","__publicField","MaxValue","RecursiveDataTypeError","output","value","alignIO_default","input","measurer","Measurer","ctx","TB","bool","SimpleTgpuData","u32","i32","f32","MaxValue","Measurer","Schema","object","builtin","builtins","identifier","TgpuIdentifierImpl","__publicField","label","ctx","_a","builtinToName","builtin","identifierMap","idForBuiltin","key","id","identifierMap","identifier","builtinToName","code","strings","params","segments","string","idx","param","TgpuCodeImpl","__publicField","label","ctx","s","isResolvable","result","eventual","idForBuiltin","slot","value","BoundTgpuCodeImpl","_a","_BoundTgpuCodeImpl","_innerFn","_slotValuePair","_b","Measurer","Schema","align","byteAlignment","data","TgpuAlignedImpl","Schema","__publicField","output","value","alignIO_default","input","measurer","Measurer","ctx","Measurer","Schema","size","data","TgpuSizedImpl","Schema","__publicField","output","value","input","measurer","Measurer","ctx","struct","properties","TgpuStructImpl","Schema","_properties","__publicField","object","prop","a","b","MaxValue","label","RecursiveDataTypeError","output","value","alignIO_default","input","measurer","Measurer","ctx","ident","identifier","code","key","field","_a","getAttribute","TgpuAlignedImpl","TgpuSizedImpl","Measurer","Schema","roundUp","value","modulo","bitMask","invBitMask","TgpuArrayImpl","Schema","elementType","count","__publicField","roundUp","output","value","alignIO_default","beginning","i","input","elements","measurer","Measurer","ctx","arrayOf","Measurer","createMatSchema","options","MatSchema","roundUp","RecursiveDataTypeError","output","value","col","input","columns","c","_value","measurer","Measurer","alignIO_default","args","elements","arg","i","mat2x2Impl","__publicField","__yieldStar","mat2x2fImpl","e0","e1","vec2f","mat3x3Impl","mat3x3fImpl","x","y","z","vec3f","mat4x4Impl","mat4x4fImpl","w","vec4f","mat2x2f","mat3x3f","v0","v1","v2","mat4x4f","v3","ptr","pointsTo","Measurer","Schema","atomic","data","AtomicImpl","Schema","innerData","__publicField","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx"]}
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"],"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"],"mappings":"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","names":["MaxValue","Measurer","Schema","SimpleTgpuData","Schema","schema","byteAlignment","code","__publicField","MaxValue","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx","TB","primitiveNumeric","schema","code","output","value","input","measurer","ctx","RecursiveDataTypeError","reference","prop","bool","SimpleTgpuData","u32Cast","v","u32","i32Cast","i32","f32Cast","f32","MaxValue","Measurer","Schema","builtin","builtins","identifier","TgpuIdentifierImpl","__publicField","label","ctx","_a","builtinToName","builtin","identifierMap","idForBuiltin","key","id","identifierMap","identifier","builtinToName","code","strings","params","segments","string","idx","param","TgpuCodeImpl","__publicField","label","ctx","s","isResolvable","result","eventual","idForBuiltin","slot","value","BoundTgpuCodeImpl","_a","_BoundTgpuCodeImpl","_innerFn","_slotValuePair","_b","Measurer","Schema","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","align","byteAlignment","data","isDataLoose","TgpuLooseAlignedImpl","isDataNotLoose","TgpuAlignedImpl","isAlignedSchema","value","TgpuAlignedImpl","AbstractTgpuAlignedImpl","Schema","data","byteAlignment","__publicField","isDataNotLoose","output","alignIO_default","input","measurer","Measurer","ctx","TgpuLooseAlignedImpl","Measurer","Schema","size","data","TgpuSizedImpl","isSizedSchema","value","Schema","__publicField","output","input","measurer","Measurer","ctx","struct","properties","TgpuStructImpl","isStructSchema","schema","Schema","_properties","__publicField","prop","a","b","MaxValue","label","RecursiveDataTypeError","output","value","alignIO_default","key","property","exactEntries","input","result","measurer","Measurer","ctx","ident","identifier","code","field","_a","getAttribute","isAlignedSchema","isSizedSchema","record","Measurer","Schema","roundUp","value","modulo","bitMask","invBitMask","arrayOf","elementType","count","TgpuArrayImpl","isArraySchema","schema","TgpuArrayImpl","TgpuArrayImpl","Schema","elementType","count","__publicField","roundUp","output","value","alignIO_default","beginning","i","input","elements","measurer","Measurer","ctx","Measurer","createMatSchema","options","MatSchema","roundUp","RecursiveDataTypeError","output","value","col","input","columns","c","_value","measurer","Measurer","args","elements","arg","i","mat2x2Impl","__publicField","__yieldStar","mat2x2fImpl","e0","e1","vec2f","mat3x3Impl","mat3x3fImpl","x","y","z","vec3f","mat4x4Impl","mat4x4fImpl","w","vec4f","mat2x2f","mat3x3f","v0","v1","v2","mat4x4f","v3","ptr","pointsTo","Measurer","Schema","atomic","data","AtomicImpl","isAtomicSchema","schema","Schema","innerData","__publicField","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx"]}
package/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkPMM3NYJ4cjs = require('./chunk-PMM3NYJ4.cjs');var _typedbinary = require('typed-binary');var U={usableAsUniform:!0},B={usableAsStorage:!0},D={usableAsVertex:!0};function V(e,t){return new w(e,t)}function M(e){return!!e.usableAsUniform}function E(e){return!!e.usableAsStorage}function k(e){return!!e.usableAsVertex}var w=class{constructor(t,r){this.dataType=t;this.initialOrBuffer=r;_chunkPMM3NYJ4cjs.a.call(void 0, this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);_chunkPMM3NYJ4cjs.a.call(void 0, this,"_device",null);_chunkPMM3NYJ4cjs.a.call(void 0, this,"_buffer",null);_chunkPMM3NYJ4cjs.a.call(void 0, this,"_destroyed",!1);_chunkPMM3NYJ4cjs.a.call(void 0, this,"_label");_chunkPMM3NYJ4cjs.a.call(void 0, this,"initial");_chunkPMM3NYJ4cjs.a.call(void 0, this,"usableAsUniform",!1);_chunkPMM3NYJ4cjs.a.call(void 0, this,"usableAsStorage",!1);_chunkPMM3NYJ4cjs.a.call(void 0, this,"usableAsVertex",!1);_chunkPMM3NYJ4cjs.d.call(void 0, r)?this._buffer=r:this.initial=r}get label(){return this._label}get buffer(){if(!this._device)throw new Error("To use this property, make the buffer unmanaged by passing a GPUDevice to $device");if(this._destroyed)throw new Error("This buffer has been destroyed");if(!this._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new (0, _typedbinary.BufferWriter)(this._buffer.getMappedRange());this.dataType.write(t,this.initial),this._buffer.unmap()}return this._buffer}get device(){if(!this._device)throw new Error("This buffer has not been assigned a device. Use .$device(device) to assign a device");return this._device}get destroyed(){return this._destroyed}$name(t){return this._label=t,this}$usage(...t){for(let r of t)this.flags|=r===U?GPUBufferUsage.UNIFORM:0,this.flags|=r===B?GPUBufferUsage.STORAGE:0,this.flags|=r===D?GPUBufferUsage.VERTEX:0,this.usableAsUniform=this.usableAsUniform||r===U,this.usableAsStorage=this.usableAsStorage||r===B,this.usableAsVertex=this.usableAsVertex||r===D;return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}destroy(){var t;this._destroyed||(this._destroyed=!0,(t=this._buffer)==null||t.destroy())}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};function _(e,t){let r=e.buffer,c=e.device;if(r.mapState==="mapped"){let x=r.getMappedRange();e.dataType.write(new (0, _typedbinary.BufferWriter)(x),t);return}let v=e.dataType.size,z=new ArrayBuffer(v);e.dataType.write(new (0, _typedbinary.BufferWriter)(z),t),c.queue.writeBuffer(r,0,z,0,v)}async function S(e){let t=e.buffer,r=e.device;if(t.mapState==="mapped"){let x=t.getMappedRange();return e.dataType.read(new (0, _typedbinary.BufferReader)(x))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let x=t.getMappedRange(),A=e.dataType.read(new (0, _typedbinary.BufferReader)(x));return t.unmap(),A}let c=r.createBuffer({size:e.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=r.createCommandEncoder();v.copyBufferToBuffer(t,0,c,0,e.dataType.size),r.queue.submit([v.finish()]),await r.queue.onSubmittedWorkDone(),await c.mapAsync(GPUMapMode.READ,0,e.dataType.size);let z=e.dataType.read(new (0, _typedbinary.BufferReader)(c.getMappedRange()));return c.unmap(),c.destroy(),z}var f=e=>Math.sqrt(e.x**2+e.y**2),o=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),d=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),n={length:{vec2f:f,vec2i:f,vec2u:f,vec3f:o,vec3i:o,vec3u:o,vec4f:d,vec4i:d,vec4u:d},add:{vec2f:(e,t)=>_chunkPMM3NYJ4cjs.g.call(void 0, e.x+t.x,e.y+t.y),vec2i:(e,t)=>_chunkPMM3NYJ4cjs.h.call(void 0, e.x+t.x,e.y+t.y),vec2u:(e,t)=>_chunkPMM3NYJ4cjs.i.call(void 0, e.x+t.x,e.y+t.y),vec3f:(e,t)=>_chunkPMM3NYJ4cjs.j.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>_chunkPMM3NYJ4cjs.k.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>_chunkPMM3NYJ4cjs.l.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>_chunkPMM3NYJ4cjs.m.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>_chunkPMM3NYJ4cjs.n.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>_chunkPMM3NYJ4cjs.o.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>_chunkPMM3NYJ4cjs.g.call(void 0, e.x-t.x,e.y-t.y),vec2i:(e,t)=>_chunkPMM3NYJ4cjs.h.call(void 0, e.x-t.x,e.y-t.y),vec2u:(e,t)=>_chunkPMM3NYJ4cjs.i.call(void 0, e.x-t.x,e.y-t.y),vec3f:(e,t)=>_chunkPMM3NYJ4cjs.j.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>_chunkPMM3NYJ4cjs.k.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>_chunkPMM3NYJ4cjs.l.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>_chunkPMM3NYJ4cjs.m.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>_chunkPMM3NYJ4cjs.n.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>_chunkPMM3NYJ4cjs.o.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>_chunkPMM3NYJ4cjs.g.call(void 0, e*t.x,e*t.y),vec2i:(e,t)=>_chunkPMM3NYJ4cjs.h.call(void 0, e*t.x,e*t.y),vec2u:(e,t)=>_chunkPMM3NYJ4cjs.i.call(void 0, e*t.x,e*t.y),vec3f:(e,t)=>_chunkPMM3NYJ4cjs.j.call(void 0, e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>_chunkPMM3NYJ4cjs.k.call(void 0, e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>_chunkPMM3NYJ4cjs.l.call(void 0, e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>_chunkPMM3NYJ4cjs.m.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>_chunkPMM3NYJ4cjs.n.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>_chunkPMM3NYJ4cjs.o.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w)},dot:{vec2f:(e,t)=>e.x*t.x+e.y*t.y,vec2i:(e,t)=>e.x*t.x+e.y*t.y,vec2u:(e,t)=>e.x*t.x+e.y*t.y,vec3f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec4f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},normalize:{vec2f:e=>{let t=f(e);return _chunkPMM3NYJ4cjs.g.call(void 0, e.x/t,e.y/t)},vec2i:e=>{let t=f(e);return _chunkPMM3NYJ4cjs.h.call(void 0, e.x/t,e.y/t)},vec2u:e=>{let t=f(e);return _chunkPMM3NYJ4cjs.i.call(void 0, e.x/t,e.y/t)},vec3f:e=>{let t=o(e);return _chunkPMM3NYJ4cjs.j.call(void 0, e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=o(e);return _chunkPMM3NYJ4cjs.k.call(void 0, e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=o(e);return _chunkPMM3NYJ4cjs.l.call(void 0, e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=d(e);return _chunkPMM3NYJ4cjs.m.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=d(e);return _chunkPMM3NYJ4cjs.n.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=d(e);return _chunkPMM3NYJ4cjs.o.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>_chunkPMM3NYJ4cjs.j.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3i:(e,t)=>_chunkPMM3NYJ4cjs.k.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3u:(e,t)=>_chunkPMM3NYJ4cjs.l.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}};var $={add:(e,t)=>n.add[e.kind](e,t),sub:(e,t)=>n.sub[e.kind](e,t),mul:(e,t)=>n.mul[t.kind](e,t),dot:(e,t)=>n.dot[e.kind](e,t),normalize:e=>n.normalize[e.kind](e),cross:(e,t)=>n.cross[e.kind](e,t),fract:e=>e-Math.floor(e),length:e=>n.length[e.kind](e),sin:Math.sin,cos:Math.cos};var K={Uniform:U,Storage:B,Vertex:D,createBuffer:V,read:S,write:_},L= exports.default =K;exports.RecursiveDataTypeError = _chunkPMM3NYJ4cjs.e; exports.default = L; exports.isUsableAsStorage = E; exports.isUsableAsUniform = M; exports.isUsableAsVertex = k; exports.std = $; exports.tgpu = K;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7EYKOUWHcjs = require('./chunk-7EYKOUWH.cjs');var _typedbinary = require('typed-binary');var N=Symbol("This plum's value is sourced from outside the runtime.");function V(e){return e.__brand==="TgpuPlum"}var b={usableAsUniform:!0},D={usableAsStorage:!0},z={usableAsVertex:!0};function k(e,t,r){return new h(e,t,r)}function G(e){return e.resourceType==="buffer"}function M(e){return!!e.usableAsUniform}function C(e){return!!e.usableAsStorage}function I(e){return!!e.usableAsVertex}var h=class{constructor(t,r,u){this._group=t;this.dataType=r;this.initialOrBuffer=u;_chunk7EYKOUWHcjs.a.call(void 0, this,"resourceType","buffer");_chunk7EYKOUWHcjs.a.call(void 0, this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);_chunk7EYKOUWHcjs.a.call(void 0, this,"_device",null);_chunk7EYKOUWHcjs.a.call(void 0, this,"_buffer",null);_chunk7EYKOUWHcjs.a.call(void 0, this,"_destroyed",!1);_chunk7EYKOUWHcjs.a.call(void 0, this,"_subscription",null);_chunk7EYKOUWHcjs.a.call(void 0, this,"_label");_chunk7EYKOUWHcjs.a.call(void 0, this,"initial");_chunk7EYKOUWHcjs.a.call(void 0, this,"usableAsUniform",!1);_chunk7EYKOUWHcjs.a.call(void 0, this,"usableAsStorage",!1);_chunk7EYKOUWHcjs.a.call(void 0, this,"usableAsVertex",!1);_chunk7EYKOUWHcjs.f.call(void 0, u)?this._buffer=u:this.initial=u}get label(){return this._label}get buffer(){if(!this._device)throw new Error("Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.");if(this._destroyed)throw new Error("This buffer has been destroyed");if(!this._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new (0, _typedbinary.BufferWriter)(this._buffer.getMappedRange());if(V(this.initial)){let r=this._group;if(!r)throw new Error("Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.");let u=this.initial;this.dataType.write(t,r.readPlum(u)),this._subscription=r.onPlumChange(u,()=>{this.write(r.readPlum(u))})}else this.dataType.write(t,this.initial);this._buffer.unmap()}return this._buffer}get device(){if(!this._device)throw new Error("This buffer has not been assigned a device. Use .$device(device) to assign a device");return this._device}get destroyed(){return this._destroyed}$name(t){return this._label=t,this}$usage(...t){for(let r of t)this.flags|=r===b?GPUBufferUsage.UNIFORM:0,this.flags|=r===D?GPUBufferUsage.STORAGE:0,this.flags|=r===z?GPUBufferUsage.VERTEX:0,this.usableAsUniform=this.usableAsUniform||r===b,this.usableAsStorage=this.usableAsStorage||r===D,this.usableAsVertex=this.usableAsVertex||r===z;return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}write(t){let r=this.buffer,u=this.device;if(r.mapState==="mapped"){let i=r.getMappedRange();if(G(t))throw new Error("Cannot copy to a mapped buffer.");this.dataType.write(new (0, _typedbinary.BufferWriter)(i),t);return}let c=this.dataType.size;if(G(t)){let i=t.buffer;if(this._group)this._group.commandEncoder.copyBufferToBuffer(i,0,r,0,c);else{let f=u.createCommandEncoder();f.copyBufferToBuffer(i,0,r,0,c),u.queue.submit([f.finish()])}}else{this._group&&this._group.flush();let i=new ArrayBuffer(c);this.dataType.write(new (0, _typedbinary.BufferWriter)(i),t),u.queue.writeBuffer(r,0,i,0,c)}}async read(){this._group&&this._group.flush();let t=this.buffer,r=this.device;if(t.mapState==="mapped"){let f=t.getMappedRange();return this.dataType.read(new (0, _typedbinary.BufferReader)(f))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let f=t.getMappedRange(),A=this.dataType.read(new (0, _typedbinary.BufferReader)(f));return t.unmap(),A}let u=r.createBuffer({size:this.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=r.createCommandEncoder();c.copyBufferToBuffer(t,0,u,0,this.dataType.size),r.queue.submit([c.finish()]),await r.queue.onSubmittedWorkDone(),await u.mapAsync(GPUMapMode.READ,0,this.dataType.size);let i=this.dataType.read(new (0, _typedbinary.BufferReader)(u.getMappedRange()));return u.unmap(),u.destroy(),i}destroy(){var t;this._destroyed||(this._destroyed=!0,this._subscription&&this._subscription(),(t=this._buffer)==null||t.destroy())}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};function S(e,t){return k(void 0,e,t)}function E(e,t){e.write(t)}async function R(e){return e.read()}var T=e=>Math.sqrt(e.x**2+e.y**2),y=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),m=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),s={length:{vec2f:T,vec2i:T,vec2u:T,vec3f:y,vec3i:y,vec3u:y,vec4f:m,vec4i:m,vec4u:m},add:{vec2f:(e,t)=>_chunk7EYKOUWHcjs.h.call(void 0, e.x+t.x,e.y+t.y),vec2i:(e,t)=>_chunk7EYKOUWHcjs.i.call(void 0, e.x+t.x,e.y+t.y),vec2u:(e,t)=>_chunk7EYKOUWHcjs.j.call(void 0, e.x+t.x,e.y+t.y),vec3f:(e,t)=>_chunk7EYKOUWHcjs.k.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>_chunk7EYKOUWHcjs.l.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>_chunk7EYKOUWHcjs.m.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>_chunk7EYKOUWHcjs.n.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>_chunk7EYKOUWHcjs.o.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>_chunk7EYKOUWHcjs.p.call(void 0, e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>_chunk7EYKOUWHcjs.h.call(void 0, e.x-t.x,e.y-t.y),vec2i:(e,t)=>_chunk7EYKOUWHcjs.i.call(void 0, e.x-t.x,e.y-t.y),vec2u:(e,t)=>_chunk7EYKOUWHcjs.j.call(void 0, e.x-t.x,e.y-t.y),vec3f:(e,t)=>_chunk7EYKOUWHcjs.k.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>_chunk7EYKOUWHcjs.l.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>_chunk7EYKOUWHcjs.m.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>_chunk7EYKOUWHcjs.n.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>_chunk7EYKOUWHcjs.o.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>_chunk7EYKOUWHcjs.p.call(void 0, e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>_chunk7EYKOUWHcjs.h.call(void 0, e*t.x,e*t.y),vec2i:(e,t)=>_chunk7EYKOUWHcjs.i.call(void 0, e*t.x,e*t.y),vec2u:(e,t)=>_chunk7EYKOUWHcjs.j.call(void 0, e*t.x,e*t.y),vec3f:(e,t)=>_chunk7EYKOUWHcjs.k.call(void 0, e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>_chunk7EYKOUWHcjs.l.call(void 0, e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>_chunk7EYKOUWHcjs.m.call(void 0, e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>_chunk7EYKOUWHcjs.n.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>_chunk7EYKOUWHcjs.o.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>_chunk7EYKOUWHcjs.p.call(void 0, e*t.x,e*t.y,e*t.z,e*t.w)},dot:{vec2f:(e,t)=>e.x*t.x+e.y*t.y,vec2i:(e,t)=>e.x*t.x+e.y*t.y,vec2u:(e,t)=>e.x*t.x+e.y*t.y,vec3f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec4f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},normalize:{vec2f:e=>{let t=T(e);return _chunk7EYKOUWHcjs.h.call(void 0, e.x/t,e.y/t)},vec2i:e=>{let t=T(e);return _chunk7EYKOUWHcjs.i.call(void 0, e.x/t,e.y/t)},vec2u:e=>{let t=T(e);return _chunk7EYKOUWHcjs.j.call(void 0, e.x/t,e.y/t)},vec3f:e=>{let t=y(e);return _chunk7EYKOUWHcjs.k.call(void 0, e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=y(e);return _chunk7EYKOUWHcjs.l.call(void 0, e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=y(e);return _chunk7EYKOUWHcjs.m.call(void 0, e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=m(e);return _chunk7EYKOUWHcjs.n.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=m(e);return _chunk7EYKOUWHcjs.o.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=m(e);return _chunk7EYKOUWHcjs.p.call(void 0, e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>_chunk7EYKOUWHcjs.k.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3i:(e,t)=>_chunk7EYKOUWHcjs.l.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3u:(e,t)=>_chunk7EYKOUWHcjs.m.call(void 0, e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}};var q=0;var a=()=>q>0;var K={add(e,t){return a()?`(${e} + ${t})`:s.add[e.kind](e,t)},sub(e,t){return a()?`(${e} - ${t})`:s.sub[e.kind](e,t)},mul:(e,t)=>a()?`(${e} * ${t})`:s.mul[t.kind](e,t),dot(e,t){return a()?`dot(${e}, ${t})`:s.dot[e.kind](e,t)},normalize:e=>a()?`normalize(${e})`:s.normalize[e.kind](e),cross(e,t){return a()?`cross(${e}, ${t})`:s.cross[e.kind](e,t)},fract(e){return a()?`fract(${e})`:e-Math.floor(e)},length(e){return a()?`length(${e})`:s.length[e.kind](e)},sin(e){return a()?`sin(${e})`:Math.sin(e)},cos(e){return a()?`cos(${e})`:Math.cos(e)}};var F={Uniform:b,Storage:D,Vertex:z,createBuffer:S,read:R,write:E},ce= exports.default =F;exports.RecursiveDataTypeError = _chunk7EYKOUWHcjs.g; exports.default = ce; exports.isUsableAsStorage = C; exports.isUsableAsUniform = M; exports.isUsableAsVertex = I; exports.std = K; exports.tgpu = F;
2
2
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tgpuBuffer.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"names":["BufferWriter","Uniform","Storage","Vertex","createBuffer","typeSchema","initialOrBuffer","TgpuBufferImpl","isUsableAsUniform","buffer","isUsableAsStorage","isUsableAsVertex","dataType","__publicField","isGPUBuffer","writer","label","usages","usage","flags","device","_a","BufferReader","write","data","gpuBuffer","mapped","size","hostBuffer","read","res","stagingBuffer","commandEncoder","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","std","vector","tgpu","src_default"],"mappings":"iHAAA,OAAS,gBAAAA,MAAiC,eA0BnC,IAAMC,EAAU,CAAE,gBAAiB,EAAK,EAClCC,EAAU,CAAE,gBAAiB,EAAK,EAClCC,EAAS,CAAE,eAAgB,EAAK,EAiCtC,SAASC,EACdC,EACAC,EACmB,CACnB,OAAO,IAAIC,EAAeF,EAAYC,CAAe,CACvD,CAEO,SAASE,EACdC,EACuB,CACvB,MAAO,CAAC,CAAEA,EAA8B,eAC1C,CAEO,SAASC,EACdD,EACuB,CACvB,MAAO,CAAC,CAAEA,EAA8B,eAC1C,CAEO,SAASE,EACdF,EACsB,CACtB,MAAO,CAAC,CAAEA,EAA6B,cACzC,CAMA,IAAMF,EAAN,KAA6E,CAc3E,YACkBK,EACAN,EAKhB,CANgB,cAAAM,EACA,qBAAAN,EAflBO,EAAA,KAAO,QACL,eAAe,SAAW,eAAe,UAC3CA,EAAA,KAAQ,UAA4B,MACpCA,EAAA,KAAQ,UAA4B,MACpCA,EAAA,KAAQ,aAAa,IAErBA,EAAA,KAAQ,UACRA,EAAA,KAAS,WAETA,EAAA,KAAO,kBAAkB,IACzBA,EAAA,KAAO,kBAAkB,IACzBA,EAAA,KAAO,iBAAiB,IAUlBC,EAAYR,CAAe,EAC7B,KAAK,QAAUA,EAEf,KAAK,QAAUA,CAEnB,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,IAAI,QAAS,CACX,GAAI,CAAC,KAAK,QACR,MAAM,IAAI,MACR,mFACF,EAEF,GAAI,KAAK,WACP,MAAM,IAAI,MAAM,gCAAgC,EAElD,GAAI,CAAC,KAAK,UACR,KAAK,QAAU,KAAK,QAAQ,aAAa,CACvC,KAAM,KAAK,SAAS,KACpB,MAAO,KAAK,MACZ,iBAAkB,CAAC,CAAC,KAAK,OAC3B,CAAC,EACG,KAAK,SAAS,CAChB,IAAMS,EAAS,IAAIf,EAAa,KAAK,QAAQ,eAAe,CAAC,EAC7D,KAAK,SAAS,MAAMe,EAAQ,KAAK,OAAO,EACxC,KAAK,QAAQ,MAAM,CACrB,CAEF,OAAO,KAAK,OACd,CAEA,IAAI,QAAS,CACX,GAAI,CAAC,KAAK,QACR,MAAM,IAAI,MACR,qFACF,EAEF,OAAO,KAAK,OACd,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,UACd,CAEA,MAAMC,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,UACKC,EACoC,CACvC,QAAWC,KAASD,EAClB,KAAK,OAASC,IAAUjB,EAAU,eAAe,QAAU,EAC3D,KAAK,OAASiB,IAAUhB,EAAU,eAAe,QAAU,EAC3D,KAAK,OAASgB,IAAUf,EAAS,eAAe,OAAS,EACzD,KAAK,gBAAkB,KAAK,iBAAmBe,IAAUjB,EACzD,KAAK,gBAAkB,KAAK,iBAAmBiB,IAAUhB,EACzD,KAAK,eAAiB,KAAK,gBAAkBgB,IAAUf,EAEzD,OAAO,IACT,CAGA,UAAUgB,EAA4B,CACpC,YAAK,OAASA,EACP,IACT,CAEA,QAAQC,EAAmB,CACzB,YAAK,QAAUA,EACR,IACT,CAEA,SAAU,CA9LZ,IAAAC,EA+LQ,KAAK,aAGT,KAAK,WAAa,IAClBA,EAAA,KAAK,UAAL,MAAAA,EAAc,UAChB,CAEA,UAAmB,CAtMrB,IAAAA,EAuMI,MAAO,WAAUA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC7C,CACF,ECzMA,OAAS,gBAAAC,EAAc,gBAAAtB,MAAiC,eAIjD,SAASuB,EACdd,EACAe,EACM,CACN,IAAMC,EAAYhB,EAAO,OACnBW,EAASX,EAAO,OAEtB,GAAIgB,EAAU,WAAa,SAAU,CACnC,IAAMC,EAASD,EAAU,eAAe,EACxChB,EAAO,SAAS,MAAM,IAAIT,EAAa0B,CAAM,EAAGF,CAAI,EACpD,MACF,CAEA,IAAMG,EAAOlB,EAAO,SAAS,KACvBmB,EAAa,IAAI,YAAYD,CAAI,EACvClB,EAAO,SAAS,MAAM,IAAIT,EAAa4B,CAAU,EAAGJ,CAAI,EACxDJ,EAAO,MAAM,YAAYK,EAAW,EAAGG,EAAY,EAAGD,CAAI,CAC5D,CAEA,eAAsBE,EACpBpB,EACwB,CACxB,IAAMgB,EAAYhB,EAAO,OACnBW,EAASX,EAAO,OAEtB,GAAIgB,EAAU,WAAa,SAAU,CACnC,IAAMC,EAASD,EAAU,eAAe,EAExC,OADYhB,EAAO,SAAS,KAAK,IAAIa,EAAaI,CAAM,CAAC,CAE3D,CAEA,GAAID,EAAU,MAAQ,eAAe,SAAU,CAC7C,MAAMA,EAAU,SAAS,WAAW,IAAI,EACxC,IAAMC,EAASD,EAAU,eAAe,EAClCK,EAAMrB,EAAO,SAAS,KAAK,IAAIa,EAAaI,CAAM,CAAC,EACzD,OAAAD,EAAU,MAAM,EACTK,CACT,CAEA,IAAMC,EAAgBX,EAAO,aAAa,CACxC,KAAMX,EAAO,SAAS,KACtB,MAAO,eAAe,SAAW,eAAe,QAClD,CAAC,EAEKuB,EAAiBZ,EAAO,qBAAqB,EACnDY,EAAe,mBACbP,EACA,EACAM,EACA,EACAtB,EAAO,SAAS,IAClB,EAEAW,EAAO,MAAM,OAAO,CAACY,EAAe,OAAO,CAAC,CAAC,EAC7C,MAAMZ,EAAO,MAAM,oBAAoB,EACvC,MAAMW,EAAc,SAAS,WAAW,KAAM,EAAGtB,EAAO,SAAS,IAAI,EAErE,IAAMqB,EAAMrB,EAAO,SAAS,KAC1B,IAAIa,EAAaS,EAAc,eAAe,CAAC,CACjD,EAEA,OAAAA,EAAc,MAAM,EACpBA,EAAc,QAAQ,EAEfD,CACT,CCvDA,IAAMG,EAAcC,GAA6B,KAAK,KAAKA,EAAE,GAAK,EAAIA,EAAE,GAAK,CAAC,EACxEC,EAAcD,GAClB,KAAK,KAAKA,EAAE,GAAK,EAAIA,EAAE,GAAK,EAAIA,EAAE,GAAK,CAAC,EACpCE,EAAcF,GAClB,KAAK,KAAKA,EAAE,GAAK,EAAIA,EAAE,GAAK,EAAIA,EAAE,GAAK,EAAIA,EAAE,GAAK,CAAC,EAExCG,EAAY,CACvB,OAAQ,CACN,MAAOJ,EACP,MAAOA,EACP,MAAOA,EACP,MAAOE,EACP,MAAOA,EACP,MAAOA,EACP,MAAOC,EACP,MAAOA,EACP,MAAOA,CACT,EAEA,IAAK,CACH,MAAO,CAACE,EAAUC,IAAaC,EAAMF,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACzD,MAAO,CAACD,EAAUC,IAAaE,EAAMH,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACzD,MAAO,CAACD,EAAUC,IAAaG,EAAMJ,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAEzD,MAAO,CAACD,EAAUC,IAAaI,EAAML,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACpE,MAAO,CAACD,EAAUC,IAAaK,EAAMN,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACpE,MAAO,CAACD,EAAUC,IAAaM,EAAMP,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAEpE,MAAO,CAACD,EAAUC,IAChBO,EAAMR,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAClD,MAAO,CAACD,EAAUC,IAChBQ,EAAMT,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAClD,MAAO,CAACD,EAAUC,IAChBS,EAAMV,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,CACpD,EAEA,IAAK,CACH,MAAO,CAACD,EAAUC,IAAaC,EAAMF,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACzD,MAAO,CAACD,EAAUC,IAAaE,EAAMH,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACzD,MAAO,CAACD,EAAUC,IAAaG,EAAMJ,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAEzD,MAAO,CAACD,EAAUC,IAAaI,EAAML,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACpE,MAAO,CAACD,EAAUC,IAAaK,EAAMN,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EACpE,MAAO,CAACD,EAAUC,IAAaM,EAAMP,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAEpE,MAAO,CAACD,EAAUC,IAChBO,EAAMR,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAClD,MAAO,CAACD,EAAUC,IAChBQ,EAAMT,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,EAClD,MAAO,CAACD,EAAUC,IAChBS,EAAMV,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,EAAGD,EAAE,EAAIC,EAAE,CAAC,CACpD,EAEA,IAAK,CACH,MAAO,CAACU,EAAWf,IAAaM,EAAMS,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EACtD,MAAO,CAACe,EAAWf,IAAaO,EAAMQ,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EACtD,MAAO,CAACe,EAAWf,IAAaQ,EAAMO,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EAEtD,MAAO,CAACe,EAAWf,IAAaS,EAAMM,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EAC/D,MAAO,CAACe,EAAWf,IAAaU,EAAMK,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EAC/D,MAAO,CAACe,EAAWf,IAAaW,EAAMI,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EAE/D,MAAO,CAACe,EAAWf,IAAaY,EAAMG,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EACxE,MAAO,CAACe,EAAWf,IAAaa,EAAME,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,EACxE,MAAO,CAACe,EAAWf,IAAac,EAAMC,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,EAAGe,EAAIf,EAAE,CAAC,CAC1E,EAEA,IAAK,CACH,MAAO,CAACgB,EAAYC,IAAeD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC/D,MAAO,CAACD,EAAYC,IAAeD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC/D,MAAO,CAACD,EAAYC,IAAeD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC/D,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC9C,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC9C,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC9C,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC9D,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAC9D,MAAO,CAACD,EAAYC,IAClBD,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,EAAID,EAAI,EAAIC,EAAI,CAChE,EAEA,UAAW,CACT,MAAQjB,GAAa,CACnB,IAAMkB,EAAMnB,EAAWC,CAAC,EACxB,OAAOM,EAAMN,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACnC,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMnB,EAAWC,CAAC,EACxB,OAAOO,EAAMP,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACnC,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMnB,EAAWC,CAAC,EACxB,OAAOQ,EAAMR,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACnC,EAEA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMjB,EAAWD,CAAC,EACxB,OAAOS,EAAMT,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CAC9C,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMjB,EAAWD,CAAC,EACxB,OAAOU,EAAMV,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CAC9C,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMjB,EAAWD,CAAC,EACxB,OAAOW,EAAMX,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CAC9C,EAEA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMhB,EAAWF,CAAC,EACxB,OAAOY,EAAMZ,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACzD,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMhB,EAAWF,CAAC,EACxB,OAAOa,EAAMb,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACzD,EACA,MAAQlB,GAAa,CACnB,IAAMkB,EAAMhB,EAAWF,CAAC,EACxB,OAAOc,EAAMd,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,EAAKlB,EAAE,EAAIkB,CAAG,CACzD,CACF,EAEA,MAAO,CACL,MAAO,CAACd,EAAUC,IACTI,EACLL,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,CACtB,EAEF,MAAO,CAACD,EAAUC,IACTK,EACLN,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,CACtB,EAEF,MAAO,CAACD,EAAUC,IACTM,EACLP,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EACpBD,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,CACtB,CAEJ,CAIF,ECnKO,IAAMc,EAAM,CACjB,IAAK,CAAoBH,EAAQC,IAC/Bd,EAAU,IAAIa,EAAI,IAAI,EAAEA,EAAKC,CAAG,EAClC,IAAK,CAAoBD,EAAQC,IAC/Bd,EAAU,IAAIa,EAAI,IAAI,EAAEA,EAAKC,CAAG,EAClC,IAAK,CAAoBF,EAAWf,IAAYG,EAAU,IAAIH,EAAE,IAAI,EAAEe,EAAGf,CAAC,EAC1E,IAAK,CAAoBgB,EAAQC,IAC/Bd,EAAU,IAAIa,EAAI,IAAI,EAAEA,EAAKC,CAAG,EAClC,UAA+BjB,GAAYG,EAAU,UAAUH,EAAE,IAAI,EAAEA,CAAC,EACxE,MAAO,CAAkCI,EAAMC,IAC7CF,EAAU,MAAMC,EAAE,IAAI,EAAEA,EAAGC,CAAC,EAC9B,MAAQD,GAAsBA,EAAI,KAAK,MAAMA,CAAC,EAC9C,OAA4BgB,GAC1BjB,EAAU,OAAOiB,EAAO,IAAI,EAAEA,CAAM,EACtC,IAAK,KAAK,IACV,IAAK,KAAK,GACZ,ECZO,IAAMC,EAAO,CAClB,QAAAtD,EACA,QAAAC,EACA,OAAAC,EAEA,aAAAC,EACA,KAAAyB,EACA,MAAAN,CACF,EACOiC,EAAQD","sourcesContent":["import { BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from './namable';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport { type AnyTgpuData, type TgpuAllocatable, isGPUBuffer } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Unmanaged {\n readonly device: GPUDevice;\n readonly buffer: GPUBuffer;\n}\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData>\n extends TgpuAllocatable<TData>,\n TgpuNamable {\n readonly destroyed: boolean;\n readonly label: string | undefined;\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this & Unmanaged;\n\n destroy(): void;\n}\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(typeSchema, initialOrBuffer);\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'To use this property, make the buffer unmanaged by passing a GPUDevice to $device',\n );\n }\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n this.dataType.write(writer, this.initial);\n this._buffer.unmap();\n }\n }\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]> {\n for (const usage of usages) {\n this.flags |= usage === Uniform ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === Storage ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === Vertex ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === Uniform;\n this.usableAsStorage = this.usableAsStorage || usage === Storage;\n this.usableAsVertex = this.usableAsVertex || usage === Vertex;\n }\n return this as this & UnionToIntersection<T[number]>;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuBuffer, Unmanaged } from './tgpuBuffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n data: Parsed<TData>,\n): void {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n buffer.dataType.write(new BufferWriter(mapped), data);\n return;\n }\n\n const size = buffer.dataType.size;\n const hostBuffer = new ArrayBuffer(size);\n buffer.dataType.write(new BufferWriter(hostBuffer), data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n): Promise<Parsed<TData>> {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: buffer.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n buffer.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, buffer.dataType.size);\n\n const res = buffer.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n}\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\n","import type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\n\nexport const std = {\n add: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.add[lhs.kind](lhs, rhs),\n sub: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.sub[lhs.kind](lhs, rhs),\n mul: <T extends vecBase>(s: number, v: T): T => VectorOps.mul[v.kind](s, v),\n dot: <T extends vecBase>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n normalize: <T extends vecBase>(v: T): T => VectorOps.normalize[v.kind](v),\n cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n fract: (a: number): number => a - Math.floor(a),\n length: <T extends vecBase>(vector: T): number =>\n VectorOps.length[vector.kind](vector),\n sin: Math.sin,\n cos: Math.cos,\n};\n","/**\n * @module typegpu\n */\n\nimport { Storage, Uniform, Vertex, createBuffer } from './tgpuBuffer';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n Uniform,\n Storage,\n Vertex,\n\n createBuffer,\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './tgpuBuffer';\n\nexport type {\n TgpuBuffer,\n Unmanaged,\n} from './tgpuBuffer';\n"]}
1
+ {"version":3,"sources":["../src/tgpuBuffer.ts","../src/tgpuPlumTypes.ts","../src/legacyBufferApi.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/gpuMode.ts","../src/std.ts","../src/index.ts"],"names":["BufferReader","BufferWriter","TgpuExternalPlumTrait","isPlum","value","Uniform","Storage","Vertex","createBufferImpl","group","typeSchema","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","buffer","isUsableAsStorage","isUsableAsVertex","_group","dataType","__publicField","isGPUBuffer","writer","plum","label","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","res","stagingBuffer","_a","createBuffer","write","data","read","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","gpuDepth","inGPUMode","std","vector","radians","tgpu","src_default"],"mappings":"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","sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from './namable';\nimport { type TgpuPlum, type Unsubscribe, isPlum } from './tgpuPlumTypes';\nimport type { TgpuRuntime } from './tgpuRuntime';\nimport { type AnyTgpuData, isGPUBuffer } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n readonly label: string | undefined;\n\n readonly buffer: GPUBuffer;\n readonly device: GPUDevice;\n readonly destroyed: boolean;\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this;\n\n write(data: Parsed<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Parsed<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyTgpuData>(\n group: TgpuRuntime | undefined,\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyTgpuData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public readonly resourceType = 'buffer';\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n private _subscription: Unsubscribe | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n private readonly _group: TgpuRuntime | undefined,\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n\n if (isPlum(this.initial)) {\n const group = this._group;\n\n if (!group) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n const plum = this.initial;\n\n this.dataType.write(writer, group.readPlum(plum));\n\n this._subscription = group.onPlumChange(plum, () => {\n this.write(group.readPlum(plum));\n });\n } else {\n this.dataType.write(writer, this.initial);\n }\n\n this._buffer.unmap();\n }\n }\n\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]> {\n for (const usage of usages) {\n this.flags |= usage === Uniform ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === Storage ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === Vertex ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === Uniform;\n this.usableAsStorage = this.usableAsStorage || usage === Storage;\n this.usableAsVertex = this.usableAsVertex || usage === Vertex;\n }\n return this as this & UnionToIntersection<T[number]>;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n write(dataOrBuffer: Parsed<TData> | TgpuBuffer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n if (isBuffer(dataOrBuffer)) {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n this.dataType.write(new BufferWriter(mapped), dataOrBuffer);\n return;\n }\n\n const size = this.dataType.size;\n if (isBuffer(dataOrBuffer)) {\n const sourceBuffer = dataOrBuffer.buffer;\n\n if (this._group) {\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n } else {\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n device.queue.submit([commandEncoder.finish()]);\n }\n } else {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const hostBuffer = new ArrayBuffer(size);\n this.dataType.write(new BufferWriter(hostBuffer), dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Parsed<TData>> {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: this.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n this.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, this.dataType.size);\n\n const res = this.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n if (this._subscription) {\n this._subscription();\n }\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { TgpuNamable } from './namable';\n\nexport type Getter = <T>(plum: TgpuPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends TgpuPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface TgpuPlum<TValue = unknown> extends TgpuNamable {\n readonly __brand: 'TgpuPlum';\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const TgpuExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\n\nexport interface TgpuExternalPlum {\n readonly [TgpuExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | TgpuExternalPlum,\n): value is TgpuExternalPlum {\n return (value as TgpuExternalPlum)[TgpuExternalPlumTrait] === true;\n}\n\nexport function isPlum<T>(value: TgpuPlum<T> | unknown): value is TgpuPlum<T> {\n return (value as TgpuPlum).__brand === 'TgpuPlum';\n}\n","import type { Parsed } from 'typed-binary';\nimport { type TgpuBuffer, createBufferImpl } from './tgpuBuffer';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport type { AnyTgpuData } from './types';\n\n// * -deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`.\n\n/**\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\n/**\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return createBufferImpl(undefined, typeSchema, initialOrBuffer);\n}\n","import type { Parsed } from 'typed-binary';\nimport type { TgpuBuffer } from './tgpuBuffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n data: Parsed<TData>,\n): void {\n buffer.write(data);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n): Promise<Parsed<TData>> {\n return buffer.read();\n}\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\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 type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\nimport { inGPUMode } from './gpuMode';\n\nexport const std = {\n add<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} + ${rhs})` as unknown as T;\n }\n return VectorOps.add[lhs.kind](lhs, rhs);\n },\n sub<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} - ${rhs})` as unknown as T;\n }\n return VectorOps.sub[lhs.kind](lhs, rhs);\n },\n mul: <T extends vecBase>(s: number, v: T): T => {\n if (inGPUMode()) {\n return `(${s} * ${v})` as unknown as T;\n }\n return VectorOps.mul[v.kind](s, v);\n },\n dot<T extends vecBase>(lhs: T, rhs: T): number {\n if (inGPUMode()) {\n return `dot(${lhs}, ${rhs})` as unknown as number;\n }\n return VectorOps.dot[lhs.kind](lhs, rhs);\n },\n normalize: <T extends vecBase>(v: T): T => {\n if (inGPUMode()) {\n return `normalize(${v})` as unknown as T;\n }\n return VectorOps.normalize[v.kind](v);\n },\n cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T {\n if (inGPUMode()) {\n return `cross(${a}, ${b})` as unknown as T;\n }\n return VectorOps.cross[a.kind](a, b);\n },\n fract(a: number): number {\n if (inGPUMode()) {\n return `fract(${a})` as unknown as number;\n }\n return a - Math.floor(a);\n },\n length<T extends vecBase>(vector: T): number {\n if (inGPUMode()) {\n return `length(${vector})` as unknown as number;\n }\n return VectorOps.length[vector.kind](vector);\n },\n sin(radians: number): number {\n if (inGPUMode()) {\n return `sin(${radians})` as unknown as number;\n }\n return Math.sin(radians);\n },\n cos(radians: number): number {\n if (inGPUMode()) {\n return `cos(${radians})` as unknown as number;\n }\n return Math.cos(radians);\n },\n};\n","/**\n * @module typegpu\n */\n\nimport { createBuffer } from './legacyBufferApi';\nimport { Storage, Uniform, Vertex } from './tgpuBuffer';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n Uniform,\n Storage,\n Vertex,\n\n createBuffer,\n\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './tgpuBuffer';\n\nexport type { TgpuBuffer } from './tgpuBuffer';\n"]}
package/index.d.cts CHANGED
@@ -1,40 +1,20 @@
1
1
  import { Parsed } from 'typed-binary';
2
- import { A as AnyTgpuData, T as TgpuAllocatable, a as TgpuNamable, b as TgpuPlum, v as vecBase, c as vec3f, d as vec3i, e as vec3u } from './vector-D5Vx-xhb.cjs';
3
- export { f as TgpuData } from './vector-D5Vx-xhb.cjs';
2
+ import { A as AnyTgpuData, T as TgpuPlum, a as TgpuBuffer, v as vecBase, b as vec3f, c as vec3i, d as vec3u, U as Uniform, S as Storage, V as Vertex } from './tgpuBuffer-BVk2wCHR.cjs';
3
+ export { e as TgpuData, i as isUsableAsStorage, f as isUsableAsUniform, g as isUsableAsVertex } from './tgpuBuffer-BVk2wCHR.cjs';
4
4
 
5
- interface Unmanaged {
6
- readonly device: GPUDevice;
7
- readonly buffer: GPUBuffer;
8
- }
9
- interface Uniform {
10
- usableAsUniform: true;
11
- }
12
- declare const Uniform: Uniform;
13
- interface Storage {
14
- usableAsStorage: true;
15
- }
16
- declare const Storage: Storage;
17
- interface Vertex {
18
- usableAsVertex: true;
19
- }
20
- declare const Vertex: Vertex;
21
- type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
22
- interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuAllocatable<TData>, TgpuNamable {
23
- readonly destroyed: boolean;
24
- readonly label: string | undefined;
25
- $usage<T extends (Uniform | Storage | Vertex)[]>(...usages: T): this & UnionToIntersection<T[number]>;
26
- $addFlags(flags: GPUBufferUsageFlags): this;
27
- $device(device: GPUDevice): this & Unmanaged;
28
- destroy(): void;
29
- }
5
+ /**
6
+ * @param typeSchema The type of data that this buffer will hold.
7
+ * @param initial The initial value of the buffer. (optional)
8
+ */
30
9
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
10
+ /**
11
+ * @param typeSchema The type of data that this buffer will hold.
12
+ * @param gpuBuffer A vanilla WebGPU buffer.
13
+ */
31
14
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
32
- declare function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Uniform;
33
- declare function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Storage;
34
- declare function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Vertex;
35
15
 
36
- declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged, data: Parsed<TData>): void;
37
- declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged): Promise<Parsed<TData>>;
16
+ declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData>, data: Parsed<TData>): void;
17
+ declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData>): Promise<Parsed<TData>>;
38
18
 
39
19
  /**
40
20
  * @category Errors
@@ -44,16 +24,16 @@ declare class RecursiveDataTypeError extends Error {
44
24
  }
45
25
 
46
26
  declare const std: {
47
- add: <T extends vecBase>(lhs: T, rhs: T) => T;
48
- sub: <T extends vecBase>(lhs: T, rhs: T) => T;
27
+ add<T extends vecBase>(lhs: T, rhs: T): T;
28
+ sub<T extends vecBase>(lhs: T, rhs: T): T;
49
29
  mul: <T extends vecBase>(s: number, v: T) => T;
50
- dot: <T extends vecBase>(lhs: T, rhs: T) => number;
30
+ dot<T extends vecBase>(lhs: T, rhs: T): number;
51
31
  normalize: <T extends vecBase>(v: T) => T;
52
- cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T;
53
- fract: (a: number) => number;
54
- length: <T extends vecBase>(vector: T) => number;
55
- sin: (x: number) => number;
56
- cos: (x: number) => number;
32
+ cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T;
33
+ fract(a: number): number;
34
+ length<T extends vecBase>(vector: T): number;
35
+ sin(radians: number): number;
36
+ cos(radians: number): number;
57
37
  };
58
38
 
59
39
  /**
@@ -69,4 +49,4 @@ declare const tgpu: {
69
49
  write: typeof write;
70
50
  };
71
51
 
72
- export { AnyTgpuData, RecursiveDataTypeError, type TgpuBuffer, type Unmanaged, tgpu as default, isUsableAsStorage, isUsableAsUniform, isUsableAsVertex, std, tgpu };
52
+ export { AnyTgpuData, RecursiveDataTypeError, TgpuBuffer, tgpu as default, std, tgpu };