@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
70 lines • 5.66 kB
JavaScript
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