diff options
-rw-r--r-- | src/animation/backend/animationutils.cpp | 18 | ||||
-rw-r--r-- | src/animation/backend/animationutils_p.h | 4 | ||||
-rw-r--r-- | tests/auto/animation/animationutils/tst_animationutils.cpp | 68 |
3 files changed, 90 insertions, 0 deletions
diff --git a/src/animation/backend/animationutils.cpp b/src/animation/backend/animationutils.cpp index 8f1a681d4..8b2ba6821 100644 --- a/src/animation/backend/animationutils.cpp +++ b/src/animation/backend/animationutils.cpp @@ -369,6 +369,24 @@ QVector<Qt3DCore::QNodeId> gatherValueNodesToEvaluate(Handler *handler, return clipIds; } +ClipResults formatClipResults(const ClipResults &rawClipResults, + const ComponentIndices &format) +{ + // Resize the output to match the number of indices + const int elementCount = format.size(); + ClipResults formattedClipResults(elementCount); + + // Perform a gather operation to format the data + // TODO: For large numbers of components do this in parallel with + // for e.g. a parallel_for() like construct + for (int i = 0; i < elementCount; ++i) { + const float value = format[i] != -1 ? rawClipResults[format[i]] : 0.0f; + formattedClipResults[i] = value; + } + + return formattedClipResults; +} + ClipResults evaluateBlendTree(Handler *handler, BlendedClipAnimator *animator, Qt3DCore::QNodeId blendTreeRootId) diff --git a/src/animation/backend/animationutils_p.h b/src/animation/backend/animationutils_p.h index da85451f8..705e37c34 100644 --- a/src/animation/backend/animationutils_p.h +++ b/src/animation/backend/animationutils_p.h @@ -173,6 +173,10 @@ QVector<Qt3DCore::QNodeId> gatherValueNodesToEvaluate(Handler *handler, Qt3DCore::QNodeId blendTreeRootId); Q_AUTOTEST_EXPORT +ClipResults formatClipResults(const ClipResults &rawClipResults, + const ComponentIndices &format); + +Q_AUTOTEST_EXPORT ClipResults evaluateBlendTree(Handler *handler, BlendedClipAnimator *animator, Qt3DCore::QNodeId blendNodeId); diff --git a/tests/auto/animation/animationutils/tst_animationutils.cpp b/tests/auto/animation/animationutils/tst_animationutils.cpp index dcdbafdae..6f0c998e6 100644 --- a/tests/auto/animation/animationutils/tst_animationutils.cpp +++ b/tests/auto/animation/animationutils/tst_animationutils.cpp @@ -1885,6 +1885,74 @@ private Q_SLOTS: // Cleanup delete handler; } + + void checkFormatClipResults_data() + { + QTest::addColumn<ClipResults>("rawClipResults"); + QTest::addColumn<ComponentIndices>("format"); + QTest::addColumn<ClipResults>("expectedResults"); + + { + ClipResults rawClipResults = { 1.0f, 2.0f, 3.0f }; + ComponentIndices format = { 0, 1, 2 }; + ClipResults expectedResults = { 1.0f, 2.0f, 3.0f }; + + QTest::newRow("identity") + << rawClipResults << format << expectedResults; + } + + { + ClipResults rawClipResults = { 1.0f, 2.0f }; + ComponentIndices format = { 1, 0 }; + ClipResults expectedResults = { 2.0f, 1.0f }; + + QTest::newRow("swap") + << rawClipResults << format << expectedResults; + } + + { + ClipResults rawClipResults = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f }; + ComponentIndices format = { 0, 2, 1, 3, 4 }; + ClipResults expectedResults = { 1.0f, 3.0f, 2.0f, 4.0f, 5.0f }; + + QTest::newRow("swap subset") + << rawClipResults << format << expectedResults; + } + + { + ClipResults rawClipResults = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f }; + ComponentIndices format = { 4, 3, 2, 1, 0 }; + ClipResults expectedResults = { 5.0f, 4.0f, 3.0f, 2.0f, 1.0f }; + + QTest::newRow("reverse") + << rawClipResults << format << expectedResults; + } + + { + ClipResults rawClipResults = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f }; + ComponentIndices format = { 0, 1, -1, 3, 4 }; + ClipResults expectedResults = { 1.0f, 2.0f, 0.0f, 4.0f, 5.0f }; + + QTest::newRow("include missing") + << rawClipResults << format << expectedResults; + } + } + + void checkFormatClipResults() + { + // GIVEN + QFETCH(ClipResults, rawClipResults); + QFETCH(ComponentIndices, format); + QFETCH(ClipResults, expectedResults); + + // WHEN + const ClipResults actualResults = formatClipResults(rawClipResults, format); + + // THEN + QCOMPARE(actualResults.size(), expectedResults.size()); + for (int i = 0; i < actualResults.size(); ++i) + QCOMPARE(actualResults[i], expectedResults[i]); + } }; QTEST_MAIN(tst_AnimationUtils) |