UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

84 lines 7.67 kB
import { TgdVec3, TgdVec4 } from "./../math/index.js"; import { TgdMaterial } from "./material.js"; import { TgdLight } from "./../light/index.js"; import { TgdTexture2D } from "./../texture/index.js"; const DEFAULT_COLOR = new TgdVec4(0.8, 0.6, 0.1, 1); export class TgdMaterialCameraLight extends TgdMaterial { constructor(options = {}) { const vertexShaderCode = ["varNormal = mat3(uniTransfoMatrix) * NORMAL;"]; const uniforms = { uniLight: "vec3", uniLightDir: "vec3", uniAmbient: "vec3", uniSpecularExponent: "float", uniSpecularIntensity: "float", uniModelViewMatrix: "mat4", }; const varyings = { varNormal: "vec3", }; const color = options.color instanceof TgdTexture2D ? options.color : new TgdVec4(options.color ?? DEFAULT_COLOR); const hasTexture = !(color instanceof TgdVec4); if (hasTexture) { vertexShaderCode.push("varUV = TEXCOORD_0;"); varyings.varUV = "vec2"; uniforms.texDiffuse = "sampler2D"; } super({ uniforms, varyings, vertexShaderCode, fragmentShaderCode: [ "vec3 normal = mat3(uniModelViewMatrix) * varNormal;", "float light = 1.0 - dot(normal, uniLightDir);", hasTexture ? "vec4 color = texture(texDiffuse, varUV);" : `vec4 color = vec4(${color.join(", ")});`, "float spec = max(0.0, reflect(uniLightDir, normal).z);", "spec = pow(spec, uniSpecularExponent) * uniSpecularIntensity;", "color = vec4(", " color.rgb * (", " uniAmbient + uniLight * light", " ) + vec3(spec),", " 1.0", ");", "return color;", ], setUniforms: ({ program }) => { 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"); }, delete: () => { if (options.cleanupTexturesOnDelete) { this.texture?.delete(); } }, }); this.light = new TgdLight(); this.ambient = new TgdLight({ color: new TgdVec4(0.2, 0.1, 0, 0) }); this.specularExponent = 32; this.specularIntensity = 0.8; this.lightColor = new TgdVec3(); this.ambientColor = new TgdVec3(); 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; } this.texture = hasTexture ? color : null; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLWxpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hdGVyaWFsL2NhbWVyYS1saWdodC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQWEzQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVuRCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsV0FBVztJQVVuRCxZQUFZLFVBQWtELEVBQUU7UUFDNUQsTUFBTSxnQkFBZ0IsR0FBZ0IsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO1FBQ3RGLE1BQU0sUUFBUSxHQUF5QztZQUNuRCxRQUFRLEVBQUUsTUFBTTtZQUNoQixXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsTUFBTTtZQUNsQixtQkFBbUIsRUFBRSxPQUFPO1lBQzVCLG9CQUFvQixFQUFFLE9BQU87WUFDN0Isa0JBQWtCLEVBQUUsTUFBTTtTQUM3QixDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQTJDO1lBQ3JELFNBQVMsRUFBRSxNQUFNO1NBQ3BCLENBQUE7UUFDRCxNQUFNLEtBQUssR0FDUCxPQUFPLENBQUMsS0FBSyxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsQ0FBQTtRQUN2RyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyxDQUFBO1FBQzlD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