UNPKG

@polygonjs/polygonjs

Version:

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

78 lines (66 loc) 2.06 kB
import {PolyScene} from '../PolyScene'; import {CoreGraphNodeId} from '../../../core/graph/CoreGraph'; import {CoreGraphNode} from '../../../core/graph/CoreGraphNode'; export class Cooker { constructor(private _scene: PolyScene) {} private _queue: Map<CoreGraphNodeId, CoreGraphNode | undefined> = new Map(); private _nodeIdsInFlushingQueue: Set<CoreGraphNodeId> = new Set(); private _blockLevel: number = 0; // private _processesCount: number = 0; block() { this._blockLevel += 1; } unblock() { this._blockLevel -= 1; if (this._blockLevel > 0) { return; } if (this._blockLevel < 0) { this._blockLevel = 0; } this._processQueue(); } blocked() { return this._blockLevel > 0 || this._scene.loadingController.isLoading(); } enqueue(node: CoreGraphNode, originalTriggerGraphNode?: CoreGraphNode) { if (!node.dirtyController.hasPostDirtyHooks()) { return; } if (this._queue.has(node.graphNodeId()) || this._nodeIdsInFlushingQueue.has(node.graphNodeId())) { return; } this._queue.set(node.graphNodeId(), originalTriggerGraphNode); } private _processQueue() { if (this.blocked()) { return; } if (this._queue.size == 0) { return; } // this.block(); const originalTriggerGraphNodes: Array<CoreGraphNode | undefined> = []; const nodeIds: CoreGraphNodeId[] = []; this._queue.forEach((originalTriggerGraphNode, nodeId) => { originalTriggerGraphNodes.push(originalTriggerGraphNode); nodeIds.push(nodeId); this._nodeIdsInFlushingQueue.add(nodeId); }); this._queue.clear(); let i = 0; for (const originalTriggerGraphNode of originalTriggerGraphNodes) { const nodeId = nodeIds[i]; this._processItem(originalTriggerGraphNode, nodeId); this._nodeIdsInFlushingQueue.delete(nodeId); i++; } // this.unblock(); } private _processItem(originalTriggerGraphNode: CoreGraphNode | undefined, nodeId: CoreGraphNodeId) { const node = this._scene.graph.nodeFromId(nodeId); if (node) { node.dirtyController.runPostDirtyHooks(originalTriggerGraphNode); } } }