UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

108 lines 9.13 kB
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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