diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-10-27 18:13:15 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-11-04 18:43:08 +0200 |
commit | 3f5972cba000f602df7504d9214e6069fb3fb874 (patch) | |
tree | e7524adc8a6134b1184722e2decd5e8108295384 | |
parent | 48a082a91b2f49834cf18df56d2e43be8ed75d11 (diff) | |
download | qtlocation-mapboxgl-3f5972cba000f602df7504d9214e6069fb3fb874.tar.gz |
[core] Fix render tile ordering when querying sources
-rw-r--r-- | src/mbgl/style/source_impl.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/tile/tile_id.hpp | 23 |
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 { |