Merged from trunk with revision range 36835-37865,
[blender.git] / intern / decimation / intern / LOD_MeshPrimitives.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_MeshPrimitives.h
30  *  \ingroup decimation
31  */
32
33
34 #ifndef NAN_INCLUDED_MeshPrimitives_h
35 #define NAN_INCLUDED_MeshPrimitives_h
36
37 #include "MT_Vector3.h"
38 #include "CTR_TaggedIndex.h"
39 #include "CTR_UHeap.h"
40 #include <vector>
41
42 typedef CTR_TaggedIndex<24,0x00ffffff> LOD_VertexInd;
43 typedef CTR_TaggedIndex<24,0x00ffffff> LOD_EdgeInd;
44 typedef CTR_TaggedIndex<24,0x00ffffff> LOD_FaceInd;
45 typedef CTR_TaggedIndex<24,0x00ffffff> LOD_HeapInd;
46
47 class LOD_Vertex {
48 public :
49         MT_Vector3 pos;
50         std::vector<LOD_EdgeInd> m_edges;
51         bool m_select_tag;
52
53         LOD_Vertex(
54         ) ;
55
56                 bool
57         RemoveEdge(
58                 LOD_EdgeInd e
59         );      
60
61                 void
62         AddEdge(
63                 LOD_EdgeInd e
64         );
65
66                 void
67         SwapEdge(
68                 LOD_EdgeInd e_old,
69                 LOD_EdgeInd e_new
70         );
71
72                 bool
73         SelectTag(
74         ) const; 
75
76                 void
77         SetSelectTag(
78                 bool tag        
79         );
80
81                 bool
82         Degenerate(
83         );
84
85                 void
86         CopyPosition(
87                 float *float_ptr
88         );
89
90 private :
91
92
93 };
94
95 class LOD_Edge : public CTR_UHeapable  {
96 public :
97         LOD_VertexInd   m_verts[2];
98         LOD_FaceInd             m_faces[2];
99
100         LOD_Edge (
101         );
102                         
103         bool operator == (
104                 LOD_Edge & rhs
105         );
106
107         // Elementary helper methods
108         ////////////////////////////
109
110                 LOD_FaceInd
111         OpFace(
112                 LOD_FaceInd f
113         ) const ;
114
115                 void
116         SwapFace(
117                 LOD_FaceInd old_f,
118                 LOD_FaceInd new_f
119         ) ;
120
121
122         // return the half edge face - the half edge is defined
123         // by the {vertex,edge} tuple. 
124
125                 LOD_FaceInd
126         HalfEdgeFace(
127                 LOD_VertexInd vi
128         );      
129         
130
131                 LOD_VertexInd
132         OpVertex(
133                 LOD_VertexInd vi
134         );
135
136         // replace the vertex v_old with vertex v_new
137         // error if v_old is not one of the original vertices
138
139                 void
140         SwapVertex(
141                 LOD_VertexInd v_old,
142                 LOD_VertexInd v_new
143         ) ;                     
144
145                 bool
146         SelectTag(
147         ) const ;
148
149                 void
150         SetSelectTag(
151                 bool tag
152         );
153         
154                 int
155         OpenTag(
156         ) const;
157
158                 void
159         SetOpenTag(
160                 int tag
161         ) ;
162
163                 bool
164         Degenerate(
165         ) const;
166
167                 bool
168         BoundaryEdge(
169         ) const {
170                 return (m_faces[0].IsEmpty() || m_faces[1].IsEmpty());
171         };
172         
173
174 };
175
176 class LOD_TriFace {
177 public:
178
179         LOD_VertexInd m_verts[3];
180
181         LOD_TriFace(
182         );
183
184         // Elementary helper methods
185         ////////////////////////////
186
187                 void
188         SwapVertex(
189                 LOD_VertexInd old_v,
190                 LOD_VertexInd new_v
191         );
192
193                 bool
194         SelectTag(
195         ) const;
196
197                 void
198         SetSelectTag(
199                 bool tag
200         );
201
202                 int
203         OpenTag(
204         );
205                 void
206         SetOpenTag(
207                 int tag
208         );
209
210                 bool
211         Degenerate(
212         );
213
214                 void
215         CopyVerts(
216                 int * index_ptr
217         );
218
219 };
220         
221 #endif
222