summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/line_bucket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/line_bucket.cpp')
-rw-r--r--src/mbgl/renderer/line_bucket.cpp72
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;
}
}