in GLTFSDK/Inc/GLTFSDK/GLTFResourceReader.h [155:199]
std::vector<T> ReadSparseAccessor(const Document& gltfDocument, const Accessor& accessor) const
{
const auto typeCount = Accessor::GetTypeCount(accessor.type);
const auto elementSize = sizeof(T) * typeCount;
std::vector<T> baseData;
if (accessor.bufferViewId.empty())
{
baseData.resize(typeCount * accessor.count, T());
}
else
{
const BufferView& bufferView = gltfDocument.bufferViews.Get(accessor.bufferViewId);
const Buffer& buffer = gltfDocument.buffers.Get(bufferView.bufferId);
const size_t offset = accessor.byteOffset + bufferView.byteOffset;
if (!bufferView.byteStride || bufferView.byteStride.Get() == elementSize)
{
baseData = ReadBinaryData<T>(buffer, offset, accessor.count * typeCount);
}
else
{
baseData = ReadBinaryDataInterleaved<T>(buffer, offset, accessor.count, typeCount, bufferView.byteStride.Get());
}
}
switch (accessor.sparse.indicesComponentType)
{
case COMPONENT_UNSIGNED_BYTE:
ReadSparseBinaryData<T, uint8_t>(gltfDocument, baseData, accessor);
break;
case COMPONENT_UNSIGNED_SHORT:
ReadSparseBinaryData<T, uint16_t>(gltfDocument, baseData, accessor);
break;
case COMPONENT_UNSIGNED_INT:
ReadSparseBinaryData<T, uint32_t>(gltfDocument, baseData, accessor);
break;
default:
throw GLTFException("Unsupported sparse indices ComponentType");
}
return baseData;
}