three
Version:
JavaScript 3D library
159 lines (90 loc) • 3.17 kB
JavaScript
import { nodeObject } from '../tsl/TSLBase.js';
import { NodeUpdateType } from '../core/constants.js';
import { getValueType } from '../core/NodeUtils.js';
import ArrayElementNode from '../utils/ArrayElementNode.js';
import BufferNode from './BufferNode.js';
class UniformArrayElementNode extends ArrayElementNode {
static get type() {
return 'UniformArrayElementNode';
}
constructor( arrayBuffer, indexNode ) {
super( arrayBuffer, indexNode );
this.isArrayBufferElementNode = true;
}
generate( builder ) {
const snippet = super.generate( builder );
const type = this.getNodeType();
return builder.format( snippet, 'vec4', type );
}
}
class UniformArrayNode extends BufferNode {
static get type() {
return 'UniformArrayNode';
}
constructor( value, elementType = null ) {
super( null, 'vec4' );
this.array = value;
this.elementType = elementType;
this._elementType = null;
this._elementLength = 0;
this.updateType = NodeUpdateType.RENDER;
this.isArrayBufferNode = true;
}
getElementType() {
return this.elementType || this._elementType;
}
getElementLength() {
return this._elementLength;
}
update( /*frame*/ ) {
const { array, value } = this;
const elementLength = this.getElementLength();
const elementType = this.getElementType();
if ( elementLength === 1 ) {
for ( let i = 0; i < array.length; i ++ ) {
const index = i * 4;
value[ index ] = array[ i ];
}
} else if ( elementType === 'color' ) {
for ( let i = 0; i < array.length; i ++ ) {
const index = i * 4;
const vector = array[ i ];
value[ index ] = vector.r;
value[ index + 1 ] = vector.g;
value[ index + 2 ] = vector.b || 0;
//value[ index + 3 ] = vector.a || 0;
}
} else {
for ( let i = 0; i < array.length; i ++ ) {
const index = i * 4;
const vector = array[ i ];
value[ index ] = vector.x;
value[ index + 1 ] = vector.y;
value[ index + 2 ] = vector.z || 0;
value[ index + 3 ] = vector.w || 0;
}
}
}
setup( builder ) {
const length = this.array.length;
this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType;
this._elementLength = builder.getTypeLength( this._elementType );
let arrayType = Float32Array;
if ( this._elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array;
else if ( this._elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array;
this.value = new arrayType( length * 4 );
this.bufferCount = length;
this.bufferType = builder.changeComponentType( 'vec4', builder.getComponentType( this._elementType ) );
return super.setup( builder );
}
element( indexNode ) {
return nodeObject( new UniformArrayElementNode( this, nodeObject( indexNode ) ) );
}
}
export default UniformArrayNode;
export const uniformArray = ( values, nodeType ) => nodeObject( new UniformArrayNode( values, nodeType ) );
//
export const uniforms = ( values, nodeType ) => { // @deprecated, r168
console.warn( 'TSL.UniformArrayNode: uniforms() has been renamed to uniformArray().' );
return nodeObject( new UniformArrayNode( values, nodeType ) );
};