From 7a2126bebb080c6f7b013dbe94ca4cd242b71136 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 20 Dec 2019 17:29:30 +0200 Subject: [core] Place already visible symbols first and hidden symbols last --- src/mbgl/text/placement.cpp | 27 ++++++++++++++++++++++++++- src/mbgl/text/placement.hpp | 3 +++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index d6d6e269bc..f5e0be0829 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -662,7 +662,25 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::setgetSymbolPlacement(a); + auto* bPlacement = previousPlacement->getSymbolPlacement(b); + if (!aPlacement) { + // a < b, if 'a' is new and if 'b' was previously hidden. + return bPlacement && !bPlacement->placed(); + } + if (!bPlacement) { + // a < b, if 'b' is new and 'a' was previously shown. + return aPlacement && aPlacement->placed(); + } + // a < b, if 'a' was shown and 'b' was hidden. + return aPlacement->placed() && !bPlacement->placed(); + }); + } + for (const SymbolInstance& symbol : sortedSymbols) { placeSymbol(symbol); } } @@ -1203,6 +1221,13 @@ float Placement::zoomAdjustment(const float zoom) const { return std::max(0.0, (placementZoom - zoom) / 1.5); } +const JointPlacement* Placement::getSymbolPlacement(const SymbolInstance& symbol) const { + assert(symbol.crossTileID != 0); + auto found = placements.find(symbol.crossTileID); + if (found == placements.end()) return nullptr; + return &found->second; +} + Duration Placement::getUpdatePeriod(const float zoom) const { // Even if transitionOptions.duration is set to a value < 300ms, we still wait for this default transition duration // before attempting another placement operation. diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index df7345d4cc..b2ad5d62e0 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -49,6 +49,8 @@ public: : text(text_), icon(icon_), skipFade(skipFade_) {} + bool placed() const { return text || icon; } + const bool text; const bool icon; // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge @@ -119,6 +121,7 @@ public: Duration getUpdatePeriod(const float zoom) const; float zoomAdjustment(const float zoom) const; + const JointPlacement* getSymbolPlacement(const SymbolInstance&) const; const RetainedQueryData& getQueryData(uint32_t bucketInstanceId) const; -- cgit v1.2.1