Force GouraudPlusEdges for Move Vertex

This commit is contained in:
Maxime Gimeno 2019-07-12 16:34:04 +02:00
parent 889c0fc235
commit 1ed4211bc1
12 changed files with 94 additions and 341 deletions

View File

@ -777,6 +777,7 @@ public Q_SLOTS:
case 0:
Q_EMIT set_operation_mode(-1);
on_Selection_type_combo_box_changed(ui_widget.Selection_type_combo_box->currentIndex());
selection_item->polyhedron_item()->switchToGouraudPlusEdge(false);
break;
//Edition mode
case 1:
@ -812,7 +813,13 @@ public Q_SLOTS:
{
Scene_polyhedron_selection_item* selection_item = getSelectedItem<Scene_polyhedron_selection_item>();
if(selection_item)
{
selection_item->on_Ctrlz_pressed();
if(mode == 11)
selection_item->polyhedron_item()->switchToGouraudPlusEdge(true);
else
selection_item->polyhedron_item()->switchToGouraudPlusEdge(false);
}
if(ui_widget.selectionOrEuler->currentIndex() == 0)
{
Q_EMIT set_operation_mode(-1);

View File

@ -944,7 +944,7 @@ void Scene_edit_polyhedron_item::draw(CGAL::Three::Viewer_interface* viewer) con
Tc* tc = getTriangleContainer(Priv::Facets);
tc->setColor(this->color());
tc->draw(viewer, true);
drawEdges(viewer);
//drawEdges(viewer);
draw_ROI_and_control_vertices(viewer);
drawTransparent(viewer);
}

View File

@ -273,7 +273,7 @@ public:
// Indicate if rendering mode is supported
bool supportsRenderingMode(RenderingMode m) const {
return m == Gouraud;
return m == GouraudPlusEdges;
}
void draw(CGAL::Three::Viewer_interface*) const;
void drawEdges(CGAL::Three::Viewer_interface*) const;

View File

@ -543,7 +543,7 @@ void Scene::renderScene(const QList<Scene_interface::Item_id> &items,
}
if(group ||item.visible())
{
if( group || item.renderingMode() == Flat || item.renderingMode() == FlatPlusEdges || item.renderingMode() == Gouraud)
if( group || item.renderingMode() == Flat || item.renderingMode() == FlatPlusEdges || item.renderingMode() == Gouraud || item.renderingMode() == GouraudPlusEdges )
{
if(with_names) {
viewer->glClearDepthf(1.0);
@ -591,7 +591,8 @@ void Scene::renderWireScene(const QList<Scene_interface::Item_id> &items,
{
if( group || (!with_names && item.renderingMode() == FlatPlusEdges )
|| item.renderingMode() == Wireframe
|| item.renderingMode() == PointsPlusNormals)
|| item.renderingMode() == PointsPlusNormals
|| item.renderingMode() == GouraudPlusEdges)
{
viewer->setGlPointSize(2.f);
item.drawEdges(viewer);

View File

@ -183,7 +183,8 @@ void Scene_group_item::renderChildren(Viewer_interface *viewer,
if(getChild(id)->visible() &&
(getChild(id)->renderingMode() == Flat ||
getChild(id)->renderingMode() == FlatPlusEdges ||
getChild(id)->renderingMode() == Gouraud))
getChild(id)->renderingMode() == Gouraud ||
getChild(id)->renderingMode() == GouraudPlusEdges))
{
getChild(id)->draw(viewer);
}
@ -191,7 +192,8 @@ void Scene_group_item::renderChildren(Viewer_interface *viewer,
if(getChild(id)->visible() &&
(getChild(id)->renderingMode() == FlatPlusEdges
|| getChild(id)->renderingMode() == Wireframe
|| getChild(id)->renderingMode() == PointsPlusNormals))
|| getChild(id)->renderingMode() == PointsPlusNormals
|| getChild(id)->renderingMode() == GouraudPlusEdges))
{
getChild(id)->drawEdges(viewer);
}

View File

@ -79,6 +79,8 @@ const char* slotName(RenderingMode mode) {
return SLOT(setGouraudMode());
case PointsPlusNormals:
return SLOT(setPointsPlusNormalsMode());
case GouraudPlusEdges:
return SLOT(setGouraudPlusEdgesMode());
default:
Q_ASSERT(false);
return "";

View File

@ -1017,7 +1017,6 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::set<fg_vertex_d
{
setProperty("need_hl_restore", true);
set_highlighting(false);
qDebug()<<":coucou";
}
invalidateOpenGLBuffers();
Q_EMIT updateInstructions("Ctrl+Right-click to move the point. \nHit Ctrl+Z to leave the selection. (2/2)");
@ -1028,6 +1027,11 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::set<fg_vertex_d
temp_selected_vertices.insert(vh);
const Point_3& p = get(vpm,vh);
d->manipulated_frame->setPosition(p.x()+offset.x, p.y()+offset.y, p.z()+offset.z);
if(property("is_highlighting").toBool())
{
setProperty("need_hl_restore", true);
set_highlighting(false);
}
invalidateOpenGLBuffers();
}
break;
@ -1827,6 +1831,7 @@ Scene_polyhedron_selection_item::Scene_polyhedron_selection_item(Scene_face_grap
Scene_polyhedron_selection_item::~Scene_polyhedron_selection_item()
{
poly_item->switchToGouraudPlusEdge(false);
delete d;
Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()){
CGAL::Three::Viewer_interface* viewer = dynamic_cast<CGAL::Three::Viewer_interface*>(v);

View File

@ -125,6 +125,12 @@ struct Scene_surface_mesh_item_priv{
alphaSlider = NULL;
has_vcolors = false;
has_fcolors = false;
supported_rendering_modes << FlatPlusEdges
<< Wireframe
<< Flat
<< Gouraud
<< GouraudPlusEdges
<< Points;
item->setProperty("classname", QString("surface_mesh"));
}
@ -152,6 +158,12 @@ struct Scene_surface_mesh_item_priv{
alphaSlider = NULL;
has_vcolors = false;
has_fcolors = false;
supported_rendering_modes << FlatPlusEdges
<< Wireframe
<< Flat
<< Gouraud
<< GouraudPlusEdges
<< Points;
item->setProperty("classname", QString("surface_mesh"));
}
@ -251,6 +263,7 @@ struct Scene_surface_mesh_item_priv{
int genus;
bool self_intersect;
mutable QSlider* alphaSlider;
QList<RenderingMode> supported_rendering_modes;
};
const char* aabb_property_name = "Scene_surface_mesh_item aabb tree";
@ -742,7 +755,8 @@ void Scene_surface_mesh_item::draw(CGAL::Three::Viewer_interface *viewer) const
}
if(renderingMode() == Gouraud)
if(renderingMode() == Gouraud ||
renderingMode() == GouraudPlusEdges)
{
getTriangleContainer(0)->setColor(color());
getTriangleContainer(0)->setSelected(is_selected);
@ -805,7 +819,7 @@ Scene_surface_mesh_item::selection_changed(bool p_is_selected)
bool
Scene_surface_mesh_item::supportsRenderingMode(RenderingMode m) const
{ return (m == FlatPlusEdges || m == Wireframe || m == Flat || m == Gouraud || m == Points); }
{ return d->supported_rendering_modes.contains(m); }
CGAL::Three::Scene_item::Bbox Scene_surface_mesh_item::bbox() const
{
@ -2282,36 +2296,40 @@ void Scene_surface_mesh_item::computeItemColorVectorAutomatically(bool b)
this->setProperty("recompute_colors",b);
}
void write_in_vbo(Vbo* vbo, cgal_gl_data* data,
std::size_t size)
{
vbo->bind();
vbo->vbo.write((3*size)*sizeof(cgal_gl_data),
data,
3*sizeof(cgal_gl_data));
vbo->release();
}
//only works on indexed data
void Scene_surface_mesh_item::updateVertex(vertex_descriptor vh)
{
typedef CGAL::Buffer_for_vao<float, unsigned int> CPF;
const CGAL::qglviewer::Vec offset =
static_cast<CGAL::Three::Viewer_interface*>(
CGAL::QGLViewer::QGLViewerPool().first())->offset();
//gouraud
{
std::size_t id = vh;
QOpenGLBuffer *vbo = &(getTriangleContainer(0)->getVbo(Tri::Smooth_vertices)->vbo);
cgal_gl_data new_point[3];
Point_3 p = face_graph()->point(vh);
for(int i=0; i<3; ++i)
new_point[i]=p[i]+offset[i];
write_in_vbo(getTriangleContainer(0)->getVbo(Tri::Smooth_vertices),
new_point,
id);
getTriangleContainer(0)->getVbo(Tri::Smooth_vertices)->bind();
vbo->write(static_cast<int>(3*sizeof(cgal_gl_data)*id),new_point,static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(0)->getVbo(Tri::Smooth_vertices)->release();
write_in_vbo(
getPointContainer(0)->getVbo(Pt::Vertices),
new_point,id);
vbo =&(getPointContainer(0)->getVbo(Pt::Vertices)->vbo);
getPointContainer(0)->getVbo(Pt::Vertices)->bind();
vbo->write(static_cast<int>(3*sizeof(cgal_gl_data)*id),new_point,static_cast<int>(3*sizeof(cgal_gl_data)));
getPointContainer(0)->getVbo(Pt::Vertices)->release();
vbo =&(getEdgeContainer(0)->getVbo(Ed::Vertices)->vbo);
getEdgeContainer(0)->getVbo(Pt::Vertices)->bind();
vbo->write(static_cast<int>(3*sizeof(cgal_gl_data)*id),new_point,static_cast<int>(3*sizeof(cgal_gl_data)));
getEdgeContainer(0)->getVbo(Pt::Vertices)->release();
write_in_vbo(
getEdgeContainer(0)->getVbo(Ed::Vertices),
new_point,id);
for(auto v_it : CGAL::vertices_around_target(vh, *face_graph()))
{
@ -2319,323 +2337,34 @@ void Scene_surface_mesh_item::updateVertex(vertex_descriptor vh)
for(int i=0; i<3; ++i)
new_point[i]=n[i];
id = v_it;
vbo =&(getTriangleContainer(0)->getVbo(Tri::Smooth_normals)->vbo);
getTriangleContainer(0)->getVbo(Tri::Smooth_normals)->bind();
vbo->write(static_cast<int>(3*sizeof(cgal_gl_data)*id),new_point,static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(0)->getVbo(Tri::Smooth_normals)->release();
}
}
//flat
std::size_t size = 0;
if(CGAL::is_triangle_mesh(*face_graph()))
{
size = 3;
}
else if (CGAL::is_quad_mesh(*face_graph()))
{
size = 6;
}
for(auto f : CGAL::faces_around_target(halfedge(vh, *face_graph()), *face_graph()))
{
if(size == 0)
{
for(std::size_t i = 0; i < (std::size_t)f; ++i)
{
size += CGAL::degree(f, *face_graph());
}
}
EPICK::Vector_3 n = CGAL::Polygon_mesh_processing::compute_face_normal(f, *face_graph());
cgal_gl_data new_normal[3];
for(int i=0; i<3; ++i)
new_normal[i]=n[i];
std::size_t id = f;
std::size_t vid = 0;
if(is_triangle(halfedge(f,*face_graph()),*face_graph()))
{
for(halfedge_descriptor hd : halfedges_around_face(halfedge(f, *face_graph()),*face_graph()))
{
Point_3 p = face_graph()->point(source(hd, *face_graph()));
cgal_gl_data new_point[3];
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
QOpenGLBuffer *vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
}
}
else
{
std::vector<Point_3> facet_points;
for(halfedge_descriptor hd : halfedges_around_face(halfedge(f, *face_graph()),*face_graph()))
{
facet_points.push_back(face_graph()->point(target(hd, *face_graph())));
}
bool is_convex = CPF::is_facet_convex(facet_points, n);
if(is_convex && is_quad(halfedge(f,*face_graph()),*face_graph()))
{
//1st half
halfedge_descriptor hd = halfedge(f, *face_graph());
Point_3 p = face_graph()->point(source(hd, *face_graph()));
cgal_gl_data new_point[3];
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
QOpenGLBuffer *vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
hd = next(halfedge(f, *face_graph()),*face_graph());
p = face_graph()->point(source(hd, *face_graph()));
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
hd = next(next(halfedge(f, *face_graph()),*face_graph()), *face_graph());
p = face_graph()->point(source(hd, *face_graph()));
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
//2nd half
hd = halfedge(f, *face_graph());
p = face_graph()->point(source(hd, *face_graph()));
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
hd = next(next(halfedge(f, *face_graph()),*face_graph()), *face_graph());
p = face_graph()->point(source(hd, *face_graph()));
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
hd = prev(halfedge(f, *face_graph()), *face_graph());
p = face_graph()->point(source(hd, *face_graph()));
for(int i=0; i<3; ++i)
{
new_point[i]=p[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
}
else if(is_convex)
{
Point_3 p0,p1,p2;
SMesh::Halfedge_around_face_circulator he(halfedge(f, *face_graph()), *face_graph());
SMesh::Halfedge_around_face_circulator he_end = he;
while(next(*he, *face_graph()) != prev(*he_end, *face_graph()))
{
++he;
vertex_descriptor v0(target(*he_end, *face_graph())),
v1(target(*he, *face_graph())),
v2(target(next(*he, *face_graph()), *face_graph()));
p0 = face_graph()->point(v0);
p1 = face_graph()->point(v1);
p2 = face_graph()->point(v2);
cgal_gl_data new_point[3];
QOpenGLBuffer *vbo =nullptr;
for(int i=0; i<3; ++i)
{
new_point[i]=p0[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
for(int i=0; i<3; ++i)
{
new_point[i]=p1[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
for(int i=0; i<3; ++i)
{
new_point[i]=p2[i]+offset[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, static_cast<int>(3*sizeof(cgal_gl_data)));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
}
}
else
{
//Computes the normal of the facet
if(n == CGAL::NULL_VECTOR)
{
boost::graph_traits<SMesh>::halfedge_descriptor start = prev(halfedge(f, *face_graph()), *face_graph());
boost::graph_traits<SMesh>::halfedge_descriptor hd = halfedge(f, *face_graph());
boost::graph_traits<SMesh>::halfedge_descriptor next_=next(hd, *face_graph());
do
{
const Point_3& pa = face_graph()->point(target(hd, *face_graph()));
const Point_3& pb = face_graph()->point(target(next_, *face_graph()));
const Point_3& pc = face_graph()->point(target(prev(hd, *face_graph()), *face_graph()));
if (!CGAL::collinear (pa, pb, pc))
{
n = CGAL::cross_product(pb-pa, pc -pa);
break;
}
next_ =next(next_, *face_graph());
}while(next_ != start);
if (n == CGAL::NULL_VECTOR) // No normal could be computed, return
{
qDebug()<<"Warning : normal is not valid. Facet not updated";
continue;
}
}
//check if normal contains NaN values
if (n.x() != n.x() || n.y() != n.y() || n.z() != n.z())
{
qDebug()<<"Warning : normal is not valid. Facet not displayed";
continue;
}
typedef FacetTriangulator<SMesh, EPICK, boost::graph_traits<SMesh>::vertex_descriptor> FT;
EPICK::Vector_3 voffset(offset.x,offset.y,offset.z);
FT triangulation(f,n,face_graph(), voffset);
//iterates on the internal faces
for(FT::CDT::Finite_faces_iterator
ffit = triangulation.cdt->finite_faces_begin(),
end = triangulation.cdt->finite_faces_end();
ffit != end; ++ffit)
{
if(ffit->info().is_external)
continue;
Point_3 p = ffit->vertex(0)->point();
cgal_gl_data new_point[3];
for(int i=0; i<3; ++i)
{
new_point[i]=p[i];
}
QOpenGLBuffer *vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
p = ffit->vertex(1)->point();
for(int i=0; i<3; ++i)
{
new_point[i]=p[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
p=ffit->vertex(2)->point();
for(int i=0; i<3; ++i)
{
new_point[i]=p[i];
}
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_normals)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_normal, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_normals)->release();
vbo = &(getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->vbo);
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->bind();
vbo->write(static_cast<int>((3*size*id+vid)*sizeof(cgal_gl_data)),new_point, 3*sizeof(cgal_gl_data));
getTriangleContainer(1)->getVbo(Tri::Flat_vertices)->release();
vid+=3;
}
}
write_in_vbo(
getTriangleContainer(0)->getVbo(Tri::Smooth_normals),
new_point,id);
}
}
invalidate_aabb_tree();
redraw();
}
void Scene_surface_mesh_item::switchToGouraudPlusEdge(bool b)
{
if (!b && !d->supported_rendering_modes.contains(Flat))
{
d->supported_rendering_modes = QList<RenderingMode>() << FlatPlusEdges
<< Wireframe
<< Flat
<< Gouraud
<< Points;
setFlatPlusEdgesMode();
invalidateOpenGLBuffers();
redraw();
}
else if(b)
{
d->supported_rendering_modes = QList<RenderingMode>() << GouraudPlusEdges
<< Wireframe
<< Gouraud
<< Points;
setGouraudPlusEdgesMode();
}
}

View File

@ -155,7 +155,7 @@ public:
void computeElements() const Q_DECL_OVERRIDE;
void initializeBuffers(CGAL::Three::Viewer_interface*)const Q_DECL_OVERRIDE;
void updateVertex(vertex_descriptor vh);
void switchToGouraudPlusEdge(bool b); //replace flatPlusEdge by gouraudPlusEdge and ban Flat.
Q_SIGNALS:
void item_is_about_to_be_changed();
void selection_done();

View File

@ -201,6 +201,8 @@ QString Three::modeName(RenderingMode mode) {
return QObject::tr("Gouraud");
case PointsPlusNormals:
return QObject::tr("pts+normals");
case GouraudPlusEdges:
return QObject::tr("gouraud+edges");
default:
Q_ASSERT(false);
return QObject::tr("unknown");

View File

@ -41,6 +41,7 @@ enum RenderingMode
Flat, //!Renders only faces, with a lighting per face.
FlatPlusEdges, //!Renders flat faces and edges.
Gouraud, //!Renders only faces, with a lighting per vertex.
GouraudPlusEdges, //!Renders faces with a lighting per vertex, and edges.
ShadedPoints, //!Renders only points with lighting.
NumberOfRenderingMode //!Number of values in this enum.
};

View File

@ -377,6 +377,10 @@ public Q_SLOTS:
void setPointsPlusNormalsMode(){
setRenderingMode(PointsPlusNormals);
}
//!Sets the RenderingMode to GouraudPlusEdges.
void setGouraudPlusEdgesMode(){
setRenderingMode(GouraudPlusEdges);
}
//!Emits an aboutToBeDestroyed() signal.
//!Override this function to delete what needs to be deleted on destruction.