63 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			63 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import { addNodeClass } from '../core/Node.js'; | ||
|  | import TempNode from '../core/TempNode.js'; | ||
|  | import { vectorComponents } from '../core/constants.js'; | ||
|  | 
 | ||
|  | class SetNode extends TempNode { | ||
|  | 
 | ||
|  | 	constructor( sourceNode, components, targetNode ) { | ||
|  | 
 | ||
|  | 		super(); | ||
|  | 
 | ||
|  | 		this.sourceNode = sourceNode; | ||
|  | 		this.components = components; | ||
|  | 		this.targetNode = targetNode; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	getNodeType( builder ) { | ||
|  | 
 | ||
|  | 		return this.sourceNode.getNodeType( builder ); | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	generate( builder ) { | ||
|  | 
 | ||
|  | 		const { sourceNode, components, targetNode } = this; | ||
|  | 
 | ||
|  | 		const sourceType = this.getNodeType( builder ); | ||
|  | 		const targetType = builder.getTypeFromLength( components.length ); | ||
|  | 
 | ||
|  | 		const targetSnippet = targetNode.build( builder, targetType ); | ||
|  | 		const sourceSnippet = sourceNode.build( builder, sourceType ); | ||
|  | 
 | ||
|  | 		const length = builder.getTypeLength( sourceType ); | ||
|  | 		const snippetValues = []; | ||
|  | 
 | ||
|  | 		for ( let i = 0; i < length; i ++ ) { | ||
|  | 
 | ||
|  | 			const component = vectorComponents[ i ]; | ||
|  | 
 | ||
|  | 			if ( component === components[ 0 ] ) { | ||
|  | 
 | ||
|  | 				snippetValues.push( targetSnippet ); | ||
|  | 
 | ||
|  | 				i += components.length - 1; | ||
|  | 
 | ||
|  | 			} else { | ||
|  | 
 | ||
|  | 				snippetValues.push( sourceSnippet + '.' + component ); | ||
|  | 
 | ||
|  | 			} | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return `${ builder.getType( sourceType ) }( ${ snippetValues.join( ', ' ) } )`; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | export default SetNode; | ||
|  | 
 | ||
|  | addNodeClass( 'SetNode', SetNode ); |