@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
72 lines (71 loc) • 2.11 kB
JavaScript
"use strict";
import { BaseOperationContainer } from "./_Base";
export class SopOperationContainer extends BaseOperationContainer {
constructor(operation, name, init_params) {
super(operation, name, init_params);
this.operation = operation;
this.name = name;
this.init_params = init_params;
// TODO: there may a better to overload add_input
this._inputs = [];
this._currentInputIndex = 0;
this._dirty = true;
}
operationType() {
return this.operation.type();
}
addInput(input) {
super.setInput(this._currentInputIndex, input);
this.incrementInputIndex();
}
incrementInputIndex() {
this._currentInputIndex++;
}
currentInputIndex() {
return this._currentInputIndex;
}
setDirty() {
if (this._dirty) {
return;
}
this._computeResult = void 0;
for (let i = 0; i < this._inputs.length; i++) {
const inputOperation = this._inputs[i];
inputOperation.setDirty();
}
}
async compute(input_contents, operation_inputs_map) {
if (this._computeResult) {
return this._computeResult;
}
const operationInputContents = [];
const nodeInputsMap = operation_inputs_map.get(this);
if (nodeInputsMap) {
nodeInputsMap.forEach((node_input_index, operation_input_index) => {
operationInputContents[operation_input_index] = input_contents[node_input_index];
});
}
for (let i = 0; i < this._inputs.length; i++) {
const inputOperation = this._inputs[i];
let result2 = await inputOperation.compute(input_contents, operation_inputs_map);
if (result2) {
if (this.inputCloneRequired(i)) {
result2 = result2.clone();
}
operationInputContents[i] = result2;
}
}
const result = this.operation.cook(operationInputContents, this.params);
if (result) {
if (result instanceof Promise) {
this._computeResult = await result;
} else {
this._computeResult = result;
}
} else {
this._computeResult = void 0;
}
this._dirty = false;
return this._computeResult;
}
}