From 1701f1c42f90dab64e9335f38e7bd38837972539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 31 May 2013 23:31:40 +0200 Subject: [PATCH] MeshTools: added duplicate() utility for creating non-indexed array. --- src/MeshTools/CMakeLists.txt | 1 + src/MeshTools/Duplicate.h | 54 ++++++++++++++++++++++++++++ src/MeshTools/RemoveDuplicates.h | 1 + src/MeshTools/Test/CMakeLists.txt | 1 + src/MeshTools/Test/DuplicateTest.cpp | 50 ++++++++++++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 src/MeshTools/Duplicate.h create mode 100644 src/MeshTools/Test/DuplicateTest.cpp diff --git a/src/MeshTools/CMakeLists.txt b/src/MeshTools/CMakeLists.txt index ae2edb6cc..3ed711ac5 100644 --- a/src/MeshTools/CMakeLists.txt +++ b/src/MeshTools/CMakeLists.txt @@ -35,6 +35,7 @@ set(MagnumMeshTools_GracefulAssert_SRCS set(MagnumMeshTools_HEADERS CombineIndexedArrays.h CompressIndices.h + Duplicate.h FlipNormals.h GenerateFlatNormals.h Interleave.h diff --git a/src/MeshTools/Duplicate.h b/src/MeshTools/Duplicate.h new file mode 100644 index 000000000..f35549990 --- /dev/null +++ b/src/MeshTools/Duplicate.h @@ -0,0 +1,54 @@ +#ifndef Magnum_MeshTools_Duplicate_h +#define Magnum_MeshTools_Duplicate_h +/* + 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. +*/ + +/** @file + * @brief Function Magnum::MeshTools::duplicate() + */ + +#include + +#include "Types.h" + +namespace Magnum { namespace MeshTools { + +/** +@brief Duplicate vertices using index array + +Converts indexed array to non-indexed, for example vertices `{a, b, c, d}` with +index array `{1, 1, 0, 3, 2, 2}` will be converted to `{b, b, a, d, c, c}`. +@see removeDuplicates() +*/ +template std::vector duplicate(const std::vector& indices, const std::vector& vertices) { + std::vector out; + out.reserve(indices.size()); + for(const UnsignedInt index: indices) + out.push_back(vertices[index]); + return std::move(out); +} + +}} + +#endif diff --git a/src/MeshTools/RemoveDuplicates.h b/src/MeshTools/RemoveDuplicates.h index c588a0e78..c18fdcc88 100644 --- a/src/MeshTools/RemoveDuplicates.h +++ b/src/MeshTools/RemoveDuplicates.h @@ -78,6 +78,7 @@ template class RemoveDuplic be melt together. Removes duplicate vertices from the mesh. +@see duplicate() @todo Different (no cycle) implementation for integral vertices @todo Interpolate vertices, not collapse them to first in the cell diff --git a/src/MeshTools/Test/CMakeLists.txt b/src/MeshTools/Test/CMakeLists.txt index e99991d80..bf0b06919 100644 --- a/src/MeshTools/Test/CMakeLists.txt +++ b/src/MeshTools/Test/CMakeLists.txt @@ -24,6 +24,7 @@ corrade_add_test(MeshToolsCombineIndexedArraysTest CombineIndexedArraysTest.cpp) corrade_add_test(MeshToolsCompressIndicesTest CompressIndicesTest.cpp LIBRARIES MagnumMeshTools) +corrade_add_test(MeshToolsDuplicateTest DuplicateTest.cpp) corrade_add_test(MeshToolsFlipNormalsTest FlipNormalsTest.cpp LIBRARIES MagnumMeshToolsTestLib) corrade_add_test(MeshToolsGenerateFlatNormalsTest GenerateFlatNormalsTest.cpp LIBRARIES MagnumMeshToolsTestLib) corrade_add_test(MeshToolsInterleaveTest InterleaveTest.cpp) diff --git a/src/MeshTools/Test/DuplicateTest.cpp b/src/MeshTools/Test/DuplicateTest.cpp new file mode 100644 index 000000000..9fe06065f --- /dev/null +++ b/src/MeshTools/Test/DuplicateTest.cpp @@ -0,0 +1,50 @@ +/* + 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 "MeshTools/Duplicate.h" +#include "Magnum.h" + +namespace Magnum { namespace MeshTools { namespace Test { + +class DuplicateTest: public TestSuite::Tester { + public: + explicit DuplicateTest(); + + void duplicate(); +}; + +DuplicateTest::DuplicateTest() { + addTests({&DuplicateTest::duplicate}); +} + +void DuplicateTest::duplicate() { + CORRADE_COMPARE(MeshTools::duplicate({1, 1, 0, 3, 2, 2}, std::vector{-7, 35, 12, -18}), + (std::vector{35, 35, -7, -18, 12, 12})); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::MeshTools::Test::DuplicateTest)