@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
127 lines • 12 kB
JavaScript
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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