@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
81 lines • 7.22 kB
JavaScript
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdMaterial } from "./material.js";
import { TgdLight } from "./../light/index.js";
import { TgdTexture2D } from "./../texture/index.js";
const DEFAULT_COLOR = new TgdVec4(0.8, 0.6, 0.1, 1);
export class TgdMaterialDiffuse extends TgdMaterial {
constructor(options = {}) {
var _a;
super();
this.light = new TgdLight();
this.ambient = new TgdLight({ color: new TgdVec4(0.2, 0.1, 0, 0) });
this.specularExponent = 20;
this.specularIntensity = 1;
this.uniforms = {
uniLight: "vec3",
uniLightDir: "vec3",
uniAmbient: "vec3",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
uniModelViewMatrix: "mat4",
};
this.lightColor = new TgdVec3();
this.ambientColor = new TgdVec3();
const color = options.color instanceof TgdTexture2D
? options.color
: new TgdVec4((_a = options.color) !== null && _a !== void 0 ? _a : DEFAULT_COLOR);
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;
}
const hasTexture = !(color instanceof TgdVec4);
this.texture = hasTexture ? color : null;
this.fragmentShaderCode = [
"vec3 normal = normalize(varNormal);",
`float light = 1.0 - dot(normal, uniLightDir);`,
hasTexture
? `vec4 color = texture(texDiffuse, varUV);`
: `vec4 color = vec4(${color.join(", ")});`,
`vec3 normal2 = mat3(uniModelViewMatrix) * normal;`,
`float spec = max(0.0, reflect(uniLightDir, normal2).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",
};
if (hasTexture) {
this.vertexShaderCode.push("varUV = TEXCOORD_0;");
this.varyings.varUV = "vec2";
this.uniforms.texDiffuse = "sampler2D";
}
}
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);
const { texture } = this;
if (texture)
texture.activate(0, program, "texDiffuse");
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZnVzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRlcmlhbC9kaWZmdXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBVzNDLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRW5ELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxXQUFXO0lBc0IvQyxZQUFZLFVBQXFDLEVBQUU7O1FBQy9DLEtBQUssRUFBRSxDQUFBO1FBdEJKLFVBQUssR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBQ3RCLFlBQU8sR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDOUQscUJBQWdCLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLHNCQUFpQixHQUFHLENBQUMsQ0FBQTtRQUdaLGFBQVEsR0FBeUM7WUFDN0QsUUFBUSxFQUFFLE1BQU07WUFDaEIsV0FBVyxFQUFFLE1BQU07WUFDbkIsVUFBVSxFQUFFLE1BQU07WUFDbEIsbUJBQW1CLEVBQUUsT0FBTztZQUM1QixvQkFBb0IsRUFBRSxPQUFPO1lBQzdCLGtCQUFrQixFQUFFLE1BQU07U0FDN0IsQ0FBQTtRQUtnQixlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUMxQixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFJekMsTUFBTSxL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