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