summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2016-10-27 18:13:15 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2016-11-04 18:43:08 +0200
commit3f5972cba000f602df7504d9214e6069fb3fb874 (patch)
treee7524adc8a6134b1184722e2decd5e8108295384
parent48a082a91b2f49834cf18df56d2e43be8ed75d11 (diff)
downloadqtlocation-mapboxgl-3f5972cba000f602df7504d9214e6069fb3fb874.tar.gz
[core] Fix render tile ordering when querying sources
-rw-r--r--src/mbgl/style/source_impl.cpp15
-rw-r--r--src/mbgl/tile/tile_id.hpp23
2 files changed, 17 insertions, 21 deletions
diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp
index afaa94878c..9d78815627 100644
--- a/src/mbgl/style/source_impl.cpp
+++ b/src/mbgl/style/source_impl.cpp
@@ -207,8 +207,19 @@ std::unordered_map<std::string, std::vector<Feature>> Source::Impl::queryRendere
mapbox::geometry::box<double> box = mapbox::geometry::envelope(queryGeometry);
- for (const auto& tilePtr : renderTiles) {
- const RenderTile& renderTile = tilePtr.second;
+
+ auto sortRenderTiles = [](const RenderTile& a, const RenderTile& b) {
+ return a.id.canonical.z != b.id.canonical.z ? a.id.canonical.z < b.id.canonical.z :
+ a.id.canonical.y != b.id.canonical.y ? a.id.canonical.y < b.id.canonical.y :
+ a.id.wrap != b.id.wrap ? a.id.wrap < b.id.wrap : a.id.canonical.x < b.id.canonical.x;
+ };
+ std::vector<std::reference_wrapper<const RenderTile>> sortedTiles;
+ std::transform(renderTiles.cbegin(), renderTiles.cend(), std::back_inserter(sortedTiles),
+ [](const auto& pair) { return std::ref(pair.second); });
+ std::sort(sortedTiles.begin(), sortedTiles.end(), sortRenderTiles);
+
+ for (const auto& renderTileRef : sortedTiles) {
+ const RenderTile& renderTile = renderTileRef.get();
GeometryCoordinate tileSpaceBoundsMin = TileCoordinate::toGeometryCoordinate(renderTile.id, box.min);
if (tileSpaceBoundsMin.x >= util::EXTENT || tileSpaceBoundsMin.y >= util::EXTENT) {
continue;
diff --git a/src/mbgl/tile/tile_id.hpp b/src/mbgl/tile/tile_id.hpp
index 88b01269e5..c95810342b 100644
--- a/src/mbgl/tile/tile_id.hpp
+++ b/src/mbgl/tile/tile_id.hpp
@@ -108,12 +108,7 @@ inline bool CanonicalTileID::operator!=(const CanonicalTileID& rhs) const {
}
inline bool CanonicalTileID::operator<(const CanonicalTileID& rhs) const {
- if (z != rhs.z) {
- return z < rhs.z;
- } else if (x != rhs.x) {
- return x < rhs.x;
- }
- return y < rhs.y;
+ return z != rhs.z ? z < rhs.z : x != rhs.x ? x < rhs.x : y < rhs.y;
}
inline bool CanonicalTileID::isChildOf(const CanonicalTileID& parent) const {
@@ -175,10 +170,7 @@ inline bool OverscaledTileID::operator!=(const OverscaledTileID& rhs) const {
}
inline bool OverscaledTileID::operator<(const OverscaledTileID& rhs) const {
- if (overscaledZ != rhs.overscaledZ) {
- return overscaledZ < rhs.overscaledZ;
- }
- return canonical < rhs.canonical;
+ return overscaledZ != rhs.overscaledZ ? overscaledZ < rhs.overscaledZ : canonical < rhs.canonical;
}
inline uint32_t OverscaledTileID::overscaleFactor() const {
@@ -191,11 +183,7 @@ inline bool OverscaledTileID::isChildOf(const OverscaledTileID& rhs) const {
}
inline OverscaledTileID OverscaledTileID::scaledTo(uint8_t z) const {
- if (z >= canonical.z) {
- return { z, canonical };
- } else {
- return { z, canonical.scaledTo(z) };
- }
+ return { z, z >= canonical.z ? canonical : canonical.scaledTo(z) };
}
inline UnwrappedTileID OverscaledTileID::unwrapTo(int16_t wrap) const {
@@ -223,10 +211,7 @@ inline bool UnwrappedTileID::operator!=(const UnwrappedTileID& rhs) const {
}
inline bool UnwrappedTileID::operator<(const UnwrappedTileID& rhs) const {
- if (wrap != rhs.wrap) {
- return wrap < rhs.wrap;
- }
- return canonical < rhs.canonical;
+ return wrap != rhs.wrap ? wrap < rhs.wrap : canonical < rhs.canonical;
}
inline bool UnwrappedTileID::isChildOf(const UnwrappedTileID& parent) const {