summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/geometry_tile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile/geometry_tile.cpp')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp56
1 files changed, 38 insertions, 18 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