UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

106 lines 8.54 kB
import { TgdMat4, TgdTransfo, TgdVec4 } from "./../../math/index.js"; import { TgdPainter } from "./../painter.js"; import { TgdTextureCube } from "./../../texture/index.js"; import { TgdUniformBufferObject } from "./../../uniform/index.js"; import { ensureArrayNumber4 } from "./../../utils/index.js"; import { TgdPainterProgram } from "../program.js"; export class TgdPainterSkybox extends TgdPainter { constructor(context, options) { super(); this.context = context; this.z = 1; this._zoom = 1; this.matrix = new TgdMat4(); this.tmpMat = new TgdMat4(); this.uniTint = new TgdVec4(1, 1, 1, 1); this.name = "TgdPainterSkybox"; this.zoom = options.zoom ?? 1; this.z = options.z ?? 1; this.transfo = new TgdTransfo(options.transfo); this.camera = options.camera ?? context.camera; const [r, g, b, a] = ensureArrayNumber4(options.tint, [1, 1, 1, 1]); this.uniTint.reset(r, g, b, a); if (options.texture instanceof TgdTextureCube) { this.textureMustBeCleanedup = false; this._texture = options.texture; } else { this.textureMustBeCleanedup = true; this._texture = new TgdTextureCube(context, options.texture); } const uniformBlock = (this.uniformBlock = new TgdUniformBufferObject(context, { uniforms: { uniZ: "float", uniZoom: "float", uniTint: "vec4", uniMatrix: "mat4", uniTransfo: "mat4", }, })); const attPoint = [-1, +1, +1, +1, -1, -1, +1, -1]; const painter = new TgdPainterProgram(context, { drawMode: "TRIANGLE_STRIP", dataset: { attribs: { attPoint: { type: "vec2", data: new Float32Array(attPoint), }, }, }, textures: { uniTexture: this._texture, }, uniforms: { uniformBlock }, varying: { varPoint: "vec4", }, vert: { mainCode: [ "varPoint = vec4(attPoint.xy / uniZoom, 1.0, 1.0);", "gl_Position = vec4(attPoint.xy, uniZ, 1.0);", ], }, frag: { mainCode: [ "vec4 t = uniTransfo * uniMatrix * varPoint;", "FragColor = texture(uniTexture, normalize(t.xyz)) * uniTint;", ], }, }); this.painter = painter; } get zoom() { return this._zoom; } set zoom(zoom) { if (zoom == this._zoom) return; this._zoom = zoom; } delete() { if (this.textureMustBeCleanedup) { this._texture.delete(); } this.painter.delete(); } paint(time, delta) { const { context, z, zoom, uniTint, uniformBlock, painter, camera, matrix, tmpMat } = this; const uniforms = uniformBlock.values; camera.screenWidth = context.width; camera.screenHeight = context.height; matrix.from(camera.matrixProjection); tmpMat.fromMat3(this.transfo.matrix).multiply(camera.matrixModelView); tmpMat.m03 = 0; tmpMat.m13 = 0; tmpMat.m23 = 0; matrix.multiply(tmpMat).invert(); uniforms.uniZ = z; uniforms.uniZoom = zoom; uniforms.uniTint = uniTint; uniforms.uniMatrix = matrix; uniforms.uniTransfo = this.transfo.matrix; painter.paint(time, delta); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2t5Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvc2t5Ym94L3NreWJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBMEIsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBVzlDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxVQUFVO0lBYzVDLFlBQ29CLE9BQW1CLEVBQ25DLE9BQWdDO1FBRWhDLEtBQUssRUFBRSxDQUFBO1FBSFMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQVpoQyxNQUFDLEdBQUcsQ0FBQyxDQUFBO1FBSUosVUFBSyxHQUFHLENBQUMsQ0FBQTtRQUNBLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3RCLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3RCLFlBQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQVM5QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLE9BQU8s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