summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikko Pulkki <mikko.pulkki@mapbox.com>2020-05-07 11:36:51 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2020-05-26 20:35:04 +0300
commite4fe751ad31862243b57e406b3cefcf66c890f7a (patch)
treea5afb6cd4765414cffe8a4de2336c81f101418b7
parent524cab8dd030d3c5735222f9f355d8d0997e12a7 (diff)
downloadqtlocation-mapboxgl-e4fe751ad31862243b57e406b3cefcf66c890f7a.tar.gz
[core] Compute metersPerPixel from map center point
-rw-r--r--src/mbgl/map/transform_state.cpp4
-rw-r--r--src/mbgl/util/camera.cpp8
-rw-r--r--src/mbgl/util/camera.hpp4
3 files changed, 7 insertions, 9 deletions
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp
index d9acecf888..39db23f190 100644
--- a/src/mbgl/map/transform_state.cpp
+++ b/src/mbgl/map/transform_state.cpp
@@ -109,11 +109,12 @@ void TransformState::getProjMatrix(mat4& projMatrix, uint16_t nearZ, bool aligne
const double furthestDistance = cameraToCenterDistance / (1 - tanMultiple);
// Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`
const double farZ = furthestDistance * 1.01;
+ double pixelsPerMeter = 1.0 / Projection::getMetersPerPixelAtLatitude(getLatLng().latitude(), getZoom());
// Make sure the camera state is up-to-date
updateCameraState();
- mat4 worldToCamera = camera.getWorldToCamera(scale, viewportMode == ViewportMode::FlippedY);
+ mat4 worldToCamera = camera.getWorldToCamera(scale, viewportMode == ViewportMode::FlippedY, pixelsPerMeter);
mat4 cameraToClip =
camera.getCameraToClipPerspective(getFieldOfView(), double(size.width) / size.height, nearZ, farZ);
@@ -139,7 +140,6 @@ void TransformState::getProjMatrix(mat4& projMatrix, uint16_t nearZ, bool aligne
projMatrix[11] = 0.0;
// mat[8], mat[9] control x-skew, y-skew
- double pixelsPerMeter = 1.0 / Projection::getMetersPerPixelAtLatitude(getLatLng().latitude(), getZoom());
projMatrix[8] = xSkew * pixelsPerMeter;
projMatrix[9] = ySkew * pixelsPerMeter;
}
diff --git a/src/mbgl/util/camera.cpp b/src/mbgl/util/camera.cpp
index 34d27620ac..c910c05ca8 100644
--- a/src/mbgl/util/camera.cpp
+++ b/src/mbgl/util/camera.cpp
@@ -97,13 +97,13 @@ vec3 Camera::getPosition() const {
return {{p[0], p[1], p[2]}};
}
-mat4 Camera::getCameraToWorld(double scale, bool flippedY) const {
+mat4 Camera::getCameraToWorld(double scale, bool flippedY, double pixelsPerMeter) const {
mat4 cameraToWorld;
- matrix::invert(cameraToWorld, getWorldToCamera(scale, flippedY));
+ matrix::invert(cameraToWorld, getWorldToCamera(scale, flippedY, pixelsPerMeter));
return cameraToWorld;
}
-mat4 Camera::getWorldToCamera(double scale, bool flippedY) const {
+mat4 Camera::getWorldToCamera(double scale, bool flippedY, double pixelsPerMeter) const {
// transformation chain from world space to camera space:
// 1. Height value (z) of renderables is in meters. Scale z coordinate by pixelsPerMeter
// 2. Transform from pixel coordinates to camera space with cameraMatrix^-1
@@ -112,8 +112,6 @@ mat4 Camera::getWorldToCamera(double scale, bool flippedY) const {
// worldToCamera: flip * cam^-1 * zScale
// cameraToWorld: (flip * cam^-1 * zScale)^-1 => (zScale^-1 * cam * flip^-1)
const double worldSize = Projection::worldSize(scale);
- const double latitude = latFromMercatorY(getColumn(transform, 3)[1]);
- const double pixelsPerMeter = worldSize / (std::cos(latitude * util::DEG2RAD) * util::M2PI * util::EARTH_RADIUS_M);
// Compute inverse of the camera matrix
mat4 result = orientation.conjugate().toRotationMatrix();
diff --git a/src/mbgl/util/camera.hpp b/src/mbgl/util/camera.hpp
index 030d7cfaac..d0781832a4 100644
--- a/src/mbgl/util/camera.hpp
+++ b/src/mbgl/util/camera.hpp
@@ -15,8 +15,8 @@ public:
Camera();
vec3 getPosition() const;
- mat4 getCameraToWorld(double scale, bool flippedY) const;
- mat4 getWorldToCamera(double scale, bool flippedY) const;
+ mat4 getCameraToWorld(double scale, bool flippedY, double pixelsPerMeter) const;
+ mat4 getWorldToCamera(double scale, bool flippedY, double pixelsPerMeter) const;
mat4 getCameraToClipPerspective(double fovy, double aspectRatio, double nearZ, double farZ) const;
vec3 forward() const;