From 55f44c731867cdd43689a01acfba629a66f158dd Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Wed, 4 Nov 2015 11:57:12 +0100 Subject: [PATCH] Optimization of Edit_polyhedron - Suppressed 10 of the 19 vbos. --- .../Polyhedron/Scene_edit_polyhedron_item.cpp | 121 ++++++------------ .../Polyhedron/Scene_edit_polyhedron_item.h | 14 +- 2 files changed, 50 insertions(+), 85 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.cpp b/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.cpp index c711fe72ff6..45f119a70d1 100644 --- a/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.cpp @@ -9,7 +9,7 @@ Scene_edit_polyhedron_item::Scene_edit_polyhedron_item (Scene_polyhedron_item* poly_item, Ui::DeformMesh* ui_widget, QMainWindow* mw) - : Scene_item(19,8), + : Scene_item(NumberOfBuffers,8), ui_widget(ui_widget), poly_item(poly_item), deform_mesh(*(poly_item->polyhedron()), Deform_mesh::Vertex_index_map(), Deform_mesh::Hedge_index_map(), Array_based_vertex_point_map(&positions)), @@ -133,19 +133,19 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program->bind(); vaos[0]->bind(); - buffers[0].bind(); - buffers[0].allocate(positions.data(), + buffers[Facet_vertices].bind(); + buffers[Facet_vertices].allocate(positions.data(), static_cast(positions.size()*sizeof(double))); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[0].release(); + buffers[Facet_vertices].release(); - buffers[1].bind(); - buffers[1].allocate(normals.data(), + buffers[Facet_normals].bind(); + buffers[Facet_normals].allocate(normals.data(), static_cast(normals.size()*sizeof(double))); program->enableAttributeArray("normals"); program->setAttributeBuffer("normals",GL_DOUBLE,0,3); - buffers[1].release(); + buffers[Facet_normals].release(); vaos[0]->release(); program->release(); } @@ -153,19 +153,12 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac { program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program->bind(); vaos[1]->bind(); - buffers[2].bind(); - buffers[2].allocate(ROI_points.data(), + buffers[Roi_points].bind(); + buffers[Roi_points].allocate(ROI_points.data(), static_cast(ROI_points.size()*sizeof(double))); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[2].release(); - - buffers[3].bind(); - buffers[3].allocate(ROI_color.data(), - static_cast(ROI_color.size()*sizeof(double))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[3].release(); + buffers[Roi_points].release(); vaos[1]->release(); program->release(); @@ -176,13 +169,10 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program->bind(); vaos[2]->bind(); - buffers[4].bind(); - buffers[4].allocate(positions.data(), - static_cast(positions.size()*sizeof(double))); + buffers[Facet_vertices].bind(); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[4].release(); - + buffers[Facet_vertices].release(); vaos[2]->release(); program->release(); } @@ -191,33 +181,24 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program = getShaderProgram(PROGRAM_INSTANCED, viewer); program->bind(); vaos[3]->bind(); - buffers[5].bind(); - buffers[5].allocate(pos_sphere.data(), + buffers[Sphere_vertices].bind(); + buffers[Sphere_vertices].allocate(pos_sphere.data(), static_cast(pos_sphere.size()*sizeof(double))); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[5].release(); + buffers[Sphere_vertices].release(); - buffers[6].bind(); - buffers[6].allocate(normals_sphere.data(), + buffers[Sphere_normals].bind(); + buffers[Sphere_normals].allocate(normals_sphere.data(), static_cast(normals_sphere.size()*sizeof(double))); program->enableAttributeArray("normals"); program->setAttributeBuffer("normals",GL_DOUBLE,0,3); - buffers[6].release(); + buffers[Sphere_normals].release(); - buffers[7].bind(); - buffers[7].allocate(ROI_color.data(), - static_cast(ROI_color.size()*sizeof(double))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[7].release(); - - buffers[8].bind(); - buffers[8].allocate(ROI_points.data(), - static_cast(ROI_points.size()*sizeof(double))); + buffers[Roi_points].bind(); program->enableAttributeArray("center"); program->setAttributeBuffer("center",GL_DOUBLE,0,3); - buffers[8].release(); + buffers[Roi_points].release(); if(viewer->extension_is_found) { @@ -235,19 +216,13 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac { bbox_program.bind(); vaos[4]->bind(); - buffers[9].bind(); - buffers[9].allocate(pos_bbox.data(), + buffers[Bbox_vertices].bind(); + buffers[Bbox_vertices].allocate(pos_bbox.data(), static_cast(pos_bbox.size()*sizeof(double))); bbox_program.enableAttributeArray("vertex"); bbox_program.setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[9].release(); + buffers[Bbox_vertices].release(); - buffers[10].bind(); - buffers[10].allocate(color_bbox.data(), - static_cast(color_bbox.size()*sizeof(double))); - bbox_program.enableAttributeArray("colors"); - bbox_program.setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[10].release(); vaos[4]->release(); nb_bbox = pos_bbox.size(); pos_bbox.resize(0); @@ -261,19 +236,13 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program->bind(); vaos[5]->bind(); - buffers[11].bind(); - buffers[11].allocate(control_points.data(), + buffers[Control_points].bind(); + buffers[Control_points].allocate(control_points.data(), static_cast(control_points.size()*sizeof(double))); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[11].release(); + buffers[Control_points].release(); - buffers[12].bind(); - buffers[12].allocate(control_color.data(), - static_cast(control_color.size()*sizeof(double))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[12].release(); vaos[5]->release(); program->release(); } @@ -282,38 +251,23 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program = getShaderProgram(PROGRAM_INSTANCED, viewer); program->bind(); vaos[6]->bind(); - buffers[13].bind(); - buffers[13].allocate(pos_sphere.data(), - static_cast(pos_sphere.size()*sizeof(double))); + buffers[Sphere_vertices].bind(); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[13].release(); - buffers[14].bind(); - buffers[14].allocate(normals_sphere.data(), - static_cast(normals_sphere.size()*sizeof(double))); + buffers[Sphere_normals].bind(); program->enableAttributeArray("normals"); program->setAttributeBuffer("normals",GL_DOUBLE,0,3); - buffers[14].release(); + buffers[Sphere_normals].release(); - buffers[15].bind(); - buffers[15].allocate(control_color.data(), - static_cast(control_color.size()*sizeof(double))); - program->enableAttributeArray("colors"); - program->setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[15].release(); - - buffers[16].bind(); - buffers[16].allocate(control_points.data(), - static_cast(control_points.size()*sizeof(double))); + buffers[Control_points].bind(); program->enableAttributeArray("center"); program->setAttributeBuffer("center",GL_DOUBLE,0,3); - buffers[16].release(); + buffers[Control_points].release(); if(viewer->extension_is_found) { viewer->glVertexAttribDivisor(program->attributeLocation("center"), 1); - viewer->glVertexAttribDivisor(program->attributeLocation("colors"), 1); } vaos[6]->release(); nb_sphere = pos_sphere.size(); @@ -332,19 +286,18 @@ void Scene_edit_polyhedron_item::initialize_buffers(CGAL::Three::Viewer_interfac program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); program->bind(); vaos[7]->bind(); - buffers[17].bind(); - buffers[17].allocate(pos_axis.data(), + buffers[Axis_vertices].bind(); + buffers[Axis_vertices].allocate(pos_axis.data(), static_cast(pos_axis.size()*sizeof(double))); program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_DOUBLE,0,3); - buffers[17].release(); - - buffers[18].bind(); - buffers[18].allocate(color_lines.data(), + buffers[Axis_vertices].release(); + buffers[Axis_colors].bind(); + buffers[Axis_colors].allocate(color_lines.data(), static_cast(color_lines.size()*sizeof(double))); program->enableAttributeArray("colors"); program->setAttributeBuffer("colors",GL_DOUBLE,0,3); - buffers[18].release(); + buffers[Axis_colors].release(); vaos[7]->release(); program->release(); nb_axis = pos_axis.size(); diff --git a/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.h b/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.h index 19b937b4a22..2935d43b439 100644 --- a/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_edit_polyhedron_item.h @@ -287,7 +287,19 @@ private: mutable std::size_t nb_axis; mutable std::size_t nb_bbox; - + enum Buffer + { + Facet_vertices =0, + Facet_normals, + Roi_points, + Control_points, + Sphere_vertices, + Sphere_normals, + Bbox_vertices, + Axis_vertices, + Axis_colors, + NumberOfBuffers = Axis_colors+1 + }; mutable QOpenGLBuffer *in_bu; using Scene_item::initialize_buffers;