From dc1630f50d1a3493acd2afe42aa2b8dd2e8876fb Mon Sep 17 00:00:00 2001 From: Mike Morris Date: Tue, 27 Oct 2015 17:46:19 -0400 Subject: [PATCH 1/2] [core] always add labels to buffers in MapMode::Still To minimize label clipping. --- src/mbgl/layer/symbol_layer.cpp | 3 ++- src/mbgl/map/source.cpp | 1 + src/mbgl/map/tile_worker.cpp | 9 ++++++--- src/mbgl/map/tile_worker.hpp | 5 ++++- src/mbgl/map/vector_tile_data.cpp | 4 +++- src/mbgl/map/vector_tile_data.hpp | 1 + src/mbgl/renderer/symbol_bucket.cpp | 6 +++--- src/mbgl/renderer/symbol_bucket.hpp | 4 +++- src/mbgl/style/style.cpp | 1 + src/mbgl/style/style_bucket_parameters.hpp | 8 ++++++-- src/mbgl/style/style_update_parameters.hpp | 3 +++ 11 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp index 25dfeeae0ac..e05b27bffc4 100644 --- a/src/mbgl/layer/symbol_layer.cpp +++ b/src/mbgl/layer/symbol_layer.cpp @@ -114,7 +114,8 @@ bool SymbolLayer::recalculate(const StyleCalculationParameters& parameters) { std::unique_ptr SymbolLayer::createBucket(StyleBucketParameters& parameters) const { auto bucket = std::make_unique(parameters.tileID.overscaling, - parameters.tileID.z); + parameters.tileID.z, + parameters.mode); bucket->layout = layout; diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index c7e064c13cb..107c405efe9 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -330,6 +330,7 @@ TileData::State Source::addTile(const TileID& id, const StyleUpdateParameters& p std::move(monitor), info.source_id, parameters.style, + parameters.mode, callback); } diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index c35b3d8b3cd..f483082cfcd 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -21,13 +21,15 @@ TileWorker::TileWorker(TileID id_, SpriteStore& spriteStore_, GlyphAtlas& glyphAtlas_, GlyphStore& glyphStore_, - const std::atomic& state_) + const std::atomic& state_, + const MapMode mode_) : id(id_), sourceID(std::move(sourceID_)), spriteStore(spriteStore_), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), - state(state_) { + state(state_), + mode(mode_) { } TileWorker::~TileWorker() { @@ -140,7 +142,8 @@ void TileWorker::parseLayer(const StyleLayer* layer, const GeometryTile& geometr spriteStore, glyphAtlas, glyphStore, - *collisionTile); + *collisionTile, + mode); std::unique_ptr bucket = layer->createBucket(parameters); diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index d25b6e50f27..74894a9eb81 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -3,6 +3,7 @@ #include +#include #include #include #include @@ -44,7 +45,8 @@ class TileWorker : public util::noncopyable { SpriteStore&, GlyphAtlas&, GlyphStore&, - const std::atomic&); + const std::atomic&, + const MapMode); ~TileWorker(); TileParseResult parseAllLayers(std::vector>, @@ -67,6 +69,7 @@ class TileWorker : public util::noncopyable { GlyphAtlas& glyphAtlas; GlyphStore& glyphStore; const std::atomic& state; + const MapMode mode; bool partialParse = false; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 3fe423b5021..048cadc9877 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -12,6 +12,7 @@ VectorTileData::VectorTileData(const TileID& id_, std::unique_ptr monitor_, std::string sourceID, Style& style_, + const MapMode mode_, const std::function& callback) : TileData(id_), style(style_), @@ -21,7 +22,8 @@ VectorTileData::VectorTileData(const TileID& id_, *style_.spriteStore, *style_.glyphAtlas, *style_.glyphStore, - state), + state, + mode_), monitor(std::move(monitor_)) { state = State::loading; diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index 1b31f3db861..3d877de6003 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -22,6 +22,7 @@ class VectorTileData : public TileData { std::unique_ptr monitor, std::string sourceID, Style&, + const MapMode, const std::function& callback); ~VectorTileData(); diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index cb8b29b471c..d8273fd4f8a 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -53,8 +53,8 @@ SymbolInstance::SymbolInstance(Anchor& anchor, const std::vector& li iconCollisionFeature(line, anchor, shapedIcon, iconBoxScale, iconPadding, iconAlongLine) {}; -SymbolBucket::SymbolBucket(float overscaling_, float zoom_) - : overscaling(overscaling_), zoom(zoom_), tileSize(512 * overscaling_), tilePixelRatio(tileExtent / tileSize) { +SymbolBucket::SymbolBucket(float overscaling_, float zoom_, const MapMode mode_) + : overscaling(overscaling_), zoom(zoom_), tileSize(512 * overscaling_), tilePixelRatio(tileExtent / tileSize), mode(mode_) { } SymbolBucket::~SymbolBucket() { @@ -329,7 +329,7 @@ void SymbolBucket::addFeature(const std::vector> &lines, // the buffers for both tiles and clipped to tile boundaries at draw time. // // TODO remove the `&& false` when is #1673 implemented - const bool addToBuffers = inside || (mayOverlap && false); + const bool addToBuffers = (mode == MapMode::Still) || inside || (mayOverlap && false); symbolInstances.emplace_back(anchor, line, shapedText, shapedIcon, layout, addToBuffers, textBoxScale, textPadding, textAlongLine, diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 7150c9808c5..b447db4ec98 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -65,7 +66,7 @@ class SymbolBucket : public Bucket { typedef ElementGroup<1> CollisionBoxElementGroup; public: - SymbolBucket(float overscaling, float zoom); + SymbolBucket(float overscaling, float zoom, const MapMode); ~SymbolBucket() override; void upload() override; @@ -119,6 +120,7 @@ class SymbolBucket : public Bucket { const float tileSize; const float tileExtent = 4096.0f; const float tilePixelRatio; + const MapMode mode; std::set ranges; std::vector symbolInstances; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index b1c867a692a..5c6869ac77b 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -132,6 +132,7 @@ void Style::update(const TransformState& transform, workers, texturePool, shouldReparsePartialTiles, + data.mode, data, *this); diff --git a/src/mbgl/style/style_bucket_parameters.hpp b/src/mbgl/style/style_bucket_parameters.hpp index 5a84a33d48c..732ebade1d6 100644 --- a/src/mbgl/style/style_bucket_parameters.hpp +++ b/src/mbgl/style/style_bucket_parameters.hpp @@ -1,6 +1,7 @@ #ifndef STYLE_BUCKET_PARAMETERS #define STYLE_BUCKET_PARAMETERS +#include #include #include @@ -26,7 +27,8 @@ class StyleBucketParameters { SpriteStore& spriteStore_, GlyphAtlas& glyphAtlas_, GlyphStore& glyphStore_, - CollisionTile& collisionTile_) + CollisionTile& collisionTile_, + const MapMode mode_) : tileID(tileID_), layer(layer_), state(state_), @@ -35,7 +37,8 @@ class StyleBucketParameters { spriteStore(spriteStore_), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), - collisionTile(collisionTile_) {} + collisionTile(collisionTile_), + mode(mode_) {} bool cancelled() const { return state == TileData::State::obsolete; @@ -52,6 +55,7 @@ class StyleBucketParameters { GlyphAtlas& glyphAtlas; GlyphStore& glyphStore; CollisionTile& collisionTile; + const MapMode mode; }; } // namespace mbgl diff --git a/src/mbgl/style/style_update_parameters.hpp b/src/mbgl/style/style_update_parameters.hpp index 7a0f34bf56f..0a646219f06 100644 --- a/src/mbgl/style/style_update_parameters.hpp +++ b/src/mbgl/style/style_update_parameters.hpp @@ -20,6 +20,7 @@ class StyleUpdateParameters { Worker& worker_, TexturePool& texturePool_, bool shouldReparsePartialTiles_, + const MapMode mode_, MapData& data_, Style& style_) : pixelRatio(pixelRatio_), @@ -29,6 +30,7 @@ class StyleUpdateParameters { worker(worker_), texturePool(texturePool_), shouldReparsePartialTiles(shouldReparsePartialTiles_), + mode(mode_), data(data_), style(style_) {} @@ -39,6 +41,7 @@ class StyleUpdateParameters { Worker& worker; TexturePool& texturePool; bool shouldReparsePartialTiles; + const MapMode mode; // TODO: remove MapData& data; From 1dd1543905d70971009d333c42548dde6e2ad253 Mon Sep 17 00:00:00 2001 From: Mike Morris Date: Mon, 21 Dec 2015 15:14:09 -0500 Subject: [PATCH 2/2] [core] clip labels to tiles in MapMode::Still --- src/mbgl/renderer/painter_symbol.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 53164991311..43cd3d54052 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -153,8 +153,8 @@ void Painter::renderSymbol(SymbolBucket& bucket, const SymbolLayer& layer, const } // TODO remove the `true ||` when #1673 is implemented - const bool drawAcrossEdges = true || !(layout.text.allowOverlap || layout.icon.allowOverlap || - layout.text.ignorePlacement || layout.icon.ignorePlacement); + const bool drawAcrossEdges = (data.mode == MapMode::Continuous) && (true || !(layout.text.allowOverlap || layout.icon.allowOverlap || + layout.text.ignorePlacement || layout.icon.ignorePlacement)); // Disable the stencil test so that labels aren't clipped to tile boundaries. //