105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import Node, { addNodeClass } from '../core/Node.js';
 | 
						|
import { getValueType } from '../core/NodeUtils.js';
 | 
						|
import { buffer } from '../accessors/BufferNode.js';
 | 
						|
//import { bufferAttribute } from '../accessors/BufferAttributeNode.js';
 | 
						|
import { instanceIndex } from '../core/IndexNode.js';
 | 
						|
import { nodeProxy, float } from '../shadernode/ShaderNode.js';
 | 
						|
 | 
						|
import { Vector4, MathUtils } from 'three';
 | 
						|
 | 
						|
let min = null;
 | 
						|
let max = null;
 | 
						|
 | 
						|
class RangeNode extends Node {
 | 
						|
 | 
						|
	constructor( minNode = float(), maxNode = float() ) {
 | 
						|
 | 
						|
		super();
 | 
						|
 | 
						|
		this.minNode = minNode;
 | 
						|
		this.maxNode = maxNode;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	getVectorLength( builder ) {
 | 
						|
 | 
						|
		const minLength = builder.getTypeLength( getValueType( this.minNode.value ) );
 | 
						|
		const maxLength = builder.getTypeLength( getValueType( this.maxNode.value ) );
 | 
						|
 | 
						|
		return minLength > maxLength ? minLength : maxLength;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	getNodeType( builder ) {
 | 
						|
 | 
						|
		return builder.object.isInstancedMesh === true ? builder.getTypeFromLength( this.getVectorLength( builder ) ) : 'float';
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	setup( builder ) {
 | 
						|
 | 
						|
		const object = builder.object;
 | 
						|
 | 
						|
		let output = null;
 | 
						|
 | 
						|
		if ( object.isInstancedMesh === true ) {
 | 
						|
 | 
						|
			const minValue = this.minNode.value;
 | 
						|
			const maxValue = this.maxNode.value;
 | 
						|
 | 
						|
			const minLength = builder.getTypeLength( getValueType( minValue ) );
 | 
						|
			const maxLength = builder.getTypeLength( getValueType( maxValue ) );
 | 
						|
 | 
						|
			min = min || new Vector4();
 | 
						|
			max = max || new Vector4();
 | 
						|
 | 
						|
			min.setScalar( 0 );
 | 
						|
			max.setScalar( 0 );
 | 
						|
 | 
						|
			if ( minLength === 1 ) min.setScalar( minValue );
 | 
						|
			else if ( minValue.isColor ) min.set( minValue.r, minValue.g, minValue.b );
 | 
						|
			else min.set( minValue.x, minValue.y, minValue.z || 0, minValue.w || 0 );
 | 
						|
 | 
						|
			if ( maxLength === 1 ) max.setScalar( maxValue );
 | 
						|
			else if ( maxValue.isColor ) max.set( maxValue.r, maxValue.g, maxValue.b );
 | 
						|
			else max.set( maxValue.x, maxValue.y, maxValue.z || 0, maxValue.w || 0 );
 | 
						|
 | 
						|
			const stride = 4;
 | 
						|
 | 
						|
			const length = stride * object.count;
 | 
						|
			const array = new Float32Array( length );
 | 
						|
 | 
						|
			for ( let i = 0; i < length; i ++ ) {
 | 
						|
 | 
						|
				const index = i % stride;
 | 
						|
 | 
						|
				const minElementValue = min.getComponent( index );
 | 
						|
				const maxElementValue = max.getComponent( index );
 | 
						|
 | 
						|
				array[ i ] = MathUtils.lerp( minElementValue, maxElementValue, Math.random() );
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			const nodeType = this.getNodeType( builder );
 | 
						|
 | 
						|
			output = buffer( array, 'vec4', object.count ).element( instanceIndex ).convert( nodeType );
 | 
						|
			//output = bufferAttribute( array, 'vec4', 4, 0 ).convert( nodeType );
 | 
						|
 | 
						|
		} else {
 | 
						|
 | 
						|
			output = float( 0 );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return output;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export default RangeNode;
 | 
						|
 | 
						|
export const range = nodeProxy( RangeNode );
 | 
						|
 | 
						|
addNodeClass( 'RangeNode', RangeNode );
 |