Merge pull request #556 from sgiraudot/Polyhedron_demo-Quick_moving_display-GF

Polyhedron demo: quick moving display of point sets
This commit is contained in:
Sebastien Loriot 2016-01-06 14:55:32 +01:00
commit d782bc4da8
6 changed files with 61 additions and 15 deletions

View File

@ -248,6 +248,8 @@ MainWindow::MainWindow(QWidget* parent)
connect(ui->actionDraw_two_sides, SIGNAL(toggled(bool)),
viewer, SLOT(setTwoSides(bool)));
connect(ui->actionQuick_camera_mode, SIGNAL(toggled(bool)),
viewer, SLOT(setFastDrawing(bool)));
// add the "About CGAL..." and "About demo..." entries
this->addAboutCGAL();

View File

@ -115,6 +115,7 @@
<addaction name="action_Look_at"/>
<addaction name="actionAntiAliasing"/>
<addaction name="actionDraw_two_sides"/>
<addaction name="actionQuick_camera_mode"/>
<addaction name="actionSetBackgroundColor"/>
<addaction name="menuDockWindows"/>
<addaction name="menuCamera"/>
@ -664,6 +665,17 @@
<string>Load plugin</string>
</property>
</action>
<action name="actionQuick_camera_mode">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Quick camera mode</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -17,6 +17,7 @@
#include <QObject>
#include <QMenu>
#include <QGLViewer/manipulatedCameraFrame.h>
#include <set>
#include <stack>
@ -165,10 +166,16 @@ void Scene_points_with_normal_item::compute_normals_and_vertices() const
positions_points.reserve(m_points->size() * 3);
positions_lines.reserve(m_points->size() * 3 * 2);
//Shuffle container to allow quick display random points
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
for (Point_set_3<Kernel>::const_iterator it = m_points->begin(); it != m_points->first_selected(); it++)
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());
@ -177,7 +184,7 @@ void Scene_points_with_normal_item::compute_normals_and_vertices() const
}
// Draw *selected* points
for (Point_set_3<Kernel>::const_iterator it = m_points->first_selected(); it != m_points->end(); it++)
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());
@ -189,10 +196,10 @@ void Scene_points_with_normal_item::compute_normals_and_vertices() const
//The lines
{
// Stock normals
Kernel::Sphere_3 region_of_interest = m_points->region_of_interest();
Kernel::Sphere_3 region_of_interest = points.region_of_interest();
float normal_length = (float)std::sqrt(region_of_interest.squared_radius() / 1000.);
for (Point_set_3<Kernel>::const_iterator it = m_points->begin(); it != m_points->end(); it++)
for (Point_set_3<Kernel>::const_iterator it = points.begin(); it != points.end(); it++)
{
const UI_point& p = *it;
const Point_set_3<Kernel>::Vector& n = p.normal();
@ -417,6 +424,11 @@ void Scene_points_with_normal_item::draw_splats(CGAL::Three::Viewer_interface* v
void Scene_points_with_normal_item::draw_edges(CGAL::Three::Viewer_interface* viewer) const
{
double ratio_displayed = 1.0;
if (viewer->inFastDrawing () &&
(nb_lines/6 > 300000)) // arbitrary large value
ratio_displayed = 6 * 300000. / (double)(nb_lines);
if(!are_buffers_filled)
initialize_buffers(viewer);
vaos[Edges]->bind();
@ -424,7 +436,8 @@ void Scene_points_with_normal_item::draw_edges(CGAL::Three::Viewer_interface* vi
attrib_buffers(viewer,PROGRAM_NO_SELECTION);
program->bind();
program->setAttributeValue("colors", this->color());
viewer->glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(nb_lines/3));
viewer->glDrawArrays(GL_LINES, 0,
static_cast<GLsizei>(((std::size_t)(ratio_displayed * nb_lines)/3)));
vaos[Edges]->release();
program->release();
}
@ -433,12 +446,18 @@ void Scene_points_with_normal_item::draw_points(CGAL::Three::Viewer_interface* v
if(!are_buffers_filled)
initialize_buffers(viewer);
double ratio_displayed = 1.0;
if (viewer->inFastDrawing () &&
((nb_points + nb_selected_points)/3 > 300000)) // arbitrary large value
ratio_displayed = 3 * 300000. / (double)(nb_points + nb_selected_points);
vaos[ThePoints]->bind();
program=getShaderProgram(PROGRAM_NO_SELECTION);
attrib_buffers(viewer,PROGRAM_NO_SELECTION);
program->bind();
program->setAttributeValue("colors", this->color());
viewer->glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(nb_points/3));
viewer->glDrawArrays(GL_POINTS, 0,
static_cast<GLsizei>(((std::size_t)(ratio_displayed * nb_points)/3)));
vaos[ThePoints]->release();
program->release();
GLfloat point_size;
@ -451,7 +470,7 @@ void Scene_points_with_normal_item::draw_points(CGAL::Three::Viewer_interface* v
program->bind();
program->setAttributeValue("colors", QColor(255,0,0));
viewer->glDrawArrays(GL_POINTS, 0,
static_cast<GLsizei>(nb_selected_points/3));
static_cast<GLsizei>(((std::size_t)(ratio_displayed * nb_selected_points)/3)));
vaos[Selected_points]->release();
program->release();
viewer->glPointSize(point_size);

View File

@ -16,7 +16,7 @@ public:
bool twosides;
bool macro_mode;
bool inFastDrawing;
void draw_aux(bool with_names, Viewer*);
//! Contains all the programs for the item rendering.
@ -30,6 +30,7 @@ Viewer::Viewer(QWidget* parent, bool antialiasing)
d->antialiasing = antialiasing;
d->twosides = false;
d->macro_mode = false;
d->inFastDrawing = true;
d->shader_programs.resize(NB_OF_PROGRAMS);
setShortcut(EXIT_VIEWER, 0);
setShortcut(DRAW_AXIS, 0);
@ -94,22 +95,28 @@ void Viewer::setTwoSides(bool b)
updateGL();
}
bool Viewer::inFastDrawing() const {
return d->inFastDrawing;
void Viewer::setFastDrawing(bool b)
{
d->inFastDrawing = b;
updateGL();
}
bool Viewer::inFastDrawing() const
{
return (d->inFastDrawing
&& (camera()->frame()->isSpinning()
|| camera()->frame()->isManipulated()));
}
void Viewer::draw()
{
glEnable(GL_DEPTH_TEST);
d->inFastDrawing = false;
QGLViewer::draw();
d->draw_aux(false, this);
}
void Viewer::fastDraw()
{
d->inFastDrawing = true;
QGLViewer::fastDraw();
d->draw_aux(false, this);
}

View File

@ -70,6 +70,9 @@ public Q_SLOTS:
//! If b is true, facets will be ligted from both internal and external sides.
//! If b is false, only the side that is exposed to the light source will be lighted.
void setTwoSides(bool b);
//! If b is true, some items are displayed in a simplified version when moving the camera.
//! If b is false, items display is never altered, even when moving.
void setFastDrawing(bool b);
//! Make the camera turn around.
void turnCameraBy180Degres();
//! @returns a QString containing the position and orientation of the camera.

View File

@ -59,7 +59,7 @@ public:
virtual void setScene(CGAL::Three::Scene_draw_interface* scene) = 0;
//! @returns the antialiasing state.
virtual bool antiAliasing() const = 0;
// Those two functions are defined in Viewer.cpp
//!Sets the position and orientation of a frame using a QString.
//!@returns true if it worked.
@ -138,6 +138,9 @@ public Q_SLOTS:
//! If b is true, facets will be ligted from both internal and external sides.
//! If b is false, only the side that is exposed to the light source will be lighted.
virtual void setTwoSides(bool b) = 0;
//! If b is true, some items are displayed in a simplified version when moving the camera.
//! If b is false, items display is never altered, even when moving.
virtual void setFastDrawing(bool b) = 0;
//! Make the camera turn around.
virtual void turnCameraBy180Degres() = 0;
//! @returns a QString containing the position and orientation of the camera.