diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2017-11-03 16:35:38 -0400 |
---|---|---|
committer | Ansis Brammanis <ansis@mapbox.com> | 2017-11-03 16:35:38 -0400 |
commit | e0daf69fdad227e675fd981bdf93c77e94512bfc (patch) | |
tree | 572b5961e3ffd170f03ca5bbf057118fea15b133 | |
parent | 22378c4d0f7985186ad276f39f4b6b4279148ac8 (diff) | |
download | qtlocation-mapboxgl-e0daf69fdad227e675fd981bdf93c77e94512bfc.tar.gz |
drop symbols outside of tile boundaries earlier
-rw-r--r-- | src/mbgl/layout/symbol_instance.cpp | 20 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_instance.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_layout.cpp | 21 | ||||
-rw-r--r-- | src/mbgl/text/cross_tile_symbol_index.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 43 |
5 files changed, 38 insertions, 54 deletions
diff --git a/src/mbgl/layout/symbol_instance.cpp b/src/mbgl/layout/symbol_instance.cpp index 461d50196d..baaafe9ca3 100644 --- a/src/mbgl/layout/symbol_instance.cpp +++ b/src/mbgl/layout/symbol_instance.cpp @@ -11,7 +11,6 @@ SymbolInstance::SymbolInstance(Anchor& anchor_, optional<PositionedIcon> shapedIcon, const SymbolLayoutProperties::Evaluated& layout, const float layoutTextSize, - const bool addToBuffers, const uint32_t index_, const float textBoxScale, const float textPadding, @@ -27,7 +26,6 @@ SymbolInstance::SymbolInstance(Anchor& anchor_, const std::u16string& key_, const float overscaling) : anchor(anchor_), - insideTileBoundaries(0 <= anchor.point.x && 0 <= anchor.point.y && anchor.point.x < util::EXTENT && anchor.point.y < util::EXTENT), line(line_), index(index_), hasText(shapedTextOrientations.first || shapedTextOrientations.second), @@ -42,16 +40,14 @@ SymbolInstance::SymbolInstance(Anchor& anchor_, key(key_) { // Create the quads used for rendering the icon and glyphs. - if (addToBuffers) { - if (shapedIcon) { - iconQuad = getIconQuad(*shapedIcon, layout, layoutTextSize, shapedTextOrientations.first); - } - if (shapedTextOrientations.first) { - horizontalGlyphQuads = getGlyphQuads(shapedTextOrientations.first, layout, textPlacement, positions); - } - if (shapedTextOrientations.second) { - verticalGlyphQuads = getGlyphQuads(shapedTextOrientations.second, layout, textPlacement, positions); - } + if (shapedIcon) { + iconQuad = getIconQuad(*shapedIcon, layout, layoutTextSize, shapedTextOrientations.first); + } + if (shapedTextOrientations.first) { + horizontalGlyphQuads = getGlyphQuads(shapedTextOrientations.first, layout, textPlacement, positions); + } + if (shapedTextOrientations.second) { + verticalGlyphQuads = getGlyphQuads(shapedTextOrientations.second, layout, textPlacement, positions); } if (shapedTextOrientations.first && shapedTextOrientations.second) { diff --git a/src/mbgl/layout/symbol_instance.hpp b/src/mbgl/layout/symbol_instance.hpp index fcad947207..95a09fe3e9 100644 --- a/src/mbgl/layout/symbol_instance.hpp +++ b/src/mbgl/layout/symbol_instance.hpp @@ -19,7 +19,6 @@ public: optional<PositionedIcon> shapedIcon, const style::SymbolLayoutProperties::Evaluated&, const float layoutTextSize, - const bool inside, const uint32_t index, const float textBoxScale, const float textPadding, @@ -36,7 +35,6 @@ public: const float overscaling); Anchor anchor; - bool insideTileBoundaries; GeometryCoordinates line; uint32_t index; bool hasText; diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 9eb1c5171d..3b2ab9eeb2 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -316,14 +316,16 @@ void SymbolLayout::addFeature(const std::size_t index, if (avoidEdges && !inside) return; - const bool addToBuffers = mode == MapMode::Still || withinPlus0; - - symbolInstances.emplace_back(anchor, line, shapedTextOrientations, shapedIcon, - layout.evaluate(zoom, feature), layoutTextSize, - addToBuffers, symbolInstances.size(), - textBoxScale, textPadding, textPlacement, textOffset, - iconBoxScale, iconPadding, iconPlacement, iconOffset, - glyphPositionMap, indexedFeature, index, feature.text ? *feature.text : std::u16string{}, overscaling); + // TODO set this to make api-gl work + const bool singleTileMode = false && mode == MapMode::Still; + if (singleTileMode || withinPlus0) { + symbolInstances.emplace_back(anchor, line, shapedTextOrientations, shapedIcon, + layout.evaluate(zoom, feature), layoutTextSize, + symbolInstances.size(), + textBoxScale, textPadding, textPlacement, textOffset, + iconBoxScale, iconPadding, iconPlacement, iconOffset, + glyphPositionMap, indexedFeature, index, feature.text ? *feature.text : std::u16string{}, overscaling); + } }; const auto& type = feature.getType(); @@ -558,9 +560,6 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) { } for (const SymbolInstance &symbolInstance : symbolInstances) { - if (!symbolInstance.insideTileBoundaries) { - continue; - } auto populateCollisionBox = [&](const auto& feature) { SymbolBucket::CollisionBuffer& collisionBuffer = feature.alongLine ? static_cast<SymbolBucket::CollisionBuffer&>(bucket.collisionCircle) : diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp index d641deefef..13771fcd9b 100644 --- a/src/mbgl/text/cross_tile_symbol_index.cpp +++ b/src/mbgl/text/cross_tile_symbol_index.cpp @@ -10,9 +10,7 @@ namespace mbgl { TileLayerIndex::TileLayerIndex(OverscaledTileID coord_, std::vector<SymbolInstance>& symbolInstances, uint32_t bucketInstanceId_) : coord(coord_), bucketInstanceId(bucketInstanceId_) { for (SymbolInstance& symbolInstance : symbolInstances) { - if (symbolInstance.insideTileBoundaries) { - indexedSymbolInstances[symbolInstance.key].emplace_back(symbolInstance.crossTileID, getScaledCoordinates(symbolInstance, coord)); - } + indexedSymbolInstances[symbolInstance.key].emplace_back(symbolInstance.crossTileID, getScaledCoordinates(symbolInstance, coord)); } } @@ -99,7 +97,7 @@ void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolB } for (auto& symbolInstance : bucket.symbolInstances) { - if (!symbolInstance.crossTileID && symbolInstance.insideTileBoundaries) { + if (!symbolInstance.crossTileID) { // symbol did not match any known symbol, assign a new id symbolInstance.crossTileID = ++maxCrossTileID; } diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index b7de01623f..7076a8b6da 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -98,11 +98,6 @@ void Placement::placeLayerBucket( for (auto& symbolInstance : bucket.symbolInstances) { - // TODO symbollayout handles a couple special cases related to this. copy those over if needed. - auto anchor = symbolInstance.anchor; - const bool withinPlus0 = anchor.point.x >= 0 && anchor.point.x < util::EXTENT && anchor.point.y >= 0 && anchor.point.y < util::EXTENT; - if (!withinPlus0) continue; - if (seenCrossTileIDs.count(symbolInstance.crossTileID) == 0) { bool placeText = false; bool placeIcon = false; @@ -246,27 +241,25 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket) { } } - if (symbolInstance.insideTileBoundaries) { - auto updateCollisionBox = [&](const auto& feature, const bool placed) { - for (const CollisionBox& box : feature.boxes) { - if (feature.alongLine) { - auto opacityVertex = CollisionBoxOpacityAttributes::vertex(placed, !box.used); - bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); - bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); - bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); - bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); - } else { - auto opacityVertex = CollisionBoxOpacityAttributes::vertex(placed, false); - bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); - bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); - bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); - bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); - } + auto updateCollisionBox = [&](const auto& feature, const bool placed) { + for (const CollisionBox& box : feature.boxes) { + if (feature.alongLine) { + auto opacityVertex = CollisionBoxOpacityAttributes::vertex(placed, !box.used); + bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); + bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); + bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); + bucket.collisionCircle.opacityVertices.emplace_back(opacityVertex); + } else { + auto opacityVertex = CollisionBoxOpacityAttributes::vertex(placed, false); + bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); + bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); + bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); + bucket.collisionBox.opacityVertices.emplace_back(opacityVertex); } - }; - updateCollisionBox(symbolInstance.textCollisionFeature, opacityState.text.placed); - updateCollisionBox(symbolInstance.iconCollisionFeature, opacityState.icon.placed); - } + } + }; + updateCollisionBox(symbolInstance.textCollisionFeature, opacityState.text.placed); + updateCollisionBox(symbolInstance.iconCollisionFeature, opacityState.icon.placed); } bucket.updateOpacity(); |