From bc92c2de3988a39d6def34617ade4afb5b82e214 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Fri, 14 Aug 2015 19:00:21 +0300 Subject: fix symbol collision detection in perspective view --- src/mbgl/map/live_tile_data.cpp | 2 +- src/mbgl/map/source.cpp | 8 ++++---- src/mbgl/map/tile_data.hpp | 2 +- src/mbgl/map/tile_worker.cpp | 4 ++-- src/mbgl/map/tile_worker.hpp | 2 +- src/mbgl/map/vector_tile_data.cpp | 15 ++++++++++----- src/mbgl/map/vector_tile_data.hpp | 5 ++++- src/mbgl/renderer/symbol_bucket.cpp | 2 +- src/mbgl/text/collision_tile.cpp | 2 +- src/mbgl/text/collision_tile.hpp | 6 +++--- src/mbgl/util/worker.cpp | 8 ++++---- src/mbgl/util/worker.hpp | 1 + 12 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/mbgl/map/live_tile_data.cpp b/src/mbgl/map/live_tile_data.cpp index 8be918d6d4..9ac9c730fe 100644 --- a/src/mbgl/map/live_tile_data.cpp +++ b/src/mbgl/map/live_tile_data.cpp @@ -27,7 +27,7 @@ LiveTileData::LiveTileData(const TileID& id_, state, std::make_unique(id_.z, 4096, source_.tile_size * id.overscaling, - 0, false)) { + 0, 0, false)) { state = State::loaded; if (!tile) { diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 4b2ae2cfbd..a3caab291e 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -284,8 +284,8 @@ TileData::State Source::addTile(MapData& data, // If we don't find working tile data, we're just going to load it. if (info.type == SourceType::Vector) { - auto tileData = std::make_shared(normalized_id, style, info, - transformState.getAngle(), data.getCollisionDebug()); + auto tileData = std::make_shared(normalized_id, style, info, + transformState.getAngle(), transformState.getPitch(), data.getCollisionDebug()); tileData->request(data.pixelRatio, callback); new_tile.data = tileData; } else if (info.type == SourceType::Raster) { @@ -506,7 +506,7 @@ bool Source::update(MapData& data, updateTilePtrs(); for (auto& tilePtr : tilePtrs) { - tilePtr->data->redoPlacement(transformState.getAngle(), data.getCollisionDebug()); + tilePtr->data->redoPlacement(transformState.getAngle(), transformState.getPitch(), data.getCollisionDebug()); } updated = data.getAnimationTime(); @@ -568,7 +568,7 @@ void Source::tileLoadingCompleteCallback(const TileID& normalized_id, const Tran return; } - data->redoPlacement(transformState.getAngle(), collisionDebug); + data->redoPlacement(transformState.getAngle(), transformState.getPitch(), collisionDebug); emitTileLoaded(true); } diff --git a/src/mbgl/map/tile_data.hpp b/src/mbgl/map/tile_data.hpp index e78d888415..047ccd5cd0 100644 --- a/src/mbgl/map/tile_data.hpp +++ b/src/mbgl/map/tile_data.hpp @@ -72,7 +72,7 @@ public: virtual Bucket* getBucket(const StyleLayer&) = 0; - virtual void redoPlacement(float, bool) {} + virtual void redoPlacement(float, float, bool) {} bool isReady() const { return isReadyState(state); diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index a555ca7ab0..0b9175c53a 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -55,8 +55,8 @@ TileParseResult TileWorker::parse(const GeometryTile& geometryTile) { return partialParse ? TileData::State::partial : TileData::State::parsed; } -void TileWorker::redoPlacement(float angle, bool collisionDebug) { - collision->reset(angle, 0); +void TileWorker::redoPlacement(float angle, float pitch, bool collisionDebug) { + collision->reset(angle, pitch); collision->setDebug(collisionDebug); for (auto i = layers.rbegin(); i != layers.rend(); i++) { auto bucket = getBucket(**i); diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index 15a5487dc9..b8a93011e3 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -44,7 +44,7 @@ public: Bucket* getBucket(const StyleLayer&) const; TileParseResult parse(const GeometryTile&); - void redoPlacement(float angle, bool collisionDebug); + void redoPlacement(float angle, float pitch, bool collisionDebug); std::vector> layers; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index c9ee33910b..60297396ed 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -16,6 +16,7 @@ VectorTileData::VectorTileData(const TileID& id_, Style& style_, const SourceInfo& source_, float angle, + float pitch, bool collisionDebug) : TileData(id_), worker(style_.workers), @@ -27,7 +28,7 @@ VectorTileData::VectorTileData(const TileID& id_, state, std::make_unique(id_.z, 4096, source_.tile_size * id.overscaling, - angle, collisionDebug)), + angle, pitch, collisionDebug)), source(source_), lastAngle(angle), currentAngle(angle) { @@ -98,11 +99,14 @@ Bucket* VectorTileData::getBucket(const StyleLayer& layer) { return tileWorker.getBucket(layer); } -void VectorTileData::redoPlacement(float angle, bool collisionDebug) { - if (angle == currentAngle && collisionDebug == currentCollisionDebug) +void VectorTileData::redoPlacement(float angle, float pitch, bool collisionDebug) { + if (angle == currentAngle && + pitch == currentPitch && + collisionDebug == currentCollisionDebug) return; lastAngle = angle; + lastPitch = pitch; lastCollisionDebug = collisionDebug; if (state != State::parsed || redoingPlacement) @@ -110,9 +114,10 @@ void VectorTileData::redoPlacement(float angle, bool collisionDebug) { redoingPlacement = true; currentAngle = angle; + currentPitch = pitch; currentCollisionDebug = collisionDebug; - workRequest = worker.redoPlacement(tileWorker, angle, collisionDebug, [this] { + workRequest = worker.redoPlacement(tileWorker, angle, pitch, collisionDebug, [this] { for (const auto& layer : tileWorker.layers) { auto bucket = getBucket(*layer); if (bucket) { @@ -120,7 +125,7 @@ void VectorTileData::redoPlacement(float angle, bool collisionDebug) { } } redoingPlacement = false; - redoPlacement(lastAngle, lastCollisionDebug); + redoPlacement(lastAngle, lastPitch, lastCollisionDebug); }); } diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index e0e8be29bf..4db0cbe004 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -19,6 +19,7 @@ public: Style&, const SourceInfo&, float angle_, + float pitch_, bool collisionDebug_); ~VectorTileData(); @@ -29,7 +30,7 @@ public: bool reparse(std::function callback); - void redoPlacement(float angle, bool collisionDebug) override; + void redoPlacement(float angle, float pitch, bool collisionDebug) override; void cancel() override; @@ -43,6 +44,8 @@ private: std::string data; float lastAngle = 0; float currentAngle; + float lastPitch = 0; + float currentPitch; bool lastCollisionDebug = 0; bool currentCollisionDebug = 0; bool redoingPlacement = false; diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index e8ad132c51..16ba3cf1a7 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -511,7 +511,7 @@ void SymbolBucket::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float void SymbolBucket::addToDebugBuffers() { - const float yStretch = 1.0f; + const float yStretch = collision.yStretch; const float angle = collision.angle; const float zoom = collision.zoom; float angle_sin = std::sin(-angle); diff --git a/src/mbgl/text/collision_tile.cpp b/src/mbgl/text/collision_tile.cpp index 1c7806a4e0..b80d756c35 100644 --- a/src/mbgl/text/collision_tile.cpp +++ b/src/mbgl/text/collision_tile.cpp @@ -13,7 +13,7 @@ void CollisionTile::reset(const float _angle, const float pitch) { rotationMatrix = {{angle_cos, -angle_sin, angle_sin, angle_cos}}; // Stretch boxes in y direction to account for the map tilt. - const float _yStretch = 1.0f / std::cos(pitch / 180 * M_PI); + const float _yStretch = 1.0f / std::cos(pitch); // The amount the map is squished depends on the y position. // Sort of account for this by making all boxes a bit bigger. diff --git a/src/mbgl/text/collision_tile.hpp b/src/mbgl/text/collision_tile.hpp index aed9b59f32..632652256b 100644 --- a/src/mbgl/text/collision_tile.hpp +++ b/src/mbgl/text/collision_tile.hpp @@ -35,8 +35,8 @@ namespace mbgl { class CollisionTile { public: - inline explicit CollisionTile(float _zoom, float tileExtent, float tileSize, float angle_, bool debug_) : - zoom(_zoom), tilePixelRatio(tileExtent / tileSize), debug(debug_) { reset(angle_, 0); } + inline explicit CollisionTile(float _zoom, float tileExtent, float tileSize, float angle_, float pitch_, bool debug_) : + zoom(_zoom), tilePixelRatio(tileExtent / tileSize), debug(debug_) { reset(angle_, pitch_); } void reset(const float angle, const float pitch); float placeFeature(const CollisionFeature &feature); @@ -51,6 +51,7 @@ class CollisionTile { const float minScale = 0.5f; const float maxScale = 2.0f; + float yStretch; private: @@ -58,7 +59,6 @@ class CollisionTile { Tree tree; std::array rotationMatrix; - float yStretch; bool debug; }; diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index 516d2f5dba..b238071bc5 100644 --- a/src/mbgl/util/worker.cpp +++ b/src/mbgl/util/worker.cpp @@ -46,8 +46,8 @@ public: } } - void redoPlacement(TileWorker* worker, float angle, bool collisionDebug, std::function callback) { - worker->redoPlacement(angle, collisionDebug); + void redoPlacement(TileWorker* worker, float angle, float pitch, bool collisionDebug, std::function callback) { + worker->redoPlacement(angle, pitch, collisionDebug); callback(); } }; @@ -76,9 +76,9 @@ std::unique_ptr Worker::parseLiveTile(TileWorker& worker, const Liv return threads[current]->invokeWithCallback(&Worker::Impl::parseLiveTile, callback, &worker, &tile); } -std::unique_ptr Worker::redoPlacement(TileWorker& worker, float angle, bool collisionDebug, std::function callback) { +std::unique_ptr Worker::redoPlacement(TileWorker& worker, float angle, float pitch, bool collisionDebug, std::function callback) { current = (current + 1) % threads.size(); - return threads[current]->invokeWithCallback(&Worker::Impl::redoPlacement, callback, &worker, angle, collisionDebug); + return threads[current]->invokeWithCallback(&Worker::Impl::redoPlacement, callback, &worker, angle, pitch, collisionDebug); } } // end namespace mbgl diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp index 2d78338db2..3ecc402ad2 100644 --- a/src/mbgl/util/worker.hpp +++ b/src/mbgl/util/worker.hpp @@ -49,6 +49,7 @@ public: Request redoPlacement( TileWorker&, float angle, + float pitch, bool collisionDebug, std::function callback); -- cgit v1.2.1