@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
62 lines (57 loc) • 1.79 kB
text/typescript
/**
* Fetches the previous frame of a parent solver node.
*
* @remarks
* Can only be created inside a solver SOP.
*
*/
import {NetworkNodeType} from './../../poly/NodeContext';
import {TypedSopNode} from './_Base';
import {NodeParamsConfig} from '../utils/params/ParamsConfig';
import type {SolverSopNode} from './Solver';
// import {CoreGraphNode} from '../../../core/graph/CoreGraphNode';
class SolverPreviousFrameSopParamsConfig extends NodeParamsConfig {}
const ParamsConfig = new SolverPreviousFrameSopParamsConfig();
export class SolverPreviousFrameSopNode extends TypedSopNode<SolverPreviousFrameSopParamsConfig> {
override paramsConfig = ParamsConfig;
static override type() {
return 'solverPreviousFrame';
}
override cook() {
const solverNode = this._solverNode();
if (!solverNode) {
this.states.error.set(`subnet input has no parent`);
this.cookController.endCook();
return;
}
this._createSolverNodeDependencyIfRequired();
const previousFrameCoreGroup = solverNode.previousFrameCoreGroup();
if (previousFrameCoreGroup) {
this.setObjects(previousFrameCoreGroup.allObjects());
} else {
this.setObjects([]);
}
}
private _solverNodeDependencyCreated = false;
private _createSolverNodeDependencyIfRequired() {
if (this._solverNodeDependencyCreated) {
return;
}
const solverNode = this._solverNode();
if (!solverNode) {
return;
}
this.addGraphInput(solverNode.iterationStamp());
this._solverNodeDependencyCreated = true;
}
private _solverNode() {
const solverNode = this.parentController.findParent((parent) => parent.type() == NetworkNodeType.SOLVER) as
| SolverSopNode
| undefined;
if (!solverNode) {
this.states.error.set('parent is not a solver node');
return;
}
return solverNode;
}
}