From feab36a9fbc5162150de8c3e26df8585b1430318 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 8 Jan 2018 12:57:03 -0500 Subject: [core] port minor collision changes from -js (#10764) --- src/mbgl/text/cross_tile_symbol_index.cpp | 66 +++++++++++++------------------ 1 file changed, 27 insertions(+), 39 deletions(-) (limited to 'src/mbgl/text/cross_tile_symbol_index.cpp') diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp index 177615857f..6efded8e4a 100644 --- a/src/mbgl/text/cross_tile_symbol_index.cpp +++ b/src/mbgl/text/cross_tile_symbol_index.cpp @@ -57,50 +57,35 @@ void TileLayerIndex::findMatches(std::vector& symbolInstances, c CrossTileSymbolLayerIndex::CrossTileSymbolLayerIndex() { } -void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolBucket& bucket, uint32_t& maxCrossTileID) { - if (bucket.bucketInstanceId) return; - bucket.bucketInstanceId = ++maxBucketInstanceId; - - uint8_t minZoom = 25; - uint8_t maxZoom = 0; - for (auto& it : indexes) { - auto z = it.first; - minZoom = std::min(minZoom, z); - maxZoom = std::max(maxZoom, z); +bool CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& tileID, SymbolBucket& bucket, uint32_t& maxCrossTileID) { + auto thisZoomIndexes = indexes[tileID.overscaledZ]; + auto previousIndex = thisZoomIndexes.find(tileID); + if (previousIndex != thisZoomIndexes.end() && previousIndex->second.bucketInstanceId == bucket.bucketInstanceId) { + return false; } + for (auto& symbolInstance: bucket.symbolInstances) { + symbolInstance.crossTileID = 0; + } - // make all higher-res child tiles block duplicate labels in this tile - for (auto z = maxZoom; z > coord.overscaledZ; z--) { - auto zoomIndexes = indexes.find(z); - if (zoomIndexes != indexes.end()) { - for (auto& childIndex : zoomIndexes->second) { - if (!childIndex.second.coord.isChildOf(coord)) { - continue; + for (auto& it : indexes) { + auto zoom = it.first; + auto zoomIndexes = it.second; + if (zoom > tileID.overscaledZ) { + for (auto& childIndex : zoomIndexes) { + if (childIndex.second.coord.isChildOf(tileID)) { + childIndex.second.findMatches(bucket.symbolInstances, tileID); } - childIndex.second.findMatches(bucket.symbolInstances, coord); } - } - if (z == 0) { - break; - } - } - - // make this tile block duplicate labels in lower-res parent tiles - for (auto z = coord.overscaledZ; z >= minZoom; z--) { - auto parentCoord = coord.scaledTo(z); - auto zoomIndexes = indexes.find(z); - if (zoomIndexes != indexes.end()) { - auto parentIndex = zoomIndexes->second.find(parentCoord); - if (parentIndex != zoomIndexes->second.end()) { - parentIndex->second.findMatches(bucket.symbolInstances, coord); + } else { + auto parentTileID = tileID.scaledTo(zoom); + auto parentIndex = zoomIndexes.find(parentTileID); + if (parentIndex != zoomIndexes.end()) { + parentIndex->second.findMatches(bucket.symbolInstances, tileID); } } - if (z == 0) { - break; - } } - + for (auto& symbolInstance : bucket.symbolInstances) { if (!symbolInstance.crossTileID) { // symbol did not match any known symbol, assign a new id @@ -108,7 +93,8 @@ void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolB } } - indexes[coord.overscaledZ].emplace(coord, TileLayerIndex(coord, bucket.symbolInstances, bucket.bucketInstanceId)); + indexes[tileID.overscaledZ].emplace(tileID, TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId)); + return true; } bool CrossTileSymbolLayerIndex::removeStaleBuckets(const std::unordered_set& currentIDs) { @@ -145,9 +131,11 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) { SymbolBucket& symbolBucket = *reinterpret_cast(bucket); if (!symbolBucket.bucketInstanceId) { - symbolBucketsChanged = true; + symbolBucket.bucketInstanceId = ++maxBucketInstanceId; } - layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID); + + const bool bucketAdded = layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID); + symbolBucketsChanged = symbolBucketsChanged || bucketAdded; currentBucketIDs.insert(symbolBucket.bucketInstanceId); } -- cgit v1.2.1