summaryrefslogtreecommitdiff
path: root/test/util
diff options
context:
space:
mode:
authorAleksandar Stojiljkovic <aleksandar.stojiljkovic@mapbox.com>2019-07-23 17:19:52 +0300
committerAleksandar Stojiljkovic <aleksandar.stojiljkovic@mapbox.com>2019-08-01 09:28:36 +0300
commit73d9f26d03810854c36a96b252885353f8ba81ce (patch)
treef7ed24fc8677192075fda78724c1a1a83da86acd /test/util
parent375c3131afcdcedb5a2dfbb19eec29625c44494d (diff)
downloadqtlocation-mapboxgl-73d9f26d03810854c36a96b252885353f8ba81ce.tar.gz
[core] Limit pitch based on edge insets. Fix max Z calculation in getProjMatrix.
Patch partly fixes #15163 in a way that it doesn't allow loading tens of thousands of tiles and attempt to show area above horizon: Limit pitch based on edge insets. It is not too bad - current limit of 60 degrees stays active until center of perspective is moved towards the bottom, to 84% of screen height. The plan is to split removal of 60 degrees limit to follow up patch. Fix max Z calculation in getProjMatrix. TransformState::getProjMatrix calculation of farZ was complex with possibility to lead to negative z values. Replacing it with simpler, precise calculation: furthestDistance = cameraToCenterDistance / (1 - tanFovAboveCenter * std::tan(getPitch())); TransformState::getProjMatrix calculation of farZ was an aproximation. Replacing it with simpler, but precise calculation. Related to: #15163
Diffstat (limited to 'test/util')
-rw-r--r--test/util/tile_cover.test.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/test/util/tile_cover.test.cpp b/test/util/tile_cover.test.cpp
index 3fc7681520..e35e6e2e99 100644
--- a/test/util/tile_cover.test.cpp
+++ b/test/util/tile_cover.test.cpp
@@ -43,6 +43,41 @@ TEST(TileCover, Pitch) {
util::tileCover(transform.getState(), 2));
}
+TEST(TileCover, PitchOverAllowedByContentInsets) {
+ Transform transform;
+ transform.resize({ 512, 512 });
+
+ transform.jumpTo(CameraOptions().withCenter(LatLng { 0.1, -0.1 }).withPadding(EdgeInsets { 376, 0, 0, 0 })
+ .withZoom(8.0).withBearing(45.0).withPitch(60.0));
+ // Top padding of 376 leads to capped pitch. See Transform::getMaxPitchForEdgeInsets.
+ EXPECT_LE(transform.getPitch() + 0.001, util::DEG2RAD * 60);
+
+ EXPECT_EQ((std::vector<UnwrappedTileID>{
+ { 3, 4, 3 }, { 3, 3, 3 }, { 3, 4, 4 }, { 3, 3, 4 }, { 3, 4, 2 }, { 3, 5, 3 }, { 3, 5, 2 }
+ }),
+ util::tileCover(transform.getState(), 3));
+}
+
+TEST(TileCover, PitchWithLargerResultSet) {
+ Transform transform;
+ transform.resize({ 1024, 768 });
+
+ // The values used here triggered the regression with left and right edge
+ // selection in tile_cover.cpp scanSpans.
+ transform.jumpTo(CameraOptions().withCenter(LatLng { 0.1, -0.1 }).withPadding(EdgeInsets { 400, 0, 0, 0 })
+ .withZoom(5).withBearing(-142.2630000003529176).withPitch(60.0));
+
+ auto cover = util::tileCover(transform.getState(), 5);
+ // Returned vector has above 100 elements, we check first 16 as there is a
+ // plan to return lower LOD for distant tiles.
+ EXPECT_EQ((std::vector<UnwrappedTileID> {
+ { 5, 15, 16 }, { 5, 15, 17 }, { 5, 14, 16 }, { 5, 14, 17 },
+ { 5, 16, 16 }, { 5, 16, 17 }, { 5, 15, 15 }, { 5, 14, 15 },
+ { 5, 15, 18 }, { 5, 14, 18 }, { 5, 16, 15 }, { 5, 13, 16 },
+ { 5, 13, 17 }, { 5, 16, 18 }, { 5, 13, 18 }, { 5, 15, 19 }
+ }), (std::vector<UnwrappedTileID> { cover.begin(), cover.begin() + 16}) );
+}
+
TEST(TileCover, WorldZ1) {
EXPECT_EQ((std::vector<UnwrappedTileID>{
{ 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },