mirror of
https://github.com/minetest/minetest.git
synced 2024-07-04 15:05:27 +02:00
Address minor TODOs in tiniergltf
This commit is contained in:
parent
997926461e
commit
d6b6eec1bf
@ -1237,36 +1237,24 @@ struct GlTF {
|
|||||||
check(view.byteOffset <= buf.byteLength - view.byteLength);
|
check(view.byteOffset <= buf.byteLength - view.byteLength);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const auto checkAccessor = [&](const Accessor &accessor,
|
||||||
|
std::size_t bufferView, std::size_t byteOffset, std::size_t count) {
|
||||||
|
const BufferView &view = bufferViews->at(bufferView);
|
||||||
|
if (view.byteStride.has_value())
|
||||||
|
check(*view.byteStride % accessor.componentSize() == 0);
|
||||||
|
check(byteOffset < view.byteLength);
|
||||||
|
// Use division to avoid overflows.
|
||||||
|
const auto effective_byte_stride = view.byteStride.value_or(accessor.elementSize());
|
||||||
|
check(count <= (view.byteLength - byteOffset) / effective_byte_stride);
|
||||||
|
};
|
||||||
checkForall(accessors, [&](const Accessor &accessor) {
|
checkForall(accessors, [&](const Accessor &accessor) {
|
||||||
checkIndex(bufferViews, accessor.bufferView);
|
if (accessor.bufferView.has_value())
|
||||||
if (accessor.bufferView.has_value()) {
|
checkAccessor(accessor, *accessor.bufferView, accessor.byteOffset, accessor.count);
|
||||||
const BufferView &view = bufferViews->at(accessor.bufferView.value());
|
|
||||||
if (view.byteStride.has_value())
|
|
||||||
check(view.byteStride.value() % accessor.componentSize() == 0);
|
|
||||||
check(accessor.byteOffset < view.byteLength);
|
|
||||||
// Use division to avoid overflows.
|
|
||||||
// TODO this should be (but written in such a way that overflows are avoided):
|
|
||||||
// `accessor.byteOffset + EFFECTIVE_BYTE_STRIDE * (accessor.count - 1) + SIZE_OF_COMPONENT * NUMBER_OF_COMPONENTS`
|
|
||||||
check(accessor.count <= view.byteLength / view.byteStride.value_or(accessor.elementSize()));
|
|
||||||
}
|
|
||||||
if (accessor.sparse.has_value()) {
|
if (accessor.sparse.has_value()) {
|
||||||
// Again be careful because of possible integer overflows.
|
const auto indices = accessor.sparse->indices;
|
||||||
{
|
checkAccessor(accessor, indices.bufferView, indices.byteOffset, accessor.sparse->count);
|
||||||
const auto &indices = accessor.sparse->indices;
|
const auto values = accessor.sparse->values;
|
||||||
checkIndex(bufferViews, indices.bufferView);
|
checkAccessor(accessor, values.bufferView, values.byteOffset, accessor.sparse->count);
|
||||||
const BufferView &view = bufferViews->at(indices.bufferView);
|
|
||||||
check(indices.byteOffset < view.byteLength);
|
|
||||||
// TODO take byte stride into account
|
|
||||||
check(accessor.sparse->count <= (view.byteLength - indices.byteOffset) / indices.elementSize());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const auto &values = accessor.sparse->values;
|
|
||||||
checkIndex(bufferViews, values.bufferView);
|
|
||||||
const BufferView &view = bufferViews->at(values.bufferView);
|
|
||||||
check(values.byteOffset < view.byteLength);
|
|
||||||
// TODO take byte stride into account
|
|
||||||
check(accessor.sparse->count <= (view.byteLength - values.byteOffset) / accessor.elementSize());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1364,4 +1352,4 @@ struct GlTF {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user