summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp56
-rw-r--r--src/mbgl/tile/geometry_tile.hpp16
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp2
-rw-r--r--src/mbgl/tile/tile.cpp10
-rw-r--r--src/mbgl/tile/tile.hpp17
5 files changed, 59 insertions, 42 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 3087b4fc6a..9f9c41d229 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -302,14 +302,11 @@ float GeometryTile::getQueryPadding(const std::unordered_map<std::string, const
return queryPadding;
}
-void GeometryTile::queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState& transformState,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) {
-
+void GeometryTile::queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState& transformState,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState) {
if (!getData()) return;
const float queryPadding = getQueryPadding(layers);
@@ -318,16 +315,10 @@ void GeometryTile::queryRenderedFeatures(
transformState.matrixFor(posMatrix, id.toUnwrapped());
matrix::multiply(posMatrix, projMatrix, posMatrix);
- layoutResult->featureIndex->query(result,
- queryGeometry,
- transformState,
- posMatrix,
- util::tileSize * id.overscaleFactor(),
- std::pow(2, transformState.getZoom() - id.overscaledZ),
- options,
- id.toUnwrapped(),
- layers,
- queryPadding * transformState.maxPitchScaleFactor());
+ layoutResult->featureIndex->query(result, queryGeometry, transformState, posMatrix,
+ util::tileSize * id.overscaleFactor(),
+ std::pow(2, transformState.getZoom() - id.overscaledZ), options, id.toUnwrapped(),
+ layers, queryPadding * transformState.maxPitchScaleFactor(), featureState);
}
void GeometryTile::querySourceFeatures(
@@ -387,4 +378,33 @@ void GeometryTile::performedFadePlacement() {
}
}
+void GeometryTile::setFeatureState(const LayerFeatureStates& states) {
+ auto layers = getData();
+ if ((layers == nullptr) || states.empty() || !layoutResult) {
+ return;
+ }
+
+ auto& layerIdToLayerRenderData = layoutResult->layerRenderData;
+ for (auto& layer : layerIdToLayerRenderData) {
+ const auto& layerID = layer.first;
+ const auto sourceLayer = layers->getLayer(layerID);
+ if (sourceLayer) {
+ const auto& sourceLayerID = sourceLayer->getName();
+ auto entry = states.find(sourceLayerID);
+ if (entry == states.end()) {
+ continue;
+ }
+ const auto& featureStates = entry->second;
+ if (featureStates.empty()) {
+ continue;
+ }
+
+ auto bucket = layer.second.bucket;
+ if (bucket && bucket->hasData()) {
+ bucket->update(featureStates, *sourceLayer, layerID, layoutResult->iconAtlas.patternPositions);
+ }
+ }
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index 8682c8c76b..566b359547 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -48,13 +48,11 @@ public:
bool layerPropertiesUpdated(const Immutable<style::LayerProperties>&) override;
- void queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) override;
+ void queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState&,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState) override;
void querySourceFeatures(
std::vector<Feature>& result,
@@ -93,7 +91,9 @@ public:
const std::shared_ptr<FeatureIndex> getFeatureIndex() const;
const std::string sourceID;
-
+
+ void setFeatureState(const LayerFeatureStates&) override;
+
protected:
const GeometryTileData* getData() const;
LayerRenderData* getLayerRenderData(const style::Layer::Impl&);
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp
index 428a5b0d5e..f6af61eb3c 100644
--- a/src/mbgl/tile/geometry_tile_worker.cpp
+++ b/src/mbgl/tile/geometry_tile_worker.cpp
@@ -384,7 +384,7 @@ void GeometryTileWorker::parse() {
continue;
const GeometryCollection& geometries = feature->getGeometries();
- bucket->addFeature(*feature, geometries, {}, PatternLayerMap ());
+ bucket->addFeature(*feature, geometries, {}, PatternLayerMap(), i);
featureIndex->insert(geometries, i, sourceLayerID, leaderImpl.id);
}
diff --git a/src/mbgl/tile/tile.cpp b/src/mbgl/tile/tile.cpp
index 2f342c092d..2ebbf76c2a 100644
--- a/src/mbgl/tile/tile.cpp
+++ b/src/mbgl/tile/tile.cpp
@@ -39,13 +39,9 @@ void Tile::dumpDebugLogs() const {
Log::Info(Event::General, "Tile::complete: %s", isComplete() ? "yes" : "no");
}
-void Tile::queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>&,
- const GeometryCoordinates&,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const RenderedQueryOptions&,
- const mat4&) {}
+void Tile::queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>&, const GeometryCoordinates&,
+ const TransformState&, const std::unordered_map<std::string, const RenderLayer*>&,
+ const RenderedQueryOptions&, const mat4&, const SourceFeatureState&) {}
float Tile::getQueryPadding(const std::unordered_map<std::string, const RenderLayer*>&) {
return 0;
diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp
index 7a7d246aa6..b73383f989 100644
--- a/src/mbgl/tile/tile.hpp
+++ b/src/mbgl/tile/tile.hpp
@@ -28,6 +28,7 @@ class TileRenderData;
class RenderedQueryOptions;
class SourceQueryOptions;
class CollisionIndex;
+class SourceFeatureState;
namespace gfx {
class UploadPass;
@@ -67,13 +68,11 @@ public:
virtual void setLayers(const std::vector<Immutable<style::LayerProperties>>&) {}
virtual void setMask(TileMask&&) {}
- virtual void queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const RenderedQueryOptions& options,
- const mat4& projMatrix);
+ virtual void queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState&,
+ const std::unordered_map<std::string, const RenderLayer*>&,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState);
virtual void querySourceFeatures(
std::vector<Feature>& result,
@@ -125,7 +124,9 @@ public:
// We hold onto a tile for two placements: fading starts with the first placement
// and will have time to finish by the second placement.
virtual void performedFadePlacement() {}
-
+
+ virtual void setFeatureState(const LayerFeatureStates&) {}
+
void dumpDebugLogs() const;
const Kind kind;