diff --git a/doc/changelog.dox b/doc/changelog.dox index 9b5fb6b28..3b1776e3c 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -291,6 +291,8 @@ See also: - New @ref MeshTools::boundingSphereBouncingBubble() algorithm for calculating a tight bounding sphere for a mesh, along with a trivial @ref MeshTools::boundingRange() for AABBs (see [mosra/magnum#557](https://github.com/mosra/magnum/pull/557)) +- Added @ref MeshTools::generateTrivialIndices() as a STL-less alternative + to @ref std::iota() - Added @ref MeshTools::generateQuadIndices() for quad triangulation including non-convex and non-planar quads - New @ref MeshTools::filterAttributes(), diff --git a/src/Magnum/MeshTools/GenerateIndices.cpp b/src/Magnum/MeshTools/GenerateIndices.cpp index c3b6fd0b2..e504af8d4 100644 --- a/src/Magnum/MeshTools/GenerateIndices.cpp +++ b/src/Magnum/MeshTools/GenerateIndices.cpp @@ -84,6 +84,17 @@ UnsignedInt primitiveCount(const MeshPrimitive primitive, const UnsignedInt elem CORRADE_ASSERT_UNREACHABLE("MeshTools::primitiveCount(): invalid primitive" << primitive, {}); } +void generateTrivialIndicesInto(const Containers::StridedArrayView1D& output) { + for(std::size_t i = 0; i != output.size(); ++i) + output[i] = i; +} + +Containers::Array generateTrivialIndices(const UnsignedInt vertexCount) { + Containers::Array output{NoInit, vertexCount}; + generateTrivialIndicesInto(output); + return output; +} + void generateLineStripIndicesInto(const UnsignedInt vertexCount, const Containers::StridedArrayView1D& output) { CORRADE_ASSERT(vertexCount == 0 || vertexCount >= 2, "MeshTools::generateLineStripIndicesInto(): expected either zero or at least two vertices, got" << vertexCount, ); diff --git a/src/Magnum/MeshTools/GenerateIndices.h b/src/Magnum/MeshTools/GenerateIndices.h index 7bc83d7d8..96450f783 100644 --- a/src/Magnum/MeshTools/GenerateIndices.h +++ b/src/Magnum/MeshTools/GenerateIndices.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Function @ref Magnum::MeshTools::primitiveCount(), @ref Magnum::MeshTools::generateLineStripIndices(), @ref Magnum::MeshTools::generateLineStripIndicesInto(), @ref Magnum::MeshTools::generateLineLoopIndices(), @ref Magnum::MeshTools::generateLineLoopIndicesInto(), @ref Magnum::MeshTools::generateTriangleStripIndices(), @ref Magnum::MeshTools::generateTriangleStripIndicesInto(), @ref Magnum::MeshTools::generateTriangleFanIndices(), @ref Magnum::MeshTools::generateTriangleFanIndicesInto(), @ref Magnum::MeshTools::generateIndices() + * @brief Function @ref Magnum::MeshTools::primitiveCount(), @ref Magnum::MeshTools::generateTrivialIndices(), @ref Magnum::MeshTools::generateTrivialIndicesInto(), @ref Magnum::MeshTools::generateLineStripIndices(), @ref Magnum::MeshTools::generateLineStripIndicesInto(), @ref Magnum::MeshTools::generateLineLoopIndices(), @ref Magnum::MeshTools::generateLineLoopIndicesInto(), @ref Magnum::MeshTools::generateTriangleStripIndices(), @ref Magnum::MeshTools::generateTriangleStripIndicesInto(), @ref Magnum::MeshTools::generateTriangleFanIndices(), @ref Magnum::MeshTools::generateTriangleFanIndicesInto(), @ref Magnum::MeshTools::generateIndices() * @m_since{2020,06} */ @@ -49,6 +49,27 @@ is either zero or at least @cpp 2 @ce for a line-based primitive and at least */ MAGNUM_MESHTOOLS_EXPORT UnsignedInt primitiveCount(MeshPrimitive primitive, UnsignedInt elementCount); +/** +@brief Create a trivial index buffer +@m_since_latest + +Generates a @cpp 0, 1, 2, 3, 4, 5, ... @ce sequence, i.e. what @ref std::iota() +would produce. Can be used to turn a non-indexed mesh into indexed. +@see @ref generateTrivialIndicesInto(), @ref generateLineStripIndices(), + @ref generateLineLoopIndices(), @ref generateTriangleStripIndices(), + @ref generateTriangleFanIndices(), @ref generateIndices() +*/ +MAGNUM_MESHTOOLS_EXPORT Containers::Array generateTrivialIndices(UnsignedInt vertexCount); + +/** +@brief Create a trivial index buffer into an existing array +@m_since_latest + +A variant of @ref generateTrivialIndices() that fills existing memory +instead of allocating a new array. +*/ +MAGNUM_MESHTOOLS_EXPORT void generateTrivialIndicesInto(const Containers::StridedArrayView1D& output); + /** @brief Create index buffer for a line strip primitive @m_since{2020,06} @@ -61,7 +82,7 @@ Primitive restart is not supported. If the mesh is already indexed, use and overloads instead. @see @ref generateLineStripIndicesInto(), @ref generateLineLoopIndices(), @ref generateTriangleStripIndices(), @ref generateTriangleFanIndices(), - @ref generateIndices() + @ref generateTrivialIndices(), @ref generateIndices() */ MAGNUM_MESHTOOLS_EXPORT Containers::Array generateLineStripIndices(UnsignedInt vertexCount); @@ -153,7 +174,7 @@ Primitive restart is not supported. If the mesh is already indexed, use and overloads instead. @see @ref generateLineLoopIndicesInto(), @ref generateLineStripIndices(), @ref generateTriangleStripIndices(), @ref generateTriangleFanIndices(), - @ref generateIndices() + @ref generateTrivialIndices(), @ref generateIndices() */ MAGNUM_MESHTOOLS_EXPORT Containers::Array generateLineLoopIndices(UnsignedInt vertexCount); @@ -246,7 +267,7 @@ mesh is already indexed, use @ref generateTriangleStripIndices(const Containers: and overloads instead. @see @ref generateTriangleStripIndicesInto(), @ref generateLineStripIndices(), @ref generateLineLoopIndices(), @ref generateTriangleFanIndices(), - @ref generateIndices() + @ref generateTrivialIndices(), @ref generateIndices() */ MAGNUM_MESHTOOLS_EXPORT Containers::Array generateTriangleStripIndices(UnsignedInt vertexCount); @@ -339,7 +360,7 @@ mesh is already indexed, use @ref generateTriangleFanIndices(const Containers::S and overloads instead. @see @ref generateTriangleFanIndicesInto(), @ref generateLineStripIndices(), @ref generateLineLoopIndices(), @ref generateTriangleStripIndices(), - @ref generateIndices() + @ref generateTrivialIndices(), @ref generateIndices() */ MAGNUM_MESHTOOLS_EXPORT Containers::Array generateTriangleFanIndices(UnsignedInt vertexCount); diff --git a/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp b/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp index 600a8a7d0..9601358f3 100644 --- a/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp +++ b/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp @@ -45,6 +45,8 @@ struct GenerateIndicesTest: TestSuite::Tester { void primitiveCountInvalidVertexCount(); void primitiveCountInvalidPrimitive(); + void generateTrivialIndices(); + void generateLineStripIndices(); template void generateLineStripIndicesIndexed(); template void generateLineStripIndicesIndexed2D(); @@ -212,6 +214,8 @@ GenerateIndicesTest::GenerateIndicesTest() { &GenerateIndicesTest::primitiveCountInvalidVertexCount, &GenerateIndicesTest::primitiveCountInvalidPrimitive, + &GenerateIndicesTest::generateTrivialIndices, + &GenerateIndicesTest::generateLineStripIndices, &GenerateIndicesTest::generateLineStripIndicesIndexed, &GenerateIndicesTest::generateLineStripIndicesIndexed, @@ -340,6 +344,19 @@ void GenerateIndicesTest::primitiveCountInvalidPrimitive() { "MeshTools::primitiveCount(): invalid primitive MeshPrimitive(0xdead)\n"); } +void GenerateIndicesTest::generateTrivialIndices() { + /* Empty input */ + CORRADE_COMPARE_AS(MeshTools::generateTrivialIndices(0), + Containers::ArrayView{}, + TestSuite::Compare::Container); + + /* Common case */ + CORRADE_COMPARE_AS(MeshTools::generateTrivialIndices(7), + Containers::arrayView({ + 0, 1, 2, 3, 4, 5, 6 + }), TestSuite::Compare::Container); +} + void GenerateIndicesTest::generateLineStripIndices() { /* Empty input */ CORRADE_COMPARE_AS(MeshTools::generateLineStripIndices(0),