From 8962442b1b838445efaf8dc12003225facac2a06 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Thu, 28 May 2015 11:01:57 -0400 Subject: [PATCH] make collision debug boxes toggleable --- include/mbgl/map/map.hpp | 3 +++ platform/default/glfw_view.cpp | 3 +++ src/mbgl/map/live_tile_data.cpp | 5 +++-- src/mbgl/map/live_tile_data.hpp | 3 ++- src/mbgl/map/map.cpp | 14 ++++++++++++++ src/mbgl/map/map_data.cpp | 2 +- src/mbgl/map/map_data.hpp | 11 +++++++++++ src/mbgl/map/source.cpp | 10 +++++----- src/mbgl/map/source.hpp | 2 +- src/mbgl/map/tile_data.hpp | 2 +- src/mbgl/map/vector_tile_data.cpp | 18 +++++++++++------- src/mbgl/map/vector_tile_data.hpp | 9 ++++++--- src/mbgl/renderer/painter_symbol.cpp | 4 +++- src/mbgl/renderer/symbol_bucket.cpp | 2 +- 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 e71c5f5b4..ccc963d08 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 8265bb8bb..14317ea4e 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 54b394890..d63ea4347 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_, 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 c237cddc9..0247c47fa 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, const SourceInfo&, - float); + float, + bool); ~LiveTileData(); void parse() override; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 8514c6ecb..3ba82252d 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 23bc09499..993edb38e 100644 --- a/src/mbgl/map/map_data.cpp +++ b/src/mbgl/map/map_data.cpp @@ -41,4 +41,4 @@ std::vector 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 54114b9d0..803a9b1ac 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 classes; std::atomic debug { false }; + std::atomic collisionDebug { false }; std::atomic loaded { false }; std::atomic animationTime; std::atomic defaultTransitionDuration; diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 01057103e..3d7ab6fd3 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(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(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(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 2c5ac85f4..505292cc7 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 d1ca10ddd..1ec58ec83 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 312dde7f5..c453d893a 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_, 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(id_.z, 4096, source_.tile_size, angle)), + collision(util::make_unique(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 eea353bd9..95a389c19 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, 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 73b3c4162..6ef39e285 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 6995d7a04..e336ea759 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 d010353fb..b0c56e6f5 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 rotationMatrix; float yStretch; + bool debug; }; }