Merged from trunk with revision range 36835-37865,
[blender.git] / intern / decimation / intern / LOD_ManMesh2.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_ManMesh2.h
30  *  \ingroup decimation
31  */
32
33
34 #ifndef NAN_INCLUDED_ManMesh2_h
35 #define NAN_INCLUDED_ManMesh2_h
36
37 #include "LOD_MeshPrimitives.h"
38 #include "MEM_SmartPtr.h"
39 #include <vector>
40
41 template <class HeapType> class CTR_UHeap;
42
43 class LOD_ExternBufferEditor;
44
45 class LOD_ManMesh2 // Manifold 2 dimensional mesh
46 {
47
48 public:
49
50         static
51                 LOD_ManMesh2 *
52         New(
53         );
54
55         // take ownership of the vertices.
56
57                 bool    
58         SetVertices(
59                 MEM_SmartPtr<std::vector<LOD_Vertex> > verts
60         );      
61                 
62         // Add a triangle to the mesh
63
64                 void
65         AddTriangle(
66                 int verts[3]
67         );      
68
69                 void
70         ConnectTriangle(
71                 LOD_FaceInd fi,
72                 std::vector<LOD_EdgeInd> & new_edges
73         );
74         
75         // geometry access
76         //////////////////
77
78                 std::vector<LOD_Vertex> &
79         VertexSet(
80         ) const ;               
81
82                 std::vector<LOD_TriFace> &
83         FaceSet(
84         ) const ;
85
86                 std::vector<LOD_Edge> &
87         EdgeSet(
88         ) const;
89
90         ~LOD_ManMesh2(
91         );
92
93         // local geometry queries
94         /////////////////////////
95
96         // face queries
97         ///////////////
98
99                 void
100         FaceVertices(
101                 LOD_FaceInd f,
102                 std::vector<LOD_VertexInd> &output
103         );
104         
105                 void
106         FaceEdges(
107                 LOD_FaceInd f,
108                 std::vector<LOD_EdgeInd> &output
109         );      
110
111         // edge queries
112         ///////////////
113
114                 void
115         EdgeVertices(
116                 LOD_EdgeInd e,
117                 std::vector<LOD_VertexInd> &output
118         );
119
120                 void
121         EdgeFaces(
122                 LOD_EdgeInd e,
123                 std::vector<LOD_FaceInd> &output
124         );
125
126         // vertex queries
127         /////////////////
128
129                 void
130         VertexEdges(
131                 LOD_VertexInd v,
132                 std::vector<LOD_EdgeInd> &output
133         );
134         
135                 void
136         VertexFaces(
137                 LOD_VertexInd v,
138                 std::vector<LOD_FaceInd> &output
139         );
140
141                 void
142         SetBBox(
143                 MT_Vector3 bbox_min,
144                 MT_Vector3 bbox_max
145         );
146
147                 MT_Vector3
148         BBoxMin(
149         ) const {
150                 return m_bbox_min;
151         };
152  
153                 MT_Vector3
154         BBoxMax(
155         ) const {
156                 return m_bbox_max;
157         };
158
159         // Remove a primitive from the mesh
160         ///////////////////////////////////
161
162         // These methods assume you have correctly
163         // tidied up the index pointers in other primitives,
164         // so that nothing refers to this object any more
165
166         // These methods exchange the primitive with the 
167         // last primitive in the vector. It modifies everything 
168         // pointing to the last primitive correctly.
169
170         // FIXME refactor extern editor out of primitive deletion
171         // insead return a vector of primitives that need to be
172         // modified and do this externally
173
174                 void
175         DeleteVertex(
176                 LOD_ExternBufferEditor & extern_editor,
177                 LOD_VertexInd v
178         );
179
180                 void
181         DeleteEdge(
182                 LOD_EdgeInd e,
183                 CTR_UHeap<LOD_Edge> *heap
184         );
185
186                 void
187         DeleteFace(
188                 LOD_ExternBufferEditor & extern_editor,
189                 LOD_FaceInd f
190         );
191
192         // Sanity Check routines
193         ////////////////////////
194
195         // Make sure the edge sets and the vertex sets are
196         // consistent
197
198                 void
199         SC_TriFace(
200                 LOD_FaceInd f
201         );
202
203         // basic sanity checking of an edge list bails out if there are more than 1024
204         // edges
205         
206                 void
207         SC_EdgeList(
208                 LOD_EdgeInd e
209         );
210
211
212         // Check to see that the edges of v1 and v2 are unique.
213
214                 bool
215         SC_UniqueEdge(
216                 LOD_EdgeInd e
217         );
218
219
220 private :
221
222
223         // Returns the edge index of the edge from v1 to v2. 
224         // Does this by searching the edge sets of v1 - but not v2.
225         // If you are paranoid you should check both and make sure the 
226         // indices are the same. If the edge doe not exist edgeInd is empty.
227
228                 LOD_EdgeInd
229         FindEdge(
230                 const LOD_VertexInd v1,
231                 const LOD_VertexInd v2
232         );
233
234         // Insert an edge into the mesh
235         // Tie up the ptrs and create space for the edge
236         // returns manifold errors - need to sort out memory edges
237
238                 bool
239         InsertEdge(
240                 const LOD_VertexInd v1,
241                 const LOD_VertexInd v2,
242                 const LOD_FaceInd f,
243                 std::vector<LOD_EdgeInd> &new_edges
244         );
245
246
247 private :
248
249         LOD_ManMesh2(
250         );
251
252         MEM_SmartPtr< std::vector<LOD_Vertex> > m_verts;
253         MEM_SmartPtr< std::vector<LOD_TriFace> > m_faces;
254         MEM_SmartPtr< std::vector<LOD_Edge> > m_edges;
255
256         // not sure of these descrtiptions of the mesh should
257         // reside in this class coz may lead to very bloated interface.
258
259         MT_Vector3 m_bbox_min;
260         MT_Vector3 m_bbox_max;
261
262
263 };
264
265 #endif
266