From b7d395fcf64f4098f3a3ca01f8613f2249d60fa3 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 16 May 2016 16:32:17 -0700 Subject: [core] Simplify and fix query logic across the antimeridian --- src/mbgl/source/source.cpp | 52 +++++++++++++--------------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/src/mbgl/source/source.cpp b/src/mbgl/source/source.cpp index b6db4ee901..51596b8c01 100644 --- a/src/mbgl/source/source.cpp +++ b/src/mbgl/source/source.cpp @@ -325,25 +325,18 @@ bool Source::update(const StyleUpdateParameters& parameters) { return allTilesUpdated; } -static Point coordinateToTilePoint(const CanonicalTileID& tileID, const Point& p) { - auto zoomedCoord = TileCoordinate { p, 0 }.zoomTo(tileID.z); +static Point coordinateToTilePoint(const UnwrappedTileID& tileID, const Point& p) { + auto zoomedCoord = TileCoordinate { p, 0 }.zoomTo(tileID.canonical.z); return { - int16_t(util::clamp((zoomedCoord.p.x - tileID.x) * util::EXTENT, + int16_t(util::clamp((zoomedCoord.p.x - tileID.canonical.x - tileID.wrap * std::pow(2, tileID.canonical.z)) * util::EXTENT, std::numeric_limits::min(), std::numeric_limits::max())), - int16_t(util::clamp((zoomedCoord.p.y - tileID.y) * util::EXTENT, + int16_t(util::clamp((zoomedCoord.p.y - tileID.canonical.y) * util::EXTENT, std::numeric_limits::min(), std::numeric_limits::max())) }; } -struct TileQuery { - TileData& tileData; - GeometryCollection queryGeometry; - double tileSize; - double scale; -}; - std::unordered_map> Source::queryRenderedFeatures(const StyleQueryParameters& parameters) const { LineString queryGeometry; @@ -354,13 +347,13 @@ std::unordered_map> Source::queryRenderedFeatu mapbox::geometry::box box = mapbox::geometry::envelope(queryGeometry); - std::map tileQueries; + std::unordered_map> result; for (const auto& tilePtr : tiles) { const auto& tile = tilePtr.second; - auto tileSpaceBoundsMin = coordinateToTilePoint(tile.id.canonical, box.min); - auto tileSpaceBoundsMax = coordinateToTilePoint(tile.id.canonical, box.max); + auto tileSpaceBoundsMin = coordinateToTilePoint(tile.id, box.min); + auto tileSpaceBoundsMax = coordinateToTilePoint(tile.id, box.max); if (tileSpaceBoundsMin.x >= util::EXTENT || tileSpaceBoundsMin.y >= util::EXTENT || tileSpaceBoundsMax.x < 0 || tileSpaceBoundsMax.y < 0) continue; @@ -368,32 +361,15 @@ std::unordered_map> Source::queryRenderedFeatu GeometryCoordinates tileSpaceQueryGeometry; for (const auto& c : queryGeometry) { - tileSpaceQueryGeometry.push_back(coordinateToTilePoint(tile.id.canonical, c)); - } - - auto it = tileQueries.find(tile.id.canonical); - if (it != tileQueries.end()) { - it->second.queryGeometry.push_back(std::move(tileSpaceQueryGeometry)); - } else { - tileQueries.emplace(tile.id.canonical, TileQuery{ - tile.data, - { tileSpaceQueryGeometry }, - util::tileSize * tile.data.id.overscaleFactor(), - std::pow(2, parameters.transformState.getZoom() - tile.data.id.overscaledZ) - }); + tileSpaceQueryGeometry.push_back(coordinateToTilePoint(tile.id, c)); } - } - - std::unordered_map> result; - for (const auto& it : tileQueries) { - auto& tileQuery = std::get<1>(it); - tileQuery.tileData.queryRenderedFeatures(result, - tileQuery.queryGeometry, - parameters.transformState.getAngle(), - tileQuery.tileSize, - tileQuery.scale, - parameters.layerIDs); + tile.data.queryRenderedFeatures(result, + { tileSpaceQueryGeometry }, + parameters.transformState.getAngle(), + util::tileSize * tile.data.id.overscaleFactor(), + std::pow(2, parameters.transformState.getZoom() - tile.data.id.overscaledZ), + parameters.layerIDs); } return result; -- cgit v1.2.1