diff options
author | Ansis Brammanis <ansis.brammanis@gmail.com> | 2017-11-02 14:26:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-02 14:26:38 -0400 |
commit | 486902be46974ae9829a7f42280153429a102a01 (patch) | |
tree | a88de1fb3d483e22704e2c321a38d1d849794735 /src/mbgl/renderer/renderer_impl.cpp | |
parent | 6c575d0559c9b9304d88187e9518a873aaee7c55 (diff) | |
download | qtlocation-mapboxgl-486902be46974ae9829a7f42280153429a102a01.tar.gz |
fade symbols across tiles (#10361)
Diffstat (limited to 'src/mbgl/renderer/renderer_impl.cpp')
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index c8bf0f9739..d96215a550 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -23,6 +23,7 @@ #include <mbgl/style/source_impl.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/text/glyph_manager.hpp> +#include <mbgl/text/cross_tile_symbol_index.hpp> #include <mbgl/tile/tile.hpp> #include <mbgl/util/math.hpp> #include <mbgl/util/string.hpp> @@ -57,6 +58,7 @@ Renderer::Impl::Impl(RendererBackend& backend_, , sourceImpls(makeMutable<std::vector<Immutable<style::Source::Impl>>>()) , layerImpls(makeMutable<std::vector<Immutable<style::Layer::Impl>>>()) , renderLight(makeMutable<Light::Impl>()) + , crossTileSymbolIndex(std::make_unique<CrossTileSymbolIndex>()) , placement(std::make_unique<Placement>(TransformState{}, MapMode::Still)) { glyphManager->setObserver(this); } @@ -364,6 +366,13 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { order.emplace_back(RenderItem { *layer, source }); } + bool symbolBucketsChanged = false; + for (auto it = order.rbegin(); it != order.rend(); ++it) { + if (it->layer.is<RenderSymbolLayer>()) { + if (crossTileSymbolIndex->addLayer(*it->layer.as<RenderSymbolLayer>())) symbolBucketsChanged = true; + } + } + auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode); for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is<RenderSymbolLayer>()) { @@ -375,10 +384,11 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (placementChanged) placement = std::move(newPlacement); parameters.symbolFadeChange = placement->symbolFadeChange(parameters.timePoint); - // TODO only update when necessary - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is<RenderSymbolLayer>()) { - placement->updateLayerOpacities(*it->layer.as<RenderSymbolLayer>()); + if (placementChanged || symbolBucketsChanged) { + for (auto it = order.rbegin(); it != order.rend(); ++it) { + if (it->layer.is<RenderSymbolLayer>()) { + placement->updateLayerOpacities(*it->layer.as<RenderSymbolLayer>()); + } } } |