summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2017-04-03 18:37:03 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2017-04-11 12:51:09 +0300
commitc4fc89977bcba83ed5de87dcc8de1a68e8a31541 (patch)
treee304b26bb59523b4ee30136f9f615742eb4dbb91
parentc1c6c1e298521c177b64665b823d1444ce5e2cfe (diff)
downloadqtlocation-mapboxgl-c4fc89977bcba83ed5de87dcc8de1a68e8a31541.tar.gz
[core] Added {set,get}{Min,Max}Pitch
-rw-r--r--include/mbgl/map/map.hpp4
-rw-r--r--src/mbgl/map/map.cpp22
-rw-r--r--src/mbgl/map/transform.cpp14
-rw-r--r--src/mbgl/map/transform.hpp2
-rw-r--r--src/mbgl/map/transform_state.cpp19
-rw-r--r--src/mbgl/map/transform_state.hpp6
-rw-r--r--test/map/transform.test.cpp18
7 files changed, 83 insertions, 2 deletions
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp
index 908beb6b29..74942e211d 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -117,6 +117,10 @@ public:
double getMinZoom() const;
void setMaxZoom(double);
double getMaxZoom() const;
+ void setMinPitch(double);
+ double getMinPitch() const;
+ void setMaxPitch(double);
+ double getMaxPitch() const;
// Rotation
void rotateBy(const ScreenCoordinate& first, const ScreenCoordinate& second, const AnimationOptions& = {});
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 261d2f149f..d4251ffc1e 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -698,6 +698,28 @@ double Map::getMaxZoom() const {
return impl->transform.getState().getMaxZoom();
}
+void Map::setMinPitch(double minPitch) {
+ impl->transform.setMinPitch(minPitch * util::DEG2RAD);
+ if (getPitch() < minPitch) {
+ setPitch(minPitch);
+ }
+}
+
+double Map::getMinPitch() const {
+ return impl->transform.getState().getMinPitch() * util::RAD2DEG;
+}
+
+void Map::setMaxPitch(double maxPitch) {
+ impl->transform.setMaxPitch(maxPitch * util::DEG2RAD);
+ if (getPitch() > maxPitch) {
+ setPitch(maxPitch);
+ }
+}
+
+double Map::getMaxPitch() const {
+ return impl->transform.getState().getMaxPitch() * util::RAD2DEG;
+}
+
#pragma mark - Size
void Map::setSize(const Size size) {
diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp
index 469db09e0a..9febc3ab5a 100644
--- a/src/mbgl/map/transform.cpp
+++ b/src/mbgl/map/transform.cpp
@@ -120,7 +120,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim
// Constrain camera options.
zoom = util::clamp(zoom, state.getMinZoom(), state.getMaxZoom());
const double scale = state.zoomScale(zoom);
- pitch = util::clamp(pitch, 0., util::PITCH_MAX);
+ pitch = util::clamp(pitch, state.min_pitch, state.max_pitch);
Update update = state.getZoom() == zoom ? Update::Repaint : Update::RecalculateStyle;
@@ -188,7 +188,7 @@ void Transform::flyTo(const CameraOptions &camera, const AnimationOptions &anima
// Constrain camera options.
zoom = util::clamp(zoom, state.getMinZoom(), state.getMaxZoom());
- pitch = util::clamp(pitch, 0., util::PITCH_MAX);
+ pitch = util::clamp(pitch, state.min_pitch, state.max_pitch);
// Minimize rotation by taking the shorter path around the circle.
angle = _normalizeAngle(angle, state.angle);
@@ -451,6 +451,16 @@ void Transform::setMaxZoom(const double maxZoom) {
state.setMaxZoom(maxZoom);
}
+void Transform::setMinPitch(double minPitch) {
+ if (std::isnan(minPitch)) return;
+ state.setMinPitch(minPitch);
+}
+
+void Transform::setMaxPitch(double maxPitch) {
+ if (std::isnan(maxPitch)) return;
+ state.setMaxPitch(maxPitch);
+}
+
#pragma mark - Angle
void Transform::rotateBy(const ScreenCoordinate& first, const ScreenCoordinate& second, const AnimationOptions& animation) {
diff --git a/src/mbgl/map/transform.hpp b/src/mbgl/map/transform.hpp
index a4a08f4ad9..f0feae0911 100644
--- a/src/mbgl/map/transform.hpp
+++ b/src/mbgl/map/transform.hpp
@@ -60,6 +60,8 @@ public:
void setLatLngBounds(const LatLngBounds&);
void setMinZoom(double);
void setMaxZoom(double);
+ void setMinPitch(double);
+ void setMaxPitch(double);
// Zoom
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp
index 764845bc8c..f1c59533ae 100644
--- a/src/mbgl/map/transform_state.cpp
+++ b/src/mbgl/map/transform_state.cpp
@@ -176,6 +176,25 @@ double TransformState::getMaxZoom() const {
return scaleZoom(max_scale);
}
+void TransformState::setMinPitch(double minPitch) {
+ if (minPitch <= getMaxPitch()) {
+ min_pitch = minPitch;
+ }
+}
+
+double TransformState::getMinPitch() const {
+ return min_pitch;
+}
+
+void TransformState::setMaxPitch(double maxPitch) {
+ if (maxPitch >= getMinPitch()) {
+ max_pitch = maxPitch;
+ }
+}
+
+double TransformState::getMaxPitch() const {
+ return max_pitch;
+}
#pragma mark - Rotation
diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp
index b8baefdba1..174aaa7ee6 100644
--- a/src/mbgl/map/transform_state.hpp
+++ b/src/mbgl/map/transform_state.hpp
@@ -57,6 +57,10 @@ public:
double getMinZoom() const;
void setMaxZoom(double);
double getMaxZoom() const;
+ void setMinPitch(double);
+ double getMinPitch() const;
+ void setMaxPitch(double);
+ double getMaxPitch() const;
// Rotation
float getAngle() const;
@@ -91,6 +95,8 @@ private:
// Limit the amount of zooming possible on the map.
double min_scale = std::pow(2, 0);
double max_scale = std::pow(2, 20);
+ double min_pitch = 0.0;
+ double max_pitch = util::PITCH_MAX;
NorthOrientation orientation = NorthOrientation::Upwards;
diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp
index caee0ba23d..69e3eb7c64 100644
--- a/test/map/transform.test.cpp
+++ b/test/map/transform.test.cpp
@@ -573,3 +573,21 @@ TEST(Transform, LatLngBounds) {
ASSERT_EQ(transform.getLatLng().latitude(), 0.0);
ASSERT_EQ(transform.getLatLng().longitude(), 0.0);
}
+
+TEST(Transform, PitchBounds) {
+ Transform transform;
+ transform.resize({ 1000, 1000 });
+ transform.setLatLngZoom({ 0, 0 }, transform.getState().getMaxZoom());
+
+ ASSERT_DOUBLE_EQ(transform.getState().getPitch() * util::RAD2DEG, 0.0);
+ ASSERT_DOUBLE_EQ(transform.getState().getMinPitch() * util::RAD2DEG, 0.0);
+ ASSERT_DOUBLE_EQ(transform.getState().getMaxPitch() * util::RAD2DEG, 60.0);
+
+ transform.setMinPitch(45.0 * util::DEG2RAD);
+ transform.setPitch(0.0 * util::DEG2RAD);
+ ASSERT_NEAR(transform.getState().getPitch() * util::RAD2DEG, 45.0, 1e-5);
+
+ transform.setMaxPitch(55.0 * util::DEG2RAD);
+ transform.setPitch(60.0 * util::DEG2RAD);
+ ASSERT_NEAR(transform.getState().getPitch() * util::RAD2DEG, 55.0, 1e-5);
+}