cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
156 lines (155 loc) • 4.79 kB
JavaScript
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 };