summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnsis Brammanis <brammanis@gmail.com>2015-08-14 19:00:21 +0300
committerAnsis Brammanis <brammanis@gmail.com>2015-08-24 18:41:50 -0400
commitbc92c2de3988a39d6def34617ade4afb5b82e214 (patch)
tree1fc1f986d5ef738a47f45a82d98a267c07d3f48f /src
parent494489f9a06b538b900c2da5286ead4ab95805f1 (diff)
downloadqtlocation-mapboxgl-bc92c2de3988a39d6def34617ade4afb5b82e214.tar.gz
fix symbol collision detection in perspective view
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/map/live_tile_data.cpp2
-rw-r--r--src/mbgl/map/source.cpp8
-rw-r--r--src/mbgl/map/tile_data.hpp2
-rw-r--r--src/mbgl/map/tile_worker.cpp4
-rw-r--r--src/mbgl/map/tile_worker.hpp2
-rw-r--r--src/mbgl/map/vector_tile_data.cpp15
-rw-r--r--src/mbgl/map/vector_tile_data.hpp5
-rw-r--r--src/mbgl/renderer/symbol_bucket.cpp2
-rw-r--r--src/mbgl/text/collision_tile.cpp2
-rw-r--r--src/mbgl/text/collision_tile.hpp6
-rw-r--r--src/mbgl/util/worker.cpp8
-rw-r--r--src/mbgl/util/worker.hpp1
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<CollisionTile>(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<VectorTileData>(normalized_id, style, info,
- transformState.getAngle(), data.getCollisionDebug());
+ auto tileData = std::make_shared<VectorTileData>(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<util::ptr<StyleLayer>> 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<CollisionTile>(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<void ()> 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<float, 4> 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<void ()> callback) {
- worker->redoPlacement(angle, collisionDebug);
+ void redoPlacement(TileWorker* worker, float angle, float pitch, bool collisionDebug, std::function<void ()> callback) {
+ worker->redoPlacement(angle, pitch, collisionDebug);
callback();
}
};
@@ -76,9 +76,9 @@ std::unique_ptr<WorkRequest> Worker::parseLiveTile(TileWorker& worker, const Liv
return threads[current]->invokeWithCallback(&Worker::Impl::parseLiveTile, callback, &worker, &tile);
}
-std::unique_ptr<WorkRequest> Worker::redoPlacement(TileWorker& worker, float angle, bool collisionDebug, std::function<void ()> callback) {
+std::unique_ptr<WorkRequest> Worker::redoPlacement(TileWorker& worker, float angle, float pitch, bool collisionDebug, std::function<void ()> 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<void ()> callback);