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