⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compositet.hh

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 HH
字号:
//=============================================================================//                                                                            //                               OpenMesh                                     //      Copyright (C) 2001-2005 by Computer Graphics Group, RWTH Aachen       //                           www.openmesh.org                                 //                                                                            //-----------------------------------------------------------------------------//                                                                            //                                License                                     //                                                                            //   This library is free software; you can redistribute it and/or modify it //   under the terms of the GNU Library General Public License as published  //   by the Free Software Foundation, version 2.                             //                                                                             //   This library is distributed in the hope that it will be useful, but       //   WITHOUT ANY WARRANTY; without even the implied warranty of                //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         //   Library General Public License for more details.                          //                                                                            //   You should have received a copy of the GNU Library General Public         //   License along with this library; if not, write to the Free Software       //   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 //                                                                            //-----------------------------------------------------------------------------//                                                                            //   $Revision: 1.3 $//   $Date: 2005-12-21 13:58:54 $//                                                                            //=============================================================================/** \file Adaptive/Composite/CompositeT.hh     *///=============================================================================////  CLASS CompositeT////=============================================================================#ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITET_HH#define OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITET_HH//== INCLUDES =================================================================#include <OpenMesh/Core/System/config.hh>#include <OpenMesh/Tools/Subdivider/Adaptive/Composite/CompositeTraits.hh>// --------------------#include <vector>#include <memory>#include <string>//== NAMESPACE ================================================================namespace OpenMesh   { // BEGIN_NS_OPENMESHnamespace Subdivider { // BEGIN_NS_SUBDIVIDERnamespace Adaptive   { // BEGIN_NS_ADAPTIVE//== CLASS DEFINITION =========================================================template <typename R> struct RuleHandleT;template <typename M> class  RuleInterfaceT;//== CLASS DEFINITION =========================================================/** Adaptive Composite Subdivision framework. * *  The adaptive composite subdivision framework is based on the work *  done by P. Oswald and P. Schroeder. This framework elevates the *  uniform case of the composite scheme to the adaptive *  setting. * *  For details on the composite scheme refer to *  - <a *  href="http://cm.bell-labs.com/who/poswald/sqrt3.pdf">P. Oswald, *  P. Schroeder "Composite primal/dual sqrt(3)-subdivision schemes", *  CAGD 20, 3, 2003, 135--164</a> * *  For details on the transition from uniform to adaptive composite *  subdivision please refer to *  - <a *  href="http://www.eg.org/EG/DL/PE/OPENSG03/04sovakar.pdf>A. von Studnitz, *  A. Sovakar, L. Kobbelt "API Design for Adaptive Subdivision *  Schemes" OpenSG Symposium 2003</a> * *  In the composite scheme a subdivision operator is created by *  combining smaller "atomic" rules. Depending on the selection and *  ordering of the operator many known subdivision schemes can be *  created. * *  Every rule inherits from RuleInterfaceT and is represented out of *  the subdivider object by a RuleHandleT (as usual within *  %OpenMesh). You can add rules using the CompositeT::add() *  functions. The correct order of adding the rules is very *  important, and furthermore not all rules get along with each other *  very well. (Please read the given literature, especially the *  paper by Oswald and Schr鰀er.) *   *  To use a composite subdivider first define a rule sequence *  describing the order of execution of the rules. In the order the *  rules habe been added they will be executed. E.g. the rules given *  in operator notation have to added from right to left.   * *  After the rule sequence has been defined the subdivider has to be *  intialized using CompositeT::initialize(). If everything went well, *  use CompositeT::refine() to subdivide locally a face or vertex. * *  \note Not all (topological) operators have been implemented! *  \note Only triangle meshes are supported. *  \note The rule sequence must begin with a topological operator. * *  \see RuleInterfaceT, RuleHandleT * */ template <typename M> class CompositeT{public:  typedef CompositeT< M >    Self;  typedef RuleInterfaceT<M>  Rule;  typedef M                  Mesh;  typedef std::vector<Rule*> RuleSequence;  typedef typename M::VertexHandle   VH;  typedef typename M::FaceHandle     FH;  typedef typename M::EdgeHandle     EH;  typedef typename M::HalfedgeHandle HH;public:  /// Constructor  CompositeT(Mesh& _mesh)     : subdiv_type_(0),       subdiv_rule_(NULL), /*first_rule_(NULL), last_rule_(NULL),*/ mesh_(_mesh)  { }  ///  virtual ~CompositeT()   { cleanup(); }  /// Reset \c self to state after the default constructor except of  /// the mesh.  void cleanup(void)  {    subdiv_type_ = 0;    subdiv_rule_ = NULL;    std::for_each(rule_sequence_.begin(),                   rule_sequence_.end(), DeleteRule() );    rule_sequence_.clear();  }  /// Initialize faces, edges, vertices, and rules  bool initialize(void);    /// Refine one face.  void refine(typename Mesh::FaceHandle& _fh);  /// Raise one vertex to next final level.  void refine(typename Mesh::VertexHandle& _vh);  /// Return subdivision split type (3 for 1-to-3 split, 4 for 1-to-4 split).  int subdiv_type() { return subdiv_type_; }  // Return subdivision rule.  const Rule& subdiv_rule() const { return *subdiv_rule_; }public:  /// \name Managing composite rules  //*@  /** Add new rule to rule sequence by passing the type of the wanted   *  rule as template argument to the method.   *  \return Valid handle on success. Else it is invalid.   */  template < typename R >  RuleHandleT<R> add()  {    size_t idx = rule_sequence_.size();    rule_sequence_.push_back( new R( mesh_ ) );    return RuleHandleT<R>( (idx < rule_sequence_.size()) ? idx : -1 );  }  /** Add new rule to rule sequence by passing an appropriate handle   *  to the method.   *  \return Valid handle on success. Else it is invalid.   */  template < typename R >  RuleHandleT<R>& add( RuleHandleT<R>& _rh )  {    return _rh = add< R >();  }  /** Get rule in the rule sequence by a handle.     *   * \return The wanted rule if the handle is valid. The return value   * is undefined if the handle is invalid!   */  template < typename R >  typename RuleHandleT<R>::Rule& rule( const RuleHandleT<R>& _rh )  {    typedef typename RuleHandleT<R>::Rule rule_t;    assert( _rh.is_valid() );    return *dynamic_cast<rule_t*>(rule_sequence_[ _rh.idx() ]);  }  /** Get rule (interface) by index   *   * \return The wanted rule if the handle is valid. The return value   * is undefined if the handle is invalid!   */  RuleInterfaceT<M>& rule( size_t _idx )  {    assert( _idx < n_rules() );    return *rule_sequence_[ _idx ];  }  /// Number of rules in the rule sequence  size_t n_rules() const { return rule_sequence_.size(); }  /// Return the sequence as string  std::string rules_as_string(const std::string& _sep= " * ") const;  //@}protected:  /// The rule sequence  const RuleSequence& rules() const { return rule_sequence_; }protected: // helper  // get current generation from state  state_t generation(state_t _s) { return _s-(_s % n_rules()); }  state_t generation( VH _vh ) { return generation(mesh_.deref(_vh).state()); }  state_t generation( EH _eh ) { return generation(mesh_.deref(_eh).state()); }  state_t generation( FH _fh ) { return generation(mesh_.deref(_fh).state()); }private:  // short cuts  Rule* t_rule() { return subdiv_rule_;           }  Rule* f_rule() { return rule_sequence_.front(); }  Rule* l_rule() { return rule_sequence_.back();  }private:  //   RuleSequence rule_sequence_;  // Split type  int   subdiv_type_;  Rule  *subdiv_rule_;//   Rule  *first_rule_; //   Rule  *last_rule_;  //  Mesh  &mesh_;private: // helper#ifndef DOXY_IGNORE_THIS  struct DeleteRule { void operator()( Rule* _r ) { delete _r; } };#endifprivate:  CompositeT( const CompositeT& );  CompositeT& operator = ( const CompositeT );};   //=============================================================================} // END_NS_ADAPTIVE} // END_NS_SUBDIVIDER} // END_NS_OPENMESH//=============================================================================#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITET_CC)#  define OPENMESH_SUBDIVIDER_TEMPLATES#  include "CompositeT.cc"#endif//=============================================================================#endif // OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITET_HH defined//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -