diff options
Diffstat (limited to 'src/mbgl/tile/geometry_tile_worker.cpp')
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 2a86b7feda..b1fd7a852e 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -6,6 +6,8 @@ #include <mbgl/layout/symbol_layout.hpp> #include <mbgl/style/bucket_parameters.hpp> #include <mbgl/style/group_by_layout.hpp> +#include <mbgl/style/filter.hpp> +#include <mbgl/style/filter_evaluator.hpp> #include <mbgl/style/layers/symbol_layer.hpp> #include <mbgl/style/layers/symbol_layer_impl.hpp> #include <mbgl/renderer/symbol_bucket.hpp> @@ -212,7 +214,7 @@ void GeometryTileWorker::redoLayout() { std::unordered_map<std::string, std::unique_ptr<SymbolLayout>> symbolLayoutMap; std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets; auto featureIndex = std::make_unique<FeatureIndex>(); - BucketParameters parameters { id, obsolete, *featureIndex, mode }; + BucketParameters parameters { id, mode }; std::vector<std::vector<const Layer*>> groups = groupByLayout(*layers); for (auto& group : groups) { @@ -240,12 +242,27 @@ void GeometryTileWorker::redoLayout() { if (leader.is<SymbolLayer>()) { symbolLayoutMap.emplace(leader.getID(), - leader.as<SymbolLayer>()->impl->createLayout(parameters, *geometryLayer, layerIDs)); + leader.as<SymbolLayer>()->impl->createLayout(parameters, group, *geometryLayer)); } else { - std::shared_ptr<Bucket> bucket = leader.baseImpl->createBucket(parameters, *geometryLayer); + const Filter& filter = leader.baseImpl->filter; + const std::string& sourceLayerID = leader.baseImpl->sourceLayer; + std::shared_ptr<Bucket> bucket = leader.baseImpl->createBucket(parameters, group); + + for (std::size_t i = 0; !obsolete && i < geometryLayer->featureCount(); i++) { + std::unique_ptr<GeometryTileFeature> feature = geometryLayer->getFeature(i); + + if (!filter(feature->getType(), feature->getID(), [&] (const auto& key) { return feature->getValue(key); })) + continue; + + GeometryCollection geometries = feature->getGeometries(); + bucket->addFeature(*feature, geometries); + featureIndex->insert(geometries, i, sourceLayerID, leader.getID()); + } + if (!bucket->hasData()) { continue; } + for (const auto& layer : group) { buckets.emplace(layer->getID(), bucket); } @@ -324,8 +341,8 @@ void GeometryTileWorker::attemptPlacement() { } std::shared_ptr<Bucket> bucket = symbolLayout->place(*collisionTile); - for (const auto& layerID : symbolLayout->layerIDs) { - buckets.emplace(layerID, bucket); + for (const auto& pair : symbolLayout->layerPaintProperties) { + buckets.emplace(pair.first, bucket); } } |