import { Vector4 } from '../math/Vector4.js'; import { Vector3 } from '../math/Vector3.js'; import { Vector2 } from '../math/Vector2.js'; import { Color } from '../math/Color.js'; import { StaticDrawUsage } from '../constants.js'; const _vector = /*@__PURE__*/ new Vector3(); const _vector2 = /*@__PURE__*/ new Vector2(); class BufferAttribute { constructor( array, itemSize, normalized ) { if ( Array.isArray( array ) ) { throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); } this.name = ''; this.array = array; this.itemSize = itemSize; this.count = array !== undefined ? array.length / itemSize : 0; this.normalized = normalized === true; this.usage = StaticDrawUsage; this.updateRange = { offset: 0, count: - 1 }; this.version = 0; } onUploadCallback() {} set needsUpdate( value ) { if ( value === true ) this.version ++; } setUsage( value ) { this.usage = value; return this; } copy( source ) { this.name = source.name; this.array = new source.array.constructor( source.array ); this.itemSize = source.itemSize; this.count = source.count; this.normalized = source.normalized; this.usage = source.usage; return this; } copyAt( index1, attribute, index2 ) { index1 *= this.itemSize; index2 *= attribute.itemSize; for ( let i = 0, l = this.itemSize; i < l; i ++ ) { this.array[ index1 + i ] = attribute.array[ index2 + i ]; } return this; } copyArray( array ) { this.array.set( array ); return this; } copyColorsArray( colors ) { const array = this.array; let offset = 0; for ( let i = 0, l = colors.length; i < l; i ++ ) { let color = colors[ i ]; if ( color === undefined ) { console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); color = new Color(); } array[ offset ++ ] = color.r; array[ offset ++ ] = color.g; array[ offset ++ ] = color.b; } return this; } copyVector2sArray( vectors ) { const array = this.array; let offset = 0; for ( let i = 0, l = vectors.length; i < l; i ++ ) { let vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); vector = new Vector2(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; } return this; } copyVector3sArray( vectors ) { const array = this.array; let offset = 0; for ( let i = 0, l = vectors.length; i < l; i ++ ) { let vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); vector = new Vector3(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; array[ offset ++ ] = vector.z; } return this; } copyVector4sArray( vectors ) { const array = this.array; let offset = 0; for ( let i = 0, l = vectors.length; i < l; i ++ ) { let vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); vector = new Vector4(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; array[ offset ++ ] = vector.z; array[ offset ++ ] = vector.w; } return this; } applyMatrix3( m ) { if ( this.itemSize === 2 ) { for ( let i = 0, l = this.count; i < l; i ++ ) { _vector2.fromBufferAttribute( this, i ); _vector2.applyMatrix3( m ); this.setXY( i, _vector2.x, _vector2.y ); } } else if ( this.itemSize === 3 ) { for ( let i = 0, l = this.count; i < l; i ++ ) { _vector.fromBufferAttribute( this, i ); _vector.applyMatrix3( m ); this.setXYZ( i, _vector.x, _vector.y, _vector.z ); } } return this; } applyMatrix4( m ) { for ( let i = 0, l = this.count; i < l; i ++ ) { _vector.x = this.getX( i ); _vector.y = this.getY( i ); _vector.z = this.getZ( i ); _vector.applyMatrix4( m ); this.setXYZ( i, _vector.x, _vector.y, _vector.z ); } return this; } applyNormalMatrix( m ) { for ( let i = 0, l = this.count; i < l; i ++ ) { _vector.x = this.getX( i ); _vector.y = this.getY( i ); _vector.z = this.getZ( i ); _vector.applyNormalMatrix( m ); this.setXYZ( i, _vector.x, _vector.y, _vector.z ); } return this; } transformDirection( m ) { for ( let i = 0, l = this.count; i < l; i ++ ) { _vector.x = this.getX( i ); _vector.y = this.getY( i ); _vector.z = this.getZ( i ); _vector.transformDirection( m ); this.setXYZ( i, _vector.x, _vector.y, _vector.z ); } return this; } set( value, offset = 0 ) { this.array.set( value, offset ); return this; } getX( index ) { return this.array[ index * this.itemSize ]; } setX( index, x ) { this.array[ index * this.itemSize ] = x; return this; } getY( index ) { return this.array[ index * this.itemSize + 1 ]; } setY( index, y ) { this.array[ index * this.itemSize + 1 ] = y; return this; } getZ( index ) { return this.array[ index * this.itemSize + 2 ]; } setZ( index, z ) { this.array[ index * this.itemSize + 2 ] = z; return this; } getW( index ) { return this.array[ index * this.itemSize + 3 ]; } setW( index, w ) { this.array[ index * this.itemSize + 3 ] = w; return this; } setXY( index, x, y ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; return this; } setXYZ( index, x, y, z ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; return this; } setXYZW( index, x, y, z, w ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; this.array[ index + 3 ] = w; return this; } onUpload( callback ) { this.onUploadCallback = callback; return this; } clone() { return new this.constructor( this.array, this.itemSize ).copy( this ); } toJSON() { const data = { itemSize: this.itemSize, type: this.array.constructor.name, array: Array.prototype.slice.call( this.array ), normalized: this.normalized }; if ( this.name !== '' ) data.name = this.name; if ( this.usage !== StaticDrawUsage ) data.usage = this.usage; if ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange; return data; } } BufferAttribute.prototype.isBufferAttribute = true; // class Int8BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Int8Array( array ), itemSize, normalized ); } } class Uint8BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Uint8Array( array ), itemSize, normalized ); } } class Uint8ClampedBufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Uint8ClampedArray( array ), itemSize, normalized ); } } class Int16BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Int16Array( array ), itemSize, normalized ); } } class Uint16BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Uint16Array( array ), itemSize, normalized ); } } class Int32BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Int32Array( array ), itemSize, normalized ); } } class Uint32BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Uint32Array( array ), itemSize, normalized ); } } class Float16BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Uint16Array( array ), itemSize, normalized ); } } Float16BufferAttribute.prototype.isFloat16BufferAttribute = true; class Float32BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Float32Array( array ), itemSize, normalized ); } } class Float64BufferAttribute extends BufferAttribute { constructor( array, itemSize, normalized ) { super( new Float64Array( array ), itemSize, normalized ); } } // export { Float64BufferAttribute, Float32BufferAttribute, Float16BufferAttribute, Uint32BufferAttribute, Int32BufferAttribute, Uint16BufferAttribute, Int16BufferAttribute, Uint8ClampedBufferAttribute, Uint8BufferAttribute, Int8BufferAttribute, BufferAttribute };