UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

103 lines 8.99 kB
import { TgdLight } from "./../light/index.js"; import { TgdVec3, TgdVec4 } from "./../math/index.js"; import { TgdTexture2D } from "./../texture/index.js"; import { TgdMaterial } from "./material.js"; const DEFAULT_COLOR = new TgdVec4(0.8, 0.6, 0.1, 1); export class TgdMaterialDiffuse extends TgdMaterial { constructor(options = {}) { const alphaCut = options.alphaCut ?? 0; const colorOrTexture = options.color instanceof TgdTexture2D ? options.color : new TgdVec4(options.color ?? DEFAULT_COLOR); const hasTexture = colorOrTexture instanceof TgdTexture2D; const uniforms = { uniAlphaCut: "float", uniLight: "vec3", uniLightDir: "vec3", uniAmbient: "vec3", uniSpecularExponent: "float", uniSpecularIntensity: "float", uniModelViewMatrix: "mat4", }; const fragmentShaderCode = [ hasTexture ? "vec4 color = texture(texDiffuse, varUV);" : `vec4 color = vec4(${colorOrTexture.join(", ")});`, "if (color.a < uniAlphaCut) discard;", `vec3 normal = ${options.lockLightsToCamera ? "mat3(uniModelViewMatrix) * " : ""}normalize(varNormal);`, "float light = 1.0 - dot(normal, uniLightDir);", options.lockLightsToCamera ? "light = max(0.0, light - 1.0);" : "light *= .5;", `vec3 reflection = ${options.lockLightsToCamera ? "" : "mat3(uniModelViewMatrix) * "}reflect(uniLightDir, normal);`, "float spec = max(0.0, reflection.z);", "spec = pow(spec, uniSpecularExponent) * uniSpecularIntensity;", "color = vec4(", " color.rgb * (", " uniAmbient + uniLight * light", " ) + vec3(spec),", " 1.0", ");", "return color;", ]; const varyings = { varNormal: "vec3", }; if (hasTexture) { varyings.varUV = "vec2"; uniforms.texDiffuse = "sampler2D"; } const vertexShaderCode = () => { const code = [ `varNormal = mat3(uniTransfoMatrix) * ${this.attNormal};`, ]; if (hasTexture) { code.push(`varUV = ${this.attUV};`); } return code; }; super({ uniforms, varyings, vertexShaderCode, fragmentShaderCode, setUniforms: ({ program }) => { program.uniform1f("uniAlphaCut", this.alphaCut); 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"); }, }); this.light = new TgdLight({ direction: [-0.3, 0.3, -1], }); this.ambient = new TgdLight({ color: new TgdVec4(0.2, 0.1, 0, 0) }); this.specularExponent = 20; this.specularIntensity = 1; this.alphaCut = 0; this.lightColor = new TgdVec3(); this.ambientColor = new TgdVec3(); this.alphaCut = alphaCut; this.texture = hasTexture ? colorOrTexture : null; 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; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZnVzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRlcmlhbC9kaWZmdXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQU0zQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBZ0J4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVuRCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsV0FBVztJQWFsRCxZQUFZLFVBQXFDLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFDdEMsTUFBTSxjQUFjLEdBQ25CLE9BQU8sQ0FBQyxLQUFLLFlBQVksWUFBWTtZQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDZixDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFVBQVUsR0FBRyxjQUFjLFlBQVksWUFBWSxDQUFBO1FBQ3pELE1BQU0sUUFBUSxHQUF5QztZQUN0RCxXQUFXLEVBQUUsT0FBTztZQUNwQixRQUFRLEVBQUUsTUFBTTtZQUNoQixXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsTUFBTTtZQUNsQixtQkFBbUIsRUFBRSxPQUFPO1lBQzVCLG9CQUFvQixFQUFFLE9BQU87WUFDN0Isa0JBQWtCLEVBQUUsTUFBTTtTQUMxQixDQUFBO1FBQ0QsTUFBTSxrQkFBa0IsR0FBZ0I7WUFDdkMsVUFBVTtnQkFDVCxDQUFDLENBQUMsMENB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