//============================================================================= // // OpenMesh // Copyright (C) 2003 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 Lesser General Public License as published // by the Free Software Foundation, version 2.1. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // //----------------------------------------------------------------------------- // // $Revision$ // $Date$ // //============================================================================= /** \file RulesT.hh */ //============================================================================= // // Composite Subdivision and Averaging Rules // //============================================================================= #ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH #define OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH //== INCLUDES ================================================================= #include #include // -------------------- STL #include #if defined(OM_CC_MIPS) // avoid warnings # define MIPS_WARN_WA( Item ) \ void raise(typename M:: ## Item ## Handle &_h, state_t _target_state ) \ { Inherited::raise(_h, _target_state); } #else # define MIPS_WARN_WA( Item ) #endif //== NAMESPACE ================================================================ namespace OpenMesh { // BEGIN_NS_OPENMESH namespace Subdivider { // BEGIN_NS_SUBDIVIDER namespace Adaptive { // BEGIN_NS_ADAPTIVE //== CLASS DEFINITION ========================================================= /** Adaptive Composite Subdivision framework. */ //============================================================================= /** Topological composite rule Tvv,3 doing a 1-3 split of a face. */ template class Tvv3 : public RuleInterfaceT { COMPOSITE_RULE( Tvv3, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; Tvv3(M& _mesh) : Inherited(_mesh) { Base::set_subdiv_type(3); }; void raise(typename M::FaceHandle& _fh, state_t _target_state); void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Edge); // avoid warning }; //============================================================================= /** Topological composite rule Tvv,4 doing a 1-4 split of a face */ template class Tvv4 : public RuleInterfaceT { COMPOSITE_RULE( Tvv4, M ); private: typedef RuleInterfaceT Base; public: typedef typename M::HalfedgeHandle HEH; typedef typename M::VertexHandle VH; typedef RuleInterfaceT Inherited; Tvv4(M& _mesh) : Inherited(_mesh) { Base::set_subdiv_type(4); }; void raise(typename M::FaceHandle& _fh, state_t _target_state); void raise(typename M::VertexHandle& _vh, state_t _target_state); void raise(typename M::EdgeHandle& _eh, state_t _target_state); private: void split_edge(HEH& _hh, VH& _vh, state_t _target_state); void check_edge(const typename M::HalfedgeHandle& _hh, state_t _target_state); }; //============================================================================= /** Composite rule VF */ template class VF : public RuleInterfaceT { COMPOSITE_RULE( VF, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VF(M& _mesh) : Inherited(_mesh) {} void raise(typename M::FaceHandle& _fh, state_t _target_state); MIPS_WARN_WA(Edge); MIPS_WARN_WA(Vertex); }; //============================================================================= /** Composite rule FF */ template class FF : public RuleInterfaceT { COMPOSITE_RULE( FF, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; FF(M& _mesh) : Inherited(_mesh) {} void raise(typename M::FaceHandle& _fh, state_t _target_state); MIPS_WARN_WA(Vertex); // avoid warning MIPS_WARN_WA(Edge ); // avoid warning }; //============================================================================= /** Composite rule FFc */ template class FFc : public RuleInterfaceT { COMPOSITE_RULE( FFc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; FFc(M& _mesh) : Inherited(_mesh) {} void raise(typename M::FaceHandle& _fh, state_t _target_state); MIPS_WARN_WA(Vertex); // avoid warning MIPS_WARN_WA(Edge ); // avoid warning }; //============================================================================= /** Composite rule FV */ template class FV : public RuleInterfaceT { COMPOSITE_RULE( FV, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; FV(M& _mesh) : Inherited(_mesh) {} void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning }; //============================================================================= /** Composite rule FVc */ template class FVc : public RuleInterfaceT { COMPOSITE_RULE( FVc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; FVc(M& _mesh) : Inherited(_mesh) { init_coeffs(50); } void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning static void init_coeffs(size_t _max_valence); static const std::vector& coeffs() { return coeffs_; } double coeff( size_t _valence ) { assert(_valence < coeffs_.size()); return coeffs_[_valence]; } private: static std::vector coeffs_; }; //============================================================================= /** Composite rule VV */ template class VV : public RuleInterfaceT { COMPOSITE_RULE( VV, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VV(M& _mesh) : Inherited(_mesh) {} void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning }; //============================================================================= /** Composite rule VVc */ template class VVc : public RuleInterfaceT { COMPOSITE_RULE( VVc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VVc(M& _mesh) : Inherited(_mesh) {} void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning }; //============================================================================= /** Composite rule VE */ template class VE : public RuleInterfaceT { COMPOSITE_RULE( VE, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VE(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule VdE */ template class VdE : public RuleInterfaceT { COMPOSITE_RULE( VdE, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VdE(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule VdEc */ template class VdEc : public RuleInterfaceT { COMPOSITE_RULE( VdEc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; VdEc(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule EV */ template class EV : public RuleInterfaceT { COMPOSITE_RULE( EV, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; EV(M& _mesh) : Inherited(_mesh) {} void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning }; //============================================================================= /** Composite rule EVc */ template class EVc : public RuleInterfaceT { COMPOSITE_RULE( EVc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; EVc(M& _mesh) : Inherited(_mesh) { init_coeffs(50); } void raise(typename M::VertexHandle& _vh, state_t _target_state); MIPS_WARN_WA(Face); // avoid warning MIPS_WARN_WA(Edge); // avoid warning static void init_coeffs(size_t _max_valence); static const std::vector& coeffs() { return coeffs_; } double coeff( size_t _valence ) { assert(_valence < coeffs_.size()); return coeffs_[_valence]; } private: static std::vector coeffs_; }; //============================================================================= /** Composite rule EF */ template class EF : public RuleInterfaceT { COMPOSITE_RULE( EF, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; EF(M& _mesh) : Inherited(_mesh) {} void raise(typename M::FaceHandle& _fh, state_t _target_state); MIPS_WARN_WA(Edge ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule FE */ template class FE : public RuleInterfaceT { COMPOSITE_RULE( FE, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; FE(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule EdE */ template class EdE : public RuleInterfaceT { COMPOSITE_RULE( EdE, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; EdE(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; //============================================================================= /** Composite rule EdEc */ template class EdEc : public RuleInterfaceT { COMPOSITE_RULE( EdEc, M ); private: typedef RuleInterfaceT Base; public: typedef RuleInterfaceT Inherited; EdEc(M& _mesh) : Inherited(_mesh) {} void raise(typename M::EdgeHandle& _eh, state_t _target_state); MIPS_WARN_WA(Face ); // avoid warning MIPS_WARN_WA(Vertex); // avoid warning }; // ---------------------------------------------------------------------------- #undef MIPS_WARN_WA //============================================================================= } // END_NS_ADAPTIVE } // END_NS_SUBDIVIDER } // END_NS_OPENMESH //============================================================================= #if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_CC) # define OPENMESH_SUBDIVIDER_TEMPLATES # include "RulesT.cc" #endif //============================================================================= #endif // OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH defined //=============================================================================