diff options
author | Aleksandar Stojiljkovic <aleksandar.stojiljkovic@mapbox.com> | 2019-08-23 12:04:32 +0300 |
---|---|---|
committer | Aleksandar Stojiljkovic <aleksandar.stojiljkovic@mapbox.com> | 2019-08-23 16:43:05 +0300 |
commit | 9eff849c743c6e861404a2c39afa53c4eecdca3d (patch) | |
tree | 6c6eaaaf5f29b1570e3fc00aa5fb9ab16bedb7da /src/mbgl/map | |
parent | 13d2667035f8e5d8319556a275bb60093e24130d (diff) | |
download | qtlocation-mapboxgl-9eff849c743c6e861404a2c39afa53c4eecdca3d.tar.gz |
[core] Fix tileCover / TileCoordinate fromScreenCoordinate(#15442)
Remove unecessary tile coordinate unproject -> project step.
Unproject+project isn't always a noop and this was the issue leading to wrong cover calculation in high pitch values.
Fixes: https://github.com/mapbox/mapbox-gl-native/issues/15442
Diffstat (limited to 'src/mbgl/map')
-rw-r--r-- | src/mbgl/map/transform_state.cpp | 13 | ||||
-rw-r--r-- | src/mbgl/map/transform_state.hpp | 3 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index 77309a2a55..951c5a6202 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -3,6 +3,7 @@ #include <mbgl/util/constants.hpp> #include <mbgl/util/interpolate.hpp> #include <mbgl/util/projection.hpp> +#include <mbgl/util/tile_coordinate.hpp> #include <mbgl/math/log2.hpp> #include <mbgl/math/clamp.hpp> @@ -289,9 +290,9 @@ ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng) return { p[0] / p[3], size.height - p[1] / p[3] }; } -LatLng TransformState::screenCoordinateToLatLng(const ScreenCoordinate& point, LatLng::WrapMode wrapMode) const { +TileCoordinate TransformState::screenCoordinateToTileCoordinate(const ScreenCoordinate& point, uint8_t atZoom) const { if (size.isEmpty()) { - return {}; + return { {}, 0 }; } float targetZ = 0; @@ -325,7 +326,13 @@ LatLng TransformState::screenCoordinateToLatLng(const ScreenCoordinate& point, L double z1 = coord1[2] / w1; double t = z0 == z1 ? 0 : (targetZ - z0) / (z1 - z0); - return Projection::unproject(util::interpolate(p0, p1, t), scale / util::tileSize, wrapMode); + Point<double> p = util::interpolate(p0, p1, t) / scale * static_cast<double>(1 << atZoom); + return { { p.x, p.y }, static_cast<double>(atZoom) }; +} + +LatLng TransformState::screenCoordinateToLatLng(const ScreenCoordinate& point, LatLng::WrapMode wrapMode) const { + auto coord = screenCoordinateToTileCoordinate(point, 0); + return Projection::unproject(coord.p, 1 / util::tileSize, wrapMode); } mat4 TransformState::coordinatePointMatrix() const { diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index cca42db20f..e81ebed27e 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -17,6 +17,7 @@ namespace mbgl { class UnwrappedTileID; +class TileCoordinate; class TransformState { friend class Transform; @@ -81,6 +82,8 @@ public: // Conversion ScreenCoordinate latLngToScreenCoordinate(const LatLng&) const; LatLng screenCoordinateToLatLng(const ScreenCoordinate&, LatLng::WrapMode = LatLng::Unwrapped) const; + // Implements mapbox-gl-js pointCoordinate() : MercatorCoordinate. + TileCoordinate screenCoordinateToTileCoordinate(const ScreenCoordinate&, uint8_t atZoom) const; double zoomScale(double zoom) const; double scaleZoom(double scale) const; |