#pragma once #include #include #include #include #include #include #include #include #include #include namespace mbgl { class RenderedQueryOptions; class RenderLayer; class TransformState; class SourceFeatureState; class CollisionIndex; class IndexedSubfeature { public: IndexedSubfeature() = delete; IndexedSubfeature(std::size_t index_, std::string sourceLayerName_, std::string bucketName_, size_t sortIndex_) : index(index_) , sourceLayerName(std::move(sourceLayerName_)) , bucketLeaderID(std::move(bucketName_)) , sortIndex(sortIndex_) , bucketInstanceId(0) , collisionGroupId(0) {} IndexedSubfeature(const IndexedSubfeature& other, uint32_t bucketInstanceId_, uint16_t collisionGroupId_) : index(other.index) , sourceLayerName(other.sourceLayerName) , bucketLeaderID(other.bucketLeaderID) , sortIndex(other.sortIndex) , bucketInstanceId(bucketInstanceId_) , collisionGroupId(collisionGroupId_) {} size_t index; std::string sourceLayerName; std::string bucketLeaderID; size_t sortIndex; // Only used for symbol features uint32_t bucketInstanceId; uint16_t collisionGroupId; }; using FeatureSortOrder = std::shared_ptr>; class DynamicFeatureIndex { public: ~DynamicFeatureIndex(); void query(std::unordered_map>& result, const mbgl::ScreenLineString& queryGeometry, const TransformState& state) const; void insert(std::shared_ptr feature, std::shared_ptr> envelope); protected: struct FeatureRecord { std::shared_ptr feature; std::shared_ptr> envelope; }; std::vector features; }; class FeatureIndex { public: FeatureIndex(std::unique_ptr tileData_); const GeometryTileData* getData() { return tileData.get(); } void insert(const GeometryCollection&, std::size_t index, const std::string& sourceLayerName, const std::string& bucketLeaderID); void query(std::unordered_map>& result, const GeometryCoordinates& queryGeometry, const TransformState&, const mat4& posMatrix, double tileSize, double scale, const RenderedQueryOptions& options, const UnwrappedTileID&, const std::unordered_map&, float additionalQueryPadding, const SourceFeatureState& sourceFeatureState) const; static optional translateQueryGeometry(const GeometryCoordinates& queryGeometry, const std::array& translate, style::TranslateAnchorType, float bearing, float pixelsToTileUnits); void setBucketLayerIDs(const std::string& bucketLeaderID, const std::vector& layerIDs); std::unordered_map> lookupSymbolFeatures( const std::vector& symbolFeatures, const RenderedQueryOptions& options, const std::unordered_map& layers, const OverscaledTileID& tileID, const FeatureSortOrder& featureSortOrder) const; private: void addFeature(std::unordered_map>& result, const IndexedSubfeature&, const RenderedQueryOptions& options, const CanonicalTileID&, const std::unordered_map&, const GeometryCoordinates& queryGeometry, const TransformState& transformState, float pixelsToTileUnits, const mat4& posMatrix, const SourceFeatureState* sourceFeatureState) const; GridIndex grid; unsigned int sortIndex = 0; std::unordered_map> bucketLayerIDs; std::unique_ptr tileData; }; } // namespace mbgl