diff --git a/src/Primitives/Icosphere.cpp b/src/Primitives/Icosphere.cpp index b6f09d32c..452e38eb3 100644 --- a/src/Primitives/Icosphere.cpp +++ b/src/Primitives/Icosphere.cpp @@ -55,7 +55,7 @@ Trade::MeshData3D Icosphere::solid(const UnsignedInt subdivisions) { 4, 8, 0 }; - std::vector vertices{ + std::vector positions{ {0.0f, -0.525731f, 0.850651f}, {0.850651f, 0.0f, 0.525731f}, {0.850651f, 0.0f, -0.525731f}, @@ -71,12 +71,14 @@ Trade::MeshData3D Icosphere::solid(const UnsignedInt subdivisions) { }; for(std::size_t i = 0; i != subdivisions; ++i) - MeshTools::subdivide(indices, vertices, [](const Vector3& a, const Vector3& b) { + MeshTools::subdivide(indices, positions, [](const Vector3& a, const Vector3& b) { return (a+b).normalized(); }); - MeshTools::removeDuplicates(indices, vertices); - return Trade::MeshData3D(Mesh::Primitive::Triangles, std::move(indices), {vertices}, {std::move(vertices)}, {}); + MeshTools::removeDuplicates(indices, positions); + + std::vector normals(positions); + return Trade::MeshData3D(Mesh::Primitive::Triangles, std::move(indices), {std::move(positions)}, {std::move(normals)}, {}); } }} diff --git a/src/Primitives/Test/CMakeLists.txt b/src/Primitives/Test/CMakeLists.txt index b12e72032..c47b2a92b 100644 --- a/src/Primitives/Test/CMakeLists.txt +++ b/src/Primitives/Test/CMakeLists.txt @@ -25,4 +25,5 @@ corrade_add_test(PrimitivesCapsuleTest CapsuleTest.cpp LIBRARIES MagnumPrimitives) corrade_add_test(PrimitivesCircleTest CircleTest.cpp LIBRARIES MagnumPrimitives) corrade_add_test(PrimitivesCylinderTest CylinderTest.cpp LIBRARIES MagnumPrimitives) +corrade_add_test(PrimitivesIcosphereTest IcosphereTest.cpp LIBRARIES MagnumPrimitives) corrade_add_test(PrimitivesUVSphereTest UVSphereTest.cpp LIBRARIES MagnumPrimitives) diff --git a/src/Primitives/Test/IcosphereTest.cpp b/src/Primitives/Test/IcosphereTest.cpp new file mode 100644 index 000000000..e6f6d13db --- /dev/null +++ b/src/Primitives/Test/IcosphereTest.cpp @@ -0,0 +1,57 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include + +#include "Math/Vector3.h" +#include "Primitives/Icosphere.h" +#include "Trade/MeshData3D.h" + +namespace Magnum { namespace Primitives { namespace Test { + +class IcosphereTest: public TestSuite::Tester { + public: + explicit IcosphereTest(); + + void count(); +}; + +IcosphereTest::IcosphereTest() { + addTests({&IcosphereTest::count}); +} + +void IcosphereTest::count() { + Trade::MeshData3D data = Primitives::Icosphere::solid(2); + + CORRADE_COMPARE(data.positionArrayCount(), 1); + CORRADE_COMPARE(data.normalArrayCount(), 1); + + CORRADE_COMPARE(data.indices().size(), 960); + CORRADE_COMPARE(data.positions(0).size(), 162); + CORRADE_COMPARE(data.normals(0).size(), 162); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Primitives::Test::IcosphereTest)