in GLTFSDK/Inc/GLTFSDK/GLTFResourceReader.h [353:402]
void ReadSparseBinaryData(const Document& gltfDocument, std::vector<T>& baseData, const Accessor& accessor) const
{
const auto typeCount = Accessor::GetTypeCount(accessor.type);
const auto elementSize = sizeof(T) * typeCount;
const size_t count = accessor.sparse.count;
const BufferView& indicesBufferView = gltfDocument.bufferViews.Get(accessor.sparse.indicesBufferViewId);
const Buffer& indicesBuffer = gltfDocument.buffers.Get(indicesBufferView.bufferId);
const size_t indicesOffset = accessor.sparse.indicesByteOffset + indicesBufferView.byteOffset;
const BufferView& valuesBufferView = gltfDocument.bufferViews.Get(accessor.sparse.valuesBufferViewId);
const Buffer& valuesBuffer = gltfDocument.buffers.Get(valuesBufferView.bufferId);
const size_t valuesOffset = accessor.sparse.valuesByteOffset + valuesBufferView.byteOffset;
std::vector<I> indices;
if (!indicesBufferView.byteStride || indicesBufferView.byteStride.Get() == sizeof(I))
{
indices = ReadBinaryData<I>(indicesBuffer, indicesOffset, count);
}
else
{
indices = ReadBinaryDataInterleaved<I>(indicesBuffer, indicesOffset, count, 1U, indicesBufferView.byteStride.Get());
}
std::vector<T> values;
if (!valuesBufferView.byteStride || valuesBufferView.byteStride.Get() == elementSize)
{
values = ReadBinaryData<T>(valuesBuffer, valuesOffset, count * typeCount);
}
else
{
values = ReadBinaryDataInterleaved<T>(valuesBuffer, valuesOffset, count, typeCount, valuesBufferView.byteStride.Get());
}
for (size_t i = 0; i < indices.size(); i++)
{
assert(baseData.size() == accessor.count * typeCount);
static_assert(sizeof(I) <= sizeof(size_t), "sizeof(I) < sizeof(size_t)");
if (0 <= indices[i] && static_cast<size_t>(indices[i]) < accessor.count)
{
for (size_t j = 0; j < typeCount; j++)
{
baseData[indices[i] * typeCount + j] = values[i * typeCount + j];
}
}
}
}