typegpu 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/dist/chunk-5ZQTJALJ.cjs +4 -0
  2. package/dist/chunk-5ZQTJALJ.cjs.map +1 -0
  3. package/dist/chunk-AS7UPXZ3.cjs +2 -0
  4. package/dist/chunk-AS7UPXZ3.cjs.map +1 -0
  5. package/dist/chunk-G3U6RTMF.cjs +2 -0
  6. package/dist/chunk-G3U6RTMF.cjs.map +1 -0
  7. package/dist/chunk-JJZKRDXD.js +4 -0
  8. package/dist/chunk-JJZKRDXD.js.map +1 -0
  9. package/dist/chunk-KBVQVOLY.cjs +2 -0
  10. package/dist/chunk-KBVQVOLY.cjs.map +1 -0
  11. package/dist/chunk-OZ2XZ4ZA.js +2 -0
  12. package/dist/chunk-OZ2XZ4ZA.js.map +1 -0
  13. package/dist/chunk-TVPC7ZME.js +2 -0
  14. package/dist/chunk-TVPC7ZME.js.map +1 -0
  15. package/dist/chunk-XGSMOADT.js +2 -0
  16. package/dist/chunk-XGSMOADT.js.map +1 -0
  17. package/dist/data/index.cjs +10 -0
  18. package/dist/data/index.cjs.map +1 -0
  19. package/dist/data/index.d.cts +84 -0
  20. package/dist/data/index.d.ts +84 -0
  21. package/dist/data/index.js +10 -0
  22. package/dist/data/index.js.map +1 -0
  23. package/dist/index.cjs +6 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +145 -0
  26. package/dist/index.d.ts +145 -0
  27. package/dist/index.js +6 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/macro/index.cjs +8 -0
  30. package/dist/macro/index.cjs.map +1 -0
  31. package/dist/macro/index.d.cts +7 -0
  32. package/dist/macro/index.d.ts +7 -0
  33. package/dist/macro/index.js +8 -0
  34. package/dist/macro/index.js.map +1 -0
  35. package/dist/struct-CFmatz6R.d.ts +9 -0
  36. package/dist/struct-CRg8uhjj.d.cts +9 -0
  37. package/dist/typegpuRuntime-BZwyf0k_.d.ts +77 -0
  38. package/dist/typegpuRuntime-Dg50sa5T.d.cts +77 -0
  39. package/dist/types-Dgp6OHLq.d.cts +148 -0
  40. package/dist/types-Dgp6OHLq.d.ts +148 -0
  41. package/dist/web/index.cjs +23 -0
  42. package/dist/web/index.cjs.map +1 -0
  43. package/dist/web/index.d.cts +40 -0
  44. package/dist/web/index.d.ts +40 -0
  45. package/dist/web/index.js +23 -0
  46. package/dist/web/index.js.map +1 -0
  47. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/callable.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts"],"names":["Callable","__publicField","callable_default","bufferUsage","buffer","usage","WgslBufferUsageImpl","label","ctx","identifier","WgslIdentifier","_a","typeSchema","initial","WgslBufferImpl","dataType","enrichedThis","flags","constant","expr","WgslConstImpl","code","fn","strings","params","func","WgslFnImpl","body","slot","value","BoundWgslFnImpl","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","argTypes","returnType","argPairs","argType","argValues","argIdent","bodyProducer","WgslFunctionCall","usedFn","args","argsCode","argSegment","idx","comma","ident","isPointer","defaultValue","WgslSlotImpl","a","b","isWgsl","variable","initialValue","WgslVarImpl","_dataType","_initialValue","scope","wgsl_default","plum","plumFromEvent"],"mappings":"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","sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;\n $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n\n asStorage(): 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n\n asReadonlyStorage(): 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutableStorage: WgslBufferUsage<TData, TAllows | 'mutable_storage'> | null;\n readonlyStorage: WgslBufferUsage<\n TData,\n TAllows | 'readonly_storage'\n > | null;\n } = {\n uniform: null,\n mutableStorage: null,\n readonlyStorage: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n return enrichedThis;\n }\n\n $allowReadonlyStorage() {\n const enrichedThis = this as WgslBuffer<\n TData,\n TAllows | 'readonly_storage'\n >;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.readonlyStorage) {\n this._allowedUsages.readonlyStorage = bufferUsage(\n enrichedThis,\n 'readonly_storage',\n );\n }\n return enrichedThis;\n }\n\n $allowMutableStorage() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable_storage'>;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.mutableStorage) {\n this._allowedUsages.mutableStorage = bufferUsage(\n enrichedThis,\n 'mutable_storage',\n );\n }\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n }\n\n asStorage() {\n return this._allowedUsages\n .mutableStorage as 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n }\n\n asReadonlyStorage() {\n return this._allowedUsages\n .readonlyStorage as 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(label?: string) {\n return (\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n ): WgslFn => {\n const func = new WgslFnImpl(code(strings, ...params));\n if (label) {\n func.$name(label);\n }\n return func;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(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 `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`);\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private identifier = new WgslIdentifier();\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(this.identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, 'private');\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { slot } from './wgslSlot';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n var: variable,\n});\n"]}
@@ -0,0 +1,145 @@
1
+ import { W as WgslSlot, a as WgslResolvable, A as AnyWgslData, B as BufferUsage, b as WgslBindable, c as WgslAllocatable, d as WgslPlum, e as Wgsl, E as Eventual, I as InlineResolve, f as WgslFnArgument, R as ResolutionCtx, g as WgslValue, h as WgslIdentifier, i as WgslResolvableSlot, p as plum, j as plumFromEvent } from './types-Dgp6OHLq.cjs';
2
+ export { s as AnyWgslPointer, o as EventualGetter, S as SlotValuePair, q as WgslData, r as WgslPointer, k as WgslSettable, t as isPointer, l as isResolvable, n as isSlot, m as isWgsl } from './types-Dgp6OHLq.cjs';
3
+ import { T as TypeGpuRuntime, c as code } from './typegpuRuntime-Dg50sa5T.cjs';
4
+ export { e as ComputePipelineExecutor, d as ComputePipelineExecutorOptions, C as ComputePipelineOptions, b as RenderPipelineExecutor, a as RenderPipelineExecutorOptions, R as RenderPipelineOptions, W as WgslCode } from './typegpuRuntime-Dg50sa5T.cjs';
5
+ import { Parsed } from 'typed-binary';
6
+ import './struct-CRg8uhjj.cjs';
7
+
8
+ /**
9
+ * @category Errors
10
+ */
11
+ declare class MissingSlotValueError extends Error {
12
+ readonly slot: WgslSlot<unknown>;
13
+ constructor(slot: WgslSlot<unknown>);
14
+ }
15
+ /**
16
+ * @category Errors
17
+ */
18
+ declare class RecursiveDataTypeError extends Error {
19
+ constructor();
20
+ }
21
+
22
+ declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Function {
23
+ _bound: Callable<TArgs, TReturn>;
24
+ constructor();
25
+ abstract _call(...args: TArgs): TReturn;
26
+ }
27
+ type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
28
+ type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
29
+
30
+ interface NameRegistry {
31
+ nameFor(item: WgslResolvable): string;
32
+ }
33
+ declare class RandomNameRegistry implements NameRegistry {
34
+ private lastUniqueId;
35
+ private names;
36
+ nameFor(item: WgslResolvable): string;
37
+ }
38
+ declare class StrictNameRegistry implements NameRegistry {
39
+ /**
40
+ * Allows to provide a good fallback for instances of the
41
+ * same function that are bound to different slot values.
42
+ */
43
+ private readonly _usedNames;
44
+ private readonly _assignedNames;
45
+ nameFor(item: WgslResolvable): string;
46
+ }
47
+
48
+ type Program = {
49
+ readonly bindGroupLayout: GPUBindGroupLayout;
50
+ readonly bindGroup: GPUBindGroup;
51
+ readonly code: string;
52
+ };
53
+ type BuildOptions = {
54
+ shaderStage: number;
55
+ bindingGroup: number;
56
+ nameRegistry?: NameRegistry;
57
+ };
58
+ declare class ProgramBuilder {
59
+ private runtime;
60
+ private root;
61
+ constructor(runtime: TypeGpuRuntime, root: WgslResolvable);
62
+ build(options: BuildOptions): Program;
63
+ }
64
+
65
+ interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
66
+ $name(label: string): WgslVar<TDataType>;
67
+ }
68
+
69
+ interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
70
+ $name(label: string): WgslBufferUsage<TData, TUsage>;
71
+ }
72
+
73
+ interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
74
+ $name(label: string): WgslBuffer<TData, TAllows>;
75
+ $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
76
+ $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;
77
+ $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;
78
+ $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
79
+ asUniform(): 'uniform' extends TAllows ? WgslBufferUsage<TData, 'uniform'> : null;
80
+ asStorage(): 'mutable_storage' extends TAllows ? WgslBufferUsage<TData, 'mutable_storage'> : null;
81
+ asReadonlyStorage(): 'readonly_storage' extends TAllows ? WgslBufferUsage<TData, 'readonly_storage'> : null;
82
+ }
83
+ declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
84
+
85
+ interface WgslConst extends WgslResolvable {
86
+ $name(label: string): WgslConst;
87
+ }
88
+ /**
89
+ * Creates a constant is computed at shader initialization according
90
+ * to the passed in expression.
91
+ */
92
+ declare function constant(expr: Wgsl): WgslConst;
93
+
94
+ interface WgslFn$1 extends WgslResolvable {
95
+ $name(label: string): WgslFn$1;
96
+ with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
97
+ }
98
+ type BoundWgslFn = Omit<WgslFn$1, '$name'>;
99
+ declare function fn$1(label?: string): (strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]) => WgslFn$1;
100
+
101
+ interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
102
+ }
103
+ declare function fn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined>(argTypes: TArgTypes, returnType?: TReturn): (bodyProducer: (...args: ValuesFromTypes<TArgTypes>) => Wgsl) => AsCallable<WgslFnImpl<TArgTypes, TReturn>, SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes>>;
104
+ type ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {
105
+ [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;
106
+ };
107
+ type PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {
108
+ [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];
109
+ };
110
+ type SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {
111
+ [K in keyof TArgTypes]: Wgsl;
112
+ };
113
+ declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> implements WgslResolvable {
114
+ private usedFn;
115
+ private readonly args;
116
+ constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
117
+ resolve(ctx: ResolutionCtx): string;
118
+ }
119
+ declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
120
+ private argPairs;
121
+ private returnType;
122
+ private readonly body;
123
+ private identifier;
124
+ constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
125
+ $name(label: string): this;
126
+ resolve(ctx: ResolutionCtx): string;
127
+ _call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
128
+ }
129
+
130
+ declare function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;
131
+ declare function slot<T>(defaultValue?: T): WgslSlot<T>;
132
+
133
+ declare const _default: typeof code & {
134
+ code: typeof code;
135
+ fn: typeof fn$1;
136
+ fun: typeof fn;
137
+ buffer: typeof buffer;
138
+ plum: typeof plum;
139
+ plumFromEvent: typeof plumFromEvent;
140
+ slot: typeof slot;
141
+ constant: typeof constant;
142
+ var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl) => WgslVar<TDataType>;
143
+ };
144
+
145
+ export { AnyWgslData, type AsCallable, BufferUsage, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, ResolutionCtx, StrictNameRegistry, TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslResolvable, WgslResolvableSlot, WgslSlot, WgslValue, type WgslVar, _default as default, _default as wgsl };
@@ -0,0 +1,145 @@
1
+ import { W as WgslSlot, a as WgslResolvable, A as AnyWgslData, B as BufferUsage, b as WgslBindable, c as WgslAllocatable, d as WgslPlum, e as Wgsl, E as Eventual, I as InlineResolve, f as WgslFnArgument, R as ResolutionCtx, g as WgslValue, h as WgslIdentifier, i as WgslResolvableSlot, p as plum, j as plumFromEvent } from './types-Dgp6OHLq.js';
2
+ export { s as AnyWgslPointer, o as EventualGetter, S as SlotValuePair, q as WgslData, r as WgslPointer, k as WgslSettable, t as isPointer, l as isResolvable, n as isSlot, m as isWgsl } from './types-Dgp6OHLq.js';
3
+ import { T as TypeGpuRuntime, c as code } from './typegpuRuntime-BZwyf0k_.js';
4
+ export { e as ComputePipelineExecutor, d as ComputePipelineExecutorOptions, C as ComputePipelineOptions, b as RenderPipelineExecutor, a as RenderPipelineExecutorOptions, R as RenderPipelineOptions, W as WgslCode } from './typegpuRuntime-BZwyf0k_.js';
5
+ import { Parsed } from 'typed-binary';
6
+ import './struct-CFmatz6R.js';
7
+
8
+ /**
9
+ * @category Errors
10
+ */
11
+ declare class MissingSlotValueError extends Error {
12
+ readonly slot: WgslSlot<unknown>;
13
+ constructor(slot: WgslSlot<unknown>);
14
+ }
15
+ /**
16
+ * @category Errors
17
+ */
18
+ declare class RecursiveDataTypeError extends Error {
19
+ constructor();
20
+ }
21
+
22
+ declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Function {
23
+ _bound: Callable<TArgs, TReturn>;
24
+ constructor();
25
+ abstract _call(...args: TArgs): TReturn;
26
+ }
27
+ type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
28
+ type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
29
+
30
+ interface NameRegistry {
31
+ nameFor(item: WgslResolvable): string;
32
+ }
33
+ declare class RandomNameRegistry implements NameRegistry {
34
+ private lastUniqueId;
35
+ private names;
36
+ nameFor(item: WgslResolvable): string;
37
+ }
38
+ declare class StrictNameRegistry implements NameRegistry {
39
+ /**
40
+ * Allows to provide a good fallback for instances of the
41
+ * same function that are bound to different slot values.
42
+ */
43
+ private readonly _usedNames;
44
+ private readonly _assignedNames;
45
+ nameFor(item: WgslResolvable): string;
46
+ }
47
+
48
+ type Program = {
49
+ readonly bindGroupLayout: GPUBindGroupLayout;
50
+ readonly bindGroup: GPUBindGroup;
51
+ readonly code: string;
52
+ };
53
+ type BuildOptions = {
54
+ shaderStage: number;
55
+ bindingGroup: number;
56
+ nameRegistry?: NameRegistry;
57
+ };
58
+ declare class ProgramBuilder {
59
+ private runtime;
60
+ private root;
61
+ constructor(runtime: TypeGpuRuntime, root: WgslResolvable);
62
+ build(options: BuildOptions): Program;
63
+ }
64
+
65
+ interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
66
+ $name(label: string): WgslVar<TDataType>;
67
+ }
68
+
69
+ interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
70
+ $name(label: string): WgslBufferUsage<TData, TUsage>;
71
+ }
72
+
73
+ interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
74
+ $name(label: string): WgslBuffer<TData, TAllows>;
75
+ $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
76
+ $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;
77
+ $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;
78
+ $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
79
+ asUniform(): 'uniform' extends TAllows ? WgslBufferUsage<TData, 'uniform'> : null;
80
+ asStorage(): 'mutable_storage' extends TAllows ? WgslBufferUsage<TData, 'mutable_storage'> : null;
81
+ asReadonlyStorage(): 'readonly_storage' extends TAllows ? WgslBufferUsage<TData, 'readonly_storage'> : null;
82
+ }
83
+ declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
84
+
85
+ interface WgslConst extends WgslResolvable {
86
+ $name(label: string): WgslConst;
87
+ }
88
+ /**
89
+ * Creates a constant is computed at shader initialization according
90
+ * to the passed in expression.
91
+ */
92
+ declare function constant(expr: Wgsl): WgslConst;
93
+
94
+ interface WgslFn$1 extends WgslResolvable {
95
+ $name(label: string): WgslFn$1;
96
+ with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
97
+ }
98
+ type BoundWgslFn = Omit<WgslFn$1, '$name'>;
99
+ declare function fn$1(label?: string): (strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]) => WgslFn$1;
100
+
101
+ interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
102
+ }
103
+ declare function fn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined>(argTypes: TArgTypes, returnType?: TReturn): (bodyProducer: (...args: ValuesFromTypes<TArgTypes>) => Wgsl) => AsCallable<WgslFnImpl<TArgTypes, TReturn>, SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes>>;
104
+ type ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {
105
+ [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;
106
+ };
107
+ type PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {
108
+ [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];
109
+ };
110
+ type SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {
111
+ [K in keyof TArgTypes]: Wgsl;
112
+ };
113
+ declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> implements WgslResolvable {
114
+ private usedFn;
115
+ private readonly args;
116
+ constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
117
+ resolve(ctx: ResolutionCtx): string;
118
+ }
119
+ declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
120
+ private argPairs;
121
+ private returnType;
122
+ private readonly body;
123
+ private identifier;
124
+ constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
125
+ $name(label: string): this;
126
+ resolve(ctx: ResolutionCtx): string;
127
+ _call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
128
+ }
129
+
130
+ declare function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;
131
+ declare function slot<T>(defaultValue?: T): WgslSlot<T>;
132
+
133
+ declare const _default: typeof code & {
134
+ code: typeof code;
135
+ fn: typeof fn$1;
136
+ fun: typeof fn;
137
+ buffer: typeof buffer;
138
+ plum: typeof plum;
139
+ plumFromEvent: typeof plumFromEvent;
140
+ slot: typeof slot;
141
+ constant: typeof constant;
142
+ var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl) => WgslVar<TDataType>;
143
+ };
144
+
145
+ export { AnyWgslData, type AsCallable, BufferUsage, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, ResolutionCtx, StrictNameRegistry, TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslResolvable, WgslResolvableSlot, WgslSlot, WgslValue, type WgslVar, _default as default, _default as wgsl };
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import{a as o}from"./chunk-OZ2XZ4ZA.js";import{a as P,b as V,c as E,e as $,f as w}from"./chunk-JJZKRDXD.js";import{a as G,b as I}from"./chunk-XGSMOADT.js";import{d as r,e as O,f as x,g as K,h as D,i as a}from"./chunk-TVPC7ZME.js";var u=class extends Function{constructor(){super("...args","return this._bound._call(...args)");r(this,"_bound");return this._bound=this.bind(this),this._bound}},U=u;function g(s,e){return new f(s,e)}var f=class{constructor(e,t){this.buffer=e;this.usage=t;r(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new o;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function v(s,e){return new d(s,e)}var d=class{constructor(e,t){this.dataType=e;this.initial=t;r(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);r(this,"_allowedUsages",{uniform:null,mutableStorage:null,readonlyStorage:null});r(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){let e=this;return this.$addFlags(GPUBufferUsage.UNIFORM),this._allowedUsages.uniform||(this._allowedUsages.uniform=g(e,"uniform")),e}$allowReadonlyStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.readonlyStorage||(this._allowedUsages.readonlyStorage=g(e,"readonly_storage")),e}$allowMutableStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.mutableStorage||(this._allowedUsages.mutableStorage=g(e,"mutable_storage")),e}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asStorage(){return this._allowedUsages.mutableStorage}asReadonlyStorage(){return this._allowedUsages.readonlyStorage}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function _(s){return new T(s)}var T=class{constructor(e){this.expr=e;r(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new o().$name(this._label);return e.addDeclaration(a`const ${t} = ${this.expr};`),e.resolve(t)}};function R(s){return(e,...t)=>{let l=new p(a(e,...t));return s&&l.$name(s),l}}var p=class{constructor(e){this.body=e;r(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new o().$name(this._label);return e.addDeclaration(a`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new m(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},m=class s{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new s(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var l,n;let[e,t]=this._slotValuePair;return`fn:${(l=this.label)!=null?l:"<unnamed>"}[${(n=e.label)!=null?n:"<unnamed>"}=${t}]`}};function F(s,e){let t=s.map(n=>[new o,n]),l=t.map(([n,i])=>n);return n=>{let i=n(...l);return new W(t,e,i)}}var y=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((l,n)=>{let i=n<this.args.length-1?", ":"";return a`${l}${i}`});return e.resolve(a`${this.usedFn}(${t})`)}},W=class extends U{constructor(t,l,n){super();this.argPairs=t;this.returnType=l;this.body=n;r(this,"identifier",new o)}$name(t){return this.identifier.$name(t),this}resolve(t){let l=this.argPairs.map(([n,i],A)=>{let h=A<this.argPairs.length-1?", ":"";return D(i)?a`${n}: ptr<${i.scope}, ${i.pointsTo}>${h}`:a`${n}: ${i}${h}`});return this.returnType!==void 0?t.addDeclaration(a`fn ${this.identifier}(${l}) -> ${this.returnType} {
2
+ ${this.body}
3
+ }`):t.addDeclaration(a`fn ${this.identifier}(${l}) {
4
+ ${this.body}
5
+ }`),t.resolve(this.identifier)}_call(...t){return new y(this,t)}};function B(s){return new b(s)}var b=class{constructor(e=void 0){this.defaultValue=e;r(this,"__brand","WgslSlot");r(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var l;let t=e.unwrap(this);if(!x(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(l=this.label)!=null?l:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var S=(s,e)=>new c(s,e,"private"),c=class{constructor(e,t,l){this._dataType=e;this._initialValue=t;this.scope=l;r(this,"identifier",new o)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(a`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(a`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var C=Object.assign(a,{code:a,fn:R,fun:F,buffer:v,plum:$,plumFromEvent:w,slot:B,constant:_,var:S});export{G as MissingSlotValueError,E as ProgramBuilder,P as RandomNameRegistry,I as RecursiveDataTypeError,V as StrictNameRegistry,C as default,D as isPointer,O as isResolvable,K as isSlot,x as isWgsl,C as wgsl};
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/callable.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;\n $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n\n asStorage(): 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n\n asReadonlyStorage(): 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutableStorage: WgslBufferUsage<TData, TAllows | 'mutable_storage'> | null;\n readonlyStorage: WgslBufferUsage<\n TData,\n TAllows | 'readonly_storage'\n > | null;\n } = {\n uniform: null,\n mutableStorage: null,\n readonlyStorage: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n return enrichedThis;\n }\n\n $allowReadonlyStorage() {\n const enrichedThis = this as WgslBuffer<\n TData,\n TAllows | 'readonly_storage'\n >;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.readonlyStorage) {\n this._allowedUsages.readonlyStorage = bufferUsage(\n enrichedThis,\n 'readonly_storage',\n );\n }\n return enrichedThis;\n }\n\n $allowMutableStorage() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable_storage'>;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.mutableStorage) {\n this._allowedUsages.mutableStorage = bufferUsage(\n enrichedThis,\n 'mutable_storage',\n );\n }\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n }\n\n asStorage() {\n return this._allowedUsages\n .mutableStorage as 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n }\n\n asReadonlyStorage() {\n return this._allowedUsages\n .readonlyStorage as 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(label?: string) {\n return (\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n ): WgslFn => {\n const func = new WgslFnImpl(code(strings, ...params));\n if (label) {\n func.$name(label);\n }\n return func;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(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 `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`);\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private identifier = new WgslIdentifier();\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(this.identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, 'private');\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { slot } from './wgslSlot';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n var: variable,\n});\n"],"mappings":"sOACA,IAAeA,EAAf,cAAmE,QAAS,CAG1E,aAAc,CAUZ,MAAM,UAAW,mCAAmC,EAZtDC,EAAA,eAeE,YAAK,OAAS,KAAK,KAAK,IAAI,EAGrB,KAAK,MACd,CAGF,EAWOC,EAAQF,ECfR,SAASG,EAIdC,EACAC,EACgC,CAChC,OAAO,IAAIC,EAAoBF,EAAQC,CAAK,CAC9C,CAMA,IAAMC,EAAN,KAEA,CAGE,YACkBF,EACAC,EAChB,CAFgB,YAAAD,EACA,WAAAC,EAJlBE,EAAA,KAAQ,SAKL,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,MACd,CAEA,MAAMC,EAA2B,CAC/B,YAAK,OAASA,EACP,IACT,CAEA,QAAQC,EAA4B,CAClC,IAAMC,EAAa,IAAIC,EAEvB,OAAAF,EAAI,WAAW,KAAMC,CAAU,EAExBD,EAAI,QAAQC,CAAU,CAC/B,CAEA,UAAmB,CAjErB,IAAAE,EAkEI,MAAO,GAAG,KAAK,KAAK,KAAIA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EACpD,CACF,ECpCO,SAASC,EAIdC,EACAC,EAC2B,CAC3B,OAAO,IAAIC,EAA8BF,EAAYC,CAAO,CAC9D,CAMA,IAAMC,EAAN,KAIA,CAmBE,YACkBC,EACAF,EAChB,CAFgB,cAAAE,EACA,aAAAF,EApBlBG,EAAA,KAAO,QACL,eAAe,SAAW,eAAe,UAE3CA,EAAA,KAAQ,iBAOJ,CACF,QAAS,KACT,eAAgB,KAChB,gBAAiB,IACnB,GAEAA,EAAA,KAAQ,SAKL,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMC,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,eAAgB,CACd,IAAMC,EAAe,KACrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,UACvB,KAAK,eAAe,QAAUC,EAAYD,EAAc,SAAS,GAE5DA,CACT,CAEA,uBAAwB,CACtB,IAAMA,EAAe,KAIrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,kBACvB,KAAK,eAAe,gBAAkBC,EACpCD,EACA,kBACF,GAEKA,CACT,CAEA,sBAAuB,CACrB,IAAMA,EAAe,KACrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,iBACvB,KAAK,eAAe,eAAiBC,EACnCD,EACA,iBACF,GAEKA,CACT,CAGA,UAAUE,EAA4B,CACpC,YAAK,OAASA,EACP,IACT,CAEA,WAAY,CACV,OAAO,KAAK,eAAe,OAG7B,CAEA,WAAY,CACV,OAAO,KAAK,eACT,cAGL,CAEA,mBAAoB,CAClB,OAAO,KAAK,eACT,eAGL,CAEA,UAAmB,CAjJrB,IAAAC,EAkJI,MAAO,WAAUA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC7C,CACF,ECpIO,SAASC,EAASC,EAAuB,CAC9C,OAAO,IAAIC,EAAcD,CAAI,CAC/B,CAMA,IAAMC,EAAN,KAAyC,CAGvC,YAA6BD,EAAY,CAAZ,UAAAA,EAF7BE,EAAA,KAAQ,SAEkC,CAE1C,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMC,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,QAAQC,EAA4B,CAClC,IAAMC,EAAa,IAAIC,EAAe,EAAE,MAAM,KAAK,MAAM,EAEzD,OAAAF,EAAI,eAAeG,UAAaF,CAAU,MAAM,KAAK,IAAI,GAAG,EAErDD,EAAI,QAAQC,CAAU,CAC/B,CACF,ECrBO,SAASG,EAAGC,EAAgB,CACjC,MAAO,CACLC,KACGC,IACQ,CACX,IAAMC,EAAO,IAAIC,EAAWC,EAAKJ,EAAS,GAAGC,CAAM,CAAC,EACpD,OAAIF,GACFG,EAAK,MAAMH,CAAK,EAEXG,CACT,CACF,CAMA,IAAMC,EAAN,KAAmC,CAGjC,YAA6BE,EAAY,CAAZ,UAAAA,EAF7BC,EAAA,KAAQ,SAEkC,CAE1C,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMP,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,QAAQQ,EAA4B,CAClC,IAAMC,EAAa,IAAIC,EAAe,EAAE,MAAM,KAAK,MAAM,EAEzD,OAAAF,EAAI,eAAeH,OAAUI,CAAU,GAAG,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,CAAC,EAEjED,EAAI,QAAQC,CAAU,CAC/B,CAEA,KAAQE,EAAmBC,EAAuB,CAChD,OAAO,IAAIC,EAAgB,KAAM,CAACF,EAAMC,CAAK,CAAC,CAChD,CAEA,UAAmB,CAnErB,IAAAE,EAoEI,MAAO,OAAMA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EACxC,CACF,EAEMD,EAAN,MAAME,CAA0C,CAC9C,YACmBC,EACAC,EACjB,CAFiB,cAAAD,EACA,oBAAAC,CAChB,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,SAAS,KACvB,CAEA,KAAaN,EAAwBC,EAAsC,CACzE,OAAO,IAAIG,EAAgB,KAAM,CAACJ,EAAMC,CAAK,CAAC,CAChD,CAEA,QAAQJ,EAA4B,CAClC,OAAOA,EAAI,QAAQ,KAAK,SAAU,CAAC,KAAK,cAAc,CAAC,CACzD,CAEA,UAAmB,CA1FrB,IAAAM,EAAAI,EA2FI,GAAM,CAACP,EAAMC,CAAK,EAAI,KAAK,eAC3B,MAAO,OAAME,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,KAAII,EAAAP,EAAK,QAAL,KAAAO,EAAc,WAAW,IAAIN,CAAK,GAC9E,CACF,ECpEO,SAASO,EAGdC,EAAqBC,EAAsB,CAC3C,IAAMC,EAAWF,EAAS,IACvBG,GAAY,CAAC,IAAIC,EAAkBD,CAAO,CAC7C,EAEME,EAAYH,EAAS,IACzB,CAAC,CAACI,EAAUH,CAAO,IACjBG,CACJ,EAGA,OAAQC,GAAgD,CACtD,IAAMC,EAAOD,EAAa,GAAIF,CAAwB,EAQtD,OANmB,IAAII,EACrBP,EACAD,EACAO,CACF,CAOF,CACF,CAkBA,IAAME,EAAN,KAIA,CACE,YACUC,EACSC,EACjB,CAFQ,YAAAD,EACS,UAAAC,CAChB,CAEH,QAAQC,EAA4B,CAClC,IAAMC,EAAW,KAAK,KAAK,IAAI,CAACC,EAAYC,IAAQ,CAClD,IAAMC,EAAQD,EAAM,KAAK,KAAK,OAAS,EAAI,KAAO,GAClD,OAAOE,IAAOH,CAAU,GAAGE,CAAK,EAClC,CAAC,EAED,OAAOJ,EAAI,QAAQK,IAAO,KAAK,MAAM,IAAIJ,CAAQ,GAAG,CACtD,CACF,EAEML,EAAN,cAKUU,CAKV,CAGE,YACUjB,EACAD,EACSO,EACjB,CACA,MAAM,EAJE,cAAAN,EACA,gBAAAD,EACS,UAAAO,EALnBY,EAAA,KAAQ,aAAa,IAAIhB,EAQzB,CAEA,MAAMiB,EAAe,CACnB,YAAK,WAAW,MAAMA,CAAK,EACpB,IACT,CAEA,QAAQR,EAA4B,CAClC,IAAMC,EAAW,KAAK,SAAS,IAAI,CAAC,CAACQ,EAAOnB,CAAO,EAAGa,IAAQ,CAC5D,IAAMC,EAAQD,EAAM,KAAK,SAAS,OAAS,EAAI,KAAO,GAEtD,OAAIO,EAAUpB,CAAO,EACZe,IAAOI,CAAK,SAASnB,EAAQ,KAAK,KAAKA,EAAQ,QAAQ,IAAIc,CAAK,GAGlEC,IAAOI,CAAK,KAAKnB,CAAO,GAAGc,CAAK,EACzC,CAAC,EAED,OAAI,KAAK,aAAe,OACtBJ,EAAI,eAAeK,OAAU,KAAK,UAAU,IAAIJ,CAAQ,QAAQ,KAAK,UAAU;AAAA,UAC3E,KAAK,IAAI;AAAA,QACX,EAEFD,EAAI,eAAeK,OAAU,KAAK,UAAU,IAAIJ,CAAQ;AAAA,UACpD,KAAK,IAAI;AAAA,QACX,EAGGD,EAAI,QAAQ,KAAK,UAAU,CACpC,CAEA,SACKD,EACmC,CACtC,OAAO,IAAIF,EAAiB,KAAME,CAAI,CACxC,CACF,ECnIO,SAASY,EAAQC,EAA+B,CACrD,OAAO,IAAIC,EAAaD,CAAY,CACtC,CAMA,IAAMC,EAAN,KAA6D,CAI3D,YAAmBD,EAA8B,OAAW,CAAzC,kBAAAA,EAHnBE,EAAA,KAAS,UAAU,YACnBA,EAAA,KAAO,QAEsD,CAEtD,MAAMC,EAAe,CAC1B,YAAK,MAAQA,EACN,IACT,CAEA,SAASC,EAAMC,EAAe,CAC5B,OAAO,OAAO,GAAGD,EAAGC,CAAC,CACvB,CAEA,QAAQC,EAA4B,CAxCtC,IAAAC,EAyCI,IAAMC,EAAQF,EAAI,OAAO,IAAI,EAE7B,GAAI,CAACG,EAAOD,CAAK,EACf,MAAM,IAAI,MACR,+BAA+B,OAAOA,CAAK,cAAaD,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,YACnF,EAGF,OAAOD,EAAI,QAAQE,CAAK,CAC1B,CAEA,UAAmB,CApDrB,IAAAD,EAqDI,MAAO,SAAQA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EAC1C,CACF,ECtCO,IAAMG,EAAW,CACtBC,EACAC,IACuB,IAAIC,EAAYF,EAAUC,EAAc,SAAS,EAMpEC,EAAN,KAA+E,CAG7E,YACmBC,EACAC,EACDC,EAChB,CAHiB,eAAAF,EACA,mBAAAC,EACD,WAAAC,EALlBC,EAAA,KAAO,aAAa,IAAIC,EAMrB,CAEH,MAAMC,EAAe,CACnB,YAAK,WAAW,MAAMA,CAAK,EACpB,IACT,CAEA,QAAQC,EAA4B,CAClC,OAAI,KAAK,cACPA,EAAI,eACFC,QAAW,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,MAAM,KAAK,aAAa,GACtF,EAEAD,EAAI,eACFC,QAAW,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,GAC9D,EAGKD,EAAI,QAAQ,KAAK,UAAU,CACpC,CACF,EC5CA,IAAOE,EAAQ,OAAO,OAAOC,EAAM,CACjC,KAAAA,EACA,GAAAC,EACA,IAAAA,EACA,OAAAC,EACA,KAAAC,EACA,cAAAC,EACA,KAAAC,EACA,SAAAC,EACA,IAAKC,CACP,CAAC","names":["Callable","__publicField","callable_default","bufferUsage","buffer","usage","WgslBufferUsageImpl","__publicField","label","ctx","identifier","WgslIdentifier","_a","buffer","typeSchema","initial","WgslBufferImpl","dataType","__publicField","label","enrichedThis","bufferUsage","flags","_a","constant","expr","WgslConstImpl","__publicField","label","ctx","identifier","WgslIdentifier","code","fn","label","strings","params","func","WgslFnImpl","code","body","__publicField","ctx","identifier","WgslIdentifier","slot","value","BoundWgslFnImpl","_a","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","fn","argTypes","returnType","argPairs","argType","WgslIdentifier","argValues","argIdent","bodyProducer","body","WgslFnImpl","WgslFunctionCall","usedFn","args","ctx","argsCode","argSegment","idx","comma","code","callable_default","__publicField","label","ident","isPointer","slot","defaultValue","WgslSlotImpl","__publicField","label","a","b","ctx","_a","value","isWgsl","variable","dataType","initialValue","WgslVarImpl","_dataType","_initialValue","scope","__publicField","WgslIdentifier","label","ctx","code","wgsl_default","code","fn","buffer","plum","plumFromEvent","slot","constant","variable"]}
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkKBVQVOLYcjs = require('../chunk-KBVQVOLY.cjs');var _chunkAS7UPXZ3cjs = require('../chunk-AS7UPXZ3.cjs');function p(l,s){return _chunkAS7UPXZ3cjs.i`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new (0, _chunkKBVQVOLYcjs.a)().$name("i");return typeof n=="function"?_chunkAS7UPXZ3cjs.i`
2
+ for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
3
+ ${n(e)}
4
+ }`:_chunkAS7UPXZ3cjs.i`
5
+ for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
6
+ ${n}
7
+ }`}return typeof n=="function"?_chunkAS7UPXZ3cjs.i`${Array.from({length:r},(e,i)=>n(i))}`:_chunkAS7UPXZ3cjs.i`${Array.from({length:r},()=>n)}`}}`}exports.repeat = p;
8
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/macro/repeat.ts"],"names":["repeat","count","snippet","code","get","countValue","snippetValue","index","WgslIdentifier","_","idx"],"mappings":"oFAcO,SAASA,EACdC,EACAC,EACM,CACN,OAAOC,IAAQC,GAAQ,CACrB,IAAMC,EAAaD,EAAIH,CAAK,EACtBK,EAAeF,EAAIF,CAAO,EAEhC,GAAI,OAAOG,GAAe,SAAU,CAClC,IAAME,EAAQ,IAAIC,EAAe,EAAE,MAAM,GAAG,EAE5C,OAAI,OAAOF,GAAiB,WACnBH;AAAA,qBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,cACpDD,EAAaC,CAA0B,CAA0C;AAAA,aAIlFJ;AAAA,mBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,YACpDD,CAAY;AAAA,UAEpB,CAEA,OAAI,OAAOA,GAAiB,WACnBH,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,CAACI,EAAGC,IAAQJ,EAAaI,CAAG,CAAC,CAAC,GAG1EP,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,IAAMC,CAAY,CAAC,EACtE,CAAC,EACH","sourcesContent":["import type { Eventual, Wgsl } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<number>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl) | ((idx: Wgsl) => Wgsl)>,\n): Wgsl {\n return code`${(get) => {\n const countValue = get(count);\n const snippetValue = get(snippet);\n\n if (typeof countValue !== 'number') {\n const index = new WgslIdentifier().$name('i');\n\n if (typeof snippetValue === 'function') {\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue(index as unknown as number) /* silencing TypeScript with the cast */}\n }`;\n }\n\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue}\n }`;\n }\n\n if (typeof snippetValue === 'function') {\n return code`${Array.from({ length: countValue }, (_, idx) => snippetValue(idx))}`;\n }\n\n return code`${Array.from({ length: countValue }, () => snippetValue)}`;\n }}`;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { E as Eventual, e as Wgsl } from '../types-Dgp6OHLq.cjs';
2
+ import 'typed-binary';
3
+
4
+ declare function repeat(count: Eventual<Wgsl>, snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>): Wgsl;
5
+ declare function repeat(count: Eventual<number>, snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>): Wgsl;
6
+
7
+ export { repeat };
@@ -0,0 +1,7 @@
1
+ import { E as Eventual, e as Wgsl } from '../types-Dgp6OHLq.js';
2
+ import 'typed-binary';
3
+
4
+ declare function repeat(count: Eventual<Wgsl>, snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>): Wgsl;
5
+ declare function repeat(count: Eventual<number>, snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>): Wgsl;
6
+
7
+ export { repeat };
@@ -0,0 +1,8 @@
1
+ import{a as u}from"../chunk-OZ2XZ4ZA.js";import{i as t}from"../chunk-TVPC7ZME.js";function p(l,s){return t`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new u().$name("i");return typeof n=="function"?t`
2
+ for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
3
+ ${n(e)}
4
+ }`:t`
5
+ for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
6
+ ${n}
7
+ }`}return typeof n=="function"?t`${Array.from({length:r},(e,i)=>n(i))}`:t`${Array.from({length:r},()=>n)}`}}`}export{p as repeat};
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/macro/repeat.ts"],"sourcesContent":["import type { Eventual, Wgsl } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<number>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl) | ((idx: Wgsl) => Wgsl)>,\n): Wgsl {\n return code`${(get) => {\n const countValue = get(count);\n const snippetValue = get(snippet);\n\n if (typeof countValue !== 'number') {\n const index = new WgslIdentifier().$name('i');\n\n if (typeof snippetValue === 'function') {\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue(index as unknown as number) /* silencing TypeScript with the cast */}\n }`;\n }\n\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue}\n }`;\n }\n\n if (typeof snippetValue === 'function') {\n return code`${Array.from({ length: countValue }, (_, idx) => snippetValue(idx))}`;\n }\n\n return code`${Array.from({ length: countValue }, () => snippetValue)}`;\n }}`;\n}\n"],"mappings":"kFAcO,SAASA,EACdC,EACAC,EACM,CACN,OAAOC,IAAQC,GAAQ,CACrB,IAAMC,EAAaD,EAAIH,CAAK,EACtBK,EAAeF,EAAIF,CAAO,EAEhC,GAAI,OAAOG,GAAe,SAAU,CAClC,IAAME,EAAQ,IAAIC,EAAe,EAAE,MAAM,GAAG,EAE5C,OAAI,OAAOF,GAAiB,WACnBH;AAAA,qBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,cACpDD,EAAaC,CAA0B,CAA0C;AAAA,aAIlFJ;AAAA,mBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,YACpDD,CAAY;AAAA,UAEpB,CAEA,OAAI,OAAOA,GAAiB,WACnBH,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,CAACI,EAAGC,IAAQJ,EAAaI,CAAG,CAAC,CAAC,GAG1EP,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,IAAMC,CAAY,CAAC,EACtE,CAAC,EACH","names":["repeat","count","snippet","code","get","countValue","snippetValue","index","WgslIdentifier","_","idx"]}
@@ -0,0 +1,9 @@
1
+ import { ISchema, UnwrapRecord } from 'typed-binary';
2
+ import { A as AnyWgslData, q as WgslData } from './types-Dgp6OHLq.js';
3
+
4
+ interface WgslStruct<TProps extends Record<string, AnyWgslData>> extends ISchema<UnwrapRecord<TProps>>, WgslData<UnwrapRecord<TProps>> {
5
+ $name(label: string): this;
6
+ }
7
+ declare const struct: <TProps extends Record<string, AnyWgslData>>(properties: TProps) => WgslStruct<TProps>;
8
+
9
+ export { type WgslStruct as W, struct as s };
@@ -0,0 +1,9 @@
1
+ import { ISchema, UnwrapRecord } from 'typed-binary';
2
+ import { A as AnyWgslData, q as WgslData } from './types-Dgp6OHLq.cjs';
3
+
4
+ interface WgslStruct<TProps extends Record<string, AnyWgslData>> extends ISchema<UnwrapRecord<TProps>>, WgslData<UnwrapRecord<TProps>> {
5
+ $name(label: string): this;
6
+ }
7
+ declare const struct: <TProps extends Record<string, AnyWgslData>>(properties: TProps) => WgslStruct<TProps>;
8
+
9
+ export { type WgslStruct as W, struct as s };
@@ -0,0 +1,77 @@
1
+ import { Parsed } from 'typed-binary';
2
+ import { a as WgslResolvable, e as Wgsl, I as InlineResolve, d as WgslPlum, u as ExtractPlumValue, k as WgslSettable, U as Unsubscribe, A as AnyWgslData, c as WgslAllocatable } from './types-Dgp6OHLq.js';
3
+ import { W as WgslStruct } from './struct-CFmatz6R.js';
4
+
5
+ interface WgslCode extends WgslResolvable {
6
+ $name(label?: string | undefined): WgslCode;
7
+ }
8
+ declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
9
+
10
+ interface TypeGpuRuntime {
11
+ readonly device: GPUDevice;
12
+ /**
13
+ * The current command encoder. This property will
14
+ * hold the same value until `flush()` is called.
15
+ */
16
+ readonly commandEncoder: GPUCommandEncoder;
17
+ readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
18
+ setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: ExtractPlumValue<TPlum>): void;
19
+ onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: () => unknown): Unsubscribe;
20
+ writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
21
+ readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
22
+ bufferFor(allocatable: WgslAllocatable): GPUBuffer;
23
+ dispose(): void;
24
+ /**
25
+ * Causes all commands enqueued by pipelines to be
26
+ * submitted to the GPU.
27
+ */
28
+ flush(): void;
29
+ makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
30
+ makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
31
+ }
32
+ interface RenderPipelineOptions {
33
+ vertex: {
34
+ args: Wgsl[];
35
+ code: WgslCode;
36
+ output: WgslStruct<Record<string, AnyWgslData>>;
37
+ buffersLayouts?: Iterable<GPUVertexBufferLayout | null>;
38
+ };
39
+ fragment: {
40
+ args: Wgsl[];
41
+ code: WgslCode;
42
+ output: Wgsl;
43
+ target: Iterable<GPUColorTargetState | null>;
44
+ };
45
+ primitive: GPUPrimitiveState;
46
+ externalLayouts?: GPUBindGroupLayout[];
47
+ externalDeclarations?: Wgsl[];
48
+ label?: string;
49
+ }
50
+ interface ComputePipelineOptions {
51
+ workgroupSize: [number, number?, number?];
52
+ args: Wgsl[];
53
+ code: WgslCode;
54
+ externalLayouts?: GPUBindGroupLayout[];
55
+ externalDeclarations?: Wgsl[];
56
+ label?: string;
57
+ }
58
+ type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
59
+ vertexCount: number;
60
+ instanceCount?: number;
61
+ firstVertex?: number;
62
+ firstInstance?: number;
63
+ externalBindGroups?: GPUBindGroup[];
64
+ externalVertexBuffers?: GPUBuffer[];
65
+ };
66
+ interface RenderPipelineExecutor {
67
+ execute(options: RenderPipelineExecutorOptions): void;
68
+ }
69
+ type ComputePipelineExecutorOptions = {
70
+ workgroups: [number, number?, number?];
71
+ externalBindGroups?: GPUBindGroup[];
72
+ };
73
+ interface ComputePipelineExecutor {
74
+ execute(options: ComputePipelineExecutorOptions): void;
75
+ }
76
+
77
+ export { type ComputePipelineOptions as C, type RenderPipelineOptions as R, type TypeGpuRuntime as T, type WgslCode as W, type RenderPipelineExecutorOptions as a, type RenderPipelineExecutor as b, code as c, type ComputePipelineExecutorOptions as d, type ComputePipelineExecutor as e };