Browse Source

MeshTools: added generateTrivialIndices().

Because writing a for loop for this is annoying, and using std::iota()
isn't any better either.
pull/650/head
Vladimír Vondruš 2 years ago
parent
commit
6733550e97
  1. 2
      doc/changelog.dox
  2. 11
      src/Magnum/MeshTools/GenerateIndices.cpp
  3. 31
      src/Magnum/MeshTools/GenerateIndices.h
  4. 17
      src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp

2
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(),

11
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<UnsignedInt>& output) {
for(std::size_t i = 0; i != output.size(); ++i)
output[i] = i;
}
Containers::Array<UnsignedInt> generateTrivialIndices(const UnsignedInt vertexCount) {
Containers::Array<UnsignedInt> output{NoInit, vertexCount};
generateTrivialIndicesInto(output);
return output;
}
void generateLineStripIndicesInto(const UnsignedInt vertexCount, const Containers::StridedArrayView1D<UnsignedInt>& output) {
CORRADE_ASSERT(vertexCount == 0 || vertexCount >= 2,
"MeshTools::generateLineStripIndicesInto(): expected either zero or at least two vertices, got" << vertexCount, );

31
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<UnsignedInt> 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<UnsignedInt>& 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<UnsignedInt> 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<UnsignedInt> 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<UnsignedInt> 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<UnsignedInt> generateTriangleFanIndices(UnsignedInt vertexCount);

17
src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp

@ -45,6 +45,8 @@ struct GenerateIndicesTest: TestSuite::Tester {
void primitiveCountInvalidVertexCount();
void primitiveCountInvalidPrimitive();
void generateTrivialIndices();
void generateLineStripIndices();
template<class T> void generateLineStripIndicesIndexed();
template<class T> void generateLineStripIndicesIndexed2D();
@ -212,6 +214,8 @@ GenerateIndicesTest::GenerateIndicesTest() {
&GenerateIndicesTest::primitiveCountInvalidVertexCount,
&GenerateIndicesTest::primitiveCountInvalidPrimitive,
&GenerateIndicesTest::generateTrivialIndices,
&GenerateIndicesTest::generateLineStripIndices,
&GenerateIndicesTest::generateLineStripIndicesIndexed<UnsignedInt>,
&GenerateIndicesTest::generateLineStripIndicesIndexed<UnsignedShort>,
@ -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<const UnsignedInt>{},
TestSuite::Compare::Container);
/* Common case */
CORRADE_COMPARE_AS(MeshTools::generateTrivialIndices(7),
Containers::arrayView<UnsignedInt>({
0, 1, 2, 3, 4, 5, 6
}), TestSuite::Compare::Container);
}
void GenerateIndicesTest::generateLineStripIndices() {
/* Empty input */
CORRADE_COMPARE_AS(MeshTools::generateLineStripIndices(0),

Loading…
Cancel
Save