Browse Source

Trade: add SceneData::fieldSizeBound().

Like mappingBound(), but instead of giving an upper bound for object
count, gives an upper bound for field size.
pull/589/head
Vladimír Vondruš 4 years ago
parent
commit
66a57088b1
  1. 7
      src/Magnum/Trade/SceneData.cpp
  2. 17
      src/Magnum/Trade/SceneData.h
  3. 3
      src/Magnum/Trade/Test/SceneDataTest.cpp

7
src/Magnum/Trade/SceneData.cpp

@ -851,6 +851,13 @@ Containers::StridedArrayView1D<const void> SceneData::fieldDataFieldViewInternal
return fieldDataFieldViewInternal(field, 0, field._size); 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 { SceneFieldData SceneData::fieldData(const UnsignedInt id) const {
CORRADE_ASSERT(id < _fields.size(), CORRADE_ASSERT(id < _fields.size(),
"Trade::SceneData::fieldData(): index" << id << "out of range for" << _fields.size() << "fields", SceneFieldData{}); "Trade::SceneData::fieldData(): index" << id << "out of range for" << _fields.size() << "fields", SceneFieldData{});

17
src/Magnum/Trade/SceneData.h

@ -1304,6 +1304,11 @@ class MAGNUM_TRADE_EXPORT SceneData {
* @m_since_latest * @m_since_latest
* *
* Upper bound on object mapping indices of all fields in the scene. * 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() * @see @ref fieldCount(), @ref fieldSize()
*/ */
UnsignedLong mappingBound() const { return _mappingBound; } UnsignedLong mappingBound() const { return _mappingBound; }
@ -1320,6 +1325,18 @@ class MAGNUM_TRADE_EXPORT SceneData {
*/ */
UnsignedInt fieldCount() const { return _fields.size(); } 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 * @brief Raw field metadata
* @m_since_latest * @m_since_latest

3
src/Magnum/Trade/Test/SceneDataTest.cpp

@ -1367,6 +1367,7 @@ void SceneDataTest::construct() {
CORRADE_COMPARE(scene.mappingBound(), 8); CORRADE_COMPARE(scene.mappingBound(), 8);
CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort);
CORRADE_COMPARE(scene.fieldCount(), 4); CORRADE_COMPARE(scene.fieldCount(), 4);
CORRADE_COMPARE(scene.fieldSizeBound(), 5);
CORRADE_COMPARE(scene.importerState(), &importerState); CORRADE_COMPARE(scene.importerState(), &importerState);
/* is2D() / is3D() exhaustively tested in transformations*DAsArray[TRS]() /* is2D() / is3D() exhaustively tested in transformations*DAsArray[TRS]()
@ -1608,6 +1609,7 @@ void SceneDataTest::constructZeroFields() {
CORRADE_COMPARE(scene.mappingBound(), 37563); CORRADE_COMPARE(scene.mappingBound(), 37563);
CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedShort);
CORRADE_COMPARE(scene.fieldCount(), 0); CORRADE_COMPARE(scene.fieldCount(), 0);
CORRADE_COMPARE(scene.fieldSizeBound(), 0);
CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(!scene.is3D()); CORRADE_VERIFY(!scene.is3D());
} }
@ -1626,6 +1628,7 @@ void SceneDataTest::constructZeroObjects() {
CORRADE_COMPARE(scene.mappingBound(), 0); CORRADE_COMPARE(scene.mappingBound(), 0);
CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedInt); CORRADE_COMPARE(scene.mappingType(), SceneMappingType::UnsignedInt);
CORRADE_COMPARE(scene.fieldCount(), 2); CORRADE_COMPARE(scene.fieldCount(), 2);
CORRADE_COMPARE(scene.fieldSizeBound(), 0);
/* Field property access by name */ /* Field property access by name */
CORRADE_COMPARE(scene.fieldType(SceneField::Mesh), SceneFieldType::UnsignedShort); CORRADE_COMPARE(scene.fieldType(SceneField::Mesh), SceneFieldType::UnsignedShort);

Loading…
Cancel
Save