@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
103 lines • 8.99 kB
JavaScript
import { TgdLight } from "./../light/index.js";
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdTexture2D } from "./../texture/index.js";
import { TgdMaterial } from "./material.js";
const DEFAULT_COLOR = new TgdVec4(0.8, 0.6, 0.1, 1);
export class TgdMaterialDiffuse extends TgdMaterial {
constructor(options = {}) {
const alphaCut = options.alphaCut ?? 0;
const colorOrTexture = options.color instanceof TgdTexture2D
? options.color
: new TgdVec4(options.color ?? DEFAULT_COLOR);
const hasTexture = colorOrTexture instanceof TgdTexture2D;
const uniforms = {
uniAlphaCut: "float",
uniLight: "vec3",
uniLightDir: "vec3",
uniAmbient: "vec3",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
uniModelViewMatrix: "mat4",
};
const fragmentShaderCode = [
hasTexture
? "vec4 color = texture(texDiffuse, varUV);"
: `vec4 color = vec4(${colorOrTexture.join(", ")});`,
"if (color.a < uniAlphaCut) discard;",
`vec3 normal = ${options.lockLightsToCamera ? "mat3(uniModelViewMatrix) * " : ""}normalize(varNormal);`,
"float light = 1.0 - dot(normal, uniLightDir);",
options.lockLightsToCamera
? "light = max(0.0, light - 1.0);"
: "light *= .5;",
`vec3 reflection = ${options.lockLightsToCamera ? "" : "mat3(uniModelViewMatrix) * "}reflect(uniLightDir, normal);`,
"float spec = max(0.0, reflection.z);",
"spec = pow(spec, uniSpecularExponent) * uniSpecularIntensity;",
"color = vec4(",
" color.rgb * (",
" uniAmbient + uniLight * light",
" ) + vec3(spec),",
" 1.0",
");",
"return color;",
];
const varyings = {
varNormal: "vec3",
};
if (hasTexture) {
varyings.varUV = "vec2";
uniforms.texDiffuse = "sampler2D";
}
const vertexShaderCode = () => {
const code = [
`varNormal = mat3(uniTransfoMatrix) * ${this.attNormal};`,
];
if (hasTexture) {
code.push(`varUV = ${this.attUV};`);
}
return code;
};
super({
uniforms,
varyings,
vertexShaderCode,
fragmentShaderCode,
setUniforms: ({ program }) => {
program.uniform1f("uniAlphaCut", this.alphaCut);
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");
},
});
this.light = new TgdLight({
direction: [-0.3, 0.3, -1],
});
this.ambient = new TgdLight({ color: new TgdVec4(0.2, 0.1, 0, 0) });
this.specularExponent = 20;
this.specularIntensity = 1;
this.alphaCut = 0;
this.lightColor = new TgdVec3();
this.ambientColor = new TgdVec3();
this.alphaCut = alphaCut;
this.texture = hasTexture ? colorOrTexture : null;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZnVzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRlcmlhbC9kaWZmdXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQU0zQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBZ0J4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVuRCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsV0FBVztJQWFsRCxZQUFZLFVBQXFDLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFDdEMsTUFBTSxjQUFjLEdBQ25CLE9BQU8sQ0FBQyxLQUFLLFlBQVksWUFBWTtZQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDZixDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFVBQVUsR0FBRyxjQUFjLFlBQVksWUFBWSxDQUFBO1FBQ3pELE1BQU0sUUFBUSxHQUF5QztZQUN0RCxXQUFXLEVBQUUsT0FBTztZQUNwQixRQUFRLEVBQUUsTUFBTTtZQUNoQixXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsTUFBTTtZQUNsQixtQkFBbUIsRUFBRSxPQUFPO1lBQzVCLG9CQUFvQixFQUFFLE9BQU87WUFDN0Isa0JBQWtCLEVBQUUsTUFBTTtTQUMxQixDQUFBO1FBQ0QsTUFBTSxrQkFBa0IsR0FBZ0I7WUFDdkMsVUFBVTtnQkFDVCxDQUFDLENBQUMsMENB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