summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/renderer_impl.cpp
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2017-11-07 16:10:58 -0500
committerAnsis Brammanis <ansis@mapbox.com>2017-11-09 13:11:31 -0500
commitcd10190515693dae6cca7ad9087046a8dd2350a6 (patch)
tree4adc154d0a880486f0abc45c83755ca525375979 /src/mbgl/renderer/renderer_impl.cpp
parent0f4eed2959f7741ccf73dd79297b5fe17ff23829 (diff)
downloadqtlocation-mapboxgl-upstream/start-collision-async.tar.gz
partially do Placement asyncupstream/start-collision-async
Diffstat (limited to 'src/mbgl/renderer/renderer_impl.cpp')
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp35
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;
}