1
2 #include <gtest/gtest.h>
3 #include <Unittests/unittests_common.hh>
4 #include <OpenMesh/Tools/Decimater/McDecimaterT.hh>
5 #include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
6 #include <OpenMesh/Tools/Decimater/ModNormalFlippingT.hh>
7
8 namespace {
9
10 class OpenMeshMultipleChoiceDecimater : public OpenMeshBase {
11
12 protected:
13
14 // This function is called before each test is run
SetUp()15 virtual void SetUp() {
16
17 // Do some initial stuff with the member data here...
18 }
19
20 // This function is called after all tests are through
TearDown()21 virtual void TearDown() {
22
23 // Do some final stuff with the member data here...
24 }
25
26 // Member already defined in OpenMeshBase
27 //Mesh mesh_;
28 };
29
30 /*
31 * ====================================================================
32 * Define tests below
33 * ====================================================================
34 */
35
36 /*
37 */
TEST_F(OpenMeshMultipleChoiceDecimater,DecimateMesh)38 TEST_F(OpenMeshMultipleChoiceDecimater, DecimateMesh) {
39
40 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
41
42 ASSERT_TRUE(ok);
43
44 typedef OpenMesh::Decimater::McDecimaterT< Mesh > Decimater;
45 typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
46
47 Decimater decimaterDBG(mesh_);
48 HModQuadric hModQuadricDBG;
49 decimaterDBG.add( hModQuadricDBG );
50 decimaterDBG.initialize();
51 size_t removedVertices = 0;
52 removedVertices = decimaterDBG.decimate_to(5000);
53 decimaterDBG.mesh().garbage_collection();
54
55 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
56 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
57 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
58 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
59 }
60
TEST_F(OpenMeshMultipleChoiceDecimater,DecimateMeshToFaceVerticesLimit)61 TEST_F(OpenMeshMultipleChoiceDecimater, DecimateMeshToFaceVerticesLimit) {
62
63 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
64
65 ASSERT_TRUE(ok);
66
67 typedef OpenMesh::Decimater::McDecimaterT< Mesh > Decimater;
68 typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
69
70 Decimater decimaterDBG(mesh_);
71 HModQuadric hModQuadricDBG;
72 decimaterDBG.add( hModQuadricDBG );
73 decimaterDBG.initialize();
74 size_t removedVertices = 0;
75 removedVertices = decimaterDBG.decimate_to_faces(5000, 8000);
76 decimaterDBG.mesh().garbage_collection();
77
78 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
79 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
80 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
81 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
82 }
83
TEST_F(OpenMeshMultipleChoiceDecimater,DecimateMeshToFaceFaceLimit)84 TEST_F(OpenMeshMultipleChoiceDecimater, DecimateMeshToFaceFaceLimit) {
85
86 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
87
88 ASSERT_TRUE(ok);
89
90 typedef OpenMesh::Decimater::McDecimaterT< Mesh > Decimater;
91 typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
92
93 Decimater decimaterDBG(mesh_);
94 HModQuadric hModQuadricDBG;
95 decimaterDBG.add( hModQuadricDBG );
96 decimaterDBG.initialize();
97 size_t removedVertices = 0;
98 removedVertices = decimaterDBG.decimate_to_faces(4500, 9996);
99 decimaterDBG.mesh().garbage_collection();
100
101 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
102 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
103 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
104 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
105 }
106
107 class UnittestObserver : public OpenMesh::Decimater::Observer
108 {
109 size_t notifies_;
110 size_t all_steps_;
111 public:
UnittestObserver(size_t _steps)112 explicit UnittestObserver(size_t _steps) :Observer(_steps), notifies_(0), all_steps_(0) {}
113
notify(size_t _step)114 void notify(size_t _step)
115 {
116 ++notifies_;
117 all_steps_ = _step;
118 }
abort() const119 bool abort() const
120 {
121 return all_steps_ >= 2526u;
122 }
123
countedNotifies()124 size_t countedNotifies()
125 {
126 return notifies_;
127 }
128 };
129
TEST_F(OpenMeshMultipleChoiceDecimater,DecimateMeshStoppedByObserver)130 TEST_F(OpenMeshMultipleChoiceDecimater, DecimateMeshStoppedByObserver) {
131
132 bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off");
133
134 ASSERT_TRUE(ok);
135
136 typedef OpenMesh::Decimater::McDecimaterT< Mesh > Decimater;
137 typedef OpenMesh::Decimater::ModQuadricT< Mesh >::Handle HModQuadric;
138
139 Decimater decimaterDBG(mesh_);
140 HModQuadric hModQuadricDBG;
141 decimaterDBG.add(hModQuadricDBG);
142
143 decimaterDBG.module(hModQuadricDBG).unset_max_err();
144
145 decimaterDBG.initialize();
146 UnittestObserver obs(2);
147 decimaterDBG.set_observer(&obs);
148 size_t removedVertices = 0;
149 removedVertices = decimaterDBG.decimate_to_faces(0, 0);
150 decimaterDBG.mesh().garbage_collection();
151
152 EXPECT_TRUE(obs.abort()) << "Observer did not abort the decimater!";
153 EXPECT_EQ(obs.countedNotifies(), 2526u / 2u) << "Observer did not get the right amount of notifications!";
154
155 EXPECT_EQ(2526u, removedVertices) << "The number of remove vertices is not correct!";
156 EXPECT_EQ(5000u, mesh_.n_vertices()) << "The number of vertices after decimation is not correct!";
157 EXPECT_EQ(14994u, mesh_.n_edges()) << "The number of edges after decimation is not correct!";
158 EXPECT_EQ(9996u, mesh_.n_faces()) << "The number of faces after decimation is not correct!";
159 }
160 }
161