#pragma once #include "drape_frontend/circles_pack_shape.hpp" #include "drape_frontend/route_builder.hpp" #include "drape/drape_global.hpp" #include "drape/gpu_program_manager.hpp" #include "drape/pointers.hpp" #include "geometry/screenbase.hpp" #include #include #include #include #include #include namespace df { extern std::string const kRouteColor; extern std::string const kRouteOutlineColor; extern std::string const kRoutePedestrian; extern std::string const kRouteBicycle; extern std::string const kTransitOutlineColor; class RouteRenderer final { public: using CacheRouteArrowsCallback = std::function const &)>; using PreviewPointsRequestCallback = std::function; struct PreviewInfo { m2::PointD m_startPoint; m2::PointD m_finishPoint; }; struct SubrouteInfo { dp::DrapeID m_subrouteId = 0; SubrouteConstPtr m_subroute; double m_length = 0.0; std::vector> m_subrouteData; drape_ptr m_arrowsData; std::vector m_arrowBorders; float m_baseHalfWidth = 0.0f; drape_ptr m_markersData; }; using Subroutes = std::vector; explicit RouteRenderer(PreviewPointsRequestCallback && previewPointsRequest); void UpdateRoute(ScreenBase const & screen, CacheRouteArrowsCallback const & callback); void RenderRoute(ScreenBase const & screen, bool trafficShown, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void AddSubrouteData(drape_ptr && subrouteData, ref_ptr mng); Subroutes const & GetSubroutes() const; void RemoveSubrouteData(dp::DrapeID subrouteId); void AddSubrouteArrowsData(drape_ptr && subrouteArrowsData, ref_ptr mng); void AddSubrouteMarkersData(drape_ptr && subrouteMarkersData, ref_ptr mng); void AddPreviewRenderData(drape_ptr && renderData, ref_ptr mng); void UpdatePreview(ScreenBase const & screen); void Clear(); void ClearObsoleteData(int currentRecacheId); void ClearGLDependentResources(); void UpdateDistanceFromBegin(double distanceFromBegin); void SetFollowingEnabled(bool enabled); void AddPreviewSegment(dp::DrapeID id, PreviewInfo && info); void RemovePreviewSegment(dp::DrapeID id); void RemoveAllPreviewSegments(); void SetSubrouteVisibility(dp::DrapeID id, bool isVisible); bool HasTransitData() const; private: void RenderSubroute(SubrouteInfo const & subrouteInfo, size_t subrouteDataIndex, ScreenBase const & screen, bool trafficShown, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void RenderSubrouteArrows(SubrouteInfo const & subrouteInfo, ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void RenderSubrouteMarkers(SubrouteInfo const & subrouteInfo, ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void RenderPreviewData(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void ClearPreviewHandles(); CirclesPackHandle * GetPreviewHandle(size_t & index); dp::Color GetMaskColor(RouteType routeType, double baseDistance, bool arrows) const; double m_distanceFromBegin; bool m_followingEnabled; Subroutes m_subroutes; std::unordered_set m_hiddenSubroutes; PreviewPointsRequestCallback m_previewPointsRequest; std::vector> m_previewRenderData; std::vector> m_previewHandlesCache; bool m_waitForPreviewRenderData; std::unordered_map m_previewSegments; m2::PointD m_previewPivot = m2::PointD::Zero(); }; } // namespace df