summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGali Nelle <galinelle.mapbox@gmail.com>2020-03-15 18:47:45 +0200
committerGali Nelle <galinelle.mapbox@gmail.com>2020-03-19 16:46:36 +0200
commit8d46773bb57c0b78f5062849d5e9f29682ae9f5f (patch)
treed551f5ba69ce2d9652f72a0cb1dfdc7d2d268fbe
parent7d77a55fe05266ead14f20d49d9a19a5709d6a8e (diff)
downloadqtlocation-mapboxgl-upstream/galinelle_transformState.tar.gz
Add additional transformState::latLngToScreenCoordinate getterupstream/galinelle_transformState
This change adds a latLngToScreenCoordinate overload, to retrieve the projected vec4 in additional to the ScreenCoordinate object, that is useful to detect whether the projected latLng is in front or behind the camera.
-rw-r--r--src/mbgl/map/transform_state.cpp8
-rw-r--r--src/mbgl/map/transform_state.hpp1
-rw-r--r--test/map/transform.test.cpp10
3 files changed, 17 insertions, 2 deletions
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp
index c5bb38653a..da21487d67 100644
--- a/src/mbgl/map/transform_state.cpp
+++ b/src/mbgl/map/transform_state.cpp
@@ -81,7 +81,7 @@ void TransformState::getProjMatrix(mat4& projMatrix, uint16_t nearZ, bool aligne
}
const double cameraToCenterDistance = getCameraToCenterDistance();
- auto offset = getCenterOffset();
+ const ScreenCoordinate offset = getCenterOffset();
// Find the Z distance from the viewport center point
// [width/2 + offset.x, height/2 + offset.y] to the top edge; to point
@@ -498,11 +498,15 @@ double TransformState::scaleZoom(double s) const {
}
ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng) const {
+ vec4 p;
+ return latLngToScreenCoordinate(latLng, p);
+}
+
+ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng, vec4& p) const {
if (size.isEmpty()) {
return {};
}
- vec4 p;
Point<double> pt = Projection::project(latLng, scale) / util::tileSize;
vec4 c = {{pt.x, pt.y, 0, 1}};
matrix::transformMat4(p, c, getCoordMatrix());
diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp
index 1561ffc904..183400d417 100644
--- a/src/mbgl/map/transform_state.hpp
+++ b/src/mbgl/map/transform_state.hpp
@@ -196,6 +196,7 @@ public:
// Conversion
ScreenCoordinate latLngToScreenCoordinate(const LatLng&) const;
+ ScreenCoordinate latLngToScreenCoordinate(const LatLng&, vec4&) const;
LatLng screenCoordinateToLatLng(const ScreenCoordinate&, LatLng::WrapMode = LatLng::Unwrapped) const;
// Implements mapbox-gl-js pointCoordinate() : MercatorCoordinate.
TileCoordinate screenCoordinateToTileCoordinate(const ScreenCoordinate&, uint8_t atZoom) const;
diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp
index 506e61aca7..41bf31a032 100644
--- a/test/map/transform.test.cpp
+++ b/test/map/transform.test.cpp
@@ -130,6 +130,16 @@ TEST(Transform, PerspectiveProjection) {
point = transform.getState().latLngToScreenCoordinate({37.692872969426375, -76.75823239205641});
ASSERT_NEAR(point.x, 1000.0, 1e-5);
ASSERT_NEAR(point.y, 0.0, 1e-4);
+
+ mbgl::vec4 p;
+ point = transform.getState().latLngToScreenCoordinate({37.692872969426375, -76.75823239205641}, p);
+ ASSERT_NEAR(point.x, 1000.0, 1e-5);
+ ASSERT_NEAR(point.y, 0.0, 1e-4);
+ ASSERT_GT(p[3], 0.0);
+
+ transform.jumpTo(CameraOptions().withCenter(LatLng{38.0, -77.0}).withZoom(18.0).withPitch(51.56620156));
+ point = transform.getState().latLngToScreenCoordinate({7.692872969426375, -76.75823239205641}, p);
+ ASSERT_LT(p[3], 0.0);
}
TEST(Transform, UnwrappedLatLng) {