From 2823f46f983f9cb7f2b74cd6fd5d88d273aa2075 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 24 Jul 2018 11:45:36 +0200 Subject: [PATCH] De-activate inclusion test and make both items movable. --- .../AABB_tree/Do_trees_intersect_plugin.cpp | 110 +++++++++++------- .../AABB_tree/Scene_movable_sm_item.cpp | 41 +++++++ .../AABB_tree/Scene_movable_sm_item.h | 4 +- 3 files changed, 114 insertions(+), 41 deletions(-) diff --git a/AABB_tree/demo_plugin/AABB_tree/Do_trees_intersect_plugin.cpp b/AABB_tree/demo_plugin/AABB_tree/Do_trees_intersect_plugin.cpp index aba3bf6945b..e708ba8b984 100644 --- a/AABB_tree/demo_plugin/AABB_tree/Do_trees_intersect_plugin.cpp +++ b/AABB_tree/demo_plugin/AABB_tree/Do_trees_intersect_plugin.cpp @@ -39,8 +39,8 @@ public: const int indexB = scene->selectionBindex(); return qobject_cast(scene->item(indexA)) && qobject_cast(scene->item(indexB)) - && fixed_item == NULL - && moving_item == NULL; + && base_item == NULL + && query_item == NULL; } QList actions() const Q_DECL_OVERRIDE @@ -62,8 +62,8 @@ public: } t1 = 0; t2 = 0; - moving_item = 0; - fixed_item = 0; + query_item = 0; + base_item = 0; } private Q_SLOTS: void start() @@ -75,14 +75,14 @@ private Q_SLOTS: Scene_surface_mesh_item* itemB = qobject_cast(scene->item(indexB)); connect(itemA, &Scene_surface_mesh_item::aboutToBeDestroyed, [this](){ - if(moving_item) - scene->erase(scene->item_id(moving_item)); + if(query_item) + scene->erase(scene->item_id(query_item)); cleanup(); }); connect(itemB, &Scene_surface_mesh_item::aboutToBeDestroyed, [this](){ - if(moving_item) - scene->erase(scene->item_id(moving_item)); + if(query_item) + scene->erase(scene->item_id(query_item)); cleanup(); }); @@ -95,21 +95,31 @@ private Q_SLOTS: (itemB->bbox().min(1) + itemB->bbox().max(1))/2.0, (itemB->bbox().min(2) + itemB->bbox().max(2))/2.0); - moving_item = new Scene_movable_sm_item(pos,tm2,""); - connect(moving_item, &Scene_surface_mesh_item::aboutToBeDestroyed, + query_item = new Scene_movable_sm_item(pos,tm2,""); + connect(query_item, &Scene_surface_mesh_item::aboutToBeDestroyed, [this](){ cleanup(); }); - fixed_item = itemA; - connect(moving_item->manipulatedFrame(), &CGAL::qglviewer::ManipulatedFrame::modified, + connect(query_item->manipulatedFrame(), &CGAL::qglviewer::ManipulatedFrame::modified, this, &DoTreesIntersectplugin::update_trees); - moving_item->setRenderingMode(Flat); - moving_item->setName(itemB->name()); + query_item->setRenderingMode(Flat); + query_item->setName(itemB->name()); itemB->setVisible(false); - itemA->setRenderingMode(Wireframe); - scene->addItem(moving_item); + itemA->setVisible(false); + scene->setSelectedItem(scene->addItem(query_item)); + base_item = new Scene_movable_sm_item(pos,tm,""); + connect(base_item, &Scene_surface_mesh_item::aboutToBeDestroyed, + [this](){ + cleanup(); + }); + connect(base_item->manipulatedFrame(), &CGAL::qglviewer::ManipulatedFrame::modified, + this, &DoTreesIntersectplugin::update_trees); + base_item->setRenderingMode(Wireframe); + base_item->setName(itemA->name()); + scene->addItem(base_item); update_trees(); - moving_item->redraw(); + query_item->redraw(); + base_item->redraw(); QApplication::restoreOverrideCursor(); } public Q_SLOTS: @@ -117,40 +127,60 @@ public Q_SLOTS: { CGAL::Three::Viewer_interface* viewer = static_cast( CGAL::QGLViewer::QGLViewerPool().first()); - const double* matrix = moving_item->manipulatedFrame()->matrix(); - moving_item->setFMatrix(matrix); - EPICK::Aff_transformation_3 translation(CGAL::TRANSLATION, -EPICK::Vector_3(moving_item->center().x, - moving_item->center().y, - moving_item->center().z)); - EPICK::Aff_transformation_3 rota( - matrix[0], matrix[4], matrix[8],matrix[12], - matrix[1], matrix[5], matrix[9],matrix[13], - matrix[2], matrix[6], matrix[10],matrix[14]); - EPICK::Aff_transformation_3 transfo = - rota*translation; - t2->traits().set_transformation(transfo); + + const double* matrixB = base_item->manipulatedFrame()->matrix(); + base_item->setFMatrix(matrixB); + EPICK::Aff_transformation_3 translationB(CGAL::TRANSLATION, -EPICK::Vector_3(base_item->center().x, + base_item->center().y, + base_item->center().z)); + EPICK::Aff_transformation_3 rotaB( + matrixB[0], matrixB[4], matrixB[8],matrixB[12], + matrixB[1], matrixB[5], matrixB[9],matrixB[13], + matrixB[2], matrixB[6], matrixB[10],matrixB[14]); + EPICK::Aff_transformation_3 transfoB = + rotaB*translationB; + t1->traits().set_transformation(transfoB); + + const double* matrixA = query_item->manipulatedFrame()->matrix(); + query_item->setFMatrix(matrixA); + EPICK::Aff_transformation_3 translationA(CGAL::TRANSLATION, -EPICK::Vector_3(query_item->center().x, + query_item->center().y, + query_item->center().z)); + EPICK::Aff_transformation_3 rotaA( + matrixA[0], matrixA[4], matrixA[8],matrixA[12], + matrixA[1], matrixA[5], matrixA[9],matrixA[13], + matrixA[2], matrixA[6], matrixA[10],matrixA[14]); + EPICK::Aff_transformation_3 transfoA = + rotaA*translationA; + t2->traits().set_transformation(transfoA); if(t2->do_intersect(*t1)) - moving_item->setColor(QColor(Qt::red)); + query_item->setColor(QColor(Qt::red)); else { +#if 0 typedef boost::property_map::type VPM; - VPM vpm2 = get(CGAL::vertex_point, *moving_item->getFaceGraph()); + VPM vpm2 = get(CGAL::vertex_point, *query_item->getFaceGraph()); CGAL::Side_of_triangle_mesh sotm1(*t1); - if(sotm1((transfo).transform(vpm2[*moving_item->getFaceGraph()->vertices().begin()])) != CGAL::ON_UNBOUNDED_SIDE) + if(sotm1((transfoA).transform(vpm2[*query_item->getFaceGraph()->vertices().begin()])) != CGAL::ON_UNBOUNDED_SIDE) { - moving_item->setColor(QColor(Qt::blue)); + query_item->setColor(QColor(Qt::blue)); } else { CGAL::Side_of_triangle_mesh sotm2(*t2); - if(sotm2(fixed_item->face_graph()->point(*fixed_item->face_graph()->vertices().begin())) != CGAL::ON_UNBOUNDED_SIDE) - moving_item->setColor(QColor(Qt::blue)); + if(sotm2(base_item->face_graph()->point(*base_item->face_graph()->vertices().begin())) != CGAL::ON_UNBOUNDED_SIDE) + query_item->setColor(QColor(Qt::blue)); else - moving_item->setColor(QColor(Qt::green)); +#endif + query_item->setColor(QColor(Qt::green)); + #if 0 } +#endif + } + viewer->update(); } @@ -162,8 +192,8 @@ public Q_SLOTS: if(t2) delete t2; t2 = NULL; - moving_item = NULL; - fixed_item = NULL; + query_item = NULL; + base_item = NULL; } private: @@ -172,7 +202,7 @@ private: CGAL::Three::Scene_interface* scene; QMainWindow* mw; Tree *t1, *t2; - Scene_movable_sm_item* moving_item; - Scene_surface_mesh_item* fixed_item; + Scene_movable_sm_item* query_item; + Scene_movable_sm_item* base_item; }; #include "Do_trees_intersect_plugin.moc" diff --git a/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.cpp b/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.cpp index 289b438d810..0e03b99bb3a 100644 --- a/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.cpp +++ b/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.cpp @@ -4,6 +4,7 @@ #include #include #include +#include typedef CGAL::Three::Triangle_container Tri; typedef CGAL::Three::Viewer_interface VI; struct Scene_movable_sm_item_priv @@ -20,6 +21,8 @@ struct Scene_movable_sm_item_priv frame->setPosition(pos+offset); item->setTriangleContainer(0, new Triangle_container(VI::PROGRAM_WITH_LIGHT, false)); + item->setEdgeContainer(0, new Edge_container(VI::PROGRAM_NO_SELECTION, + false)); } ~Scene_movable_sm_item_priv() { @@ -46,6 +49,8 @@ struct Scene_movable_sm_item_priv mutable QOpenGLShaderProgram *program; mutable std::vector flat_normals; mutable std::vector flat_vertices; + mutable std::vector edges_vertices; + }; Scene_movable_sm_item::Scene_movable_sm_item(const CGAL::qglviewer::Vec& pos, SMesh* sm, @@ -59,10 +64,14 @@ void Scene_movable_sm_item_priv::initialize_buffers(CGAL::Three::Viewer_interfac { item->getTriangleContainer(0)->initializeBuffers(viewer); item->getTriangleContainer(0)->setFlatDataSize(flat_vertices.size()); + item->getEdgeContainer(0)->initializeBuffers(viewer); + item->getEdgeContainer(0)->setFlatDataSize(edges_vertices.size()); flat_vertices.resize(0); flat_normals .resize(0); + edges_vertices.resize(0); flat_vertices.shrink_to_fit(); flat_normals.shrink_to_fit(); + edges_vertices.shrink_to_fit(); item->are_buffers_filled = true; } @@ -82,9 +91,12 @@ void Scene_movable_sm_item_priv::compute_elements() const facegraph->points(); typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef boost::graph_traits::edge_descriptor edge_descriptor; typedef CGAL::Buffer_for_vao CPF; flat_vertices.clear(); flat_normals.clear(); + edges_vertices.clear(); + //faces BOOST_FOREACH(face_descriptor fd, faces(*facegraph)) { BOOST_FOREACH(halfedge_descriptor hd, halfedges_around_face(halfedge(fd, *facegraph),*facegraph)) @@ -98,12 +110,29 @@ void Scene_movable_sm_item_priv::compute_elements() const CPF::add_normal_in_buffer(n, flat_normals); } } + //edges + BOOST_FOREACH(edge_descriptor ed, edges(*facegraph)) + { + Point p = positions[source(ed, *facegraph)] + offset; + EPICK::Point_3 pc(p.x() - center_.x, + p.y() - center_.y, + p.z() - center_.z); + CPF::add_point_in_buffer(pc, edges_vertices); + p = positions[target(ed, *facegraph)] + offset; + pc=EPICK::Point_3(p.x() - center_.x, + p.y() - center_.y, + p.z() - center_.z); + CPF::add_point_in_buffer(pc, edges_vertices); + } + item->getTriangleContainer(0)->allocate(Tri::Flat_vertices, flat_vertices.data(), static_cast(flat_vertices.size()*sizeof(float))); item->getTriangleContainer(0)->allocate(Tri::Flat_normals, flat_normals.data(), static_cast(flat_normals.size()*sizeof(float))); + item->getEdgeContainer(0)->allocate(Tri::Flat_vertices, edges_vertices.data(), + static_cast(edges_vertices.size()*sizeof(float))); QApplication::restoreOverrideCursor(); } @@ -124,6 +153,18 @@ void Scene_movable_sm_item::draw(CGAL::Three::Viewer_interface* viewer) const getTriangleContainer(0)->draw(viewer, true); } +void Scene_movable_sm_item::drawEdges(CGAL::Three::Viewer_interface* viewer) const +{ + if(!isInit() && viewer->context()->isValid()) + initGL(); + if(!are_buffers_filled) + d->initialize_buffers(viewer); + getEdgeContainer(0)->setColor(Qt::black); + getEdgeContainer(0)->setFrameMatrix(d->f_matrix); + + getEdgeContainer(0)->draw(viewer, true); +} + QString Scene_movable_sm_item::toolTip() const { return QObject::tr("

Manipulatable representation of %1

" "

Keep Ctrl pressed and use the arcball to define an affine transformation.
") diff --git a/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.h b/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.h index 1b223d81946..7c2db949c32 100644 --- a/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.h +++ b/AABB_tree/demo_plugin/AABB_tree/Scene_movable_sm_item.h @@ -34,12 +34,14 @@ public: Scene_item* clone() const{return NULL;} QString toolTip() const; void draw(CGAL::Three::Viewer_interface *) const; + void drawEdges(CGAL::Three::Viewer_interface *) const; void compute_bbox() const; ~Scene_movable_sm_item(); bool manipulatable() const { return true;} ManipulatedFrame* manipulatedFrame(); const CGAL::qglviewer::Vec& center() const; - virtual bool supportsRenderingMode(RenderingMode m) const { return m==Flat ; } + virtual bool supportsRenderingMode(RenderingMode m) const { return m==Flat + || m==Wireframe; } virtual void invalidateOpenGLBuffers(); void setFMatrix(const GLdouble matrix[16]); void computeElements() const;