diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-12 21:03:14 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-17 13:20:25 -0700 |
commit | 3e21e3887aa08ea32e4370b8c6e990d9f8c4333f (patch) | |
tree | adb36f1fb9f8642025ce7538d05a38cf6d10e465 /src | |
parent | 0c9c52491233c05bd793426f1ebb05fdfbbbb4a5 (diff) | |
download | qtlocation-mapboxgl-3e21e3887aa08ea32e4370b8c6e990d9f8c4333f.tar.gz |
[core] Introduce StyleQueryParameters; push coordinate calculations into Source
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/map/map.cpp | 44 | ||||
-rw-r--r-- | src/mbgl/source/source.cpp | 27 | ||||
-rw-r--r-- | src/mbgl/source/source.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 8 | ||||
-rw-r--r-- | src/mbgl/style/style_query_parameters.hpp | 18 |
6 files changed, 61 insertions, 53 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 2c2b9f910c..5773b3f658 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -10,6 +10,7 @@ #include <mbgl/style/style_layer.hpp> #include <mbgl/style/property_transition.hpp> #include <mbgl/style/style_update_parameters.hpp> +#include <mbgl/style/style_query_parameters.hpp> #include <mbgl/layer/custom_layer.hpp> #include <mbgl/renderer/painter.hpp> #include <mbgl/storage/file_source.hpp> @@ -725,43 +726,32 @@ AnnotationIDs Map::getPointAnnotationsInBounds(const LatLngBounds& bounds) { #pragma mark - Feature query api -std::vector<TileCoordinate> pointsToCoordinates(const std::vector<ScreenCoordinate>& queryPoints, const TransformState& transformState) { - std::vector<TileCoordinate> queryGeometry; - for (auto& p : queryPoints) { - queryGeometry.push_back(TileCoordinate::fromScreenCoordinate(transformState, 0, { p.x, transformState.getHeight() - p.y })); - } - return queryGeometry; -} - std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, const optional<std::vector<std::string>>& layerIDs) { if (!impl->style) return {}; - return impl->style->queryRenderedFeatures( - pointsToCoordinates({ point }, impl->transform.getState()), - impl->transform.getZoom(), - impl->transform.getAngle(), - layerIDs); + return impl->style->queryRenderedFeatures({ + { point }, + impl->transform.getState(), + layerIDs + }); } std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const optional<std::vector<std::string>>& layerIDs) { if (!impl->style) return {}; - std::vector<ScreenCoordinate> queryPoints { - box.min, - { box.max.x, box.min.y }, - box.max, - { box.min.x, box.max.y }, - box.min - }; - - return impl->style->queryRenderedFeatures( - pointsToCoordinates(queryPoints, impl->transform.getState()), - impl->transform.getZoom(), - impl->transform.getAngle(), - layerIDs); + return impl->style->queryRenderedFeatures({ + { + box.min, + { box.max.x, box.min.y }, + box.max, + { box.min.x, box.max.y }, + box.min + }, + impl->transform.getState(), + layerIDs + }); } - #pragma mark - Style API void Map::addCustomLayer(const std::string& id, diff --git a/src/mbgl/source/source.cpp b/src/mbgl/source/source.cpp index 91d4d6f738..1173de3f88 100644 --- a/src/mbgl/source/source.cpp +++ b/src/mbgl/source/source.cpp @@ -12,6 +12,7 @@ #include <mbgl/storage/file_source.hpp> #include <mbgl/style/style_layer.hpp> #include <mbgl/style/style_update_parameters.hpp> +#include <mbgl/style/style_query_parameters.hpp> #include <mbgl/platform/log.hpp> #include <mbgl/math/minmax.hpp> #include <mbgl/math/clamp.hpp> @@ -323,6 +324,14 @@ bool Source::update(const StyleUpdateParameters& parameters) { return allTilesUpdated; } +std::vector<TileCoordinate> pointsToCoordinates(const std::vector<ScreenCoordinate>& queryPoints, const TransformState& transformState) { + std::vector<TileCoordinate> queryGeometry; + for (auto& p : queryPoints) { + queryGeometry.push_back(TileCoordinate::fromScreenCoordinate(transformState, 0, { p.x, transformState.getHeight() - p.y })); + } + return queryGeometry; +} + static Point<int16_t> coordinateToTilePoint(const CanonicalTileID& tileID, const TileCoordinate& coord) { auto zoomedCoord = coord.zoomTo(tileID.z); return { @@ -342,11 +351,9 @@ struct TileQuery { double scale; }; -std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures( - const std::vector<TileCoordinate>& queryGeometry, - const double zoom, - const double bearing, - const optional<std::vector<std::string>>& layerIDs) const { +std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures(const StyleQueryParameters& parameters) const { + + std::vector<TileCoordinate> queryGeometry = pointsToCoordinates(parameters.geometry, parameters.transformState); std::unordered_map<std::string, std::vector<Feature>> result; @@ -384,19 +391,23 @@ std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatu if (it != tileQueries.end()) { it->second.queryGeometry.push_back(std::move(tileSpaceQueryGeometry)); } else { - (void)zoom; tileQueries.emplace(tile.id.canonical, TileQuery{ tile.data, { tileSpaceQueryGeometry }, util::tileSize * tile.data.id.overscaleFactor(), - std::pow(2, zoom - tile.data.id.overscaledZ) + std::pow(2, parameters.transformState.getZoom() - tile.data.id.overscaledZ) }); } } for (const auto& it : tileQueries) { auto& tileQuery = std::get<1>(it); - tileQuery.tileData.queryRenderedFeatures(result, tileQuery.queryGeometry, bearing, tileQuery.tileSize, tileQuery.scale, layerIDs); + tileQuery.tileData.queryRenderedFeatures(result, + tileQuery.queryGeometry, + parameters.transformState.getAngle(), + tileQuery.tileSize, + tileQuery.scale, + parameters.layerIDs); } return result; diff --git a/src/mbgl/source/source.hpp b/src/mbgl/source/source.hpp index 7f435f8d9b..8bed717780 100644 --- a/src/mbgl/source/source.hpp +++ b/src/mbgl/source/source.hpp @@ -25,12 +25,12 @@ namespace mbgl { class Style; class StyleUpdateParameters; +class StyleQueryParameters; class Painter; class FileSource; class AsyncRequest; class TransformState; class Tile; -class TileCoordinate; struct ClipID; class Source : private util::noncopyable { @@ -80,11 +80,8 @@ public: TileData* getTileData(const OverscaledTileID&) const; - std::unordered_map<std::string, std::vector<Feature>> queryRenderedFeatures( - const std::vector<TileCoordinate>& queryGeometry, - const double zoom, - const double bearing, - const optional<std::vector<std::string>>& layerIDs) const; + std::unordered_map<std::string, std::vector<Feature>> + queryRenderedFeatures(const StyleQueryParameters&) const; void setCacheSize(size_t); void onLowMemory(); diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 07147e4a4a..726b1f192b 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -317,14 +317,10 @@ RenderData Style::getRenderData() const { return result; } -std::vector<Feature> Style::queryRenderedFeatures( - const std::vector<TileCoordinate>& queryGeometry, - const double zoom, - const double bearing, - const optional<std::vector<std::string>>& layerIDs) const { +std::vector<Feature> Style::queryRenderedFeatures(const StyleQueryParameters& parameters) const { std::vector<std::unordered_map<std::string, std::vector<Feature>>> sourceResults; for (const auto& source : sources) { - sourceResults.emplace_back(source->queryRenderedFeatures(queryGeometry, zoom, bearing, layerIDs)); + sourceResults.emplace_back(source->queryRenderedFeatures(parameters)); } std::vector<Feature> features; diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 0c0b2293b7..875973683a 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -31,7 +31,7 @@ class StyleLayer; class Tile; class Bucket; class StyleUpdateParameters; -class TileCoordinate; +class StyleQueryParameters; struct RenderItem { inline RenderItem(const StyleLayer& layer_, @@ -109,11 +109,7 @@ public: RenderData getRenderData() const; - std::vector<Feature> queryRenderedFeatures( - const std::vector<TileCoordinate>& queryGeometry, - const double zoom, - const double bearing, - const optional<std::vector<std::string>>& layerIDs) const; + std::vector<Feature> queryRenderedFeatures(const StyleQueryParameters&) const; float getQueryRadius() const; diff --git a/src/mbgl/style/style_query_parameters.hpp b/src/mbgl/style/style_query_parameters.hpp new file mode 100644 index 0000000000..33115bdfb2 --- /dev/null +++ b/src/mbgl/style/style_query_parameters.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include <mbgl/util/geo.hpp> + +#include <vector> + +namespace mbgl { + +class TransformState; + +class StyleQueryParameters { +public: + const ScreenLineString& geometry; + const TransformState& transformState; + const optional<std::vector<std::string>>& layerIDs; +}; + +} // namespace mbgl |