From 20adbdeaa3293a0561e9a1f91fcf2d0143b91066 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Fri, 16 Jun 2017 16:32:52 +0300 Subject: [core] Increase pitch limit to 80 degrees --- include/mbgl/util/constants.hpp | 2 +- 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 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); } -- cgit v1.2.1