Merge pull request #1472 from maxGimeno/Polyhedron_demo-Point_with_normal_item_performances-GF

Polyhedron_demo : Optimize the point_set visualization
This commit is contained in:
Laurent Rineau 2016-09-27 17:51:50 +02:00 committed by GitHub
commit 6e5fca2d8c
2 changed files with 56 additions and 27 deletions

View File

@ -28,6 +28,8 @@
#include <algorithm>
#include <boost/array.hpp>
const std::size_t limit_fast_drawing = 300000; //arbitraty large valu
struct Scene_points_with_normal_item_priv
{
Scene_points_with_normal_item_priv(Scene_points_with_normal_item* parent)
@ -38,10 +40,11 @@ struct Scene_points_with_normal_item_priv
nb_points = 0;
nb_selected_points = 0;
nb_lines = 0;
is_point_slider_moving = false;
normal_Slider = new QSlider(Qt::Horizontal);
normal_Slider->setValue(20);
point_Slider = new QSlider(Qt::Horizontal);
point_Slider->setValue(5);
point_Slider->setValue(2);
point_Slider->setMinimum(1);
point_Slider->setMaximum(25);
}
@ -50,10 +53,11 @@ struct Scene_points_with_normal_item_priv
m_has_normals(toCopy.d->m_has_normals)
{
item = parent;
is_point_slider_moving = false;
normal_Slider = new QSlider(Qt::Horizontal);
normal_Slider->setValue(20);
point_Slider = new QSlider(Qt::Horizontal);
point_Slider->setValue(5);
point_Slider->setValue(2);
point_Slider->setMinimum(1);
point_Slider->setMaximum(25);
}
@ -62,6 +66,7 @@ struct Scene_points_with_normal_item_priv
m_has_normals(true)
{
item = parent;
is_point_slider_moving = false;
nb_points = 0;
nb_selected_points = 0;
nb_lines = 0;
@ -77,7 +82,7 @@ struct Scene_points_with_normal_item_priv
normal_Slider = new QSlider(Qt::Horizontal);
normal_Slider->setValue(20);
point_Slider = new QSlider(Qt::Horizontal);
point_Slider->setValue(5);
point_Slider->setValue(2);
point_Slider->setMinimum(1);
point_Slider->setMaximum(25);
}
@ -88,6 +93,7 @@ struct Scene_points_with_normal_item_priv
delete normal_Slider;
delete point_Slider;
}
bool isPointSliderMoving() { return is_point_slider_moving; }
void initializeBuffers(CGAL::Three::Viewer_interface *viewer) const;
void compute_normals_and_vertices() const;
enum VAOs {
@ -111,6 +117,7 @@ struct Scene_points_with_normal_item_priv
QAction* actionSelectDuplicatedPoints;
QSlider* normal_Slider;
QSlider* point_Slider;
mutable bool is_point_slider_moving;
mutable std::vector<double> positions_lines;
mutable std::vector<double> positions_points;
mutable std::vector<double> positions_selected_points;
@ -287,26 +294,26 @@ void Scene_points_with_normal_item_priv::compute_normals_and_vertices() const
Point_set_3<Kernel> points = *m_points;
std::random_shuffle (points.begin(), points.end() - m_points->nb_selected_points());
std::random_shuffle (points.end() - m_points->nb_selected_points(), points.end());
//The points
{
// The *non-selected* points
// The *non-selected* points
for (Point_set_3<Kernel>::const_iterator it = points.begin(); it != points.first_selected(); it++)
{
const UI_point& p = *it;
positions_points.push_back(p.x());
positions_points.push_back(p.y());
positions_points.push_back(p.z());
}
{
const UI_point& p = *it;
positions_points.push_back(p.x());
positions_points.push_back(p.y());
positions_points.push_back(p.z());
}
// Draw *selected* points
// Draw *selected* points
for (Point_set_3<Kernel>::const_iterator it = points.first_selected(); it != points.end(); it++)
{
const UI_point& p = *it;
positions_selected_points.push_back(p.x());
positions_selected_points.push_back(p.y());
positions_selected_points.push_back(p.z());
}
{
const UI_point& p = *it;
positions_selected_points.push_back(p.x());
positions_selected_points.push_back(p.y());
positions_selected_points.push_back(p.z());
}
}
//The lines
@ -575,8 +582,8 @@ void Scene_points_with_normal_item::drawEdges(CGAL::Three::Viewer_interface* vie
{
double ratio_displayed = 1.0;
if (viewer->inFastDrawing () &&
(d->nb_lines/6 > 300000)) // arbitrary large value
ratio_displayed = 6 * 300000. / (double)(d->nb_lines);
(d->nb_lines/6 > limit_fast_drawing)) // arbitrary large value
ratio_displayed = 6 * limit_fast_drawing / (double)(d->nb_lines);
if(!are_buffers_filled)
d->initializeBuffers(viewer);
@ -599,9 +606,9 @@ void Scene_points_with_normal_item::drawPoints(CGAL::Three::Viewer_interface* vi
viewer->glGetFloatv(GL_POINT_SIZE, &point_size);
viewer->glPointSize(d->point_Slider->value());
double ratio_displayed = 1.0;
if (viewer->inFastDrawing () &&
((d->nb_points + d->nb_selected_points)/3 > 300000)) // arbitrary large value
ratio_displayed = 3 * 300000. / (double)(d->nb_points + d->nb_selected_points);
if ((viewer->inFastDrawing () || d->isPointSliderMoving())
&&((d->nb_points + d->nb_selected_points)/3 > limit_fast_drawing)) // arbitrary large value
ratio_displayed = 3 * limit_fast_drawing / (double)(d->nb_points + d->nb_selected_points);
vaos[Scene_points_with_normal_item_priv::ThePoints]->bind();
if(has_normals())
@ -711,9 +718,16 @@ QMenu* Scene_points_with_normal_item::contextMenu()
{
QMenu *container = new QMenu(tr("Normals Length"));
QWidgetAction *sliderAction = new QWidgetAction(0);
connect(d->normal_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::invalidateOpenGLBuffers);
connect(d->normal_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::itemChanged);
if((d->nb_points + d->nb_selected_points)/3 <= limit_fast_drawing)
{
connect(d->normal_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::invalidateOpenGLBuffers);
connect(d->normal_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::itemChanged);
}
else
{
connect(d->normal_Slider, &QSlider::sliderReleased, this, &Scene_points_with_normal_item::invalidateOpenGLBuffers);
connect(d->normal_Slider, &QSlider::sliderReleased, this, &Scene_points_with_normal_item::itemChanged);
}
sliderAction->setDefaultWidget(d->normal_Slider);
container->addAction(sliderAction);
@ -721,7 +735,8 @@ QMenu* Scene_points_with_normal_item::contextMenu()
}
QMenu *container = new QMenu(tr("Points Size"));
QWidgetAction *sliderAction = new QWidgetAction(0);
connect(d->point_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::invalidateOpenGLBuffers);
connect(d->point_Slider, &QSlider::sliderPressed, this, &Scene_points_with_normal_item::pointSliderPressed);
connect(d->point_Slider, &QSlider::sliderReleased, this, &Scene_points_with_normal_item::pointSliderReleased);
connect(d->point_Slider, &QSlider::valueChanged, this, &Scene_points_with_normal_item::itemChanged);
sliderAction->setDefaultWidget(d->point_Slider);
@ -785,3 +800,13 @@ void Scene_points_with_normal_item::invalidateOpenGLBuffers()
compute_bbox();
}
void Scene_points_with_normal_item::pointSliderPressed()
{
d->is_point_slider_moving = true;
}
void Scene_points_with_normal_item::pointSliderReleased()
{
d->is_point_slider_moving = false;
}

View File

@ -84,6 +84,10 @@ public Q_SLOTS:
void resetSelection();
//Select duplicated points
void selectDuplicates();
//Set the status of the slider as `pressed`
void pointSliderPressed();
//Set the status of the slider as `released`
void pointSliderReleased();
// Data
protected: