@thi.ng/shader-ast
Version:
DSL to define shader code in TypeScript and cross-compile to GLSL, JS and other targets
93 lines (92 loc) • 2.93 kB
JavaScript
import { illegalArgs } from "@thi.ng/errors/illegal-arguments";
import {
F,
I,
U,
V4
} from "../api/types.js";
import { isVec } from "../ast/checks.js";
import { builtinCall } from "../ast/function.js";
const __texRetType = (sampler) => {
const t = sampler.type[0];
const shadow = sampler.type.indexOf("Shadow") > 0;
return t === "s" ? shadow ? F : V4 : t === "i" ? shadow ? I : "ivec4" : t === "u" ? shadow ? U : "uvec4" : illegalArgs(`unknown sampler type ${sampler.type}`);
};
const __call = (name, sampler, args, bias) => {
const f = bias ? builtinCall(name, __texRetType(sampler), sampler, ...args, bias) : builtinCall(name, __texRetType(sampler), sampler, ...args);
!isVec(f) && (f.info = "n");
return f;
};
function textureSize(sampler, lod) {
return builtinCall(
"textureSize",
/(3D|Array)/.test(sampler.type) ? "ivec3" : "ivec2",
sampler,
lod
);
}
function texture(sampler, uv, bias) {
return __call("texture", sampler, [uv], bias);
}
function textureProj(sampler, uv, bias) {
return __call("textureProj", sampler, [uv], bias);
}
function textureLod(sampler, uv, lod) {
return __call("textureLod", sampler, [uv, lod]);
}
function textureOffset(sampler, uv, off, bias) {
return __call("textureOffset", sampler, [uv, off], bias);
}
function texelFetch(sampler, uv, lod) {
return __call("texelFetch", sampler, [uv, lod]);
}
function texelFetchOffset(sampler, uv, lod, offset) {
return __call("texelFetchOffset", sampler, [uv, lod, offset]);
}
function textureProjOffset(sampler, uv, off, bias) {
return __call("textureProjOffset", sampler, [uv, off], bias);
}
function texelLodOffset(sampler, uv, lod, offset) {
return __call("texelLodOffset", sampler, [uv, lod, offset]);
}
function textureProjLod(sampler, uv, lod) {
return __call("textureProjLod", sampler, [uv, lod]);
}
function texelProjLodOffset(sampler, uv, lod, offset) {
return __call("texelProjLodOffset", sampler, [uv, lod, offset]);
}
function textureGrad(sampler, uvw, dx, dy) {
return __call("textureGrad", sampler, [uvw, dx, dy]);
}
function textureGradOffset(sampler, uvw, dx, dy, offset) {
return __call("textureGradOffset", sampler, [uvw, dx, dy, offset]);
}
function textureProjGrad(sampler, uvw, dx, dy) {
return __call("textureProjGrad", sampler, [uvw, dx, dy]);
}
function textureProjGradOffset(sampler, uvw, dx, dy, offset) {
return __call("textureProjGradOffset", sampler, [uvw, dx, dy, offset]);
}
const dFdx = (sym) => builtinCall("dFdx", sym.type, sym);
const dFdy = (sym) => builtinCall("dFdy", sym.type, sym);
const fwidth = (sym) => builtinCall("fwidth", sym.type, sym);
export {
dFdx,
dFdy,
fwidth,
texelFetch,
texelFetchOffset,
texelLodOffset,
texelProjLodOffset,
texture,
textureGrad,
textureGradOffset,
textureLod,
textureOffset,
textureProj,
textureProjGrad,
textureProjGradOffset,
textureProjLod,
textureProjOffset,
textureSize
};