summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2017-11-03 16:35:38 -0400
committerAnsis Brammanis <ansis@mapbox.com>2017-11-03 16:35:38 -0400
commite0daf69fdad227e675fd981bdf93c77e94512bfc (patch)
tree572b5961e3ffd170f03ca5bbf057118fea15b133
parent22378c4d0f7985186ad276f39f4b6b4279148ac8 (diff)
downloadqtlocation-mapboxgl-e0daf69fdad227e675fd981bdf93c77e94512bfc.tar.gz
drop symbols outside of tile boundaries earlier
-rw-r--r--src/mbgl/layout/symbol_instance.cpp20
-rw-r--r--src/mbgl/layout/symbol_instance.hpp2
-rw-r--r--src/mbgl/layout/symbol_layout.cpp21
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.cpp6
-rw-r--r--src/mbgl/text/placement.cpp43
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();