polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
60 lines (59 loc) • 1.9 kB
JavaScript
export class DependenciesController {
constructor(param) {
this.param = param;
this.cyclic_graph_detected = false;
this.method_dependencies = [];
}
set_error(message) {
this.error_message = this.error_message || message;
}
reset() {
this.param.graphDisconnectPredecessors();
this.method_dependencies.forEach((method_dependency) => {
method_dependency.reset();
});
this.method_dependencies = [];
}
update(function_generator) {
this.cyclic_graph_detected = false;
this.connect_immutable_dependencies(function_generator);
this.method_dependencies = function_generator.method_dependencies;
this.handle_method_dependencies();
this.listen_for_name_changes();
}
connect_immutable_dependencies(function_generator) {
function_generator.immutable_dependencies.forEach((dependency) => {
if (this.cyclic_graph_detected == false) {
if (this.param.addGraphInput(dependency) == false) {
this.cyclic_graph_detected = true;
this.set_error("cannot create expression, infinite graph detected");
this.reset();
return;
}
}
});
}
handle_method_dependencies() {
this.method_dependencies.forEach((method_dependency) => {
if (this.cyclic_graph_detected == false) {
this.handle_method_dependency(method_dependency);
}
});
}
handle_method_dependency(method_dependency) {
const node_simple = method_dependency.resolved_graph_node;
if (node_simple) {
if (!this.param.addGraphInput(node_simple)) {
this.cyclic_graph_detected = true;
this.set_error("cannot create expression, infinite graph detected");
this.reset();
return;
}
}
}
listen_for_name_changes() {
this.method_dependencies.forEach((method_dependency) => {
method_dependency.listen_for_name_changes();
});
}
}