Cesium-Examples/three/examples/jsm/nodes/core/StackNode.js

100 lines
1.7 KiB
JavaScript
Raw Normal View History

2025-03-11 08:25:45 +00:00
import Node, { addNodeClass } from './Node.js';
import { assign } from '../math/OperatorNode.js';
import { bypass } from '../core/BypassNode.js';
import { expression } from '../code/ExpressionNode.js';
import { cond } from '../math/CondNode.js';
import { loop } from '../utils/LoopNode.js';
import { nodeProxy, shader } from '../shadernode/ShaderNode.js';
class StackNode extends Node {
constructor( parent = null ) {
super();
this.nodes = [];
this.outputNode = null;
this.parent = parent;
this._currentCond = null;
this.isStackNode = true;
}
getNodeType( builder ) {
return this.outputNode ? this.outputNode.getNodeType( builder ) : 'void';
}
add( node ) {
this.nodes.push( bypass( expression(), node ) );
return this;
}
if( boolNode, method ) {
const methodNode = shader( method );
this._currentCond = cond( boolNode, methodNode );
return this.add( this._currentCond );
}
elseif( boolNode, method ) {
const methodNode = shader( method );
const ifNode = cond( boolNode, methodNode );
this._currentCond.elseNode = ifNode;
this._currentCond = ifNode;
return this;
}
else( method ) {
this._currentCond.elseNode = shader( method );
return this;
}
assign( targetNode, sourceValue ) {
return this.add( assign( targetNode, sourceValue ) );
}
loop( ...params ) {
return this.add( loop( ...params ) );
}
build( builder, ...params ) {
for ( const node of this.nodes ) {
node.build( builder, 'void' );
}
return this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params );
}
}
export default StackNode;
export const stack = nodeProxy( StackNode );
addNodeClass( StackNode );