OpenMesh
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SubdividerT.hh
Go to the documentation of this file.
1 /*===========================================================================*\
2  * *
3  * OpenMesh *
4  * Copyright (C) 2001-2014 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: 990 $ *
38  * $Date: 2014-02-05 10:01:07 +0100 (Mi, 05 Feb 2014) $ *
39  * *
40 \*===========================================================================*/
41 
46 //=============================================================================
47 //
48 // CLASS SubdividerT
49 //
50 //=============================================================================
51 
52 #ifndef OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH
53 #define OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH
54 
55 //== INCLUDE ==================================================================
56 
57 #include <OpenMesh/Core/System/config.hh>
58 #include <OpenMesh/Core/Utils/Noncopyable.hh>
59 #if defined(_DEBUG) || defined(DEBUG)
60 // Makes life lot easier, when playing/messing around with low-level topology
61 // changing methods of OpenMesh
62 # include <OpenMesh/Tools/Utils/MeshCheckerT.hh>
63 # define ASSERT_CONSISTENCY( T, m ) \
64  assert(OpenMesh::Utils::MeshCheckerT<T>(m).check())
65 #else
66 # define ASSERT_CONSISTENCY( T, m )
67 #endif
68 
69 //== NAMESPACE ================================================================
70 
71 namespace OpenMesh {
72 namespace Subdivider {
73 namespace Uniform {
74 
75 
76 //== CLASS DEFINITION =========================================================
77 
86 template <typename MeshType, typename RealType=float>
88 {
89 public:
90 
91  typedef MeshType mesh_t;
92  typedef RealType real_t;
93 
94 public:
95 
97 
98  SubdividerT(void) : attached_(NULL) { }
101 
104  SubdividerT( MeshType &_m ) : attached_(NULL) { attach(_m); }
105 
107 
109  virtual ~SubdividerT()
110  { detach(); }
111 
113  virtual const char *name( void ) const = 0;
114 
115 
116 public:
117 
119  bool operator () ( MeshType& _m, size_t _n , const bool _update_points = true)
122  {
123  return prepare(_m) && subdivide( _m, _n , _update_points ) && cleanup( _m );
124  }
126 
127 public:
128 
129  bool attach( MeshType& _m )
132  {
133  if ( attached_ == &_m )
134  return true;
135 
136  detach();
137  if (prepare( _m ))
138  {
139  attached_ = &_m;
140  return true;
141  }
142  return false;
143  }
144 
147  bool operator()( size_t _n , const bool _update_points = true)
148  {
149  return attached_ ? subdivide( *attached_, _n , _update_points) : false;
150  }
151 
154  void detach(void)
155  {
156  if ( attached_ )
157  {
158  cleanup( *attached_ );
159  attached_ = NULL;
160  }
161  }
163 
164 protected:
165 
167 
168  virtual bool prepare( MeshType& _m ) = 0;
170 
172  virtual bool subdivide( MeshType& _m, size_t _n, const bool _update_points = true) = 0;
173 
175  virtual bool cleanup( MeshType& _m ) = 0;
177 
178 private:
179 
180  MeshType *attached_;
181 
182 };
183 
184 //=============================================================================
185 } // namespace Uniform
186 } // namespace Subdivider
187 } // namespace OpenMesh
188 //=============================================================================
189 #endif // OPENMESH_SUBDIVIDER_UNIFORM_SUBDIVIDERT_HH
190 //=============================================================================
bool operator()(MeshType &_m, size_t _n, const bool _update_points=true)
Subdivide the mesh _m _n times.
Definition: SubdividerT.hh:121
virtual bool prepare(MeshType &_m)=0
Prepare mesh, e.g. add properties.
bool operator()(size_t _n, const bool _update_points=true)
Subdivide the attached _n times.
Definition: SubdividerT.hh:147
SubdividerT(MeshType &_m)
Constructor to be used with interface 1 (calls attach())
Definition: SubdividerT.hh:104
virtual bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true)=0
Subdivide mesh _m _n times.
bool attach(MeshType &_m)
Attach mesh _m to self.
Definition: SubdividerT.hh:131
SubdividerT(void)
Constructor to be used with interface 2.
Definition: SubdividerT.hh:100
virtual bool cleanup(MeshType &_m)=0
Cleanup mesh after usage, e.g. remove added properties.
void detach(void)
Detach an eventually attached mesh.
Definition: SubdividerT.hh:154
Abstract base class for uniform subdivision algorithms.
Definition: SubdividerT.hh:87
virtual const char * name(void) const =0
Return name of subdivision algorithm.
virtual ~SubdividerT()
Descructor (calls detach())
Definition: SubdividerT.hh:109
This class demonstrates the non copyable idiom.
Definition: Noncopyable.hh:69

acg pic Project OpenMesh, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .