mirror of https://github.com/mosra/magnum.git
Browse Source
Also move it to a new GenerateNormals.h header so we can easily add generateSmoothNormals() to it. The old API and header is deprecated and will be removed in the future. I can't be bothered rewriting the old code using the new thing, so it's preserved there as a mausoleum until it gets finally nuked from the orbit.pull/229/head
9 changed files with 292 additions and 139 deletions
@ -0,0 +1,94 @@
|
||||
#ifndef Magnum_MeshTools_GenerateNormals_h |
||||
#define Magnum_MeshTools_GenerateNormals_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 @ref Magnum::MeshTools::generateFlatNormals(), @ref Magnum::MeshTools::generateFlatNormalsInto() |
||||
*/ |
||||
|
||||
#include "Magnum/Magnum.h" |
||||
#include "Magnum/MeshTools/visibility.h" |
||||
|
||||
#ifdef MAGNUM_BUILD_DEPRECATED |
||||
#include <Corrade/Utility/StlForwardVector.h> |
||||
#include <Corrade/Utility/Macros.h> |
||||
#endif |
||||
|
||||
namespace Magnum { namespace MeshTools { |
||||
|
||||
/**
|
||||
@brief Generate flat normals |
||||
@param positions Triangle vertex positions |
||||
@return Per-vertex normals |
||||
|
||||
All vertices in each triangle face get the same normal vector. Expects that the |
||||
position count is divisible by 3. If you need to generate flat normals for an |
||||
indexed mesh, @ref duplicate() the vertices first, after the operation you |
||||
might want to remove the duplicates again using @ref removeDuplicates(). |
||||
Example usage: |
||||
|
||||
@snippet MagnumMeshTools.cpp generateFlatNormals |
||||
|
||||
@see @ref generateFlatNormalsInto() |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT Containers::Array<Vector3> generateFlatNormals(const Containers::StridedArrayView1D<const Vector3>& positions); |
||||
|
||||
/**
|
||||
@brief Generate flat normals into an existing array |
||||
@param[in] positions Triangle vertex positions |
||||
@param[out] normals Where to put the generated normals |
||||
|
||||
A variant of @ref generateFlatNormals() that fills existing memory instead of |
||||
allocating a new array. |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT void generateFlatNormalsInto(const Containers::StridedArrayView1D<const Vector3>& positions, const Containers::StridedArrayView1D<Vector3>& normals); |
||||
|
||||
#ifdef MAGNUM_BUILD_DEPRECATED |
||||
/**
|
||||
@brief Generate flat normals |
||||
@param indices Array of triangle face indices |
||||
@param positions Array of vertex positions |
||||
@return Normal indices and vectors |
||||
|
||||
All vertices in each triangle face get the same normal vector. Removes |
||||
duplicates before returning. |
||||
|
||||
@attention The function requires the mesh to have triangle faces, thus index |
||||
count must be divisible by 3. |
||||
|
||||
@deprecated This will generate index buffer that's different from the input |
||||
@p indices array, so you'll need to recombine them using |
||||
@ref combineIndexedArrays() in order to have a single index array for both |
||||
vertices and normals. Because this makes the usage more complex than |
||||
strictly neccessary, this function is deprecated in favor of |
||||
@ref generateFlatNormals(const Containers::StridedArrayView1D<const Vector3>&). |
||||
*/ |
||||
CORRADE_DEPRECATED("use generateFlatNormals(const Containers::StridedArrayView1D<const Vector3>&) instead") std::pair<std::vector<UnsignedInt>, std::vector<Vector3>> MAGNUM_MESHTOOLS_EXPORT generateFlatNormals(const std::vector<UnsignedInt>& indices, const std::vector<Vector3>& positions); |
||||
#endif |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
@ -1,87 +0,0 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 <sstream> |
||||
#include <Corrade/TestSuite/Tester.h> |
||||
#include <Corrade/Utility/DebugStl.h> |
||||
|
||||
#include "Magnum/Math/Vector3.h" |
||||
#include "Magnum/MeshTools/GenerateFlatNormals.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { namespace Test { namespace { |
||||
|
||||
struct GenerateFlatNormalsTest: TestSuite::Tester { |
||||
explicit GenerateFlatNormalsTest(); |
||||
|
||||
void wrongIndexCount(); |
||||
void generate(); |
||||
}; |
||||
|
||||
GenerateFlatNormalsTest::GenerateFlatNormalsTest() { |
||||
addTests({&GenerateFlatNormalsTest::wrongIndexCount, |
||||
&GenerateFlatNormalsTest::generate}); |
||||
} |
||||
|
||||
void GenerateFlatNormalsTest::wrongIndexCount() { |
||||
std::stringstream ss; |
||||
Error redirectError{&ss}; |
||||
std::vector<UnsignedInt> indices; |
||||
std::vector<Vector3> normals; |
||||
std::tie(indices, normals) = MeshTools::generateFlatNormals({ |
||||
0, 1 |
||||
}, {}); |
||||
|
||||
CORRADE_COMPARE(indices.size(), 0); |
||||
CORRADE_COMPARE(normals.size(), 0); |
||||
CORRADE_COMPARE(ss.str(), "MeshTools::generateFlatNormals(): index count is not divisible by 3!\n"); |
||||
} |
||||
|
||||
void GenerateFlatNormalsTest::generate() { |
||||
/* Two vertices connected by one edge, each winded in another direction */ |
||||
std::vector<UnsignedInt> indices; |
||||
std::vector<Vector3> normals; |
||||
std::tie(indices, normals) = MeshTools::generateFlatNormals({ |
||||
0, 1, 2, |
||||
1, 2, 3 |
||||
}, { |
||||
{-1.0f, 0.0f, 0.0f}, |
||||
{0.0f, -1.0f, 0.0f}, |
||||
{0.0f, 1.0f, 0.0f}, |
||||
{1.0f, 0.0f, 0.0f} |
||||
}); |
||||
|
||||
CORRADE_COMPARE(indices, (std::vector<UnsignedInt>{ |
||||
0, 0, 0, |
||||
1, 1, 1 |
||||
})); |
||||
CORRADE_COMPARE(normals, (std::vector<Vector3>{ |
||||
Vector3::zAxis(), |
||||
-Vector3::zAxis() |
||||
})); |
||||
} |
||||
|
||||
}}}} |
||||
|
||||
CORRADE_TEST_MAIN(Magnum::MeshTools::Test::GenerateFlatNormalsTest) |
||||
@ -0,0 +1,131 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 <sstream> |
||||
#include <vector> |
||||
#include <Corrade/Containers/Array.h> |
||||
#include <Corrade/Containers/StridedArrayView.h> |
||||
#include <Corrade/TestSuite/Tester.h> |
||||
#include <Corrade/TestSuite/Compare/Container.h> |
||||
#include <Corrade/Utility/DebugStl.h> |
||||
|
||||
#include "Magnum/Math/Vector3.h" |
||||
#include "Magnum/MeshTools/GenerateNormals.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { namespace Test { namespace { |
||||
|
||||
struct GenerateNormalsTest: TestSuite::Tester { |
||||
explicit GenerateNormalsTest(); |
||||
|
||||
void flat(); |
||||
void flatWrongCount(); |
||||
#ifdef MAGNUM_BUILD_DEPRECATED |
||||
void flatDeprecated(); |
||||
#endif |
||||
void flatIntoWrongSize(); |
||||
}; |
||||
|
||||
GenerateNormalsTest::GenerateNormalsTest() { |
||||
addTests({&GenerateNormalsTest::flat, |
||||
&GenerateNormalsTest::flatWrongCount, |
||||
#ifdef MAGNUM_BUILD_DEPRECATED |
||||
&GenerateNormalsTest::flatDeprecated, |
||||
#endif |
||||
&GenerateNormalsTest::flatIntoWrongSize}); |
||||
} |
||||
|
||||
/* Two vertices connected by one edge, each wound in another direction */ |
||||
constexpr Vector3 TwoTriangles[]{ |
||||
{-1.0f, 0.0f, 0.0f}, |
||||
{0.0f, -1.0f, 0.0f}, |
||||
{0.0f, 1.0f, 0.0f}, |
||||
|
||||
{0.0f, -1.0f, 0.0f}, |
||||
{0.0f, 1.0f, 0.0f}, |
||||
{1.0f, 0.0f, 0.0f} |
||||
}; |
||||
|
||||
void GenerateNormalsTest::flat() { |
||||
CORRADE_COMPARE_AS(generateFlatNormals(TwoTriangles), |
||||
(Containers::Array<Vector3>{Containers::InPlaceInit, { |
||||
Vector3::zAxis(), |
||||
Vector3::zAxis(), |
||||
Vector3::zAxis(), |
||||
-Vector3::zAxis(), |
||||
-Vector3::zAxis(), |
||||
-Vector3::zAxis() |
||||
}}), TestSuite::Compare::Container); |
||||
} |
||||
|
||||
void GenerateNormalsTest::flatWrongCount() { |
||||
std::stringstream out; |
||||
Error redirectError{&out}; |
||||
|
||||
const Vector3 positions[7]; |
||||
generateFlatNormals(positions); |
||||
CORRADE_COMPARE(out.str(), "MeshTools::generateFlatNormalsInto(): position count not divisible by 3\n"); |
||||
} |
||||
|
||||
#ifdef MAGNUM_BUILD_DEPRECATED |
||||
void GenerateNormalsTest::flatDeprecated() { |
||||
/* Two vertices connected by one edge, each wound in another direction */ |
||||
std::vector<UnsignedInt> indices; |
||||
std::vector<Vector3> normals; |
||||
CORRADE_IGNORE_DEPRECATED_PUSH |
||||
std::tie(indices, normals) = MeshTools::generateFlatNormals({ |
||||
0, 1, 2, |
||||
1, 2, 3 |
||||
}, { |
||||
{-1.0f, 0.0f, 0.0f}, |
||||
{0.0f, -1.0f, 0.0f}, |
||||
{0.0f, 1.0f, 0.0f}, |
||||
{1.0f, 0.0f, 0.0f} |
||||
}); |
||||
CORRADE_IGNORE_DEPRECATED_POP |
||||
|
||||
CORRADE_COMPARE(indices, (std::vector<UnsignedInt>{ |
||||
0, 0, 0, |
||||
1, 1, 1 |
||||
})); |
||||
CORRADE_COMPARE(normals, (std::vector<Vector3>{ |
||||
Vector3::zAxis(), |
||||
-Vector3::zAxis() |
||||
})); |
||||
} |
||||
#endif |
||||
|
||||
void GenerateNormalsTest::flatIntoWrongSize() { |
||||
std::stringstream out; |
||||
Error redirectError{&out}; |
||||
|
||||
const Vector3 positions[6]; |
||||
Vector3 normals[7]; |
||||
generateFlatNormalsInto(positions, normals); |
||||
CORRADE_COMPARE(out.str(), "MeshTools::generateFlatNormalsInto(): bad output size, expected 6 but got 7\n"); |
||||
} |
||||
|
||||
}}}} |
||||
|
||||
CORRADE_TEST_MAIN(Magnum::MeshTools::Test::GenerateNormalsTest) |
||||
Loading…
Reference in new issue