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 };