MCPcopy
hub / github.com/donmccurdy/glTF-Transform / getInterleavedArray

Function getInterleavedArray

packages/core/src/io/reader.ts:583–634  ·  view source on GitHub ↗

* Returns the contents of an interleaved accessor, as a typed array. * @internal

(accessorDef: GLTF.IAccessor, context: ReaderContext)

Source from the content-addressed store, hash-verified

581 * @internal
582 */
583function 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.

Callers 1

getAccessorArrayFunction · 0.85

Calls 1

getElementSizeMethod · 0.80

Tested by

no test coverage detected