UNPKG

polygonjs-engine

Version:

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

81 lines (70 loc) 3.04 kB
import {TypedSopNode} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {SopOperationContainer, OperationInputsMap} from '../../../core/operations/container/sop'; import {OPERATIONS_COMPOSER_NODE_TYPE} from '../../../core/operations/_Base'; import {BaseOperationContainer} from '../../../core/operations/container/_Base'; import {InputCloneMode} from '../../poly/InputCloneMode'; import {NodeParamsConfig} from '../utils/params/ParamsConfig'; class OperationsComposerSopParamConfig extends NodeParamsConfig {} const ParamsConfig = new OperationsComposerSopParamConfig(); export interface OperationContainerInputConfig { operation_input_index: number; node_input_index: number; } export class OperationsComposerSopNode extends TypedSopNode<OperationsComposerSopParamConfig> { params_config = ParamsConfig; static type() { return OPERATIONS_COMPOSER_NODE_TYPE; } initializeNode() { // the number of inputs will be set from the JsonImporter, when the node is created // since this is when we can know the number of inputs // and creating a large number of max inputs in advance // will result is creating many CoreGraphNodes // this.io.inputs.setCount(0, 2); this.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE); } private _output_operation_container: SopOperationContainer | undefined; private _input_configs_by_operation_container: OperationInputsMap = new WeakMap(); set_output_operation_container(operation_container: SopOperationContainer) { this._output_operation_container = operation_container; } output_operation_container() { return this._output_operation_container; } add_input_config(operation: SopOperationContainer, input_config: OperationContainerInputConfig) { let existing_map = this._input_configs_by_operation_container.get(operation); if (!existing_map) { existing_map = new Map(); this._input_configs_by_operation_container.set(operation, existing_map); } existing_map.set(input_config.operation_input_index, input_config.node_input_index); } private _operation_containers_requiring_resolve: BaseOperationContainer[] | undefined; add_operation_container_with_path_param_resolve_required(operation_container: BaseOperationContainer) { if (!this._operation_containers_requiring_resolve) { this._operation_containers_requiring_resolve = []; } this._operation_containers_requiring_resolve.push(operation_container); } resolve_operation_containers_path_params() { if (!this._operation_containers_requiring_resolve) { return; } for (let operation_container of this._operation_containers_requiring_resolve) { operation_container.resolve_path_params(this); } } async cook(input_contents: CoreGroup[]) { if (this._output_operation_container) { this._output_operation_container.setDirty(); const core_group = await this._output_operation_container.compute( input_contents, this._input_configs_by_operation_container ); if (core_group) { this.setCoreGroup(core_group); } } } }