diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2015-11-10 11:50:04 +0200 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2015-11-11 16:59:49 +0200 |
commit | e2052ea3e46272f5b0eb26643c0d7e70bad46557 (patch) | |
tree | 6f06237a889bc740972845d65d178908d894159a | |
parent | e5c460f2db3f7506f4fc38b16747f0ace9151017 (diff) | |
download | qtlocation-mapboxgl-e2052ea3e46272f5b0eb26643c0d7e70bad46557.tar.gz |
[core] Added PrecisionPoint to represent pixel points
-rw-r--r-- | include/mbgl/map/map.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/util/geo.hpp | 16 | ||||
-rw-r--r-- | src/mbgl/annotation/point_annotation_impl.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/map/transform.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/map/transform.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/util/geo.cpp | 2 |
8 files changed, 30 insertions, 17 deletions
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 116722125b..5276427574 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -100,7 +100,7 @@ public: void easeTo(CameraOptions options); // Position - void moveBy(double dx, double dy, const Duration& = Duration::zero()); + void moveBy(const PrecisionPoint&, const Duration& = Duration::zero()); void setLatLng(LatLng latLng, vec2<double> point, const Duration& = Duration::zero()); void setLatLng(LatLng latLng, const Duration& = Duration::zero()); LatLng getLatLng() const; diff --git a/include/mbgl/util/geo.hpp b/include/mbgl/util/geo.hpp index bfcb84bd7c..7e2ad998b9 100644 --- a/include/mbgl/util/geo.hpp +++ b/include/mbgl/util/geo.hpp @@ -3,10 +3,24 @@ #include <mbgl/util/vec.hpp> +#include <cmath> + namespace mbgl { class TileID; +struct PrecisionPoint { + double x = 0; + double y = 0; + + inline PrecisionPoint(double x_ = 0, double y_ = 0) + : x(x_), y(y_) {} + + inline bool isValid() const { + return !(std::isnan(x) || std::isnan(y)); + } +}; + struct LatLng { double latitude = 0; double longitude = 0; @@ -21,7 +35,7 @@ struct LatLng { // Constructs a LatLng object with the top left position of the specified tile. LatLng(const TileID& id); - vec2<double> project() const; + PrecisionPoint project() const; }; struct ProjectedMeters { diff --git a/src/mbgl/annotation/point_annotation_impl.cpp b/src/mbgl/annotation/point_annotation_impl.cpp index a5f4ac269e..d313dab93c 100644 --- a/src/mbgl/annotation/point_annotation_impl.cpp +++ b/src/mbgl/annotation/point_annotation_impl.cpp @@ -13,7 +13,7 @@ void PointAnnotationImpl::updateLayer(const TileID& tileID, AnnotationTileLayer& featureProperties.emplace("sprite", point.icon.empty() ? std::string("default_marker") : point.icon); const uint16_t extent = 4096; - const vec2<double> pp = point.position.project(); + const mbgl::PrecisionPoint pp = point.position.project(); const uint32_t z2 = 1 << tileID.z; const uint32_t x = pp.x * z2; const uint32_t y = pp.y * z2; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 65fe66cab2..799f2be7af 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -156,8 +156,8 @@ void Map::easeTo(CameraOptions options) { #pragma mark - Position -void Map::moveBy(double dx, double dy, const Duration& duration) { - transform->moveBy(dx, dy, duration); +void Map::moveBy(const PrecisionPoint& point, const Duration& duration) { + transform->moveBy(point, duration); update(Update::Repaint); } diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 1a6cbb77be..403d1a7a35 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -87,21 +87,20 @@ void Transform::easeTo(CameraOptions options) { _easeTo(options, new_scale, angle, xn, yn); } -void Transform::moveBy(const double dx, const double dy, const Duration& duration) { - if (std::isnan(dx) || std::isnan(dy)) { +void Transform::moveBy(const PrecisionPoint& point, const Duration& duration) { + if (!point.isValid()) { return; } - _moveBy(dx, dy, duration); + _moveBy(point, duration); } -void Transform::_moveBy(const double dx, const double dy, const Duration& duration) { - - double x = state.x + std::cos(state.angle) * dx + std::sin( state.angle) * dy; - double y = state.y + std::cos(state.angle) * dy + std::sin(-state.angle) * dx; +void Transform::_moveBy(const PrecisionPoint& point, const Duration& duration) { + double x = state.x + std::cos(state.angle) * point.x + std::sin( state.angle) * point.y; + double y = state.y + std::cos(state.angle) * point.y + std::sin(-state.angle) * point.x; state.constrain(state.scale, y); - + CameraOptions options; options.duration = duration; _easeTo(options, state.scale, state.angle, x, y); diff --git a/src/mbgl/map/transform.hpp b/src/mbgl/map/transform.hpp index a72e9f24ef..06a7487582 100644 --- a/src/mbgl/map/transform.hpp +++ b/src/mbgl/map/transform.hpp @@ -27,7 +27,7 @@ public: void easeTo(const CameraOptions options); // Position - void moveBy(double dx, double dy, const Duration& = Duration::zero()); + void moveBy(const PrecisionPoint&, const Duration& = Duration::zero()); void setLatLng(LatLng latLng, const Duration& = Duration::zero()); void setLatLng(LatLng latLng, vec2<double> point, const Duration& duration = Duration::zero()); void setLatLngZoom(LatLng latLng, double zoom, const Duration& = Duration::zero()); @@ -66,7 +66,7 @@ public: bool isPanning() const { return state.isPanning(); } private: - void _moveBy(double dx, double dy, const Duration& = Duration::zero()); + void _moveBy(const PrecisionPoint&, const Duration& = Duration::zero()); void _setScale(double scale, double cx, double cy, const Duration& = Duration::zero()); void _setScaleXY(double new_scale, double xn, double yn, const Duration& = Duration::zero()); void _easeTo(CameraOptions options, const double new_scale, const double new_angle, diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 555d6684ac..140ab2991c 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -372,7 +372,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) { patternShader->u_opacity = properties.opacity; LatLng latLng = state.getLatLng(); - vec2<double> center = state.latLngToPoint(latLng); + PrecisionPoint center = state.latLngToPoint(latLng); float scale = 1 / std::pow(2, zoomFraction); std::array<float, 2> sizeA = imagePosA.size; diff --git a/src/mbgl/util/geo.cpp b/src/mbgl/util/geo.cpp index 035eb2d20a..e82f4afad2 100644 --- a/src/mbgl/util/geo.cpp +++ b/src/mbgl/util/geo.cpp @@ -12,7 +12,7 @@ LatLng::LatLng(const TileID& id) { latitude = 180.0 / M_PI * std::atan(0.5 * (std::exp(n) - std::exp(-n))); } -vec2<double> LatLng::project() const { +PrecisionPoint LatLng::project() const { // Clamp to the latitude limits of Mercator. const double constrainedLatitude = ::fmin(::fmax(latitude, -util::LATITUDE_MAX), util::LATITUDE_MAX); |