@thi.ng/shader-ast
Version:
DSL to define shader code in TypeScript and cross-compile to GLSL, JS and other targets
161 lines • 11.5 kB
TypeScript
import type { Assign, Op1, Op2, Sym, Term } from "../api/nodes.js";
import type { Operator } from "../api/ops.js";
import type { BoolTerm, FloatTerm, IntTerm, Mat2Term, Mat3Term, Mat4Term, UintTerm, Vec2Term, Vec3Term, Vec4Term } from "../api/terms.js";
import type { Comparable, IVec, Int, Mat, NumericF, NumericI, NumericU, Prim, Type, UVec, Vec } from "../api/types.js";
export declare const op1: <T extends Type>(op: Operator, val: Term<T>, post?: boolean) => Op1<T>;
export declare const op2: (op: Operator, _l: Term<any> | number, _r: Term<any> | number, rtype?: Type, info?: string) => Op2<any>;
export declare const inc: <T extends Prim | Int>(t: Sym<T>) => Op1<T>;
export declare const dec: <T extends Prim | Int>(t: Sym<T>) => Op1<T>;
export declare function add<A extends Prim | Int | IVec | Mat, B extends A>(l: Term<A>, r: Term<B>): Op2<A>;
export declare function add<T extends Int | "float">(l: number, r: Term<T>): Op2<T>;
export declare function add<T extends Int | "float">(l: Term<T>, r: number): Op2<T>;
export declare function add<T extends Vec | Mat>(l: FloatTerm | number, r: Term<T>): Op2<T>;
export declare function add<T extends Vec | Mat>(l: Term<T>, r: FloatTerm | number): Op2<T>;
export declare function add<T extends IVec>(l: IntTerm | number, r: Term<T>): Op2<T>;
export declare function add<T extends IVec>(l: Term<T>, r: IntTerm | number): Op2<T>;
export declare function add<T extends UVec>(l: UintTerm | number, r: Term<T>): Op2<T>;
export declare function add<T extends UVec>(l: Term<T>, r: UintTerm | number): Op2<T>;
export declare function addSelf<A extends Prim | Int | IVec | Mat, B extends A>(l: Sym<A>, r: Term<B>): Assign<A>;
export declare function addSelf<T extends Int | "float">(l: Sym<T>, r: number): Assign<T>;
export declare function addSelf<T extends Vec | Mat>(l: Sym<T>, r: FloatTerm | number): Assign<T>;
export declare function addSelf<T extends IVec>(l: Sym<T>, r: IntTerm | number): Assign<T>;
export declare function addSelf<T extends UVec>(l: Sym<T>, r: UintTerm | number): Assign<T>;
export declare function sub<A extends Prim | Int | IVec | Mat, B extends A>(l: Term<A>, r: Term<B>): Op2<A>;
export declare function sub<T extends Int | "float">(l: number, r: Term<T>): Op2<T>;
export declare function sub<T extends Int | "float">(l: Term<T>, r: number): Op2<T>;
export declare function sub<T extends Vec | Mat>(l: FloatTerm | number, r: Term<T>): Op2<T>;
export declare function sub<T extends Vec | Mat>(l: Term<T>, r: FloatTerm | number): Op2<T>;
export declare function sub<T extends IVec>(l: IntTerm | number, r: Term<T>): Op2<T>;
export declare function sub<T extends IVec>(l: Term<T>, r: IntTerm | number): Op2<T>;
export declare function sub<T extends UVec>(l: UintTerm | number, r: Term<T>): Op2<T>;
export declare function sub<T extends UVec>(l: Term<T>, r: UintTerm | number): Op2<T>;
export declare function subSelf<A extends Prim | Int | IVec | Mat, B extends A>(l: Sym<A>, r: Term<B>): Assign<A>;
export declare function subSelf<T extends Int | "float">(l: Sym<T>, r: number): Assign<T>;
export declare function subSelf<T extends Vec | Mat>(l: Sym<T>, r: FloatTerm | number): Assign<T>;
export declare function subSelf<T extends IVec>(l: Sym<T>, r: IntTerm | number): Assign<T>;
export declare function subSelf<T extends UVec>(l: Sym<T>, r: UintTerm | number): Assign<T>;
export declare function mul<A extends Prim | Int | IVec | Mat, B extends A>(l: Term<A>, r: Term<B>): Op2<A>;
export declare function mul<T extends Int | "float">(l: number, r: Term<T>): Op2<T>;
export declare function mul<T extends Int | "float">(l: Term<T>, r: number): Op2<T>;
export declare function mul<T extends Vec | Mat>(l: FloatTerm | number, r: Term<T>): Op2<T>;
export declare function mul<T extends Vec | Mat>(l: Term<T>, r: FloatTerm | number): Op2<T>;
export declare function mul<T extends IVec>(l: IntTerm | number, r: Term<T>): Op2<T>;
export declare function mul<T extends IVec>(l: Term<T>, r: IntTerm | number): Op2<T>;
export declare function mul<T extends UVec>(l: UintTerm | number, r: Term<T>): Op2<T>;
export declare function mul<T extends UVec>(l: Term<T>, r: UintTerm | number): Op2<T>;
export declare function mul(l: Mat2Term, r: Vec2Term): Op2<"vec2">;
export declare function mul(l: Mat3Term, r: Vec3Term): Op2<"vec3">;
export declare function mul(l: Mat4Term, r: Vec4Term): Op2<"vec4">;
export declare function mul(l: Vec2Term, r: Mat2Term): Op2<"vec2">;
export declare function mul(l: Vec3Term, r: Mat3Term): Op2<"vec3">;
export declare function mul(l: Vec4Term, r: Mat4Term): Op2<"vec4">;
export declare function mulSelf<A extends Prim | Int | IVec | Mat, B extends A>(l: Sym<A>, r: Term<B>): Assign<A>;
export declare function mulSelf<T extends Int | "float">(l: Sym<T>, r: number): Assign<T>;
export declare function mulSelf<T extends Vec | Mat>(l: Sym<T>, r: FloatTerm | number): Assign<T>;
export declare function mulSelf<T extends IVec>(l: Sym<T>, r: IntTerm | number): Assign<T>;
export declare function mulSelf<T extends UVec>(l: Sym<T>, r: UintTerm | number): Assign<T>;
export declare function div<A extends Prim | Int | IVec | Mat, B extends A>(l: Term<A>, r: Term<B>): Op2<A>;
export declare function div<T extends Int | "float">(l: number, r: Term<T>): Op2<T>;
export declare function div<T extends Int | "float">(l: Term<T>, r: number): Op2<T>;
export declare function div<T extends Vec | Mat>(l: FloatTerm | number, r: Term<T>): Op2<T>;
export declare function div<T extends Vec | Mat>(l: Term<T>, r: FloatTerm | number): Op2<T>;
export declare function div<T extends IVec>(l: IntTerm | number, r: Term<T>): Op2<T>;
export declare function div<T extends IVec>(l: Term<T>, r: IntTerm | number): Op2<T>;
export declare function div<T extends UVec>(l: UintTerm | number, r: Term<T>): Op2<T>;
export declare function div<T extends UVec>(l: Term<T>, r: UintTerm | number): Op2<T>;
export declare function divSelf<A extends Prim | Int | IVec | Mat, B extends A>(l: Sym<A>, r: Term<B>): Assign<A>;
export declare function divSelf<T extends Int | "float">(l: Sym<T>, r: number): Assign<T>;
export declare function divSelf<T extends Vec | Mat>(l: Sym<T>, r: FloatTerm | number): Assign<T>;
export declare function divSelf<T extends IVec>(l: Sym<T>, r: IntTerm | number): Assign<T>;
export declare function divSelf<T extends UVec>(l: Sym<T>, r: UintTerm | number): Assign<T>;
/**
* Integer % (modulo) operator
*
* @param l -
* @param r -
*/
export declare function modi<A extends Int | IVec | UVec, B extends A>(l: Term<A>, r: Term<B>): Op2<A>;
export declare function modi<T extends IVec>(l: IntTerm | number, r: Term<T>): Op2<T>;
export declare function modi<T extends IVec>(l: Term<T>, r: IntTerm | number): Op2<T>;
export declare function modi<T extends UVec>(l: UintTerm | number, r: Term<T>): Op2<T>;
export declare function modi<T extends UVec>(l: Term<T>, r: UintTerm | number): Op2<T>;
/**
* Syntax sugar for `-x`.
*
* @param val -
*/
export declare const neg: <T extends Prim | Int | IVec | Mat>(val: Term<T>) => Op1<T>;
/**
* Syntax sugar for `1 / x`.
*
* @param val -
*/
export declare const reciprocal: <T extends Prim>(val: Term<T>) => Op2<T>;
/**
* Multiply-add: a * b + c. The `b` and `c` terms must be compatible with `a`.
*
* @param a -
* @param b -
* @param c -
*/
export declare function madd<A extends Prim, B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericF, c: Term<C> | NumericF): Term<A>;
export declare function madd<A extends IVec | "int", B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericI, c: Term<C> | NumericI): Term<A>;
export declare function madd<A extends UVec | "uint", B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericU, c: Term<C> | NumericU): Term<A>;
/**
* Add-multiply: (a + b) * c. The `b` and `c` terms must be compatible with `a`.
*
* @param a -
* @param b -
* @param c -
*/
export declare function addm<A extends Prim, B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericF, c: Term<C> | NumericF): Term<A>;
export declare function addm<A extends IVec | "int", B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericI, c: Term<C> | NumericI): Term<A>;
export declare function addm<A extends UVec | "uint", B extends A, C extends B>(a: Term<A>, b: Term<B> | NumericU, c: Term<C> | NumericU): Term<A>;
export declare const not: (val: BoolTerm) => Op1<"bool">;
export declare const or: (a: BoolTerm, b: BoolTerm) => Op2<any>;
export declare const and: (a: BoolTerm, b: BoolTerm) => Op2<any>;
export declare const eq: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const neq: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const lt: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const lte: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const gt: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const gte: <A extends Comparable, B extends A>(a: Term<A>, b: Term<B>) => BoolTerm;
export declare const bitnot: <T extends IntTerm | UintTerm | Term<IVec> | Term<UVec>>(val: T) => Op1<"int" | "uint" | IVec | UVec>;
export declare function bitand<A extends Int | IVec | UVec, B extends A>(l: Term<A>, r: Term<B>): Term<A>;
export declare function bitand<T extends IVec>(l: Term<T>, r: IntTerm | number): Term<T>;
export declare function bitand<T extends IVec>(l: IntTerm | number, r: Term<T>): Term<T>;
export declare function bitand<T extends UVec>(l: Term<T>, r: UintTerm | number): Term<T>;
export declare function bitand<T extends UVec>(l: UintTerm | number, r: Term<T>): Term<T>;
export declare function bitor<A extends Int | IVec | UVec, B extends A>(l: Term<A>, r: Term<B>): Term<A>;
export declare function bitor<T extends IVec>(l: Term<T>, r: IntTerm | number): Term<T>;
export declare function bitor<T extends IVec>(l: IntTerm | number, r: Term<T>): Term<T>;
export declare function bitor<T extends UVec>(l: Term<T>, r: UintTerm | number): Term<T>;
export declare function bitor<T extends UVec>(l: UintTerm | number, r: Term<T>): Term<T>;
export declare function bitxor<A extends Int | IVec | UVec, B extends A>(l: Term<A>, r: Term<B>): Term<A>;
export declare function bitxor<T extends IVec>(l: Term<T>, r: IntTerm | number): Term<T>;
export declare function bitxor<T extends IVec>(l: IntTerm | number, r: Term<T>): Term<T>;
export declare function bitxor<T extends UVec>(l: Term<T>, r: UintTerm | number): Term<T>;
export declare function bitxor<T extends UVec>(l: UintTerm | number, r: Term<T>): Term<T>;
/**
* @remarks
* Reference: GLSL ES Specification 3.0, page 71
*
* @param l
* @param r
*/
export declare function lshift<A extends IVec, B extends A>(l: Term<A>, r: Term<B> | IntTerm): Term<A>;
export declare function lshift<A extends UVec, B extends A>(l: Term<A>, r: Term<B> | UintTerm): Term<A>;
export declare function lshift(l: IntTerm, r: IntTerm): IntTerm;
export declare function lshift(l: UintTerm, r: UintTerm): UintTerm;
/**
* @remarks
* Reference: GLSL ES Specification 3.0, page 71
*
* @param l
* @param r
*/
export declare function rshift<A extends IVec, B extends A>(l: Term<A>, r: Term<B> | IntTerm): Term<A>;
export declare function rshift<A extends UVec, B extends A>(l: Term<A>, r: Term<B> | UintTerm): Term<A>;
export declare function rshift(l: IntTerm, r: IntTerm): IntTerm;
export declare function rshift(l: UintTerm, r: UintTerm): UintTerm;
//# sourceMappingURL=ops.d.ts.map