polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
65 lines (53 loc) • 1.67 kB
text/typescript
// import UIData from './UIData';
import {BaseNodeType} from '../engine/nodes/_Base';
import {NodeEvent} from '../engine/poly/NodeEvent';
import {CoreGraphNodeId} from './graph/CoreGraph';
import {ArrayUtils} from './ArrayUtils';
export class CoreNodeSelection {
_node_ids: CoreGraphNodeId[] = [];
constructor(private _node: BaseNodeType) {
// super();
// this._node_ids = [];
}
node() {
return this._node;
}
nodes(): BaseNodeType[] {
return this._node.scene().graph.nodes_from_ids(this._node_ids) as BaseNodeType[];
}
contains(node: BaseNodeType): boolean {
return this._node_ids.includes(node.graphNodeId());
}
equals(nodes: BaseNodeType[]): boolean {
const node_ids = nodes.map((node) => node.graphNodeId()).sort();
return ArrayUtils.isEqual(node_ids, this._node_ids);
}
clear() {
this._node_ids = [];
this.send_update_event();
}
set(nodes: BaseNodeType[]) {
// this.remove(this.nodes());
this._node_ids = [];
this.add(nodes);
}
add(nodes_to_add: BaseNodeType[]) {
const node_ids_to_add = nodes_to_add.map((node) => node.graphNodeId());
this._node_ids = ArrayUtils.union(this._node_ids, node_ids_to_add);
this.send_update_event();
}
remove(nodes_to_remove: BaseNodeType[]) {
const node_ids_to_remove = nodes_to_remove.map((node) => node.graphNodeId());
this._node_ids = ArrayUtils.difference(this._node_ids, node_ids_to_remove);
this.send_update_event();
}
private send_update_event() {
this._node.emit(NodeEvent.SELECTION_UPDATED);
}
private _json: CoreGraphNodeId[] = [];
toJSON() {
this._json = this._json || [];
this._json = this._node_ids.map((id) => id);
return this._json;
}
}