diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index bb2fdea7b..6af41487f 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -1354,6 +1354,14 @@ UnsignedInt SceneData::findTranslationRotationScalingFields(UnsignedInt& transla return fieldWithObjectMapping; } +std::size_t SceneData::transformationFieldSize() const { + UnsignedInt transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId; + const UnsignedInt fieldWithObjectMapping = findTransformationFields(transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId); + CORRADE_ASSERT(fieldWithObjectMapping != ~UnsignedInt{}, + "Trade::SceneData::transformationFieldSize(): no transformation-related field found", {}); + return _fields[fieldWithObjectMapping]._size; +} + void SceneData::transformations2DIntoInternal(const UnsignedInt transformationFieldId, const UnsignedInt translationFieldId, const UnsignedInt rotationFieldId, const UnsignedInt scalingFieldId, std::size_t offset, const Containers::StridedArrayView1D& destination) const { /* *FieldId, offset and destination.size() is assumed to be in bounds (or an invalid field ID), checked by the callers */ diff --git a/src/Magnum/Trade/SceneData.h b/src/Magnum/Trade/SceneData.h index 1f5c80005..f65e29aa7 100644 --- a/src/Magnum/Trade/SceneData.h +++ b/src/Magnum/Trade/SceneData.h @@ -2064,6 +2064,18 @@ class MAGNUM_TRADE_EXPORT SceneData { */ std::size_t parentsInto(std::size_t offset, const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& fieldDestination) const; + /** + * @brief Transformation field size + * @m_since_latest + * + * Returns the size of the @ref SceneField::Transformation field, or, + * if not present, of any of the @ref SceneField::Translation, + * @ref SceneField::Rotation and @ref SceneField::Scaling fields that's + * present. Expects that at least one transformation field is present. + * @see @ref is2D(), @ref is3D(), @ref fieldSize(SceneField) const + */ + std::size_t transformationFieldSize() const; + /** * @brief 2D transformations as 3x3 float matrices * @m_since_latest @@ -2097,7 +2109,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * @ref SceneField::Transformation, @ref SceneField::Translation, * @ref SceneField::Rotation and @ref SceneField::Scaling fields that's * present. - * @see @ref fieldSize(SceneField) const + * @see @ref transformationFieldSize() */ void transformations2DInto(const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& fieldDestination) const; @@ -2110,7 +2122,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * of the views, returning the count of items actually extracted. The * @p offset is expected to not be larger than the field size, views * that are not @cpp nullptr @ce are expected to have the same size. - * @see @ref fieldSize(SceneField) const, + * @see @ref transformationFieldSize(), * @ref fieldObjectOffset(SceneField, UnsignedLong, std::size_t) const */ std::size_t transformations2DInto(std::size_t offset, const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& fieldDestination) const; @@ -2153,7 +2165,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * same as calling @ref mappingInto() with one of the * @ref SceneField::Translation, @ref SceneField::Rotation and * @ref SceneField::Scaling fields that's present. - * @see @ref fieldSize(SceneField) const + * @see @ref transformationFieldSize() */ void translationsRotationsScalings2DInto(const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& translationDestination, const Containers::StridedArrayView1D& rotationDestination, const Containers::StridedArrayView1D& scalingDestination) const; @@ -2166,7 +2178,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * of the views, returning the count of items actually extracted. The * @p offset is expected to not be larger than the field size, views * that are not @cpp nullptr @ce are expected to have the same size. - * @see @ref fieldSize(SceneField) const, + * @see @ref transformationFieldSize(), * @ref fieldObjectOffset(SceneField, UnsignedLong, std::size_t) const */ std::size_t translationsRotationsScalings2DInto(std::size_t offset, const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& translationDestination, const Containers::StridedArrayView1D& rotationDestination, const Containers::StridedArrayView1D& scalingDestination) const; @@ -2204,7 +2216,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * @ref SceneField::Transformation, @ref SceneField::Translation, * @ref SceneField::Rotation and @ref SceneField::Scaling fields that's * present. - * @see @ref fieldSize(SceneField) const + * @see @ref transformationFieldSize() */ void transformations3DInto(const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& destination) const; @@ -2217,7 +2229,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * of the views, returning the count of items actually extracted. The * @p offset is expected to not be larger than the field size, views * that are not @cpp nullptr @ce are expected to have the same size. - * @see @ref fieldSize(SceneField) const, + * @see @ref transformationFieldSize(), * @ref fieldObjectOffset(SceneField, UnsignedLong, std::size_t) const */ std::size_t transformations3DInto(std::size_t offset, const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& destination) const; @@ -2260,7 +2272,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * same as calling @ref mappingInto() with one of the * @ref SceneField::Translation, @ref SceneField::Rotation and * @ref SceneField::Scaling fields that's present. - * @see @ref fieldSize(SceneField) const + * @see @ref transformationFieldSize() */ void translationsRotationsScalings3DInto(const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& translationDestination, const Containers::StridedArrayView1D& rotationDestination, const Containers::StridedArrayView1D& scalingDestination) const; @@ -2273,7 +2285,7 @@ class MAGNUM_TRADE_EXPORT SceneData { * of the views, returning the count of items actually extracted. The * @p offset is expected to not be larger than the field size, views * that are not @cpp nullptr @ce are expected to have the same size. - * @see @ref fieldSize(SceneField) const, + * @see @ref transformationFieldSize(), * @ref fieldObjectOffset(SceneField, UnsignedLong, std::size_t) const */ std::size_t translationsRotationsScalings3DInto(std::size_t offset, const Containers::StridedArrayView1D& mappingDestination, const Containers::StridedArrayView1D& translationDestination, const Containers::StridedArrayView1D& rotationDestination, const Containers::StridedArrayView1D& scalingDestination) const; diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index c0a35b9ff..b6bcbc7ce 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -1358,6 +1358,9 @@ void SceneDataTest::construct() { /* is2D() / is3D() exhaustively tested in transformations*DAsArray[TRS]() and constructZeroFields() */ + /* transformationFieldSize() exhaustively tested in + transformations*DAsArray[TRS]() */ + /* Field property access by ID */ CORRADE_COMPARE(scene.fieldName(0), SceneField::Transformation); CORRADE_COMPARE(scene.fieldName(1), SceneField::Parent); @@ -2702,6 +2705,7 @@ template void SceneDataTest::transformations2DAsArray() { CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 4); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3::translation({3.0f, 2.0f})}, {0, Matrix3::rotation(35.0_degf)}, @@ -2755,6 +2759,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3::translation({3.0f, 2.0f})}, {0, Matrix3{Math::IdentityInit}}, @@ -2775,6 +2780,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3{Math::IdentityInit}}, {0, Matrix3::rotation(35.0_degf)}, @@ -2795,6 +2801,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3{Math::IdentityInit}}, {0, Matrix3{Math::IdentityInit}}, @@ -2819,6 +2826,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3::translation({3.0f, 2.0f})}, {0, Matrix3::rotation(35.0_degf)}, @@ -2840,6 +2848,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3::translation({3.0f, 2.0f})}, {0, Matrix3{Math::IdentityInit}}, @@ -2861,6 +2870,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3{Math::IdentityInit}}, {0, Matrix3::rotation(35.0_degf)}, @@ -2886,6 +2896,7 @@ template void SceneDataTest::transformations2DAsArray }}; CORRADE_VERIFY(scene.is2D()); CORRADE_VERIFY(!scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView>({ {1, Matrix3::translation({3.0f, 2.0f})}, {0, Matrix3::rotation(35.0_degf)}, @@ -3296,6 +3307,7 @@ template void SceneDataTest::transformations3DAsArray() { CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 4); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4::translation({3.0f, 2.0f, -0.5f})}, {0, Matrix4::rotationY(35.0_degf)}, @@ -3349,6 +3361,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4::translation({3.0f, 2.0, 1.0f})}, {0, Matrix4{Math::IdentityInit}}, @@ -3369,6 +3382,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4{Math::IdentityInit}}, {0, Matrix4::rotationY(35.0_degf)}, @@ -3389,6 +3403,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4{Math::IdentityInit}}, {0, Matrix4{Math::IdentityInit}}, @@ -3413,6 +3428,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4::translation({3.0f, 2.0, 1.0f})}, {0, Matrix4::rotationY(35.0_degf)}, @@ -3434,6 +3450,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4::translation({3.0f, 2.0, 1.0f})}, {0, Matrix4{Math::IdentityInit}}, @@ -3455,6 +3472,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4{Math::IdentityInit}}, {0, Matrix4::rotationY(35.0_degf)}, @@ -3480,6 +3498,7 @@ template void SceneDataTest::transformations3DAsArray }}; CORRADE_VERIFY(!scene.is2D()); CORRADE_VERIFY(scene.is3D()); + CORRADE_COMPARE(scene.transformationFieldSize(), 5); CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView>({ {1, Matrix4::translation({3.0f, 2.0, 1.0f})}, {0, Matrix4::rotationY(35.0_degf)}, @@ -4670,6 +4689,7 @@ void SceneDataTest::fieldNotFound() { scene.parentsAsArray(); scene.parentsInto(nullptr, nullptr); scene.parentsInto(0, nullptr, nullptr); + scene.transformationFieldSize(); scene.transformations2DAsArray(); scene.transformations2DInto(nullptr, nullptr); scene.transformations2DInto(0, nullptr, nullptr); @@ -4735,6 +4755,7 @@ void SceneDataTest::fieldNotFound() { "Trade::SceneData::parentsInto(): field not found\n" "Trade::SceneData::parentsInto(): field not found\n" "Trade::SceneData::parentsInto(): field not found\n" + "Trade::SceneData::transformationFieldSize(): no transformation-related field found\n" "Trade::SceneData::transformations2DInto(): no transformation-related field found\n" "Trade::SceneData::transformations2DInto(): no transformation-related field found\n" "Trade::SceneData::transformations2DInto(): no transformation-related field found\n"