Cleanup: misc spelling fixes
[blender.git] / source / blender / freestyle / intern / scene_graph / IndexedFaceSet.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __FREESTYLE_INDEXED_FACE_SET_H__
18 #define __FREESTYLE_INDEXED_FACE_SET_H__
19
20 /** \file
21  * \ingroup freestyle
22  * \brief A Set of indexed faces to represent a surfacic object
23  */
24
25 #include <memory.h>
26 #include <stdio.h>
27
28 //! inherits from class Rep
29 #include "Rep.h"
30
31 #include "../system/FreestyleConfig.h"
32
33 namespace Freestyle {
34
35 class IndexedFaceSet : public Rep {
36  public:
37   /*! Triangles description style:*/
38   enum TRIANGLES_STYLE {
39     TRIANGLE_STRIP,
40     TRIANGLE_FAN,
41     TRIANGLES,
42   };
43
44   /*! User-specified face and edge marks for feature edge detection */
45   /* XXX Why in hell not use an enum here too? */
46   typedef unsigned char FaceEdgeMark;
47   static const FaceEdgeMark FACE_MARK = 1 << 0;
48   static const FaceEdgeMark EDGE_MARK_V1V2 = 1 << 1;
49   static const FaceEdgeMark EDGE_MARK_V2V3 = 1 << 2;
50   static const FaceEdgeMark EDGE_MARK_V3V1 = 1 << 3;
51
52   /*! Builds an empty indexed face set  */
53   IndexedFaceSet();
54
55   /*! Builds an indexed face set
56    *    iVertices
57    *      The array of object vertices 3D coordinates (for all faces).
58    *      If iCopy != 0, the array is copied; you must deallocate iVertices. Else you must not.
59    *    iVSize
60    *      The size of iVertices (must be a multiple of 3)
61    *    iNormals
62    *      The array of object normals 3D coordinates.
63    *      If iCopy != 0, the array is copied; you must deallocate iNormals. Else you must not.
64    *    iNSize
65    *      The size of iNormals
66    *    iMaterials
67    *      The array of materials
68    *    iMSize
69    *      The size of iMaterials
70    *    iTexCoords
71    *      The array of texture coordinates.
72    *    iTSize
73    *      The size of iTexCoords (must be multiple of 2)
74    *    iNumFaces
75    *      The number of faces
76    *    iNumVertexPerFace
77    *      Array containing the number of vertices per face.
78    *    iFaceStyle
79    *      Array containing the description style of each faces.
80    *      The style belongs to:
81    *        - TRIANGLE_STRIP: the face indices describe a triangle strip
82    *        - TRIANGLE_FAN  : the face indices describe a triangle fan
83    *        - TRIANGLES     : the face indices describe single triangles
84    *      If iCopy != 0, the array is copied; you must deallocate iFaceStyle. Else you must not.
85    *    iVIndices,
86    *      Array of vertices indices.
87    *      The integers contained in this array must be multiple of 3.
88    *      If iCopy != 0, the array is copied; you must deallocate iVIndices. Else you must not.
89    *    iVISize
90    *      The size of iVIndices.
91    *    iNIndices
92    *      Array of normals indices.
93    *      The integers contained in this array must be multiple of 3.
94    *      If iCopy != 0, the array is copied; you must deallocate iNIndices. Else you must not.
95    *    iNISize
96    *      The size of iNIndices
97    *    iMIndices
98    *      The Material indices (per vertex)
99    *    iMISize
100    *      The size of iMIndices
101    *    iTIndices
102    *      The Texture coordinates indices (per vertex). The integers contained in this array must
103    * be multiple of 2. iTISize The size of iMIndices iCopy 0 : the arrays are not copied. The
104    * pointers passed as arguments are used. IndexedFaceSet takes these arrays desallocation in
105    * charge. 1 : the arrays are copied. The caller is in charge of the arrays, passed as arguments
106    * desallocation.
107    */
108   IndexedFaceSet(float *iVertices,
109                  unsigned iVSize,
110                  float *iNormals,
111                  unsigned iNSize,
112                  FrsMaterial **iMaterials,
113                  unsigned iMSize,
114                  float *iTexCoords,
115                  unsigned iTSize,
116                  unsigned iNumFaces,
117                  unsigned *iNumVertexPerFace,
118                  TRIANGLES_STYLE *iFaceStyle,
119                  FaceEdgeMark *iFaceEdgeMarks,
120                  unsigned *iVIndices,
121                  unsigned iVISize,
122                  unsigned *iNIndices,
123                  unsigned iNISize,
124                  unsigned *iMIndices,
125                  unsigned iMISize,
126                  unsigned *iTIndices,
127                  unsigned iTISize,
128                  unsigned iCopy = 1);
129
130   /*! Builds an indexed face set from an other indexed face set */
131   IndexedFaceSet(const IndexedFaceSet &iBrother);
132
133   void swap(IndexedFaceSet &ioOther)
134   {
135     std::swap(_Vertices, ioOther._Vertices);
136     std::swap(_Normals, ioOther._Normals);
137     std::swap(_FrsMaterials, ioOther._FrsMaterials);
138     std::swap(_TexCoords, ioOther._TexCoords);
139     std::swap(_FaceEdgeMarks, ioOther._FaceEdgeMarks);
140
141     std::swap(_VSize, ioOther._VSize);
142     std::swap(_NSize, ioOther._NSize);
143     std::swap(_MSize, ioOther._MSize);
144     std::swap(_TSize, ioOther._TSize);
145
146     std::swap(_NumFaces, ioOther._NumFaces);
147     std::swap(_NumVertexPerFace, ioOther._NumVertexPerFace);
148     std::swap(_FaceStyle, ioOther._FaceStyle);
149
150     std::swap(_VIndices, ioOther._VIndices);
151     std::swap(_NIndices, ioOther._NIndices);
152     std::swap(_MIndices, ioOther._MIndices);  // Material Indices
153     std::swap(_TIndices, ioOther._TIndices);
154
155     std::swap(_VISize, ioOther._VISize);
156     std::swap(_NISize, ioOther._NISize);
157     std::swap(_MISize, ioOther._MISize);
158     std::swap(_TISize, ioOther._TISize);
159
160     Rep::swap(ioOther);
161   }
162
163   IndexedFaceSet &operator=(const IndexedFaceSet &iBrother)
164   {
165     IndexedFaceSet tmp(iBrother);
166     swap(tmp);
167     return *this;
168   }
169
170   /*! Destructor
171    *  deallocates all the resources
172    */
173   virtual ~IndexedFaceSet();
174
175   /*! Accept the corresponding visitor */
176   virtual void accept(SceneVisitor &v);
177
178   /*! Compute the Bounding Box */
179   virtual void ComputeBBox();
180
181   /*! Accessors */
182   virtual const float *vertices() const
183   {
184     return _Vertices;
185   }
186
187   virtual const float *normals() const
188   {
189     return _Normals;
190   }
191
192   virtual const FrsMaterial *const *frs_materials() const
193   {
194     return _FrsMaterials;
195   }
196
197   virtual const float *texCoords() const
198   {
199     return _TexCoords;
200   }
201
202   virtual const unsigned vsize() const
203   {
204     return _VSize;
205   }
206
207   virtual const unsigned nsize() const
208   {
209     return _NSize;
210   }
211
212   virtual const unsigned msize() const
213   {
214     return _MSize;
215   }
216
217   virtual const unsigned tsize() const
218   {
219     return _TSize;
220   }
221
222   virtual const unsigned numFaces() const
223   {
224     return _NumFaces;
225   }
226
227   virtual const unsigned *numVertexPerFaces() const
228   {
229     return _NumVertexPerFace;
230   }
231
232   virtual const TRIANGLES_STYLE *trianglesStyle() const
233   {
234     return _FaceStyle;
235   }
236
237   virtual const unsigned char *faceEdgeMarks() const
238   {
239     return _FaceEdgeMarks;
240   }
241
242   virtual const unsigned *vindices() const
243   {
244     return _VIndices;
245   }
246
247   virtual const unsigned *nindices() const
248   {
249     return _NIndices;
250   }
251
252   virtual const unsigned *mindices() const
253   {
254     return _MIndices;
255   }
256
257   virtual const unsigned *tindices() const
258   {
259     return _TIndices;
260   }
261
262   virtual const unsigned visize() const
263   {
264     return _VISize;
265   }
266
267   virtual const unsigned nisize() const
268   {
269     return _NISize;
270   }
271
272   virtual const unsigned misize() const
273   {
274     return _MISize;
275   }
276
277   virtual const unsigned tisize() const
278   {
279     return _TISize;
280   }
281
282  protected:
283   float *_Vertices;
284   float *_Normals;
285   FrsMaterial **_FrsMaterials;
286   float *_TexCoords;
287
288   unsigned _VSize;
289   unsigned _NSize;
290   unsigned _MSize;
291   unsigned _TSize;
292
293   unsigned _NumFaces;
294   unsigned *_NumVertexPerFace;
295   TRIANGLES_STYLE *_FaceStyle;
296   FaceEdgeMark *_FaceEdgeMarks;
297
298   unsigned *_VIndices;
299   unsigned *_NIndices;
300   unsigned *_MIndices;  // Material Indices
301   unsigned *_TIndices;  // Texture coordinates Indices
302
303   unsigned _VISize;
304   unsigned _NISize;
305   unsigned _MISize;
306   unsigned _TISize;
307
308 #ifdef WITH_CXX_GUARDEDALLOC
309   MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:IndexedFaceSet")
310 #endif
311 };
312
313 } /* namespace Freestyle */
314
315 #endif  // __FREESTYLE_INDEXED_FACE_SET_H__