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

📄 compositetraits.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.2 $//   $Date: 2005-12-21 13:58:54 $//                                                                            //=============================================================================/** \file Subdivider/Adaptive/Composite/CompositeTraits.hh    Mesh traits for adaptive composite subdivider. *///=============================================================================////  CLASS Traits////=============================================================================#ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH#define OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH//== INCLUDES =================================================================#include <map>#include <OpenMesh/Core/Mesh/Traits.hh>//== NAMESPACE ================================================================namespace OpenMesh   { // BEGIN_NS_OPENMESHnamespace Subdivider { // BEGIN_NS_DECIMATERnamespace Adaptive   { // BEGIN_NS_UNIFORM//== CLASS DEFINITION =========================================================/** Adaptive Composite Subdivision framework.*/// typedef unsigned short state_t;// const state_t mask_final = 1 << ((sizeof(state_t)*8)-1);// const state_t mask_state = ~mask_final;/** Mesh traits for adaptive composite subdivision */struct CompositeTraits : public OpenMesh::DefaultTraits{  typedef int  state_t; ///< External representation for intermediate state  typedef bool final_t; ///< External representation for final flag      /// Storage type for intermediate states and the final flag of a mesh entity.  struct State  {    int      state : 31;    unsigned final : 1;  };    // ---------------------------------------- attributes  // add face normals  FaceAttributes( OpenMesh::Attributes::Normal );    // add vertex normals  VertexAttributes( OpenMesh::Attributes::Normal );    // add previous halfedge handle  HalfedgeAttributes( OpenMesh::Attributes::PrevHalfedge );  // ---------------------------------------- items  FaceTraits  {      private:        typedef typename Refs::Point Point;    typedef typename Refs::HalfedgeHandle HalfedgeHandle;    typedef std::map<state_t, Point> PositionHistory;        State                state_;    HalfedgeHandle       red_halfedge_;        PositionHistory      pos_map_;      public:        // face state    state_t state() const { return state_t(state_.state); }    void    set_state(const state_t _s) { state_.state = _s; }    void    inc_state() { ++state_.state; }        // face not final if divided (loop) or edge not flipped (sqrt(3))    final_t final() const   { return final_t(state_.final); }    void    set_final()     { state_.final = true; }    void    set_not_final() { state_.final = false; }        // halfedge of dividing edge (red-green triangulation)    const HalfedgeHandle& red_halfedge() const { return red_halfedge_; }    void  set_red_halfedge(const HalfedgeHandle& _h) { red_halfedge_ = _h; }        // position of face, depending on generation _i.     void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }    const Point position(const int& _i) {       if (pos_map_.find(_i) != pos_map_.end())	return pos_map_[_i];      else {		if (_i <= 0) {	  return Point(0.0, 0.0, 0.0);	}        	return position(_i - 1);      }    }  }; // end class FaceTraits      EdgeTraits  {      private:        typedef typename Refs::Point Point;    typedef std::map<state_t, Point> PositionHistory;        State           state_;    PositionHistory pos_map_;      public:         typedef typename Refs::Scalar Scalar;        // Scalar weight_;        // state of edge    state_t state() const { return state_t(state_.state); }    void    set_state(const state_t _s) { state_.state = _s; }    void    inc_state() { ++state_.state; }        // edge not final if dividing face (Loop) or edge not flipped (SQRT(3))    final_t final() const   { return final_t(state_.final); }    void    set_final()     { state_.final = true; }    void    set_not_final() { state_.final = false; }        // position of edge, depending on generation _i.     void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }        const Point position(const int& _i) {              if (pos_map_.find(_i) != pos_map_.end())         return pos_map_[_i];      else       {	if (_i <= 0) 	{	  const Point zero_point(0.0, 0.0, 0.0);	  return zero_point;	}        	return position(_i - 1);      }    }  }; // end class EdgeTraits  VertexTraits  {  private:    typedef typename Refs::Point Point;    typedef std::map<state_t, Point> PositionHistory;    State           state_;    PositionHistory pos_map_;  public:    // state of vertex    state_t state() const { return state_.state; }    void    set_state(const state_t _s) { state_.state = _s; }    void    inc_state() { ++state_.state; }    // usually not needed by loop or sqrt(3)    final_t final() const   { return state_.final; }    void    set_final()     { state_.final = true; }    void    set_not_final() { state_.final = false; }    // position of vertex, depending on generation _i. (not for display)    void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }    const Point position(const int& _i) {       if (pos_map_.find(_i) != pos_map_.end()) 	return pos_map_[_i];      else {	if (_i <= 0) {	  const Point zero_point(0.0, 0.0, 0.0);	  return zero_point;	}	return position(_i - 1);      }    }  }; // end class VertexTraits}; // end class CompositeTraits// export items to namespace to maintain compatibilitytypedef CompositeTraits::state_t state_t;typedef CompositeTraits::final_t final_t;typedef CompositeTraits::State   State;//=============================================================================} // END_NS_ADAPTIVE} // END_NS_SUBDIVIDER} // END_NS_OPENMESH//=============================================================================#endif // OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH defined//=============================================================================

⌨️ 快捷键说明

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