#pragma once #include "drape_frontend/engine_context.hpp" #include "drape_frontend/read_mwm_task.hpp" #include "drape_frontend/tile_info.hpp" #include "drape_frontend/tile_utils.hpp" #include "geometry/screenbase.hpp" #include "drape/object_pool.hpp" #include "drape/pointers.hpp" #include "base/thread_pool.hpp" #include #include #include #include namespace dp { class TextureManager; } // namespace dp namespace df { class MapDataProvider; class MetalineManager; uint8_t constexpr kReadingThreadsCount = 2; class ReadManager { public: ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings, bool trafficEnabled); void Start(); void Stop(); void Restart(); void UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, bool forceUpdate, bool forceUpdateUserMarks, TTilesCollection const & tiles, ref_ptr texMng, ref_ptr metalineMng); void Invalidate(TTilesCollection const & keyStorage); void InvalidateAll(); bool CheckTileKey(TileKey const & tileKey) const; void Allow3dBuildings(bool allow3dBuildings); void SetTrafficEnabled(bool trafficEnabled); void SetDisplacementMode(int displacementMode); void SetCustomFeatures(CustomFeatures && ids); std::vector GetCustomFeaturesArray() const; bool RemoveCustomFeatures(MwmSet::MwmId const & mwmId); bool RemoveAllCustomFeatures(); bool IsModeChanged() const { return m_modeChanged; } private: void OnTaskFinished(threads::IRoutine * task); bool MustDropAllTiles(ScreenBase const & screen) const; void PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr texMng, ref_ptr metalineMng); ref_ptr m_commutator; MapDataProvider & m_model; drape_ptr m_pool; ScreenBase m_currentViewport; bool m_have3dBuildings; bool m_allow3dBuildings; bool m_trafficEnabled; int m_displacementMode; bool m_modeChanged; struct LessByTileInfo { bool operator ()(std::shared_ptr const & l, std::shared_ptr const & r) const; }; using TTileSet = std::set, LessByTileInfo>; TTileSet m_tileInfos; dp::ObjectPool m_tasksPool; int m_counter; std::mutex m_finishedTilesMutex; uint64_t m_generationCounter; uint64_t m_userMarksGenerationCounter; using TTileInfoCollection = buffer_vector, 8>; TTilesCollection m_activeTiles; CustomFeaturesContextPtr m_customFeaturesContext; void CancelTileInfo(std::shared_ptr const & tileToCancel); void ClearTileInfo(std::shared_ptr const & tileToClear); void IncreaseCounter(int value); void CheckFinishedTiles(TTileInfoCollection const & requestedTiles, bool forceUpdateUserMarks); }; } // namespace df