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