@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
108 lines • 9.13 kB
JavaScript
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdTexture2D, TgdTextureCube } from "./../texture/index.js";
import { tgdCanvasCreateFill } from "./../utils/index.js";
import { TgdMaterial } from "./material.js";
const DEFAULT_COLOR = new TgdVec4(0.8, 0.6, 0.1, 1);
const DEFAULT_AMBIENT = new TgdVec3(0.8, 0.8, 0.8);
export class TgdMaterialGlobal extends TgdMaterial {
constructor(options = {}) {
const uniforms = {
uniTransfoMatrix: "mat4",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
texColor: "sampler2D",
texAmbient: "samplerCube",
uniCameraPosition: "vec3",
};
const fragmentShaderCode = [
"vec3 N = normalize(varNormal);",
"vec3 L = normalize(varPosition.xyz - uniCameraPosition);",
"vec3 R = reflect(L, N);",
"vec3 color = texture(texAmbient, R).rgb;",
"color = pow(color, vec3(uniSpecularExponent));",
"color *= uniSpecularIntensity;",
"return vec4(color, 1) * texture(texColor, varUV);",
];
const varyings = {
varUV: "vec2",
varNormal: "vec3",
varPosition: "vec4",
};
const vertexShaderCode = () => {
const code = [
`varUV = ${this.attUV};`,
`varNormal = mat3(uniTransfoMatrix) * ${this.attNormal};`,
`varPosition = uniTransfoMatrix * ${this.attPosition};`,
];
return code;
};
super({
delete: () => {
if (this.mustDeleteTextureAmbient)
this.textureAmbient?.delete();
if (this.mustDeleteTextureColor)
this.textureColor?.delete();
},
uniforms,
varyings,
vertexShaderCode,
fragmentShaderCode,
setUniforms: ({ program, context }) => {
if (!this.textureColor) {
// Lazy creation of a texture from an unique color.
this.textureColor = new TgdTexture2D(context);
const color = this.options.color ?? DEFAULT_COLOR;
if (!(color instanceof TgdTexture2D)) {
this.textureColor.loadBitmap(tgdCanvasCreateFill(1, 1, color));
}
this.mustDeleteTextureColor = true;
}
if (!this.textureAmbient) {
// Lazy creation of a texture from an unique color.
const color = this.options.ambientColor ?? DEFAULT_AMBIENT;
const canvas = tgdCanvasCreateFill(1, 1, color instanceof TgdTextureCube ? DEFAULT_AMBIENT : color);
this.textureAmbient = new TgdTextureCube(context, {
imagePosX: canvas,
imagePosY: canvas,
imagePosZ: canvas,
imageNegX: canvas,
imageNegY: canvas,
imageNegZ: canvas,
});
this.mustDeleteTextureAmbient = true;
}
this.textureColor.activate(0, program, "texColor");
this.textureAmbient.activate(1, program, "texAmbient");
program.uniform3fv("uniCameraPosition", context.camera.transfo.actualPosition);
program.uniform1f("uniSpecularExponent", this.specularExponent);
program.uniform1f("uniSpecularIntensity", this.specularIntensity);
},
});
this.options = options;
this.specularExponent = 2.2;
this.specularIntensity = 2;
this.textureColor = null;
this.mustDeleteTextureColor = false;
this.textureAmbient = null;
this.mustDeleteTextureAmbient = false;
// 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;
}
if (options.color instanceof TgdTexture2D) {
this.textureColor = options.color;
}
if (options.ambientColor instanceof TgdTextureCube) {
this.textureAmbient = options.ambientColor;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hdGVyaWFsL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUUzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBMkIsTUFBTSxZQUFZLENBQUE7QUFZakUsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDbkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUVsRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsV0FBVztJQVM5QyxZQUE2QixVQUFvQyxFQUFFO1FBQy9ELE1BQU0sUUFBUSxHQUF5QztZQUNuRCxnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLG1CQUFtQixFQUFFLE9BQU87WUFDNUIsb0JBQW9CLEVBQUUsT0FBTztZQUM3QixRQUFRLEVBQUUsV0FBVztZQUNyQixVQUFVLEVBQUUsYUFBYTtZQUN6QixpQkFBaUIsRUFBRSxNQUFNO1NBQzVCLENBQUE7UUFDRCxNQUFNLGtCQUFrQixHQUFnQjtZQUNwQyxnQ0FBZ0M7WUFDaEMsMERBQTBEO1lBQzFELHlCQUF5QjtZQUN6QiwwQ0FBMEM7WUFDMUMsZ0RBQWdEO1lBQ2hELGdDQUFnQztZQUNoQyxtREFBbUQ7U0FDdEQsQ0FBQTtRQUNELE1BQU0sUUFBUSxHQUEyQztZQUNyRCxLQUFLLEVBQUUsTUFBTTtZQUNiLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFdBQVcsRUFBRSxNQUFNO1NBQ3RCLENBQUE7UUFDRCxN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