summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2016-10-27 18:13:15 +0300
committerJesse Bounds <jesse@rebounds.net>2016-11-13 16:10:36 -0800
commitb7818f2019c24608a17bdfb0f3efb21e6fb26217 (patch)
tree32e258384c22a44f5971e2501df4103e5762900a /src
parent610f43cfd2ab02a57dc771074374cc10789933e8 (diff)
downloadqtlocation-mapboxgl-b7818f2019c24608a17bdfb0f3efb21e6fb26217.tar.gz
[core] Fix render tile ordering when querying sources
Diffstat (limited to 'src')
-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 73fc30d2dc..b384390402 100644
--- a/src/mbgl/style/source_impl.cpp
+++ b/src/mbgl/style/source_impl.cpp
@@ -201,8 +201,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 {