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