1 #pragma once 2 3 #include <mbgl/tile/tile.hpp> 4 #include <mbgl/tile/geometry_tile_worker.hpp> 5 #include <mbgl/renderer/image_manager.hpp> 6 #include <mbgl/text/glyph_manager.hpp> 7 #include <mbgl/util/feature.hpp> 8 #include <mbgl/actor/actor.hpp> 9 #include <mbgl/geometry/feature_index.hpp> 10 11 #include <atomic> 12 #include <memory> 13 #include <unordered_map> 14 #include <vector> 15 16 namespace mbgl { 17 18 class GeometryTileData; 19 class RenderLayer; 20 class SourceQueryOptions; 21 class TileParameters; 22 class GlyphAtlas; 23 class ImageAtlas; 24 25 class GeometryTile : public Tile, public GlyphRequestor, ImageRequestor { 26 public: 27 GeometryTile(const OverscaledTileID&, 28 std::string sourceID, 29 const TileParameters&); 30 31 ~GeometryTile() override; 32 33 void setError(std::exception_ptr); 34 void setData(std::unique_ptr<const GeometryTileData>); 35 36 void setLayers(const std::vector<Immutable<style::Layer::Impl>>&) override; 37 void setShowCollisionBoxes(const bool showCollisionBoxes) override; 38 39 void onGlyphsAvailable(GlyphMap) override; 40 void onImagesAvailable(ImageMap, uint64_t imageCorrelationID) override; 41 42 void getGlyphs(GlyphDependencies); 43 void getImages(ImageRequestPair); 44 45 void upload(gl::Context&) override; 46 Bucket* getBucket(const style::Layer::Impl&) const override; 47 48 Size bindGlyphAtlas(gl::Context&); 49 Size bindIconAtlas(gl::Context&); 50 51 void queryRenderedFeatures( 52 std::unordered_map<std::string, std::vector<Feature>>& result, 53 const GeometryCoordinates& queryGeometry, 54 const TransformState&, 55 const std::vector<const RenderLayer*>& layers, 56 const RenderedQueryOptions& options, 57 const mat4& projMatrix) override; 58 59 void querySourceFeatures( 60 std::vector<Feature>& result, 61 const SourceQueryOptions&) override; 62 63 float getQueryPadding(const std::vector<const RenderLayer*>&) override; 64 65 void cancel() override; 66 67 class LayoutResult { 68 public: 69 std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets; 70 std::unique_ptr<FeatureIndex> featureIndex; 71 optional<AlphaImage> glyphAtlasImage; 72 optional<PremultipliedImage> iconAtlasImage; 73 LayoutResult(std::unordered_map<std::string,std::shared_ptr<Bucket>> buckets_,std::unique_ptr<FeatureIndex> featureIndex_,optional<AlphaImage> glyphAtlasImage_,optional<PremultipliedImage> iconAtlasImage_)74 LayoutResult(std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets_, 75 std::unique_ptr<FeatureIndex> featureIndex_, 76 optional<AlphaImage> glyphAtlasImage_, 77 optional<PremultipliedImage> iconAtlasImage_) 78 : buckets(std::move(buckets_)), 79 featureIndex(std::move(featureIndex_)), 80 glyphAtlasImage(std::move(glyphAtlasImage_)), 81 iconAtlasImage(std::move(iconAtlasImage_)) {} 82 }; 83 void onLayout(LayoutResult, uint64_t correlationID); 84 85 void onError(std::exception_ptr, uint64_t correlationID); 86 87 bool holdForFade() const override; 88 void markRenderedIdeal() override; 89 void markRenderedPreviously() override; 90 void performedFadePlacement() override; 91 getFeatureIndex() const92 const std::shared_ptr<FeatureIndex> getFeatureIndex() const { return latestFeatureIndex; } 93 94 protected: getData()95 const GeometryTileData* getData() { 96 return latestFeatureIndex ? latestFeatureIndex->getData() : nullptr; 97 } 98 99 private: 100 void markObsolete(); 101 102 const std::string sourceID; 103 104 // Used to signal the worker that it should abandon parsing this tile as soon as possible. 105 std::atomic<bool> obsolete { false }; 106 107 std::shared_ptr<Mailbox> mailbox; 108 Actor<GeometryTileWorker> worker; 109 110 GlyphManager& glyphManager; 111 ImageManager& imageManager; 112 113 uint64_t correlationID = 0; 114 115 std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets; 116 117 std::shared_ptr<FeatureIndex> latestFeatureIndex; 118 119 optional<AlphaImage> glyphAtlasImage; 120 optional<PremultipliedImage> iconAtlasImage; 121 122 const MapMode mode; 123 124 bool showCollisionBoxes; 125 126 enum class FadeState { 127 Loaded, 128 NeedsFirstPlacement, 129 NeedsSecondPlacement, 130 CanRemove 131 }; 132 133 FadeState fadeState = FadeState::Loaded; 134 public: 135 optional<gl::Texture> glyphAtlasTexture; 136 optional<gl::Texture> iconAtlasTexture; 137 }; 138 139 } // namespace mbgl 140