From 6d54163bbd0baf8dca4052e38718aec6030d7b2f Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 25 Sep 2018 12:13:37 +0200 Subject: [PATCH] Edit_sphere_item --- GraphicsView/include/CGAL/Qt/qglviewer.h | 3 +- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 8 +- .../Plugins/PCA/Scene_edit_box_item.cpp | 1017 ++++++----------- .../Plugins/PCA/Scene_edit_box_item.h | 16 +- Polyhedron/demo/Polyhedron/Polyhedron_3.qrc | 2 + .../demo/Polyhedron/Triangle_container.cpp | 5 + Polyhedron/demo/Polyhedron/Viewer.cpp | 23 +- .../shader_dark_spheres.v | 17 + .../compatibility_shaders/shader_with_light.v | 3 +- .../resources/shader_dark_spheres.v | 19 + .../Polyhedron/resources/shader_with_light.v | 3 +- Three/include/CGAL/Three/Scene_item.h | 41 +- Three/include/CGAL/Three/Triangle_container.h | 4 + Three/include/CGAL/Three/Viewer_interface.h | 1 + 14 files changed, 473 insertions(+), 689 deletions(-) create mode 100644 Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_dark_spheres.v create mode 100644 Polyhedron/demo/Polyhedron/resources/shader_dark_spheres.v diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 3d49406f6b7..708ffb92f98 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -991,7 +991,8 @@ public: public: virtual void setVisualHintsMask(int mask, int delay = 2000); virtual void drawVisualHints(); - QOpenGLFramebufferObject* getStoredFrameBuffer(); + QOpenGLFramebufferObject* getStoredFrameBuffer() const; + void setStoredFrameBuffer(QOpenGLFramebufferObject*); public Q_SLOTS: virtual void resetVisualHints(); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index dec291beb35..8102bea31ae 100755 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -4097,11 +4097,17 @@ QImage* CGAL::QGLViewer::takeSnapshot( CGAL::qglviewer::SnapShotBackground back } CGAL_INLINE_FUNCTION -QOpenGLFramebufferObject* CGAL::QGLViewer::getStoredFrameBuffer() +QOpenGLFramebufferObject* CGAL::QGLViewer::getStoredFrameBuffer() const { return stored_fbo; } +CGAL_INLINE_FUNCTION +void CGAL::QGLViewer::setStoredFrameBuffer(QOpenGLFramebufferObject *fbo) +{ + stored_fbo = fbo; +} + CGAL_INLINE_FUNCTION void CGAL::QGLViewer::saveSnapshot() { diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index baffa4ebf55..92433a79020 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -1,6 +1,9 @@ #include "Scene_edit_box_item.h" #include #include +#include +#include +#include #include #include #include @@ -9,6 +12,11 @@ #include using namespace CGAL::Three; +typedef Viewer_interface Vi; +typedef Triangle_container Tc; +typedef Edge_container Ec; +typedef Scene_edit_box_item_priv Priv; + struct Scene_edit_box_item::vertex{ int id; double *x; @@ -44,32 +52,23 @@ struct Scene_edit_box_item::face{ struct Scene_edit_box_item_priv{ typedef CGAL::Simple_cartesian Kernel; - enum VAOs{ - Edges = 0, - Spheres, - Faces, - S_Edges, - S_Spheres, + enum Face_containers{ + Faces = 0, S_Faces, - P_Edges, + Spheres, + S_Spheres, P_Spheres, P_Faces, - NumberOfVaos + Nbf }; - enum VBOs{ - VertexEdges = 0, - ColorsEdges, - VertexSpheres, - NormalSpheres, - CenterSpheres, - ColorsSpheres, - VertexFaces, - NormalFaces, - ColorsFaces, - S_Vertex, - S_Normal, - NumberOfVbos + + enum Line_containers{ + Edges = 0, + S_Edges, + P_Edges, + Nbe }; + enum HL_Primitive{ VERTEX=0, EDGE, @@ -201,159 +200,6 @@ struct Scene_edit_box_item_priv{ for(int j=0; j<3; ++j) last_pool[i][j] = vertices[i][j]; - if(QOpenGLContext::currentContext()->format().majorVersion() >= 3) - { - pick_sphere_program.addShaderFromSourceFile(QOpenGLShader::Vertex,":/cgal/Polyhedron_3/resources/shader_spheres.v"); - pick_sphere_program.addShaderFromSourceFile(QOpenGLShader::Fragment,":/cgal/Polyhedron_3/resources/shader_without_light.f"); - } - else - { - pick_sphere_program.addShaderFromSourceFile(QOpenGLShader::Vertex,":/cgal/Polyhedron_3/resources/compatibility_shaders/shader_spheres.v"); - pick_sphere_program.addShaderFromSourceFile(QOpenGLShader::Fragment,":/cgal/Polyhedron_3/resources/compatibility_shaders/shader_without_light.f"); - } - pick_sphere_program.bindAttributeLocation("colors", 1); - pick_sphere_program.link(); - - - //Vertex source code - const char vertex_source[] = - { - "#version 150 \n" - "in vec4 vertex; " - "in vec3 normals; " - "in vec4 colors; " - "uniform mat4 mvp_matrix; " - "uniform mat4 mv_matrix; " - "out vec4 fP; " - "out vec3 fN; " - "out vec4 color; " - "void main(void) " - "{ " - " color = colors; " - " fP = mv_matrix * vertex; " - " mat3 mv_matrix_3; " - " mv_matrix_3[0] = mv_matrix[0].xyz; " - " mv_matrix_3[1] = mv_matrix[1].xyz; " - " mv_matrix_3[2] = mv_matrix[2].xyz; " - " fN = mv_matrix_3* normals; " - " gl_Position = mvp_matrix * vertex; " - "}\n " - "\n " - }; - - const char vertex_source_comp[] = - { - "attribute highp vec4 vertex; " - "attribute highp vec3 normals; " - "attribute highp vec4 colors; " - "uniform highp mat4 mvp_matrix; " - "uniform highp mat4 mv_matrix; " - "varying highp vec4 fP; " - "varying highp vec3 fN; " - "varying highp vec4 color; " - "void main(void) " - "{ " - " color = colors; " - " fP = mv_matrix * vertex; " - " mat3 mv_matrix_3; " - " mv_matrix_3[0] = mv_matrix[0].xyz; " - " mv_matrix_3[1] = mv_matrix[1].xyz; " - " mv_matrix_3[2] = mv_matrix[2].xyz; " - " fN = mv_matrix_3* normals; " - " gl_Position = mvp_matrix * vertex; " - "}\n " - "\n " - }; - - //Fragment source code - const char fragment_source[] = - { - "#version 150 \n" - "in vec4 color;" - "in vec4 fP; " - "in vec3 fN; " - "uniform vec4 light_pos; " - "uniform vec4 light_diff; " - "uniform vec4 light_spec; " - "uniform vec4 light_amb; " - "uniform float spec_power ; " - "uniform int is_two_side; " - "uniform bool is_selected;" - "out vec4 out_color; \n" - "void main(void) {" - " vec3 L = light_pos.xyz - fP.xyz;" - " vec3 V = -fP.xyz;" - " vec3 N;" - "if(fN == vec3(0.0,0.0,0.0)) " - "N = vec3(0.0,0.0,0.0);" - "else " - "N = normalize(fN);" - "L = normalize(L);" - "V = normalize(V);" - "vec3 R = reflect(-L, N);" - "vec4 diffuse;" - "if(is_two_side == 1) " - "diffuse = abs(dot(N,L)) * light_diff * color;" - "else " - "diffuse = max(dot(N,L), 0.0) * light_diff * color;" - "vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec;" - "vec4 ret_color = vec4((color*light_amb).xyz + diffuse.xyz + specular.xyz,1);" - "if(is_selected) " - " out_color = vec4(ret_color.r+70.0/255.0, ret_color.g+70.0/255.0, ret_color.b+70.0/255.0, color.a);" - "else " - " out_color = vec4(ret_color.rgb, color.a); }\n" - "\n" - }; - //Fragment source code - const char fragment_source_comp[] = - { - "varying highp vec4 color;" - "varying highp vec4 fP; " - "varying highp vec3 fN; " - "uniform highp vec4 light_pos; " - "uniform highp vec4 light_diff; " - "uniform highp vec4 light_spec; " - "uniform highp vec4 light_amb; " - "uniform highp float spec_power ; " - "uniform int is_two_side; " - "uniform bool is_selected;" - "void main(void) {" - "highp vec3 L = light_pos.xyz - fP.xyz;" - "highp vec3 V = -fP.xyz;" - "highp vec3 N;" - "if(fN == highp vec3(0.0,0.0,0.0)) " - "N = highp vec3(0.0,0.0,0.0);" - "else " - "N = normalize(fN);" - "L = normalize(L);" - "V = normalize(V);" - "highp vec3 R = reflect(-L, N);" - "vec4 diffuse;" - "if(is_two_side == 1) " - "diffuse = abs(dot(N,L)) * light_diff * color;" - "else " - "diffuse = max(dot(N,L), 0.0) * light_diff * color;" - "highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec;" - "vec4 ret_color = vec4((color*light_amb).xyz + diffuse.xyz + specular.xyz,1);" - "if(is_selected) " - "gl_FragColor = vec4(ret_color.r+70.0/255.0, ret_color.g+70.0/255.0, ret_color.b+70.0/255.0, color.a);" - "else " - "gl_FragColor = vec4(ret_color.rgb, color.a); }\n" - "\n" - }; - - if(QOpenGLContext::currentContext()->format().majorVersion() >= 3) - { - transparent_face_program.addShaderFromSourceCode(QOpenGLShader::Vertex,vertex_source); - transparent_face_program.addShaderFromSourceCode(QOpenGLShader::Fragment,fragment_source); - } - else - { - transparent_face_program.addShaderFromSourceCode(QOpenGLShader::Vertex,vertex_source_comp); - transparent_face_program.addShaderFromSourceCode(QOpenGLShader::Fragment,fragment_source_comp); - } - transparent_face_program.bindAttributeLocation("colors", 1); - transparent_face_program.link(); reset_selection(); last_picked_id = -1; last_picked_type = -1; @@ -389,8 +235,6 @@ struct Scene_edit_box_item_priv{ CGAL::qglviewer::Vec center_; CGAL::qglviewer::Vec relative_center_; - mutable QOpenGLShaderProgram pick_sphere_program; - mutable QOpenGLShaderProgram transparent_face_program; mutable Scene_edit_box_item::vertex vertices[8]; mutable Scene_edit_box_item::edge edges[12]; mutable Scene_edit_box_item::face faces[6]; @@ -400,7 +244,6 @@ struct Scene_edit_box_item_priv{ bool selection_on; void picking(int& type, int& id, Viewer_interface *viewer); - mutable QOpenGLShaderProgram* program; void initializeBuffers(Viewer_interface *viewer)const; void computeElements() const; @@ -424,14 +267,34 @@ Scene_edit_box_item::Scene_edit_box_item() d = NULL; } Scene_edit_box_item::Scene_edit_box_item(const Scene_interface *scene_interface) - : Scene_item(Scene_edit_box_item_priv::NumberOfVbos,Scene_edit_box_item_priv::NumberOfVaos) - { d = new Scene_edit_box_item_priv(scene_interface, this); are_buffers_filled = false; - CGAL::QGLViewer* viewer = *CGAL::QGLViewer::QGLViewerPool().begin(); - viewer->setMouseTracking(true); + + Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) + { + v->setMouseTracking(true); + } + connect(Three::mainWindow(), SIGNAL(newViewerCreated(QObject*)), + this, SLOT(connectNewViewer(QObject*))); + + setTriangleContainer(Priv::P_Faces , new Tc(Vi::PROGRAM_NO_SELECTION, false)); + setTriangleContainer(Priv::Faces , new Tc(Vi::PROGRAM_WITH_LIGHT, false)); + setTriangleContainer(Priv::S_Faces , new Tc(Vi::PROGRAM_WITH_LIGHT, false)); + setTriangleContainer(Priv::Spheres , new Tc(Vi::PROGRAM_SPHERES, false)); + setTriangleContainer(Priv::S_Spheres, new Tc(Vi::PROGRAM_SPHERES, false)); + setTriangleContainer(Priv::P_Spheres, new Tc(Vi::PROGRAM_DARK_SPHERES, false)); + + + for(int i=Priv::Nbe-1; i>=0; --i) + { + setEdgeContainer(i, + new Ec(Three::mainViewer()->isOpenGL_4_3() + ? Vi::PROGRAM_SOLID_WIREFRAME + : Vi::PROGRAM_NO_SELECTION, + false)); + } } QString Scene_edit_box_item::toolTip() const { @@ -440,47 +303,42 @@ QString Scene_edit_box_item::toolTip() const { void Scene_edit_box_item::drawSpheres(Viewer_interface *viewer, const QMatrix4x4 f_matrix ) const { - vaos[Scene_edit_box_item_priv::Spheres]->bind(); GLdouble d_mat[16]; - QMatrix4x4 mvp_mat; - viewer->camera()->getModelViewProjectionMatrix(d_mat); - for (int i=0; i<16; ++i) - mvp_mat.data()[i] = GLfloat(d_mat[i]); - mvp_mat = mvp_mat*f_matrix; QMatrix4x4 mv_mat; viewer->camera()->getModelViewMatrix(d_mat); for (int i=0; i<16; ++i) mv_mat.data()[i] = GLfloat(d_mat[i]); mv_mat = mv_mat*f_matrix; - QVector4D light_pos(0.0f,0.0f,1.0f, 1.0f ); - light_pos = light_pos*f_matrix; double radius =std::sqrt( (point(6,0) - point(0,0)) * (point(6,0) - point(0,0)) + (point(6,1) - point(0,1)) * (point(6,1) - point(0,1)) + (point(6,2) - point(0,2)) * (point(6,2) - point(0,2))) *0.02 ; - attribBuffers(viewer, PROGRAM_SPHERES); - d->program = getShaderProgram(PROGRAM_SPHERES, viewer); - d->program->bind(); - d->program->setUniformValue("mvp_matrix", mvp_mat); - d->program->setUniformValue("mv_matrix", mv_mat); - d->program->setUniformValue("light_pos", light_pos); - d->program->setUniformValue("is_clipbox_on", false); - d->program->setAttributeValue("radius",radius); - d->program->setAttributeValue("colors", QColor(Qt::red)); - viewer->glDrawArraysInstanced(GL_TRIANGLES, 0, - static_cast(d->vertex_spheres.size()/3), - static_cast(8)); - d->program->release(); - vaos[Scene_edit_box_item_priv::Spheres]->release(); + Tc* tc = getTriangleContainer(Priv::Spheres); + tc->setFrameMatrix(f_matrix); + tc->setMvMatrix(mv_mat); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->program->setAttributeValue("radius",radius); + tc->getVao(viewer)->release(); + tc->setColor(QColor(Qt::red)); + tc->draw(viewer, true); } void Scene_edit_box_item::draw(Viewer_interface *viewer) const { - if (!are_buffers_filled) + if(!isInit()) + initGL(); + if ( getBuffersFilled() && + ! getBuffersInit(viewer)) { - d->computeElements(); - d->initializeBuffers(viewer); + initializeBuffers(viewer); + setBuffersInit(viewer, true); + } + if(!getBuffersFilled()) + { + computeElements(); + initializeBuffers(viewer); } QMatrix4x4 f_matrix; for (int i=0; i<16; ++i){ @@ -493,40 +351,37 @@ void Scene_edit_box_item::draw(Viewer_interface *viewer) const void Scene_edit_box_item::drawEdges(Viewer_interface* viewer) const { - if(!are_buffers_filled) + if(!isInit()) + initGL(); + if ( getBuffersFilled() && + ! getBuffersInit(viewer)) { - d->computeElements(); - d->initializeBuffers(viewer); + initializeBuffers(viewer); + setBuffersInit(viewer, true); + } + if(!getBuffersFilled()) + { + computeElements(); + initializeBuffers(viewer); } QMatrix4x4 f_matrix; for (int i=0; i<16; ++i){ f_matrix.data()[i] = (float)d->frame->matrix()[i]; } - vaos[Scene_edit_box_item_priv::Edges]->bind(); - if(!viewer->isOpenGL_4_3()) + Ec* ec = getEdgeContainer(Priv::Edges); + if(viewer->isOpenGL_4_3()) { - attribBuffers(viewer, PROGRAM_WITHOUT_LIGHT); - d->program = getShaderProgram(PROGRAM_WITHOUT_LIGHT); - d->program->bind(); - d->program->setUniformValue("is_clipbox_on", false); - } - else - { - attribBuffers(viewer, PROGRAM_SOLID_WIREFRAME); - d->program = getShaderProgram(PROGRAM_SOLID_WIREFRAME); - d->program->bind(); QVector2D vp(viewer->width(), viewer->height()); - d->program->setUniformValue("viewport", vp); - d->program->setUniformValue("is_clipbox_on", false); - d->program->setUniformValue("near",(GLfloat)viewer->camera()->zNear()); - d->program->setUniformValue("far",(GLfloat)viewer->camera()->zFar()); - d->program->setUniformValue("width", 6.0f); + ec->setViewport(vp); + ec->setWidth(6.0f); } - d->program->setUniformValue("f_matrix", f_matrix); - d->program->setAttributeValue("colors", QColor(Qt::black)); - viewer->glDrawArrays(GL_LINES, 0, static_cast(d->vertex_edges.size()/3)); - vaos[Scene_edit_box_item_priv::Edges]->release(); - d->program->release(); + ec->getVao(viewer)->bind(); + ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + ec->getVao(viewer)->release(); + ec->setFrameMatrix(f_matrix); + ec->setColor(QColor(Qt::black)); + ec->draw(viewer, true); + if(renderingMode() == Wireframe) { drawSpheres(viewer, f_matrix); @@ -549,161 +404,11 @@ void Scene_edit_box_item::compute_bbox() const max[i] += d->frame->translation()[i]-d->center_[i]-offset[i]; } - _bbox = Scene_item::Bbox(min.x(),min.y(),min.z(),max.x(),max.y(),max.z()); + setBbox(Scene_item::Bbox(min.x(),min.y(),min.z(),max.x(),max.y(),max.z())); } -void -Scene_edit_box_item_priv::initializeBuffers(Viewer_interface *viewer)const -{ - //vao containing the data for the lines - { - if(viewer->isOpenGL_4_3()) - program = item->getShaderProgram(Scene_edit_box_item::PROGRAM_SOLID_WIREFRAME, viewer); - else - program = item->getShaderProgram(Scene_edit_box_item::PROGRAM_WITHOUT_LIGHT, viewer); - program->bind(); - - item->vaos[Edges]->bind(); - item->buffers[VertexEdges].bind(); - item->buffers[VertexEdges].allocate(vertex_edges.data(), - static_cast(vertex_edges.size()*sizeof(float))); - program->enableAttributeArray("vertex"); - program->setAttributeBuffer("vertex",GL_FLOAT,0,3); - item->buffers[VertexEdges].release(); - item->vaos[Edges]->release(); - - item->vaos[P_Edges]->bind(); - item->buffers[VertexEdges].bind(); - program->enableAttributeArray("vertex"); - program->setAttributeBuffer("vertex",GL_FLOAT,0,3); - item->buffers[VertexEdges].release(); - item->buffers[ColorsEdges].bind(); - item->buffers[ColorsEdges].allocate(color_edges.data(), - static_cast(color_edges.size()*sizeof(float))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors",GL_FLOAT,0,3); - item->buffers[ColorsEdges].release(); - item->vaos[P_Edges]->release(); - program->release(); - - } - - //vao containing the data for the spheres - { - program = item->getShaderProgram(Scene_edit_box_item::PROGRAM_SPHERES, viewer); - item->attribBuffers(viewer, Scene_edit_box_item::PROGRAM_SPHERES); - - program->bind(); - item->vaos[Spheres]->bind(); - item->buffers[VertexSpheres].bind(); - item->buffers[VertexSpheres].allocate(vertex_spheres.data(), - static_cast(vertex_spheres.size()*sizeof(float))); - program->enableAttributeArray("vertex"); - program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - item->buffers[VertexSpheres].release(); - - item->buffers[NormalSpheres].bind(); - item->buffers[NormalSpheres].allocate(normal_spheres.data(), - static_cast(normal_spheres.size()*sizeof(float))); - program->enableAttributeArray("normals"); - program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - item->buffers[NormalSpheres].release(); - - item->buffers[CenterSpheres].bind(); - item->buffers[CenterSpheres].allocate(center_spheres.data(), - static_cast(center_spheres.size()*sizeof(float))); - program->enableAttributeArray("center"); - program->setAttributeBuffer("center", GL_FLOAT, 0, 3); - item->buffers[CenterSpheres].release(); - program->disableAttributeArray("radius"); - program->disableAttributeArray("colors"); - - viewer->glVertexAttribDivisor(program->attributeLocation("center"), 1); - viewer->glVertexAttribDivisor(program->attributeLocation("radius"), 1); - item->vaos[Spheres]->release(); - program->release(); - - pick_sphere_program.bind(); - pick_sphere_program.bind(); - item->vaos[P_Spheres]->bind(); - item->buffers[VertexSpheres].bind(); - pick_sphere_program.enableAttributeArray("vertex"); - pick_sphere_program.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - item->buffers[VertexSpheres].release(); - - item->buffers[NormalSpheres].bind(); - pick_sphere_program.disableAttributeArray("normals"); - pick_sphere_program.setAttributeValue("normals",QVector3D(0,0,0)); - item->buffers[NormalSpheres].release(); - - item->buffers[CenterSpheres].bind(); - pick_sphere_program.enableAttributeArray("center"); - pick_sphere_program.setAttributeBuffer("center", GL_FLOAT, 0, 3); - item->buffers[CenterSpheres].release(); - - pick_sphere_program.disableAttributeArray("radius"); - viewer->glVertexAttribDivisor(program->attributeLocation("radius"), 1); - - item->buffers[ColorsSpheres].bind(); - item->buffers[ColorsSpheres].allocate(color_spheres.data(), - static_cast(color_spheres.size()*sizeof(float))); - pick_sphere_program.enableAttributeArray("colors"); - pick_sphere_program.setAttributeBuffer("colors", GL_FLOAT, 0, 3); - item->buffers[ColorsSpheres].release(); - - viewer->glVertexAttribDivisor(program->attributeLocation("center"), 1); - viewer->glVertexAttribDivisor(program->attributeLocation("colors"), 1); - item->vaos[P_Spheres]->release(); - pick_sphere_program.release(); - } - - //vao containing the data for the faces - { - program = item->getShaderProgram(Scene_edit_box_item::PROGRAM_WITH_LIGHT, viewer); - item->attribBuffers(viewer, Scene_edit_box_item::PROGRAM_WITH_LIGHT); - - program->bind(); - item->vaos[Faces]->bind(); - item->buffers[VertexFaces].bind(); - item->buffers[VertexFaces].allocate(vertex_faces.data(), - static_cast(vertex_faces.size()*sizeof(float))); - program->enableAttributeArray("vertex"); - program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - item->buffers[VertexFaces].release(); - - item->buffers[NormalFaces].bind(); - item->buffers[NormalFaces].allocate(normal_faces.data(), - static_cast(normal_faces.size()*sizeof(float))); - program->enableAttributeArray("normals"); - program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - item->buffers[NormalFaces].release(); - item->vaos[Faces]->release(); - program->release(); - - - program = item->getShaderProgram(Scene_edit_box_item::PROGRAM_WITHOUT_LIGHT, viewer); - item->attribBuffers(viewer, Scene_edit_box_item::PROGRAM_WITHOUT_LIGHT); - program->bind(); - item->vaos[P_Faces]->bind(); - item->buffers[VertexFaces].bind(); - program->enableAttributeArray("vertex"); - program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - item->buffers[VertexFaces].release(); - - item->buffers[ColorsFaces].bind(); - item->buffers[ColorsFaces].allocate(color_faces.data(), - static_cast(color_faces.size()*sizeof(float))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors", GL_FLOAT, 0, 3); - item->buffers[ColorsFaces].release(); - - item->vaos[P_Faces]->release(); - program->release(); - } - item->are_buffers_filled = true; -} void push_xyz(std::vector &v, const Scene_edit_box_item::Kernel::Point_3& p, @@ -897,35 +602,26 @@ void Scene_edit_box_item::highlight(Viewer_interface *viewer) d->hl_vertex.push_back(d->vertices[d->last_picked_id].position().y()-d->center_.y); d->hl_vertex.push_back(d->vertices[d->last_picked_id].position().z()-d->center_.z); //fill buffers - d->program = getShaderProgram(Scene_edit_box_item::PROGRAM_SPHERES, viewer); - d->program->bind(); - - vaos[Scene_edit_box_item_priv::S_Spheres]->bind(); - buffers[Scene_edit_box_item_priv::VertexSpheres].bind(); - buffers[Scene_edit_box_item_priv::VertexSpheres].allocate(d->vertex_spheres.data(), - static_cast(d->vertex_spheres.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::VertexSpheres].release(); - - buffers[Scene_edit_box_item_priv::NormalSpheres].bind(); - buffers[Scene_edit_box_item_priv::NormalSpheres].allocate(d->normal_spheres.data(), - static_cast(d->normal_spheres.size()*sizeof(float))); - d->program->enableAttributeArray("normals"); - d->program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::NormalSpheres].release(); - - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("center"); - d->program->setAttributeBuffer("center", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Vertex].release(); - d->program->disableAttributeArray("colors"); - - viewer->glVertexAttribDivisor(d->program->attributeLocation("center"), 1); - d->program->release(); - vaos[Scene_edit_box_item_priv::S_Spheres]->release(); + Tc* tc = getTriangleContainer(Priv::S_Spheres); + tc->reset_vbos(ALL); + tc->allocate( + Tc::Flat_vertices, + d->vertex_spheres.data(), + static_cast(d->vertex_spheres.size()*sizeof(float))); + + tc->allocate( + Tc::Flat_normals, + d->normal_spheres.data(), + static_cast(d->normal_spheres.size()*sizeof(float))); + + tc->allocate( + Tc::Facet_centers, + d->hl_vertex.data(), + static_cast(d->hl_vertex.size()*sizeof(float))); + + tc->initializeBuffers(viewer); + tc->setFlatDataSize(d->vertex_spheres.size()); + tc->setCenterSize(d->hl_vertex.size()); //draw d->hl_type = Scene_edit_box_item_priv::VERTEX; break; @@ -942,20 +638,14 @@ void Scene_edit_box_item::highlight(Viewer_interface *viewer) d->hl_vertex.push_back(d->edges[d->last_picked_id].target->position().z()-d->center_.z); //fill buffers - d->program = viewer->isOpenGL_4_3() - ? getShaderProgram(Scene_edit_box_item::PROGRAM_SOLID_WIREFRAME, viewer) - : getShaderProgram(Scene_edit_box_item::PROGRAM_WITHOUT_LIGHT, viewer); - d->program->bind(); - - vaos[Scene_edit_box_item_priv::S_Edges]->bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex",GL_FLOAT,0,3); - buffers[Scene_edit_box_item_priv::S_Vertex].release(); - vaos[Scene_edit_box_item_priv::S_Edges]->release(); - d->program->release(); + Ec* ec = getEdgeContainer(Priv::S_Edges); + ec->reset_vbos(ALL); + ec->allocate( + Ec::Vertices, + d->hl_vertex.data(), + static_cast(d->hl_vertex.size()*sizeof(float))); + ec->initializeBuffers(viewer); + ec->setFlatDataSize(d->hl_vertex.size()); //draw d->hl_type = Scene_edit_box_item_priv::EDGE; break; @@ -976,27 +666,19 @@ void Scene_edit_box_item::highlight(Viewer_interface *viewer) push_normal(d->hl_normal, d->last_picked_id); } //fill buffers - d->program = getShaderProgram(Scene_edit_box_item::PROGRAM_WITH_LIGHT, viewer); - attribBuffers(viewer, Scene_edit_box_item::PROGRAM_WITH_LIGHT); - - d->program->bind(); - vaos[Scene_edit_box_item_priv::S_Faces]->bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Normal].release(); - - buffers[Scene_edit_box_item_priv::S_Normal].bind(); - buffers[Scene_edit_box_item_priv::S_Normal].allocate(d->hl_normal.data(), - static_cast(d->hl_normal.size()*sizeof(float))); - d->program->enableAttributeArray("normals"); - d->program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Normal].release(); - vaos[Scene_edit_box_item_priv::S_Faces]->release(); - d->program->release(); - + Tc* tc = getTriangleContainer(Priv::S_Faces); + tc->reset_vbos(ALL); + tc->allocate( + Tc::Flat_vertices, + d->hl_vertex.data(), + static_cast(d->hl_vertex.size()*sizeof(float))); + + tc->allocate( + Tc::Flat_normals, + d->hl_normal.data(), + static_cast(d->hl_normal.size()*sizeof(float))); + tc->initializeBuffers(viewer); + tc->setFlatDataSize(d->hl_vertex.size()); //draw d->hl_type = Scene_edit_box_item_priv::FACE; break; @@ -1006,7 +688,9 @@ void Scene_edit_box_item::highlight(Viewer_interface *viewer) break; } } - itemChanged(); + else + clearHL(); + redraw(); d->ready_to_hl = false; } @@ -1018,70 +702,32 @@ void Scene_edit_box_item::clearHL() d->hl_normal.clear(); d->hl_vertex.clear(); - d->program = getShaderProgram(Scene_edit_box_item::PROGRAM_SPHERES, viewer); - d->program->bind(); - - vaos[Scene_edit_box_item_priv::S_Spheres]->bind(); - buffers[Scene_edit_box_item_priv::VertexSpheres].bind(); - buffers[Scene_edit_box_item_priv::VertexSpheres].allocate(d->vertex_spheres.data(), - static_cast(d->vertex_spheres.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::VertexSpheres].release(); - - buffers[Scene_edit_box_item_priv::NormalSpheres].bind(); - buffers[Scene_edit_box_item_priv::NormalSpheres].allocate(d->normal_spheres.data(), - static_cast(d->normal_spheres.size()*sizeof(float))); - d->program->enableAttributeArray("normals"); - d->program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::NormalSpheres].release(); - - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("center"); - d->program->setAttributeBuffer("center", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Vertex].release(); - d->program->disableAttributeArray("colors"); - - viewer->glVertexAttribDivisor(d->program->attributeLocation("center"), 1); - d->program->release(); - vaos[Scene_edit_box_item_priv::S_Spheres]->release(); + Tc* tc = getTriangleContainer(Priv::S_Spheres); + tc->reset_vbos(ALL); + tc->allocate(Tc::Flat_vertices, d->vertex_spheres.data(), + static_cast(d->vertex_spheres.size()*sizeof(float))); + tc->allocate(Tc::Flat_normals, + d->normal_spheres.data(), + static_cast(d->normal_spheres.size()*sizeof(float))); + + tc->allocate(Tc::Facet_centers, nullptr, 0); + + tc->initializeBuffers(viewer); + tc->setFlatDataSize(0); + tc->setCenterSize(0); //draw - d->hl_type = Scene_edit_box_item_priv::VERTEX; - d->program = getShaderProgram(Scene_edit_box_item::PROGRAM_WITHOUT_LIGHT, viewer); - d->program->bind(); - - vaos[Scene_edit_box_item_priv::S_Edges]->bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex",GL_FLOAT,0,3); - buffers[Scene_edit_box_item_priv::S_Vertex].release(); - vaos[Scene_edit_box_item_priv::S_Edges]->release(); - d->program->release(); - - d->program = getShaderProgram(Scene_edit_box_item::PROGRAM_WITH_LIGHT, viewer); - attribBuffers(viewer, Scene_edit_box_item::PROGRAM_WITH_LIGHT); - - d->program->bind(); - vaos[Scene_edit_box_item_priv::S_Faces]->bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].bind(); - buffers[Scene_edit_box_item_priv::S_Vertex].allocate(d->hl_vertex.data(), - static_cast(d->hl_vertex.size()*sizeof(float))); - d->program->enableAttributeArray("vertex"); - d->program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Normal].release(); - - buffers[Scene_edit_box_item_priv::S_Normal].bind(); - buffers[Scene_edit_box_item_priv::S_Normal].allocate(d->hl_normal.data(), - static_cast(d->hl_normal.size()*sizeof(float))); - d->program->enableAttributeArray("normals"); - d->program->setAttributeBuffer("normals", GL_FLOAT, 0, 3); - buffers[Scene_edit_box_item_priv::S_Normal].release(); - vaos[Scene_edit_box_item_priv::S_Faces]->release(); - d->program->release(); + Ec* ec = getEdgeContainer(Priv::S_Edges); + ec->reset_vbos(ALL); + ec->allocate(Ec::Vertices, nullptr, 0); + ec->initializeBuffers(viewer); + ec->setFlatDataSize(0); + + tc = getTriangleContainer(Priv::S_Faces); + tc->reset_vbos(ALL); + tc->allocate(Tc::Flat_vertices, nullptr, 0); + tc->allocate(Tc::Flat_normals, nullptr, 0); + tc->initializeBuffers(viewer); + tc->setFlatDataSize(0); d->hl_type = Scene_edit_box_item_priv::NO_TYPE; itemChanged(); @@ -1102,7 +748,7 @@ bool Scene_edit_box_item::eventFilter(QObject *obj, QEvent *event) { if(!visible()) return false; - CGAL::Three::Viewer_interface* viewer = qobject_cast(obj); + Viewer_interface* viewer = Three::mainViewer(); if(!viewer) return false; if(event->type() == QEvent::MouseButtonPress) @@ -1110,11 +756,10 @@ bool Scene_edit_box_item::eventFilter(QObject *obj, QEvent *event) QMouseEvent* e = static_cast(event); if(e->modifiers() == Qt::NoModifier) { - Viewer_interface* v_i = dynamic_cast(viewer); //pick int type, picked; d->picked_pixel = e->pos(); - d->picking(type, picked, v_i); + d->picking(type, picked, viewer); if(type !=-1) { bool found = false; @@ -1182,7 +827,8 @@ bool Scene_edit_box_item::eventFilter(QObject *obj, QEvent *event) if(d->selection_on) { d->remodel_frame->setOrientation(d->frame->orientation()); - CGAL::qglviewer::Vec td(d->remodel_frame->transformOf(d->remodel_frame->position() - d->rf_last_pos)); + CGAL::qglviewer::Vec td(d->remodel_frame->transformOf(d->remodel_frame->position() + - d->rf_last_pos)); QVector3D dir(td.x, td.y, td.z); d->remodel_box(dir); } @@ -1234,64 +880,47 @@ void Scene_edit_box_item_priv::draw_picking(Viewer_interface* viewer) f_matrix.data()[i] = (float)frame->matrix()[i]; } GLdouble d_mat[16]; - QMatrix4x4 mvp_mat; - viewer->camera()->getModelViewProjectionMatrix(d_mat); - for (int i=0; i<16; ++i) - mvp_mat.data()[i] = GLfloat(d_mat[i]); - mvp_mat = mvp_mat*f_matrix; QMatrix4x4 mv_mat; viewer->camera()->getModelViewMatrix(d_mat); for (int i=0; i<16; ++i) mv_mat.data()[i] = GLfloat(d_mat[i]); mv_mat = mv_mat*f_matrix; - QVector4D light_pos(0.0f,0.0f,1.0f, 1.0f ); - light_pos = light_pos*f_matrix; + if(item->renderingMode() == FlatPlusEdges) { - item->vaos[P_Faces]->bind(); - program = item->getShaderProgram(Scene_item::PROGRAM_WITHOUT_LIGHT, viewer); - item->attribBuffers(viewer, Scene_item::PROGRAM_WITHOUT_LIGHT); - program->bind(); - program->setUniformValue("mvp_matrix", mvp_mat); - program->setUniformValue("is_clipbox_on", false); - viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast(vertex_faces.size()/3)); - item->vaos[P_Faces]->release(); - program->release(); + Tc* tc = item->getTriangleContainer(P_Faces); + tc->setFrameMatrix(f_matrix); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->release(); + tc->draw(viewer, false); } - item->vaos[P_Spheres]->bind(); - pick_sphere_program.bind(); - pick_sphere_program.setUniformValue("mvp_matrix", mvp_mat); - pick_sphere_program.setUniformValue("is_clipbox_on", GLboolean(false)); - viewer->glDrawArraysInstanced(GL_TRIANGLES, 0, - static_cast(vertex_spheres.size()/3), - static_cast(8)); - pick_sphere_program.release(); - item->vaos[P_Spheres]->release(); + double radius =std::sqrt( + (item->point(6,0) - item->point(0,0)) * (item->point(6,0) - item->point(0,0)) + + (item->point(6,1) - item->point(0,1)) * (item->point(6,1) - item->point(0,1)) + + (item->point(6,2) - item->point(0,2)) * (item->point(6,2) - item->point(0,2))) *0.02 ; + Tc* tc = item->getTriangleContainer(P_Spheres); + tc->setFrameMatrix(f_matrix); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->program->setAttributeValue("radius", (float)radius); + tc->getVao(viewer)->release(); + tc->draw(viewer, false); - item->vaos[P_Edges]->bind(); - if(!viewer->isOpenGL_4_3()) + Ec* ec = item->getEdgeContainer(P_Edges); + if(viewer->isOpenGL_4_3()) { - item->attribBuffers(viewer, Scene_item::PROGRAM_WITHOUT_LIGHT); - program = item->getShaderProgram(Scene_item::PROGRAM_WITHOUT_LIGHT); - program->bind(); - program->setUniformValue("is_clipbox_on", false); - } - else - { - item->attribBuffers(viewer, Scene_item::PROGRAM_SOLID_WIREFRAME); - program = item->getShaderProgram(Scene_item::PROGRAM_SOLID_WIREFRAME); - program->bind(); + QVector2D vp(viewer->width(), viewer->height()); - program->setUniformValue("viewport", vp); - program->setUniformValue("near",(GLfloat)viewer->camera()->zNear()); - program->setUniformValue("far",(GLfloat)viewer->camera()->zFar()); - program->setUniformValue("width", 6.0f); + ec->setViewport(vp); + ec->setWidth(6.0f); } - program->setUniformValue("f_matrix", f_matrix); - viewer->glDrawArrays(GL_LINES, 0, static_cast(vertex_edges.size()/3)); - item->vaos[P_Edges]->release(); - program->release(); + ec->setFrameMatrix(f_matrix); + ec->getVao(viewer)->bind(); + ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + ec->getVao(viewer)->release(); + ec->draw(viewer, false); } void Scene_edit_box_item_priv::remodel_box(const QVector3D &dir) @@ -1455,73 +1084,46 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const f_matrix.data()[i] = (float)d->frame->matrix()[i]; } GLdouble d_mat[16]; - QMatrix4x4 mvp_mat; - viewer->camera()->getModelViewProjectionMatrix(d_mat); - for (int i=0; i<16; ++i) - mvp_mat.data()[i] = GLfloat(d_mat[i]); - mvp_mat = mvp_mat*f_matrix; QMatrix4x4 mv_mat; viewer->camera()->getModelViewMatrix(d_mat); for (int i=0; i<16; ++i) mv_mat.data()[i] = GLfloat(d_mat[i]); mv_mat = mv_mat*f_matrix; - QVector4D light_pos(0.0f,0.0f,1.0f, 1.0f ); - light_pos = light_pos*f_matrix; - QVector4D ambient(0.4f, 0.4f, 0.4f, 0.4f); - // Diffuse - QVector4D diffuse(1.0f, 1.0f, 1.0f, 1.0f); - // Specular - QVector4D specular(0.0f, 0.0f, 0.0f, 1.0f); if(d->hl_type == Scene_edit_box_item_priv::VERTEX) { - vaos[Scene_edit_box_item_priv::S_Spheres]->bind(); - attribBuffers(viewer, PROGRAM_SPHERES); - d->program = getShaderProgram(PROGRAM_SPHERES, viewer); - d->program->bind(); - d->program->setUniformValue("mvp_matrix", mvp_mat); - d->program->setUniformValue("mv_matrix", mv_mat); - d->program->setUniformValue("light_pos", light_pos); - d->program->setAttributeValue("colors", QColor(Qt::yellow)); + Tc* tc = getTriangleContainer(Priv::S_Spheres); + + tc->setFrameMatrix(f_matrix); + tc->setMvMatrix(mv_mat); + tc->setColor(QColor(Qt::yellow)); + double radius =std::sqrt( (point(6,0) - point(0,0)) * (point(6,0) - point(0,0)) + (point(6,1) - point(0,1)) * (point(6,1) - point(0,1)) + (point(6,2) - point(0,2)) * (point(6,2) - point(0,2))) *0.02 ; - d->program->setAttributeValue("radius", radius); - d->program->setUniformValue("is_clipbox_on", false); - viewer->glDrawArraysInstanced(GL_TRIANGLES, 0, - static_cast(d->vertex_spheres.size()/3), - static_cast(d->hl_vertex.size()/3)); - - d->program->release(); - vaos[Scene_edit_box_item_priv::S_Spheres]->release(); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("radius", (float)radius); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->release(); + tc->draw(viewer, true); } else if(d->hl_type == Scene_edit_box_item_priv::EDGE) { - vaos[Scene_edit_box_item_priv::S_Edges]->bind(); - if(!viewer->isOpenGL_4_3()) + Ec* ec = getEdgeContainer(Priv::S_Edges); + if(viewer->isOpenGL_4_3()) { - d->program = getShaderProgram(PROGRAM_WITHOUT_LIGHT); - attribBuffers(viewer, PROGRAM_WITHOUT_LIGHT); - d->program->bind(); - d->program->setUniformValue("is_clipbox_on", false); - } - else - { - attribBuffers(viewer, PROGRAM_SOLID_WIREFRAME); - d->program = getShaderProgram(PROGRAM_SOLID_WIREFRAME); - d->program->bind(); QVector2D vp(viewer->width(), viewer->height()); - d->program->setUniformValue("viewport", vp); - d->program->setUniformValue("near",(GLfloat)viewer->camera()->zNear()); - d->program->setUniformValue("far",(GLfloat)viewer->camera()->zFar()); - d->program->setUniformValue("width", 6.0f); + ec->setViewport(vp); + ec->setWidth(6.0f); } - d->program->setUniformValue("f_matrix", f_matrix); - d->program->setAttributeValue("colors", QColor(Qt::yellow)); - viewer->glDrawArrays(GL_LINES, 0, static_cast(d->hl_vertex.size()/3)); - vaos[Scene_edit_box_item_priv::S_Edges]->release(); - d->program->release(); + ec->getVao(viewer)->bind(); + ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + ec->getVao(viewer)->release(); + ec->setFrameMatrix(f_matrix); + ec->setColor(QColor(Qt::yellow)); + ec->draw(viewer, true); + } else if(d->hl_type == Scene_edit_box_item_priv::FACE) { @@ -1529,32 +1131,36 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const viewer->glGetFloatv(GL_POLYGON_OFFSET_UNITS, &offset_units); viewer->glEnable(GL_BLEND); viewer->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - vaos[Scene_edit_box_item_priv::S_Faces]->bind(); - d->program = &d->transparent_face_program; - d->program->bind(); - d->program->setUniformValue("mvp_matrix", mvp_mat); - d->program->setUniformValue("mv_matrix", mv_mat); - d->program->setUniformValue("light_pos", light_pos); - d->program->setUniformValue("light_diff",diffuse); - d->program->setUniformValue("light_spec", specular); - d->program->setUniformValue("light_amb", ambient); - d->program->setUniformValue("spec_power", 51.8f); - d->program->setUniformValue("is_clipbox_on", false); - d->program->setAttributeValue("colors", QColor(128,128,0,128)); - viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast(d->hl_vertex.size()/3)); - vaos[Scene_edit_box_item_priv::S_Faces]->release(); - d->program->release(); + Tc* tc = getTriangleContainer(Priv::S_Faces); + tc->setMvMatrix(mv_mat); + tc->setFrameMatrix(f_matrix); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->release(); + + tc->setColor(QColor(Qt::yellow)); + tc->setAlpha(0.5); + tc->draw(viewer, true); viewer->glPolygonOffset(offset_factor, offset_units); viewer->glDisable(GL_BLEND); - } } void Scene_edit_box_item::drawTransparent(CGAL::Three::Viewer_interface*viewer)const { - if (!are_buffers_filled) + if(renderingMode() != FlatPlusEdges) + return; + if(!isInit()) + initGL(); + if ( getBuffersFilled() && + ! getBuffersInit(viewer)) { - d->computeElements(); - d->initializeBuffers(viewer); + initializeBuffers(viewer); + setBuffersInit(viewer, true); + } + if(!getBuffersFilled()) + { + computeElements(); + initializeBuffers(viewer); } QMatrix4x4 f_matrix; for (int i=0; i<16; ++i){ @@ -1562,40 +1168,141 @@ void Scene_edit_box_item::drawTransparent(CGAL::Three::Viewer_interface*viewer)c } GLdouble d_mat[16]; - QMatrix4x4 mvp_mat; - viewer->camera()->getModelViewProjectionMatrix(d_mat); - for (int i=0; i<16; ++i) - mvp_mat.data()[i] = GLfloat(d_mat[i]); - mvp_mat = mvp_mat*f_matrix; QMatrix4x4 mv_mat; viewer->camera()->getModelViewMatrix(d_mat); for (int i=0; i<16; ++i) mv_mat.data()[i] = GLfloat(d_mat[i]); mv_mat = mv_mat*f_matrix; - QVector4D light_pos(0.0f,0.0f,1.0f, 1.0f ); - light_pos = light_pos*f_matrix; - QVector4D ambient(0.4f, 0.4f, 0.4f, 0.4f); - // Diffuse - QVector4D diffuse(1.0f, 1.0f, 1.0f, 1.0f); - // Specular - QVector4D specular(0.0f, 0.0f, 0.0f, 1.0f); - + viewer->glEnable(GL_BLEND); viewer->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - vaos[Scene_edit_box_item_priv::Faces]->bind(); - d->program = &d->transparent_face_program; - d->program->bind(); - d->program->setUniformValue("mvp_matrix", mvp_mat); - d->program->setUniformValue("mv_matrix", mv_mat); - d->program->setUniformValue("light_pos", light_pos); - d->program->setUniformValue("light_diff",diffuse); - d->program->setUniformValue("light_spec", specular); - d->program->setUniformValue("light_amb", ambient); - d->program->setUniformValue("spec_power", 51.8f); - d->program->setUniformValue("is_clipbox_on", false); - d->program->setAttributeValue("colors", QColor(128,128,128,128)); - viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast(d->vertex_faces.size()/3)); - vaos[Scene_edit_box_item_priv::Faces]->release(); - d->program->release(); + Tc* tc = getTriangleContainer(Priv::Faces); + tc->setMvMatrix(mv_mat); + tc->setFrameMatrix(f_matrix); + tc->getVao(viewer)->bind(); + tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false); + tc->getVao(viewer)->release(); + tc->setColor(QColor(128,128,128,128)); + tc->setAlpha(0.5); + tc->draw(viewer, true); viewer->glDisable(GL_BLEND); } + +void Scene_edit_box_item::invalidateOpenGLBuffers() +{ + compute_bbox(); + setBuffersFilled(false); + getTriangleContainer(Priv::Faces)->reset_vbos(ALL); + getTriangleContainer(Priv::P_Faces)->reset_vbos(ALL); + getTriangleContainer(Priv::Spheres)->reset_vbos(ALL); + getTriangleContainer(Priv::P_Spheres)->reset_vbos(ALL); + getEdgeContainer(Priv::Edges)->reset_vbos(ALL); + getEdgeContainer(Priv::P_Edges)->reset_vbos(ALL); +} + +void Scene_edit_box_item::computeElements() const +{ + d->computeElements(); + getEdgeContainer(Priv::Edges)->allocate( + Ec::Vertices, + d->vertex_edges.data(), + static_cast(d->vertex_edges.size()*sizeof(float))); + Ec* ec = getEdgeContainer(Priv::P_Edges); + ec->allocate( + Ec::Vertices, + d->vertex_edges.data(), + static_cast(d->vertex_edges.size()*sizeof(float))); + + ec->allocate( + Ec::Colors, + d->color_edges.data(), + static_cast(d->color_edges.size()*sizeof(float))); + + + Tc* tc = getTriangleContainer(Priv::Spheres); + tc->allocate( + Tc::Flat_vertices, + d->vertex_spheres.data(), + static_cast(d->vertex_spheres.size()*sizeof(float))); + + tc->allocate( + Tc::Flat_normals, + d->normal_spheres.data(), + static_cast(d->normal_spheres.size()*sizeof(float))); + tc->allocate( + Tc::Facet_centers, + d->center_spheres.data(), + static_cast(d->center_spheres.size()*sizeof(float))); + + tc = getTriangleContainer(Priv::P_Spheres); + tc->allocate( + Tc::Flat_vertices, + d->vertex_spheres.data(), + static_cast(d->vertex_spheres.size()*sizeof(float))); + + tc->allocate( + Tc::Facet_centers, + d->center_spheres.data(), + static_cast(d->center_spheres.size()*sizeof(float))); + + tc->allocate( + Tc::FColors, + d->color_spheres.data(), + static_cast(d->color_spheres.size()*sizeof(float))); + + tc = getTriangleContainer(Priv::Faces); + tc->allocate( + Tc::Flat_vertices, + d->vertex_faces.data(), + static_cast(d->vertex_faces.size()*sizeof(float))); + + tc->allocate( + Tc::Flat_normals, + d->normal_faces.data(), + static_cast(d->normal_faces.size()*sizeof(float))); + tc = getTriangleContainer(Priv::P_Faces); + tc->allocate( + Tc::Flat_vertices, + d->vertex_faces.data(), + static_cast(d->vertex_faces.size()*sizeof(float))); + tc->allocate( + Tc::FColors, + d->color_faces.data(), + static_cast(d->color_faces.size()*sizeof(float))); + setBuffersFilled(true); +} + +void Scene_edit_box_item::initializeBuffers(Viewer_interface *v) const +{ + + getTriangleContainer(Priv::Faces)->initializeBuffers(v); + getTriangleContainer(Priv::P_Faces)->initializeBuffers(v); + + getTriangleContainer(Priv::Spheres)->initializeBuffers(v); + getTriangleContainer(Priv::Spheres)->initializeBuffers(v); + getTriangleContainer(Priv::P_Spheres)->initializeBuffers(v); + getTriangleContainer(Priv::P_Spheres)->initializeBuffers(v); + + getEdgeContainer(Priv::Edges)->initializeBuffers(v); + getEdgeContainer(Priv::P_Edges)->initializeBuffers(v); + + + getTriangleContainer(Priv::Faces)->setFlatDataSize(d->vertex_faces.size()); + getTriangleContainer(Priv::P_Faces)->setFlatDataSize(d->vertex_faces.size()); + + getTriangleContainer(Priv::Spheres)->setFlatDataSize(d->vertex_spheres.size()); + getTriangleContainer(Priv::Spheres)->setCenterSize(d->center_spheres.size()); + getTriangleContainer(Priv::P_Spheres)->setFlatDataSize(d->vertex_spheres.size()); + getTriangleContainer(Priv::P_Spheres)->setCenterSize(d->center_spheres.size()); + + getEdgeContainer(Priv::Edges)->setFlatDataSize(d->vertex_edges.size()); + getEdgeContainer(Priv::P_Edges)->setFlatDataSize(d->vertex_edges.size()); +} + +void Scene_edit_box_item::connectNewViewer(QObject *o) +{ + Vi* viewer = qobject_cast(o); + if(!viewer) + return; + viewer->setMouseTracking(true); +} diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h index f0764743ab0..90569debc15 100755 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h @@ -1,14 +1,14 @@ #ifndef SCENE_EDIT_BOX_ITEM_H #define SCENE_EDIT_BOX_ITEM_H -#include +#include #include #include #include "create_sphere.h" #include "Scene_edit_box_item_config.h" struct Scene_edit_box_item_priv; class SCENE_EDIT_BOX_ITEM_EXPORT Scene_edit_box_item: - public CGAL::Three::Scene_item, + public CGAL::Three::Scene_item_rendering_helper, public CGAL::Three::Scene_transparent_interface { Q_OBJECT @@ -42,11 +42,8 @@ class SCENE_EDIT_BOX_ITEM_EXPORT Scene_edit_box_item: void drawHl(CGAL::Three::Viewer_interface *) const; void drawEdges(CGAL::Three::Viewer_interface* viewer) const; void drawSpheres(CGAL::Three::Viewer_interface* viewer, const QMatrix4x4 f_matrix) const; - void invalidateOpenGLBuffers() - { - compute_bbox(); - are_buffers_filled = false; - } + void invalidateOpenGLBuffers(); + // 5-----6 // . | . | // 4------7 | @@ -56,11 +53,12 @@ class SCENE_EDIT_BOX_ITEM_EXPORT Scene_edit_box_item: // 0------3 double point(short i, short j) const; - void removeViewer(CGAL::Three::Viewer_interface *viewer){} - void newViewer(CGAL::Three::Viewer_interface *viewer){} + void initializeBuffers(CGAL::Three::Viewer_interface *) const; + void computeElements() const; public Q_SLOTS: void highlight(CGAL::Three::Viewer_interface* viewer); void clearHL(); + void connectNewViewer(QObject* o); protected: friend struct Scene_edit_box_item_priv; Scene_edit_box_item_priv* d; diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc b/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc index 494c9d9f04a..798d2adc138 100755 --- a/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc +++ b/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc @@ -96,6 +96,8 @@ resources/compatibility_shaders/shader_with_textured_edges.v resources/compatibility_shaders/shader_without_light.f resources/compatibility_shaders/shader_without_light.v + resources/shader_dark_spheres.v + resources/compatibility_shaders/shader_dark_spheres.v resources/rotate_around_cursor.png diff --git a/Polyhedron/demo/Polyhedron/Triangle_container.cpp b/Polyhedron/demo/Polyhedron/Triangle_container.cpp index b4e9570eae1..70068c80e82 100644 --- a/Polyhedron/demo/Polyhedron/Triangle_container.cpp +++ b/Polyhedron/demo/Polyhedron/Triangle_container.cpp @@ -18,6 +18,7 @@ struct Tri_d{ bool is_surface; float alpha; QMatrix4x4 f_matrix; + QMatrix4x4 mv_matrix; }; Triangle_container::Triangle_container(int program, bool indexed) @@ -145,6 +146,8 @@ void Triangle_container::draw(Viewer_interface* viewer, getVbo(Vertex_indices)->bind(); if(getVao(viewer)->program->property("hasFMatrix").toBool()) getVao(viewer)->program->setUniformValue("f_matrix", getFrameMatrix()); + if(d->mv_matrix != QMatrix4x4()) + getVao(viewer)->program->setUniformValue("mv_matrix", getMvMatrix()); if(getVao(viewer)->program->property("hasTransparency").toBool()) { getVao(viewer)->program->setUniformValue("comparing", viewer->currentPass() > 0); @@ -232,10 +235,12 @@ float Triangle_container::getShrinkFactor() { return d->shrink_factor ; } QVector4D Triangle_container::getPlane() { return d->plane; } float Triangle_container::getAlpha() { return d->alpha; } QMatrix4x4 Triangle_container::getFrameMatrix() const { return d->f_matrix; } +QMatrix4x4 Triangle_container::getMvMatrix() const { return d->mv_matrix; } void Triangle_container::setShrinkFactor(const float& f) { d->shrink_factor = f; } void Triangle_container::setAlpha (const float& f) { d->alpha = f ; } void Triangle_container::setFrameMatrix(const QMatrix4x4& m) { d->f_matrix = m; } +void Triangle_container::setMvMatrix(const QMatrix4x4& m) { d->mv_matrix = m; } void Triangle_container::setPlane(const QVector4D& p) { d->plane = p; } void Triangle_container::setIsSurface (const bool b) { d->is_surface = b; } Triangle_container::~Triangle_container() diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index 2fd182f9e48..0a455270639 100755 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -875,8 +875,16 @@ void Viewer::attribBuffers(int program_name) const { case PROGRAM_CUTPLANE_SPHERES: program->setUniformValue("alpha", 1.0f); //overriden in item draw() if necessary } - if(program_name == PROGRAM_SPHERES) + switch(program_name) + { + case PROGRAM_SPHERES: + case PROGRAM_DARK_SPHERES: + case PROGRAM_WITH_LIGHT: program->setUniformValue("f_matrix",f_mat); + default: + break; + } + switch(program_name) { case PROGRAM_WITH_LIGHT: @@ -1115,6 +1123,7 @@ QOpenGLShaderProgram* Viewer::getShaderProgram(int name) const program->setProperty("hasLight", true); program->setProperty("hasNormals", true); program->setProperty("hasTransparency", true); + program->setProperty("hasFMatrix", true); return program; } case PROGRAM_WITHOUT_LIGHT: @@ -1220,6 +1229,18 @@ QOpenGLShaderProgram* Viewer::getShaderProgram(int name) const program->setProperty("hasFMatrix", true); return program; } + case PROGRAM_DARK_SPHERES: + { + QOpenGLShaderProgram* program = isOpenGL_4_3() + ?declare_program(name, ":/cgal/Polyhedron_3/resources/shader_dark_spheres.v" , ":/cgal/Polyhedron_3/resources/shader_no_light_no_selection.f") + : declare_program(name, ":/cgal/Polyhedron_3/resources/compatibility_shaders/shader_dark_spheres.v" , + ":/cgal/Polyhedron_3/resources/compatibility_shaders/shader_no_light_no_selection.f"); + program->setProperty("hasCenter", true); + program->setProperty("hasRadius", true); + program->setProperty("isInstanced", true); + program->setProperty("hasFMatrix", true); + return program; + } case PROGRAM_FLAT: { if(!isOpenGL_4_3()) diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_dark_spheres.v b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_dark_spheres.v new file mode 100644 index 00000000000..616d2c080e2 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_dark_spheres.v @@ -0,0 +1,17 @@ +attribute highp vec4 vertex; +attribute highp vec3 colors; +attribute highp vec3 center; +attribute highp float radius; +uniform highp mat4 mvp_matrix; +uniform highp mat4 f_matrix; +varying highp vec4 color; +varying highp float dist[6]; + +void main(void) +{ + for(int i=0; i<6; ++i) + dist[i] = 1.0; + color = vec4(colors, 1.0); + gl_Position = mvp_matrix * f_matrix * + vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, radius*vertex.z + center.z, 1.0) ; +} diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.v b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.v index a486052d8f1..d0e4d77f61c 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.v +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.v @@ -4,6 +4,7 @@ attribute highp vec3 normals; attribute highp vec4 colors; uniform highp mat4 mvp_matrix; uniform highp mat4 mv_matrix; +uniform highp mat4 f_matrix; varying highp vec4 fP; varying highp vec3 fN; varying highp vec4 color; @@ -44,5 +45,5 @@ void main(void) mv_matrix_3[1] = mv_matrix[1].xyz; mv_matrix_3[2] = mv_matrix[2].xyz; fN = mv_matrix_3* normals; - gl_Position = mvp_matrix * vertex; + gl_Position = mvp_matrix * f_matrix * vertex; } diff --git a/Polyhedron/demo/Polyhedron/resources/shader_dark_spheres.v b/Polyhedron/demo/Polyhedron/resources/shader_dark_spheres.v new file mode 100644 index 00000000000..a3f190a0653 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/shader_dark_spheres.v @@ -0,0 +1,19 @@ +#version 150 +in vec4 vertex; +in vec3 colors; +in vec3 center; +in float radius; +uniform mat4 mvp_matrix; +uniform mat4 f_matrix; +out vec4 color; +out float dist[6]; + +void main(void) +{ + for(int i=0; i<6; ++i) + dist[i] = 1.0; + color = vec4(colors, 1.0); + gl_Position = mvp_matrix * f_matrix * + vec4(radius*vertex.x + center.x, radius* vertex.y + center.y, + radius*vertex.z + center.z, 1.0) ; +} diff --git a/Polyhedron/demo/Polyhedron/resources/shader_with_light.v b/Polyhedron/demo/Polyhedron/resources/shader_with_light.v index 3ea1ce9c925..1b434ec6cbe 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_with_light.v +++ b/Polyhedron/demo/Polyhedron/resources/shader_with_light.v @@ -4,6 +4,7 @@ in vec3 normals; in vec4 colors; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; +uniform mat4 f_matrix; out vec4 fP; out vec3 fN; out vec4 color; @@ -44,5 +45,5 @@ void main(void) mv_matrix_3[1] = mv_matrix[1].xyz; mv_matrix_3[2] = mv_matrix[2].xyz; fN = mv_matrix_3* normals; - gl_Position = mvp_matrix * vertex; + gl_Position = mvp_matrix * f_matrix * vertex; } diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index c7d4187795e..7a7b30e2224 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -71,26 +71,27 @@ public: * @see getShaderProgram * @see attribBuffers */ - enum OpenGL_program_IDs - { - PROGRAM_WITH_LIGHT = 0, /** Used to render a surface or edge affected by the light. It uses a per fragment lighting model, and renders brighter the selected item.*/ - PROGRAM_WITHOUT_LIGHT, /** Used to render a polygon edge or points. It renders in a uniform color and is not affected by light. It renders the selected item in black.*/ - PROGRAM_NO_SELECTION, /** Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection.*/ - PROGRAM_WITH_TEXTURE, /** Used to render a textured polyhedron. Affected by light.*/ - PROGRAM_PLANE_TWO_FACES, /** Used to render a two-faced plane. The two faces have a different color. Not affected by light.*/ - PROGRAM_WITH_TEXTURED_EDGES, /** Used to render the edges of a textured polyhedorn. Not affected by light.*/ - PROGRAM_INSTANCED, /** Used to display instanced rendered spheres.Affected by light.*/ - PROGRAM_INSTANCED_WIRE, /** Used to display instanced rendered wired spheres. Not affected by light.*/ - PROGRAM_C3T3, /** Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light.*/ - PROGRAM_C3T3_EDGES, /** Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light.*/ - PROGRAM_CUTPLANE_SPHERES, /** Used to render the spheres of an item with a cut plane.*/ - PROGRAM_SPHERES, /** Used to render one or several spheres.*/ - PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ - PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ - PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. - PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. - NB_OF_PROGRAMS /** Holds the number of different programs in this enum.*/ - }; + enum OpenGL_program_IDs + { + PROGRAM_WITH_LIGHT = 0, //! Used to render a surface or an edge affected by the light. It uses a per fragment lighting model, and renders the selected item brighter. + PROGRAM_WITHOUT_LIGHT, //! Used to render a polyhedron edge or points. It renders in a uniform color and is not affected by light. \attention It renders the selected item in black. + PROGRAM_NO_SELECTION, //! Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection. + PROGRAM_WITH_TEXTURE, //! Used to render a textured polyhedron. Affected by light. + PROGRAM_PLANE_TWO_FACES, //! Used to render a two-faced plane. The two faces have a different color. Not affected by light. + PROGRAM_WITH_TEXTURED_EDGES, //! Used to render the edges of a textured polyhedron. Not affected by light. + PROGRAM_INSTANCED, //! Used to display instanced rendered spheres.Affected by light. + PROGRAM_INSTANCED_WIRE, //! Used to display instanced rendered wired spheres. Not affected by light. + PROGRAM_C3T3, //! Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light. + PROGRAM_C3T3_EDGES, //! Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. + PROGRAM_CUTPLANE_SPHERES, //! Used to render the spheres of an item with a cut plane. + PROGRAM_SPHERES, //! Used to render one or several spheres. + PROGRAM_DARK_SPHERES, //! Used to render one or several spheres without light (for picking for example). + PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ + PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ + PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. + PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. + NB_OF_PROGRAMS //! Holds the number of different programs in this enum. + }; typedef CGAL::Bbox_3 Bbox; typedef CGAL::qglviewer::ManipulatedFrame ManipulatedFrame; //! \brief The default color of a scene_item. diff --git a/Three/include/CGAL/Three/Triangle_container.h b/Three/include/CGAL/Three/Triangle_container.h index 0d3ae32f109..17191980364 100644 --- a/Three/include/CGAL/Three/Triangle_container.h +++ b/Three/include/CGAL/Three/Triangle_container.h @@ -99,6 +99,8 @@ struct DEMO_FRAMEWORK_EXPORT Triangle_container :public Primitive_container float getAlpha(); //! getter for the "f_matrix" parameter QMatrix4x4 getFrameMatrix()const; + //! getter for the "mv_matrix" parameter + QMatrix4x4 getMvMatrix()const; //! setter for the "shrink_factor" parameter void setShrinkFactor(const float&); //! setter for the "plane" parameter @@ -107,6 +109,8 @@ struct DEMO_FRAMEWORK_EXPORT Triangle_container :public Primitive_container void setAlpha (const float&); //! setter for the "f_matrix" parameter void setFrameMatrix(const QMatrix4x4&); + //! setter for the "mv_matrix" parameter + void setMvMatrix(const QMatrix4x4&); //! setter for the "is_surface" attribute. Used in PROGRAM_C3T3 void setIsSurface (const bool); ///@} diff --git a/Three/include/CGAL/Three/Viewer_interface.h b/Three/include/CGAL/Three/Viewer_interface.h index 52717d7c887..475a596c596 100644 --- a/Three/include/CGAL/Three/Viewer_interface.h +++ b/Three/include/CGAL/Three/Viewer_interface.h @@ -74,6 +74,7 @@ public: PROGRAM_C3T3_EDGES, //! Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. PROGRAM_CUTPLANE_SPHERES, //! Used to render the spheres of an item with a cut plane. PROGRAM_SPHERES, //! Used to render one or several spheres. + PROGRAM_DARK_SPHERES, //! Used to render one or several spheres without light (for picking for example). PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1.