OpenMesh

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MeshKernel.hh
1 /*===========================================================================*\
2 * *
3 * OpenMesh *
4 * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
5 * www.openmesh.org *
6 * *
7 *---------------------------------------------------------------------------*
8 * This file is part of OpenMesh. *
9 * *
10 * OpenMesh is free software: you can redistribute it and/or modify *
11 * it under the terms of the GNU Lesser General Public License as *
12 * published by the Free Software Foundation, either version 3 of *
13 * the License, or (at your option) any later version with the *
14 * following exceptions: *
15 * *
16 * If other files instantiate templates or use macros *
17 * or inline functions from this file, or you compile this file and *
18 * link it with other files to produce an executable, this file does *
19 * not by itself cause the resulting executable to be covered by the *
20 * GNU Lesser General Public License. This exception does not however *
21 * invalidate any other reasons why the executable file might be *
22 * covered by the GNU Lesser General Public License. *
23 * *
24 * OpenMesh is distributed in the hope that it will be useful, *
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27 * GNU Lesser General Public License for more details. *
28 * *
29 * You should have received a copy of the GNU LesserGeneral Public *
30 * License along with OpenMesh. If not, *
31 * see <http://www.gnu.org/licenses/>. *
32 * *
33 \*===========================================================================*/
34
35 /*===========================================================================*\
36 * *
37 * $Revision: 753 $ *
38 * $Date: 2012-10-22 09:33:31 +0200 (Mo, 22. Okt 2012) $ *
39 * *
40 \*===========================================================================*/
41
42
43 //=============================================================================
44 //
45 // Kernel Concept
46 //
47 //=============================================================================
48
49
50 #error this file is for documentation purposes only
51
52
53 //== NAMESPACES ===============================================================
54
55
56 namespace OpenMesh {
57 namespace Concepts {
58
59
60 //== CLASS DEFINITION =========================================================
61
62
75 template <class FinalMeshItems> class KernelT
76 {
77 public:
78
80
81
83 typedef typename FinalMeshItems::Vertex Vertex;
84 typedef typename FinalMeshItems::Halfedge Halfedge;
85 typedef typename FinalMeshItems::Edge Edge;
86 typedef typename FinalMeshItems::Face Face;
87 typedef typename FinalMeshItems::Point Point;
88 typedef typename FinalMeshItems::Scalar Scalar;
89 typedef typename FinalMeshItems::Normal Normal;
90 typedef typename FinalMeshItems::Color Color;
91 typedef typename FinalMeshItems::TexCoord TexCoord;
92 typedef typename FinalMeshItems::VertexHandle VertexHandle;
93 typedef typename FinalMeshItems::HalfedgeHandle HalfedgeHandle;
94 typedef typename FinalMeshItems::EdgeHandle EdgeHandle;
95 typedef typename FinalMeshItems::FaceHandle FaceHandle;
96
98
99
101
102
103 typedef SomeIterator KernelVertexIter;
104 typedef SomeIterator KernelConstVertexIter;
105 typedef SomeIterator KernelEdgeIter;
106 typedef SomeIterator KernelConstEdgeIter;
107 typedef SomeIterator KernelFaceIter;
108 typedef SomeIterator KernelConstFaceIter;
110
112
113
114 KernelT() {}
115
117 ~KernelT();
119
121 KernelT& operator=(const KernelT& _rhs);
122
123
136 void reserve( unsigned int _n_vertices,
137 unsigned int _n_edges,
138 unsigned int _n_faces );
139
140
142
143
144 const Vertex& vertex(VertexHandle _h) const { return deref(_h); }
145 Vertex& vertex(VertexHandle _h) { return deref(_h); }
146 const Halfedge& halfedge(HalfedgeHandle _h) const { return deref(_h); }
147 Halfedge& halfedge(HalfedgeHandle _h) { return deref(_h); }
148 const Edge& edge(EdgeHandle _h) const { return deref(_h); }
149 Edge& edge(EdgeHandle _h) { return deref(_h); }
150 const Face& face(FaceHandle _h) const { return deref(_h); }
151 Face& face(FaceHandle _h) { return deref(_h); }
153
154
156
157
158 VertexHandle handle(const Vertex& _v) const;
159 HalfedgeHandle handle(const Halfedge& _he) const;
160 EdgeHandle handle(const Edge& _e) const;
161 FaceHandle handle(const Face& _f) const;
163
164
166
167
168 VertexHandle vertex_handle(unsigned int _i) const;
169 HalfedgeHandle halfedge_handle(unsigned int _i) const;
170 EdgeHandle edge_handle(unsigned int _i) const;
171 FaceHandle face_handle(unsigned int _i) const;
173
174
176
177
180 void clear();
181
185 void clean();
186
196 void garbage_collection();
197
201 void remove_last_vertex() { vertices_.pop_back(); }
205 void remove_last_edge() { edges_.pop_back(); }
209 void remove_last_face() { faces_.pop_back(); }
210
212
213
214
215
217
218
219 unsigned int n_vertices() const;
221 unsigned int n_halfedges() const;
223 unsigned int n_edges() const;
225 unsigned int n_faces() const;
227 bool vertices_empty() const;
229 bool halfedges_empty() const;
231 bool edges_empty() const;
233 bool faces_empty() const;
235
236
237
239
240
241 HalfedgeHandle halfedge_handle(VertexHandle _vh) const;
243 void set_halfedge_handle(VertexHandle _vh, HalfedgeHandle _heh);
245 const Point& point(VertexHandle _vh) const;
247 const Point& point(const Vertex& _v) const;
249 void set_point(VertexHandle _vh, const Point& _p);
251 void set_point(Vertex& _v, const Point& _p);
253
254
255
256
258
259
260 VertexHandle to_vertex_handle(HalfedgeHandle _heh) const;
263 VertexHandle from_vertex_handle(HalfedgeHandle _heh) const;
265 void set_vertex_handle(HalfedgeHandle _heh, VertexHandle _vh);
268 FaceHandle face_handle(HalfedgeHandle _heh) const;
270 void set_face_handle(HalfedgeHandle _heh, FaceHandle _fh);
272 HalfedgeHandle next_halfedge_handle(HalfedgeHandle _heh) const;
276 void set_next_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _nheh);
280 HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh) const;
282 HalfedgeHandle opposite_halfedge_handle(HalfedgeHandle _heh) const;
284 HalfedgeHandle ccw_rotated_halfedge_handle(HalfedgeHandle _heh) const;
286 HalfedgeHandle cw_rotated_halfedge_handle(HalfedgeHandle _heh) const;
288 EdgeHandle edge_handle(HalfedgeHandle _heh) const;
290
291
292
294
295
296 HalfedgeHandle halfedge_handle(EdgeHandle _eh, unsigned int _i) const;
298
299
300
302
303
304 HalfedgeHandle halfedge_handle(FaceHandle _fh) const;
306 void set_halfedge_handle(FaceHandle _fh, HalfedgeHandle _heh);
308
309
310 public: // Standard Property Management
311
313
314
315 // vertex
316 const Point& point(VertexHandle _vh) const;
317 void set_point(VertexHandle _vh, const Point& _p);
318 Point& point(VertexHandle _vh);
319
320 const Normal& normal(VertexHandle _vh) const;
321 void set_normal(VertexHandle _vh, const Normal& _n);
322
323 const Normal& normal(HalfedgeHandle _heh) const;
324 void set_normal(HalfedgeHandle _heh, const Normal& _n);
325
326 const Color& color(VertexHandle _vh) const;
327 void set_color(VertexHandle _vh, const Color& _c);
328
329 const TexCoord1D& texcoord1D(VertexHandle _vh) const;
330 void set_texcoord1D(VertexHandle _vh, const TexCoord1D& _t);
331
332 const TexCoord2D& texcoord2D(VertexHandle _vh) const;
333 void set_texcoord2D(VertexHandle _vh, const TexCoord2D& _t);
334
335 const TexCoord3D& texcoord3D(VertexHandle _vh) const;
336 void set_texcoord3D(VertexHandle _vh, const TexCoord3D& _t);
337
338 const TexCoord1D& texcoord1D(HalfedgeHandle _hh) const;
339 void set_texcoord1D(HalfedgeHandle _hh, const TexCoord1D& _t);
340
341 const TexCoord2D& texcoord2D(HalfedgeHandle _hh) const;
342 void set_texcoord2D(HalfedgeHandle _hh, const TexCoord2D& _t);
343
344 const TexCoord3D& texcoord3D(HalfedgeHandle _hh) const;
345 void set_texcoord3D(HalfedgeHandle _hh, const TexCoord3D& _t);
346
347 const StatusInfo& status(VertexHandle _vh) const;
348 StatusInfo& status(VertexHandle _vh);
349
350 // halfedge
351 const StatusInfo& status(HalfedgeHandle _vh) const;
352 StatusInfo& status(HalfedgeHandle _vh);
353
354 const Color& color(HalfedgeHandle _heh) const;
355 void set_color(HalfedgeHandle _heh, const Color& _c);
356
357 // edge
358 const Color& color(EdgeHandle _eh) const;
359 void set_color(EdgeHandle _eh, const Color& _c);
360
361
362 const StatusInfo& status(EdgeHandle _vh) const;
363 StatusInfo& status(EdgeHandle _vh);
364
365 // face
366 const Normal& normal(FaceHandle _fh) const;
367 void set_normal(FaceHandle _fh, const Normal& _n);
368
369 const Color& color(FaceHandle _fh) const;
370 void set_color(FaceHandle _fh, const Color& _c);
371
372 const StatusInfo& status(FaceHandle _vh) const;
373 StatusInfo& status(FaceHandle _vh);
374
376
378
379
380 void request_vertex_normals();
381 void request_vertex_colors();
382 void request_vertex_texcoords1D();
383 void request_vertex_texcoords2D();
384 void request_vertex_texcoords3D();
385 void request_vertex_status();
386
387 void request_halfedge_status();
388 void request_halfedge_normals();
389 void request_halfedge_colors();
390 void request_halfedge_texcoords1D();
391 void request_halfedge_texcoords2D();
392 void request_halfedge_texcoords3D();
393
394 void request_edge_status();
395 void request_edge_colors();
396
397 void request_face_normals();
398 void request_face_colors();
399 void request_face_status();
400 void request_face_texture_index();
402
404
405
406 void release_vertex_normals();
407 void release_vertex_colors();
408 void release_vertex_texcoords1D();
409 void release_vertex_texcoords2D();
410 void release_vertex_texcoords3D();
411 void release_vertex_status();
412
413 void release_halfedge_status();
414 void release_halfedge_normals();
415 void release_halfedge_colors();
416 void release_halfedge_texcoords1D();
417 void release_halfedge_texcoords2D();
418 void release_halfedge_texcoords3D();
419
420 void release_edge_status();
421 void release_edge_colors();
422
423 void release_face_normals();
424 void release_face_colors();
425 void release_face_status();
426 void release_face_texture_index();
428
430
431
432 bool has_vertex_normals() const;
433 bool has_vertex_colors() const;
434 bool has_vertex_texcoords1D() const;
435 bool has_vertex_texcoords2D() const;
436 bool has_vertex_texcoords3D() const;
437 bool has_vertex_status() const;
438
439 bool has_halfedge_status() const;
440 bool has_halfedge_normals() const;
441 bool has_halfedge_colors() const;
442 bool has_halfedge_texcoords1D() const;
443 bool has_halfedge_texcoords2D() const;
444 bool has_halfedge_texcoords3D() const;
445
446 bool has_edge_status() const;
447 bool has_edge_colors() const;
448
449 bool has_face_normals() const;
450 bool has_face_colors() const;
451 bool has_face_status() const;
452 bool has_face_texture_index() const;
454
455 public: // Property Management
456
458
460
461
462
463 template <typename T> bool add_property( [VEHFM]PropHandleT<T>& _ph,
464 const std::string& _name = "" );
466
468
469
470 template <typename T> void remove_property( [VEHFM]PropHandleT<T>& );
472
474
475
476 template <typename T>
477 bool get_property_handle( [VEHFM]PropHandleT<T>& ph, const std::string& _n ) const;
479
481
482
483 template <typename T> PropertyT<T>& property( [VEHF]PropHandleT<T> _ph );
484 template <typename T> const PropertyT<T>& property( [VEHF]PropHandleT<T> _ph ) const;
485 template <typename T> PropertyT<T>& mproperty( MPropHandleT<T> _ph );
486 template <typename T> const PropertyT<T>& mproperty( MPropHandleT<T> _ph ) const;
488
490
491
493 template <typename T>
494 T& property( VPropHandleT<T> _ph, VertexHandle _vh );
495 template <typename T>
496 const T& property( VPropHandleT<T> _ph, VertexHandle _vh ) const;
497
498 template <typename T>
499 T& property( EPropHandleT<T> _ph, EdgeHandle _vh );
500 template <typename T>
501 const T& property( EPropHandleT<T> _ph, EdgeHandle _vh ) const;
502
503 template <typename T>
504 T& property( HPropHandleT<T> _ph, HalfedgeHandle _vh );
505 template <typename T>
506 const T& property( HPropHandleT<T> _ph, HalfedgeHandle _vh ) const;
507
508 template <typename T>
509 T& property( FPropHandleT<T> _ph, FaceHandle _vh );
510 template <typename T>
511 const T& property( FPropHandleT<T> _ph, FaceHandle _vh ) const;
512
513 template <typename T>
514 T& property( MPropHandleT<T> _ph );
515 template <typename T>
516 const T& property( MPropHandleT<T> _ph ) const;
517
519
520 public:
521
522
524
525
527 VertexHandle new_vertex();
530 VertexHandle new_vertex(const Point& _p);
533 VertexHandle new_vertex(const Vertex& _v);
539 HalfedgeHandle new_edge(VertexHandle _start_vertex_handle,
540 VertexHandle _end_vertex_handle);
541
545 FaceHandle new_face();
548 FaceHandle new_face(const Face& _f);
550
551
552 // --- iterators ---
553
555
556
558 KernelVertexIter vertices_begin();
559 KernelConstVertexIter vertices_begin() const;
560 KernelVertexIter vertices_end();
561 KernelConstVertexIter vertices_end() const;
562 KernelEdgeIter edges_begin();
563 KernelConstEdgeIter edges_begin() const;
564 KernelEdgeIter edges_end();
565 KernelConstEdgeIter edges_end() const;
566 KernelFaceIter faces_begin();
567 KernelConstFaceIter faces_begin() const;
568 KernelFaceIter faces_end();
569 KernelConstFaceIter faces_end() const;
571
572
573
574 private:
575
576
577 // --- private functions ---
578
580 KernelT(const KernelT& _rhs);
581 };
582 };
583
584
585 //=============================================================================
586 } // namespace Concepts
587 } // namespace OpenMesh
588 //=============================================================================