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