97 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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 );
 |