Browse Source

Trade: add SceneData::transformationFieldSize().

pull/542/merge
Vladimír Vondruš 4 years ago
parent
commit
72d20475c6
  1. 8
      src/Magnum/Trade/SceneData.cpp
  2. 28
      src/Magnum/Trade/SceneData.h
  3. 21
      src/Magnum/Trade/Test/SceneDataTest.cpp

8
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<Matrix3>& destination) const {
/* *FieldId, offset and destination.size() is assumed to be in bounds (or
an invalid field ID), checked by the callers */

28
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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Int>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Matrix3>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Matrix3>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Vector2>& translationDestination, const Containers::StridedArrayView1D<Complex>& rotationDestination, const Containers::StridedArrayView1D<Vector2>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Vector2>& translationDestination, const Containers::StridedArrayView1D<Complex>& rotationDestination, const Containers::StridedArrayView1D<Vector2>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Matrix4>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Matrix4>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Vector3>& translationDestination, const Containers::StridedArrayView1D<Quaternion>& rotationDestination, const Containers::StridedArrayView1D<Vector3>& 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<UnsignedInt>& mappingDestination, const Containers::StridedArrayView1D<Vector3>& translationDestination, const Containers::StridedArrayView1D<Quaternion>& rotationDestination, const Containers::StridedArrayView1D<Vector3>& scalingDestination) const;

21
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<class T> void SceneDataTest::transformations2DAsArray() {
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 4);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3::translation({3.0f, 2.0f})},
{0, Matrix3::rotation(35.0_degf)},
@ -2755,6 +2759,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3::translation({3.0f, 2.0f})},
{0, Matrix3{Math::IdentityInit}},
@ -2775,6 +2780,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3{Math::IdentityInit}},
{0, Matrix3::rotation(35.0_degf)},
@ -2795,6 +2801,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3{Math::IdentityInit}},
{0, Matrix3{Math::IdentityInit}},
@ -2819,6 +2826,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3::translation({3.0f, 2.0f})},
{0, Matrix3::rotation(35.0_degf)},
@ -2840,6 +2848,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3::translation({3.0f, 2.0f})},
{0, Matrix3{Math::IdentityInit}},
@ -2861,6 +2870,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3{Math::IdentityInit}},
{0, Matrix3::rotation(35.0_degf)},
@ -2886,6 +2896,7 @@ template<class T, class U, class V> void SceneDataTest::transformations2DAsArray
}};
CORRADE_VERIFY(scene.is2D());
CORRADE_VERIFY(!scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations2DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix3>>({
{1, Matrix3::translation({3.0f, 2.0f})},
{0, Matrix3::rotation(35.0_degf)},
@ -3296,6 +3307,7 @@ template<class T> void SceneDataTest::transformations3DAsArray() {
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 4);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4::translation({3.0f, 2.0f, -0.5f})},
{0, Matrix4::rotationY(35.0_degf)},
@ -3349,6 +3361,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4::translation({3.0f, 2.0, 1.0f})},
{0, Matrix4{Math::IdentityInit}},
@ -3369,6 +3382,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4{Math::IdentityInit}},
{0, Matrix4::rotationY(35.0_degf)},
@ -3389,6 +3403,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4{Math::IdentityInit}},
{0, Matrix4{Math::IdentityInit}},
@ -3413,6 +3428,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4::translation({3.0f, 2.0, 1.0f})},
{0, Matrix4::rotationY(35.0_degf)},
@ -3434,6 +3450,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4::translation({3.0f, 2.0, 1.0f})},
{0, Matrix4{Math::IdentityInit}},
@ -3455,6 +3472,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{1, Matrix4{Math::IdentityInit}},
{0, Matrix4::rotationY(35.0_degf)},
@ -3480,6 +3498,7 @@ template<class T, class U, class V> void SceneDataTest::transformations3DAsArray
}};
CORRADE_VERIFY(!scene.is2D());
CORRADE_VERIFY(scene.is3D());
CORRADE_COMPARE(scene.transformationFieldSize(), 5);
CORRADE_COMPARE_AS(scene.transformations3DAsArray(), (Containers::arrayView<Containers::Pair<UnsignedInt, Matrix4>>({
{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"

Loading…
Cancel
Save