summaryrefslogtreecommitdiff
path: root/src/renderer/painter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer/painter.cpp')
-rw-r--r--src/renderer/painter.cpp53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp
index cc1157e252..fee7c6115a 100644
--- a/src/renderer/painter.cpp
+++ b/src/renderer/painter.cpp
@@ -7,6 +7,7 @@
#include <llmr/renderer/fill_bucket.hpp>
#include <llmr/renderer/line_bucket.hpp>
+#include <llmr/renderer/point_bucket.hpp>
#include <llmr/map/transform.hpp>
#include <llmr/map/settings.hpp>
@@ -29,6 +30,7 @@ Painter::Painter(Transform& transform, Settings& settings, Style& style)
void Painter::setup() {
setupShaders();
+ assert(pointShader);
assert(plainShader);
assert(outlineShader);
assert(lineShader);
@@ -52,6 +54,7 @@ void Painter::setupShaders() {
lineShader = std::make_unique<LineShader>();
linejoinShader = std::make_unique<LinejoinShader>();
patternShader = std::make_unique<PatternShader>();
+ pointShader = std::make_unique<PointShader>();
}
void Painter::useProgram(uint32_t program) {
@@ -114,7 +117,7 @@ void Painter::drawClippingMask() {
// Draw the clipping mask
plainShader->setColor(1.0f, 0.0f, 1.0f, 1.0f);
- glDrawArrays(GL_TRIANGLES, 0, tileStencilBuffer.index());
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index());
// glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 0x80, 0x80);
@@ -360,6 +363,44 @@ void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, cons
}
}
+void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, const Tile::ID& id) {
+ const PointProperties& properties = style.computed.points[layer_name];
+
+ // Abort early.
+ if (!bucket.hasPoints()) return;
+ if (properties.hidden) return;
+
+ Color color = properties.color;
+ color[0] *= properties.opacity;
+ color[1] *= properties.opacity;
+ color[2] *= properties.opacity;
+ color[3] *= properties.opacity;
+
+ std::string sized_image = properties.image;
+ sized_image.append("-");
+ sized_image.append(std::to_string(static_cast<int>(std::round(properties.size))));
+
+ ImagePosition imagePos = style.sprite->getPosition(sized_image, false);
+
+ // fprintf(stderr, "%f/%f => %f/%f\n", imagePos.tl.x, imagePos.tl.y, imagePos.br.x, imagePos.br.y);
+
+ useProgram(pointShader->program);
+ pointShader->setMatrix(matrix);
+ pointShader->setImage(0);
+ pointShader->setColor(color);
+ const float pointSize = properties.size * 1.4142135623730951 * transform.pixelRatio;
+ #if defined(GL_ES_VERSION_2_0)
+ pointShader->setSize(pointSize);
+ #else
+ glPointSize(pointSize);
+ glEnable(GL_POINT_SPRITE);
+ #endif
+ pointShader->setPointTopLeft({{ imagePos.tl.x, imagePos.tl.y }});
+ pointShader->setPointBottomRight({{ imagePos.br.x, imagePos.br.y }});
+ style.sprite->bind(transform.rotating || transform.scaling || transform.panning);
+ bucket.drawPoints(*pointShader);
+}
+
void Painter::renderDebug(const Tile::Ptr& tile) {
// Blend to the front, not the back.
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
@@ -370,16 +411,16 @@ void Painter::renderDebug(const Tile::Ptr& tile) {
tileBorderArray.bind(*plainShader, tileBorderBuffer, BUFFER_OFFSET(0));
plainShader->setColor(1.0f, 0.0f, 0.0f, 1.0f);
lineWidth(4.0f * transform.pixelRatio);
- glDrawArrays(GL_LINE_STRIP, 0, tileBorderBuffer.index());
+ glDrawArrays(GL_LINE_STRIP, 0, (GLsizei)tileBorderBuffer.index());
// draw debug info
tile->debugFontArray.bind(*plainShader, tile->debugFontBuffer, BUFFER_OFFSET(0));
plainShader->setColor(1.0f, 1.0f, 1.0f, 1.0f);
lineWidth(4.0f * transform.pixelRatio);
- glDrawArrays(GL_LINES, 0, tile->debugFontBuffer.index());
+ glDrawArrays(GL_LINES, 0, (GLsizei)tile->debugFontBuffer.index());
plainShader->setColor(0.0f, 0.0f, 0.0f, 1.0f);
lineWidth(2.0f * transform.pixelRatio);
- glDrawArrays(GL_LINES, 0, tile->debugFontBuffer.index());
+ glDrawArrays(GL_LINES, 0, (GLsizei)tile->debugFontBuffer.index());
// Revert blending mode to blend to the back.
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
@@ -396,7 +437,7 @@ void Painter::renderMatte() {
// Draw the clipping mask
matteArray.bind(*plainShader, matteBuffer, BUFFER_OFFSET(0));
plainShader->setColor(white);
- glDrawArrays(GL_TRIANGLES, 0, matteBuffer.index());
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)matteBuffer.index());
glEnable(GL_STENCIL_TEST);
}
@@ -410,5 +451,5 @@ void Painter::renderBackground() {
// Draw the clipping mask
coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0));
plainShader->setColor(white);
- glDrawArrays(GL_TRIANGLES, 0, tileStencilBuffer.index());
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index());
}