UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

156 lines (155 loc) 4.79 kB
import Base from "../core/Base.mjs"; var CompositorNode = Base.extend( function() { return { name: "", inputLinks: {}, outputLinks: {}, _prevOutputTextures: {}, _outputTextures: {}, _outputReferences: {}, _rendering: false, _rendered: false, _compositor: null }; }, { updateParameter: function(outputName, renderer) { var outputInfo = this.outputs[outputName]; var parameters = outputInfo.parameters; var parametersCopy = outputInfo._parametersCopy; if (!parametersCopy) { parametersCopy = outputInfo._parametersCopy = {}; } if (parameters) { for (var key in parameters) { if (key !== "width" && key !== "height") { parametersCopy[key] = parameters[key]; } } } var width, height; if (parameters.width instanceof Function) { width = parameters.width.call(this, renderer); } else { width = parameters.width; } if (parameters.height instanceof Function) { height = parameters.height.call(this, renderer); } else { height = parameters.height; } if (parametersCopy.width !== width || parametersCopy.height !== height) { if (this._outputTextures[outputName]) { this._outputTextures[outputName].dispose(renderer.gl); } } parametersCopy.width = width; parametersCopy.height = height; return parametersCopy; }, setParameter: function(name, value) { }, getParameter: function(name) { }, setParameters: function(obj) { for (var name in obj) { this.setParameter(name, obj[name]); } }, render: function() { }, getOutput: function(renderer, name) { if (name == null) { name = renderer; return this._outputTextures[name]; } var outputInfo = this.outputs[name]; if (!outputInfo) { return; } if (this._rendered) { if (outputInfo.outputLastFrame) { return this._prevOutputTextures[name]; } else { return this._outputTextures[name]; } } else if (this._rendering) { if (!this._prevOutputTextures[name]) { this._prevOutputTextures[name] = this._compositor.allocateTexture(outputInfo.parameters || {}); } return this._prevOutputTextures[name]; } this.render(renderer); return this._outputTextures[name]; }, removeReference: function(outputName) { this._outputReferences[outputName]--; if (this._outputReferences[outputName] === 0) { var outputInfo = this.outputs[outputName]; if (outputInfo.keepLastFrame) { if (this._prevOutputTextures[outputName]) { this._compositor.releaseTexture(this._prevOutputTextures[outputName]); } this._prevOutputTextures[outputName] = this._outputTextures[outputName]; } else { this._compositor.releaseTexture(this._outputTextures[outputName]); } } }, link: function(inputPinName, fromNode, fromPinName) { this.inputLinks[inputPinName] = { node: fromNode, pin: fromPinName }; if (!fromNode.outputLinks[fromPinName]) { fromNode.outputLinks[fromPinName] = []; } fromNode.outputLinks[fromPinName].push({ node: this, pin: inputPinName }); this.pass.material.enableTexture(inputPinName); }, clear: function() { this.inputLinks = {}; this.outputLinks = {}; }, updateReference: function(outputName) { if (!this._rendering) { this._rendering = true; for (var inputName in this.inputLinks) { var link = this.inputLinks[inputName]; link.node.updateReference(link.pin); } this._rendering = false; } if (outputName) { this._outputReferences[outputName]++; } }, beforeFrame: function() { this._rendered = false; for (var name in this.outputLinks) { this._outputReferences[name] = 0; } }, afterFrame: function() { for (var name in this.outputLinks) { if (this._outputReferences[name] > 0) { var outputInfo = this.outputs[name]; if (outputInfo.keepLastFrame) { if (this._prevOutputTextures[name]) { this._compositor.releaseTexture(this._prevOutputTextures[name]); } this._prevOutputTextures[name] = this._outputTextures[name]; } else { this._compositor.releaseTexture(this._outputTextures[name]); } } } } } ); var CompositorNode$1 = CompositorNode; export { CompositorNode$1 as default };