import TempNode from '../core/TempNode.js'; import { addNodeClass } from '../core/Node.js'; import { addNodeElement, nodeArray, nodeObject, nodeObjects } from '../shadernode/ShaderNode.js'; class FunctionCallNode extends TempNode { constructor( functionNode = null, parameters = {} ) { super(); this.functionNode = functionNode; this.parameters = parameters; } setParameters( parameters ) { this.parameters = parameters; return this; } getParameters() { return this.parameters; } getNodeType( builder ) { return this.functionNode.getNodeType( builder ); } generate( builder ) { const params = []; const functionNode = this.functionNode; const inputs = functionNode.getInputs( builder ); const parameters = this.parameters; if ( Array.isArray( parameters ) ) { for ( let i = 0; i < parameters.length; i ++ ) { const inputNode = inputs[ i ]; const node = parameters[ i ]; params.push( node.build( builder, inputNode.type ) ); } } else { for ( const inputNode of inputs ) { const node = parameters[ inputNode.name ]; if ( node !== undefined ) { params.push( node.build( builder, inputNode.type ) ); } else { throw new Error( `FunctionCallNode: Input '${inputNode.name}' not found in FunctionNode.` ); } } } const functionName = functionNode.build( builder, 'property' ); return `${functionName}( ${params.join( ', ' )} )`; } } export default FunctionCallNode; export const call = ( func, ...params ) => { params = params.length > 1 || ( params[ 0 ] && params[ 0 ].isNode === true ) ? nodeArray( params ) : nodeObjects( params[ 0 ] ); return nodeObject( new FunctionCallNode( nodeObject( func ), params ) ); }; addNodeElement( 'call', call ); addNodeClass( 'FunctionCallNode', FunctionCallNode );