@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
51 lines (50 loc) • 1.34 kB
JavaScript
;
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);
});
}
}
}