UNPKG

@polygonjs/polygonjs

Version:

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

59 lines (54 loc) 1.71 kB
import {PolyScene} from '../PolyScene'; import {BaseNodeType} from '../../nodes/_Base'; import {BaseParamType} from '../../params/_Base'; import {CoreGraphNodeId} from '../../../core/graph/CoreGraph'; import {Ref, ref} from '@vue/reactivity'; type GraphNode = BaseNodeType | BaseParamType; export class GraphNodesController { private _graphNodeIdByPath: Map<string, Ref<CoreGraphNodeId | null>> = new Map(); private _pathByGraphNodeId: Map<CoreGraphNodeId, string> = new Map(); constructor(protected scene: PolyScene) {} notifyNodePathChanged(node: BaseNodeType) { this._notifyGraphNodePathChanged(node); const params = node.params.all; for (const param of params) { this.notifyParamPathChanged(param); } node.childrenController?.traverseChildren((child) => { this._notifyGraphNodePathChanged(child); }); } notifyParamPathChanged(param: BaseParamType) { this._notifyGraphNodePathChanged(param); } private _notifyGraphNodePathChanged(node: GraphNode) { const id = node.graphNodeId(); const newPath = node.path(); // set id of previous path to null const previousPath = this._pathByGraphNodeId.get(id); if (previousPath != null) { const _ref = this._graphNodeIdByPath.get(previousPath); if (_ref) { _ref.value = null; } } if (node.disposed()) { return; } // set new path const _ref = this._findOrCreateRef(newPath); _ref.value = id; this._pathByGraphNodeId.set(id, newPath); } pathRef(path: string) { return this._findOrCreateRef(path); } private _findOrCreateRef(path: string) { let _ref = this._graphNodeIdByPath.get(path); if (!_ref) { _ref = ref(null); this._graphNodeIdByPath.set(path, _ref); } return _ref; } }