@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
69 lines • 5.96 kB
JavaScript
import { TgdLight } from "./../light/index.js";
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdMaterial } from "./material.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({
uniforms: {
uniLight: "vec3",
uniLightDir: "vec3",
uniAmbient: "vec3",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
uniModelViewMatrix: "mat4",
},
varyings: {
varNormal: "vec3",
},
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;",
],
vertexShaderCode: () => [`varNormal = mat3(uniTransfoMatrix) * ${this.attNormal};`],
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);
},
});
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.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;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZS1vcmllbnRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRlcmlhbC9mYWNlLW9yaWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBMkIsTUFBTSxZQUFZLENBQUE7QUFTakU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLDBCQUEyQixTQUFRLFdBQVc7SUFXdkQsWUFBWSxVQUE2QyxFQUFFO1FBQ3ZELEtBQUssQ0FBQztZQUNGLFFBQVEsRUFBRTtnQkFDTixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixtQkFBbUIsRUFBRSxPQUFPO2dCQUM1QixvQkFBb0IsRUFBRSxPQUFPO2dCQUM3QixrQkFBa0IsRUFBRSxNQUFNO2FBQzdCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxNQUFNO2FBQ3BCO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2hCLGdFQUFnRTtnQkFDaEUsK0NBQStDO2dCQUMvQyxrRkFBa0Y7Z0JBQ2xGLHdEQUF3RDtnQkFDeEQsK0RBQStEO2dCQUMvRCxlQUFlO2dCQUNmLGlCQUFpQjtnQkFDakIsbUNBQW1DO2dCQUNuQyxtQkFBbUI7Z0JBQ25CLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixlQUFlO2FBQ2xCO1lBQ0QsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDO1lBQ25GLFdBQVcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUEyQixFQUFRLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNoRSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN0RSxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ25ELE9BQU8sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQy9ELE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDckUsQ0FBQztTQUNKLENBQUMsQ0FBQTtRQS9DQyxVQUFLLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFDeEIsU0FBUyxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7U0FDbkQsQ0FBQyxDQUFBO1FBQ0ssWUFBTyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RCxxQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDckIsc0JBQWlCLEdBQUcsR0FBRyxDQUFBO1FBRWIsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDMUIsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBeUN6QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDOUIsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQTtRQUNsQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFBO1FBQ3BELENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUE7UUFDdEQsQ0FBQztJQUNMLENBQUM7Q0FDSiJ9