@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
105 lines (86 loc) • 2.32 kB
JavaScript
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);
}
}