diff options
Diffstat (limited to 'src/mbgl/renderer/line_bucket.cpp')
-rw-r--r-- | src/mbgl/renderer/line_bucket.cpp | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index 4937c8ac63..8141e68e24 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -7,6 +7,7 @@ #include <mbgl/map/vector_tile.hpp> #include <mbgl/util/math.hpp> +#include <mbgl/util/std.hpp> #include <mbgl/platform/gl.hpp> #define BUFFER_OFFSET(i) ((char *)nullptr + (i)) @@ -306,12 +307,13 @@ void LineBucket::addGeometry(const std::vector<Coordinate>& 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(util::make_unique<triangle_group_type>()); } - triangle_group_type& group = triangleGroups.back(); + assert(triangleGroups.back()); + triangle_group_type& group = *triangleGroups.back(); for (const TriangleElement& triangle : triangle_store) { triangleElementsBuffer.add( group.vertex_length + triangle.a, @@ -326,12 +328,13 @@ void LineBucket::addGeometry(const std::vector<Coordinate>& vertices) { // 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(util::make_unique<point_group_type>()); } - point_group_type& group = pointGroups.back(); + assert(pointGroups.back()); + point_group_type& group = *pointGroups.back(); for (PointElement point : point_store) { pointElementsBuffer.add(group.vertex_length + point); } @@ -351,8 +354,9 @@ bool LineBucket::hasData() const { bool LineBucket::hasPoints() const { if (!pointGroups.empty()) { - for (const point_group_type& group : pointGroups) { - if (group.elements_length) { + for (const auto& group : pointGroups) { + assert(group); + if (group->elements_length) { return true; } } @@ -363,55 +367,59 @@ bool LineBucket::hasPoints() const { 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) { + for (auto& group : triangleGroups) { + assert(group); + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - MBGL_CHECK_ERROR(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); + MBGL_CHECK_ERROR(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; } } void LineBucket::drawLineSDF(LineSDFShader& 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) { + for (auto& group : triangleGroups) { + assert(group); + if (!group->elements_length) { continue; } - group.array[2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - MBGL_CHECK_ERROR(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[2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); + MBGL_CHECK_ERROR(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; } } void LineBucket::drawLinePatterns(LinepatternShader& 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) { + for (auto& group : triangleGroups) { + assert(group); + if (!group->elements_length) { continue; } - group.array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index); - MBGL_CHECK_ERROR(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); + MBGL_CHECK_ERROR(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; } } 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) { + for (auto& group : pointGroups) { + assert(group); + if (!group->elements_length) { continue; } - group.array[0].bind(shader, vertexBuffer, pointElementsBuffer, vertex_index); - MBGL_CHECK_ERROR(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); + MBGL_CHECK_ERROR(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; } } |