* Returns the contents of an interleaved accessor, as a typed array. * @internal
(accessorDef: GLTF.IAccessor, context: ReaderContext)
| 581 | * @internal |
| 582 | */ |
| 583 | function getInterleavedArray(accessorDef: GLTF.IAccessor, context: ReaderContext): TypedArray { |
| 584 | const jsonDoc = context.jsonDoc; |
| 585 | const bufferView = context.bufferViews[accessorDef.bufferView!]; |
| 586 | const bufferViewDef = jsonDoc.json.bufferViews![accessorDef.bufferView!]; |
| 587 | |
| 588 | const TypedArray = ComponentTypeToTypedArray[accessorDef.componentType]; |
| 589 | const elementSize = Accessor.getElementSize(accessorDef.type); |
| 590 | const componentSize = TypedArray.BYTES_PER_ELEMENT; |
| 591 | const accessorByteOffset = accessorDef.byteOffset || 0; |
| 592 | |
| 593 | const array = new TypedArray(accessorDef.count * elementSize); |
| 594 | const view = new DataView(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength); |
| 595 | const byteStride = bufferViewDef.byteStride!; |
| 596 | |
| 597 | for (let i = 0; i < accessorDef.count; i++) { |
| 598 | for (let j = 0; j < elementSize; j++) { |
| 599 | const byteOffset = accessorByteOffset + i * byteStride + j * componentSize; |
| 600 | let value: number; |
| 601 | switch (accessorDef.componentType) { |
| 602 | case Accessor.ComponentType.FLOAT: |
| 603 | value = view.getFloat32(byteOffset, true); |
| 604 | break; |
| 605 | case Accessor.ComponentType.UNSIGNED_INT: |
| 606 | value = view.getUint32(byteOffset, true); |
| 607 | break; |
| 608 | case Accessor.ComponentType.UNSIGNED_SHORT: |
| 609 | value = view.getUint16(byteOffset, true); |
| 610 | break; |
| 611 | case Accessor.ComponentType.UNSIGNED_BYTE: |
| 612 | value = view.getUint8(byteOffset); |
| 613 | break; |
| 614 | case Accessor.ComponentType.SHORT: |
| 615 | value = view.getInt16(byteOffset, true); |
| 616 | break; |
| 617 | case Accessor.ComponentType.BYTE: |
| 618 | value = view.getInt8(byteOffset); |
| 619 | break; |
| 620 | case Accessor.ComponentType.FLOAT16: // KHR_accessor_float16 |
| 621 | value = view.getFloat16(byteOffset, true); |
| 622 | break; |
| 623 | case Accessor.ComponentType.FLOAT64: // KHR_accessor_float64 |
| 624 | value = view.getFloat64(byteOffset, true); |
| 625 | break; |
| 626 | default: |
| 627 | throw new Error(`Unexpected componentType "${accessorDef.componentType}".`); |
| 628 | } |
| 629 | array[i * elementSize + j] = value; |
| 630 | } |
| 631 | } |
| 632 | |
| 633 | return array; |
| 634 | } |
| 635 | |
| 636 | /** |
| 637 | * Returns the contents of an accessor, as a typed array. |
no test coverage detected