typegpu
Version:
A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.
71 lines (70 loc) • 4.42 kB
TypeScript
import type { MatBase } from '../data/matrix.ts';
import { type Snippet } from '../data/snippet.ts';
import type { VecBase } from '../data/vectorImpl.ts';
import type { AnyMatInstance, AnyNumericVecInstance } from '../data/wgslTypes.ts';
export declare const infixOperators: {
readonly add: import("../types.ts").DualFn<{
(lhs: number, rhs: number): number;
<T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
<T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
<T extends AnyNumericVecInstance | AnyMatInstance>(lhs: T, rhs: T): T;
<Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance : Lhs extends AnyNumericVecInstance ? number | Lhs : Lhs extends AnyMatInstance ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
}>;
readonly sub: import("../types.ts").DualFn<{
(lhs: number, rhs: number): number;
<T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
<T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
<T extends AnyNumericVecInstance | AnyMatInstance>(lhs: T, rhs: T): T;
<Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance : Lhs extends AnyNumericVecInstance ? number | Lhs : Lhs extends AnyMatInstance ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
}>;
readonly mul: import("../types.ts").DualFn<{
(lhs: number, rhs: number): number;
<MV extends AnyNumericVecInstance | AnyMatInstance>(lhs: number, rhs: MV): MV;
<MV extends AnyNumericVecInstance | AnyMatInstance>(lhs: MV, rhs: number): MV;
<V extends AnyNumericVecInstance>(lhs: V, rhs: V): V;
<M extends AnyMatInstance, V extends import("../data/wgslTypes.ts").vBaseForMat<M>>(lhs: V, rhs: M): V;
<M extends AnyMatInstance, V extends import("../data/wgslTypes.ts").vBaseForMat<M>>(lhs: M, rhs: V): V;
<M extends AnyMatInstance>(lhs: M, rhs: M): M;
<Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance | AnyMatInstance : Lhs extends AnyNumericVecInstance ? number | Lhs | import("../data/wgslTypes.ts").mBaseForVec<Lhs> : Lhs extends AnyMatInstance ? number | import("../data/wgslTypes.ts").vBaseForMat<Lhs> | Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
}>;
readonly div: import("../types.ts").DualFn<{
(lhs: number, rhs: number): number;
<T extends AnyNumericVecInstance>(lhs: T, rhs: T): T;
<T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
<T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
}>;
readonly mod: import("../types.ts").DualFn<{
(a: number, b: number): number;
<T extends AnyNumericVecInstance>(a: T, b: T): T;
<T extends AnyNumericVecInstance>(a: number, b: T): T;
<T extends AnyNumericVecInstance>(a: T, b: number): T;
}>;
readonly bitShiftLeft: import("../types.ts").DualFn<(<T extends import("../data/wgslTypes.ts").AnyIntegerVecInstance>(lhs: T, rhs: number | import("../data/wgslTypes.ts").vecIToVecU<T>) => T)>;
readonly bitShiftRight: import("../types.ts").DualFn<(<T extends import("../data/wgslTypes.ts").AnyIntegerVecInstance>(lhs: T, rhs: number | import("../data/wgslTypes.ts").vecIToVecU<T>) => T)>;
};
type Numeric = number | AnyNumericVecInstance | AnyMatInstance;
export type InfixOperatorName = keyof typeof infixOperators;
export type InfixOperator = (typeof infixOperators)[InfixOperatorName];
/**
* InfixDispatch is only used in codegen mode.
* `lhs` may either be Numeric or Snippet.
* @example
* const external = d.vec2u(1);
* const fn = () => {
* 'use gpu';
* external.mul(2); // lhs is Numeric
* d.vec2u(1).mul(2) // lhs is a snippet
* }
*/
export declare class InfixDispatch {
readonly lhs: Snippet | Numeric;
readonly operator: InfixOperator;
constructor(lhs: Snippet | Numeric, operator: InfixOperator);
}
export declare function isInfixDispatch(o: unknown): o is InfixDispatch;
/**
* This function is used on vec/mat prototypes.
* This is done in runtime in order to avoid a circular dependency.
*/
export declare function assignInfixOperator<T extends typeof VecBase | typeof MatBase>(base: T, operator: InfixOperatorName, operatorSymbol: symbol): void;
export {};