1 #pragma once
2 
3 #include <mbgl/style/types.hpp>
4 #include <mbgl/tile/geometry_tile_data.hpp>
5 #include <mbgl/tile/tile_id.hpp>
6 #include <mbgl/util/grid_index.hpp>
7 #include <mbgl/util/feature.hpp>
8 #include <mbgl/util/mat4.hpp>
9 
10 #include <vector>
11 #include <string>
12 #include <unordered_map>
13 
14 namespace mbgl {
15 
16 class RenderedQueryOptions;
17 class RenderLayer;
18 class TransformState;
19 
20 class CollisionIndex;
21 
22 class IndexedSubfeature {
23 public:
24     IndexedSubfeature() = delete;
IndexedSubfeature(std::size_t index_,std::string sourceLayerName_,std::string bucketName_,size_t sortIndex_)25     IndexedSubfeature(std::size_t index_, std::string sourceLayerName_, std::string bucketName_, size_t sortIndex_)
26         : index(index_)
27         , sourceLayerName(std::move(sourceLayerName_))
28         , bucketLeaderID(std::move(bucketName_))
29         , sortIndex(sortIndex_)
30         , bucketInstanceId(0)
31     {}
32 
33 
IndexedSubfeature(const IndexedSubfeature & other,uint32_t bucketInstanceId_)34     IndexedSubfeature(const IndexedSubfeature& other, uint32_t bucketInstanceId_)
35         : index(other.index)
36         , sourceLayerName(other.sourceLayerName)
37         , bucketLeaderID(other.bucketLeaderID)
38         , sortIndex(other.sortIndex)
39         , bucketInstanceId(bucketInstanceId_)
40     {}
41     size_t index;
42     std::string sourceLayerName;
43     std::string bucketLeaderID;
44     size_t sortIndex;
45 
46     // Only used for symbol features
47     uint32_t bucketInstanceId;
48 };
49 
50 class FeatureIndex {
51 public:
52     FeatureIndex(std::unique_ptr<const GeometryTileData> tileData_);
53 
getData()54     const GeometryTileData* getData() { return tileData.get(); }
55 
56     void insert(const GeometryCollection&, std::size_t index, const std::string& sourceLayerName, const std::string& bucketLeaderID);
57 
58     void query(
59             std::unordered_map<std::string, std::vector<Feature>>& result,
60             const GeometryCoordinates& queryGeometry,
61             const TransformState&,
62             const mat4& posMatrix,
63             const double tileSize,
64             const double scale,
65             const RenderedQueryOptions& options,
66             const UnwrappedTileID&,
67             const std::vector<const RenderLayer*>&,
68             const float additionalQueryPadding) const;
69 
70     static optional<GeometryCoordinates> translateQueryGeometry(
71             const GeometryCoordinates& queryGeometry,
72             const std::array<float, 2>& translate,
73             const style::TranslateAnchorType,
74             const float bearing,
75             const float pixelsToTileUnits);
76 
77     void setBucketLayerIDs(const std::string& bucketLeaderID, const std::vector<std::string>& layerIDs);
78 
79     std::unordered_map<std::string, std::vector<Feature>> lookupSymbolFeatures(
80            const std::vector<IndexedSubfeature>& symbolFeatures,
81            const RenderedQueryOptions& options,
82            const std::vector<const RenderLayer*>& layers,
83            const OverscaledTileID& tileID,
84            const std::shared_ptr<std::vector<size_t>>& featureSortOrder) const;
85 
86 private:
87     void addFeature(
88             std::unordered_map<std::string, std::vector<Feature>>& result,
89             const IndexedSubfeature&,
90             const RenderedQueryOptions& options,
91             const CanonicalTileID&,
92             const std::vector<const RenderLayer*>&,
93             const GeometryCoordinates& queryGeometry,
94             const TransformState& transformState,
95             const float pixelsToTileUnits,
96             const mat4& posMatrix) const;
97 
98     GridIndex<IndexedSubfeature> grid;
99     unsigned int sortIndex = 0;
100 
101     std::unordered_map<std::string, std::vector<std::string>> bucketLayerIDs;
102     std::unique_ptr<const GeometryTileData> tileData;
103 };
104 } // namespace mbgl
105