polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
50 lines (49 loc) • 1.54 kB
JavaScript
import {ContainerClassMap} from "../../containers/utils/ContainerMap";
export class TypedContainerController {
constructor(node) {
this.node = node;
this._callbacks = [];
this._callbacks_tmp = [];
const container_class = ContainerClassMap[node.nodeContext()];
this._container = new container_class(this.node);
}
get container() {
return this._container;
}
async requestContainer() {
if (this.node.flags?.bypass?.active()) {
return await this.requestInputContainer(0) || this._container;
}
if (this.node.isDirty()) {
return new Promise((resolve, reject) => {
this._callbacks.push(resolve);
this.node.cookController.cook_main();
});
}
return this._container;
}
async requestInputContainer(input_index) {
const input_node = this.node.io.inputs.input(input_index);
if (input_node) {
return await input_node.requestContainer();
} else {
this.node.states.error.set(`input ${input_index} required`);
this.notify_requesters();
return null;
}
}
notify_requesters(container) {
this._callbacks_tmp = this._callbacks.slice();
this._callbacks.splice(0, this._callbacks.length);
if (!container) {
container = this.node.container_controller.container;
}
let callback;
while (callback = this._callbacks_tmp.pop()) {
callback(container);
}
this.node.scene().cookController.remove_node(this.node);
}
}
export class BaseContainerController extends TypedContainerController {
}