import Graph from './Graph';
import TexturePool from './TexturePool';
import FrameBuffer from '../FrameBuffer';
/**
* Compositor provide graph based post processing
*
* @constructor clay.compositor.Compositor
* @extends clay.compositor.Graph
*
*/
var Compositor = Graph.extend(function() {
return {
// Output node
_outputs: [],
_texturePool: new TexturePool(),
_frameBuffer: new FrameBuffer({
depthBuffer: false
})
};
},
/** @lends clay.compositor.Compositor.prototype */
{
addNode: function(node) {
Graph.prototype.addNode.call(this, node);
node._compositor = this;
},
/**
* @param {clay.Renderer} renderer
*/
render: function(renderer, frameBuffer) {
if (this._dirty) {
this.update();
this._dirty = false;
this._outputs.length = 0;
for (var i = 0; i < this.nodes.length; i++) {
if (!this.nodes[i].outputs) {
this._outputs.push(this.nodes[i]);
}
}
}
for (var i = 0; i < this.nodes.length; i++) {
// Update the reference number of each output texture
this.nodes[i].beforeFrame();
}
for (var i = 0; i < this._outputs.length; i++) {
this._outputs[i].updateReference();
}
for (var i = 0; i < this._outputs.length; i++) {
this._outputs[i].render(renderer, frameBuffer);
}
for (var i = 0; i < this.nodes.length; i++) {
// Clear up
this.nodes[i].afterFrame();
}
},
allocateTexture: function (parameters) {
return this._texturePool.get(parameters);
},
releaseTexture: function (parameters) {
this._texturePool.put(parameters);
},
getFrameBuffer: function () {
return this._frameBuffer;
},
/**
* Dispose compositor
* @param {clay.Renderer} renderer
*/
dispose: function (renderer) {
this._texturePool.clear(renderer);
}
});
export default Compositor;