[core] Added ConstrainMode::{HeightOnly,WidthAndHeight}
ConstrainMode gives flexibility to our engine to choose between constraining both vertically and horizontally, or just vertically (default behavior). Constrain in both axis means we can no longer pan the map beyond the map boundaries. This fixes an issue where e.g. annotations disappear upon crossing the map boundaries.
This commit is contained in:
@@ -7,13 +7,13 @@ using namespace mbgl;
|
||||
|
||||
TEST(Transform, InvalidScale) {
|
||||
MockView view;
|
||||
Transform transform(view);
|
||||
Transform transform(view, ConstrainMode::HeightOnly);
|
||||
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
|
||||
ASSERT_DOUBLE_EQ(1, transform.getScale());
|
||||
|
||||
transform.setScale(2);
|
||||
transform.setScale(2 << 0);
|
||||
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
|
||||
@@ -47,13 +47,13 @@ TEST(Transform, InvalidScale) {
|
||||
|
||||
TEST(Transform, InvalidLatLng) {
|
||||
MockView view;
|
||||
Transform transform(view);
|
||||
Transform transform(view, ConstrainMode::HeightOnly);
|
||||
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
|
||||
ASSERT_DOUBLE_EQ(1, transform.getScale());
|
||||
|
||||
transform.setScale(2);
|
||||
transform.setScale(2 << 0);
|
||||
transform.setLatLng({ 8, 10 });
|
||||
|
||||
ASSERT_DOUBLE_EQ(8, transform.getLatLng().latitude);
|
||||
@@ -83,13 +83,13 @@ TEST(Transform, InvalidLatLng) {
|
||||
|
||||
TEST(Transform, InvalidBearing) {
|
||||
MockView view;
|
||||
Transform transform(view);
|
||||
Transform transform(view, ConstrainMode::HeightOnly);
|
||||
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude);
|
||||
ASSERT_DOUBLE_EQ(1, transform.getScale());
|
||||
|
||||
transform.setScale(2);
|
||||
transform.setScale(2 << 0);
|
||||
transform.setAngle(2);
|
||||
|
||||
ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude);
|
||||
@@ -108,10 +108,10 @@ TEST(Transform, InvalidBearing) {
|
||||
|
||||
TEST(Transform, PerspectiveProjection) {
|
||||
MockView view;
|
||||
Transform transform(view);
|
||||
Transform transform(view, ConstrainMode::HeightOnly);
|
||||
|
||||
transform.resize({{ 1000, 1000 }});
|
||||
transform.setScale(1024);
|
||||
transform.setScale(2 << 9);
|
||||
transform.setPitch(0.9);
|
||||
transform.setLatLng(LatLng(38, -77));
|
||||
|
||||
@@ -129,7 +129,7 @@ TEST(Transform, PerspectiveProjection) {
|
||||
ASSERT_NEAR(-76.75823239205641, loc.longitude, 0.0001);
|
||||
ASSERT_NEAR(37.692872969426375, loc.latitude, 0.0001);
|
||||
|
||||
vec2<double> point = transform.getState().latLngToPoint({38.74661326302018, -77.59198961199148});
|
||||
PrecisionPoint point = transform.getState().latLngToPoint({38.74661326302018, -77.59198961199148});
|
||||
ASSERT_NEAR(point.x, 0, 0.01);
|
||||
ASSERT_NEAR(point.y, 1000, 0.01);
|
||||
|
||||
@@ -137,3 +137,43 @@ TEST(Transform, PerspectiveProjection) {
|
||||
ASSERT_NEAR(point.x, 1000, 0.02);
|
||||
ASSERT_NEAR(point.y, 0, 0.02);
|
||||
}
|
||||
|
||||
TEST(Transform, ConstrainHeightOnly) {
|
||||
MockView view;
|
||||
LatLng loc;
|
||||
LatLngBounds bounds;
|
||||
|
||||
Transform transform(view, ConstrainMode::HeightOnly);
|
||||
transform.resize({{ 1000, 1000 }});
|
||||
transform.setScale(1024);
|
||||
|
||||
transform.setLatLng(bounds.sw);
|
||||
loc = transform.getState().pointToLatLng({ 500, 500 });
|
||||
ASSERT_NEAR(-85.021422866378714, loc.latitude, 0.0001);
|
||||
ASSERT_NEAR(180, std::abs(loc.longitude), 0.0001);
|
||||
|
||||
transform.setLatLng(bounds.ne);
|
||||
loc = transform.getState().pointToLatLng({ 500, 500 });
|
||||
ASSERT_NEAR(85.021422866378742, loc.latitude, 0.0001);
|
||||
ASSERT_NEAR(180, std::abs(loc.longitude), 0.0001);
|
||||
}
|
||||
|
||||
TEST(Transform, ConstrainWidthAndHeight) {
|
||||
MockView view;
|
||||
LatLng loc;
|
||||
LatLngBounds bounds;
|
||||
|
||||
Transform transform(view, ConstrainMode::WidthAndHeight);
|
||||
transform.resize({{ 1000, 1000 }});
|
||||
transform.setScale(1024);
|
||||
|
||||
transform.setLatLng(bounds.sw);
|
||||
loc = transform.getState().pointToLatLng({ 500, 500 });
|
||||
ASSERT_NEAR(-85.021422866378714, loc.latitude, 0.0001);
|
||||
ASSERT_NEAR(-179.65667724609375, loc.longitude, 0.0001);
|
||||
|
||||
transform.setLatLng(bounds.ne);
|
||||
loc = transform.getState().pointToLatLng({ 500, 500 });
|
||||
ASSERT_NEAR(85.021422866378742, loc.latitude, 0.0001);
|
||||
ASSERT_NEAR(179.65667724609358, std::abs(loc.longitude), 0.0001);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user