diff --git a/include/llmr/renderer/fill_bucket.hpp b/include/llmr/renderer/fill_bucket.hpp index fc34e5451..0955d3491 100644 --- a/include/llmr/renderer/fill_bucket.hpp +++ b/include/llmr/renderer/fill_bucket.hpp @@ -15,11 +15,13 @@ class FillBucket : public Bucket { public: FillBucket(FillBuffer& buffer); - void addGeometry(pbf& data); - virtual void render(Painter& painter); -public: + void addGeometry(pbf& data); + void drawElements(int32_t attrib); + void drawVertices(int32_t attrib); + +private: FillBuffer& buffer; struct group { diff --git a/include/llmr/renderer/painter.hpp b/include/llmr/renderer/painter.hpp index 13d4017ef..658227e9b 100644 --- a/include/llmr/renderer/painter.hpp +++ b/include/llmr/renderer/painter.hpp @@ -34,7 +34,7 @@ public: void renderDebug(const std::shared_ptr& tile); void renderBackground(); - void renderFill(const FillBucket& bucket, const FillProperties& style); + void renderFill(FillBucket& bucket, const FillProperties& style); void drawClippingMask(); diff --git a/src/renderer/fill_bucket.cpp b/src/renderer/fill_bucket.cpp index 3af3495c9..bfd7293cb 100644 --- a/src/renderer/fill_bucket.cpp +++ b/src/renderer/fill_bucket.cpp @@ -5,6 +5,10 @@ #include #include +#include + +#define BUFFER_OFFSET(i) ((char *)NULL + (i)) + #include struct geometry_too_long_exception : std::exception {}; @@ -89,6 +93,25 @@ void FillBucket::addGeometry(pbf& geom) { } } +void FillBucket::drawElements(int32_t attrib) { + char *vertex_index = BUFFER_OFFSET(vertex_start * 2 * sizeof(uint16_t)); + char *elements_index = BUFFER_OFFSET(elements_start * 3 * sizeof(uint16_t)); + buffer.bind(); + for (const auto& group : groups) { + glVertexAttribPointer(attrib, 2, GL_SHORT, GL_FALSE, 0, vertex_index); + glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); + vertex_index += group.vertex_length * 2 * sizeof(uint16_t); + elements_index += group.elements_length * 3 * sizeof(uint16_t); + } +} + +void FillBucket::drawVertices(int32_t attrib) { + // Draw the entire line + char *vertex_index = BUFFER_OFFSET(vertex_start * 2 * sizeof(uint16_t)); + glVertexAttribPointer(attrib, 2, GL_SHORT, GL_FALSE, 0, vertex_index); + glDrawArrays(GL_LINE_STRIP, 0, length); +} + void FillBucket::render(Painter& painter) { // TODO: obtain the correct style information for this layer FillProperties properties; diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index b1fd196d0..dc78dab54 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -179,7 +179,7 @@ void Painter::render(const Tile::Ptr& tile) { renderBackground(); } -void Painter::renderFill(const FillBucket& bucket, const FillProperties& properties) { +void Painter::renderFill(FillBucket& bucket, const FillProperties& properties) { // Draw the stencil mask. { // We're only drawing to the first seven bits (== support a maximum of @@ -213,15 +213,7 @@ void Painter::renderFill(const FillBucket& bucket, const FillProperties& propert glUniformMatrix4fv(fillShader->u_matrix, 1, GL_FALSE, matrix); // Draw all groups - char *vertex_index = BUFFER_OFFSET(bucket.vertex_start * 2 * sizeof(uint16_t)); - char *elements_index = BUFFER_OFFSET(bucket.elements_start * 3 * sizeof(uint16_t)); - bucket.buffer.bind(); - for (const auto& group : bucket.groups) { - glVertexAttribPointer(fillShader->a_pos, 2, GL_SHORT, GL_FALSE, 0, vertex_index); - glDrawElements(GL_TRIANGLES, group.elements_length * 3, GL_UNSIGNED_SHORT, elements_index); - vertex_index += group.vertex_length * 2 * sizeof(uint16_t); - elements_index += group.elements_length * 3 * sizeof(uint16_t); - } + bucket.drawElements(fillShader->a_pos); // Now that we have the stencil mask in the stencil buffer, we can start // writing to the color buffer. @@ -255,13 +247,10 @@ void Painter::renderFill(const FillBucket& bucket, const FillProperties& propert glUniform4fv(outlineShader->u_color, 1, properties.fill_color.data()); } - glUniform2f(outlineShader->u_world, transform.fb_width, transform.fb_height); - // Draw the entire line - char *vertex_index = BUFFER_OFFSET(bucket.vertex_start * 2 * sizeof(uint16_t)); - glVertexAttribPointer(outlineShader->a_pos, 2, GL_SHORT, GL_FALSE, 0, vertex_index); + glUniform2f(outlineShader->u_world, transform.fb_width, transform.fb_height); glLineWidth(2.0f); - glDrawArrays(GL_LINE_STRIP, 0, bucket.length); + bucket.drawVertices(outlineShader->a_pos); } // var imagePos = layerStyle.image && imageSprite.getPosition(layerStyle.image, true);