diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index 4f88b3809..61d9b8387 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -851,6 +851,13 @@ Containers::StridedArrayView1D SceneData::fieldDataFieldViewInternal return fieldDataFieldViewInternal(field, 0, field._size); } +std::size_t SceneData::fieldSizeBound() const { + std::size_t out = 0; + for(const SceneFieldData& i: _fields) + out = Math::max(out, std::size_t(i._size)); + return out; +} + SceneFieldData SceneData::fieldData(const UnsignedInt id) const { CORRADE_ASSERT(id < _fields.size(), "Trade::SceneData::fieldData(): index" << id << "out of range for" << _fields.size() << "fields", SceneFieldData{}); diff --git a/src/Magnum/Trade/SceneData.h b/src/Magnum/Trade/SceneData.h index 9a5364d66..bc9243148 100644 --- a/src/Magnum/Trade/SceneData.h +++ b/src/Magnum/Trade/SceneData.h @@ -1304,6 +1304,11 @@ class MAGNUM_TRADE_EXPORT SceneData { * @m_since_latest * * Upper bound on object mapping indices of all fields in the scene. + * Note that an object can have a certain field associated with + * it multiple times with different values (for example an object + * having multiple meshes), and thus a field size can be larger than + * @ref mappingBound() --- see @ref fieldSizeBound() for an upper + * bound for all field sizes. * @see @ref fieldCount(), @ref fieldSize() */ UnsignedLong mappingBound() const { return _mappingBound; } @@ -1320,6 +1325,18 @@ class MAGNUM_TRADE_EXPORT SceneData { */ UnsignedInt fieldCount() const { return _fields.size(); } + /** + * @brief Field size bound + * @m_since_latest + * + * A maximum of all @ref fieldSize() or @cpp 0 @ce for a scene with no + * fields. Note that an object can have a certain field associated with + * it multiple times with different values (for example an object + * having multiple meshes), and thus a field size can be larger than + * @ref mappingBound(). + */ + std::size_t fieldSizeBound() const; + /** * @brief Raw field metadata * @m_since_latest diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index ecd20e495..bf760404b 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -1367,6 +1367,7 @@ void SceneDataTest::construct() { CORRADE_COMPARE(scene.mappingBound(), 8); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort); CORRADE_COMPARE(scene.fieldCount(), 4); + CORRADE_COMPARE(scene.fieldSizeBound(), 5); CORRADE_COMPARE(scene.importerState(), &importerState); /* is2D() / is3D() exhaustively tested in transformations*DAsArray[TRS]() @@ -1608,6 +1609,7 @@ void SceneDataTest::constructZeroFields() { CORRADE_COMPARE(scene.mappingBound(), 37563); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort); CORRADE_COMPARE(scene.fieldCount(), 0); + CORRADE_COMPARE(scene.fieldSizeBound(), 0); CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(!scene.is3D()); } @@ -1626,6 +1628,7 @@ void SceneDataTest::constructZeroObjects() { CORRADE_COMPARE(scene.mappingBound(), 0); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedInt); CORRADE_COMPARE(scene.fieldCount(), 2); + CORRADE_COMPARE(scene.fieldSizeBound(), 0); /* Field property access by name */ CORRADE_COMPARE(scene.fieldType(SceneField::Mesh), SceneFieldType::UnsignedShort);