1 #pragma once
2 
3 #include <mbgl/geometry/feature_index.hpp>
4 #include <mbgl/text/collision_feature.hpp>
5 #include <mbgl/util/grid_index.hpp>
6 #include <mbgl/map/transform_state.hpp>
7 
8 namespace mbgl {
9 
10 class PlacedSymbol;
11 
12 struct TileDistance;
13 
14 class CollisionIndex {
15 public:
16     using CollisionGrid = GridIndex<IndexedSubfeature>;
17 
18     explicit CollisionIndex(const TransformState&);
19 
20     std::pair<bool,bool> placeFeature(CollisionFeature& feature,
21                                       const mat4& posMatrix,
22                                       const mat4& labelPlaneMatrix,
23                                       const float textPixelRatio,
24                                       PlacedSymbol& symbol,
25                                       const float scale,
26                                       const float fontSize,
27                                       const bool allowOverlap,
28                                       const bool pitchWithMap,
29                                       const bool collisionDebug);
30 
31     void insertFeature(CollisionFeature& feature, bool ignorePlacement, uint32_t bucketInstanceId);
32 
33     std::unordered_map<uint32_t, std::vector<IndexedSubfeature>> queryRenderedSymbols(const ScreenLineString&) const;
34 
35 private:
36     bool isOffscreen(const CollisionBox&) const;
37     bool isInsideGrid(const CollisionBox&) const;
38 
39     std::pair<bool,bool> placeLineFeature(CollisionFeature& feature,
40                                   const mat4& posMatrix,
41                                   const mat4& labelPlaneMatrix,
42                                   const float textPixelRatio,
43                                   PlacedSymbol& symbol,
44                                   const float scale,
45                                   const float fontSize,
46                                   const bool allowOverlap,
47                                   const bool pitchWithMap,
48                                   const bool collisionDebug);
49 
50     float approximateTileDistance(const TileDistance& tileDistance, const float lastSegmentAngle, const float pixelsToTileUnits, const float cameraToAnchorDistance, const bool pitchWithMap);
51 
52     std::pair<float,float> projectAnchor(const mat4& posMatrix, const Point<float>& point) const;
53     std::pair<Point<float>,float> projectAndGetPerspectiveRatio(const mat4& posMatrix, const Point<float>& point) const;
54     Point<float> projectPoint(const mat4& posMatrix, const Point<float>& point) const;
55 
56     const TransformState transformState;
57 
58     CollisionGrid collisionGrid;
59     CollisionGrid ignoredGrid;
60 
61     const float screenRightBoundary;
62     const float screenBottomBoundary;
63     const float gridRightBoundary;
64     const float gridBottomBoundary;
65 
66     const float pitchFactor;
67 };
68 
69 } // namespace mbgl
70