1 #pragma once
2 
3 #include <string>
4 #include <unordered_map>
5 #include <mbgl/util/chrono.hpp>
6 #include <mbgl/text/collision_index.hpp>
7 #include <mbgl/layout/symbol_projection.hpp>
8 #include <unordered_set>
9 
10 namespace mbgl {
11 
12 class RenderSymbolLayer;
13 class SymbolBucket;
14 
15 class OpacityState {
16 public:
17     OpacityState(bool placed, bool skipFade);
18     OpacityState(const OpacityState& prevOpacityState, float increment, bool placed);
19     bool isHidden() const;
20     float opacity;
21     bool placed;
22 };
23 
24 class JointOpacityState {
25 public:
26     JointOpacityState(bool placedIcon, bool placedText, bool skipFade);
27     JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedIcon, bool placedText);
28     bool isHidden() const;
29     OpacityState icon;
30     OpacityState text;
31 };
32 
33 class JointPlacement {
34 public:
JointPlacement(bool text_,bool icon_,bool skipFade_)35     JointPlacement(bool text_, bool icon_, bool skipFade_)
36         : text(text_), icon(icon_), skipFade(skipFade_)
37     {}
38 
39     const bool text;
40     const bool icon;
41     // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge
42     // Because these symbols aren't onscreen yet, we can skip the "fade in" animation,
43     // and if a subsequent viewport change brings them into view, they'll be fully
44     // visible right away.
45     const bool skipFade;
46 };
47 
48 struct RetainedQueryData {
49     uint32_t bucketInstanceId;
50     std::shared_ptr<FeatureIndex> featureIndex;
51     OverscaledTileID tileID;
52     std::shared_ptr<std::vector<size_t>> featureSortOrder;
53 
RetainedQueryDatambgl::RetainedQueryData54     RetainedQueryData(uint32_t bucketInstanceId_,
55                       std::shared_ptr<FeatureIndex> featureIndex_,
56                       OverscaledTileID tileID_)
57         : bucketInstanceId(bucketInstanceId_)
58         , featureIndex(std::move(featureIndex_))
59         , tileID(std::move(tileID_)) {}
60 };
61 
62 class Placement {
63 public:
64     Placement(const TransformState&, MapMode mapMode);
65     void placeLayer(RenderSymbolLayer&, const mat4&, bool showCollisionBoxes);
66     void commit(const Placement& prevPlacement, TimePoint);
67     void updateLayerOpacities(RenderSymbolLayer&);
68     float symbolFadeChange(TimePoint now) const;
69     bool hasTransitions(TimePoint now) const;
70 
71     const CollisionIndex& getCollisionIndex() const;
72 
73     bool stillRecent(TimePoint now) const;
74     void setRecent(TimePoint now);
75     void setStale();
76 
77     const RetainedQueryData& getQueryData(uint32_t bucketInstanceId) const;
78 private:
79 
80     void placeLayerBucket(
81             SymbolBucket&,
82             const mat4& posMatrix,
83             const mat4& textLabelPlaneMatrix,
84             const mat4& iconLabelPlaneMatrix,
85             const float scale,
86             const float pixelRatio,
87             const bool showCollisionBoxes,
88             std::unordered_set<uint32_t>& seenCrossTileIDs,
89             const bool holdingForFade);
90 
91     void updateBucketOpacities(SymbolBucket&, std::set<uint32_t>&);
92 
93     CollisionIndex collisionIndex;
94 
95     TransformState state;
96     MapMode mapMode;
97     TimePoint fadeStartTime;
98     TimePoint commitTime;
99 
100     std::unordered_map<uint32_t, JointPlacement> placements;
101     std::unordered_map<uint32_t, JointOpacityState> opacities;
102 
103     bool stale = false;
104 
105     std::unordered_map<uint32_t, RetainedQueryData> retainedQueryData;
106 };
107 
108 } // namespace mbgl
109