diff options
-rw-r--r-- | include/mbgl/map/map.hpp | 3 | ||||
-rw-r--r-- | platform/default/glfw_view.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/map/live_tile_data.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/map/live_tile_data.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 14 | ||||
-rw-r--r-- | src/mbgl/map/map_data.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/map_data.hpp | 11 | ||||
-rw-r--r-- | src/mbgl/map/source.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/map/source.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/tile_data.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/map/vector_tile_data.cpp | 18 | ||||
-rw-r--r-- | src/mbgl/map/vector_tile_data.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_symbol.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/symbol_bucket.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/text/collision_tile.hpp | 8 |
15 files changed, 71 insertions, 25 deletions
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index e71c5f5b4d..ccc963d086 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -131,6 +131,9 @@ public: void setDebug(bool value); void toggleDebug(); bool getDebug() const; + void setCollisionDebug(bool value); + void toggleCollisionDebug(); + bool getCollisionDebug() const; bool isFullyLoaded() const; private: diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 8265bb8bb6..14317ea4e7 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -87,6 +87,9 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, case GLFW_KEY_TAB: view->map->toggleDebug(); break; + case GLFW_KEY_C: + view->map->toggleCollisionDebug(); + break; case GLFW_KEY_X: if (!mods) view->map->resetPosition(); diff --git a/src/mbgl/map/live_tile_data.cpp b/src/mbgl/map/live_tile_data.cpp index 54b3948906..d63ea43470 100644 --- a/src/mbgl/map/live_tile_data.cpp +++ b/src/mbgl/map/live_tile_data.cpp @@ -17,9 +17,10 @@ LiveTileData::LiveTileData(const TileID& id_, SpriteAtlas& spriteAtlas_, util::ptr<Sprite> sprite_, const SourceInfo& source_, - float angle_) + float angle_, + bool collisionDebug_) : VectorTileData::VectorTileData(id_, mapMaxZoom, style_, glyphAtlas_, glyphStore_, - spriteAtlas_, sprite_, source_, angle_), + spriteAtlas_, sprite_, source_, angle_, collisionDebug_), annotationManager(annotationManager_) { // live features are always ready setState(State::loaded); diff --git a/src/mbgl/map/live_tile_data.hpp b/src/mbgl/map/live_tile_data.hpp index c237cddc95..0247c47fa7 100644 --- a/src/mbgl/map/live_tile_data.hpp +++ b/src/mbgl/map/live_tile_data.hpp @@ -18,7 +18,8 @@ public: SpriteAtlas&, util::ptr<Sprite>, const SourceInfo&, - float); + float, + bool); ~LiveTileData(); void parse() override; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 8514c6ecb2..3ba82252de 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -290,6 +290,20 @@ bool Map::getDebug() const { return data->getDebug(); } +void Map::setCollisionDebug(bool value) { + data->setCollisionDebug(value); + update(); +} + +void Map::toggleCollisionDebug() { + data->toggleCollisionDebug(); + update(); +} + +bool Map::getCollisionDebug() const { + return data->getCollisionDebug(); +} + bool Map::isFullyLoaded() const { return data->getFullyLoaded(); } diff --git a/src/mbgl/map/map_data.cpp b/src/mbgl/map/map_data.cpp index 23bc094990..993edb38e8 100644 --- a/src/mbgl/map/map_data.cpp +++ b/src/mbgl/map/map_data.cpp @@ -41,4 +41,4 @@ std::vector<std::string> MapData::getClasses() const { return classes; } -}
\ No newline at end of file +} diff --git a/src/mbgl/map/map_data.hpp b/src/mbgl/map/map_data.hpp index 54114b9d0c..803a9b1acb 100644 --- a/src/mbgl/map/map_data.hpp +++ b/src/mbgl/map/map_data.hpp @@ -64,6 +64,16 @@ public: debug = value; } + inline bool getCollisionDebug() const { + return collisionDebug; + } + inline bool toggleCollisionDebug() { + return collisionDebug ^= 1u; + } + inline void setCollisionDebug(bool value) { + collisionDebug = value; + } + inline bool getFullyLoaded() const { return loaded; } @@ -98,6 +108,7 @@ private: std::string accessToken; std::vector<std::string> classes; std::atomic<uint8_t> debug { false }; + std::atomic<uint8_t> collisionDebug { false }; std::atomic<bool> loaded { false }; std::atomic<Duration> animationTime; std::atomic<Duration> defaultTransitionDuration; diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 01057103ef..3d7ab6fd32 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -288,7 +288,7 @@ TileData::State Source::addTile(MapData& data, if (info.type == SourceType::Vector) { new_tile.data = std::make_shared<VectorTileData>(normalized_id, data.transform.getMaxZoom(), style, glyphAtlas, - glyphStore, spriteAtlas, sprite, info, transformState.getAngle()); + glyphStore, spriteAtlas, sprite, info, transformState.getAngle(), data.getCollisionDebug()); new_tile.data->request(style.workers, transformState.getPixelRatio(), callback); } else if (info.type == SourceType::Raster) { new_tile.data = std::make_shared<RasterTileData>(normalized_id, texturePool, info); @@ -296,7 +296,7 @@ TileData::State Source::addTile(MapData& data, } else if (info.type == SourceType::Annotations) { new_tile.data = std::make_shared<LiveTileData>(normalized_id, data.annotationManager, data.transform.getMaxZoom(), style, glyphAtlas, - glyphStore, spriteAtlas, sprite, info, transformState.getAngle()); + glyphStore, spriteAtlas, sprite, info, transformState.getAngle(), data.getCollisionDebug()); new_tile.data->reparse(style.workers, callback); } else { throw std::runtime_error("source type not implemented"); @@ -497,7 +497,7 @@ bool Source::update(MapData& data, updateTilePtrs(); - redoPlacement(transformState); + redoPlacement(transformState, data.getCollisionDebug()); updated = data.getAnimationTime(); @@ -520,9 +520,9 @@ void Source::updateTilePtrs() { } } -void Source::redoPlacement(const TransformState& transformState) { +void Source::redoPlacement(const TransformState& transformState, bool collisionDebug) { for (auto& tilePtr : tilePtrs) { - tilePtr->data->redoPlacement(transformState.getAngle()); + tilePtr->data->redoPlacement(transformState.getAngle(), collisionDebug); } } diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp index 2c5ac85f49..505292cc74 100644 --- a/src/mbgl/map/source.hpp +++ b/src/mbgl/map/source.hpp @@ -101,7 +101,7 @@ public: bool enabled; private: - void redoPlacement(const TransformState& transformState); + void redoPlacement(const TransformState& transformState, bool collisionDebug); void emitSourceLoaded(); void emitTileLoaded(bool isNewTile); diff --git a/src/mbgl/map/tile_data.hpp b/src/mbgl/map/tile_data.hpp index d1ca10ddd4..1ec58ec839 100644 --- a/src/mbgl/map/tile_data.hpp +++ b/src/mbgl/map/tile_data.hpp @@ -80,7 +80,7 @@ public: virtual void parse() = 0; virtual Bucket* getBucket(StyleLayer const &layer_desc) = 0; - virtual void redoPlacement(float) {} + virtual void redoPlacement(float, bool) {} const TileID id; const std::string name; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 312dde7f57..c453d893a8 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -22,7 +22,8 @@ VectorTileData::VectorTileData(const TileID& id_, SpriteAtlas& spriteAtlas_, util::ptr<Sprite> sprite_, const SourceInfo& source_, - float angle) + float angle, + bool collisionDebug) : TileData(id_, source_), depth(id_.z >= source_.max_zoom ? mapMaxZoom - id_.z : 1), glyphAtlas(glyphAtlas_), @@ -30,7 +31,7 @@ VectorTileData::VectorTileData(const TileID& id_, spriteAtlas(spriteAtlas_), sprite(sprite_), style(style_), - collision(util::make_unique<CollisionTile>(id_.z, 4096, source_.tile_size, angle)), + collision(util::make_unique<CollisionTile>(id_.z, 4096, source_.tile_size, angle, collisionDebug)), lastAngle(angle), currentAngle(angle) { } @@ -116,26 +117,29 @@ void VectorTileData::setState(const State& state_) { } void VectorTileData::redoPlacement() { - redoPlacement(lastAngle); + redoPlacement(lastAngle, lastCollisionDebug); } -void VectorTileData::redoPlacement(float angle) { - if (angle != currentAngle) { +void VectorTileData::redoPlacement(float angle, bool collisionDebug) { + if (angle != currentAngle || collisionDebug != currentCollisionDebug) { lastAngle = angle; + lastCollisionDebug = collisionDebug; if (getState() != State::parsed || redoingPlacement) return; redoingPlacement = true; currentAngle = angle; + currentCollisionDebug = collisionDebug; auto callback = std::bind(&VectorTileData::endRedoPlacement, this); - workRequest = style.workers.send([this, angle] { workerRedoPlacement(angle); }, callback); + workRequest = style.workers.send([this, angle, collisionDebug] { workerRedoPlacement(angle, collisionDebug); }, callback); } } -void VectorTileData::workerRedoPlacement(float angle) { +void VectorTileData::workerRedoPlacement(float angle, bool collisionDebug) { collision->reset(angle, 0); + collision->setDebug(collisionDebug); for (const auto& layer_desc : style.layers) { auto bucket = getBucket(*layer_desc); if (bucket) { diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index eea353bd96..95a389c199 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -40,11 +40,12 @@ public: SpriteAtlas&, util::ptr<Sprite>, const SourceInfo&, - float); + float, + bool); ~VectorTileData(); void parse() override; - void redoPlacement(float angle) override; + void redoPlacement(float angle, bool collisionDebug) override; virtual Bucket* getBucket(StyleLayer const &layer_desc) override; size_t countBuckets() const; @@ -88,9 +89,11 @@ private: float lastAngle = 0; float currentAngle; + bool lastCollisionDebug = 0; + bool currentCollisionDebug = 0; bool redoingPlacement = false; void endRedoPlacement(); - void workerRedoPlacement(float angle); + void workerRedoPlacement(float angle, bool collisionDebug); }; } diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 73b3c41623..6ef39e2853 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -193,7 +193,9 @@ void Painter::renderSymbol(SymbolBucket &bucket, const StyleLayer &layer_desc, c &SymbolBucket::drawGlyphs); } - if (bucket.hasCollisionBoxData()) { + if (bucket.hasCollisionBoxData() && ( + (bucket.hasIconData() && properties.icon.opacity) || + (bucket.hasTextData() && properties.text.opacity))) { config.stencilTest = true; useProgram(collisionBoxShader->program); diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 6995d7a043..e336ea7594 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -385,7 +385,7 @@ void SymbolBucket::placeFeatures(bool swapImmediately) { } } - addToDebugBuffers(); + if (collision.getDebug()) addToDebugBuffers(); if (swapImmediately) swapRenderData(); } diff --git a/src/mbgl/text/collision_tile.hpp b/src/mbgl/text/collision_tile.hpp index d010353fb8..b0c56e6f5b 100644 --- a/src/mbgl/text/collision_tile.hpp +++ b/src/mbgl/text/collision_tile.hpp @@ -34,13 +34,16 @@ namespace mbgl { class CollisionTile { public: - inline explicit CollisionTile(float _zoom, float tileExtent, float tileSize, float angle_) : - zoom(_zoom), tilePixelRatio(tileExtent / tileSize) { reset(angle_, 0); } + inline explicit CollisionTile(float _zoom, float tileExtent, float tileSize, float angle_, bool debug_) : + zoom(_zoom), tilePixelRatio(tileExtent / tileSize), debug(debug_) { reset(angle_, 0); } void reset(const float angle, const float pitch); float placeFeature(const CollisionFeature &feature); void insertFeature(CollisionFeature &feature, const float minPlacementScale); + void setDebug(bool debug_) { debug = debug_; } + bool getDebug() { return debug; } + const float zoom; const float tilePixelRatio; float angle = 0; @@ -55,6 +58,7 @@ class CollisionTile { Tree tree; std::array<float, 4> rotationMatrix; float yStretch; + bool debug; }; } |