#pragma once #include #include #include #include #include #include namespace mbgl { class RenderLayerSymbolInterface; class SymbolBucket; class OpacityState { public: OpacityState(bool placed, bool skipFade); OpacityState(const OpacityState& prevOpacityState, float increment, bool placed); bool isHidden() const; float opacity; bool placed; }; class JointOpacityState { public: JointOpacityState(bool placedIcon, bool placedText, bool skipFade); JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedIcon, bool placedText); bool isHidden() const; OpacityState icon; OpacityState text; }; class JointPlacement { public: JointPlacement(bool text_, bool icon_, bool skipFade_) : text(text_), icon(icon_), skipFade(skipFade_) {} const bool text; const bool icon; // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge // Because these symbols aren't onscreen yet, we can skip the "fade in" animation, // and if a subsequent viewport change brings them into view, they'll be fully // visible right away. const bool skipFade; }; struct RetainedQueryData { uint32_t bucketInstanceId; std::shared_ptr featureIndex; OverscaledTileID tileID; std::shared_ptr> featureSortOrder; RetainedQueryData(uint32_t bucketInstanceId_, std::shared_ptr featureIndex_, OverscaledTileID tileID_) : bucketInstanceId(bucketInstanceId_) , featureIndex(std::move(featureIndex_)) , tileID(std::move(tileID_)) {} }; class CollisionGroups { public: using Predicate = std::function; using CollisionGroup = std::pair>; CollisionGroups(const bool crossSourceCollisions_) : maxGroupID(0) , crossSourceCollisions(crossSourceCollisions_) {} const CollisionGroup& get(const std::string& sourceID); private: std::map collisionGroups; uint16_t maxGroupID; bool crossSourceCollisions; }; class Placement { public: Placement(const TransformState&, MapMode mapMode, const bool crossSourceCollisions); void placeLayer(const RenderLayerSymbolInterface&, const mat4&, bool showCollisionBoxes); void commit(const Placement& prevPlacement, TimePoint); void updateLayerOpacities(const RenderLayerSymbolInterface&); float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; const CollisionIndex& getCollisionIndex() const; bool stillRecent(TimePoint now) const; void setRecent(TimePoint now); void setStale(); const RetainedQueryData& getQueryData(uint32_t bucketInstanceId) const; private: void placeLayerBucket( SymbolBucket&, const mat4& posMatrix, const mat4& textLabelPlaneMatrix, const mat4& iconLabelPlaneMatrix, const float scale, const float pixelRatio, const bool showCollisionBoxes, std::unordered_set& seenCrossTileIDs, const bool holdingForFade, const CollisionGroups::CollisionGroup& collisionGroup); void updateBucketOpacities(SymbolBucket&, std::set&); CollisionIndex collisionIndex; TransformState state; MapMode mapMode; TimePoint fadeStartTime; TimePoint commitTime; std::unordered_map placements; std::unordered_map opacities; bool stale = false; std::unordered_map retainedQueryData; CollisionGroups collisionGroups; }; } // namespace mbgl