Fix sparse accessor handling in tiniergltf

This commit is contained in:
Lars Mueller 2024-06-12 20:35:36 +02:00
parent 35466b227a
commit 3467d91730

@ -109,8 +109,9 @@ struct AccessorSparseIndices {
UNSIGNED_SHORT, UNSIGNED_SHORT,
UNSIGNED_INT, UNSIGNED_INT,
}; };
static std::size_t componentSize(ComponentType type) { ComponentType componentType;
switch (type) { std::size_t componentSize() const {
switch (componentType) {
case ComponentType::UNSIGNED_BYTE: case ComponentType::UNSIGNED_BYTE:
return 1; return 1;
case ComponentType::UNSIGNED_SHORT: case ComponentType::UNSIGNED_SHORT:
@ -120,9 +121,8 @@ struct AccessorSparseIndices {
} }
throw std::logic_error("invalid component type"); throw std::logic_error("invalid component type");
} }
ComponentType componentType;
std::size_t elementSize() const { std::size_t elementSize() const {
return componentSize(componentType); return componentSize();
} }
AccessorSparseIndices(const Json::Value &o) AccessorSparseIndices(const Json::Value &o)
: bufferView(as<std::size_t>(o["bufferView"])) : bufferView(as<std::size_t>(o["bufferView"]))
@ -1237,7 +1237,7 @@ struct GlTF {
check(view.byteOffset <= buf.byteLength - view.byteLength); check(view.byteOffset <= buf.byteLength - view.byteLength);
}); });
const auto checkAccessor = [&](const Accessor &accessor, const auto checkAccessor = [&](const auto &accessor,
std::size_t bufferView, std::size_t byteOffset, std::size_t count) { std::size_t bufferView, std::size_t byteOffset, std::size_t count) {
const BufferView &view = bufferViews->at(bufferView); const BufferView &view = bufferViews->at(bufferView);
if (view.byteStride.has_value()) if (view.byteStride.has_value())
@ -1251,9 +1251,9 @@ struct GlTF {
if (accessor.bufferView.has_value()) if (accessor.bufferView.has_value())
checkAccessor(accessor, *accessor.bufferView, accessor.byteOffset, accessor.count); checkAccessor(accessor, *accessor.bufferView, accessor.byteOffset, accessor.count);
if (accessor.sparse.has_value()) { if (accessor.sparse.has_value()) {
const auto indices = accessor.sparse->indices; const auto &indices = accessor.sparse->indices;
checkAccessor(accessor, indices.bufferView, indices.byteOffset, accessor.sparse->count); checkAccessor(indices, indices.bufferView, indices.byteOffset, accessor.sparse->count);
const auto values = accessor.sparse->values; const auto &values = accessor.sparse->values;
checkAccessor(accessor, values.bufferView, values.byteOffset, accessor.sparse->count); checkAccessor(accessor, values.bufferView, values.byteOffset, accessor.sparse->count);
} }
}); });