summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-08-03 17:38:11 -0700
committerMolly Lloyd <molly@mapbox.com>2018-08-27 13:13:47 -0700
commit7ae6294957f04137a0b3d397cf1e54f9e880673c (patch)
treed91b1b46a87ec79708bb1adfa82ef0cd5d50c493
parent362e83184b53e169ba8f64dcc45ee05839204338 (diff)
downloadqtlocation-mapboxgl-7ae6294957f04137a0b3d397cf1e54f9e880673c.tar.gz
[core] add pattern features to FeatureIndex in PatternLayout#createBucket
-rw-r--r--src/mbgl/layout/pattern_layout.cpp14
-rw-r--r--src/mbgl/layout/pattern_layout.hpp7
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp10
-rw-r--r--src/mbgl/tile/geometry_tile_worker.hpp1
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;