diff options
Diffstat (limited to 'src/mbgl/renderer/renderer_impl.cpp')
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index af0c491e15..ddd5718601 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -59,7 +59,7 @@ Renderer::Impl::Impl(RendererBackend& backend_, , 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)) { + , placement(std::make_unique<Placement>(TransformState{}, MapMode::Still, mat4(), false, scheduler_)) { glyphManager->setObserver(this); } @@ -376,21 +376,30 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } } - bool placementChanged = false; if (!placement->stillRecent(parameters.timePoint)) { - auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode); - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is<RenderSymbolLayer>()) { - newPlacement->placeLayer(*it->layer.as<RenderSymbolLayer>(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision); + if (!placementInProgress) { + placementInProgress = std::make_unique<Placement>(parameters.state, parameters.mapMode, parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision, scheduler); + for (auto it = order.rbegin(); it != order.rend(); ++it) { + if (it->layer.is<RenderSymbolLayer>()) { + placementInProgress->addLayer(*it->layer.as<RenderSymbolLayer>()); + } } + placementInProgress->place(); } + } - placementChanged = newPlacement->commit(*placement, parameters.timePoint); - if (placementChanged || symbolBucketsChanged) { - placement = std::move(newPlacement); + bool placementChanged = false; + if (placementInProgress) { + if (placementInProgress->isReady()) { + placementChanged = placementInProgress->commit(*placement, parameters.timePoint); + if (placementChanged || symbolBucketsChanged) { + placement = std::move(placementInProgress); + placement->setStale(); + } else { + placement->setRecent(parameters.timePoint); + placementInProgress.reset(); + } } - - placement->setRecent(parameters.timePoint); } else { placement->setStale(); } @@ -654,7 +663,7 @@ std::vector<Feature> Renderer::Impl::queryRenderedFeatures(const ScreenLineStrin std::unordered_map<std::string, std::vector<Feature>> resultsByLayer; for (const auto& sourceID : sourceIDs) { if (RenderSource* renderSource = getRenderSource(sourceID)) { - auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options, placement->collisionIndex); + auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options, placement->result->collisionIndex); std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin())); } } @@ -730,7 +739,7 @@ bool Renderer::Impl::hasTransitions(TimePoint timePoint) const { } } - if (placement->hasTransitions(timePoint)) { + if (placement->hasTransitions(timePoint) || placementInProgress) { return true; } |