diff options
Diffstat (limited to 'src/mbgl/renderer/circle_bucket.cpp')
-rw-r--r-- | src/mbgl/renderer/circle_bucket.cpp | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp index f12139d004..cb6ba7d458 100644 --- a/src/mbgl/renderer/circle_bucket.cpp +++ b/src/mbgl/renderer/circle_bucket.cpp @@ -1,6 +1,6 @@ #include <mbgl/renderer/circle_bucket.hpp> #include <mbgl/renderer/painter.hpp> -#include <mbgl/gl/gl.hpp> +#include <mbgl/gl/context.hpp> #include <mbgl/shader/circle_shader.hpp> #include <mbgl/style/layers/circle_layer.hpp> @@ -13,10 +13,6 @@ using namespace style; CircleBucket::CircleBucket(MapMode mode_) : mode(mode_) { } -CircleBucket::~CircleBucket() { - // Do not remove. header file only contains forward definitions to unique pointers. -} - void CircleBucket::upload(gl::Context& context) { vertexBuffer = context.createVertexBuffer(std::move(vertices)); indexBuffer = context.createIndexBuffer(std::move(triangles)); @@ -31,11 +27,7 @@ void CircleBucket::render(Painter& painter, } bool CircleBucket::hasData() const { - return !groups.empty(); -} - -bool CircleBucket::needsClipping() const { - return true; + return !segments.empty(); } void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { @@ -50,6 +42,11 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { if ((mode != MapMode::Still) && (x < 0 || x >= util::EXTENT || y < 0 || y >= util::EXTENT)) continue; + if (!segments.size() || segments.back().vertexLength + 4 > 65535) { + // Move to a new segments because the old one can't hold the geometry. + segments.emplace_back(vertices.size(), triangles.size()); + } + // this geometry will be of the Point type, and we'll derive // two triangles from it. // @@ -64,13 +61,8 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { vertices.emplace_back(x, y, 1, 1); // 3 vertices.emplace_back(x, y, -1, 1); // 4 - if (!groups.size() || groups.back().vertexLength + 4 > 65535) { - // Move to a new group because the old one can't hold the geometry. - groups.emplace_back(); - } - - auto& group = groups.back(); - uint16_t index = group.vertexLength; + auto& segment = segments.back(); + uint16_t index = segment.vertexLength; // 1, 2, 3 // 1, 4, 3 @@ -81,26 +73,10 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { static_cast<uint16_t>(index + 3), static_cast<uint16_t>(index + 2)); - group.vertexLength += 4; - group.indexLength += 2; + segment.vertexLength += 4; + segment.primitiveLength += 2; } } } -void CircleBucket::drawCircles(CircleShader& shader, gl::Context& context, PaintMode paintMode) { - GLbyte* vertexIndex = BUFFER_OFFSET(0); - GLbyte* elementsIndex = BUFFER_OFFSET(0); - - for (auto& group : groups) { - if (!group.indexLength) continue; - - group.getVAO(shader, paintMode).bind(shader, *vertexBuffer, *indexBuffer, vertexIndex, context); - - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT, elementsIndex)); - - vertexIndex += group.vertexLength * vertexBuffer->vertexSize; - elementsIndex += group.indexLength * indexBuffer->primitiveSize; - } -} - } // namespace mbgl |