From 0279f7eaf4ddd9d8d950d1413ed38e61aa166bcf Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Wed, 22 Mar 2017 11:16:48 +0100 Subject: [PATCH] Prepare Surface_mesh_item for selection_plugin --- .../Polyhedron/Scene_surface_mesh_item.cpp | 60 ++++++++ .../demo/Polyhedron/Scene_surface_mesh_item.h | 129 ++++++++++++++++++ 2 files changed, 189 insertions(+) diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 3df77688098..513676ff7a5 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -13,6 +13,7 @@ #include #include "triangulate_primitive.h" +#include "properties.h" typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -107,6 +108,9 @@ struct Scene_surface_mesh_item_priv{ Scene_surface_mesh_item *item; mutable SMesh::Property_map fpatch_id_map; + mutable SMesh::Property_map v_selection_map; + mutable SMesh::Property_map f_selection_map; + Color_vector colors_; void computeElements() const; }; @@ -161,6 +165,60 @@ Scene_surface_mesh_item::clone() const { return new Scene_surface_mesh_item(*this); } +Scene_surface_mesh_item::Vertex_selection_map +Scene_surface_mesh_item::vertex_selection_map() +{ + if(! d->v_selection_map){ + d->v_selection_map = d->smesh_->add_property_map("v:selection").first; + } + return d->v_selection_map; +} + +Scene_surface_mesh_item::Face_selection_map +Scene_surface_mesh_item::face_selection_map() +{ + if(! d->f_selection_map){ + d->f_selection_map = d->smesh_->add_property_map("f:selection").first; + } + return d->f_selection_map; +} + +// AF: is this expensive in practice?? +/* +Scene_surface_mesh_item::Halfedge_is_feature_map +get(halfedge_is_feature_t, Scene_surface_mesh_item::SMesh& smesh) +{ + return smesh.add_property_map("h:is_feature").first; +} + + +Scene_surface_mesh_item::Face_patch_id_map +get(face_patch_id_t, Scene_surface_mesh_item::SMesh& smesh) +{ + return smesh.add_property_map("f:patch_id").first; +} + + +Scene_surface_mesh_item::Face_selection_map +get(face_selection_t, Scene_surface_mesh_item::SMesh& smesh) +{ + return smesh.add_property_map("f:selection").first; +} + + +Scene_surface_mesh_item::Vertex_selection_map +get(vertex_selection_t, Scene_surface_mesh_item::SMesh& smesh) +{ + return smesh.add_property_map("v:selection").first; +} + +inline +Scene_surface_mesh_item::Vertex_num_feature_edges_map +get(vertex_num_feature_edges_t, Scene_surface_mesh_item::SMesh& smesh) +{ + return smesh.add_property_map("v:nfe").first; +} +*/ std::vector& Scene_surface_mesh_item::color_vector() { @@ -763,3 +821,5 @@ void Scene_surface_mesh_item::invalidateOpenGLBuffers() d->smesh_->collect_garbage(); } + + diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h index 3ec956fd9f9..54bc7686ea5 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h @@ -20,6 +20,8 @@ #include +#include "properties.h" + struct Scene_surface_mesh_item_priv; class SCENE_SURFACE_MESH_ITEM_EXPORT Scene_surface_mesh_item @@ -32,6 +34,14 @@ public: typedef CGAL::Surface_mesh SMesh; typedef SMesh FaceGraph; typedef boost::graph_traits::face_descriptor face_descriptor; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef SMesh::Property_map Vertex_selection_map; + typedef SMesh::Property_map Face_selection_map; + typedef SMesh::Property_map Halfedge_is_feature_map; + typedef SMesh::Property_map Face_patch_id_map; + typedef SMesh::Property_map Vertex_num_feature_edges_map; + Scene_surface_mesh_item(); // Takes ownership of the argument. @@ -55,6 +65,20 @@ public: Bbox bbox() const Q_DECL_OVERRIDE; QString toolTip() const Q_DECL_OVERRIDE; + // Only needed for Scene_polyhedron_item + void setItemIsMulticolor(bool){} + void update_vertex_indices(){} + void update_halfedge_indices(){} + void update_facet_indices(){} + + Vertex_selection_map vertex_selection_map(); + Face_selection_map face_selection_map(); + + std::vector& color_vector(); + void set_patch_id(SMesh::Face_index f,int i)const; + int patch_id(SMesh::Face_index f)const; + bool supportsRenderingMode(RenderingMode m) const; + SMesh* polyhedron(); const SMesh* polyhedron() const; @@ -68,6 +92,111 @@ protected: friend struct Scene_surface_mesh_item_priv; Scene_surface_mesh_item_priv* d; }; +#if 0 +Scene_surface_mesh_item::Halfedge_is_feature_map +get(halfedge_is_feature_t, Scene_surface_mesh_item::SMesh& smesh); + +Scene_surface_mesh_item::Face_patch_id_map +get(face_patch_id_t, Scene_surface_mesh_item::SMesh& smesh); + +Scene_surface_mesh_item::Vertex_selection_map +get(vertex_selection_t, Scene_surface_mesh_item::SMesh& smesh); + +Scene_surface_mesh_item::Face_selection_map +get(face_selection_t, Scene_surface_mesh_item::SMesh& smesh); + +Scene_surface_mesh_item::Vertex_num_feature_edges_map +get(vertex_num_feature_edges_t, Scene_surface_mesh_item::SMesh& smesh); +#else +Scene_surface_mesh_item::Halfedge_is_feature_map +inline get(halfedge_is_feature_t, Scene_surface_mesh_item::SMesh& smesh) +{ + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + return smesh.add_property_map("h:is_feature").first; +} + + +Scene_surface_mesh_item::Face_patch_id_map +inline get(face_patch_id_t, Scene_surface_mesh_item::SMesh& smesh) +{ + typedef boost::graph_traits::face_descriptor face_descriptor; + return smesh.add_property_map("f:patch_id").first; +} + + +Scene_surface_mesh_item::Face_selection_map +inline get(face_selection_t, Scene_surface_mesh_item::SMesh& smesh) +{ + typedef boost::graph_traits::face_descriptor face_descriptor; + return smesh.add_property_map("f:selection").first; +} + + +Scene_surface_mesh_item::Vertex_selection_map +inline get(vertex_selection_t, Scene_surface_mesh_item::SMesh& smesh) +{ + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + return smesh.add_property_map("v:selection").first; +} + +inline +Scene_surface_mesh_item::Vertex_num_feature_edges_map +inline get(vertex_num_feature_edges_t, Scene_surface_mesh_item::SMesh& smesh) +{ + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + return smesh.add_property_map("v:nfe").first; +} +#endif + +namespace boost { + + template <> + struct property_map + { + typedef Scene_surface_mesh_item::SMesh SMesh; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef SMesh::Property_map type; + }; + + template <> + struct property_map + { + typedef Scene_surface_mesh_item::SMesh SMesh; + typedef boost::graph_traits::face_descriptor face_descriptor; + + typedef SMesh::Property_map type; + }; + + template <> + struct property_map + { + typedef Scene_surface_mesh_item::SMesh SMesh; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + typedef SMesh::Property_map type; + }; + + template <> + struct property_map + { + typedef Scene_surface_mesh_item::SMesh SMesh; + typedef boost::graph_traits::face_descriptor face_descriptor; + + typedef SMesh::Property_map type; + }; + + template <> + struct property_map + { + typedef Scene_surface_mesh_item::SMesh SMesh; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + typedef SMesh::Property_map type; + }; + +} + #endif /* CGAL_SCENE_SURFACE_MESH_ITEM_H */