diff --git a/Doc/changelog.docu b/Doc/changelog.docu
index c335c46e..5b291fd1 100644
--- a/Doc/changelog.docu
+++ b/Doc/changelog.docu
@@ -29,6 +29,7 @@
- Subdivider: Fixed crash in Loop subdivider
- Subdivider: Fixed crash in ModifiedButterfly subdivider
+- Decimater: Fixed ModNormalDeviationT not working for meshes with Eigen Vectors as vector type
diff --git a/src/OpenMesh/Core/Geometry/NormalConeT.hh b/src/OpenMesh/Core/Geometry/NormalConeT.hh
index 9baaf588..0b1cc6a1 100644
--- a/src/OpenMesh/Core/Geometry/NormalConeT.hh
+++ b/src/OpenMesh/Core/Geometry/NormalConeT.hh
@@ -60,6 +60,7 @@
#include
+#include
//== NAMESPACES ===============================================================
@@ -77,13 +78,14 @@ namespace OpenMesh {
the center normal and the opening angle.
**/
-template
+template
class NormalConeT
{
public:
// typedefs
- typedef VectorT Vec3;
+ typedef typename vector_traits::value_type Scalar;
+ typedef Vector Vec3;
//! default constructor (not initialized)
diff --git a/src/OpenMesh/Core/Geometry/NormalConeT_impl.hh b/src/OpenMesh/Core/Geometry/NormalConeT_impl.hh
index 487e2490..ed9ce908 100644
--- a/src/OpenMesh/Core/Geometry/NormalConeT_impl.hh
+++ b/src/OpenMesh/Core/Geometry/NormalConeT_impl.hh
@@ -70,8 +70,8 @@ namespace OpenMesh {
//== IMPLEMENTATION ==========================================================
-template
-NormalConeT::
+template
+NormalConeT::
NormalConeT(const Vec3& _center_normal, Scalar _angle)
: center_normal_(_center_normal), angle_(_angle)
{
@@ -81,9 +81,9 @@ NormalConeT(const Vec3& _center_normal, Scalar _angle)
//----------------------------------------------------------------------------
-template
-Scalar
-NormalConeT::
+template
+typename NormalConeT::Scalar
+NormalConeT::
max_angle(const Vec3& _norm) const
{
Scalar dotp = (center_normal_ | _norm);
@@ -95,9 +95,9 @@ max_angle(const Vec3& _norm) const
//----------------------------------------------------------------------------
-template
-Scalar
-NormalConeT::
+template
+typename NormalConeT::Scalar
+NormalConeT::
max_angle(const NormalConeT& _cone) const
{
Scalar dotp = (center_normal_ | _cone.center_normal_);
@@ -112,12 +112,12 @@ max_angle(const NormalConeT& _cone) const
//----------------------------------------------------------------------------
-template
+template
void
-NormalConeT::
+NormalConeT::
merge(const NormalConeT& _cone)
{
- Scalar dotp = (center_normal_ | _cone.center_normal_);
+ Scalar dotp = dot(center_normal_, _cone.center_normal_);
if (fabs(dotp) < 0.99999f)
{
diff --git a/src/OpenMesh/Tools/Decimater/ModNormalDeviationT.hh b/src/OpenMesh/Tools/Decimater/ModNormalDeviationT.hh
index 9966d826..b3ea88e7 100644
--- a/src/OpenMesh/Tools/Decimater/ModNormalDeviationT.hh
+++ b/src/OpenMesh/Tools/Decimater/ModNormalDeviationT.hh
@@ -97,7 +97,7 @@ public:
typedef typename Mesh::VertexHandle VertexHandle;
typedef typename Mesh::FaceHandle FaceHandle;
typedef typename Mesh::EdgeHandle EdgeHandle;
- typedef NormalConeT NormalCone;
+ typedef NormalConeT NormalCone;
diff --git a/src/Unittests/unittests_decimater.cc b/src/Unittests/unittests_decimater.cc
index e02780a5..2b7d2376 100644
--- a/src/Unittests/unittests_decimater.cc
+++ b/src/Unittests/unittests_decimater.cc
@@ -3,6 +3,7 @@
#include
#include
#include
+#include
namespace {
@@ -49,7 +50,7 @@ TEST_F(OpenMeshDecimater, DecimateMesh) {
decimaterDBG.initialize();
size_t removedVertices = 0;
removedVertices = decimaterDBG.decimate_to(5000);
- decimaterDBG.mesh().garbage_collection();
+ decimaterDBG.mesh().garbage_collection();
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
@@ -72,7 +73,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceVerticesLimit) {
decimaterDBG.initialize();
size_t removedVertices = 0;
removedVertices = decimaterDBG.decimate_to_faces(5000, 8000);
- decimaterDBG.mesh().garbage_collection();
+ decimaterDBG.mesh().garbage_collection();
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
@@ -95,7 +96,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceFaceLimit) {
decimaterDBG.initialize();
size_t removedVertices = 0;
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
- decimaterDBG.mesh().garbage_collection();
+ decimaterDBG.mesh().garbage_collection();
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
@@ -103,6 +104,34 @@ TEST_F(OpenMeshDecimater, DecimateMeshToFaceFaceLimit) {
EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
}
+
+TEST_F(OpenMeshDecimater, DecimateMeshToVertexLimitWithLowNormalDeviation) {
+
+ bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
+
+ ASSERT_TRUE(ok);
+
+ typedef OpenMesh::Decimater::DecimaterT< Mesh > Decimater;
+ typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
+ typedef OpenMesh::Decimater::ModNormalDeviationT< Mesh >::Handle HModNormalDeviation;
+
+ Decimater decimaterDBG(mesh_);
+ HModQuadric hModQuadricDBG;
+ decimaterDBG.add( hModQuadricDBG );
+ HModNormalDeviation hModNormalDeviation;
+ decimaterDBG.add( hModNormalDeviation );
+ decimaterDBG.module(hModNormalDeviation).set_normal_deviation(15.0);
+ decimaterDBG.initialize();
+ size_t removedVertices = 0;
+ removedVertices = decimaterDBG.decimate_to(8);
+ decimaterDBG.mesh().garbage_collection();
+
+ EXPECT_EQ(6998u, removedVertices) << "The number of remove vertices is not correct!";
+ EXPECT_EQ( 528u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
+ EXPECT_EQ(1578u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
+ EXPECT_EQ(1052u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
+}
+
TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
@@ -121,7 +150,7 @@ TEST_F(OpenMeshDecimater, DecimateMeshExampleFromDoc) {
decimaterDBG.initialize();
size_t removedVertices = 0;
removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
- decimaterDBG.mesh().garbage_collection();
+ decimaterDBG.mesh().garbage_collection();
EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
diff --git a/src/Unittests/unittests_eigen3_type.cc b/src/Unittests/unittests_eigen3_type.cc
index 7be54b70..32be1046 100644
--- a/src/Unittests/unittests_eigen3_type.cc
+++ b/src/Unittests/unittests_eigen3_type.cc
@@ -7,6 +7,9 @@
#include
#include
+#include
+#include
+#include
#include
@@ -232,6 +235,37 @@ TEST_F(OpenMeshEigenTest, LoadSimpleOFFFile) {
mesh_.update_normals();
}
+// Test decimation with Eigen as vector type
+TEST_F(OpenMeshEigenTest, Decimater) {
+ mesh_.clear();
+
+ bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
+
+ EXPECT_TRUE(ok);
+
+ EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!";
+ EXPECT_EQ(22572u, mesh_.n_edges()) << "The number of loaded edges is not correct!";
+ EXPECT_EQ(15048u, mesh_.n_faces()) << "The number of loaded faces is not correct!";
+
+ mesh_.update_normals();
+
+ OpenMesh::Decimater::DecimaterT decimater(mesh_);
+ OpenMesh::Decimater::ModQuadricT::Handle hModQuadric; // use a quadric module
+ OpenMesh::Decimater::ModNormalDeviationT::Handle hModNormalDeviation; // also use normal deviation module as binary check
+ decimater.add(hModQuadric);
+ decimater.add(hModNormalDeviation);
+ decimater.module(hModQuadric).unset_max_err();
+ decimater.module(hModNormalDeviation).set_normal_deviation(15);
+ decimater.initialize();
+ size_t removedVertices = decimater.decimate_to(8);
+ mesh_.garbage_collection();
+
+ EXPECT_EQ(6998u, removedVertices) << "The number of remove vertices is not correct!";
+ EXPECT_EQ( 528u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
+ EXPECT_EQ(1578u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
+ EXPECT_EQ(1052u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
+}
+
}
#endif