diff options
-rw-r--r-- | include/mbgl/util/constants.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/util/tile_cover.cpp | 18 |
2 files changed, 14 insertions, 6 deletions
diff --git a/include/mbgl/util/constants.hpp b/include/mbgl/util/constants.hpp index 14aaa752bc..bc0fb2998a 100644 --- a/include/mbgl/util/constants.hpp +++ b/include/mbgl/util/constants.hpp @@ -32,7 +32,7 @@ constexpr double EARTH_RADIUS_M = 6378137; constexpr double LATITUDE_MAX = 85.051128779806604; constexpr double LONGITUDE_MAX = 180; constexpr double DEGREES_MAX = 360; -constexpr double PITCH_MAX = M_PI / 3; +constexpr double PITCH_MAX = 1.39626; // ~80 degrees. constexpr double MIN_ZOOM = 0.0; constexpr double MAX_ZOOM = 25.5; constexpr float MIN_ZOOM_F = MIN_ZOOM; diff --git a/src/mbgl/util/tile_cover.cpp b/src/mbgl/util/tile_cover.cpp index dc39d17297..a0fe3fe21c 100644 --- a/src/mbgl/util/tile_cover.cpp +++ b/src/mbgl/util/tile_cover.cpp @@ -167,12 +167,20 @@ std::vector<UnwrappedTileID> tileCover(const TransformState& state, uint8_t zoom const double w = state.getSize().width; const double h = state.getSize().height; + + // Limit tile coverage when pitch >= 60 degrees (M_PI / 3). + const double clampedH = [&]() { + const double clampedPitch = state.getPitch() - M_PI / 3; + return clampedPitch <= 0 ? h : h - (h * std::sin(clampedPitch)); + }(); + + // top-left, top-right, bottom-right, bottom-left, center return tileCover( - TileCoordinate::fromScreenCoordinate(state, zoom, { 0, 0 }).p, - TileCoordinate::fromScreenCoordinate(state, zoom, { w, 0 }).p, - TileCoordinate::fromScreenCoordinate(state, zoom, { w, h }).p, - TileCoordinate::fromScreenCoordinate(state, zoom, { 0, h }).p, - TileCoordinate::fromScreenCoordinate(state, zoom, { w/2, h/2 }).p, + TileCoordinate::fromScreenCoordinate(state, zoom, { 0, 0 }).p, + TileCoordinate::fromScreenCoordinate(state, zoom, { w, 0 }).p, + TileCoordinate::fromScreenCoordinate(state, zoom, { w, clampedH }).p, + TileCoordinate::fromScreenCoordinate(state, zoom, { 0, clampedH }).p, + TileCoordinate::fromScreenCoordinate(state, zoom, { w/2, h/2 }).p, zoom); } |