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