diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-01-08 10:24:05 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-01-08 12:43:26 +0200 |
commit | 0379615388207ed6c98690a037b9d76c7c31921d (patch) | |
tree | 4451adc9113aa36b2c6b30885a051bef4f0464f0 /src | |
parent | 141e4e7935038c0b63fb01b2376e52a40ceba249 (diff) | |
download | qtlocation-mapboxgl-0379615388207ed6c98690a037b9d76c7c31921d.tar.gz |
[core] Introduce CollisionIndex::getProjectedCollisionBoundaries()
In order to remove the repeated code.
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/text/collision_index.cpp | 36 | ||||
-rw-r--r-- | src/mbgl/text/collision_index.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 7 |
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); |