diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT.cc b/src/OpenMesh/Core/Mesh/PolyMeshT.cc index 16df5b31..0734a24e 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT.cc +++ b/src/OpenMesh/Core/Mesh/PolyMeshT.cc @@ -110,7 +110,7 @@ calc_face_normal(FaceHandle _fh) const Point p1 = this->point(*fv_it); const Point p1i = p1; //save point of vertex 1 - ++fv_it; + // Safeguard for 2-gons if (!(++fv_it).is_valid()) return Normal(0, 0, 0); diff --git a/src/Unittests/unittests_trimesh_normal_calculations.cc b/src/Unittests/unittests_normal_calculations.cc similarity index 76% rename from src/Unittests/unittests_trimesh_normal_calculations.cc rename to src/Unittests/unittests_normal_calculations.cc index bb6e89b2..07342a67 100644 --- a/src/Unittests/unittests_trimesh_normal_calculations.cc +++ b/src/Unittests/unittests_normal_calculations.cc @@ -23,12 +23,102 @@ class OpenMeshNormals : public OpenMeshBase { //Mesh mesh_; }; +class OpenMeshNormalsPolyMesh : public OpenMeshBasePoly { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + + + /* * ==================================================================== * Define tests below * ==================================================================== */ +/* + * Update normals on a single triangle + */ +TEST_F(OpenMeshNormals, NormalCalculationSingleFaceTriMesh) { + + mesh_.clear(); + + // Add some vertices + Mesh::VertexHandle vhandle[4]; + + vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0)); + vhandle[1] = mesh_.add_vertex(Mesh::Point(0, 0, 0)); + vhandle[2] = mesh_.add_vertex(Mesh::Point(1, 0, 0)); + + std::vector face_vhandles; + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[2]); + + Mesh::FaceHandle fh = mesh_.add_face(face_vhandles); + + + mesh_.request_vertex_normals(); + mesh_.request_halfedge_normals(); + mesh_.request_face_normals(); + + mesh_.update_normals(); + + EXPECT_EQ( mesh_.normal(fh)[0] ,0.0f ); + EXPECT_EQ( mesh_.normal(fh)[1] ,0.0f ); + EXPECT_EQ( mesh_.normal(fh)[2] ,1.0f ); +} + + +/* + * Update normals on a single triangle + */ +TEST_F(OpenMeshNormalsPolyMesh, NormalCalculationSingleFacePolyMesh) { + + mesh_.clear(); + + // Add some vertices + PolyMesh::VertexHandle vhandle[4]; + + vhandle[0] = mesh_.add_vertex(PolyMesh::Point(0, 1, 0)); + vhandle[1] = mesh_.add_vertex(PolyMesh::Point(0, 0, 0)); + vhandle[2] = mesh_.add_vertex(PolyMesh::Point(1, 0, 0)); + + std::vector face_vhandles; + face_vhandles.push_back(vhandle[0]); + face_vhandles.push_back(vhandle[1]); + face_vhandles.push_back(vhandle[2]); + + PolyMesh::FaceHandle fh = mesh_.add_face(face_vhandles); + + + mesh_.request_vertex_normals(); + mesh_.request_halfedge_normals(); + mesh_.request_face_normals(); + + mesh_.update_normals(); + + EXPECT_EQ( mesh_.normal(fh)[0] ,0.0f ); + EXPECT_EQ( mesh_.normal(fh)[1] ,0.0f ); + EXPECT_EQ( mesh_.normal(fh)[2] ,1.0f ); + +} + /* * Collapsing a tetrahedron */ @@ -284,4 +374,5 @@ TEST_F(OpenMeshNormals, NormalCalculations_calc_vertex_normal_loop) { + }