From ea51b11dccdc117c7dc43ffd3b3d0f969f59799f Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 17 Oct 2018 13:38:11 +0200 Subject: [core] Introduce mbgl::RendererState --- cmake/core-files.txt | 2 ++ include/mbgl/renderer/renderer_state.hpp | 22 ++++++++++++++++++++ platform/default/mbgl/gl/headless_frontend.cpp | 1 + src/mbgl/map/transform_state.hpp | 1 + src/mbgl/renderer/renderer_state.cpp | 10 +++++++++ test/map/map.test.cpp | 28 ++++++++++++++++++++++++++ 6 files changed, 64 insertions(+) create mode 100644 include/mbgl/renderer/renderer_state.hpp create mode 100644 src/mbgl/renderer/renderer_state.cpp diff --git a/cmake/core-files.txt b/cmake/core-files.txt index 1d7d2ef41f..7c52e08ccf 100644 --- a/cmake/core-files.txt +++ b/cmake/core-files.txt @@ -180,6 +180,7 @@ include/mbgl/renderer/renderer.hpp include/mbgl/renderer/renderer_backend.hpp include/mbgl/renderer/renderer_frontend.hpp include/mbgl/renderer/renderer_observer.hpp +include/mbgl/renderer/renderer_state.hpp src/mbgl/renderer/backend_scope.cpp src/mbgl/renderer/bucket.hpp src/mbgl/renderer/bucket_parameters.cpp @@ -216,6 +217,7 @@ src/mbgl/renderer/renderer.cpp src/mbgl/renderer/renderer_backend.cpp src/mbgl/renderer/renderer_impl.cpp src/mbgl/renderer/renderer_impl.hpp +src/mbgl/renderer/renderer_state.cpp src/mbgl/renderer/style_diff.cpp src/mbgl/renderer/style_diff.hpp src/mbgl/renderer/tile_mask.hpp diff --git a/include/mbgl/renderer/renderer_state.hpp b/include/mbgl/renderer/renderer_state.hpp new file mode 100644 index 0000000000..1b300c190b --- /dev/null +++ b/include/mbgl/renderer/renderer_state.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +namespace mbgl { + +class UpdateParameters; + +/** + * RendererState acts as a Memento-like object that is able to extract data out of UpdateParameters (an opaque object + * from the public API perspective). + */ +class RendererState { +public: + + // Obtains a CameraOptions out of a given UpdateParameters object. + static CameraOptions getCameraOptions(UpdateParameters&, const EdgeInsets& = {}); + +}; + +} // namespace mbgl diff --git a/platform/default/mbgl/gl/headless_frontend.cpp b/platform/default/mbgl/gl/headless_frontend.cpp index c87a2796c9..1ec11a195f 100644 --- a/platform/default/mbgl/gl/headless_frontend.cpp +++ b/platform/default/mbgl/gl/headless_frontend.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index 4049965618..fe716d8ea8 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -20,6 +20,7 @@ class UnwrappedTileID; class TransformState { friend class Transform; + friend class RendererState; public: TransformState(ConstrainMode = ConstrainMode::HeightOnly, ViewportMode = ViewportMode::Default); diff --git a/src/mbgl/renderer/renderer_state.cpp b/src/mbgl/renderer/renderer_state.cpp new file mode 100644 index 0000000000..dc5c4c1292 --- /dev/null +++ b/src/mbgl/renderer/renderer_state.cpp @@ -0,0 +1,10 @@ +#include +#include + +namespace mbgl { + +CameraOptions RendererState::getCameraOptions(UpdateParameters& updateParameters, const EdgeInsets& padding) { + return updateParameters.transformState.getCameraOptions(padding); +} + +} // namespace mbgl diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 88ddfa6cee..cd15c5c278 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -49,6 +49,34 @@ public: } }; +TEST(Map, RendererState) { + MapTest<> test; + + // Map hasn't notified the frontend about an update yet. + CameraOptions nullOptions; + ASSERT_EQ(test.frontend.getCameraOptions(), nullOptions); + + LatLng coordinate { 1, 1 }; + double zoom = 12.0; + double pitchInDegrees = 45.0; + double bearingInDegrees = 30.0; + + test.map.getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + test.map.setLatLngZoom(coordinate, zoom); + test.map.setPitch(pitchInDegrees); + test.map.setBearing(bearingInDegrees); + + test.runLoop.runOnce(); + test.frontend.render(test.map); + + const CameraOptions& options = test.frontend.getCameraOptions(); + EXPECT_NEAR(options.center->latitude(), coordinate.latitude(), 1e-7); + EXPECT_NEAR(options.center->longitude(), coordinate.longitude(), 1e-7); + ASSERT_DOUBLE_EQ(*options.zoom, zoom); + ASSERT_DOUBLE_EQ(*options.pitch, pitchInDegrees); + EXPECT_NEAR(*options.angle, bearingInDegrees, 1e-7); +} + TEST(Map, LatLngBehavior) { MapTest<> test; -- cgit v1.2.1