UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

114 lines 10 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWF0ZXJpYWwvZ2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUEyQixNQUFNLFlBQVksQ0FBQTtBQWNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNuRCxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBRWxELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxXQUFXO0lBVzdDLFlBQTZCLFVBQW1DLEVBQUU7UUFDOUQsTUFBTSxRQUFRLEdBQXlDO1lBQ25ELGdCQUFnQixFQUFFLE1BQU07WUFDeEIsbUJBQW1CLEVBQUUsT0FBTztZQUM1QixvQkFBb0IsRUFBRSxPQUFPO1lBQzdCLGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLGdCQUFnQixFQUFFLE9BQU87WUFDekIsUUFBUSxFQUFFLFdBQVc7WUFDckIsVUFBVSxFQUFFLGFBQWE7WUFDekIsaUJBQWlCLEVBQUUsTUFBTTtTQUM1QixDQUFBO1FBQ0QsTUFBTSxrQkFBa0IsR0FBZ0I7WUFDcEMsZ0NBQWdDO1lBQ2hDLDBEQUEwRDtZQUMxRCx5QkFBeUI7WUFDekIsMENBQTBDO1lBQzFDLGdEQUFnRDtZQUNoRCxnQ0FBZ0M7WUFDaEMsdUdBQXVHO1NBQzFHLENBQUE7UUFDRCxNQUFNLFFBQVEsR0FBMkM7WUFDckQsS0FBSyxFQUFFLE1BQU07WUFDYixTQUFTLEVBQUUsTUFBTTtZQUNqQixXQUFXLEVBQUUsTUFBTTtTQUN0QixDQUFBO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEdBQWdCO2dCQUN0QixXQUFXLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ3hCLHdDQUF3QyxJQUFJLENBQUMsU0FBUyxHQUFHO2dCQUN6RCxvQ0FBb0MsSUFBSSxDQUFDLFdBQVcsR0FBRzthQUMxRCxDQUFBO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDZixDQUFDLENBQUE7UUFFRCxLQUFLLENBQUM7WUFDRixLQUFLLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFNBQVM7YUFDcEM7WUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNULElBQUksSUFBSSxDQUFDLHdCQUF3QjtvQkFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFBO2dCQUNoRSxJQUFJLElBQUksQ0FBQyxzQkFBc0I7b0JBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQTtZQUNoRSxDQUFDO1lBQ0QsUUFBUTtZQUNSLFFBQVE7WUFDUixnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBQ2xCLFdBQVcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBc0IsRUFBRSxFQUFFO2dCQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNyQixtREFBbUQ7b0JBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQTtvQkFDakQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFlBQVksQ0FBQyxFQUFFLENBQUM7d0JBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtvQkFDbEUsQ0FBQztvQkFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFBO2dCQUN0QyxDQUFDO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLG1EQUFtRDtvQkFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFBO29CQUMxRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssWUFBWSxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ25HLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFO3dCQUM5QyxTQUFTLEVBQUUsTUFBTTt3QkFDakIsU0FBUyxFQUFFLE1BQU07d0JBQ2pCLFNBQVMsRUFBRSxNQUFNO3dCQUNqQixTQUFTLEVBQUUsTUFBTTt3QkFDakIsU0FBUyxFQUFFLE1BQU07d0JBQ2pCLFNBQVMsRUFBRSxNQUFNO3FCQUNwQixDQUFDLENBQUE7b0JBQ0YsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQTtnQkFDeEMsQ0FBQztnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUN0RCxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUM5RSxPQUFPLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUMvRCxPQUFPLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUNqRSxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDcEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1RSxDQUFDO1NBQ0osQ0FBQyxDQUFBO1FBL0V1QixZQUFPLEdBQVAsT0FBTyxDQUE4QjtRQVYzRCxxQkFBZ0IsR0FBRyxHQUFHLENBQUE7UUFDdEIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFBO1FBQ3JCLGVBQVUsR0FBRyxHQUFHLENBQUE7UUFDaEIsZUFBVSxHQUFHLEdBQUcsQ0FBQTtRQUVmLGlCQUFZLEdBQXdCLElBQUksQ0FBQTtRQUN4QywyQkFBc0IsR0FBRyxLQUFLLENBQUE7UUFDOUIsbUJBQWMsR0FBMEIsSUFBSSxDQUFBO1FBQzVDLDZCQUF3QixHQUFHLEtBQUssQ0FBQTtRQW1GcEMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFBO1FBQ3BELENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUE7UUFDdEQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEtBQUssWUFBWSxZQUFZLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDckMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFlBQVksWUFBWSxjQUFjLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUE7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUE7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQTtJQUMvQyxDQUFDO0NBQ0oifQ==