@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
120 lines • 12.3 kB
JavaScript
import { TgdPainter } from "../painter.js";
import { TgdDataset } from "./../../dataset/dataset.js";
import { TgdVertexArray } from "./../../vao/index.js";
import { TgdProgram } from "./../../program/index.js";
import { webglLookup, webglPresetBlend, webglPresetCull, webglPresetDepth, } from "./../../utils/index.js";
import VERT from "./background.vert";
import FRAG from "./background.frag";
import { TgdPainterState } from "../state/index.js";
import { TgdPainterClear } from "../clear.js";
export class TgdPainterBackgroundWithDepth extends TgdPainter {
constructor(context, { background, children }) {
super();
this.context = context;
this.depthTexture = null;
const { gl } = context;
const fb = gl.createFramebuffer();
if (!fb)
throw new Error("Unable to create a WebGL2 Frame buffer!");
this.framebuffer = fb;
this.clear = new TgdPainterClear(context, {
depth: 1,
});
this.texture = background;
this.program = new TgdProgram(context.gl, {
vert: VERT,
frag: FRAG,
});
const dataset = new TgdDataset({
attPoint: "vec2",
attUV: "vec2",
});
dataset.set("attPoint", new Float32Array([-1, +1, +1, +1, -1, -1, +1, -1]));
dataset.set("attUV", new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]));
this.vao = new TgdVertexArray(context.gl, this.program, [dataset]);
this.renderer = new TgdPainterState(context, {
children,
depth: webglPresetDepth.less,
cull: webglPresetCull.back,
blend: webglPresetBlend.off,
color: false,
});
}
delete() {
const { context, vao, framebuffer, depthTexture } = this;
const { gl } = context;
gl.deleteFramebuffer(framebuffer);
if (depthTexture)
gl.deleteTexture(depthTexture);
vao.delete();
}
paint(time, delay) {
const { context, vao, program, texture, depthTexture } = this;
const { gl } = context;
this.paintDepthBuffer(time, delay);
program.use();
const scale = this.getScale();
program.uniform1f("uniScale", scale);
texture.activate(0, program, "uniTexture");
if (depthTexture) {
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, depthTexture);
program.uniform1i("uniDepth", 1);
}
vao.bind();
TgdPainterState.do({
gl,
cull: webglPresetCull.off,
depth: webglPresetDepth.writeOnly,
}, () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));
vao.unbind();
}
paintDepthBuffer(time, delay) {
const { context, framebuffer, clear, renderer, texture } = this;
const { gl } = context;
const { drawingBufferWidth: width, drawingBufferHeight: height } = gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.viewport(0, 0, width, height);
if (this.depthTexture)
gl.deleteTexture(this.depthTexture);
const depthTexture = gl.createTexture();
if (!depthTexture)
throw new Error("Unable to create a WebGL2 Texture!");
this.depthTexture = depthTexture;
gl.bindTexture(gl.TEXTURE_2D, depthTexture);
const level = 0;
const internalFormat = gl.DEPTH_COMPONENT24;
const border = 0;
const format = gl.DEPTH_COMPONENT;
const type = gl.UNSIGNED_INT;
const data = null;
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, format, type, data);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
const wrapS = ensureNumber(texture.getParameter("TEXTURE_WRAP_S"), gl.CLAMP_TO_EDGE);
const wrapT = ensureNumber(texture.getParameter("TEXTURE_WRAP_T"), gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, level);
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
if (status !== gl.FRAMEBUFFER_COMPLETE) {
console.error(`Your Framebuffer is incomplete: ${webglLookup(status)}!`);
}
clear.paint();
renderer.paint(time, delay);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
}
getScale() {
const { texture, context } = this;
const { drawingBufferWidth: width, drawingBufferHeight: height } = context.gl;
const ratioTexture = texture.width / texture.height;
const ratioScreen = width / height;
return ratioScreen / ratioTexture;
}
}
function ensureNumber(data, defaultValue) {
if (typeof data === "number")
return data;
return defaultValue;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC13aXRoLWRlcHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvYmFja2dyb3VuZC13aXRoLWRlcHRoL2JhY2tncm91bmQtd2l0aC1kZXB0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBR3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUNILFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGdCQUFnQixHQUNuQixNQUFNLFlBQVksQ0FBQTtBQUVuQixPQUFPLElBQUksTUFBTSxtQkFBbUIsQ0FBQTtBQUNwQyxPQUFPLElBQUksTUFBTSxtQkFBbUIsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFPMUMsTUFBTSxPQUFPLDZCQUE4QixTQUFRLFVBQVU7SUFTekQsWUFDcUIsT0FBdUMsRUFDeEQsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUF3QztRQUU5RCxLQUFLLEVBQUUsQ0FBQTtRQUhVLFlBQU8sR0FBUCxPQUFPLENBQWdDO1FBSHBELGlCQUFZLEdBQXdCLElBQUksQ0FBQTtRQU81QyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ2pDLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1FBRW5FLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxD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