diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp index 1282beb23..44b5c71dd 100644 --- a/include/mbgl/geometry/elements_buffer.hpp +++ b/include/mbgl/geometry/elements_buffer.hpp @@ -3,13 +3,14 @@ #include #include +#include #include namespace mbgl { template -struct ElementGroup { +struct ElementGroup : public util::noncopyable { std::array array; uint32_t vertex_length; uint32_t elements_length; diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp index 87408ddba..3d32ed28a 100644 --- a/include/mbgl/geometry/vao.hpp +++ b/include/mbgl/geometry/vao.hpp @@ -3,13 +3,14 @@ #include #include +#include #include namespace mbgl { #if GL_ARB_vertex_array_object -class VertexArrayObject { +class VertexArrayObject : public util::noncopyable { public: template inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) { @@ -56,7 +57,7 @@ private: #else -class VertexArrayObject { +class VertexArrayObject : public util::noncopyable { public: template void bind(Shader& shader, Buffers& buffers, char *offset) { diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index e8d6bf99e..0cd756318 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -34,8 +34,9 @@ class FillBucket : public Bucket { static void *realloc(void *data, void *ptr, unsigned int size); static void free(void *userData, void *ptr); - typedef ElementGroup<2> triangle_group_type; - typedef ElementGroup<1> line_group_type; + typedef std::unique_ptr> triangle_group_type; + typedef std::unique_ptr> line_group_type; + public: FillBucket(FillVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index a33dde34e..55fe8c486 100644 --- a/include/mbgl/renderer/line_bucket.hpp +++ b/include/mbgl/renderer/line_bucket.hpp @@ -20,8 +20,9 @@ class LinejoinShader; struct pbf; class LineBucket : public Bucket { - typedef ElementGroup<1> triangle_group_type; - typedef ElementGroup<1> point_group_type; + typedef std::unique_ptr> triangle_group_type; + typedef std::unique_ptr> point_group_type; + public: LineBucket(LineVertexBuffer& vertexBuffer, TriangleElementsBuffer& triangleElementsBuffer, @@ -43,7 +44,6 @@ public: const StyleBucketLine &properties; private: - LineVertexBuffer& vertexBuffer; TriangleElementsBuffer& triangleElementsBuffer; PointElementsBuffer& pointElementsBuffer; diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index fb1678fc8..fccb2924d 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -50,8 +50,8 @@ typedef std::vector Symbols; class SymbolBucket : public Bucket { - typedef ElementGroup<1> TextElementGroup; - typedef ElementGroup<1> IconElementGroup; + typedef std::unique_ptr> TextElementGroup; + typedef std::unique_ptr> IconElementGroup; public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 875cc279b..37be90113 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -8,7 +8,7 @@ #include #include - +#include #include @@ -111,13 +111,13 @@ void FillBucket::tessellate() { throw geometry_too_long_exception(); } - if (!lineGroups.size() || (lineGroups.back().vertex_length + total_vertex_count > 65535)) { + if (!lineGroups.size() || (lineGroups.back()->vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - lineGroups.emplace_back(); + lineGroups.emplace_back(std::make_unique>()); } line_group_type& lineGroup = lineGroups.back(); - uint32_t lineIndex = lineGroup.vertex_length; + uint32_t lineIndex = lineGroup->vertex_length; for (const std::vector& polygon : polygons) { const size_t group_count = polygon.size(); @@ -140,7 +140,7 @@ void FillBucket::tessellate() { tessAddContour(tesselator, vertexSize, line.data(), stride, (int)line.size() / vertexSize); } - lineGroup.elements_length += total_vertex_count; + lineGroup->elements_length += total_vertex_count; if (tessTesselate(tesselator, TESS_WINDING_POSITIVE, TESS_POLYGONS, vertices_per_group, vertexSize, 0)) { const TESSreal *vertices = tessGetVertices(tesselator); @@ -157,15 +157,15 @@ void FillBucket::tessellate() { } } - if (!triangleGroups.size() || (triangleGroups.back().vertex_length + total_vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + total_vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(); + triangleGroups.emplace_back(std::make_unique>()); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. triangle_group_type& triangleGroup = triangleGroups.back(); - uint32_t triangleIndex = triangleGroup.vertex_length; + uint32_t triangleIndex = triangleGroup->vertex_length; for (int i = 0; i < triangle_count; ++i) { const TESSindex *element_group = &elements[i * vertices_per_group]; @@ -190,8 +190,8 @@ void FillBucket::tessellate() { } } - triangleGroup.vertex_length += total_vertex_count; - triangleGroup.elements_length += triangle_count; + triangleGroup->vertex_length += total_vertex_count; + triangleGroup->elements_length += triangle_count; } else { #if defined(DEBUG) fprintf(stderr, "tessellation failed\n"); @@ -201,7 +201,7 @@ void FillBucket::tessellate() { // We're adding the total vertex count *after* we added additional vertices // in the tessellation step. They won't be part of the actual lines, but // we need to skip over them anyway if we draw the next group. - lineGroup.vertex_length += total_vertex_count; + lineGroup->vertex_length += total_vertex_count; } void FillBucket::render(Painter& painter, std::shared_ptr layer_desc, const Tile::ID& id, const mat4 &matrix) { @@ -216,10 +216,10 @@ void FillBucket::drawElements(PlainShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -227,10 +227,10 @@ void FillBucket::drawElements(PatternShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - group.array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -238,9 +238,9 @@ void FillBucket::drawVertices(OutlineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(line_elements_start * lineElementsBuffer.itemSize); for (line_group_type& group : lineGroups) { - group.array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); - glDrawElements(GL_LINES, group.elements_length * 2, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * lineElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index); + glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * lineElementsBuffer.itemSize; } } diff --git a/src/renderer/line_bucket.cpp b/src/renderer/line_bucket.cpp index e089d7f61..d2ebca951 100644 --- a/src/renderer/line_bucket.cpp +++ b/src/renderer/line_bucket.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #define BUFFER_OFFSET(i) ((char *)nullptr + (i)) @@ -306,38 +307,38 @@ void LineBucket::addGeometry(const std::vector& vertices) { // Store the triangle/line groups. { - if (!triangleGroups.size() || (triangleGroups.back().vertex_length + vertex_count > 65535)) { + if (!triangleGroups.size() || (triangleGroups.back()->vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - triangleGroups.emplace_back(); + triangleGroups.emplace_back(std::make_unique>()); } triangle_group_type& group = triangleGroups.back(); for (const TriangleElement& triangle : triangle_store) { triangleElementsBuffer.add( - group.vertex_length + triangle.a, - group.vertex_length + triangle.b, - group.vertex_length + triangle.c + group->vertex_length + triangle.a, + group->vertex_length + triangle.b, + group->vertex_length + triangle.c ); } - group.vertex_length += vertex_count; - group.elements_length += triangle_store.size(); + group->vertex_length += vertex_count; + group->elements_length += triangle_store.size(); } // Store the line join/cap groups. { - if (!pointGroups.size() || (pointGroups.back().vertex_length + vertex_count > 65535)) { + if (!pointGroups.size() || (pointGroups.back()->vertex_length + vertex_count > 65535)) { // Move to a new group because the old one can't hold the geometry. - pointGroups.emplace_back(); + pointGroups.emplace_back(std::make_unique>()); } point_group_type& group = pointGroups.back(); for (PointElement point : point_store) { - pointElementsBuffer.add(group.vertex_length + point); + pointElementsBuffer.add(group->vertex_length + point); } - group.vertex_length += vertex_count; - group.elements_length += point_store.size(); + group->vertex_length += vertex_count; + group->elements_length += point_store.size(); } } @@ -352,7 +353,7 @@ bool LineBucket::hasData() const { bool LineBucket::hasPoints() const { if (!pointGroups.empty()) { for (const point_group_type& group : pointGroups) { - if (group.elements_length) { + if (group->elements_length) { return true; } } @@ -364,13 +365,13 @@ void LineBucket::drawLines(LineShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize); for (triangle_group_type& group : triangleGroups) { - if (!group.elements_length) { + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * triangleElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } @@ -378,12 +379,12 @@ void LineBucket::drawPoints(LinejoinShader& shader) { char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize); char *elements_index = BUFFER_OFFSET(point_elements_start * pointElementsBuffer.itemSize); for (point_group_type& group : pointGroups) { - if (!group.elements_length) { + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); - glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * vertexBuffer.itemSize; - elements_index += group.elements_length * pointElementsBuffer.itemSize; + group->array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); + glDrawElements(GL_POINTS, group->elements_length, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * vertexBuffer.itemSize; + elements_index += group->elements_length * pointElementsBuffer.itemSize; } } diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index fd8931509..6ddf18ee7 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace mbgl { @@ -344,15 +345,15 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float const int glyph_vertex_length = 4; if (!buffer.groups.size() || - (buffer.groups.back().vertex_length + glyph_vertex_length > 65535)) { + (buffer.groups.back()->vertex_length + glyph_vertex_length > 65535)) { // Move to a new group because the old one can't hold the geometry. - buffer.groups.emplace_back(); + buffer.groups.emplace_back(std::make_unique>()); } // We're generating triangle fans, so we always start with the first // coordinate in this polygon. TextElementGroup &triangleGroup = buffer.groups.back(); - uint32_t triangleIndex = triangleGroup.vertex_length; + uint32_t triangleIndex = triangleGroup->vertex_length; // coordinates (2 triangles) buffer.vertices.add(glyphAnchor.x, glyphAnchor.y, tl.x, tl.y, tex.x, tex.y, angle, minZoom, @@ -368,8 +369,8 @@ void SymbolBucket::addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2); buffer.triangles.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3); - triangleGroup.vertex_length += glyph_vertex_length; - triangleGroup.elements_length += 2; + triangleGroup->vertex_length += glyph_vertex_length; + triangleGroup->elements_length += 2; } } @@ -377,10 +378,10 @@ void SymbolBucket::drawGlyphs(TextShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (TextElementGroup &group : text.groups) { - group.array[0].bind(shader, text.vertices, text.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * text.vertices.itemSize; - elements_index += group.elements_length * text.triangles.itemSize; + group->array[0].bind(shader, text.vertices, text.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * text.vertices.itemSize; + elements_index += group->elements_length * text.triangles.itemSize; } } @@ -388,10 +389,10 @@ void SymbolBucket::drawIcons(IconShader &shader) { char *vertex_index = BUFFER_OFFSET(0); char *elements_index = BUFFER_OFFSET(0); for (IconElementGroup &group : icon.groups) { - group.array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * icon.vertices.itemSize; - elements_index += group.elements_length * icon.triangles.itemSize; + group->array[0].bind(shader, icon.vertices, icon.triangles, vertex_index); + glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group->vertex_length * icon.vertices.itemSize; + elements_index += group->elements_length * icon.triangles.itemSize; } } }