summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/geometry_tile_worker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile/geometry_tile_worker.cpp')
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp27
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);
}
}