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 );
							 |