Reverting change to decimation to fix compatibility with
[blender.git] / intern / decimation / intern / LOD_ManMesh2.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL 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. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 #ifndef NAN_INCLUDED_ManMesh2_h
33 #define NAN_INCLUDED_ManMesh2_h
34
35 #include "LOD_MeshPrimitives.h"
36 #include "MEM_SmartPtr.h"
37 #include <vector>
38
39 template <class HeapType> class CTR_UHeap;
40
41 class LOD_ExternBufferEditor;
42
43 class LOD_ManMesh2 // Manifold 2 dimensional mesh
44 {
45
46 public:
47
48         static
49                 LOD_ManMesh2 *
50         New(
51         );
52
53         // take ownership of the vertices.
54
55                 bool    
56         SetVertices(
57                 MEM_SmartPtr<std::vector<LOD_Vertex> > verts
58         );      
59                 
60         // Add a triangle to the mesh
61
62                 void
63         AddTriangle(
64                 int verts[3]
65         );      
66
67                 void
68         ConnectTriangle(
69                 LOD_FaceInd fi,
70                 std::vector<LOD_EdgeInd> & new_edges
71         );
72         
73         // geometry access
74         //////////////////
75
76                 std::vector<LOD_Vertex> &
77         VertexSet(
78         ) const ;               
79
80                 std::vector<LOD_TriFace> &
81         FaceSet(
82         ) const ;
83
84                 std::vector<LOD_Edge> &
85         EdgeSet(
86         ) const;
87
88         ~LOD_ManMesh2(
89         );
90
91         // local geometry queries
92         /////////////////////////
93
94         // face queries
95         ///////////////
96
97                 void
98         FaceVertices(
99                 LOD_FaceInd f,
100                 std::vector<LOD_VertexInd> &output
101         );
102         
103                 void
104         FaceEdges(
105                 LOD_FaceInd f,
106                 std::vector<LOD_EdgeInd> &output
107         );      
108
109         // edge queries
110         ///////////////
111
112                 void
113         EdgeVertices(
114                 LOD_EdgeInd e,
115                 std::vector<LOD_VertexInd> &output
116         );
117
118                 void
119         EdgeFaces(
120                 LOD_EdgeInd e,
121                 std::vector<LOD_FaceInd> &output
122         );
123
124         // vertex queries
125         /////////////////
126
127                 void
128         VertexEdges(
129                 LOD_VertexInd v,
130                 std::vector<LOD_EdgeInd> &output
131         );
132         
133                 void
134         VertexFaces(
135                 LOD_VertexInd v,
136                 std::vector<LOD_FaceInd> &output
137         );
138
139                 void
140         SetBBox(
141                 MT_Vector3 bbox_min,
142                 MT_Vector3 bbox_max
143         );
144
145                 MT_Vector3
146         BBoxMin(
147         ) const {
148                 return m_bbox_min;
149         };
150  
151                 MT_Vector3
152         BBoxMax(
153         ) const {
154                 return m_bbox_max;
155         };
156
157         // Remove a primitive from the mesh
158         ///////////////////////////////////
159
160         // These methods assume you have correctly
161         // tidied up the index pointers in other primitives,
162         // so that nothing refers to this object any more
163
164         // These methods exchange the primitive with the 
165         // last primitive in the vector. It modifies everything 
166         // pointing to the last primitive correctly.
167
168         // FIXME refactor extern editor out of primitive deletion
169         // insead return a vector of primitives that need to be
170         // modified and do this externally
171
172                 void
173         DeleteVertex(
174                 LOD_ExternBufferEditor & extern_editor,
175                 LOD_VertexInd v
176         );
177
178                 void
179         DeleteEdge(
180                 LOD_EdgeInd e,
181                 CTR_UHeap<LOD_Edge> *heap
182         );
183
184                 void
185         DeleteFace(
186                 LOD_ExternBufferEditor & extern_editor,
187                 LOD_FaceInd f
188         );
189
190         // Sanity Check routines
191         ////////////////////////
192
193         // Make sure the edge sets and the vertex sets are
194         // consistent
195
196                 void
197         SC_TriFace(
198                 LOD_FaceInd f
199         );
200
201         // basic sanity checking of an edge list bails out if there are more than 1024
202         // edges
203         
204                 void
205         SC_EdgeList(
206                 LOD_EdgeInd e
207         );
208
209
210         // Check to see that the edges of v1 and v2 are unique.
211
212                 bool
213         SC_UniqueEdge(
214                 LOD_EdgeInd e
215         );
216
217
218 private :
219
220
221         // Returns the edge index of the edge from v1 to v2. 
222         // Does this by searching the edge sets of v1 - but not v2.
223         // If you are paranoid you should check both and make sure the 
224         // indices are the same. If the edge doe not exist edgeInd is empty.
225
226                 LOD_EdgeInd
227         FindEdge(
228                 const LOD_VertexInd v1,
229                 const LOD_VertexInd v2
230         );
231
232         // Insert an edge into the mesh
233         // Tie up the ptrs and create space for the edge
234         // returns manifold errors - need to sort out memory edges
235
236                 bool
237         InsertEdge(
238                 const LOD_VertexInd v1,
239                 const LOD_VertexInd v2,
240                 const LOD_FaceInd f,
241                 std::vector<LOD_EdgeInd> &new_edges
242         );
243
244
245 private :
246
247         LOD_ManMesh2(
248         );
249
250         MEM_SmartPtr< std::vector<LOD_Vertex> > m_verts;
251         MEM_SmartPtr< std::vector<LOD_TriFace> > m_faces;
252         MEM_SmartPtr< std::vector<LOD_Edge> > m_edges;
253
254         // not sure of these descrtiptions of the mesh should
255         // reside in this class coz may lead to very bloated interface.
256
257         MT_Vector3 m_bbox_min;
258         MT_Vector3 m_bbox_max;
259
260
261 };
262
263 #endif
264