@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
114 lines • 10 kB
JavaScript
import { TgdVec3, TgdVec4 } from "./../math/index.js";
import { TgdTexture2D, TgdTextureCube } from "./../texture/index.js";
import { tgdCanvasCreateFill, webglPresetDepth } 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 TgdMaterialGlass extends TgdMaterial {
constructor(options = {}) {
const uniforms = {
uniTransfoMatrix: "mat4",
uniSpecularExponent: "float",
uniSpecularIntensity: "float",
uniOpacityBase: "float",
uniOpacityFactor: "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, uniOpacityBase + uniOpacityFactor * dot(color, color)) * 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({
state: {
blend: "alpha",
depth: webglPresetDepth.writeOnly,
},
delete: () => {
if (this.mustDeleteTextureAmbient)
this.textureAmbient?.delete();
if (this.mustDeleteTextureColor)
this.textureColor?.delete();
},
uniforms,
varyings,
vertexShaderCode,
fragmentShaderCode,
setUniforms: ({ context, program }) => {
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);
program.uniform1f("uniOpacityBase", this.opacityMin);
program.uniform1f("uniOpacityFactor", this.opacityMax - this.opacityMin);
},
});
this.options = options;
this.specularExponent = 2.2;
this.specularIntensity = 2;
this.opacityMin = 0.1;
this.opacityMax = 0.2;
this.textureColor = null;
this.mustDeleteTextureColor = false;
this.textureAmbient = null;
this.mustDeleteTextureAmbient = false;
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;
}
this.opacityMin = options.opacityMin ?? 0.1;
this.opacityMax = options.opacityMax ?? 0.2;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWF0ZXJpYWwvZ2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUEyQixNQUFNLFlBQVksQ0FBQTtBQWNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNuRCxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBRWxELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxXQUFXO0lBVzdDLFlBQTZCLFVBQW1DLEVBQUU7UUFDOUQsTUFBTSxRQUFRLEdBQXlDO1lBQ25ELGdCQUFnQixFQUFFLE1BQU07WUFDeEIsbUJBQW1CLEVBQUUsT0FBTztZQUM1QixvQkFBb0IsRUFBRSxPQUFPO1lBQzdCLGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLGdCQUFnQixFQUFFLE9BQU87WUFDekIsUUFBUSxFQUFFLFdBQVc7WUFDckIsVUFBVSxFQUFFLGFBQWE7WUFDekIsaUJBQWlCLEVBQUUsTUFBTTtTQUM1QixDQUFBO1FBQ0QsTUFBTSxrQkFBa0IsR0FBZ0I7WUFDcEMsZ0NBQWdDO1lBQ2hDLDBEQUEwRDtZQUMxRCx5QkFBeUI7WUFDekIsMENBQTBDO1lBQzFDLGdEQUFnRDtZQUNoRCxnQ0FBZ0M7WUFDaEMsdUdBQXVHO1NBQzFHLENBQUE7UUFDRCxNQUFNLFFBQVEsR0FBMkM7WUFDckQsS0FBSyxFQUFFLE1BQU07WUFD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