import CompositorNode from './CompositorNode'; import glenum from '../core/glenum'; import FrameBuffer from '../FrameBuffer'; /** * @constructor clay.compositor.SceneNode * @extends clay.compositor.CompositorNode */ var SceneNode = CompositorNode.extend( /** @lends clay.compositor.SceneNode# */ { name: 'scene', /** * @type {clay.Scene} */ scene: null, /** * @type {clay.Camera} */ camera: null, /** * @type {boolean} */ autoUpdateScene: true, /** * @type {boolean} */ preZ: false }, function() { this.frameBuffer = new FrameBuffer(); }, { render: function(renderer) { this._rendering = true; var _gl = renderer.gl; this.trigger('beforerender'); var renderInfo; if (!this.outputs) { renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); } else { var frameBuffer = this.frameBuffer; for (var name in this.outputs) { var parameters = this.updateParameter(name, renderer); var outputInfo = this.outputs[name]; var texture = this._compositor.allocateTexture(parameters); this._outputTextures[name] = texture; var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; if (typeof(attachment) == 'string') { attachment = _gl[attachment]; } frameBuffer.attach(texture, attachment); } frameBuffer.bind(renderer); // MRT Support in chrome // https://www.khronos.org/registry/webgl/sdk/tests/conformance/extensions/ext-draw-buffers.html var ext = renderer.getGLExtension('EXT_draw_buffers'); if (ext) { var bufs = []; for (var attachment in this.outputs) { attachment = parseInt(attachment); if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) { bufs.push(attachment); } } ext.drawBuffersEXT(bufs); } // Always clear // PENDING renderer.saveClear(); renderer.clearBit = glenum.DEPTH_BUFFER_BIT | glenum.COLOR_BUFFER_BIT; renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); renderer.restoreClear(); frameBuffer.unbind(renderer); } this.trigger('afterrender', renderInfo); this._rendering = false; this._rendered = true; } }); export default SceneNode;