Merged from trunk with revision range 36835-37865,
[blender.git] / intern / decimation / intern / LOD_EdgeCollapser.h
1 /*
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 /** \file decimation/intern/LOD_EdgeCollapser.h
30  *  \ingroup decimation
31  */
32
33
34 #ifndef NAN_INCLDUED_EgdeCollapser_h
35 #define NAN_INCLDUED_EgdeCollapser_h
36
37 // This is a helper class that collapses edges of a 2 - manifold mesh.
38
39 #include "LOD_MeshPrimitives.h"
40 #include "MEM_NonCopyable.h"
41 #include <vector>
42 #include <functional>
43
44 class LOD_ManMesh2;
45
46 class LOD_EdgeCollapser 
47 : public  MEM_NonCopyable
48 {
49
50 public :
51                         
52         static
53                 LOD_EdgeCollapser * 
54         New(
55         );
56
57         // returns via arguments the set of modified
58         // verts,edges and faces.
59
60                 bool
61         CollapseEdge(
62                 LOD_EdgeInd ei,
63                 LOD_ManMesh2 &mesh,
64                 std::vector<LOD_EdgeInd> &      degenerate_edges,
65                 std::vector<LOD_FaceInd> &      degenerate_faces,
66                 std::vector<LOD_VertexInd> & degenerate_vertices,
67                 std::vector<LOD_EdgeInd> &      new_edges,
68                 std::vector<LOD_FaceInd> &      update_faces,
69                 std::vector<LOD_VertexInd> & update_vertices
70         );
71
72 private :
73
74         LOD_EdgeCollapser(
75         );
76
77         // Test to see if the result of collapsing the
78         // edge produces 2 junctions in the mesh i.e. where
79         // an edge is shared by more than 2 polygons
80
81         // We count the number of coincedent edge pairs that
82         // result from the collapse of collapse_edge.
83
84         // If collapse edge is a boundary edge then the number of
85         // coincedent pairs should be 1
86         // else it should be 2.
87
88                 bool
89         TJunctionTest(
90                 LOD_ManMesh2 &mesh,
91                 std::vector<LOD_EdgeInd> &e_v0v1,
92                 LOD_EdgeInd collapse_edge
93         );
94
95         // here's the definition of the sort function
96         // we use to determine coincedent edges
97
98         // assumes the edges are normalized i.e. m_verts[0] <= m_verts[1]
99
100         struct less : std::binary_function<LOD_Edge, LOD_Edge, bool> {
101                         bool 
102                 operator()(
103                         const LOD_Edge& a,
104                         const LOD_Edge& b
105                 ) const {
106                                 
107                         if (int(a.m_verts[0]) == int(b.m_verts[0])) {
108                                 return (int(a.m_verts[1]) < int(b.m_verts[1]));
109                         } else {
110                                 return (int(a.m_verts[0]) < int(b.m_verts[0]));
111                         }
112                 }
113         };
114
115 };
116
117 #endif
118