diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2018-07-17 18:47:51 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2018-07-18 14:20:55 +0300 |
commit | ef42ed2e24781c34c8e3fcf016562997c88438a3 (patch) | |
tree | ce393ee08b4f443ad7655016eb8fba0bbf5fa9b9 | |
parent | 93510025e7bda2a2e2d3586e6ba291129a56992f (diff) | |
download | qtlocation-mapboxgl-ef42ed2e24781c34c8e3fcf016562997c88438a3.tar.gz |
[core] Forward padding in TransformState::setLatLngZoom()
-rw-r--r-- | src/mbgl/map/transform.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/map/transform_state.cpp | 32 | ||||
-rw-r--r-- | src/mbgl/map/transform_state.hpp | 3 |
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); |