@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
81 lines • 6.57 kB
JavaScript
import { ensureArray, resolveErrorMessage, TgdConsole } from "../index.js";
import { expandFunctions, expandVariables, tgdCodeStringify as tgdCodeToString, } from "./code.js";
/**
* Helper to create a Vertex Shader.
*
* Sometime you need to add some code to a shader depending on
* what you want to display. This can be the case when you use
* different materials. All the 3D transformations are common,
* but you may need more or less varyings and uniforms.
* @see https://registry.khronos.org/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf
*/
export class TgdShaderVertex {
constructor({ name, precision = "highp", uniforms = {}, attributes = {}, varying = {}, functions = {}, mainCode = [], mainCodeHeaders = [], header = [], } = {}) {
this.name = name ?? `TgdShaderVertex#${TgdShaderVertex.counter++}`;
this.precision = precision;
this.uniforms = uniforms;
this.attributes = attributes;
this.varying = varying;
this.functions = functions;
this.mainCode = mainCode;
this.mainCodeHeaders = mainCodeHeaders;
this.header = header;
}
clone() {
return new TgdShaderVertex({
name: `${this.name}/copy`,
precision: this.precision,
uniforms: { ...this.uniforms },
attributes: { ...this.attributes },
varying: { ...this.varying },
functions: { ...this.functions },
mainCode: structuredClone(this.mainCode),
header: structuredClone(this.header),
});
}
get code() {
return tgdCodeToString([
"#version 300 es",
`precision ${this.precision} float;`,
...ensureArray(this.header),
...expandVariables(this.uniforms, "uniform"),
...expandVariables(this.attributes, "in"),
...expandVariables(this.varying, "out"),
...expandFunctions(this.functions),
"",
"void main() {",
...this.mainCodeHeaders,
ensureArray(this.mainCode),
"}",
]);
}
createShader(gl) {
try {
const shader = gl.createShader(gl.VERTEX_SHADER);
if (!shader) {
throw new Error("Unable to create a WebGL2 vertex shader!");
}
gl.shaderSource(shader, this.code);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
throw new Error(gl.getShaderInfoLog(shader) ?? "Unable to compile vertex shader!");
}
return shader;
}
catch (error) {
throw new Error(`[${this.name}] ${resolveErrorMessage(error)}`);
}
}
debug(caption = "Vertex shader") {
console.debug(caption);
const { code } = this;
const out = new TgdConsole({
text: caption,
bold: true,
color: "#6bf",
}, code);
out.debug();
}
}
TgdShaderVertex.counter = 0;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVydGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYWRlci92ZXJ0ZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQXdDLE1BQU0sSUFBSSxDQUFBO0FBQ3ZHLE9BQU8sRUFDSCxlQUFlLEVBQ2YsZUFBZSxFQUlmLGdCQUFnQixJQUFJLGVBQWUsR0FDdEMsTUFBTSxRQUFRLENBQUE7QUFFZjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBYXhCLFlBQVksRUFDUixJQUFJLEVBQ0osU0FBUyxHQUFHLE9BQU8sRUFDbkIsUUFBUSxHQUFHLEVBQUUsRUFDYixVQUFVLEdBQUcsRUFBRSxFQUNmLE9BQU8sR0FBRyxFQUFFLEVBQ1osU0FBUyxHQUFHLEVBQUUsRUFDZCxRQUFRLEdBQUcsRUFBRSxFQUNiLGVBQWUsR0FBRyxFQUFFLEVBQ3BCLE1BQU0sR0FBRyxFQUFFLE1BV1YsRUFBRTtRQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLG1CQUFtQixlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQTtRQUNsRSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN4QixDQUFDO0lBRUQsS0FBSztRQUNELE9BQU8sSUFBSSxlQUFlLENBQUM7WUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksT0FBTztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsUUFBUSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzlCLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDNUIsU0FBUyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hDLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN4QyxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdkMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELElBQUksSUFBSTtRQUNKLE9BQU8sZUFBZSxDQUFDO1lBQ25CLGlCQUFpQjtZQUNqQixhQUFhLElBQUksQ0FBQyxTQUFTLFNBQVM7WUFDcEMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUM1QyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztZQUN6QyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztZQUN2QyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xDLEVBQUU7WUFDRixlQUFlO1lBQ2YsR0FBRyxJQUFJLENBQUMsZUFBZTtZQUN2QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMxQixHQUFHO1NBQ04sQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFlBQVksQ0FBQyxFQUEwQjtRQUNuQyxJQUFJLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNoRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1lBQy9ELENBQUM7WUFFRCxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbEMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksa0NBQWtDLENBQUMsQ0FBQTtZQUN0RixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUE7UUFDakIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxHQUFHLGVBQWU7UUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUN0QjtZQUNJLElBQUksRUFBRSxPQUFPO1lBQ2IsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsTUFBTTtTQUNoQixFQUNELElBQUksQ0FDUCxDQUFBO1FBQ0QsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2YsQ0FBQzs7QUF4R2dCLHVCQUFPLEdBQUcsQ0FBQyxDQUFBIn0=