#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class SymbolInstance; class RenderLayer; class SymbolBucket; class IndexedSymbolInstance { public: IndexedSymbolInstance(uint32_t crossTileID_, Point coord_) : crossTileID(crossTileID_), coord(coord_) {} uint32_t crossTileID; Point coord; }; class TileLayerIndex { public: TileLayerIndex(OverscaledTileID coord, std::vector&, uint32_t bucketInstanceId, std::string bucketLeaderId); Point getScaledCoordinates(SymbolInstance&, const OverscaledTileID&) const; void findMatches(SymbolBucket&, const OverscaledTileID&, std::set&) const; OverscaledTileID coord; uint32_t bucketInstanceId; std::string bucketLeaderId; std::map> indexedSymbolInstances; }; class CrossTileSymbolLayerIndex { public: CrossTileSymbolLayerIndex(uint32_t& maxCrossTileID); bool addBucket(const OverscaledTileID&, const mat4& tileMatrix, SymbolBucket&); bool removeStaleBuckets(const std::unordered_set& currentIDs); void handleWrapJump(float newLng); private: void removeBucketCrossTileIDs(uint8_t zoom, const TileLayerIndex& removedBucket); std::map> indexes; std::map> usedCrossTileIDs; float lng = 0; uint32_t& maxCrossTileID; }; class CrossTileSymbolIndex { public: CrossTileSymbolIndex(); enum class AddLayerResult : uint8_t { NoChanges = 0, BucketsAdded = 1 << 0, BucketsRemoved = 1 << 1 }; AddLayerResult addLayer(const RenderLayer& layer, float lng); void pruneUnusedLayers(const std::set&); void reset(); private: std::map layerIndexes; uint32_t maxCrossTileID = 0; }; } // namespace mbgl