diff options
author | Juha Alanen <juha.alanen@mapbox.com> | 2019-10-17 16:57:18 +0300 |
---|---|---|
committer | Juha Alanen <juha.alanen@mapbox.com> | 2019-10-21 16:27:45 +0300 |
commit | bb21217ed3f5ce80c677208f2f90e15a2f188a9b (patch) | |
tree | 18497b33575e36d00f1912442ace87584e51ed8b | |
parent | 050b3360ecef908d02141ed445d93ba5b4c9c75f (diff) | |
download | qtlocation-mapboxgl-bb21217ed3f5ce80c677208f2f90e15a2f188a9b.tar.gz |
[core] Add event to notify when RenderSource has been loaded
-rw-r--r-- | include/mbgl/map/map_observer.hpp | 1 | ||||
-rw-r--r-- | include/mbgl/renderer/renderer_observer.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/map/map_impl.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/render_source_observer.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_tile_source.cpp | 17 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_tile_source.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.hpp | 3 |
11 files changed, 42 insertions, 3 deletions
diff --git a/include/mbgl/map/map_observer.hpp b/include/mbgl/map/map_observer.hpp index 258699a2a6..2b469ee923 100644 --- a/include/mbgl/map/map_observer.hpp +++ b/include/mbgl/map/map_observer.hpp @@ -52,6 +52,7 @@ public: virtual void onDidFinishRenderingMap(RenderMode) {} virtual void onDidFinishLoadingStyle() {} virtual void onSourceChanged(style::Source&) {} + virtual void onDidFinishSourceLoad(const std::string&) {} virtual void onDidBecomeIdle() {} virtual void onStyleImageMissing(const std::string&) {} // This method should return true if unused image can be removed, diff --git a/include/mbgl/renderer/renderer_observer.hpp b/include/mbgl/renderer/renderer_observer.hpp index e0fc84215e..b54cbd005d 100644 --- a/include/mbgl/renderer/renderer_observer.hpp +++ b/include/mbgl/renderer/renderer_observer.hpp @@ -32,6 +32,9 @@ public: // Final frame virtual void onDidFinishRenderingMap() {} + // Source loaded + virtual void onRenderSourceLoaded(const std::string&) {} + // Style is missing an image using StyleImageMissingCallback = std::function<void()>; virtual void onStyleImageMissing(const std::string&, StyleImageMissingCallback done) { done(); } diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 69c3de9783..23c8615da7 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -154,14 +154,18 @@ void Map::Impl::onWillStartRenderingMap() { } void Map::Impl::onDidFinishRenderingMap() { - if (mode == MapMode::Continuous && loading) { + if (mode == MapMode::Continuous) { observer.onDidFinishRenderingMap(MapObserver::RenderMode::Full); if (loading) { loading = false; observer.onDidFinishLoadingMap(); } } -}; +} + +void Map::Impl::onRenderSourceLoaded(const std::string& source) { + observer.onDidFinishSourceLoad(source); +} void Map::Impl::jumpTo(const CameraOptions& camera) { cameraMutated = true; diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index 416662f9e5..6d5c596303 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -47,6 +47,7 @@ public: void onDidFinishRenderingMap() final; void onStyleImageMissing(const std::string&, std::function<void()>) final; void onRemoveUnusedStyleImages(const std::vector<std::string>&) final; + void onRenderSourceLoaded(const std::string&) final; // Map void jumpTo(const CameraOptions&); diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 50077784b5..d6e4064d6c 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -698,6 +698,10 @@ void RenderOrchestrator::onTileChanged(RenderSource&, const OverscaledTileID&) { observer->onInvalidate(); } +void RenderOrchestrator::onIdealTilesLoaded(RenderSource& source) { + observer->onRenderSourceLoaded(source.baseImpl->id); +} + void RenderOrchestrator::onStyleImageMissing(const std::string& id, std::function<void()> done) { observer->onStyleImageMissing(id, std::move(done)); } diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index c2b44c2792..eb19f754b4 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -98,6 +98,7 @@ private: // RenderSourceObserver implementation. void onTileChanged(RenderSource&, const OverscaledTileID&) override; void onTileError(RenderSource&, const OverscaledTileID&, std::exception_ptr) override; + void onIdealTilesLoaded(RenderSource&) override; // ImageManagerObserver implementation void onStyleImageMissing(const std::string&, std::function<void()>) override; diff --git a/src/mbgl/renderer/render_source_observer.hpp b/src/mbgl/renderer/render_source_observer.hpp index 792a18db2b..5308f95ae2 100644 --- a/src/mbgl/renderer/render_source_observer.hpp +++ b/src/mbgl/renderer/render_source_observer.hpp @@ -13,6 +13,7 @@ public: virtual void onTileChanged(RenderSource&, const OverscaledTileID&) {} virtual void onTileError(RenderSource&, const OverscaledTileID&, std::exception_ptr) {} + virtual void onIdealTilesLoaded(RenderSource&) {} }; } // namespace mbgl diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp index 221f976c50..73f01ead50 100644 --- a/src/mbgl/renderer/sources/render_tile_source.cpp +++ b/src/mbgl/renderer/sources/render_tile_source.cpp @@ -1,3 +1,4 @@ +#include <mbgl/renderer/render_source_observer.hpp> #include <mbgl/renderer/sources/render_tile_source.hpp> #include <mbgl/renderer/buckets/debug_bucket.hpp> @@ -158,6 +159,22 @@ void RenderTileSource::dumpDebugLogs() const { tilePyramid.dumpDebugLogs(); } +void RenderTileSource::onTileChanged(Tile& tile) { + observer->onTileChanged(*this, tile.id); + if (tile.isComplete()) { + const auto& idealTiles = tilePyramid.getIdealTileIDs(); + const auto tileID = tile.id.toUnwrapped(); + if (idealTiles.count(tileID)) { + idealTilesLoaded.insert(tileID); + } + if (idealTilesLoaded.size() < idealTiles.size()) { + return; + } + observer->onIdealTilesLoaded(*this); + idealTilesLoaded.clear(); + } +} + // RenderTileSetSource implementation RenderTileSetSource::RenderTileSetSource(Immutable<style::Source::Impl> impl_) diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp index 7756bd8ed0..c41a61db17 100644 --- a/src/mbgl/renderer/sources/render_tile_source.hpp +++ b/src/mbgl/renderer/sources/render_tile_source.hpp @@ -46,6 +46,8 @@ public: void dumpDebugLogs() const override; protected: + void onTileChanged(Tile&) override; + RenderTileSource(Immutable<style::Source::Impl>); TilePyramid tilePyramid; Immutable<std::vector<RenderTile>> renderTiles; @@ -55,6 +57,7 @@ protected: private: float bearing = 0.0F; SourceFeatureState featureState; + std::set<UnwrappedTileID> idealTilesLoaded; }; /** diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 586d3b5a8a..b5f6ac642b 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -115,6 +115,7 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l } idealTiles = util::tileCover(parameters.transformState, idealZoom); + idealTileIDs = std::set<UnwrappedTileID>(idealTiles.begin(), idealTiles.end()); } // Stores a list of all the tiles that we're definitely going to retain. There are two @@ -179,7 +180,7 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, renderTileFn, idealTiles, zoomRange, tileZoom); - + for (auto previouslyRenderedTile : previouslyRenderedTiles) { Tile& tile = previouslyRenderedTile.second; tile.markRenderedPreviously(); diff --git a/src/mbgl/renderer/tile_pyramid.hpp b/src/mbgl/renderer/tile_pyramid.hpp index 3b5cab5d6c..47828defa4 100644 --- a/src/mbgl/renderer/tile_pyramid.hpp +++ b/src/mbgl/renderer/tile_pyramid.hpp @@ -68,6 +68,8 @@ public: void updateFadingTiles(); bool hasFadingTiles() const { return fadingTiles; } + const std::set<UnwrappedTileID>& getIdealTileIDs() const { return idealTileIDs; } + private: void addRenderTile(const UnwrappedTileID& tileID, Tile& tile); @@ -80,6 +82,7 @@ private: float prevLng = 0; bool fadingTiles = false; + std::set<UnwrappedTileID> idealTileIDs; }; } // namespace mbgl |