Fix the drawing of the children's group when their renderingMode isn't compatible.

This commit is contained in:
Maxime Gimeno 2016-04-19 14:32:27 +02:00
parent 22636f6a76
commit 7b338f4e45
6 changed files with 64 additions and 10 deletions

View File

@ -352,7 +352,6 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
viewer->glEnable(GL_LIGHTING);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
viewer->glPointSize(2.f);
viewer->glLineWidth(1.0f);
if(index == selected_item || selected_items_list.contains(index))
@ -406,7 +405,6 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
|| item.renderingMode() == Wireframe)
{
viewer->glDisable(GL_LIGHTING);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
viewer->glPointSize(2.f);
viewer->glLineWidth(1.0f);
if(index == selected_item || selected_items_list.contains(index))
@ -428,7 +426,6 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
else{
if( item.renderingMode() == PointsPlusNormals ){
viewer->glDisable(GL_LIGHTING);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
viewer->glPointSize(2.f);
viewer->glLineWidth(1.0f);
if(index == selected_item || selected_items_list.contains(index))
@ -477,7 +474,6 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
(!with_names && item.renderingMode() == PointsPlusNormals))
{
viewer->glDisable(GL_LIGHTING);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
viewer->glPointSize(2.0f);
viewer->glLineWidth(1.0f);
@ -558,7 +554,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
{
Q_EMIT(itemPicked(index_map.key(mainSelectionIndex())));
}
Q_EMIT drawFinished();
}
// workaround for Qt-4.2 (see above)
@ -1245,6 +1241,7 @@ void Scene::add_group(Scene_group_item* group)
changeGroup(item(id),group);
redraw_model();
}
connect(this, SIGNAL(drawFinished()), group, SLOT(resetDraw()));
}
namespace scene { namespace details {

View File

@ -244,6 +244,7 @@ Q_SIGNALS:
void selectionRay(double, double, double, double, double, double);
void selectionChanged(int i);
void restoreCollapsedState();
void drawFinished();
private Q_SLOTS:
//! Casts a selection ray and calls the item function select.
void setSelectionRay(double, double, double, double, double, double);

View File

@ -647,6 +647,12 @@ void Scene_c3t3_item::draw_points(CGAL::Three::Viewer_interface * viewer) const
viewer->glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(positions_grid.size() / 3));
program->release();
vaos[Grid]->release();
if(spheres_are_shown)
{
spheres->setPlane(this->plane());
}
Scene_group_item::draw_edges(viewer);
}
void Scene_c3t3_item::draw_triangle(const Kernel::Point_3& pa,
@ -1154,6 +1160,8 @@ void Scene_c3t3_item::show_spheres(bool b)
if(b && !spheres)
{
spheres = new Scene_spheres_item(this, true);
spheres->setName("Protecting spheres");
spheres->setRenderingMode(Gouraud);
connect(spheres, SIGNAL(destroyed()), this, SLOT(reset_spheres()));
last_known_scene->addItem(spheres);
last_known_scene->changeGroup(spheres, this);

View File

@ -106,7 +106,7 @@ public:
// Indicate if rendering mode is supported
bool supportsRenderingMode(RenderingMode m) const {
return (m != Gouraud && m != PointsPlusNormals && m != Splatting);
return (m != Gouraud && m != PointsPlusNormals && m != Splatting && m != Points);
}
void draw(CGAL::Three::Viewer_interface* viewer) const;

View File

@ -8,6 +8,7 @@ Scene_group_item::Scene_group_item(QString name, int nb_vbos, int nb_vaos )
{
this->name_ = name;
expanded = true;
already_drawn = false;
}
bool Scene_group_item::isFinite() const
@ -82,7 +83,8 @@ void Scene_group_item::setRenderingMode(RenderingMode m)
Scene_item::setRenderingMode(m);
Q_FOREACH(Scene_item* child, children)
{
child->setRenderingMode(m);
if(child->supportsRenderingMode(m))
child->setRenderingMode(m);
}
}
@ -118,7 +120,7 @@ void Scene_group_item::moveUp(int i)
}
void Scene_group_item::draw(CGAL::Three::Viewer_interface* viewer) const {
if(viewer->inDrawWithNames()) return;
if(viewer->inDrawWithNames() || already_drawn ) return;
Q_FOREACH(Scene_item* child, children) {
if(!child->visible()) continue;
switch(child->renderingMode()) {
@ -128,12 +130,26 @@ void Scene_group_item::draw(CGAL::Three::Viewer_interface* viewer) const {
child->draw(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case FlatPlusEdges:
case Wireframe:
case PointsPlusNormals:
child->draw_edges(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case Points:
case PointsPlusNormals:
child->draw_points(viewer); break;
default: break;
}
}
already_drawn = true;
}
void Scene_group_item::draw_edges(CGAL::Three::Viewer_interface* viewer) const
{
if(viewer->inDrawWithNames()) return;
if(viewer->inDrawWithNames() || already_drawn ) return;
Q_FOREACH(Scene_item* child, children) {
if(!child->visible()) continue;
switch(child->renderingMode()) {
@ -143,12 +159,26 @@ void Scene_group_item::draw_edges(CGAL::Three::Viewer_interface* viewer) const
child->draw_edges(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case Flat:
case FlatPlusEdges:
case Gouraud:
child->draw(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case Points:
case PointsPlusNormals:
child->draw_points(viewer); break;
default: break;
}
}
already_drawn = true;
}
void Scene_group_item::draw_points(CGAL::Three::Viewer_interface* viewer) const
{
if(viewer->inDrawWithNames()) return;
if(viewer->inDrawWithNames() || already_drawn ) return;
Q_FOREACH(Scene_item* child, children) {
if(!child->visible()) continue;
switch(child->renderingMode()) {
@ -157,7 +187,22 @@ void Scene_group_item::draw_points(CGAL::Three::Viewer_interface* viewer) const
child->draw_points(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case Flat:
case FlatPlusEdges:
case Gouraud:
child->draw(viewer); break;
default: break;
}
switch(child->renderingMode()) {
case FlatPlusEdges:
case Wireframe:
case PointsPlusNormals:
child->draw_edges(viewer); break;
default: break;
}
}
already_drawn = true;
}
void Scene_group_item::draw_splats(CGAL::Three::Viewer_interface* viewer) const

View File

@ -130,6 +130,8 @@ public :
//!Moves a child down in the list.
void moveDown(int);
public Q_SLOTS:
void resetDraw() { already_drawn = false;}
private:
//!Contains a reference to all the children of this group.
QList<Scene_item*> children;
@ -137,6 +139,7 @@ private:
void update_group_number(Scene_item*new_item, int n);
bool expanded;
mutable bool already_drawn;
}; //end of class Scene_group_item