diff options
author | galinelle <galinelle.mapbox@gmail.com> | 2020-03-19 18:53:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-19 18:53:09 +0200 |
commit | bc45d65c58692cf0e21b4a932e4ba7bb674f12ba (patch) | |
tree | e7740ccd758fb92988902253a04bd1a23c9a002c | |
parent | f3cf85589447765058fab3f67d615d784fd7aa5e (diff) | |
download | qtlocation-mapboxgl-bc45d65c58692cf0e21b4a932e4ba7bb674f12ba.tar.gz |
Add additional transformState::latLngToScreenCoordinate getter (#16311)
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.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/map/transform_state.hpp | 1 | ||||
-rw-r--r-- | test/map/transform.test.cpp | 10 |
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) { |