// Copyright (c) 2012 GeometryFactory (France). All rights reserved. // All rights reserved. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is part of CGAL (www.cgal.org); 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 of the License. // See the file LICENSE.LGPL distributed with CGAL. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // // Author(s) : Philipp Möller #ifndef CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H #define CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H #include #include #include namespace CGAL { template class OM_edge_weight_pmap : public boost::put_get_helper::Scalar , OM_edge_weight_pmap > { public: typedef boost::readable_property_map_tag category; typedef typename OpenMesh::PolyMesh_ArrayKernelT::Scalar value_type; typedef value_type reference; typedef typename boost::graph_traits >::edge_descriptor key_type; OM_edge_weight_pmap(const OpenMesh::PolyMesh_ArrayKernelT& sm) : sm_(sm) {} value_type operator[](const key_type& e) const { return sm_.calc_edge_length(e.halfedge()); } private: const OpenMesh::PolyMesh_ArrayKernelT& sm_; }; template class OM_is_border_pmap { public: typedef boost::read_write_property_map_tag category; typedef bool value_type; typedef bool reference; typedef Key key_type; OM_is_border_pmap(const OpenMesh::PolyMesh_ArrayKernelT& sm) : sm_(sm) {} friend reference get(OM_is_border_pmap pm, key_type k) { return pm.sm_.is_boundary(k); } friend void put(OM_is_border_pmap pm, key_type k , bool b) { if(b){ const_cast& >(pm.sm_).set_face_handle(k, typename OpenMesh::PolyMesh_ArrayKernelT::FaceHandle()); } } private: const OpenMesh::PolyMesh_ArrayKernelT& sm_; }; template class OM_index_pmap : public boost::put_get_helper > { public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef std::size_t reference; typedef VEF key_type; value_type operator[](const key_type& vd) const { return vd.idx(); } }; template class OM_point_pmap //: public boost::put_get_helper > { public: typedef boost::read_write_property_map_tag category; #if defined(CGAL_USE_OM_POINTS) typedef typename OpenMesh::PolyMesh_ArrayKernelT::Point value_type; typedef typename const OpenMesh::PolyMesh_ArrayKernelT::Point& reference; #else typedef P value_type; typedef P reference; #endif typedef typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT >::vertex_descriptor key_type; OM_point_pmap() : sm_(NULL) {} OM_point_pmap(const OpenMesh::PolyMesh_ArrayKernelT& sm) : sm_(&sm) {} OM_point_pmap(const OM_point_pmap& pm) : sm_(pm.sm_) {} inline friend reference get(const OM_point_pmap& pm, key_type v) { #if defined(CGAL_USE_OM_POINTS) return pm.sm->.point(v); #else typename OpenMesh::PolyMesh_ArrayKernelT::Point const& omp = pm.sm_->point(v); return value_type(omp[0], omp[1], omp[2]); #endif } inline friend void put(const OM_point_pmap& pm, key_type v, const value_type& p) { #if defined(CGAL_USE_OM_POINTS) const_cast&>(*pm.sm_).set_point(v,p); #else const_cast&>(*pm.sm_).set_point (v, typename OpenMesh::PolyMesh_ArrayKernelT::Point(p[0], p[1], p[2])); #endif } private: const OpenMesh::PolyMesh_ArrayKernelT* sm_; }; } // CGAL // overloads and specializations in the boost namespace namespace boost { // // edge_weight // template struct property_map, boost::edge_weight_t > { typedef CGAL::OM_edge_weight_pmap type; typedef CGAL::OM_edge_weight_pmap const_type; }; // // vertex_index // template struct property_map, boost::vertex_index_t > { typedef CGAL::OM_index_pmap >::vertex_descriptor> type; typedef CGAL::OM_index_pmap >::vertex_descriptor> const_type; }; // // face_index // template struct property_map, boost::face_index_t > { typedef CGAL::OM_index_pmap >::face_descriptor> type; typedef CGAL::OM_index_pmap >::face_descriptor> const_type; }; // // edge_index // template struct property_map, boost::edge_index_t > { typedef CGAL::OM_index_pmap >::edge_descriptor> type; typedef CGAL::OM_index_pmap >::edge_descriptor> const_type; }; // // halfedge_index // template struct property_map, boost::halfedge_index_t > { typedef CGAL::OM_index_pmap >::halfedge_descriptor> type; typedef CGAL::OM_index_pmap >::halfedge_descriptor> const_type; }; template struct property_map, boost::vertex_point_t > { typedef CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P; typedef CGAL::OM_point_pmap type; typedef type const_type; }; // // vertex_is_border // template struct property_map, CGAL::vertex_is_border_t > { typedef CGAL::OM_is_border_pmap >::vertex_descriptor> type; typedef type const_type; }; // // halfedge_is_border // template struct property_map, CGAL::halfedge_is_border_t > { typedef CGAL::OM_is_border_pmap >::halfedge_descriptor> type; typedef type const_type; }; } // namespace boost namespace boost { template typename boost::property_map, boost::edge_weight_t>::const_type get(boost::edge_weight_t, const OpenMesh::PolyMesh_ArrayKernelT& sm) { return CGAL::OM_edge_weight_pmap(sm); } template typename OpenMesh::PolyMesh_ArrayKernelT::Scalar get(boost::edge_weight_t, const OpenMesh::PolyMesh_ArrayKernelT& sm, const typename boost::graph_traits >::edge_descriptor& e) { return CGAL::OM_edge_weight_pmap(sm)[e]; } template CGAL::OM_index_pmap >::vertex_descriptor> get(const boost::vertex_index_t&, const OpenMesh::PolyMesh_ArrayKernelT&) { return CGAL::OM_index_pmap >::vertex_descriptor>(); } template typename boost::property_map, boost::face_index_t>::const_type get(const boost::face_index_t&, const OpenMesh::PolyMesh_ArrayKernelT&) { return CGAL::OM_index_pmap >::face_descriptor>(); } template CGAL::OM_index_pmap >::edge_descriptor> get(const boost::edge_index_t&, const OpenMesh::PolyMesh_ArrayKernelT&) { return CGAL::OM_index_pmap >::edge_descriptor>(); } template CGAL::OM_index_pmap >::halfedge_descriptor> get(const boost::halfedge_index_t&, const OpenMesh::PolyMesh_ArrayKernelT&) { return CGAL::OM_index_pmap >::halfedge_descriptor>(); } template CGAL::OM_point_pmap get(boost::vertex_point_t, const OpenMesh::PolyMesh_ArrayKernelT& g) { typedef typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P; return CGAL::OM_point_pmap(g); } template CGAL::OM_is_border_pmap >::vertex_descriptor> get(boost::vertex_is_border_t, const OpenMesh::PolyMesh_ArrayKernelT& g) { return CGAL::OM_is_border_pmap >::vertex_descriptor>(g); } template CGAL::OM_is_border_pmap >::halfedge_descriptor> get(boost::halfedge_is_border_t, const OpenMesh::PolyMesh_ArrayKernelT& g) { return CGAL::OM_is_border_pmap >::halfedge_descriptor>(g); } // get for intrinsic properties #define CGAL_OM_INTRINSIC_PROPERTY(RET, PROP, TYPE) \ template \ RET \ get(PROP p, const OpenMesh::PolyMesh_ArrayKernelT& sm, \ typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT >::TYPE x) \ { return get(get(p, sm), x); } \ CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::vertex_index_t, vertex_descriptor) CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::edge_index_t, edge_descriptor) CGAL_OM_INTRINSIC_PROPERTY(int, boost::halfedge_index_t, halfedge_descriptor) CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::face_index_t, face_descriptor) // CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::halfedge_index_t, face_descriptor) CGAL_OM_INTRINSIC_PROPERTY(typename OpenMesh::PolyMesh_ArrayKernelT::Point const&, boost::vertex_point_t, vertex_descriptor) CGAL_OM_INTRINSIC_PROPERTY(bool, boost::vertex_is_border_t, vertex_descriptor) CGAL_OM_INTRINSIC_PROPERTY(bool, boost::halfedge_is_border_t, halfedge_descriptor) #undef CGAL_OM_INTRINSIC_PROPERTY // put for intrinsic properties // only available for vertex_point template void put(boost::vertex_point_t p, OpenMesh::PolyMesh_ArrayKernelT& g, typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT >::vertex_descriptor vd, const typename K::Point& point) { put(get(p,g), vd, point); } } // namespace boost #endif /* CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H */