summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-01-08 10:24:05 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-01-08 12:43:26 +0200
commit0379615388207ed6c98690a037b9d76c7c31921d (patch)
tree4451adc9113aa36b2c6b30885a051bef4f0464f0
parent141e4e7935038c0b63fb01b2376e52a40ceba249 (diff)
downloadqtlocation-mapboxgl-0379615388207ed6c98690a037b9d76c7c31921d.tar.gz
[core] Introduce CollisionIndex::getProjectedCollisionBoundaries()
In order to remove the repeated code.
-rw-r--r--src/mbgl/text/collision_index.cpp36
-rw-r--r--src/mbgl/text/collision_index.hpp4
-rw-r--r--src/mbgl/text/placement.cpp7
3 files changed, 26 insertions, 21 deletions
diff --git a/src/mbgl/text/collision_index.cpp b/src/mbgl/text/collision_index.cpp
index d92fd27003..50567ab895 100644
--- a/src/mbgl/text/collision_index.cpp
+++ b/src/mbgl/text/collision_index.cpp
@@ -104,15 +104,7 @@ bool CollisionIndex::featureIntersectsTileBorders(const CollisionFeature& featur
assert(!feature.alongLine);
assert(!feature.boxes.empty());
const CollisionBox& box = feature.boxes.front();
- const auto projectedPoint = projectAndGetPerspectiveRatio(posMatrix, box.anchor);
- const float tileToViewport = textPixelRatio * projectedPoint.second;
- CollisionBoundaries collisionBoundaries{{
- (box.x1 + shift.x) * tileToViewport + projectedPoint.first.x,
- (box.y1 + shift.y) * tileToViewport + projectedPoint.first.y,
- (box.x2 + shift.x) * tileToViewport + projectedPoint.first.x,
- (box.y2 + shift.y) * tileToViewport + projectedPoint.first.y,
- }};
-
+ auto collisionBoundaries = getProjectedCollisionBoundaries(posMatrix, shift, textPixelRatio, box);
return overlapsTile(collisionBoundaries, tileEdges) && !isInsideTile(collisionBoundaries, tileEdges);
}
@@ -134,15 +126,9 @@ std::pair<bool, bool> CollisionIndex::placeFeature(
assert(projectedBoxes.empty());
if (!feature.alongLine) {
const CollisionBox& box = feature.boxes.front();
- const auto projectedPoint = projectAndGetPerspectiveRatio(posMatrix, box.anchor);
- const float tileToViewport = textPixelRatio * projectedPoint.second;
- float px1 = (box.x1 + shift.x) * tileToViewport + projectedPoint.first.x;
- float py1 = (box.y1 + shift.y) * tileToViewport + projectedPoint.first.y;
- float px2 = (box.x2 + shift.x) * tileToViewport + projectedPoint.first.x;
- float py2 = (box.y2 + shift.y) * tileToViewport + projectedPoint.first.y;
- projectedBoxes.emplace_back(px1, py1, px2, py2);
-
- CollisionBoundaries collisionBoundaries{{px1, py1, px2, py2}};
+ auto collisionBoundaries = getProjectedCollisionBoundaries(posMatrix, shift, textPixelRatio, box);
+ projectedBoxes.emplace_back(
+ collisionBoundaries[0], collisionBoundaries[1], collisionBoundaries[2], collisionBoundaries[3]);
if ((avoidEdges && !isInsideTile(collisionBoundaries, *avoidEdges)) || !isInsideGrid(collisionBoundaries) ||
(!allowOverlap && collisionGrid.hitTest(projectedBoxes.back().box(), collisionGroupPredicate))) {
return { false, false };
@@ -413,4 +399,18 @@ Point<float> CollisionIndex::projectPoint(const mat4& posMatrix, const Point<flo
static_cast<float>((((-p[1] / p[3] + 1) / 2) * size.height) + viewportPadding) };
}
+CollisionBoundaries CollisionIndex::getProjectedCollisionBoundaries(const mat4& posMatrix,
+ Point<float> shift,
+ float textPixelRatio,
+ const CollisionBox& box) const {
+ const auto projectedPoint = projectAndGetPerspectiveRatio(posMatrix, box.anchor);
+ const float tileToViewport = textPixelRatio * projectedPoint.second;
+ return CollisionBoundaries{{
+ (box.x1 + shift.x) * tileToViewport + projectedPoint.first.x,
+ (box.y1 + shift.y) * tileToViewport + projectedPoint.first.y,
+ (box.x2 + shift.x) * tileToViewport + projectedPoint.first.x,
+ (box.y2 + shift.y) * tileToViewport + projectedPoint.first.y,
+ }};
+}
+
} // namespace mbgl
diff --git a/src/mbgl/text/collision_index.hpp b/src/mbgl/text/collision_index.hpp
index 707353aedf..d1a77b5492 100644
--- a/src/mbgl/text/collision_index.hpp
+++ b/src/mbgl/text/collision_index.hpp
@@ -77,6 +77,10 @@ private:
std::pair<float,float> projectAnchor(const mat4& posMatrix, const Point<float>& point) const;
std::pair<Point<float>,float> projectAndGetPerspectiveRatio(const mat4& posMatrix, const Point<float>& point) const;
Point<float> projectPoint(const mat4& posMatrix, const Point<float>& point) const;
+ CollisionBoundaries getProjectedCollisionBoundaries(const mat4& posMatrix,
+ Point<float> shift,
+ float textPixelRatio,
+ const CollisionBox& box) const;
const TransformState transformState;
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp
index 9bfb1ca04a..2a98935d73 100644
--- a/src/mbgl/text/placement.cpp
+++ b/src/mbgl/text/placement.cpp
@@ -598,9 +598,10 @@ void Placement::placeBucket(const SymbolBucket& bucket,
return result;
};
- std::stable_sort(sorted.begin(), sorted.end(), [&](const SymbolInstance& a, const SymbolInstance& b) {
- return intersectsTileBorder(a) && !intersectsTileBorder(b);
- });
+ std::stable_sort(
+ sorted.begin(), sorted.end(), [&intersectsTileBorder](const SymbolInstance& a, const SymbolInstance& b) {
+ return intersectsTileBorder(a) && !intersectsTileBorder(b);
+ });
for (const SymbolInstance& symbol : sorted) {
placeSymbol(symbol);