@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
68 lines • 5.71 kB
JavaScript
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdMaterial } from "./material.js";
import { TgdLight } from "./../light/index.js";
/**
* This material is useful to debug meshes.
* The outside faces are blue and the inside one are red.
*/
export class TgdMaterialFaceOrientation extends TgdMaterial {
constructor(options = {}) {
super();
this.light = new TgdLight({
direction: new TgdVec3(0.1, 0.2, -1).normalize(),
});
this.ambient = new TgdLight({ color: new TgdVec4(0.2, 0.1, 0, 0) });
this.specularExponent = 20;
this.specularIntensity = 0.5;
this.uniforms = {
uniLight: "vec3",
uniLightDir: "vec3",
uniAmbient: "vec3",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
uniModelViewMatrix: "mat4",
};
this.lightColor = new TgdVec3();
this.ambientColor = new TgdVec3();
if (options.light) {
this.light = options.light;
}
if (options.ambient) {
this.ambient = options.ambient;
}
if (typeof options.specularExponent === "number") {
this.specularExponent = options.specularExponent;
}
if (typeof options.specularIntensity === "number") {
this.specularIntensity = options.specularIntensity;
}
this.fragmentShaderCode = [
"vec3 normal = mat3(uniModelViewMatrix) * normalize(varNormal);",
`float light = 1.0 - dot(normal, uniLightDir);`,
`vec4 color = vec4(0.8 * (gl_FrontFacing ? vec3(0, .5, 1) : vec3(1, 0, 0)), 1.0);`,
`float spec = max(0.0, reflect(uniLightDir, normal).z);`,
`spec = pow(spec, uniSpecularExponent) * uniSpecularIntensity;`,
`color = vec4(`,
` color.rgb * (`,
` uniAmbient + uniLight * light`,
` ) + vec3(spec),`,
` 1.0`,
`);`,
`return color;`,
];
this.vertexShaderCode = ["varNormal = mat3(uniTransfoMatrix) * normal;"];
this.varyings = {
varNormal: "vec3",
};
}
setUniforms(program) {
program.uniform3fv("uniLightDir", this.light.direction);
this.lightColor.from(this.light.color).scale(this.light.color.w);
program.uniform3fv("uniLight", this.lightColor);
this.ambientColor.from(this.ambient.color).scale(this.ambient.color.w);
program.uniform3fv("uniAmbient", this.ambientColor);
program.uniform1f("uniSpecularExponent", this.specularExponent);
program.uniform1f("uniSpecularIntensity", this.specularIntensity);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZS1vcmllbnRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRlcmlhbC9mYWNlLW9yaWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQVVyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsV0FBVztJQXVCdkQsWUFBWSxVQUE2QyxFQUFFO1FBQ3ZELEtBQUssRUFBRSxDQUFBO1FBdkJKLFVBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQztZQUN4QixTQUFTLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtTQUNuRCxDQUFDLENBQUE7UUFDSyxZQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzlELHFCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUNyQixzQkFBaUIsR0FBRyxHQUFHLENBQUE7UUFHZCxhQUFRLEdBQXlDO1lBQzdELFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFdBQVcsRUFBRSxNQUFNO1lBQ25CLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLG1CQUFtQixFQUFFLE9BQU87WUFDNUIsb0JBQW9CLEVBQUUsT0FBTztZQUM3QixrQkFBa0IsRUFBRSxNQUFNO1NBQzdCLENBQUE7UUFJZ0IsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDMUIsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBSXpDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUM5QixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFBO1FBQ2xDLENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUE7UUFDcEQsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLENBQUMsaUJBQWlCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQTtRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3RCLGdFQUFnRTtZQUNoRSwrQ0FBK0M7WUFDL0Msa0ZBQWtGO1lBQ2xGLHdEQUF3RDtZQUN4RCwrREFBK0Q7WUFDL0QsZUFBZTtZQUNmLGlCQUFpQjtZQUNqQixtQ0FBbUM7WUFDbkMsbUJBQW1CO1lBQ25CLE9BQU87WUFDUCxJQUFJO1lBQ0osZUFBZTtTQUNsQixDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ1osU0FBUyxFQUFFLE1BQU07U0FDcEIsQ0FBQTtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBbUI7UUFDM0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoRSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ25ELE9BQU8sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDL0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0NBQ0oifQ==