UNPKG

polygonjs-engine

Version:

node-based webgl 3D engine https://polygonjs.com

110 lines (109 loc) 3.43 kB
import {NodeEvent as NodeEvent2} from "../../../poly/NodeEvent"; import {CoreType} from "../../../../core/Type"; import {ArrayUtils as ArrayUtils2} from "../../../../core/ArrayUtils"; export class OutputsController { constructor(node) { this.node = node; this._has_outputs = false; this._has_named_outputs = false; } set_has_one_output() { this._has_outputs = true; } set_has_no_output() { this._has_outputs = false; } get has_outputs() { return this._has_outputs; } get has_named_outputs() { return this._has_named_outputs; } has_named_output(name) { return this.get_named_output_index(name) >= 0; } get named_output_connection_points() { return this._named_output_connection_points || []; } named_output_connection(index) { if (this._named_output_connection_points) { return this._named_output_connection_points[index]; } } get_named_output_index(name) { if (this._named_output_connection_points) { for (let i = 0; i < this._named_output_connection_points.length; i++) { if (this._named_output_connection_points[i]?.name() == name) { return i; } } } return -1; } get_output_index(output_index_or_name) { if (output_index_or_name != null) { if (CoreType.isString(output_index_or_name)) { if (this.has_named_outputs) { return this.get_named_output_index(output_index_or_name); } else { console.warn(`node ${this.node.fullPath()} has no named outputs`); return -1; } } else { return output_index_or_name; } } return -1; } named_output_connection_points_by_name(name) { if (this._named_output_connection_points) { for (let connection_point of this._named_output_connection_points) { if (connection_point?.name() == name) { return connection_point; } } } } setNamedOutputConnectionPoints(connection_points, set_dirty = true) { this._has_named_outputs = true; const connections = this.node.io.connections.output_connections(); if (connections) { for (let connection of connections) { if (connection) { if (connection.output_index >= connection_points.length) { connection.disconnect({setInput: true}); } } } } this._named_output_connection_points = connection_points; if (set_dirty && this.node.scene()) { this.node.setDirty(this.node); } this.node.emit(NodeEvent2.NAMED_OUTPUTS_UPDATED); } used_output_names() { const connections_controller = this.node.io.connections; if (connections_controller) { const output_connections = connections_controller.output_connections(); let output_indices = output_connections.map((connection) => connection ? connection.output_index : null); output_indices = ArrayUtils2.uniq(output_indices); const used_output_indices = []; output_indices.forEach((index) => { if (CoreType.isNumber(index)) { used_output_indices.push(index); } }); const used_output_names = []; for (let index of used_output_indices) { const name = this.named_output_connection_points[index]?.name(); if (name) { used_output_names.push(name); } } return used_output_names; } else { return []; } } }