diff options
Diffstat (limited to 'src/mbgl/renderer/renderer_impl.cpp')
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 124c16cb64..420d90b327 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -322,46 +322,48 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { order.emplace_back(RenderItem { *layer, source }); } - bool symbolBucketsChanged = false; - if (parameters.mapMode != MapMode::Continuous) { - // TODO: Think about right way for symbol index to handle still rendering - crossTileSymbolIndex.reset(); - } - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is<RenderSymbolLayer>()) { - const float lng = parameters.state.getLatLng().longitude(); - if (crossTileSymbolIndex.addLayer(*it->layer.as<RenderSymbolLayer>(), lng)) symbolBucketsChanged = true; + { + if (parameters.mapMode != MapMode::Continuous) { + // TODO: Think about right way for symbol index to handle still rendering + crossTileSymbolIndex.reset(); } - } - bool placementChanged = false; - if (!placement->stillRecent(parameters.timePoint)) { - placementChanged = true; + std::vector<RenderItem> renderItemsWithSymbols; + std::copy_if(order.rbegin(), order.rend(), std::back_inserter(renderItemsWithSymbols), + [](const auto& item) { return item.layer.getSymbolInterface() != nullptr; }); - auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode, updateParameters.crossSourceCollisions); + bool symbolBucketsChanged = false; + const bool placementChanged = !placement->stillRecent(parameters.timePoint); + std::unique_ptr<Placement> newPlacement; std::set<std::string> usedSymbolLayers; - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is<RenderSymbolLayer>()) { - usedSymbolLayers.insert(it->layer.getID()); - newPlacement->placeLayer(*it->layer.as<RenderSymbolLayer>(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision); + + if (placementChanged) { + newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode, updateParameters.crossSourceCollisions); + } + + for (const auto& item : renderItemsWithSymbols) { + if (crossTileSymbolIndex.addLayer(*item.layer.getSymbolInterface(), parameters.state.getLatLng().longitude())) symbolBucketsChanged = true; + + if (newPlacement) { + usedSymbolLayers.insert(item.layer.getID()); + newPlacement->placeLayer(*item.layer.getSymbolInterface(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision); } } - newPlacement->commit(*placement, parameters.timePoint); - crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers); - placement = std::move(newPlacement); - - updateFadingTiles(); - } else { - placement->setStale(); - } + if (newPlacement) { + newPlacement->commit(*placement, parameters.timePoint); + crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers); + placement = std::move(newPlacement); + updateFadingTiles(); + } else { + placement->setStale(); + } - parameters.symbolFadeChange = placement->symbolFadeChange(parameters.timePoint); + parameters.symbolFadeChange = placement->symbolFadeChange(parameters.timePoint); - if (placementChanged || symbolBucketsChanged) { - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is<RenderSymbolLayer>()) { - placement->updateLayerOpacities(*it->layer.as<RenderSymbolLayer>()); + if (placementChanged || symbolBucketsChanged) { + for (const auto& item : renderItemsWithSymbols) { + placement->updateLayerOpacities(*item.layer.getSymbolInterface()); } } } |