summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-12-04 10:39:56 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-01-08 12:43:26 +0200
commit07194f7fa55985aec36f7bd46ceda84ca60503b5 (patch)
treede5352d21dab6ce0a68214d1cdab30f4b1d3c221
parent2125548a6e36ff0c33acb78cc69d28cb7a7f2409 (diff)
downloadqtlocation-mapboxgl-07194f7fa55985aec36f7bd46ceda84ca60503b5.tar.gz
[core] Add CollisionIndex::featureIntersectsTileBorders()
-rw-r--r--src/mbgl/text/collision_index.cpp30
-rw-r--r--src/mbgl/text/collision_index.hpp7
2 files changed, 33 insertions, 4 deletions
diff --git a/src/mbgl/text/collision_index.cpp b/src/mbgl/text/collision_index.cpp
index 4ffe66b98f..c99eb3da39 100644
--- a/src/mbgl/text/collision_index.cpp
+++ b/src/mbgl/text/collision_index.cpp
@@ -81,13 +81,35 @@ CollisionTileBoundaries CollisionIndex::projectTileBoundaries(const mat4& posMat
}
-bool CollisionIndex::isInsideTile(float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
- // This check is only well defined when the tile boundaries are axis-aligned
- // We are relying on it only being used in MapMode::Tile, where that is always the case
-
+// The tile border checks below are only well defined when the tile boundaries are axis-aligned
+// We are relying on it only being used in MapMode::Tile, where that is always the case
+inline bool CollisionIndex::isInsideTile(
+ float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
return x1 >= tileBoundaries[0] && y1 >= tileBoundaries[1] && x2 < tileBoundaries[2] && y2 < tileBoundaries[3];
}
+inline bool CollisionIndex::intersectsTileBorders(
+ float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
+ return x1 < tileBoundaries[2] && x2 > tileBoundaries[0] && y1 < tileBoundaries[3] && y2 > tileBoundaries[1];
+}
+
+bool CollisionIndex::featureIntersectsTileBorders(const CollisionFeature& feature,
+ Point<float> shift,
+ const mat4& posMatrix,
+ const float textPixelRatio,
+ const CollisionTileBoundaries& tileEdges) const {
+ 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;
+ 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;
+
+ return !intersectsTileBorders(px1, py1, px2, py2, tileEdges);
+}
std::pair<bool,bool> CollisionIndex::placeFeature(const CollisionFeature& feature,
Point<float> shift,
diff --git a/src/mbgl/text/collision_index.hpp b/src/mbgl/text/collision_index.hpp
index b9e618bd24..71a4a7cd06 100644
--- a/src/mbgl/text/collision_index.hpp
+++ b/src/mbgl/text/collision_index.hpp
@@ -21,6 +21,11 @@ public:
using CollisionGrid = GridIndex<IndexedSubfeature>;
explicit CollisionIndex(const TransformState&, MapMode&);
+ bool featureIntersectsTileBorders(const CollisionFeature& feature,
+ Point<float> shift,
+ const mat4& posMatrix,
+ const float textPixelRatio,
+ const CollisionTileBoundaries& tileEdges) const;
std::pair<bool,bool> placeFeature(const CollisionFeature& feature,
Point<float> shift,
@@ -49,6 +54,8 @@ private:
bool isOffscreen(float x1, float y1, float x2, float y2) const;
bool isInsideGrid(float x1, float y1, float x2, float y2) const;
bool isInsideTile(float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const;
+ bool intersectsTileBorders(
+ float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const;
std::pair<bool,bool> placeLineFeature(const CollisionFeature& feature,
const mat4& posMatrix,