Browse Source

Trade: ensure the deprecated SceneData constructor uses default deleters.

Otherwise the instances wouldn't be usable from AbstractImporter
subclasses.
pull/525/head
Vladimír Vondruš 5 years ago
parent
commit
4602248cd0
  1. 8
      src/Magnum/Trade/SceneData.cpp
  2. 5
      src/Magnum/Trade/Test/SceneDataTest.cpp

8
src/Magnum/Trade/SceneData.cpp

@ -749,9 +749,11 @@ SceneData::SceneData(std::vector<UnsignedInt> children2D, std::vector<UnsignedIn
{NoInit, children.size(), objects},
{NoInit, children.size(), parents},
};
_fields = {InPlaceInit, {
SceneFieldData{SceneField::Parent, objects, parents}
}};
/* Can't use InPlaceInit as that creates an Array with a non-default
deleter, which then trips up on an assertion when such an instance gets
returned from AbstractImporter */
_fields = Containers::Array<SceneFieldData>{1};
_fields[0] = SceneFieldData{SceneField::Parent, objects, parents};
Utility::copy(children, objects);
constexpr Int parent[]{-1};
Utility::copy(Containers::stridedArrayView(parent).broadcasted<0>(parents.size()), parents);

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

@ -1508,6 +1508,11 @@ void SceneDataTest::constructDeprecated() {
is set directly */
CORRADE_COMPARE(scene.is2D(), data.is2D);
CORRADE_COMPARE(scene.is3D(), data.is3D);
/* The deleters have to be trivial, otherwise this instance wouldn't be
usable from an AbstractImporter */
CORRADE_VERIFY(!scene.releaseFieldData().deleter());
CORRADE_VERIFY(!scene.releaseData().deleter());
}
void SceneDataTest::constructDeprecatedBoth2DAnd3D() {

Loading…
Cancel
Save