UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

70 lines 5.66 kB
import { ensureArray, TgdConsole } from "../index.js"; import { expandFunctions, expandVariables, tgdCodeStringify, } from "./code.js"; /** * Helper to write the code of a fragment Shader. * @see https://registry.khronos.org/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf */ export class TgdShaderFragment { constructor(options = {}) { this.precision = "mediump"; const { name, precision = "highp", uniforms = {}, outputs = { FragColor: "vec4", }, varying = {}, functions = {}, mainCode = ["FragColor = vec4(1, 0.667, 0, 1);"], header = [], } = options; this.name = name ?? `TgdShaderFragment#${TgdShaderFragment.counter++}`; this.precision = precision; this.uniforms = uniforms; this.outputs = outputs; this.varying = varying; this.functions = functions; this.mainCode = mainCode; this.header = header; } clone() { return new TgdShaderFragment({ name: `${this.name}/copy`, precision: this.precision, uniforms: { ...this.uniforms }, outputs: { ...this.outputs }, varying: { ...this.varying }, functions: structuredClone(this.functions), mainCode: structuredClone(this.mainCode), header: structuredClone(this.header), }); } get code() { return tgdCodeStringify([ "#version 300 es", `precision ${this.precision} float;`, ...ensureArray(this.header), ...expandVariables(this.uniforms, "uniform"), ...expandVariables(this.varying, "in"), ...expandOutputs(this.outputs), ...expandFunctions(this.functions), "", "void main() {", this.mainCode, "}", ]); } debug(caption = "Vertex shader") { console.debug(caption); const { code } = this; const out = new TgdConsole({ text: caption.trim() + "\n", bold: true, color: "#6bf", }, code); out.debug(); } } TgdShaderFragment.counter = 0; export function expandOutputs(definition, comment = "----------------------------------------") { const names = Object.keys(definition); if (names.length === 0) return []; return [ `// ${comment}`, ...names.map((name, index) => `layout(location=${index}) out ${definition[name]} ${name};`), ]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhZ21lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhZGVyL2ZyYWdtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFrRCxNQUFNLElBQUksQ0FBQTtBQUM1RixPQUFPLEVBQ0gsZUFBZSxFQUNmLGVBQWUsRUFJZixnQkFBZ0IsR0FDbkIsTUFBTSxRQUFRLENBQUE7QUFFZjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBd0IxQixZQUNJLFVBU0ssRUFBRTtRQTlCSixjQUFTLEdBQWlDLFNBQVMsQ0FBQTtRQWdDdEQsTUFBTSxFQUNGLElBQUksRUFDSixTQUFTLEdBQUcsT0FBTyxFQUNuQixRQUFRLEdBQUcsRUFBRSxFQUNiLE9BQU8sR0FBRztZQUNOLFNBQVMsRUFBRSxNQUFNO1NBQ3BCLEVBQ0QsT0FBTyxHQUFHLEVBQUUsRUFDWixTQUFTLEdBQUcsRUFBRSxFQUNkLFFBQVEsR0FBRyxDQUFDLG1DQUFtQyxDQUFDLEVBQ2hELE1BQU0sR0FBRyxFQUFFLEdBQ2QsR0FBRyxPQUFPLENBQUE7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxxQkFBcUIsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQTtRQUN0RSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN4QixDQUFDO0lBRUQsS0FBSztRQUNELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztZQUN6QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxPQUFPO1lBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDOUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzVCLE9BQU8sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM1QixTQUFTLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN2QyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxnQkFBZ0IsQ0FBQztZQUNwQixpQkFBaUI7WUFDakIsYUFBYSxJQUFJLENBQUMsU0FBUyxTQUFTO1lBQ3BDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7WUFDNUMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7WUFDdEMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM5QixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xDLEVBQUU7WUFDRixlQUFlO1lBQ2YsSUFBSSxDQUFDLFFBQVE7WUFDYixHQUFHO1NBQ04sQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLEdBQUcsZUFBZTtRQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3RCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQ3RCO1lBQ0ksSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJO1lBQzNCLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLE1BQU07U0FDaEIsRUFDRCxJQUFJLENBQ1AsQ0FBQTtRQUNELEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNmLENBQUM7O0FBbEdnQix5QkFBTyxHQUFHLENBQUMsQUFBSixDQUFJO0FBcUdoQyxNQUFNLFVBQVUsYUFBYSxDQUN6QixVQUFrQyxFQUNsQyxPQUFPLEdBQUcsMENBQTBDO0lBRXBELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUVqQyxPQUFPO1FBQ0gsTUFBTSxPQUFPLEVBQUU7UUFDZixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztLQUM5RixDQUFBO0FBQ0wsQ0FBQyJ9