diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index cd131dde7..b37bdb5ec 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -83,7 +83,7 @@ void FeatureIndex::query( return; } - std::vector symbolFeatures = collisionTile->queryRenderedSymbols(box, scale); + std::vector symbolFeatures = collisionTile->queryRenderedSymbols(queryGeometry, scale); std::sort(symbolFeatures.begin(), symbolFeatures.end(), topDownSymbols); for (const auto& symbolFeature : symbolFeatures) { addFeature(result, symbolFeature, queryGeometry, filterLayerIDs, geometryTileData, tileID, style, bearing, pixelsToTileUnits); diff --git a/src/mbgl/text/collision_tile.cpp b/src/mbgl/text/collision_tile.cpp index 84c3f87a7..ec9278231 100644 --- a/src/mbgl/text/collision_tile.cpp +++ b/src/mbgl/text/collision_tile.cpp @@ -3,6 +3,9 @@ #include #include +#include +#include + #include namespace mbgl { @@ -152,12 +155,20 @@ Box CollisionTile::getTreeBox(const Point& anchor, const CollisionBox& bo }; } -std::vector CollisionTile::queryRenderedSymbols(const mapbox::geometry::box& box, const float scale) { +std::vector CollisionTile::queryRenderedSymbols(const GeometryCoordinates& queryGeometry, const float scale) { std::vector result; + if (queryGeometry.empty()) return result; + std::unordered_map> sourceLayerFeatures; - auto anchor = util::matrixMultiply(rotationMatrix, convertPoint(box.min)); + mapbox::geometry::multi_point rotatedPoints {}; + rotatedPoints.reserve(queryGeometry.size()); + std::transform(queryGeometry.cbegin(), queryGeometry.cend(), std::back_inserter(rotatedPoints), + [&](const auto& c) { return util::matrixMultiply(rotationMatrix, convertPoint(c)); }); + const auto box = mapbox::geometry::envelope(rotatedPoints); + + const auto& anchor = box.min; CollisionBox queryBox(anchor, 0, 0, box.max.x - box.min.x, box.max.y - box.min.y, scale); auto predicates = bgi::intersects(getTreeBox(anchor, queryBox)); diff --git a/src/mbgl/text/collision_tile.hpp b/src/mbgl/text/collision_tile.hpp index 7450fb1b8..8d660eb6e 100644 --- a/src/mbgl/text/collision_tile.hpp +++ b/src/mbgl/text/collision_tile.hpp @@ -2,6 +2,7 @@ #include #include +#include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" @@ -41,7 +42,7 @@ public: float placeFeature(const CollisionFeature&, const bool allowOverlap, const bool avoidEdges); void insertFeature(CollisionFeature&, const float minPlacementScale, const bool ignorePlacement); - std::vector queryRenderedSymbols(const mapbox::geometry::box&, const float scale); + std::vector queryRenderedSymbols(const GeometryCoordinates&, const float scale); const PlacementConfig config;