summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2018-07-17 18:47:51 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2018-07-18 14:20:55 +0300
commitef42ed2e24781c34c8e3fcf016562997c88438a3 (patch)
treece393ee08b4f443ad7655016eb8fba0bbf5fa9b9
parent93510025e7bda2a2e2d3586e6ba291129a56992f (diff)
downloadqtlocation-mapboxgl-ef42ed2e24781c34c8e3fcf016562997c88438a3.tar.gz
[core] Forward padding in TransformState::setLatLngZoom()
-rw-r--r--src/mbgl/map/transform.cpp4
-rw-r--r--src/mbgl/map/transform_state.cpp32
-rw-r--r--src/mbgl/map/transform_state.hpp3
3 files changed, 28 insertions, 11 deletions
diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp
index 323efb9198..9c7405dfe2 100644
--- a/src/mbgl/map/transform.cpp
+++ b/src/mbgl/map/transform.cpp
@@ -135,7 +135,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim
Point<double> framePoint = util::interpolate(startPoint, endPoint, t);
LatLng frameLatLng = Projection::unproject(framePoint, startScale);
double frameScale = util::interpolate(startScale, scale, t);
- state.setLatLngZoom(frameLatLng, state.scaleZoom(frameScale));
+ state.setLatLngZoom(frameLatLng, padding, state.scaleZoom(frameScale));
if (bearing != startBearing) {
state.setBearing(util::wrap(util::interpolate(startBearing, bearing, t), -M_PI, M_PI));
@@ -295,7 +295,7 @@ void Transform::flyTo(const CameraOptions &camera, const AnimationOptions &anima
// Convert to geographic coordinates and set the new viewpoint.
LatLng frameLatLng = Projection::unproject(framePoint, startScale);
- state.setLatLngZoom(frameLatLng, frameZoom);
+ state.setLatLngZoom(frameLatLng, padding, frameZoom);
if (bearing != startBearing) {
state.setBearing(util::wrap(util::interpolate(startBearing, bearing, k), -M_PI, M_PI));
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp
index c740e6e87d..afa6b81820 100644
--- a/src/mbgl/map/transform_state.cpp
+++ b/src/mbgl/map/transform_state.cpp
@@ -57,19 +57,34 @@ void TransformState::getProjMatrix(mat4& projMatrix, uint16_t nearZ, bool aligne
using NO = NorthOrientation;
switch (getNorthOrientation()) {
+ case NO::Upwards: matrix::rotate_x(projMatrix, projMatrix, getPitch()); break;
case NO::Rightwards: matrix::rotate_y(projMatrix, projMatrix, getPitch()); break;
- case NO::Downwards: matrix::rotate_x(projMatrix, projMatrix, -getPitch()); break;
- case NO::Leftwards: matrix::rotate_y(projMatrix, projMatrix, -getPitch()); break;
- default: matrix::rotate_x(projMatrix, projMatrix, getPitch()); break;
+ case NO::Downwards: matrix::rotate_x(projMatrix, projMatrix, -getPitch()); break;
+ case NO::Leftwards: matrix::rotate_y(projMatrix, projMatrix, -getPitch()); break;
}
- matrix::rotate_z(projMatrix, projMatrix, getBearing() + getNorthOrientationAngle());
-
+ double bearingRotation = getBearing() + getNorthOrientationAngle();
const double worldSize = Projection::worldSize(scale);
Point<double> pixel = {
position.x - ((size.width / 2.0) / size.width * worldSize),
position.y - ((size.height / 2.0) / size.height * worldSize)
};
+
+ if (!padding.isFlush()) {
+ ScreenCoordinate center = padding.getCenter(size.width, size.height);
+ Point<double> paddedPixel = {
+ position.x - (center.x / size.width * worldSize),
+ position.y - (center.y / size.height * worldSize)
+ };
+
+ const double xDiff = center.x - (size.width / 2.0);
+ const double paddingAngle = std::atan(xDiff / cameraToCenterDistance);
+ bearingRotation += paddingAngle;
+ pixel = paddedPixel;
+ }
+
+ matrix::rotate_z(projMatrix, projMatrix, bearingRotation);
+
matrix::translate(projMatrix, projMatrix, pixel.x, pixel.y, 0);
if (axonometric) {
@@ -210,7 +225,7 @@ uint8_t TransformState::getIntegerZoom() const {
void TransformState::setLatLngBounds(optional<LatLngBounds> bounds_) {
if (bounds_ != bounds) {
bounds = bounds_;
- setLatLngZoom(getLatLng(LatLng::Unwrapped), getZoom());
+ setLatLngZoom(getLatLng(LatLng::Unwrapped), padding, getZoom());
}
}
@@ -430,15 +445,16 @@ void TransformState::moveLatLng(const LatLng& latLng, const ScreenCoordinate& an
auto centerCoord = Projection::project(getLatLng(LatLng::Unwrapped), scale);
auto latLngCoord = Projection::project(latLng, scale);
auto anchorCoord = Projection::project(screenCoordinateToLatLng(anchor), scale);
- setLatLngZoom(Projection::unproject(centerCoord + latLngCoord - anchorCoord, scale), getZoom());
+ setLatLngZoom(Projection::unproject(centerCoord + latLngCoord - anchorCoord, scale), padding, getZoom());
}
-void TransformState::setLatLngZoom(const LatLng& latLng, double zoom) {
+void TransformState::setLatLngZoom(const LatLng& latLng, const EdgeInsets &padding_, double zoom) {
const LatLng constrained = bounds ? bounds->constrain(latLng) : latLng;
constexpr double m = 1 - 1e-15;
const double f = util::clamp(std::sin(util::DEG2RAD * constrained.latitude()), -m, m);
+ padding = padding_;
scale = util::clamp(zoomScale(zoom), min_scale, max_scale);
Bc = Projection::worldSize(scale) / util::DEGREES_MAX;
Cc = Projection::worldSize(scale) / util::M2PI;
diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp
index f30e551a97..17850ac0bc 100644
--- a/src/mbgl/map/transform_state.hpp
+++ b/src/mbgl/map/transform_state.hpp
@@ -110,7 +110,7 @@ public:
/** Recenter the map so that the given coordinate is located at the given
point on screen. */
void moveLatLng(const LatLng&, const ScreenCoordinate&);
- void setLatLngZoom(const LatLng &latLng, double zoom);
+ void setLatLngZoom(const LatLng &latLng, const EdgeInsets &padding, double zoom);
private:
bool rotatedNorth() const;
@@ -120,6 +120,7 @@ private:
Point<double> screenCoordinateToMapPosition(const ScreenCoordinate& point) const;
optional<LatLngBounds> bounds;
+ EdgeInsets padding;
// Limit the amount of zooming possible on the map.
double min_scale = std::pow(2, 0);