UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

56 lines 4.43 kB
import { TgdMaterial } from "./material.js"; import { TgdColor } from "./../color/index.js"; const DEFAULT_TINT = [0.8, 0.8, 0.8, 1]; export class TgdMaterialMirror extends TgdMaterial { constructor(options) { const uniforms = { uniTransfoMatrix: "mat4", texSkybox: "samplerCube", uniCameraPosition: "vec3", uniRoughness: "float", uniTint: "vec4", }; const fragmentShaderCode = [ "vec3 N = normalize(varNormal);", "vec3 L = normalize(varPosition.xyz - uniCameraPosition);", "vec3 R = reflect(L, N);", "vec3 color = textureLod(texSkybox, R, uniRoughness * 7.0).rgb;", "return vec4(color, 1) * uniTint;", ]; 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({ uniforms, varyings, extraFragmentShaderFunctions: { dot2: ["float dot2(vec3 v) {", ["return dot(v, v);"], "}"], }, vertexShaderCode, fragmentShaderCode, setUniforms: ({ program, context }) => { this.skybox.activate(0, program, "texSkybox"); program.uniform3fv("uniCameraPosition", context.camera.transfo.actualPosition); const { R, G, B, A } = this.tint; program.uniform4f("uniTint", R, G, B, A); program.uniform1f("uniRoughness", this.roughness); }, }); this.options = options; this.roughness = 0; this.skybox = options.skybox; this.roughness = options.roughness ?? 0; this.tint = new TgdColor(options.tint ?? DEFAULT_TINT); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hdGVyaWFsL21pcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsV0FBVyxFQUEyQixNQUFNLFlBQVksQ0FBQTtBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBUXJDLE1BQU0sWUFBWSxHQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRXJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxXQUFXO0lBSzlDLFlBQTZCLE9BQWlDO1FBQzFELE1BQU0sUUFBUSxHQUF5QztZQUNuRCxnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLGlCQUFpQixFQUFFLE1BQU07WUFDekIsWUFBWSxFQUFFLE9BQU87WUFDckIsT0FBTyxFQUFFLE1BQU07U0FDbEIsQ0FBQTtRQUNELE1BQU0sa0JBQWtCLEdBQWdCO1lBQ3BDLGdDQUFnQztZQUNoQywwREFBMEQ7WUFDMUQseUJBQXlCO1lBQ3pCLGdFQUFnRTtZQUNoRSxrQ0FBa0M7U0FDckMsQ0FBQTtRQUNELE1BQU0sUUFBUSxHQUEyQztZQUNyRCxLQUFLLEVBQUUsTUFBTTtZQUNiLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFdBQVcsRUFBRSxNQUFNO1NBQ3RCLENBQUE7UUFDRCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUMxQixNQUFNLElBQUksR0FBZ0I7Z0JBQ3RCLFdBQVcsSUFBSSxDQUFDLEtBQUssR0FBRztnQkFDeEIsd0NBQXdDLElBQUksQ0FBQyxTQUFTLEdBQUc7Z0JBQ3pELG9DQUFvQyxJQUFJLENBQUMsV0FBVyxHQUFHO2FBQzFELENBQUE7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNmLENBQUMsQ0FBQTtRQUVELEtBQUssQ0FBQztZQUNGLFFBQVE7WUFDUixRQUFRO1lBQ1IsNEJBQTRCLEVBQUU7Z0JBQzFCLElBQUksRUFBRSxDQUFDLHNCQUFzQixFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLENBQUM7YUFDN0Q7WUFDRCxnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBQ2xCLFdBQVcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBc0IsRUFBRSxFQUFFO2dCQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO2dCQUM3QyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUM5RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtnQkFDaEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ3hDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUNyRCxDQUFDO1NBQ0osQ0FBQyxDQUFBO1FBNUN1QixZQUFPLEdBQVAsT0FBTyxDQUEwQjtRQUh2RCxjQUFTLEdBQUcsQ0FBQyxDQUFBO1FBZ0RoQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLENBQUE7SUFDMUQsQ0FBQztDQUNKIn0=