From 605d72c86c94a09deae58e938474469d30571c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Nov 2021 21:47:45 +0100 Subject: [PATCH] Trade: fix SceneData object view retrieval & test it more thoroughly. --- src/Magnum/Trade/SceneData.cpp | 2 +- src/Magnum/Trade/Test/SceneDataTest.cpp | 50 ++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index 44b9c685b..de9d247c3 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -782,7 +782,7 @@ Containers::StridedArrayView1D SceneData::fieldDataObjectViewInterna /* We're *sure* the view is correct, so faking the view size */ {static_cast(field._isOffsetOnly ? _data.data() + field._objectData.offset : field._objectData.pointer) - + field._fieldStride*offset, ~std::size_t{}}, + + field._objectStride*offset, ~std::size_t{}}, size, field._objectStride}; } diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index 2e87b43ef..57e20c495 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -90,6 +90,7 @@ struct SceneDataTest: TestSuite::Tester { void construct(); void constructZeroFields(); void constructZeroObjects(); + void constructSpecialStrides(); void constructNotOwned(); #ifdef MAGNUM_BUILD_DEPRECATED void constructDeprecated(); @@ -271,7 +272,8 @@ SceneDataTest::SceneDataTest() { &SceneDataTest::construct, &SceneDataTest::constructZeroFields, - &SceneDataTest::constructZeroObjects}); + &SceneDataTest::constructZeroObjects, + &SceneDataTest::constructSpecialStrides}); addInstancedTests({&SceneDataTest::constructNotOwned}, Containers::arraySize(NotOwnedData)); @@ -1446,6 +1448,52 @@ void SceneDataTest::constructZeroObjects() { CORRADE_COMPARE(scene.objects(SceneField::MeshMaterial).data(), nullptr); } +void SceneDataTest::constructSpecialStrides() { + Containers::StridedArrayView1D broadcastedData; + Containers::StridedArrayView1D nonBroadcastedData; + Containers::ArrayTuple data{ + {NoInit, 1, broadcastedData}, + {NoInit, 4, nonBroadcastedData} + }; + + broadcastedData[0] = 15; + nonBroadcastedData[0] = 1; + nonBroadcastedData[1] = 2; + nonBroadcastedData[2] = 3; + nonBroadcastedData[3] = 4; + + SceneFieldData broadcastedObjects{sceneFieldCustom(38), + broadcastedData.broadcasted<0>(4), nonBroadcastedData}; + SceneFieldData broadcastedFields{sceneFieldCustom(39), + nonBroadcastedData, broadcastedData.broadcasted<0>(4)}; + SceneFieldData flippedFields{sceneFieldCustom(40), + nonBroadcastedData.flipped<0>(), nonBroadcastedData.flipped<0>()}; + SceneData scene{SceneObjectType::UnsignedShort, 8, std::move(data), { + broadcastedObjects, broadcastedFields, flippedFields + }}; + + CORRADE_COMPARE_AS(scene.objects(0), + Containers::arrayView({15, 15, 15, 15}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.field(0), + Containers::arrayView({1, 2, 3, 4}), + TestSuite::Compare::Container); + + CORRADE_COMPARE_AS(scene.objects(1), + Containers::arrayView({1, 2, 3, 4}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.field(1), + Containers::arrayView({15, 15, 15, 15}), + TestSuite::Compare::Container); + + CORRADE_COMPARE_AS(scene.objects(2), + Containers::arrayView({4, 3, 2, 1}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.field(2), + Containers::arrayView({4, 3, 2, 1}), + TestSuite::Compare::Container); +} + void SceneDataTest::constructNotOwned() { auto&& instanceData = NotOwnedData[testCaseInstanceId()]; setTestCaseDescription(instanceData.name);