You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

109 lines
2.2 KiB

import Node from '../core/Node.js';
import { attribute, float } from '../shadernode/ShaderNodeBaseElements.js';
import { MathUtils, InstancedBufferAttribute } from 'three';
class RangeNode extends Node {
constructor( min, max ) {
super();
this.min = min;
this.max = max;
}
getVectorLength() {
const min = this.min;
let length = 1;
if ( min.isVector2 ) length = 2;
else if ( min.isVector3 ) length = 3;
else if ( min.isVector4 ) length = 4;
else if ( min.isColor ) length = 3;
return length;
}
getNodeType( builder ) {
return ( builder.object.isInstancedMesh === true ) ? builder.getTypeFromLength( this.getVectorLength() ) : 'float';
}
construct( builder ) {
const { min, max } = this;
const { object, geometry } = builder;
let output = null;
if ( object.isInstancedMesh === true ) {
const vectorLength = this.getVectorLength();
const attributeName = 'node' + this.id;
const length = vectorLength * object.count;
const array = new Float32Array( length );
const attributeGeometry = geometry.getAttribute( attributeName );
if ( attributeGeometry === undefined || attributeGeometry.array.length < length ) {
if ( vectorLength === 1 ) {
for ( let i = 0; i < length; i ++ ) {
array[ i ] = MathUtils.lerp( min, max, Math.random() );
}
} else if ( min.isColor ) {
for ( let i = 0; i < length; i += 3 ) {
array[ i ] = MathUtils.lerp( min.r, max.r, Math.random() );
array[ i + 1 ] = MathUtils.lerp( min.g, max.g, Math.random() );
array[ i + 2 ] = MathUtils.lerp( min.b, max.b, Math.random() );
}
} else {
for ( let i = 0; i < length; i ++ ) {
const index = i % vectorLength;
const minValue = min.getComponent( index );
const maxValue = max.getComponent( index );
array[ i ] = MathUtils.lerp( minValue, maxValue, Math.random() );
}
}
geometry.setAttribute( attributeName, new InstancedBufferAttribute( array, vectorLength ) );
geometry.dispose();
}
output = attribute( attributeName, builder.getTypeFromLength( vectorLength ) );
} else {
output = float( 0 );
}
return output;
}
}
export default RangeNode;