* Returns the contents of a sparse accessor, as a typed array. * @internal
(accessorDef: GLTF.IAccessor, context: ReaderContext)
| 665 | * @internal |
| 666 | */ |
| 667 | function getSparseArray(accessorDef: GLTF.IAccessor, context: ReaderContext): TypedArray { |
| 668 | const TypedArray = ComponentTypeToTypedArray[accessorDef.componentType]; |
| 669 | const elementSize = Accessor.getElementSize(accessorDef.type); |
| 670 | |
| 671 | let array: TypedArray; |
| 672 | if (accessorDef.bufferView !== undefined) { |
| 673 | array = getAccessorArray(accessorDef, context); |
| 674 | } else { |
| 675 | array = new TypedArray(accessorDef.count * elementSize); |
| 676 | } |
| 677 | |
| 678 | const sparseDef = accessorDef.sparse; |
| 679 | if (!sparseDef) return array; // Zero-filled accessor. |
| 680 | |
| 681 | const count = sparseDef.count; |
| 682 | const indicesDef = { ...accessorDef, ...sparseDef.indices, count, type: 'SCALAR' }; |
| 683 | const valuesDef = { ...accessorDef, ...sparseDef.values, count }; |
| 684 | const indices = getAccessorArray(indicesDef as GLTF.IAccessor, context); |
| 685 | const values = getAccessorArray(valuesDef, context); |
| 686 | |
| 687 | // Override indices given in the sparse data. |
| 688 | for (let i = 0; i < indicesDef.count; i++) { |
| 689 | for (let j = 0; j < elementSize; j++) { |
| 690 | array[indices[i] * elementSize + j] = values[i * elementSize + j]; |
| 691 | } |
| 692 | } |
| 693 | |
| 694 | return array; |
| 695 | } |
no test coverage detected