import Base from '../core/Base'; import GraphNode from './CompositorNode'; /** * @constructor clay.compositor.Graph * @extends clay.core.Base */ var Graph = Base.extend(function () { return /** @lends clay.compositor.Graph# */ { /** * @type {Array.} */ nodes: [] }; }, /** @lends clay.compositor.Graph.prototype */ { /** * Mark to update */ dirty: function () { this._dirty = true; }, /** * @param {clay.compositor.CompositorNode} node */ addNode: function (node) { if (this.nodes.indexOf(node) >= 0) { return; } this.nodes.push(node); this._dirty = true; }, /** * @param {clay.compositor.CompositorNode|string} node */ removeNode: function (node) { if (typeof node === 'string') { node = this.getNodeByName(node); } var idx = this.nodes.indexOf(node); if (idx >= 0) { this.nodes.splice(idx, 1); this._dirty = true; } }, /** * @param {string} name * @return {clay.compositor.CompositorNode} */ getNodeByName: function (name) { for (var i = 0; i < this.nodes.length; i++) { if (this.nodes[i].name === name) { return this.nodes[i]; } } }, /** * Update links of graph */ update: function () { for (var i = 0; i < this.nodes.length; i++) { this.nodes[i].clear(); } // Traverse all the nodes and build the graph for (var i = 0; i < this.nodes.length; i++) { var node = this.nodes[i]; if (!node.inputs) { continue; } for (var inputName in node.inputs) { if (!node.inputs[inputName]) { continue; } if (node.pass && !node.pass.material.isUniformEnabled(inputName)) { console.warn('Pin ' + node.name + '.' + inputName + ' not used.'); continue; } var fromPinInfo = node.inputs[inputName]; var fromPin = this.findPin(fromPinInfo); if (fromPin) { node.link(inputName, fromPin.node, fromPin.pin); } else { if (typeof fromPinInfo === 'string') { console.warn('Node ' + fromPinInfo + ' not exist'); } else { console.warn('Pin of ' + fromPinInfo.node + '.' + fromPinInfo.pin + ' not exist'); } } } } }, findPin: function (input) { var node; // Try to take input as a directly a node if (typeof input === 'string' || input instanceof GraphNode) { input = { node: input }; } if (typeof input.node === 'string') { for (var i = 0; i < this.nodes.length; i++) { var tmp = this.nodes[i]; if (tmp.name === input.node) { node = tmp; } } } else { node = input.node; } if (node) { var inputPin = input.pin; if (!inputPin) { // Use first pin defaultly if (node.outputs) { inputPin = Object.keys(node.outputs)[0]; } } if (node.outputs[inputPin]) { return { node: node, pin: inputPin }; } } } }); export default Graph;