UNPKG

@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
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 };