summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuha Alanen <juha.alanen@mapbox.com>2019-10-17 16:57:18 +0300
committerJuha Alanen <juha.alanen@mapbox.com>2019-10-21 16:27:45 +0300
commitbb21217ed3f5ce80c677208f2f90e15a2f188a9b (patch)
tree18497b33575e36d00f1912442ace87584e51ed8b
parent050b3360ecef908d02141ed445d93ba5b4c9c75f (diff)
downloadqtlocation-mapboxgl-bb21217ed3f5ce80c677208f2f90e15a2f188a9b.tar.gz
[core] Add event to notify when RenderSource has been loaded
-rw-r--r--include/mbgl/map/map_observer.hpp1
-rw-r--r--include/mbgl/renderer/renderer_observer.hpp3
-rw-r--r--src/mbgl/map/map_impl.cpp8
-rw-r--r--src/mbgl/map/map_impl.hpp1
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp4
-rw-r--r--src/mbgl/renderer/render_orchestrator.hpp1
-rw-r--r--src/mbgl/renderer/render_source_observer.hpp1
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.cpp17
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.hpp3
-rw-r--r--src/mbgl/renderer/tile_pyramid.cpp3
-rw-r--r--src/mbgl/renderer/tile_pyramid.hpp3
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