62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { addNodeClass } from '../core/Node.js';
 | 
						|
import TempNode from '../core/TempNode.js';
 | 
						|
 | 
						|
class JoinNode extends TempNode {
 | 
						|
 | 
						|
	constructor( nodes = [], nodeType = null ) {
 | 
						|
 | 
						|
		super( nodeType );
 | 
						|
 | 
						|
		this.nodes = nodes;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	getNodeType( builder ) {
 | 
						|
 | 
						|
		if ( this.nodeType !== null ) {
 | 
						|
 | 
						|
			return builder.getVectorType( this.nodeType );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return builder.getTypeFromLength( this.nodes.reduce( ( count, cur ) => count + builder.getTypeLength( cur.getNodeType( builder ) ), 0 ) );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	generate( builder, output ) {
 | 
						|
 | 
						|
		const type = this.getNodeType( builder );
 | 
						|
		const nodes = this.nodes;
 | 
						|
 | 
						|
		const primitiveType = builder.getComponentType( type );
 | 
						|
 | 
						|
		const snippetValues = [];
 | 
						|
 | 
						|
		for ( const input of nodes ) {
 | 
						|
 | 
						|
			let inputSnippet = input.build( builder );
 | 
						|
 | 
						|
			const inputPrimitiveType = builder.getComponentType( input.getNodeType( builder ) );
 | 
						|
 | 
						|
			if ( inputPrimitiveType !== primitiveType ) {
 | 
						|
 | 
						|
				inputSnippet = builder.format( inputSnippet, inputPrimitiveType, primitiveType );
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			snippetValues.push( inputSnippet );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		const snippet = `${ builder.getType( type ) }( ${ snippetValues.join( ', ' ) } )`;
 | 
						|
 | 
						|
		return builder.format( snippet, type, output );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export default JoinNode;
 | 
						|
 | 
						|
addNodeClass( 'JoinNode', JoinNode );
 |