UNPKG

@polygonjs/polygonjs

Version:

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

51 lines (50 loc) 1.34 kB
"use strict"; export class SceneCookController { constructor() { this._cookingNodesById = /* @__PURE__ */ new Map(); this._nodeIdsHavingCookedAtLeastOnce = /* @__PURE__ */ new Set(); this._nodeIdsCookingMoreThanOnce = /* @__PURE__ */ new Set(); this._resolves = []; } addNode(node) { const id = node.graphNodeId(); this._cookingNodesById.set(id, node); if (!this._nodeIdsHavingCookedAtLeastOnce.has(id)) { this._nodeIdsCookingMoreThanOnce.add(id); } this._nodeIdsHavingCookedAtLeastOnce.add(id); } removeNode(node) { const id = node.graphNodeId(); this._cookingNodesById.delete(id); this._nodeIdsCookingMoreThanOnce.delete(id); if (this._cookingNodesById.size == 0) { this.flush(); } } cookingNodes(target = []) { target.length = 0; this._cookingNodesById.forEach((node, id) => { target.push(node); }); return target; } allNodesHaveCookedAtLeastOnce() { return this._nodeIdsCookingMoreThanOnce.size == 0; } flush() { let callback; while (callback = this._resolves.pop()) { callback(); } } async waitForCooksCompleted() { if (this._cookingNodesById.size == 0) { return; } else { return new Promise((resolve, reject) => { this._resolves.push(resolve); }); } } }