Merge pull request #553 from lrineau/Polyhedron_demo-fix_Scene_c3t3_item_display_of_spheres-GF

Polyhedron demo: fix the display of protecting balls in Scene_c3t3_item
This commit is contained in:
Sebastien Loriot 2015-12-21 10:52:07 +01:00
commit e44adafd60
1 changed files with 153 additions and 151 deletions

View File

@ -130,6 +130,7 @@ Scene_c3t3_item::Scene_c3t3_item(const C3t3& c3t3)
need_changed = false; need_changed = false;
startTimer(0); startTimer(0);
connect(frame, SIGNAL(modified()), this, SLOT(changed())); connect(frame, SIGNAL(modified()), this, SLOT(changed()));
reset_cut_plane();
c3t3_changed(); c3t3_changed();
setRenderingMode(FlatPlusEdges); setRenderingMode(FlatPlusEdges);
compile_shaders(); compile_shaders();
@ -482,45 +483,45 @@ void Scene_c3t3_item::draw(CGAL::Three::Viewer_interface* viewer) const {
if(spheres_are_shown) if(spheres_are_shown)
{ {
vaos[Spheres]->bind(); vaos[Spheres]->bind();
program_sphere->bind(); program_sphere->bind();
//ModelViewMatrix used for the transformation of the camera. //ModelViewMatrix used for the transformation of the camera.
QMatrix4x4 mvp_mat; QMatrix4x4 mvp_mat;
// ModelView Matrix used for the lighting system // ModelView Matrix used for the lighting system
QMatrix4x4 mv_mat; QMatrix4x4 mv_mat;
GLdouble d_mat[16]; GLdouble d_mat[16];
GLint is_both_sides = 0; GLint is_both_sides = 0;
viewer->camera()->getModelViewProjectionMatrix(d_mat); viewer->camera()->getModelViewProjectionMatrix(d_mat);
//Convert the GLdoubles matrices in GLfloats //Convert the GLdoubles matrices in GLfloats
for (int i=0; i<16; ++i){ for (int i=0; i<16; ++i){
mvp_mat.data()[i] = GLfloat(d_mat[i]); mvp_mat.data()[i] = GLfloat(d_mat[i]);
} }
viewer->camera()->getModelViewMatrix(d_mat); viewer->camera()->getModelViewMatrix(d_mat);
for (int i=0; i<16; ++i) for (int i=0; i<16; ++i)
mv_mat.data()[i] = GLfloat(d_mat[i]); mv_mat.data()[i] = GLfloat(d_mat[i]);
QVector4D position(0.0f,0.0f,1.0f, 1.0f ); QVector4D position(0.0f,0.0f,1.0f, 1.0f );
QVector4D ambient(0.4f, 0.4f, 0.4f, 0.4f); QVector4D ambient(0.4f, 0.4f, 0.4f, 0.4f);
// Diffuse // Diffuse
QVector4D diffuse(1.0f, 1.0f, 1.0f, 1.0f); QVector4D diffuse(1.0f, 1.0f, 1.0f, 1.0f);
// Specular // Specular
QVector4D specular(0.0f, 0.0f, 0.0f, 1.0f); QVector4D specular(0.0f, 0.0f, 0.0f, 1.0f);
viewer->glGetIntegerv(GL_LIGHT_MODEL_TWO_SIDE, &is_both_sides); viewer->glGetIntegerv(GL_LIGHT_MODEL_TWO_SIDE, &is_both_sides);
program_sphere->setUniformValue("mvp_matrix", mvp_mat); program_sphere->setUniformValue("mvp_matrix", mvp_mat);
program_sphere->setUniformValue("mv_matrix", mv_mat); program_sphere->setUniformValue("mv_matrix", mv_mat);
program_sphere->setUniformValue("light_pos", position); program_sphere->setUniformValue("light_pos", position);
program_sphere->setUniformValue("light_diff",diffuse); program_sphere->setUniformValue("light_diff",diffuse);
program_sphere->setUniformValue("light_spec", specular); program_sphere->setUniformValue("light_spec", specular);
program_sphere->setUniformValue("light_amb", ambient); program_sphere->setUniformValue("light_amb", ambient);
program_sphere->setUniformValue("spec_power", 51.8f); program_sphere->setUniformValue("spec_power", 51.8f);
program_sphere->setUniformValue("is_two_side", is_both_sides); program_sphere->setUniformValue("is_two_side", is_both_sides);
viewer->glDrawArraysInstanced(GL_TRIANGLES, 0, viewer->glDrawArraysInstanced(GL_TRIANGLES, 0,
static_cast<GLsizei>(s_vertex.size()/3), static_cast<GLsizei>(s_vertex.size()/3),
static_cast<GLsizei>(s_radius.size())); static_cast<GLsizei>(s_radius.size()));
program_sphere->release(); program_sphere->release();
vaos[Spheres]->release(); vaos[Spheres]->release();
} }
} }
@ -589,8 +590,8 @@ void Scene_c3t3_item::draw_edges(CGAL::Three::Viewer_interface* viewer) const {
program_sphere->setUniformValue("is_two_side", is_both_sides); program_sphere->setUniformValue("is_two_side", is_both_sides);
viewer->glDrawArraysInstanced(GL_TRIANGLES, 0, viewer->glDrawArraysInstanced(GL_TRIANGLES, 0,
static_cast<GLsizei>(ws_vertex.size()/3), static_cast<GLsizei>(ws_vertex.size()/3),
static_cast<GLsizei>(s_radius.size())); static_cast<GLsizei>(s_radius.size()));
program_sphere->release(); program_sphere->release();
vaos[Wired_spheres]->release(); vaos[Wired_spheres]->release();
} }
@ -794,75 +795,114 @@ void Scene_c3t3_item::initialize_buffers(CGAL::Three::Viewer_interface *viewer)c
} }
//vao containing the data for the lines //vao containing the data for the lines
{ {
program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer);
program->bind(); program->bind();
vaos[Edges]->bind(); vaos[Edges]->bind();
buffers[Edges_vertices].bind(); buffers[Edges_vertices].bind();
buffers[Edges_vertices].allocate(positions_lines.data(), buffers[Edges_vertices].allocate(positions_lines.data(),
static_cast<int>(positions_lines.size()*sizeof(float))); static_cast<int>(positions_lines.size()*sizeof(float)));
program->enableAttributeArray("vertex"); program->enableAttributeArray("vertex");
program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
buffers[Edges_vertices].release(); buffers[Edges_vertices].release();
vaos[Edges]->release(); vaos[Edges]->release();
program->release(); program->release();
} }
//vao containing the data for the grid //vao containing the data for the grid
{ {
program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer);
program->bind(); program->bind();
vaos[2]->bind(); vaos[2]->bind();
buffers[Grid_vertices].bind(); buffers[Grid_vertices].bind();
buffers[Grid_vertices].allocate(positions_grid.data(), buffers[Grid_vertices].allocate(positions_grid.data(),
static_cast<int>(positions_grid.size()*sizeof(float))); static_cast<int>(positions_grid.size()*sizeof(float)));
program->enableAttributeArray("vertex"); program->enableAttributeArray("vertex");
program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
buffers[Grid_vertices].release(); buffers[Grid_vertices].release();
vaos[2]->release(); vaos[2]->release();
program->release(); program->release();
} }
//vao containing the data for the spheres //vao containing the data for the spheres
{
program_sphere->bind();
vaos[Spheres]->bind();
buffers[Sphere_vertices].bind();
buffers[Sphere_vertices].allocate(s_vertex.data(),
static_cast<int>(s_vertex.size()*sizeof(float)));
program_sphere->enableAttributeArray("vertex");
program_sphere->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
buffers[Sphere_vertices].release();
buffers[Sphere_normals].bind();
buffers[Sphere_normals].allocate(s_normals.data(),
static_cast<int>(s_normals.size()*sizeof(float)));
program_sphere->enableAttributeArray("normals");
program_sphere->setAttributeBuffer("normals", GL_FLOAT, 0, 3);
buffers[Sphere_normals].release();
buffers[Sphere_colors].bind();
buffers[Sphere_colors].allocate(s_colors.data(),
static_cast<int>(s_colors.size()*sizeof(float)));
program_sphere->enableAttributeArray("colors");
program_sphere->setAttributeBuffer("colors", GL_FLOAT, 0, 3);
buffers[Sphere_colors].release();
buffers[Sphere_radius].bind();
buffers[Sphere_radius].allocate(s_radius.data(),
static_cast<int>(s_radius.size()*sizeof(float)));
program_sphere->enableAttributeArray("radius");
program_sphere->setAttributeBuffer("radius", GL_FLOAT, 0, 1);
buffers[Sphere_radius].release();
buffers[Sphere_center].bind();
buffers[Sphere_center].allocate(s_center.data(),
static_cast<int>(s_center.size()*sizeof(float)));
program_sphere->enableAttributeArray("center");
program_sphere->setAttributeBuffer("center", GL_FLOAT, 0, 3);
buffers[Sphere_center].release();
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("center"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("radius"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("colors"), 1);
vaos[Spheres]->release();
}
//vao containing the data for the wired spheres
{ {
program_sphere->bind(); program_sphere->bind();
vaos[Spheres]->bind(); vaos[Wired_spheres]->bind();
buffers[Sphere_vertices].bind(); buffers[Wired_spheres_vertices].bind();
buffers[Sphere_vertices].allocate(s_vertex.data(), buffers[Wired_spheres_vertices].allocate(s_vertex.data(),
static_cast<int>(s_vertex.size()*sizeof(float))); static_cast<int>(s_vertex.size()*sizeof(float)));
program_sphere->enableAttributeArray("vertex"); program_sphere->enableAttributeArray("vertex");
program_sphere->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); program_sphere->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
buffers[Sphere_vertices].release(); buffers[Wired_spheres_vertices].release();
buffers[Sphere_normals].bind(); buffers[Sphere_normals].bind();
buffers[Sphere_normals].allocate(s_normals.data(),
static_cast<int>(s_normals.size()*sizeof(float)));
program_sphere->enableAttributeArray("normals"); program_sphere->enableAttributeArray("normals");
program_sphere->setAttributeBuffer("normals", GL_FLOAT, 0, 3); program_sphere->setAttributeBuffer("normals", GL_FLOAT, 0, 3);
buffers[Sphere_normals].release(); buffers[Sphere_normals].release();
buffers[Sphere_colors].bind(); buffers[Sphere_colors].bind();
buffers[Sphere_colors].allocate(s_colors.data(),
static_cast<int>(s_colors.size()*sizeof(float)));
program_sphere->enableAttributeArray("colors"); program_sphere->enableAttributeArray("colors");
program_sphere->setAttributeBuffer("colors", GL_FLOAT, 0, 3); program_sphere->setAttributeBuffer("colors", GL_FLOAT, 0, 3);
buffers[Sphere_colors].release(); buffers[Sphere_colors].release();
buffers[Sphere_radius].bind(); buffers[Sphere_radius].bind();
buffers[Sphere_radius].allocate(s_radius.data(),
static_cast<int>(s_radius.size()*sizeof(float)));
program_sphere->enableAttributeArray("radius"); program_sphere->enableAttributeArray("radius");
program_sphere->setAttributeBuffer("radius", GL_FLOAT, 0, 3); program_sphere->setAttributeBuffer("radius", GL_FLOAT, 0, 1);
buffers[Sphere_radius].release(); buffers[Sphere_radius].release();
buffers[Sphere_center].bind(); buffers[Sphere_center].bind();
buffers[Sphere_center].allocate(s_center.data(),
static_cast<int>(s_center.size()*sizeof(float)));
program_sphere->enableAttributeArray("center"); program_sphere->enableAttributeArray("center");
program_sphere->setAttributeBuffer("center", GL_FLOAT, 0, 3); program_sphere->setAttributeBuffer("center", GL_FLOAT, 0, 3);
buffers[Sphere_center].release(); buffers[Sphere_center].release();
@ -870,51 +910,12 @@ void Scene_c3t3_item::initialize_buffers(CGAL::Three::Viewer_interface *viewer)c
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("center"), 1); viewer->glVertexAttribDivisor(program_sphere->attributeLocation("center"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("radius"), 1); viewer->glVertexAttribDivisor(program_sphere->attributeLocation("radius"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("colors"), 1); viewer->glVertexAttribDivisor(program_sphere->attributeLocation("colors"), 1);
vaos[Spheres]->release(); vaos[Wired_spheres]->release();
program_sphere->release();
} }
//vao containing the data for the wired spheres
{
program_sphere->bind();
vaos[Wired_spheres]->bind();
buffers[Wired_spheres_vertices].bind();
buffers[Wired_spheres_vertices].allocate(s_vertex.data(),
static_cast<int>(s_vertex.size()*sizeof(float)));
program_sphere->enableAttributeArray("vertex");
program_sphere->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
buffers[Wired_spheres_vertices].release();
buffers[Sphere_normals].bind();
program_sphere->enableAttributeArray("normals");
program_sphere->setAttributeBuffer("normals", GL_FLOAT, 0, 3);
buffers[Sphere_normals].release();
buffers[Sphere_colors].bind();
program_sphere->enableAttributeArray("colors");
program_sphere->setAttributeBuffer("colors", GL_FLOAT, 0, 3);
buffers[Sphere_colors].release();
buffers[Sphere_radius].bind();
program_sphere->enableAttributeArray("radius");
program_sphere->setAttributeBuffer("radius", GL_FLOAT, 0, 3);
buffers[Sphere_radius].release();
buffers[Sphere_center].bind();
program_sphere->enableAttributeArray("center");
program_sphere->setAttributeBuffer("center", GL_FLOAT, 0, 3);
buffers[Sphere_center].release();
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("center"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("radius"), 1);
viewer->glVertexAttribDivisor(program_sphere->attributeLocation("colors"), 1);
vaos[Wired_spheres]->release();
program_sphere->release();
}
program_sphere->release(); program_sphere->release();
are_buffers_filled = true; are_buffers_filled = true;
} }
@ -1075,43 +1076,44 @@ void Scene_c3t3_item::compute_elements() const
} }
//The Spheres //The Spheres
{ {
for(Tr::Finite_vertices_iterator
for(Tr::Finite_vertices_iterator
vit = d->c3t3.triangulation().finite_vertices_begin(), vit = d->c3t3.triangulation().finite_vertices_begin(),
end = d->c3t3.triangulation().finite_vertices_end(); end = d->c3t3.triangulation().finite_vertices_end();
vit != end; ++vit) vit != end; ++vit)
{
if(vit->point().weight()==0) continue;
typedef Tr::Vertex_handle Vertex_handle;
std::vector<Vertex_handle> incident_vertices;
d->c3t3.triangulation().incident_vertices(vit, std::back_inserter(incident_vertices));
bool red = vit->is_special();
for(std::vector<Vertex_handle>::const_iterator
vvit = incident_vertices.begin(), end = incident_vertices.end();
vvit != end; ++vvit)
{ {
typedef Tr::Vertex_handle Vertex_handle; if(Kernel::Sphere_3(vit->point().point(),
std::vector<Vertex_handle> incident_vertices; vit->point().weight()).bounded_side((*vvit)->point().point())
d->c3t3.triangulation().incident_vertices(vit, std::back_inserter(incident_vertices)); == CGAL::ON_BOUNDED_SIDE)
bool red = vit->is_special(); red = true;
for(std::vector<Vertex_handle>::const_iterator
vvit = incident_vertices.begin(), end = incident_vertices.end();
vvit != end; ++vvit)
{
if(Kernel::Sphere_3(vit->point().point(),
vit->point().weight()).bounded_side((*vvit)->point().point())
== CGAL::ON_BOUNDED_SIDE)
red = true;
}
if(red){
s_colors.push_back(1.0);
s_colors.push_back(0.0);
s_colors.push_back(0.0);
}
else{
QColor c = this->color().darker(250);
s_colors.push_back(c.redF());
s_colors.push_back(c.greenF());
s_colors.push_back(c.blueF());
}
s_center.push_back(vit->point().point().x());
s_center.push_back(vit->point().point().y());
s_center.push_back(vit->point().point().z());
s_radius.push_back(CGAL::sqrt(vit->point().weight()));
} }
if(red){
s_colors.push_back(1.0);
s_colors.push_back(0.0);
s_colors.push_back(0.0);
}
else{
QColor c = this->color().darker(250);
s_colors.push_back(c.redF());
s_colors.push_back(c.greenF());
s_colors.push_back(c.blueF());
}
s_center.push_back(vit->point().point().x());
s_center.push_back(vit->point().point().y());
s_center.push_back(vit->point().point().z());
s_radius.push_back(CGAL::sqrt(vit->point().weight()));
}
} }
} }