diff options
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 56 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.hpp | 16 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/tile.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/tile/tile.hpp | 17 |
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; |