diff --git a/include/llmr/renderer/painter.hpp b/include/llmr/renderer/painter.hpp index 2aa0353ca..323d5016d 100644 --- a/include/llmr/renderer/painter.hpp +++ b/include/llmr/renderer/painter.hpp @@ -89,7 +89,6 @@ public: bool needsAnimation() const; private: void setupShaders(); - void translateLayer(const std::array &translation, const Tile::ID &id, bool reverse = false); mat4 translatedMatrix(const std::array &translation, const Tile::ID &id, TranslateAnchor anchor = TranslateAnchor::Map); void prepareTile(const Tile& tile); diff --git a/include/llmr/style/properties.hpp b/include/llmr/style/properties.hpp index c2fce21e1..2fd43f8f5 100644 --- a/include/llmr/style/properties.hpp +++ b/include/llmr/style/properties.hpp @@ -63,6 +63,7 @@ struct FunctionProperty { struct PointClass { FunctionProperty enabled = true; std::array translate = {{ 0, 0 }}; + TranslateAnchor translateAnchor = TranslateAnchor::Map; FunctionProperty size; Color color = {{ 0, 0, 0, 1 }}; FunctionProperty opacity = 1; @@ -74,6 +75,7 @@ struct PointClass { struct PointProperties { bool enabled = true; std::array translate = {{ 0, 0 }}; + TranslateAnchor translateAnchor = TranslateAnchor::Map; float size = 0; Color color = {{ 0, 0, 0, 1 }}; float opacity = 1.0; @@ -85,6 +87,7 @@ struct PointProperties { struct LineClass { FunctionProperty enabled = true; std::array translate = {{ 0, 0 }}; + TranslateAnchor translateAnchor = TranslateAnchor::Map; FunctionProperty width; FunctionProperty offset; Color color = {{ 0, 0, 0, 1 }}; @@ -95,6 +98,7 @@ struct LineClass { struct LineProperties { bool enabled = true; std::array translate = {{ 0, 0 }}; + TranslateAnchor translateAnchor = TranslateAnchor::Map; float width = 0; float offset = 0; Color color = {{ 0, 0, 0, 1 }}; diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index c6c4a7932..f214e4a59 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -171,15 +171,6 @@ void Painter::renderTileLayer(const Tile& tile, const LayerDescription &layer_de } } -void Painter::translateLayer(const std::array &translation, const Tile::ID &id, bool reverse) { - if (translation[0] || translation[1]) { - const int direction = reverse ? -1 : 1; - // TODO: Get rid of the 8 (scaling from 4096 to tile size) - const double factor = direction * ((double)(1 << id.z)) / map.getState().getScale() * (4096.0 / util::tileSize); - matrix::translate(matrix, matrix, translation[0] * factor, translation[1] * factor, 0); - } -} - mat4 Painter::translatedMatrix(const std::array &translation, const Tile::ID &id, TranslateAnchor anchor) { if (translation[0] == 0 && translation[1] == 0) { return matrix; diff --git a/src/renderer/painter_line.cpp b/src/renderer/painter_line.cpp index 6856c93af..8d60f4c81 100644 --- a/src/renderer/painter_line.cpp +++ b/src/renderer/painter_line.cpp @@ -33,14 +33,14 @@ void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, cons float dash_length = properties.dash_array[0]; float dash_gap = properties.dash_array[1]; - translateLayer(properties.translate, id); + const mat4 vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); glDepthRange(strata, 1.0f); // We're only drawing end caps + round line joins if the line is > 2px. Otherwise, they aren't visible anyway. if (bucket.hasPoints() && outset > 1.0f) { useProgram(linejoinShader->program); - linejoinShader->setMatrix(matrix); + linejoinShader->setMatrix(vtxMatrix); linejoinShader->setColor(color); linejoinShader->setWorld({{ map.getState().getFramebufferWidth() * 0.5f, @@ -79,7 +79,7 @@ void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, cons } else { useProgram(lineShader->program); - lineShader->setMatrix(matrix); + lineShader->setMatrix(vtxMatrix); lineShader->setExtrudeMatrix(extrudeMatrix); lineShader->setDashArray({{ dash_length, dash_gap }}); lineShader->setLineWidth({{ outset, inset }}); @@ -87,6 +87,4 @@ void Painter::renderLine(LineBucket& bucket, const std::string& layer_name, cons lineShader->setColor(color); bucket.drawLines(*lineShader); } - - translateLayer(properties.translate, id, true); } diff --git a/src/renderer/painter_point.cpp b/src/renderer/painter_point.cpp index 2bb2da672..64e2ae77f 100644 --- a/src/renderer/painter_point.cpp +++ b/src/renderer/painter_point.cpp @@ -17,8 +17,6 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co const PointProperties& properties = point_properties_it->second; if (!properties.enabled) return; - translateLayer(properties.translate, id); - Color color = properties.color; color[0] *= properties.opacity; color[1] *= properties.opacity; @@ -37,9 +35,11 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co imagePos = sprite->getPosition(sized_image, false); } + const mat4 vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); + if (!imagePos.size) { useProgram(dotShader->program); - dotShader->setMatrix(matrix); + dotShader->setMatrix(vtxMatrix); dotShader->setColor(color); const float pointSize = (properties.radius ? properties.radius * 2 : 8) * map.getState().getPixelRatio(); @@ -55,7 +55,7 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co bucket.drawPoints(*dotShader); } else { useProgram(pointShader->program); - pointShader->setMatrix(matrix); + pointShader->setMatrix(vtxMatrix); pointShader->setColor(color); pointShader->setImage(0); @@ -75,6 +75,4 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co glDepthRange(strata, 1.0f); bucket.drawPoints(*pointShader); } - - translateLayer(properties.translate, id, true); } diff --git a/src/style/style.cpp b/src/style/style.cpp index b6f22ea20..54ebe0936 100644 --- a/src/style/style.cpp +++ b/src/style/style.cpp @@ -60,6 +60,7 @@ void Style::cascade(float z) { stroke.enabled = layer.enabled.evaluate(z); stroke.translate = {{ layer.translate[0].evaluate(z), layer.translate[1].evaluate(z) }}; + stroke.translateAnchor = layer.translateAnchor; stroke.width = layer.width.evaluate(z); stroke.offset = layer.offset.evaluate(z); stroke.color = layer.color; @@ -79,6 +80,7 @@ void Style::cascade(float z) { point.enabled = layer.enabled.evaluate(z); point.translate = {{ layer.translate[0].evaluate(z), layer.translate[1].evaluate(z) }}; + point.translateAnchor = layer.translateAnchor; point.color = layer.color; point.size = layer.size.evaluate(z); point.opacity = layer.opacity.evaluate(z); diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 3f9370919..e41ceba4d 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -488,6 +488,10 @@ LineClass StyleParser::parseLineClass(JSVal value) { klass.translate = std::array {{ values[0], values[1] }}; } + if (value.HasMember("translate-anchor")) { + klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]); + } + if (value.HasMember("color")) { klass.color = parseColor(value["color"]); } @@ -520,6 +524,10 @@ PointClass StyleParser::parsePointClass(JSVal value) { klass.translate = std::array {{ values[0], values[1] }}; } + if (value.HasMember("translate-anchor")) { + klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]); + } + if (value.HasMember("color")) { klass.color = parseColor(value["color"]); }