UNPKG

polygonjs-engine

Version:

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

132 lines (107 loc) 4.61 kB
import {BaseParamType} from '../params/_Base'; // import {ParsedTree} from './Traverser/ParsedTree' import {FunctionGenerator} from './traversers/FunctionGenerator'; // import {NodeSimple} from '../../core/graph/NodeSimple' // import {MissingReferencesController} from './MissingReferencesController' // import {NamesListener} from './NamesListener' import {MethodDependency} from './MethodDependency'; import jsep from 'jsep'; export interface JsepsByString { [propName: string]: jsep.Expression[]; } export class DependenciesController { error_message: string | undefined; // private references_controller: MissingReferencesController private cyclic_graph_detected: boolean = false; // private jsep_nodes_by_missing_paths: JsepsByString = {} private method_dependencies: MethodDependency[] = []; // private names_listeners: NamesListener[] = [] constructor(public param: BaseParamType) { // this.references_controller = this.param.scene().missing_expression_references_controller } protected set_error(message: string) { this.error_message = this.error_message || message; } reset() { this.param.graphDisconnectPredecessors(); this.method_dependencies.forEach((method_dependency) => { method_dependency.reset(); }); this.method_dependencies = []; // this.jsep_nodes_by_missing_paths = {} // const ref_ids = Object.keys(this.missing_expression_references_by_id) // ref_ids.forEach(ref_id=>{ // const ref = this.missing_expression_references_by_id[ref_id] // this.references_controller.unregister(ref) // }) // this.missing_expression_references_by_id = {} // this.names_listeners.forEach(names_listener=>{names_listener.reset()}) } update(function_generator: FunctionGenerator) { // const immutable_dependencies = function_generator.immutable_dependencies // const jsep_dependencies = function_generator.jsep_dependencies // const jsep_nodes_by_missing_paths = function_generator.jsep_nodes_by_missing_paths // if(jsep_dependencies.length > 0){ // console.log("connect_param_to_dependencies", this.param.fullPath()) // } this.cyclic_graph_detected = false; this.connect_immutable_dependencies(function_generator); this.method_dependencies = function_generator.method_dependencies; this.handle_method_dependencies(); // this.connect_missing_paths(function_generator) this.listen_for_name_changes(); } private connect_immutable_dependencies(function_generator: FunctionGenerator) { 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; } } }); } private handle_method_dependencies() { this.method_dependencies.forEach((method_dependency) => { if (this.cyclic_graph_detected == false) { this.handle_method_dependency(method_dependency); } }); } private handle_method_dependency(method_dependency: MethodDependency) { const node_simple = method_dependency.resolved_graph_node; if (node_simple) { // this should update the jsep_node, and run the expression to string parser // when a name in the referenced nodes is updated // const names_listener = new NamesListener(this.param, node_simple, jsep_node) // TODO: test that it is no longer active if expression is updated if (!this.param.addGraphInput(node_simple)) { this.cyclic_graph_detected = true; this.set_error('cannot create expression, infinite graph detected'); this.reset(); return; } } // else { // const jsep_node = method_dependency.jsep_node //} } private listen_for_name_changes() { this.method_dependencies.forEach((method_dependency) => { method_dependency.listen_for_name_changes(); }); } // private connect_missing_paths(function_generator: FunctionGenerator){ // const jsep_nodes_by_missing_paths = function_generator.jsep_nodes_by_missing_paths // const missing_paths = Object.keys(jsep_nodes_by_missing_paths) // missing_paths.forEach((missing_path)=>{ // const fullPath = CoreWalker.make_absolute(this.param.node(), missing_path) // const jsep_nodes = jsep_nodes_by_missing_paths[missing_path] // jsep_nodes.forEach(jsep_node=>{ // const missing_expression_reference = this.references_controller.register(this.param, jsep_node, fullPath) // this.missing_expression_references_by_id[missing_expression_reference.id] = missing_expression_reference // }) // }) // } }