diff options
Diffstat (limited to 'src/mbgl/renderer/fill_bucket.cpp')
-rw-r--r-- | src/mbgl/renderer/fill_bucket.cpp | 126 |
1 files changed, 28 insertions, 98 deletions
diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index cd4277cabc..b89e982057 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -1,12 +1,8 @@ #include <mbgl/renderer/fill_bucket.hpp> #include <mbgl/style/layers/fill_layer.hpp> #include <mbgl/renderer/painter.hpp> -#include <mbgl/shader/fill_shader.hpp> -#include <mbgl/shader/fill_pattern_shader.hpp> -#include <mbgl/shader/fill_outline_shader.hpp> -#include <mbgl/shader/fill_outline_pattern_shader.hpp> -#include <mbgl/gl/gl.hpp> -#include <mbgl/platform/log.hpp> +#include <mbgl/programs/fill_program.hpp> +#include <mbgl/util/logging.hpp> #include <mapbox/earcut.hpp> @@ -30,11 +26,6 @@ using namespace style; struct GeometryTooLongException : std::exception {}; -FillBucket::FillBucket() { -} - -FillBucket::~FillBucket() = default; - void FillBucket::addGeometry(const GeometryCollection& geometry) { for (auto& polygon : classifyRings(geometry)) { // Optimize polygons with many interior rings for earcut tesselation. @@ -44,34 +35,36 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { for (const auto& ring : polygon) { totalVertices += ring.size(); - if (totalVertices > 65535) + if (totalVertices > std::numeric_limits<uint16_t>::max()) throw GeometryTooLongException(); } + std::size_t startVertices = vertices.vertexSize(); + for (const auto& ring : polygon) { std::size_t nVertices = ring.size(); if (nVertices == 0) continue; - if (lineGroups.empty() || lineGroups.back().vertexLength + nVertices > 65535) - lineGroups.emplace_back(); + if (lineSegments.empty() || lineSegments.back().vertexLength + nVertices > std::numeric_limits<uint16_t>::max()) { + lineSegments.emplace_back(vertices.vertexSize(), lines.indexSize()); + } - auto& lineGroup = lineGroups.back(); - uint16_t lineIndex = lineGroup.vertexLength; + auto& lineSegment = lineSegments.back(); + assert(lineSegment.vertexLength <= std::numeric_limits<uint16_t>::max()); + uint16_t lineIndex = lineSegment.vertexLength; - vertices.emplace_back(ring[0].x, ring[0].y); - lines.emplace_back(static_cast<uint16_t>(lineIndex + nVertices - 1), - static_cast<uint16_t>(lineIndex)); + vertices.emplace_back(FillAttributes::vertex(ring[0])); + lines.emplace_back(lineIndex + nVertices - 1, lineIndex); for (uint32_t i = 1; i < nVertices; i++) { - vertices.emplace_back(ring[i].x, ring[i].y); - lines.emplace_back(static_cast<uint16_t>(lineIndex + i - 1), - static_cast<uint16_t>(lineIndex + i)); + vertices.emplace_back(FillAttributes::vertex(ring[i])); + lines.emplace_back(lineIndex + i - 1, lineIndex + i); } - lineGroup.vertexLength += nVertices; - lineGroup.indexLength += nVertices; + lineSegment.vertexLength += nVertices; + lineSegment.indexLength += nVertices * 2; } std::vector<uint32_t> indices = mapbox::earcut(polygon); @@ -79,21 +72,22 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { std::size_t nIndicies = indices.size(); assert(nIndicies % 3 == 0); - if (triangleGroups.empty() || triangleGroups.back().vertexLength + totalVertices > 65535) { - triangleGroups.emplace_back(); + if (triangleSegments.empty() || triangleSegments.back().vertexLength + totalVertices > std::numeric_limits<uint16_t>::max()) { + triangleSegments.emplace_back(startVertices, triangles.indexSize()); } - auto& triangleGroup = triangleGroups.back(); - uint16_t triangleIndex = triangleGroup.vertexLength; + auto& triangleSegment = triangleSegments.back(); + assert(triangleSegment.vertexLength <= std::numeric_limits<uint16_t>::max()); + uint16_t triangleIndex = triangleSegment.vertexLength; for (uint32_t i = 0; i < nIndicies; i += 3) { - triangles.emplace_back(static_cast<uint16_t>(triangleIndex + indices[i]), - static_cast<uint16_t>(triangleIndex + indices[i + 1]), - static_cast<uint16_t>(triangleIndex + indices[i + 2])); + triangles.emplace_back(triangleIndex + indices[i], + triangleIndex + indices[i + 1], + triangleIndex + indices[i + 2]); } - triangleGroup.vertexLength += totalVertices; - triangleGroup.indexLength += nIndicies / 3; + triangleSegment.vertexLength += totalVertices; + triangleSegment.indexLength += nIndicies; } } @@ -114,71 +108,7 @@ void FillBucket::render(Painter& painter, } bool FillBucket::hasData() const { - return !triangleGroups.empty() || !lineGroups.empty(); -} - -bool FillBucket::needsClipping() const { - return true; -} - -void FillBucket::drawElements(FillShader& shader, - gl::Context& context, - PaintMode paintMode) { - GLbyte* vertex_index = BUFFER_OFFSET(0); - GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - group.getVAO(shader, paintMode).bind( - shader, *vertexBuffer, *triangleIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT, - elements_index)); - vertex_index += group.vertexLength * vertexBuffer->vertexSize; - elements_index += group.indexLength * triangleIndexBuffer->primitiveSize; - } -} - -void FillBucket::drawElements(FillPatternShader& shader, - gl::Context& context, - PaintMode paintMode) { - GLbyte* vertex_index = BUFFER_OFFSET(0); - GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : triangleGroups) { - group.getVAO(shader, paintMode).bind( - shader, *vertexBuffer, *triangleIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(group.indexLength * 3), GL_UNSIGNED_SHORT, - elements_index)); - vertex_index += group.vertexLength * vertexBuffer->vertexSize; - elements_index += group.indexLength * triangleIndexBuffer->primitiveSize; - } -} - -void FillBucket::drawVertices(FillOutlineShader& shader, - gl::Context& context, - PaintMode paintMode) { - GLbyte* vertex_index = BUFFER_OFFSET(0); - GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : lineGroups) { - group.getVAO(shader, paintMode).bind( - shader, *vertexBuffer, *lineIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, static_cast<GLsizei>(group.indexLength * 2), GL_UNSIGNED_SHORT, - elements_index)); - vertex_index += group.vertexLength * vertexBuffer->vertexSize; - elements_index += group.indexLength * lineIndexBuffer->primitiveSize; - } -} - -void FillBucket::drawVertices(FillOutlinePatternShader& shader, - gl::Context& context, - PaintMode paintMode) { - GLbyte* vertex_index = BUFFER_OFFSET(0); - GLbyte* elements_index = BUFFER_OFFSET(0); - for (auto& group : lineGroups) { - group.getVAO(shader, paintMode).bind( - shader, *vertexBuffer, *lineIndexBuffer, vertex_index, context); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, static_cast<GLsizei>(group.indexLength * 2), GL_UNSIGNED_SHORT, - elements_index)); - vertex_index += group.vertexLength * vertexBuffer->vertexSize; - elements_index += group.indexLength * lineIndexBuffer->primitiveSize; - } + return !triangleSegments.empty() || !lineSegments.empty(); } } // namespace mbgl |