#pragma once #include #include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wshadow" #ifdef __clang__ #pragma GCC diagnostic ignored "-Wunknown-pragmas" #endif #pragma GCC diagnostic ignored "-Wpragmas" #pragma GCC diagnostic ignored "-Wdeprecated-register" #pragma GCC diagnostic ignored "-Wshorten-64-to-32" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #ifndef __clang__ #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" #pragma GCC diagnostic ignored "-Wmisleading-indentation" #endif #include #include #include #include #pragma GCC diagnostic pop namespace mbgl { namespace bg = boost::geometry; namespace bgm = bg::model; namespace bgi = bg::index; using CollisionPoint = bgm::point; using Box = bgm::box; using CollisionTreeBox = std::tuple; using Tree = bgi::rtree>; class IndexedSubfeature; class CollisionTile { public: explicit CollisionTile(PlacementConfig); float placeFeature(const CollisionFeature&, bool allowOverlap, bool avoidEdges); void insertFeature(CollisionFeature&, float minPlacementScale, bool ignorePlacement); std::vector queryRenderedSymbols(const GeometryCoordinates&, float scale) const; const PlacementConfig config; float minScale = 0.5f; float maxScale = 2.0f; float yStretch; std::array rotationMatrix; std::array reverseRotationMatrix; private: float findPlacementScale( const Point& anchor, const CollisionBox& box, const float boxMaxScale, const Point& blockingAnchor, const CollisionBox& blocking); Box getTreeBox(const Point& anchor, const CollisionBox& box, const float scale = 1.0); Tree tree; Tree ignoredTree; float perspectiveRatio; }; } // namespace mbgl