diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp index 4495ab0e3b8..8169cd080f6 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp @@ -401,12 +401,19 @@ Scene_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interface* viewer) CGAL::set_halfedgeds_items_id(*poly); + TextRenderer *renderer = viewer->textRenderer; + Q_FOREACH(double id, text_ids) + renderer->removeText(id); + text_ids.clear(); QFont font; font.setBold(true); + + Q_FOREACH(Polyhedron::Vertex_const_handle vh, vertices(*poly)) { const Point& p = vh->point(); - viewer->textRenderer->addText((float)p.x(), (float)p.y(), (float)p.z(), QString("%1").arg(vh->id()), font, Qt::red); + renderer->addText((float)p.x(), (float)p.y(), (float)p.z(), QString("%1").arg(vh->id()), renderer->lastId(), font, Qt::red); + text_ids.append(renderer->lastId()); } @@ -414,7 +421,8 @@ Scene_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interface* viewer) { const Point& p1 = source(e, *poly)->point(); const Point& p2 = target(e, *poly)->point(); - viewer->textRenderer->addText((float)(p1.x()+p2.x())/2, (float)(p1.y()+p2.y())/2, (float)(p1.z()+p2.z())/2, QString("%1").arg(e.halfedge()->id()/2), font, Qt::green); + renderer->addText((float)(p1.x()+p2.x())/2, (float)(p1.y()+p2.y())/2, (float)(p1.z()+p2.z())/2, QString("%1").arg(e.halfedge()->id()/2), renderer->lastId(), font, Qt::green); + text_ids.append(renderer->lastId()); } Q_FOREACH(Polyhedron::Facet_handle fh, faces(*poly)) @@ -429,11 +437,13 @@ Scene_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interface* viewer) ++total; } - viewer->textRenderer->addText((float)x/total, (float)y/total, (float)z/total, QString("%1").arg(fh->id()), font, Qt::blue); + renderer->addText((float)x/total, (float)y/total, (float)z/total, QString("%1").arg(fh->id()), renderer->lastId(), font, Qt::blue); + text_ids.append(renderer->lastId()); } } + void Scene_polyhedron_item::compute_normals_and_vertices(const bool colors_only) const { @@ -667,7 +677,6 @@ Scene_polyhedron_item::Scene_polyhedron_item(const Polyhedron& p) erase_next_picked_facet_m(false), plugin_has_set_color_vector_m(false) { - //setItemIsMulticolor(true); cur_shading=FlatPlusEdges; is_selected=true; init(); @@ -681,6 +690,13 @@ Scene_polyhedron_item::~Scene_polyhedron_item() { delete_aabb_tree(this); delete poly; + QGLViewer* viewer = *QGLViewer::QGLViewerPool().begin(); + CGAL::Three::Viewer_interface* v = qobject_cast(viewer); + if(v) + { + Q_FOREACH(double id, text_ids) + v->textRenderer->removeText(id); + } } #include "Color_map.h" @@ -1065,6 +1081,7 @@ Scene_polyhedron_item::select(double orig_x, double dir_y, double dir_z) { + if(facet_picking_m) { typedef Input_facets_AABB_tree Tree; typedef Tree::Object_and_primitive_id Object_and_primitive_id; @@ -1125,7 +1142,6 @@ Scene_polyhedron_item::select(double orig_x, nearest_v = v; } } - //bottleneck Q_EMIT selected_vertex((void*)(&*nearest_v)); } diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h index 4763502584e..07e8dbe01a7 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h @@ -174,12 +174,15 @@ private: using CGAL::Three::Scene_item::initialize_buffers; void initialize_buffers(CGAL::Three::Viewer_interface *viewer = 0) const; + void compute_normals_and_vertices(const bool colors_only = false) const; template void triangulate_facet(Facet_iterator, const FaceNormalPmap&, const VertexNormalPmap&, const bool colors_only) const; double volume, area; + mutable QList text_ids; + int m_min_patch_id; // the min value of the patch ids initialized in init() }; // end class Scene_polyhedron_item diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index e184573b2fc..188f3d3654a 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -562,6 +562,7 @@ void Viewer::attrib_buffers(int program_name) const { void Viewer::beginSelection(const QPoint &point) { + textRenderer->printFacetId(point, this); makeCurrent(); glEnable(GL_SCISSOR_TEST); glScissor(point.x(), camera()->screenHeight()-1-point.y(), 1, 1); @@ -817,7 +818,7 @@ void Viewer::drawVisualHints() rendering_program.release(); vao[0].release(); } - bool has_text = true; + bool has_text = true ; if(has_text) { //So that the text is drawn in front of everything @@ -1154,6 +1155,36 @@ void Viewer::wheelEvent(QWheelEvent* e) QGLViewer::wheelEvent(e); } +void TextRenderer::printFacetId(QPoint pt, CGAL::Three::Viewer_interface *viewer) +{ + qDebug()<<"print"; + displayList.clear(); + QMap distances; + bool found; + float min_dist = 0; + qglviewer::Vec pup = viewer->camera()->pointUnderPixel(pt, found); + if(found) + { + TextItem *it = textItems.values().first(); + float dist = + (it->position()->x() - pup.x)*(it->position()->x() - pup.x) + +(it->position()->y() - pup.y)*(it->position()->y() - pup.y) + +(it->position()->z() - pup.z)*(it->position()->z() - pup.z); + min_dist = dist; + + Q_FOREACH(TextItem* item, textItems.values()) + { + float dist = + (item->position()->x() - pup.x)*(item->position()->x() - pup.x) + +(item->position()->y() - pup.y)*(item->position()->y() - pup.y) + +(item->position()->z() - pup.z)*(item->position()->z() - pup.z); + distances[dist] = item->id(); + if(dist < min_dist) + min_dist = dist; + } + displayList.append(distances[min_dist]); + } +} void TextRenderer::draw(CGAL::Three::Viewer_interface *viewer) { QPainter *painter = viewer->painter; @@ -1166,8 +1197,9 @@ void TextRenderer::draw(CGAL::Three::Viewer_interface *viewer) QRect rect; qglviewer::Camera* camera = viewer->camera(); //painter->setBackgroundMode(Qt::TransparentMode); - Q_FOREACH(TextItem* item, textItems) + Q_FOREACH(double i, displayList) { + TextItem* item = textItems[i]; qglviewer::Vec src(item->position()->x(), item->position()->y(),item->position()->z()); rect = QRect(camera->projectedCoordinatesOf(src).x-item->width()/2, camera->projectedCoordinatesOf(src).y-item->height()/2, @@ -1175,27 +1207,33 @@ void TextRenderer::draw(CGAL::Three::Viewer_interface *viewer) item->height()); painter->setFont(item->font()); painter->setPen(QPen(item->color())); - QPoint pouaing(camera->projectedCoordinatesOf(src).x, - camera->projectedCoordinatesOf(src).y); + qglviewer::Vec v = camera->projectedCoordinatesOf(src); + QPoint pouaing((int)(v.x), + (int)(v.y)); bool found; qglviewer::Vec pUp =viewer->camera()->pointUnderPixel(pouaing, found); qglviewer::Vec pos_point = qglviewer::Vec(item->position()->x(), item->position()->y(), item->position()->z()); float dist =(pUp.x-pos_point.x) * (pUp.x-pos_point.x) + (pUp.y-pos_point.y) * (pUp.y-pos_point.y) + (pUp.z-pos_point.z) * (pUp.z-pos_point.z); - - // qDebug()<text()<<": dist = "<