UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

127 lines 12 kB
import { TgdColor } from "./../color/index.js"; import { tgdLoadImage } from "./../loader/index.js"; import { tgdCanvasCreateFill } from "./../utils/index.js"; export class TgdTextureCube { static lazyLoad(context, { size, initialColor, name, posX, posY, posZ, negX, negY, negZ, }) { const color = new TgdColor(initialColor ?? "#888").toString(); const canvas = tgdCanvasCreateFill(size, size, color); const texture = new TgdTextureCube(context, { name, imagePosX: canvas, imagePosY: canvas, imagePosZ: canvas, imageNegX: canvas, imageNegY: canvas, imageNegZ: canvas, }); for (const [target, url] of [ ["posX", posX], ["posY", posY], ["posZ", posZ], ["negX", negX], ["negY", negY], ["negZ", negZ], ]) { tgdLoadImage(url).then((image) => { if (!image) { context.console.error(`Unable to lazy load image for target "${target}" in texture "${texture.name}": ${url}`); return; } if (image.width !== image.height || image.width !== size) { context.console.error(`Unable to lazy load image for target "${target}" in texture "${texture.name}": we were expecting a size of ${size}×${size}, but we got ${image.width}×${image.height}!`); return; } texture.loadImage(TARGETS[target], image); context.paint(); }); } return texture; } constructor(context, options) { this.context = context; this._width = 0; this._height = 0; const { gl } = context; const texture = gl.createTexture(); if (!texture) throw new Error("Unable to create a WebGLTexture!"); this.name = options.name ?? `TgdTextureCube/${TgdTextureCube.ID++}`; this.texture = texture; const flipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL); this.loadImage(gl.TEXTURE_CUBE_MAP_POSITIVE_X, options.imagePosX); this.loadImage(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, options.imageNegX); this.loadImage(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, options.imagePosY); this.loadImage(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, options.imageNegY); this.loadImage(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, options.imagePosZ); this.loadImage(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, options.imageNegZ); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY); gl.generateMipmap(gl.TEXTURE_CUBE_MAP); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); } delete() { this.context.gl.deleteTexture(this.texture); } get width() { return this._width; } get height() { return this._height; } bind() { const { gl } = this.context; gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.texture); } unbind() { const { gl } = this.context; gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); } activate(unit, program, uniformName) { const { gl } = this.context; gl.activeTexture(gl.TEXTURE0 + unit); this.bind(); program.uniform1i(uniformName, unit); } loadImage(target, image) { if (typeof target === "string") { target = TARGETS[target]; } const { width, height } = image; if (width !== height) { throw new Error(`Images in a CubeMap must be squares, but we got ${width}×${height}!`); } if (this._width === 0) { this._width = width; this._height = height; } else if (this._width !== width || this._height !== height) { throw new Error(`Images in a CubeMap must all have the same size, but we got ${this._width}×${this._height} and ${width}×${height}!`); } const { context } = this; const { gl } = context; this.bind(); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, image instanceof Image); try { gl.texImage2D(target, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); context.checkError(`[TgdTextureCube.loadImage] ${this.name}`, () => { context.console.log("image =", image); }); gl.generateMipmap(gl.TEXTURE_CUBE_MAP); context.paint(); } catch (error) { context.console.error(error); context.console.log("image =", image); context.console.log("target =", context.lookupWebglConstant(target)); } } } TgdTextureCube.ID = 1; const TARGETS = { posX: WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X, posY: WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y, posZ: WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z, negX: WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X, negY: WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y, negZ: WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZS1jdWJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RleHR1cmUvdGV4dHVyZS1jdWJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUkxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFaEQsTUFBTSxPQUFPLGNBQWM7SUFDaEIsTUFBTSxDQUFDLFFBQVEsQ0FDbEIsT0FBbUIsRUFDbkIsRUFDSSxJQUFJLEVBQ0osWUFBWSxFQUNaLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksR0FXUDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUM3RCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUN4QyxJQUFJO1lBQ0osU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE1BQU07U0FDcEIsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ3hCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUNkLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUNkLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUNkLENBQUMsTUFBTSxFQUFF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