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