OpenMesh
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
BaseDecimaterT.hh
Go to the documentation of this file.
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: 737 $ *
38  * $Date: 2012-10-08 09:33:20 +0200 (Mo, 08 Okt 2012) $ *
39  * *
40 \*===========================================================================*/
41 
45 //=============================================================================
46 //
47 // CLASS McDecimaterT
48 //
49 //=============================================================================
50 
51 #ifndef OPENMESH_BASE_DECIMATER_DECIMATERT_HH
52 #define OPENMESH_BASE_DECIMATER_DECIMATERT_HH
53 
54 
55 //== INCLUDES =================================================================
56 
57 #include <memory>
58 
59 #include <OpenMesh/Core/Utils/Property.hh>
61 #include <OpenMesh/Core/Utils/Noncopyable.hh>
62 
63 
64 
65 //== NAMESPACE ================================================================
66 
67 namespace OpenMesh {
68 namespace Decimater {
69 
70 
71 //== CLASS DEFINITION =========================================================
72 
73 
78 {
79 };
80 
81 template < typename MeshT >
83 {
84 public: //-------------------------------------------------------- public types
85 
87  typedef MeshT Mesh;
89  typedef ModBaseT<MeshT> Module;
90  typedef std::vector< Module* > ModuleList;
91  typedef typename ModuleList::iterator ModuleListIterator;
92 
93 public: //------------------------------------------------------ public methods
94  BaseDecimaterT(Mesh& _mesh);
95  virtual ~BaseDecimaterT();
96 
104  bool initialize();
105 
106 
108  bool is_initialized() const { return initialized_; }
109 
110 
112  void info( std::ostream& _os );
113 
114 public: //--------------------------------------------------- module management
115 
117  Mesh& mesh() { return mesh_; }
118 
120  template < typename _Module >
122  {
123  if (_mh.is_valid())
124  return false;
125 
126  _mh.init( new _Module(mesh()) );
127  all_modules_.push_back( _mh.module() );
128 
129  set_uninitialized();
130 
131  return true;
132  }
133 
134 
136  template < typename _Module >
137  bool remove( ModHandleT<_Module>& _mh )
138  {
139  if (!_mh.is_valid())
140  return false;
141 
142  typename ModuleList::iterator it = std::find(all_modules_.begin(),
143  all_modules_.end(),
144  _mh.module() );
145 
146  if ( it == all_modules_.end() ) // module not found
147  return false;
148 
149  delete *it;
150  all_modules_.erase( it ); // finally remove from list
151  _mh.clear();
152 
153  set_uninitialized();
154  return true;
155  }
156 
157 
159  template < typename Module >
161  {
162  assert( _mh.is_valid() );
163  return *_mh.module();
164  }
165 
166 
167 protected:
168 
169  // Reset the initialized flag, and clear the bmodules_ and cmodule_
170  void set_uninitialized() {
171  initialized_ = false;
172  cmodule_ = 0;
173  bmodules_.clear();
174  }
175 
176  void update_modules(CollapseInfo& _ci)
177  {
178  typename ModuleList::iterator m_it, m_end = bmodules_.end();
179  for (m_it = bmodules_.begin(); m_it != m_end; ++m_it)
180  (*m_it)->postprocess_collapse(_ci);
181  cmodule_->postprocess_collapse(_ci);
182  }
183 
184 
185 protected: //---------------------------------------------------- private methods
186 
191  bool is_collapse_legal(const CollapseInfo& _ci);
192 
194  float collapse_priority(const CollapseInfo& _ci);
195 
197  void preprocess_collapse(CollapseInfo& _ci);
198 
200  void postprocess_collapse(CollapseInfo& _ci);
201 
210  void set_error_tolerance_factor(double _factor);
211 
216  void reset(){ initialized_ = false; };
217 
218 
219 private: //------------------------------------------------------- private data
220 
221 
222  // reference to mesh
223  Mesh& mesh_;
224 
225  // list of binary modules
226  ModuleList bmodules_;
227 
228  // the current priority module
229  Module* cmodule_;
230 
231  // list of all allocated modules (including cmodule_ and all of bmodules_)
232  ModuleList all_modules_;
233 
234  // Flag if all modules were initialized
235  bool initialized_;
236 
237 
238 };
239 
240 //=============================================================================
241 } // END_NS_DECIMATER
242 } // END_NS_OPENMESH
243 //=============================================================================
244 #if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_BASE_DECIMATER_DECIMATERT_CC)
245 #define OPENMESH_BASE_DECIMATER_TEMPLATES
246 #include "BaseDecimaterT.cc"
247 #endif
248 //=============================================================================
249 #endif // OPENMESH_BASE_DECIMATER_DECIMATERT_HH defined
250 //=============================================================================

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