From ccd3d24185434d61ed34c44815641beb9b48e836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 19 Nov 2019 17:33:20 +0100 Subject: [PATCH] Trade: add (deprecated) implicit conversion of MeshData to MeshDataXD. --- src/Magnum/Trade/CMakeLists.txt | 12 +- src/Magnum/Trade/MeshData2D.cpp | 31 +++++ src/Magnum/Trade/MeshData2D.h | 13 ++- src/Magnum/Trade/MeshData3D.cpp | 36 ++++++ src/Magnum/Trade/MeshData3D.h | 13 ++- src/Magnum/Trade/Test/MeshData2DTest.cpp | 124 ++++++++++++++------ src/Magnum/Trade/Test/MeshData3DTest.cpp | 141 ++++++++++++++++------- 7 files changed, 287 insertions(+), 83 deletions(-) diff --git a/src/Magnum/Trade/CMakeLists.txt b/src/Magnum/Trade/CMakeLists.txt index 1b07fc5e1..cf4b2a93d 100644 --- a/src/Magnum/Trade/CMakeLists.txt +++ b/src/Magnum/Trade/CMakeLists.txt @@ -30,8 +30,6 @@ set(MagnumTrade_SRCS ArrayAllocator.cpp Data.cpp LightData.cpp - MeshData2D.cpp - MeshData3D.cpp MeshObjectData2D.cpp MeshObjectData3D.cpp SceneData.cpp @@ -44,6 +42,16 @@ set(MagnumTrade_GracefulAssert_SRCS CameraData.cpp ImageData.cpp MeshData.cpp + + # These have to be here instead of in MagnumTrade_SRCS because they include + # MeshData.h and call (and thus instantiate) various functions with inline + # asserts. We need the linker to pick the variant with graceful asserts for + # tests, and if there would be two different copies, it may happen it picks + # the non-graceful-assert variant, causing the tests to blow up. Happens + # only on the MSVC linker, but let's be safe and do this everywhere. + MeshData2D.cpp + MeshData3D.cpp + ObjectData2D.cpp ObjectData3D.cpp PhongMaterialData.cpp) diff --git a/src/Magnum/Trade/MeshData2D.cpp b/src/Magnum/Trade/MeshData2D.cpp index 253887aed..ecebb7746 100644 --- a/src/Magnum/Trade/MeshData2D.cpp +++ b/src/Magnum/Trade/MeshData2D.cpp @@ -25,6 +25,8 @@ #include "MeshData2D.h" +#include + #include "Magnum/Math/Color.h" namespace Magnum { namespace Trade { @@ -33,6 +35,35 @@ MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData2D: no position array specified", ); } +#ifdef MAGNUM_BUILD_DEPRECATED +MeshData2D::MeshData2D(const MeshData& other): _primitive{other.primitive()}, _importerState{other.importerState()} { + /* Copy indices, if any */ + if(other.isIndexed()) { + _indices.resize(other.indexCount()); + other.indicesInto(_indices); + } + + /* Copy attributes */ + _positions.resize(other.attributeCount(MeshAttribute::Position)); + for(UnsignedInt i = 0; i != _positions.size(); ++i) { + _positions[i].resize(other.vertexCount()); + other.positions2DInto(_positions[i], i); + } + _textureCoords2D.resize(other.attributeCount(MeshAttribute::TextureCoordinates)); + for(UnsignedInt i = 0; i != _textureCoords2D.size(); ++i) { + _textureCoords2D[i].resize(other.vertexCount()); + other.textureCoordinates2DInto(_textureCoords2D[i], i); + } + _colors.resize(other.attributeCount(MeshAttribute::Color)); + for(UnsignedInt i = 0; i != _colors.size(); ++i) { + _colors[i].resize(other.vertexCount()); + other.colorsInto(_colors[i], i); + } + + CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified in MeshData", ); +} +#endif + MeshData2D::MeshData2D(MeshData2D&&) #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 noexcept diff --git a/src/Magnum/Trade/MeshData2D.h b/src/Magnum/Trade/MeshData2D.h index 31f2c6d00..52170fa31 100644 --- a/src/Magnum/Trade/MeshData2D.h +++ b/src/Magnum/Trade/MeshData2D.h @@ -31,8 +31,7 @@ #include -#include "Magnum/Magnum.h" -#include "Magnum/Trade/visibility.h" +#include "Magnum/Trade/MeshData.h" namespace Magnum { namespace Trade { @@ -67,6 +66,16 @@ class MAGNUM_TRADE_EXPORT MeshData2D { */ explicit MeshData2D(MeshPrimitive primitive, std::vector indices, std::vector> positions, std::vector> textureCoords2D, std::vector> colors, const void* importerState = nullptr); + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @brief Construct from @ref MeshData + * @m_deprecated_since_latest Use @ref MeshData directly instead. + */ + /* No data moving can take place because std::vector is damn shitty + regarding memory ownership transfer, so it can well be a copy. */ + CORRADE_DEPRECATED("use MeshData directly instead") /*implicit*/ MeshData2D(const MeshData& other); + #endif + /** @brief Copying is not allowed */ MeshData2D(const MeshData2D&) = delete; diff --git a/src/Magnum/Trade/MeshData3D.cpp b/src/Magnum/Trade/MeshData3D.cpp index 4556256df..edb21cd2a 100644 --- a/src/Magnum/Trade/MeshData3D.cpp +++ b/src/Magnum/Trade/MeshData3D.cpp @@ -25,6 +25,8 @@ #include "MeshData3D.h" +#include + #include "Magnum/Math/Color.h" namespace Magnum { namespace Trade { @@ -33,6 +35,40 @@ MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified", ); } +#ifdef MAGNUM_BUILD_DEPRECATED +MeshData3D::MeshData3D(const MeshData& other): _primitive{other.primitive()}, _importerState{other.importerState()} { + /* Copy indices, if any */ + if(other.isIndexed()) { + _indices.resize(other.indexCount()); + other.indicesInto(_indices); + } + + /* Copy attributes */ + _positions.resize(other.attributeCount(MeshAttribute::Position)); + for(UnsignedInt i = 0; i != _positions.size(); ++i) { + _positions[i].resize(other.vertexCount()); + other.positions3DInto(_positions[i], i); + } + _normals.resize(other.attributeCount(MeshAttribute::Normal)); + for(UnsignedInt i = 0; i != _normals.size(); ++i) { + _normals[i].resize(other.vertexCount()); + other.normalsInto(_normals[i], i); + } + _textureCoords2D.resize(other.attributeCount(MeshAttribute::TextureCoordinates)); + for(UnsignedInt i = 0; i != _textureCoords2D.size(); ++i) { + _textureCoords2D[i].resize(other.vertexCount()); + other.textureCoordinates2DInto(_textureCoords2D[i], i); + } + _colors.resize(other.attributeCount(MeshAttribute::Color)); + for(UnsignedInt i = 0; i != _colors.size(); ++i) { + _colors[i].resize(other.vertexCount()); + other.colorsInto(_colors[i], i); + } + + CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified in MeshData", ); +} +#endif + MeshData3D::MeshData3D(MeshData3D&&) #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 noexcept diff --git a/src/Magnum/Trade/MeshData3D.h b/src/Magnum/Trade/MeshData3D.h index 0dea37579..c17416783 100644 --- a/src/Magnum/Trade/MeshData3D.h +++ b/src/Magnum/Trade/MeshData3D.h @@ -31,8 +31,7 @@ #include -#include "Magnum/Magnum.h" -#include "Magnum/Trade/visibility.h" +#include "Magnum/Trade/MeshData.h" namespace Magnum { namespace Trade { @@ -68,6 +67,16 @@ class MAGNUM_TRADE_EXPORT MeshData3D { */ explicit MeshData3D(MeshPrimitive primitive, std::vector indices, std::vector> positions, std::vector> normals, std::vector> textureCoords2D, std::vector> colors, const void* importerState = nullptr); + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @brief Construct from @ref MeshData + * @m_deprecated_since_latest Use @ref MeshData directly instead. + */ + /* No data moving can take place because std::vector is damn shitty + regarding memory ownership transfer, so it can well be a copy. */ + CORRADE_DEPRECATED("use MeshData directly instead") /*implicit*/ MeshData3D(const MeshData& other); + #endif + /** @brief Copying is not allowed */ MeshData3D(const MeshData3D&) = delete; diff --git a/src/Magnum/Trade/Test/MeshData2DTest.cpp b/src/Magnum/Trade/Test/MeshData2DTest.cpp index 315e8db64..34a38b0c8 100644 --- a/src/Magnum/Trade/Test/MeshData2DTest.cpp +++ b/src/Magnum/Trade/Test/MeshData2DTest.cpp @@ -42,59 +42,111 @@ struct MeshData2DTest: TestSuite::Tester { void constructMove(); }; +using namespace Math::Literals; + +const UnsignedByte Indices[]{12, 1, 0}; +const struct Vertex { + Vector2 position1, position2; + Vector2 textureCoords1, textureCoords2, textureCoords3; + Color4 color; +} Vertices[] { + {{0.5f, 1.0f}, {1.4f, 0.2f}, + {0.0f, 0.0f}, {0.1f, 0.2f}, {0.0f, 0.0f}, + 0xff98ab_rgbf}, + {{-1.0f, 0.3f}, {1.1f, 0.13f}, + {0.3f, 0.7f}, {0.7f, 1.0f}, {1.0f, 1.0f}, + 0xff3366_rgbf} +}; +const int State = 3; + +CORRADE_IGNORE_DEPRECATED_PUSH +struct { + const char* name; + const MeshData2D data, dataNonIndexed; +} ConstructData[] { + {"", + MeshData2D{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}, + {{1.4f, 0.2f}, {1.1f, 0.13f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}, + {{0.1f, 0.2f}, {0.7f, 1.0f}}, + {{0.0f, 0.0f}, {1.0f, 1.0f}}}, + {{0xff98ab_rgbf, 0xff3366_rgbf}}, + &State}, + MeshData2D{MeshPrimitive::Lines, {}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + {{0xff98ab_rgbf, 0xff3366_rgbf}}, + &State}}, + {"from MeshData", + MeshData{MeshPrimitive::Lines, {}, Indices, MeshIndexData{Indices}, {}, Vertices, { + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position2, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords2, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords3, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Color, + Containers::StridedArrayView1D{Vertices, &Vertices[0].color, 2, sizeof(Vertex)}}, + }, &State}, + MeshData{MeshPrimitive::Lines, {}, Vertices, { + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Color, + Containers::StridedArrayView1D{Vertices, &Vertices[0].color, 2, sizeof(Vertex)}}, + }, &State} + } +}; +CORRADE_IGNORE_DEPRECATED_POP + MeshData2DTest::MeshData2DTest() { - addTests({&MeshData2DTest::construct, - &MeshData2DTest::constructNonIndexed, - &MeshData2DTest::constructNoTexCoords, + addInstancedTests({&MeshData2DTest::construct, + &MeshData2DTest::constructNonIndexed}, + Containers::arraySize(ConstructData)); + + addTests({&MeshData2DTest::constructNoTexCoords, &MeshData2DTest::constructNoColors, &MeshData2DTest::constructCopy, &MeshData2DTest::constructMove}); } -using namespace Math::Literals; - void MeshData2DTest::construct() { - const int a{}; - const MeshData2D data{MeshPrimitive::Lines, {12, 1, 0}, - {{{0.5f, 1.0f}, {-1.0f, 0.3f}}, - {{1.4f, 0.2f}, {1.1f, 0.13f}}}, - {{{0.0f, 0.0f}, {0.3f, 0.7f}}, - {{0.1f, 0.2f}, {0.7f, 1.0f}}, - {{0.0f, 0.0f}, {1.0f, 1.0f}}}, - {{0xff98ab_rgbf, 0xff3366_rgbf}}, - &a}; + auto&& data = ConstructData[testCaseInstanceId()]; + setTestCaseDescription(data.name); - CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines); + CORRADE_COMPARE(data.data.primitive(), MeshPrimitive::Lines); - CORRADE_VERIFY(data.isIndexed()); - CORRADE_COMPARE(data.indices(), (std::vector{12, 1, 0})); + CORRADE_VERIFY(data.data.isIndexed()); + CORRADE_COMPARE(data.data.indices(), (std::vector{12, 1, 0})); - CORRADE_COMPARE(data.positionArrayCount(), 2); - CORRADE_COMPARE(data.positions(0), (std::vector{{0.5f, 1.0f}, {-1.0f, 0.3f}})); - CORRADE_COMPARE(data.positions(1), (std::vector{{1.4f, 0.2f}, {1.1f, 0.13f}})); + CORRADE_COMPARE(data.data.positionArrayCount(), 2); + CORRADE_COMPARE(data.data.positions(0), (std::vector{{0.5f, 1.0f}, {-1.0f, 0.3f}})); + CORRADE_COMPARE(data.data.positions(1), (std::vector{{1.4f, 0.2f}, {1.1f, 0.13f}})); - CORRADE_VERIFY(data.hasTextureCoords2D()); - CORRADE_COMPARE(data.textureCoords2DArrayCount(), 3); - CORRADE_COMPARE(data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); - CORRADE_COMPARE(data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); - CORRADE_COMPARE(data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); + CORRADE_VERIFY(data.data.hasTextureCoords2D()); + CORRADE_COMPARE(data.data.textureCoords2DArrayCount(), 3); + CORRADE_COMPARE(data.data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(data.data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); + CORRADE_COMPARE(data.data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); - CORRADE_VERIFY(data.hasColors()); - CORRADE_COMPARE(data.colorArrayCount(), 1); - CORRADE_COMPARE(data.colors(0), (std::vector{0xff98ab_rgbf, 0xff3366_rgbf})); + CORRADE_VERIFY(data.data.hasColors()); + CORRADE_COMPARE(data.data.colorArrayCount(), 1); + CORRADE_COMPARE(data.data.colors(0), (std::vector{0xff98ab_rgbf, 0xff3366_rgbf})); - CORRADE_COMPARE(data.importerState(), &a); + CORRADE_COMPARE(data.data.importerState(), &State); } void MeshData2DTest::constructNonIndexed() { - const int a{}; - const MeshData2D data{MeshPrimitive::Lines, {}, - {{{0.5f, 1.0f}, {-1.0f, 0.3f}}}, - {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, - {{0xff98ab_rgbf, 0xff3366_rgbf}}, - &a}; + auto&& data = ConstructData[testCaseInstanceId()]; + setTestCaseDescription(data.name); - CORRADE_VERIFY(!data.isIndexed()); + CORRADE_VERIFY(!data.dataNonIndexed.isIndexed()); } void MeshData2DTest::constructNoTexCoords() { diff --git a/src/Magnum/Trade/Test/MeshData3DTest.cpp b/src/Magnum/Trade/Test/MeshData3DTest.cpp index 937e3ccd1..1244120ad 100644 --- a/src/Magnum/Trade/Test/MeshData3DTest.cpp +++ b/src/Magnum/Trade/Test/MeshData3DTest.cpp @@ -43,66 +43,125 @@ struct MeshData3DTest: TestSuite::Tester { void constructMove(); }; +using namespace Math::Literals; + +const UnsignedByte Indices[]{12, 1, 0}; +const struct Vertex { + Vector3 position1, position2; + Vector3 normal; + Vector2 textureCoords1, textureCoords2, textureCoords3; + Color4 color; +} Vertices[] { + {{0.5f, 1.0f, 0.1f}, {1.4f, 0.2f, 0.5f}, + {0.0f, 1.0f, 0.0f}, + {0.0f, 0.0f}, {0.1f, 0.2f}, {0.0f, 0.0f}, + 0xff98ab_rgbf}, + {{-1.0f, 0.3f, -1.0f}, {1.1f, 0.13f, -0.3f}, + {-1.0f, 0.0f, 0.0f}, + {0.3f, 0.7f}, {0.7f, 1.0f}, {1.0f, 1.0f}, + 0xff3366_rgbf} +}; +const int State = 3; + +CORRADE_IGNORE_DEPRECATED_PUSH +struct { + const char* name; + const MeshData3D data, dataNonIndexed; +} ConstructData[] { + {"", + MeshData3D{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}, + {{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}, + {{0.1f, 0.2f}, {0.7f, 1.0f}}, + {{0.0f, 0.0f}, {1.0f, 1.0f}}}, + {{0xff98ab_rgbf, 0xff3366_rgbf}}, + &State}, + MeshData3D{MeshPrimitive::Lines, {}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + {{0xff98ab_rgbf, 0xff3366_rgbf}}, + &State}}, + {"from MeshData", + MeshData{MeshPrimitive::Lines, {}, Indices, MeshIndexData{Indices}, {}, Vertices, { + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position2, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Normal, + Containers::StridedArrayView1D{Vertices, &Vertices[0].normal, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords2, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords3, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Color, + Containers::StridedArrayView1D{Vertices, &Vertices[0].color, 2, sizeof(Vertex)}}, + }, &State}, + MeshData{MeshPrimitive::Lines, {}, Vertices, { + MeshAttributeData{MeshAttribute::Position, + Containers::StridedArrayView1D{Vertices, &Vertices[0].position1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Normal, + Containers::StridedArrayView1D{Vertices, &Vertices[0].normal, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::TextureCoordinates, + Containers::StridedArrayView1D{Vertices, &Vertices[0].textureCoords1, 2, sizeof(Vertex)}}, + MeshAttributeData{MeshAttribute::Color, + Containers::StridedArrayView1D{Vertices, &Vertices[0].color, 2, sizeof(Vertex)}}, + }, &State} + } +}; +CORRADE_IGNORE_DEPRECATED_POP + MeshData3DTest::MeshData3DTest() { - addTests({&MeshData3DTest::construct, - &MeshData3DTest::constructNonIndexed, - &MeshData3DTest::constructNoNormals, + addInstancedTests({&MeshData3DTest::construct, + &MeshData3DTest::constructNonIndexed}, + Containers::arraySize(ConstructData)); + + addTests({&MeshData3DTest::constructNoNormals, &MeshData3DTest::constructNoTexCoords, &MeshData3DTest::constructNoColors, &MeshData3DTest::constructCopy, &MeshData3DTest::constructMove}); } -using namespace Math::Literals; - void MeshData3DTest::construct() { - const int a{}; - const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0}, - {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}, - {{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}}}, - {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, - {{{0.0f, 0.0f}, {0.3f, 0.7f}}, - {{0.1f, 0.2f}, {0.7f, 1.0f}}, - {{0.0f, 0.0f}, {1.0f, 1.0f}}}, - {{0xff98ab_rgbf, 0xff3366_rgbf}}, - &a}; + auto&& data = ConstructData[testCaseInstanceId()]; + setTestCaseDescription(data.name); - CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines); + CORRADE_COMPARE(data.data.primitive(), MeshPrimitive::Lines); - CORRADE_VERIFY(data.isIndexed()); - CORRADE_COMPARE(data.indices(), (std::vector{12, 1, 0})); + CORRADE_VERIFY(data.data.isIndexed()); + CORRADE_COMPARE(data.data.indices(), (std::vector{12, 1, 0})); - CORRADE_COMPARE(data.positionArrayCount(), 2); - CORRADE_COMPARE(data.positions(0), (std::vector{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}})); - CORRADE_COMPARE(data.positions(1), (std::vector{{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}})); + CORRADE_COMPARE(data.data.positionArrayCount(), 2); + CORRADE_COMPARE(data.data.positions(0), (std::vector{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}})); + CORRADE_COMPARE(data.data.positions(1), (std::vector{{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}})); - CORRADE_VERIFY(data.hasNormals()); - CORRADE_COMPARE(data.normalArrayCount(), 1); - CORRADE_COMPARE(data.normals(0), (std::vector{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}})); + CORRADE_VERIFY(data.data.hasNormals()); + CORRADE_COMPARE(data.data.normalArrayCount(), 1); + CORRADE_COMPARE(data.data.normals(0), (std::vector{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}})); - CORRADE_VERIFY(data.hasTextureCoords2D()); - CORRADE_COMPARE(data.textureCoords2DArrayCount(), 3); - CORRADE_COMPARE(data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); - CORRADE_COMPARE(data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); - CORRADE_COMPARE(data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); + CORRADE_VERIFY(data.data.hasTextureCoords2D()); + CORRADE_COMPARE(data.data.textureCoords2DArrayCount(), 3); + CORRADE_COMPARE(data.data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(data.data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); + CORRADE_COMPARE(data.data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); - CORRADE_VERIFY(data.hasColors()); - CORRADE_COMPARE(data.colorArrayCount(), 1); - CORRADE_COMPARE(data.colors(0), (std::vector{0xff98ab_rgbf, 0xff3366_rgbf})); + CORRADE_VERIFY(data.data.hasColors()); + CORRADE_COMPARE(data.data.colorArrayCount(), 1); + CORRADE_COMPARE(data.data.colors(0), (std::vector{0xff98ab_rgbf, 0xff3366_rgbf})); - CORRADE_COMPARE(data.importerState(), &a); + CORRADE_COMPARE(data.data.importerState(), &State); } void MeshData3DTest::constructNonIndexed() { - const int a{}; - const MeshData3D data{MeshPrimitive::Lines, {}, - {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, - {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, - {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, - {{0xff98ab_rgbf, 0xff3366_rgbf}}, - &a}; + auto&& data = ConstructData[testCaseInstanceId()]; + setTestCaseDescription(data.name); - CORRADE_VERIFY(!data.isIndexed()); + CORRADE_VERIFY(!data.dataNonIndexed.isIndexed()); } void MeshData3DTest::constructNoNormals() {