From ef3d04dee5f4bc23a9fa88a07805c3d5c489db0b Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 21 Aug 2019 18:48:09 +0300 Subject: [core] Export symbol placement update status from MapObserver --- include/mbgl/map/map_observer.hpp | 2 +- include/mbgl/renderer/renderer_observer.hpp | 4 ++-- platform/android/src/android_renderer_frontend.cpp | 4 ++-- platform/android/src/native_map_view.cpp | 2 +- platform/android/src/native_map_view.hpp | 2 +- platform/ios/src/MGLMapView+Impl.h | 2 +- platform/ios/src/MGLMapView+Impl.mm | 2 +- platform/macos/src/MGLMapView+Impl.h | 2 +- platform/macos/src/MGLMapView+Impl.mm | 2 +- platform/qt/src/qmapboxgl_map_observer.cpp | 2 +- platform/qt/src/qmapboxgl_map_observer.hpp | 2 +- platform/qt/src/qmapboxgl_renderer_observer.hpp | 4 ++-- src/mbgl/map/map_impl.cpp | 4 ++-- src/mbgl/map/map_impl.hpp | 2 +- src/mbgl/renderer/render_orchestrator.cpp | 10 +++++----- src/mbgl/renderer/render_tree.hpp | 1 + src/mbgl/renderer/renderer_impl.cpp | 3 ++- test/src/mbgl/test/stub_map_observer.hpp | 2 +- 18 files changed, 27 insertions(+), 25 deletions(-) diff --git a/include/mbgl/map/map_observer.hpp b/include/mbgl/map/map_observer.hpp index a79f5ac82d..7de6a3fa84 100644 --- a/include/mbgl/map/map_observer.hpp +++ b/include/mbgl/map/map_observer.hpp @@ -41,7 +41,7 @@ public: virtual void onDidFinishLoadingMap() {} virtual void onDidFailLoadingMap(MapLoadError, const std::string&) {} virtual void onWillStartRenderingFrame() {} - virtual void onDidFinishRenderingFrame(RenderMode) {} + virtual void onDidFinishRenderingFrame(RenderMode, bool /*placementChanged*/) {} virtual void onWillStartRenderingMap() {} virtual void onDidFinishRenderingMap(RenderMode) {} virtual void onDidFinishLoadingStyle() {} diff --git a/include/mbgl/renderer/renderer_observer.hpp b/include/mbgl/renderer/renderer_observer.hpp index 4d21a0aaee..e0fc84215e 100644 --- a/include/mbgl/renderer/renderer_observer.hpp +++ b/include/mbgl/renderer/renderer_observer.hpp @@ -26,8 +26,8 @@ public: // Start of frame, initial is the first frame for this map virtual void onWillStartRenderingFrame() {} - // End of frame, boolean flags that a repaint is required - virtual void onDidFinishRenderingFrame(RenderMode, bool) {} + // End of frame, booleans flags that a repaint is required and that placement changed. + virtual void onDidFinishRenderingFrame(RenderMode, bool /*repaint*/, bool /*placementChanged*/) {} // Final frame virtual void onDidFinishRenderingMap() {} diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 6862fabcb4..d1a2624f0d 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -42,8 +42,8 @@ public: delegate.invoke(&RendererObserver::onWillStartRenderingFrame); } - void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded) override { - delegate.invoke(&RendererObserver::onDidFinishRenderingFrame, mode, repaintNeeded); + void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded, bool placementChanged) override { + delegate.invoke(&RendererObserver::onDidFinishRenderingFrame, mode, repaintNeeded, placementChanged); } void onDidFinishRenderingMap() override { diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 48b65c4c02..e94ef0153e 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -185,7 +185,7 @@ void NativeMapView::onWillStartRenderingFrame() { } } -void NativeMapView::onDidFinishRenderingFrame(MapObserver::RenderMode mode) { +void NativeMapView::onDidFinishRenderingFrame(MapObserver::RenderMode mode, bool) { assert(vm != nullptr); android::UniqueEnv _env = android::AttachEnv(); diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 4ea4781b36..10b2af0669 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -62,7 +62,7 @@ public: void onDidFinishLoadingMap() override; void onDidFailLoadingMap(MapLoadError, const std::string&) override; void onWillStartRenderingFrame() override; - void onDidFinishRenderingFrame(MapObserver::RenderMode) override; + void onDidFinishRenderingFrame(MapObserver::RenderMode, bool) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(MapObserver::RenderMode) override; void onDidBecomeIdle() override; diff --git a/platform/ios/src/MGLMapView+Impl.h b/platform/ios/src/MGLMapView+Impl.h index 0a62b7da82..66dc408274 100644 --- a/platform/ios/src/MGLMapView+Impl.h +++ b/platform/ios/src/MGLMapView+Impl.h @@ -62,7 +62,7 @@ public: void onDidFinishLoadingMap() override; void onDidFailLoadingMap(mbgl::MapLoadError mapError, const std::string& what) override; void onWillStartRenderingFrame() override; - void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode) override; + void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode, bool) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(mbgl::MapObserver::RenderMode) override; void onDidFinishLoadingStyle() override; diff --git a/platform/ios/src/MGLMapView+Impl.mm b/platform/ios/src/MGLMapView+Impl.mm index 1bccfa662f..76c9c0f9ba 100644 --- a/platform/ios/src/MGLMapView+Impl.mm +++ b/platform/ios/src/MGLMapView+Impl.mm @@ -68,7 +68,7 @@ void MGLMapViewImpl::onWillStartRenderingFrame() { [mapView mapViewWillStartRenderingFrame]; } -void MGLMapViewImpl::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode) { +void MGLMapViewImpl::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode, bool) { bool fullyRendered = mode == mbgl::MapObserver::RenderMode::Full; [mapView mapViewDidFinishRenderingFrameFullyRendered:fullyRendered]; } diff --git a/platform/macos/src/MGLMapView+Impl.h b/platform/macos/src/MGLMapView+Impl.h index 2d523716d4..de235fa147 100644 --- a/platform/macos/src/MGLMapView+Impl.h +++ b/platform/macos/src/MGLMapView+Impl.h @@ -30,7 +30,7 @@ public: void onDidFinishLoadingMap() override; void onDidFailLoadingMap(mbgl::MapLoadError mapError, const std::string& what) override; void onWillStartRenderingFrame() override; - void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode) override; + void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode, bool /*placementChanged*/) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(mbgl::MapObserver::RenderMode) override; void onDidFinishLoadingStyle() override; diff --git a/platform/macos/src/MGLMapView+Impl.mm b/platform/macos/src/MGLMapView+Impl.mm index 2354f67a6d..1ed5e2ceef 100644 --- a/platform/macos/src/MGLMapView+Impl.mm +++ b/platform/macos/src/MGLMapView+Impl.mm @@ -67,7 +67,7 @@ void MGLMapViewImpl::onWillStartRenderingFrame() { [mapView mapViewWillStartRenderingFrame]; } -void MGLMapViewImpl::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode) { +void MGLMapViewImpl::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode, bool) { bool fullyRendered = mode == mbgl::MapObserver::RenderMode::Full; [mapView mapViewDidFinishRenderingFrameFullyRendered:fullyRendered]; } diff --git a/platform/qt/src/qmapboxgl_map_observer.cpp b/platform/qt/src/qmapboxgl_map_observer.cpp index 4a842026cd..7d2af08cc4 100644 --- a/platform/qt/src/qmapboxgl_map_observer.cpp +++ b/platform/qt/src/qmapboxgl_map_observer.cpp @@ -77,7 +77,7 @@ void QMapboxGLMapObserver::onWillStartRenderingFrame() emit mapChanged(QMapboxGL::MapChangeWillStartRenderingFrame); } -void QMapboxGLMapObserver::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode) +void QMapboxGLMapObserver::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode, bool) { if (mode == mbgl::MapObserver::RenderMode::Partial) { emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingFrame); diff --git a/platform/qt/src/qmapboxgl_map_observer.hpp b/platform/qt/src/qmapboxgl_map_observer.hpp index a12e5e9c70..1620c1ef87 100644 --- a/platform/qt/src/qmapboxgl_map_observer.hpp +++ b/platform/qt/src/qmapboxgl_map_observer.hpp @@ -28,7 +28,7 @@ public: void onDidFinishLoadingMap() final; void onDidFailLoadingMap(mbgl::MapLoadError, const std::string&) final; void onWillStartRenderingFrame() final; - void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode) final; + void onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode, bool /*placementChanged*/) final; void onWillStartRenderingMap() final; void onDidFinishRenderingMap(mbgl::MapObserver::RenderMode) final; void onDidFinishLoadingStyle() final; diff --git a/platform/qt/src/qmapboxgl_renderer_observer.hpp b/platform/qt/src/qmapboxgl_renderer_observer.hpp index ee340113ff..78dd6b91d6 100644 --- a/platform/qt/src/qmapboxgl_renderer_observer.hpp +++ b/platform/qt/src/qmapboxgl_renderer_observer.hpp @@ -37,8 +37,8 @@ public: delegate.invoke(&mbgl::RendererObserver::onWillStartRenderingFrame); } - void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded) final { - delegate.invoke(&mbgl::RendererObserver::onDidFinishRenderingFrame, mode, repaintNeeded); + void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded, bool placementChanged) final { + delegate.invoke(&mbgl::RendererObserver::onDidFinishRenderingFrame, mode, repaintNeeded, placementChanged); } void onDidFinishRenderingMap() final { diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index ce36583ab3..ea55dfd1a8 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -130,11 +130,11 @@ void Map::Impl::onWillStartRenderingFrame() { } } -void Map::Impl::onDidFinishRenderingFrame(RenderMode renderMode, bool needsRepaint) { +void Map::Impl::onDidFinishRenderingFrame(RenderMode renderMode, bool needsRepaint, bool placemenChanged) { rendererFullyLoaded = renderMode == RenderMode::Full; if (mode == MapMode::Continuous) { - observer.onDidFinishRenderingFrame(MapObserver::RenderMode(renderMode)); + observer.onDidFinishRenderingFrame(MapObserver::RenderMode(renderMode), placemenChanged); if (needsRepaint || transform.inTransition()) { onUpdate(); diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index 13a68fb25e..416662f9e5 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -42,7 +42,7 @@ public: void onInvalidate() final; void onResourceError(std::exception_ptr) final; void onWillStartRenderingFrame() final; - void onDidFinishRenderingFrame(RenderMode, bool) final; + void onDidFinishRenderingFrame(RenderMode, bool, bool) final; void onWillStartRenderingMap() final; void onDidFinishRenderingMap() final; void onStyleImageMissing(const std::string&, std::function) final; diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index f9956dbc2a..983bc09485 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -361,9 +361,9 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } bool symbolBucketsChanged = false; - const bool placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()); + renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()); std::set usedSymbolLayers; - if (placementChanged) { + if (renderTreeParameters->placementChanged) { placement = std::make_unique( updateParameters.transformState, updateParameters.mode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions, @@ -374,13 +374,13 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar const RenderLayer& layer = *it; if (crossTileSymbolIndex.addLayer(layer, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true; - if (placementChanged) { + if (renderTreeParameters->placementChanged) { usedSymbolLayers.insert(layer.getID()); placement->placeLayer(layer, renderTreeParameters->transformParams.projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); } } - if (placementChanged) { + if (renderTreeParameters->placementChanged) { placement->commit(updateParameters.timePoint, updateParameters.transformState.getZoom()); crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers); for (const auto& entry : renderSources) { @@ -391,7 +391,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - placement->updateLayerBuckets(*it, updateParameters.transformState, placementChanged || symbolBucketsChanged); + placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged || symbolBucketsChanged); } renderTreeParameters->symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint); diff --git a/src/mbgl/renderer/render_tree.hpp b/src/mbgl/renderer/render_tree.hpp index cf62ccb03e..557442c0fa 100644 --- a/src/mbgl/renderer/render_tree.hpp +++ b/src/mbgl/renderer/render_tree.hpp @@ -52,6 +52,7 @@ public: float symbolFadeChange = 0.0f; bool needsRepaint = false; bool loaded = false; + bool placementChanged = false; }; class RenderTree { diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 990d9cd3ab..c12f12c06a 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -212,7 +212,8 @@ void Renderer::Impl::render(const RenderTree& renderTree) { observer->onDidFinishRenderingFrame( renderTreeParameters.loaded ? RendererObserver::RenderMode::Full : RendererObserver::RenderMode::Partial, - renderTreeParameters.needsRepaint + renderTreeParameters.needsRepaint, + renderTreeParameters.placementChanged ); if (!renderTreeParameters.loaded) { diff --git a/test/src/mbgl/test/stub_map_observer.hpp b/test/src/mbgl/test/stub_map_observer.hpp index 00a039e732..da150ea83c 100644 --- a/test/src/mbgl/test/stub_map_observer.hpp +++ b/test/src/mbgl/test/stub_map_observer.hpp @@ -32,7 +32,7 @@ public: } } - void onDidFinishRenderingFrame(RenderMode mode) final { + void onDidFinishRenderingFrame(RenderMode mode, bool) final { if (didFinishRenderingFrameCallback) { didFinishRenderingFrameCallback(mode); } -- cgit v1.2.1