diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-08-03 17:38:11 -0700 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-08-27 13:13:47 -0700 |
commit | 7ae6294957f04137a0b3d397cf1e54f9e880673c (patch) | |
tree | d91b1b46a87ec79708bb1adfa82ef0cd5d50c493 | |
parent | 362e83184b53e169ba8f64dcc45ee05839204338 (diff) | |
download | qtlocation-mapboxgl-7ae6294957f04137a0b3d397cf1e54f9e880673c.tar.gz |
[core] add pattern features to FeatureIndex in PatternLayout#createBucket
-rw-r--r-- | src/mbgl/layout/pattern_layout.cpp | 14 | ||||
-rw-r--r-- | src/mbgl/layout/pattern_layout.hpp | 7 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.hpp | 1 |
4 files changed, 20 insertions, 12 deletions
diff --git a/src/mbgl/layout/pattern_layout.cpp b/src/mbgl/layout/pattern_layout.cpp index 82e29cfa4c..f2f236abf4 100644 --- a/src/mbgl/layout/pattern_layout.cpp +++ b/src/mbgl/layout/pattern_layout.cpp @@ -14,8 +14,11 @@ PatternLayout::PatternLayout(const BucketParameters& parameters, zoom(parameters.tileID.overscaledZ), overscaling(parameters.tileID.overscaleFactor()) { - const LineLayer::Impl& leader = layers.at(0)->as<RenderLineLayer>()->impl(); + const RenderLineLayer* renderLayer = layers.at(0)->as<RenderLineLayer>(); + const LineLayer::Impl& leader = renderLayer->impl(); layout = leader.layout.evaluate(PropertyEvaluationParameters(zoom)); + sourceLayerID = leader.sourceLayer; + groupID = renderLayer->getID(); for (const auto& layer : layers) { const RenderLinePaintProperties::PossiblyEvaluated evaluatedProps = layer->as<RenderLineLayer>()->paintProperties(); @@ -34,16 +37,19 @@ PatternLayout::PatternLayout(const BucketParameters& parameters, auto feature = sourceLayer->getFeature(i); if (!leader.filter(expression::EvaluationContext { this->zoom, feature.get() })) continue; - features.push_back(std::move(feature)); + features.push_back({i, std::move(feature)}); } } -std::unique_ptr<LineBucket> PatternLayout::createLayout(const ImagePositions& patternPositions) { +std::unique_ptr<LineBucket> PatternLayout::createBucket(const ImagePositions& patternPositions, std::unique_ptr<FeatureIndex>& featureIndex) { auto bucket = std::make_unique<LineBucket>(layout, layerPaintProperties, zoom, overscaling); - for (auto & feature : features) { + for (auto & pair : features) { + std::unique_ptr<GeometryTileFeature> feature = std::move(pair.second); + const auto i = pair.first; GeometryCollection geometries = feature->getGeometries(); bucket->addFeature(*feature, geometries, patternPositions); + featureIndex->insert(geometries, i, sourceLayerID, groupID); } return bucket; }; diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index d48f1bfc62..78f17663fd 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -2,6 +2,7 @@ #include <mbgl/renderer/buckets/line_bucket.hpp> #include <mbgl/renderer/bucket_parameters.hpp> #include <mbgl/style/layers/line_layer_impl.hpp> +#include <mbgl/geometry/feature_index.hpp> namespace mbgl { class LineBucket; @@ -13,17 +14,19 @@ public: std::unique_ptr<GeometryTileLayer>, ImageDependencies&); - std::unique_ptr<LineBucket> createLayout(const ImagePositions&); + std::unique_ptr<LineBucket> createBucket(const ImagePositions&, std::unique_ptr<FeatureIndex>&); std::map<std::string, RenderLinePaintProperties::PossiblyEvaluated> layerPaintProperties; const std::string bucketLeaderID; private: const std::unique_ptr<GeometryTileLayer> sourceLayer; - std::vector<std::unique_ptr<GeometryTileFeature>> features; + std::vector<std::pair<uint32_t, std::unique_ptr<GeometryTileFeature>>> features; style::LineLayoutProperties::PossiblyEvaluated layout; const float zoom; const uint32_t overscaling; + std::string sourceLayerID; + std::string groupID; }; } // namespace mbgl diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index e7f6997c04..c150e3aefe 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -191,10 +191,10 @@ void GeometryTileWorker::symbolDependenciesChanged() { try { switch (state) { case Idle: - if (symbolLayoutsNeedPreparation || patternNeedsLayout) { - // symbolLayoutsNeedPreparation and patternNeedsLayout can only be set true by parsing + if (symbolLayoutsNeedPreparation) { + // symbolLayoutsNeedPreparation can only be set true by parsing // and the parse result can only be cleared by performSymbolLayout - // which also clears symbolLayoutsNeedPreparation and patternNeedsLayout + // which also clears symbolLayoutsNeedPreparation assert(hasPendingParseResult()); performSymbolLayout(); coalesce(); @@ -386,7 +386,7 @@ void GeometryTileWorker::parse() { auto layout = leader.as<RenderLineLayer>()->createLayout( parameters, group, std::move(geometryLayer), imageDependencies); patternLayoutMap.emplace(leader.getID(), std::move(layout)); - patternNeedsLayout = true; + symbolLayoutsNeedPreparation = true; } else { const Filter& filter = leader.baseImpl->filter; const std::string& sourceLayerID = leader.baseImpl->sourceLayer; @@ -489,7 +489,7 @@ void GeometryTileWorker::performSymbolLayout() { return; } - std::shared_ptr<LineBucket> bucket = patternLayout->createLayout(iconAtlas.patternPositions); + std::shared_ptr<LineBucket> bucket = patternLayout->createBucket(iconAtlas.patternPositions, featureIndex); for (const auto& pair : patternLayout->layerPaintProperties) { buckets.emplace(pair.first, bucket); } diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index b04feebc8f..4585bdb8a0 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -86,7 +86,6 @@ private: optional<std::unique_ptr<const GeometryTileData>> data; bool symbolLayoutsNeedPreparation = false; - bool patternNeedsLayout = false; std::vector<std::unique_ptr<SymbolLayout>> symbolLayouts; std::vector<std::unique_ptr<PatternLayout>> patternLayouts; |