typegpu 0.0.0-alpha.3 → 0.0.0-alpha.5

Sign up to get free protection for your applications and to get access to all the features.
package/index.d.ts CHANGED
@@ -1,272 +1,76 @@
1
- import { W as WgslResolvable, a as WgslSlot, b as WgslPlum, E as ExtractPlumValue, c as WgslSettable, U as Unsubscribe, A as AnyWgslData, d as WgslAllocatable, e as Wgsl, B as BufferUsage, f as WgslBindable, g as Eventual, I as InlineResolve, h as WgslFnArgument, R as ResolutionCtx, i as WgslValue, j as WgslIdentifier, k as WgslResolvableSlot, p as plum, l as plumFromEvent } from './types-DeF6xFAt.js';
2
- export { t as AnyWgslPointer, q as EventualGetter, S as SlotValuePair, r as WgslData, s as WgslPointer, u as isPointer, m as isResolvable, o as isSlot, n as isWgsl } from './types-DeF6xFAt.js';
3
1
  import { Parsed } from 'typed-binary';
4
- import { W as WgslStruct } from './struct-udnQvwHG.js';
2
+ import { A as AnyTgpuData, B as BufferUsage, T as TgpuBindable, a as TgpuAllocatable, b as TgpuNamable, c as TgpuPlum, v as vecBase, d as vec3f, e as vec3i, f as vec3u } from './types-DU0c7BuW.js';
3
+ export { h as TexelFormat, g as TgpuData } from './types-DU0c7BuW.js';
5
4
 
6
- /**
7
- * An error that happens during resolution of WGSL code.
8
- * Contains a trace of all ancestor resolvables in
9
- * which this error originated.
10
- *
11
- * @category Errors
12
- */
13
- declare class ResolutionError extends Error {
14
- readonly cause: unknown;
15
- readonly trace: WgslResolvable[];
16
- constructor(cause: unknown, trace: WgslResolvable[]);
17
- appendToTrace(ancestor: WgslResolvable): ResolutionError;
18
- }
19
- /**
20
- * @category Errors
21
- */
22
- declare class MissingSlotValueError extends Error {
23
- readonly slot: WgslSlot<unknown>;
24
- constructor(slot: WgslSlot<unknown>);
25
- }
26
- /**
27
- * @category Errors
28
- */
29
- declare class RecursiveDataTypeError extends Error {
30
- constructor();
5
+ interface TgpuBufferUsage<TData extends AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuBindable<TData, TUsage> {
31
6
  }
32
7
 
33
- declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Function {
34
- _bound: Callable<TArgs, TReturn>;
35
- constructor();
36
- abstract _call(...args: TArgs): TReturn;
37
- }
38
- type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
39
- type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
40
-
41
- interface TypeGpuRuntime {
8
+ interface Unmanaged {
42
9
  readonly device: GPUDevice;
43
- /**
44
- * The current command encoder. This property will
45
- * hold the same value until `flush()` is called.
46
- */
47
- readonly commandEncoder: GPUCommandEncoder;
48
- readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
49
- setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: ExtractPlumValue<TPlum>): void;
50
- onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: () => unknown): Unsubscribe;
51
- writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
52
- readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
53
- bufferFor(allocatable: WgslAllocatable): GPUBuffer;
54
- dispose(): void;
55
- /**
56
- * Causes all commands enqueued by pipelines to be
57
- * submitted to the GPU.
58
- */
59
- flush(): void;
60
- makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
61
- makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
62
- }
63
- interface RenderPipelineOptions {
64
- vertex: {
65
- args: Wgsl[];
66
- code: Wgsl;
67
- output: WgslStruct<Record<string, AnyWgslData>>;
68
- buffersLayouts?: Iterable<GPUVertexBufferLayout | null>;
69
- };
70
- fragment: {
71
- args: Wgsl[];
72
- code: Wgsl;
73
- output: Wgsl;
74
- target: Iterable<GPUColorTargetState | null>;
75
- };
76
- primitive: GPUPrimitiveState;
77
- externalLayouts?: GPUBindGroupLayout[];
78
- externalDeclarations?: Wgsl[];
79
- label?: string;
80
- }
81
- interface ComputePipelineOptions {
82
- workgroupSize?: readonly [number, number?, number?];
83
- args?: Wgsl[];
84
- code: Wgsl;
85
- externalLayouts?: GPUBindGroupLayout[];
86
- externalDeclarations?: Wgsl[];
87
- label?: string;
88
- }
89
- type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
90
- vertexCount: number;
91
- instanceCount?: number;
92
- firstVertex?: number;
93
- firstInstance?: number;
94
- externalBindGroups?: GPUBindGroup[];
95
- externalVertexBuffers?: GPUBuffer[];
96
- };
97
- interface RenderPipelineExecutor {
98
- execute(options: RenderPipelineExecutorOptions): void;
10
+ readonly buffer: GPUBuffer;
99
11
  }
100
- type ComputePipelineExecutorOptions = {
101
- workgroups?: readonly [number, number?, number?];
102
- externalBindGroups?: GPUBindGroup[];
103
- };
104
- interface ComputePipelineExecutor {
105
- execute(options?: ComputePipelineExecutorOptions): void;
12
+ interface AllowUniform {
13
+ uniformAllowed: true;
106
14
  }
107
-
108
- interface NameRegistry {
109
- nameFor(item: WgslResolvable): string;
15
+ interface AllowReadonly {
16
+ readonlyAllowed: true;
110
17
  }
111
- declare class RandomNameRegistry implements NameRegistry {
112
- private lastUniqueId;
113
- private names;
114
- nameFor(item: WgslResolvable): string;
18
+ interface AllowMutable {
19
+ mutableAllowed: true;
115
20
  }
116
- declare class StrictNameRegistry implements NameRegistry {
117
- /**
118
- * Allows to provide a good fallback for instances of the
119
- * same function that are bound to different slot values.
120
- */
121
- private readonly _usedNames;
122
- private readonly _assignedNames;
123
- nameFor(item: WgslResolvable): string;
21
+ interface AllowVertex {
22
+ vertexAllowed: true;
124
23
  }
125
-
126
- type Program = {
127
- readonly bindGroupLayout: GPUBindGroupLayout;
128
- readonly bindGroup: GPUBindGroup;
129
- readonly code: string;
24
+ type AllowedUsages<TData extends AnyTgpuData> = {
25
+ uniform: TgpuBufferUsage<TData, 'uniform'> | null;
26
+ mutable: TgpuBufferUsage<TData, 'mutable'> | null;
27
+ readonly: TgpuBufferUsage<TData, 'readonly'> | null;
28
+ vertex: TgpuBufferUsage<TData, 'vertex'> | null;
130
29
  };
131
- type BuildOptions = {
132
- shaderStage: number;
133
- bindingGroup: number;
134
- nameRegistry?: NameRegistry;
30
+ interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuAllocatable<TData>, TgpuNamable {
31
+ $allowUniform(): this & AllowUniform;
32
+ $allowReadonly(): this & AllowReadonly;
33
+ $allowMutable(): this & AllowMutable;
34
+ $allowVertex(stepMode: 'vertex' | 'instance'): this & AllowVertex;
35
+ $addFlags(flags: GPUBufferUsageFlags): this;
36
+ $device(device: GPUDevice): this & Unmanaged;
37
+ _usages: AllowedUsages<TData>;
38
+ readonly label: string | undefined;
39
+ }
40
+ declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
41
+ declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
42
+
43
+ declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged, data: Parsed<TData>): void;
44
+ declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged): Promise<Parsed<TData>>;
45
+
46
+ declare const tgpu: {
47
+ createBuffer: typeof buffer;
48
+ read: typeof read;
49
+ write: typeof write;
135
50
  };
136
- declare class ProgramBuilder {
137
- private runtime;
138
- private root;
139
- constructor(runtime: TypeGpuRuntime, root: WgslResolvable);
140
- build(options: BuildOptions): Program;
141
- }
142
-
143
- interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
144
- $name(label: string): WgslVar<TDataType>;
145
- }
146
-
147
- interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
148
- $name(label: string): WgslBufferUsage<TData, TUsage>;
149
- }
150
-
151
- interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
152
- $name(label: string): WgslBuffer<TData, TAllows>;
153
- $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
154
- $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;
155
- $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;
156
- $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
157
- asUniform(): 'uniform' extends TAllows ? WgslBufferUsage<TData, 'uniform'> : null;
158
- asMutableStorage(): 'mutable_storage' extends TAllows ? WgslBufferUsage<TData, 'mutable_storage'> : null;
159
- asReadonlyStorage(): 'readonly_storage' extends TAllows ? WgslBufferUsage<TData, 'readonly_storage'> : null;
160
- }
161
- declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
162
-
163
- interface WgslCode extends WgslResolvable {
164
- $name(label?: string | undefined): WgslCode;
165
- with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;
166
- }
167
- type BoundWgslCode = Omit<WgslCode, '$name'>;
168
- declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
169
51
 
170
- interface WgslConst extends WgslResolvable {
171
- $name(label: string): WgslConst;
172
- }
173
52
  /**
174
- * Creates a constant is computed at shader initialization according
175
- * to the passed in expression.
53
+ * @category Errors
176
54
  */
177
- declare function constant(expr: Wgsl): WgslConst;
178
-
179
- interface WgslDeclare extends WgslResolvable {
180
- }
181
- declare function declare(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslDeclare;
182
-
183
- interface WgslFn$1 extends WgslResolvable {
184
- $name(label: string): WgslFn$1;
185
- with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
186
- }
187
- type BoundWgslFn = Omit<WgslFn$1, '$name'>;
188
- declare function fn$1(strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]): WgslFn$1;
189
-
190
- interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
191
- }
192
- 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>>;
193
- type ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {
194
- [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;
195
- };
196
- type PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {
197
- [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];
198
- };
199
- type SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {
200
- [K in keyof TArgTypes]: Wgsl;
201
- };
202
- declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> implements WgslResolvable {
203
- private usedFn;
204
- private readonly args;
205
- constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
206
- resolve(ctx: ResolutionCtx): string;
207
- toString(): string;
208
- }
209
- declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
210
- private argPairs;
211
- private returnType;
212
- private readonly body;
213
- private _label;
214
- constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
215
- get label(): string | undefined;
216
- $name(label: string): this;
217
- resolve(ctx: ResolutionCtx): string;
218
- _call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
219
- toString(): string;
55
+ declare class RecursiveDataTypeError extends Error {
56
+ constructor();
220
57
  }
221
58
 
222
- declare function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;
223
- declare function slot<T>(defaultValue?: T): WgslSlot<T>;
224
-
225
- declare const _default: typeof code & {
226
- code: typeof code;
227
- fn: typeof fn$1;
228
- fun: typeof fn;
229
- buffer: typeof buffer;
230
- plum: typeof plum;
231
- plumFromEvent: typeof plumFromEvent;
232
- slot: typeof slot;
233
- constant: typeof constant;
234
- declare: typeof declare;
235
- var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl) => WgslVar<TDataType>;
59
+ declare const std: {
60
+ add: <T extends vecBase>(lhs: T, rhs: T) => T;
61
+ sub: <T extends vecBase>(lhs: T, rhs: T) => T;
62
+ mul: <T extends vecBase>(s: number, v: T) => T;
63
+ dot: <T extends vecBase>(lhs: T, rhs: T) => number;
64
+ normalize: <T extends vecBase>(v: T) => T;
65
+ cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T;
66
+ fract: (a: number) => number;
67
+ length: <T extends vecBase>(vector: T) => number;
68
+ sin: (x: number) => number;
69
+ cos: (x: number) => number;
236
70
  };
237
71
 
238
72
  /**
239
- * Options passed into {@link createRuntime}.
240
- */
241
- type CreateRuntimeOptions = {
242
- adapter: GPURequestAdapterOptions | undefined;
243
- device: GPUDeviceDescriptor | undefined;
244
- };
245
- /**
246
- * @param options
247
- * @returns
248
- *
249
- * @example
250
- * When given no options, the function will ask the browser for a suitable GPU device.
251
- * ```ts
252
- * createRuntime();
253
- * ```
254
- *
255
- * @example
256
- * If there are specific options that should be used when requesting a device, you can pass those in.
257
- * ```ts
258
- * const adapterOptions: GPURequestAdapterOptions = ...;
259
- * const deviceDescriptor: GPUDeviceDescriptor = ...;
260
- * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });
261
- * ```
262
- *
263
- * @example
264
- * If a specific device should be used instead, it can be passed in as a parameter.
265
- * ```ts
266
- * const device: GPUDevice = ...;
267
- * createRuntime(device);
268
- * ```
73
+ * @module typegpu
269
74
  */
270
- declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
271
75
 
272
- export { AnyWgslData, type AsCallable, BufferUsage, type ComputePipelineExecutor, type ComputePipelineExecutorOptions, type ComputePipelineOptions, type CreateRuntimeOptions, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, type RenderPipelineExecutor, type RenderPipelineExecutorOptions, type RenderPipelineOptions, ResolutionCtx, ResolutionError, StrictNameRegistry, type TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslCode, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslResolvable, WgslResolvableSlot, WgslSettable, WgslSlot, WgslValue, type WgslVar, createRuntime, _default as wgsl };
76
+ export { AnyTgpuData, RecursiveDataTypeError, type TgpuBuffer, tgpu as default, std };
package/index.js CHANGED
@@ -1,29 +1,2 @@
1
- import{a as $,b as le,c as $e}from"./chunk-K6N2A55L.js";import{a as se,b as ne,c as ae,d as a,e as D,f as ie,g as oe,h as ue,i as o,j as m}from"./chunk-NTGWE7PR.js";var E=class extends Function{constructor(){super("...args","return this._bound._call(...args)");a(this,"_bound");return this._bound=this.bind(this),this._bound}},ge=E;var x=class{constructor(){a(this,"lastUniqueId",0);a(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},V=class{constructor(){a(this,"_usedNames",new Set);a(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};var Pe={uniform:"uniform",mutable_storage:"storage, read_write",readonly_storage:"storage, read"},C=class{constructor(e,t){this.names=e;this._bindingGroup=t;a(this,"_memoizedResolves",new WeakMap);a(this,"_nextFreeBindingIdx",0);a(this,"_usedBindables",new Set);a(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get declarations(){return this._declarations}getOrInstantiate(e,t){var i;let r=(i=this._memoizedResolves.get(e))!=null?i:[];for(let u of r)if([...u.slotToValueMap.entries()].every(([g,c])=>t.readSlot(g)===c))return u.result;let s;try{s=e.resolve(t)}catch(u){throw u instanceof $?u.appendToTrace(e):new $(u,[e])}let l=new Map;for(let u of t.usedSlots)l.set(u,t.readSlot(u));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){return this._usedBindables.add(e),{group:this._bindingGroup,idx:this._nextFreeBindingIdx++}}addDeclaration(e){this._declarations.push(e)}},P=class{constructor({names:e,bindingGroup:t}){a(this,"_shared");a(this,"usedSlots",new Set);this._shared=new C(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new le(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!D(e))return String(e);let r=new F(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
2
-
3
- `)}${s}`}},F=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;a(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(o`@group(${r}) @binding(${s}) var<${Pe[e.usage]}> ${t}: ${e.allocatable.dataType};`)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;oe(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!D(e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var we={uniform:"uniform",mutable_storage:"storage",readonly_storage:"read-only-storage"},b=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var u;let t=new P({names:(u=e.nameRegistry)!=null?u:new x,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=this.runtime.device.createBindGroupLayout({entries:s.map((d,g)=>({binding:g,visibility:e.shaderStage,buffer:{type:we[d.usage]}}))}),i=this.runtime.device.createBindGroup({layout:l,entries:s.map((d,g)=>({binding:g,resource:{buffer:this.runtime.bufferFor(d.allocatable)}}))});return{bindGroupLayout:l,bindGroup:i,code:r}}};function w(n,e){return new G(n,e)}var G=class{constructor(e,t){this.buffer=e;this.usage=t;a(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new m;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function de(n,e){return new M(n,e)}var M=class{constructor(e,t){this.dataType=e;this.initial=t;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"_allowedUsages",{uniform:null,mutableStorage:null,readonlyStorage:null});a(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=w(e,"uniform")),e}$allowReadonlyStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.readonlyStorage||(this._allowedUsages.readonlyStorage=w(e,"readonly_storage")),e}$allowMutableStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.mutableStorage||(this._allowedUsages.mutableStorage=w(e,"mutable_storage")),e}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutableStorage(){return this._allowedUsages.mutableStorage}asReadonlyStorage(){return this._allowedUsages.readonlyStorage}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function pe(n){return new k(n)}var k=class{constructor(e){this.expr=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`const ${t} = ${this.expr};`),e.resolve(t)}};function fe(n,...e){return new L(o(n,...e))}var L=class{constructor(e){this._declaration=e}resolve(e){return e.addDeclaration(o`${this._declaration}`),""}};function me(n,...e){return new O(o(n,...e))}var O=class{constructor(e){this.body=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new I(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},I=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function ce(n,e){let t=n.map(s=>[new m,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new z(t,e,l)}}var N=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return o`${r}${l}`});return e.resolve(o`${this.usedFn}(${t})`.$name("internal"))}toString(){var e;return`fun:${(e=this.usedFn.label)!=null?e:"<unnamed>"}()`}},z=class extends ge{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;a(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let r=new m().$name(this._label),s=this.argPairs.map(([l,i],u)=>{let d=u<this.argPairs.length-1?", ":"";return ue(i)?o`${l}: ptr<${i.scope}, ${i.pointsTo}>${d}`:o`${l}: ${i}${d}`});return this.returnType!==void 0?t.addDeclaration(o`fn ${r}(${s}) -> ${this.returnType} {
4
- ${this.body}
5
- }`):t.addDeclaration(o`fn ${r}(${s}) {
6
- ${this.body}
7
- }`),t.resolve(r)}_call(...t){return new N(this,t)}toString(){var t;return`fun:${(t=this._label)!=null?t:"<unnamed>"}`}};var Te=Symbol("This item can be set, owns its value (does not get value from an external source)");var he=Symbol("This plum's value is sourced from outside the runtime.");function S(n){return n[he]===!0}function ye(n){return typeof n=="function"?new j(n):new q(n)}function be(n,e){return new K(n,e)}function We(n){return n.__brand==="WgslPlum"}var Se,q=class{constructor(e){this._initial=e;a(this,"__brand","WgslPlum");a(this,Se,!0);a(this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};Se=Te;var j=class{constructor(e){this._compute=e;a(this,"__brand","WgslPlum");a(this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},Re,K=class{constructor(e,t){this._subscribe=e;this._getLatest=t;a(this,"__brand","WgslPlum");a(this,Re,!0);a(this,"_label");a(this,"_prev");a(this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};Re=he;function ve(n){return new Q(n)}var Q=class{constructor(e=void 0){this.defaultValue=e;a(this,"__brand","WgslSlot");a(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!ie(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var _e=(n,e)=>new Y(n,e,"private"),Y=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;a(this,"identifier",new m)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var Ae=Object.assign(o,{code:o,fn:me,fun:ce,buffer:de,plum:ye,plumFromEvent:be,slot:ve,constant:pe,declare:fe,var:_e});import{BufferReader as Ue,BufferWriter as xe}from"typed-binary";var X=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var R=class{constructor(){a(this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s()}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=S(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return S(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[i]of r.dependencies)l.add(this.subscribe(i,()=>{this._recompute(e)}));S(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var A=class{constructor(){a(this,"_queue",[]);a(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var U=class{constructor(e){this.device=e;a(this,"_entryToBufferMap",new Map);a(this,"_pipelineExecutors",[]);a(this,"_commandEncoder",null);a(this,"_readBuffer",null);a(this,"_taskQueue",new A);a(this,"_plumStore",new R);a(this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:X(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new xe(t.getMappedRange());if(We(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new Ue(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=X(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new xe(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var g,c,T,h,y,p,f,_,v,Z,ee,te,re;let t=new b(this,o`
8
- @vertex fn main_vertex(${e.vertex.args.flatMap(W=>[W,", "])}) -> ${e.vertex.output} {
9
- ${e.vertex.code}
10
- }
11
-
12
- ${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(W=>[W,`
13
- `]))!=null?c:""}
14
- `).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.VERTEX}),r=new b(this,o`
15
- @fragment fn main_frag(${e.fragment.args.flatMap(W=>[W,", "])}) -> ${e.fragment.output} {
16
- ${e.fragment.code}
17
- }
18
-
19
- ${(y=(h=e.externalDeclarations)==null?void 0:h.flatMap(W=>[W,`
20
- `]))!=null?y:""}
21
- `).build({bindingGroup:((p=e.externalLayouts)!=null?p:[]).length+1,shaderStage:GPUShaderStage.FRAGMENT}),s=this.device.createShaderModule({code:t.code}),l=this.device.createShaderModule({code:r.code}),i=this.device.createPipelineLayout({label:(f=e.label)!=null?f:"",bindGroupLayouts:[...(_=e.externalLayouts)!=null?_:[],t.bindGroupLayout,r.bindGroupLayout]}),u=this.device.createRenderPipeline({label:(v=e.label)!=null?v:"",layout:i,vertex:{module:s,buffers:(Z=e.vertex.buffersLayouts)!=null?Z:[]},fragment:{module:l,targets:(ee=e.fragment.target)!=null?ee:[]},primitive:e.primitive}),d=new H(this,u,[t,r],(re=(te=e.externalLayouts)==null?void 0:te.length)!=null?re:0);return this._pipelineExecutors.push(d),d}makeComputePipeline(e){var g,c,T,h,y,p,f,_;let{args:t=[],workgroupSize:r=[1,1]}=e,s=new b(this,o`
22
- @compute @workgroup_size(${r.join(", ")}) fn main_compute(${t.flatMap(v=>[v,", "])}) {
23
- ${e.code}
24
- }
25
-
26
- ${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(v=>[v,`
27
- `]))!=null?c:""}
28
- `).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.COMPUTE}),l=this.device.createShaderModule({code:s.code}),i=this.device.createPipelineLayout({label:(h=e.label)!=null?h:"",bindGroupLayouts:[...(y=e.externalLayouts)!=null?y:[],s.bindGroupLayout]}),u=this.device.createComputePipeline({label:(p=e.label)!=null?p:"",layout:i,compute:{module:l}}),d=new J(this,u,[s],(_=(f=e.externalLayouts)==null?void 0:f.length)!=null?_:0);return this._pipelineExecutors.push(d),d}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},B=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},H=class extends B{execute(e){var T,h,y;let c=e,{vertexCount:t,instanceCount:r,firstVertex:s,firstInstance:l,externalBindGroups:i,externalVertexBuffers:u}=c,d=ae(c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers"]);if(((T=i==null?void 0:i.length)!=null?T:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(h=i==null?void 0:i.length)!=null?h:0}`);let g=this._runtime.commandEncoder.beginRenderPass(ne(se({},d),{label:(y=this.label)!=null?y:""}));g.setPipeline(this.pipeline),(i!=null?i:[]).forEach((p,f)=>g.setBindGroup(f,p)),(u!=null?u:[]).forEach((p,f)=>g.setVertexBuffer(f,p)),this.programs.forEach((p,f)=>{g.setBindGroup((i!=null?i:[]).length+f,p.bindGroup)}),g.draw(t,r,s,l),g.end()}},J=class extends B{execute(e){var l,i,u;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(i=r==null?void 0:r.length)!=null?i:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(u=this.label)!=null?u:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((d,g)=>s.setBindGroup(g,d)),this.programs.forEach((d,g)=>s.setBindGroup((r!=null?r:[]).length+g,d.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function Be(n){if(n instanceof GPUDevice)return new U(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new U(await e.requestDevice(n==null?void 0:n.device))}export{le as MissingSlotValueError,b as ProgramBuilder,x as RandomNameRegistry,$e as RecursiveDataTypeError,$ as ResolutionError,V as StrictNameRegistry,Be as createRuntime,ue as isPointer,D as isResolvable,oe as isSlot,ie as isWgsl,Ae as wgsl};
1
+ import{a as P,b as C,c as _,l as G,n as y,o as g,p as v,q as i,r as s,s as c,t as x,u as m,v as w}from"./chunk-6WFXH2OR.js";import{a as r,b as R,c as b}from"./chunk-337KOXP7.js";import{BufferReader as D,BufferWriter as $}from"typed-binary";function M(e,t){let a=e.buffer,n=e.device;if(a.mapState==="mapped"){let T=a.getMappedRange();e.dataType.write(new $(T),t);return}let p=P(e.dataType.size,e.dataType.byteAlignment),U=new ArrayBuffer(p);e.dataType.write(new $(U),t),n.queue.writeBuffer(a,0,U,0,p)}async function V(e){let t=e.buffer,a=e.device;if(t.mapState==="mapped"){let T=t.getMappedRange();return e.dataType.read(new D(T))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let T=t.getMappedRange(),A=e.dataType.read(new D(T));return t.unmap(),A}let n=a.createBuffer({size:e.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),p=a.createCommandEncoder();p.copyBufferToBuffer(t,0,n,0,e.dataType.size),a.queue.submit([p.finish()]),await a.queue.onSubmittedWorkDone(),await n.mapAsync(GPUMapMode.READ,0,e.dataType.size);let U=e.dataType.read(new D(n.getMappedRange()));return n.unmap(),n.destroy(),U}import{BufferWriter as k}from"typed-binary";function f(e,t){return new z(e,t)}var z=class{constructor(t,a){this.buffer=t;this.usage=a}get label(){return this.buffer.label}get allocatable(){return this.buffer}resolve(t){let a=new b().$name(this.label);return t.addBinding(this,a),t.resolve(a)}toString(){var t;return`${this.usage}:${(t=this.label)!=null?t:"<unnamed>"}`}};function S(e,t){return new h(e,t)}var h=class{constructor(t,a){this.dataType=t;this.initialOrBuffer=a;r(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);r(this,"_device",null);r(this,"_buffer",null);r(this,"_usages",{uniform:null,mutable:null,readonly:null,vertex:null});r(this,"vertexLayout",null);r(this,"_label");r(this,"initial");R(a)?this._buffer=a:this.initial=a}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._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new k(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 is managed by TypeGPU and cannot be used directly");return this._device}$name(t){return this._label=t,this}$allowUniform(){return this.$addFlags(GPUBufferUsage.UNIFORM),this._usages.uniform||(this._usages.uniform=f(this,"uniform")),this}$allowReadonly(){return this.$addFlags(GPUBufferUsage.STORAGE),this._usages.readonly||(this._usages.readonly=f(this,"readonly")),this}$allowMutable(){return this.$addFlags(GPUBufferUsage.STORAGE),this._usages.mutable||(this._usages.mutable=f(this,"mutable")),this}$allowVertex(t="vertex"){if(this.$addFlags(GPUBufferUsage.VERTEX),!this.vertexLayout)if(this.dataType instanceof _)this.vertexLayout={arrayStride:this.dataType.size,stepMode:t},this._usages.vertex=f(this,"vertex");else if(this.dataType instanceof G)this.vertexLayout={arrayStride:this.dataType.elementType.size,stepMode:t},this._usages.vertex=f(this,"vertex");else throw new Error("Only simple data types can be used as vertex buffers");if(this.vertexLayout.stepMode!==t)throw new Error("Cannot change step mode of a vertex buffer");return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};function E(e){return e.charAt(0).toUpperCase()+e.slice(1)}function B(e,t){return a=>{if(a._usages[e]===null)throw new Error(`Cannot pass ${a} to as${E(e)} function, as the buffer does not allow ${e} usage. To allow it, use $allow${E(e)} TgpuBuffer method.`);return a._usages[e]}}var H=B("uniform",{uniformAllowed:!0}),J=B("readonly",{readonlyAllowed:!0}),Q=B("mutable",{mutableAllowed:!0}),Z=B("vertex",{vertexAllowed:!0});var F={createBuffer:S,read:V,write:M};var o=e=>Math.sqrt(e.x**2+e.y**2),l=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),u={length:{vec2f:o,vec2i:o,vec2u:o,vec3f:l,vec3i:l,vec3u:l,vec4f:d,vec4i:d,vec4u:d},add:{vec2f:(e,t)=>y(e.x+t.x,e.y+t.y),vec2i:(e,t)=>g(e.x+t.x,e.y+t.y),vec2u:(e,t)=>v(e.x+t.x,e.y+t.y),vec3f:(e,t)=>i(e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>s(e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>c(e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>x(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>m(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>w(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>y(e.x-t.x,e.y-t.y),vec2i:(e,t)=>g(e.x-t.x,e.y-t.y),vec2u:(e,t)=>v(e.x-t.x,e.y-t.y),vec3f:(e,t)=>i(e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>s(e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>c(e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>x(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>m(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>w(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>y(e*t.x,e*t.y),vec2i:(e,t)=>g(e*t.x,e*t.y),vec2u:(e,t)=>v(e*t.x,e*t.y),vec3f:(e,t)=>i(e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>s(e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>c(e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>x(e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>m(e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>w(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=o(e);return y(e.x/t,e.y/t)},vec2i:e=>{let t=o(e);return g(e.x/t,e.y/t)},vec2u:e=>{let t=o(e);return v(e.x/t,e.y/t)},vec3f:e=>{let t=l(e);return i(e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=l(e);return s(e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=l(e);return c(e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=d(e);return x(e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=d(e);return m(e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=d(e);return w(e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>i(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)=>s(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)=>c(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 O={add:(e,t)=>u.add[e.kind](e,t),sub:(e,t)=>u.sub[e.kind](e,t),mul:(e,t)=>u.mul[t.kind](e,t),dot:(e,t)=>u.dot[e.kind](e,t),normalize:e=>u.normalize[e.kind](e),cross:(e,t)=>u.cross[e.kind](e,t),fract:e=>e-Math.floor(e),length:e=>u.length[e.kind](e),sin:Math.sin,cos:Math.cos};var oe=F;export{C as RecursiveDataTypeError,oe as default,O as std};
29
2
  //# sourceMappingURL=index.js.map