import { Vector3 } from '../math/Vector3.js'; import { BufferAttribute } from './BufferAttribute.js'; const _vector = /*@__PURE__*/ new Vector3(); class InterleavedBufferAttribute { constructor( interleavedBuffer, itemSize, offset, normalized = false ) { this.name = ''; this.data = interleavedBuffer; this.itemSize = itemSize; this.offset = offset; this.normalized = normalized === true; } get count() { return this.data.count; } get array() { return this.data.array; } set needsUpdate( value ) { this.data.needsUpdate = value; } applyMatrix4( m ) { for ( let i = 0, l = this.data.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; } setX( index, x ) { this.data.array[ index * this.data.stride + this.offset ] = x; return this; } setY( index, y ) { this.data.array[ index * this.data.stride + this.offset + 1 ] = y; return this; } setZ( index, z ) { this.data.array[ index * this.data.stride + this.offset + 2 ] = z; return this; } setW( index, w ) { this.data.array[ index * this.data.stride + this.offset + 3 ] = w; return this; } getX( index ) { return this.data.array[ index * this.data.stride + this.offset ]; } getY( index ) { return this.data.array[ index * this.data.stride + this.offset + 1 ]; } getZ( index ) { return this.data.array[ index * this.data.stride + this.offset + 2 ]; } getW( index ) { return this.data.array[ index * this.data.stride + this.offset + 3 ]; } setXY( index, x, y ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; return this; } setXYZ( index, x, y, z ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; return this; } setXYZW( index, x, y, z, w ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; this.data.array[ index + 3 ] = w; return this; } clone( data ) { if ( data === undefined ) { console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' ); const array = []; for ( let i = 0; i < this.count; i ++ ) { const index = i * this.data.stride + this.offset; for ( let j = 0; j < this.itemSize; j ++ ) { array.push( this.data.array[ index + j ] ); } } return new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized ); } else { if ( data.interleavedBuffers === undefined ) { data.interleavedBuffers = {}; } if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { data.interleavedBuffers[ this.data.uuid ] = this.data.clone( data ); } return new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized ); } } toJSON( data ) { if ( data === undefined ) { console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' ); const array = []; for ( let i = 0; i < this.count; i ++ ) { const index = i * this.data.stride + this.offset; for ( let j = 0; j < this.itemSize; j ++ ) { array.push( this.data.array[ index + j ] ); } } // deinterleave data and save it as an ordinary buffer attribute for now return { itemSize: this.itemSize, type: this.array.constructor.name, array: array, normalized: this.normalized }; } else { // save as true interlaved attribtue if ( data.interleavedBuffers === undefined ) { data.interleavedBuffers = {}; } if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { data.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data ); } return { isInterleavedBufferAttribute: true, itemSize: this.itemSize, data: this.data.uuid, offset: this.offset, normalized: this.normalized }; } } } InterleavedBufferAttribute.prototype.isInterleavedBufferAttribute = true; export { InterleavedBufferAttribute };