UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

105 lines (86 loc) 2.32 kB
import { WebGLRenderTarget } from "three"; import Vector2 from "../../../../core/geom/Vector2.js"; export class FrameBuffer { /** * is expected to be bound during initialization * @type {WebGLRenderTarget} */ renderTarget = null; /** * Number of users of the frame buffer * @type {number} */ referenceCount = 0; /** * Dependency frame buffers * @type {string[]} */ dependencies = []; /** * Size of the frame buffer in pixels * @type {Vector2} */ size = new Vector2(0, 0); /** * * @param {string} id * @constructor */ constructor(id) { /** * * @type {string} */ this.id = id; } /** * * @returns {WebGLRenderTarget|WebGLMultisampleRenderTarget} */ getRenderTarget() { return this.renderTarget; } /** * Gets called once before frame buffer is used for the first time * @param {WebGLRenderer} renderer */ initialize(renderer) { //override this method as needed } /** * Gets called after frame buffer is no longer needed. Frame buffer becomes unusable afterwards * @param {WebGLRenderer} renderer */ finalize(renderer) { //override this method as needed } /** * This method is used to populate FrameBuffer with data. Typically this is done every frame. * @param {WebGLRenderer} renderer * @param {Camera} camera * @param {Scene} scene * @param {FrameBuffer[]} dependencies */ render(renderer, camera, scene, dependencies) { const _renderTarget = renderer.getRenderTarget(); renderer.setRenderTarget(this.renderTarget); renderer.clear(); renderer.render(scene, camera); // restore state renderer.setRenderTarget(_renderTarget); } /** * * @param {number} x width * @param {number} y height */ setSize(x, y) { const size = this.size; if (x === size.x && y === size.y) { // nothing changed return; } this.renderTarget.setSize(x, y); size.set(x, y); } }