From 8c3b3cb792d0157aee4918c4ece822ec0fcfb381 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 29 Oct 2015 14:26:34 -0700 Subject: [PATCH] [core] Use current copy of style layers when reparsing tiles This fixes adding shape annotations after VectorTileData objects have been created for annotations already, and will also be necessary for the dynamic Style API. --- src/mbgl/map/tile_worker.cpp | 8 ++++---- src/mbgl/map/tile_worker.hpp | 14 ++++++++------ src/mbgl/map/vector_tile_data.cpp | 8 ++++---- src/mbgl/map/vector_tile_data.hpp | 1 + src/mbgl/util/worker.cpp | 12 ++++++++---- src/mbgl/util/worker.hpp | 2 ++ 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index 96300a803..0262ed420 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -18,10 +18,8 @@ using namespace mbgl; TileWorker::TileWorker(TileID id_, std::string sourceID_, Style& style_, - std::vector> layers_, const std::atomic& state_) - : layers(std::move(layers_)), - id(id_), + : id(id_), sourceID(sourceID_), parameters(id.z), style(style_), @@ -33,7 +31,8 @@ TileWorker::~TileWorker() { style.glyphAtlas->removeGlyphs(reinterpret_cast(this)); } -TileParseResult TileWorker::parseAllLayers(const GeometryTile& geometryTile, +TileParseResult TileWorker::parseAllLayers(std::vector> layers, + const GeometryTile& geometryTile, PlacementConfig config) { // We're doing a fresh parse of the tile, because the underlying data has changed. pending.clear(); @@ -85,6 +84,7 @@ TileParseResult TileWorker::parsePendingLayers() { } void TileWorker::redoPlacement( + std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config) { diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index 44868a12f..fc6844445 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -42,16 +42,18 @@ public: TileWorker(TileID, std::string sourceID, Style&, - std::vector>, const std::atomic&); ~TileWorker(); - TileParseResult parseAllLayers(const GeometryTile&, PlacementConfig); - TileParseResult parsePendingLayers(); - void redoPlacement(const std::unordered_map>*, - PlacementConfig); + TileParseResult parseAllLayers(std::vector>, + const GeometryTile&, + PlacementConfig); - std::vector> layers; + TileParseResult parsePendingLayers(); + + void redoPlacement(std::vector>, + const std::unordered_map>*, + PlacementConfig); private: void parseLayer(const StyleLayer&, const GeometryTile&); diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 90603c0a6..0f383295f 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -16,16 +16,16 @@ VectorTileData::VectorTileData(const TileID& id_, Style& style_, const std::function& callback) : TileData(id_), + style(style_), worker(style_.workers), tileWorker(id_, sourceID, style_, - style_.layers, state), monitor(std::move(monitor_)) { state = State::loading; - req = monitor->monitorTile([callback, sourceID, this](std::exception_ptr err, std::unique_ptr tile) { + req = monitor->monitorTile([callback, this](std::exception_ptr err, std::unique_ptr tile) { if (err) { try { std::rethrow_exception(err); @@ -54,7 +54,7 @@ VectorTileData::VectorTileData(const TileID& id_, // when tile data changed. Replacing the workdRequest will cancel a pending work // request in case there is one. workRequest.reset(); - workRequest = worker.parseGeometryTile(tileWorker, std::move(tile), targetConfig, [callback, sourceID, this, config = targetConfig] (TileParseResult result) { + workRequest = worker.parseGeometryTile(tileWorker, style.layers, std::move(tile), targetConfig, [callback, this, config = targetConfig] (TileParseResult result) { workRequest.reset(); if (state == State::obsolete) { return; @@ -162,7 +162,7 @@ void VectorTileData::redoPlacement(const PlacementConfig newConfig) { void VectorTileData::redoPlacement() { workRequest.reset(); - workRequest = worker.redoPlacement(tileWorker, buckets, targetConfig, [this, config = targetConfig] { + workRequest = worker.redoPlacement(tileWorker, style.layers, buckets, targetConfig, [this, config = targetConfig] { workRequest.reset(); // Persist the configuration we just placed so that we can later check whether we need to diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index 1a082fc61..81064e313 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -36,6 +36,7 @@ public: void cancel() override; private: + Style& style; Worker& worker; TileWorker tileWorker; diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index b0005eda6..9940fb649 100644 --- a/src/mbgl/util/worker.cpp +++ b/src/mbgl/util/worker.cpp @@ -30,11 +30,12 @@ public: } void parseGeometryTile(TileWorker* worker, + std::vector> layers, std::unique_ptr tile, PlacementConfig config, std::function callback) { try { - callback(worker->parseAllLayers(*tile, config)); + callback(worker->parseAllLayers(layers, *tile, config)); } catch (const std::exception& ex) { callback(TileParseResult(ex.what())); } @@ -50,10 +51,11 @@ public: } void redoPlacement(TileWorker* worker, + std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config, std::function callback) { - worker->redoPlacement(buckets, config); + worker->redoPlacement(layers, buckets, config); callback(); } }; @@ -78,12 +80,13 @@ Worker::parseRasterTile(std::unique_ptr bucket, std::unique_ptr Worker::parseGeometryTile(TileWorker& worker, + std::vector> layers, std::unique_ptr tile, PlacementConfig config, std::function callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::parseGeometryTile, callback, &worker, - std::move(tile), config); + std::move(layers), std::move(tile), config); } std::unique_ptr @@ -96,12 +99,13 @@ Worker::parsePendingGeometryTileLayers(TileWorker& worker, std::unique_ptr Worker::redoPlacement(TileWorker& worker, + std::vector> layers, const std::unordered_map>& buckets, PlacementConfig config, std::function callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::redoPlacement, callback, &worker, - &buckets, config); + layers, &buckets, config); } } // end namespace mbgl diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp index e7bd3daad..f0f291e24 100644 --- a/src/mbgl/util/worker.hpp +++ b/src/mbgl/util/worker.hpp @@ -40,6 +40,7 @@ public: std::function callback); Request parseGeometryTile(TileWorker&, + std::vector>, std::unique_ptr, PlacementConfig, std::function callback); @@ -48,6 +49,7 @@ public: std::function callback); Request redoPlacement(TileWorker&, + std::vector>, const std::unordered_map>&, PlacementConfig config, std::function callback);