From 1ad984a208f94b95f1a5347227c088d770c133fa Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Fri, 5 Jun 2015 15:11:34 +0300 Subject: [PATCH] Added removing of routes and autoscaling --- drape_frontend/backend_renderer.cpp | 9 ++++++ drape_frontend/drape_engine.cpp | 7 ++++ drape_frontend/drape_engine.hpp | 1 + drape_frontend/frontend_renderer.cpp | 7 +++- drape_frontend/message.hpp | 1 + drape_frontend/message_subclasses.hpp | 7 ++++ drape_frontend/route_renderer.cpp | 34 ++++++++++++++++++-- drape_frontend/route_renderer.hpp | 4 ++- map/bookmark_manager.cpp | 10 ------ map/bookmark_manager.hpp | 8 ----- map/framework.cpp | 46 ++++++++++++--------------- 11 files changed, 86 insertions(+), 48 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 1ba432f01b..389ec9ba4b 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -178,6 +178,15 @@ void BackendRenderer::AcceptMessage(ref_ptr message) m_routeBuilder->Build(msg->GetRoutePolyline(), msg->GetColor()); break; } + case Message::RemoveRoute: + { + // we have to resend the message to FR, because it guaranties that + // RemoveRouteMessage will be precessed after FlushRouteMessage + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(), + MessagePriority::Normal); + break; + } case Message::StopRendering: { ProcessStopRenderingMessage(); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 1e7309337c..7cdab6f046 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -316,4 +316,11 @@ void DrapeEngine::AddRoute(m2::PolylineD const & routePolyline, dp::Color const MessagePriority::Normal); } +void DrapeEngine::RemoveRoute() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::Normal); +} + } // namespace df diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 84a232883d..b8585fc3f3 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -96,6 +96,7 @@ public: bool GetMyPosition(m2::PointD & myPosition); void AddRoute(m2::PolylineD const & routePolyline, dp::Color const & color); + void RemoveRoute(); private: void AddUserEvent(UserEvent const & e); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index b63d68611e..9e79fe0e39 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -279,6 +279,11 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) m_routeRenderer->AddRoute(state, move(bucket), msg->GetColor(), make_ref(m_gpuProgramManager)); break; } + case Message::RemoveRoute: + { + m_routeRenderer->RemoveAllRoutes(); + break; + } default: ASSERT(false, ()); @@ -486,7 +491,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) { GLFunctions::glClearDepth(); m_myPositionController->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); - m_routeRenderer->Render(GetCurrentZoomLevel(), make_ref(m_gpuProgramManager), m_generalUniforms); + m_routeRenderer->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); } else if (selectedObject == SelectionShape::OBJECT_POI) m_selectionShape->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 96cd928145..ba23e044c5 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -33,6 +33,7 @@ public: SelectObject GetMyPosition, AddRoute, + RemoveRoute, FlushRoute }; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 52cd7676d6..89077ecf6b 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -486,6 +486,13 @@ private: dp::Color m_color; }; +class RemoveRouteMessage : public Message +{ +public: + RemoveRouteMessage(){} + Type GetType() const override { return Message::RemoveRoute; } +}; + class FlushRouteMessage : public Message { public: diff --git a/drape_frontend/route_renderer.cpp b/drape_frontend/route_renderer.cpp index 4de442045d..a814e650f0 100644 --- a/drape_frontend/route_renderer.cpp +++ b/drape_frontend/route_renderer.cpp @@ -3,11 +3,26 @@ #include "drape/glsl_func.hpp" #include "drape/utils/projection.hpp" +#include "indexer/scales.hpp" + #include "base/logging.hpp" namespace df { +namespace +{ + +float const halfWidthInPixel[] = +{ + // 1 2 3 4 5 6 7 8 9 10 + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 2.0f, + //11 12 13 14 15 16 17 18 19 + 2.0f, 2.5f, 3.5f, 5.0f, 7.5f, 10.0f, 14.0f, 18.0f, 36.0f, +}; + +} + RouteGraphics::RouteGraphics(dp::GLState const & state, drape_ptr && buffer, dp::Color const & color) @@ -16,11 +31,18 @@ RouteGraphics::RouteGraphics(dp::GLState const & state, , m_color(color) {} -void RouteRenderer::Render(int currentZoomLevel, ref_ptr mng, +void RouteRenderer::Render(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms) { - // TODO(@kuznetsov): calculate pixel width by zoom level - float halfWidth = 30.0f; + // half width calculation + float halfWidth = 0.0; + double const zoomLevel = my::clamp(fabs(log(screen.GetScale()) / log(2.0)), 1.0, scales::UPPER_STYLE_SCALE); + int const index = static_cast(zoomLevel) - 1; + float const lerpCoef = static_cast(zoomLevel - static_cast(zoomLevel)); + if (index < scales::UPPER_STYLE_SCALE - 1) + halfWidth = halfWidthInPixel[index] + lerpCoef * (halfWidthInPixel[index + 1] - halfWidthInPixel[index]); + else + halfWidth = halfWidthInPixel[index]; for (RouteGraphics & route : m_routes) { @@ -51,4 +73,10 @@ void RouteRenderer::AddRoute(dp::GLState const & state, drape_ptrBuild(mng->GetProgram(route.m_state.GetProgramIndex())); } +void RouteRenderer::RemoveAllRoutes() +{ + m_routes.clear(); +} + } // namespace df + diff --git a/drape_frontend/route_renderer.hpp b/drape_frontend/route_renderer.hpp index 1bd21dd7e0..dc33f4b502 100644 --- a/drape_frontend/route_renderer.hpp +++ b/drape_frontend/route_renderer.hpp @@ -24,12 +24,14 @@ struct RouteGraphics class RouteRenderer final { public: - void Render(int currentZoomLevel, ref_ptr mng, + void Render(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); void AddRoute(dp::GLState const & state, drape_ptr && bucket, dp::Color const & color, ref_ptr mng); + void RemoveAllRoutes(); + private: vector m_routes; }; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index ed3f3024fe..b2b9afc0d6 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -232,16 +232,6 @@ void BookmarkManager::UserMarksReleaseController(UserMarksController & controlle FindUserMarksContainer(controller.GetType())->ReleaseController(); } -void BookmarkManager::SetRouteTrack(unique_ptr && track) -{ - m_routeTrack = move(track); -} - -void BookmarkManager::ResetRouteTrack() -{ - m_routeTrack.reset(); -} - UserMarkContainer const * BookmarkManager::FindUserMarksContainer(UserMarkType type) const { auto const iter = find_if(m_userMarkLayers.begin(), m_userMarkLayers.end(), [&type](UserMarkContainer const * cont) diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 3e2af1d62e..ef297bdad8 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -3,7 +3,6 @@ #include "map/bookmark.hpp" #include "map/route_track.hpp" #include "map/user_mark_container.hpp" -#include "map/route_track.hpp" #include "std/function.hpp" #include "std/unique_ptr.hpp" @@ -72,13 +71,6 @@ public: UserMarksController & UserMarksRequestController(UserMarkType type); void UserMarksReleaseController(UserMarksController & controller); - void SetRouteTrack(m2::PolylineD const & routePolyline, vector const & turns, - graphics::Color const & color); - void ResetRouteTrack(); - void UpdateRouteDistanceFromBegin(double distance); - void SetRouteStartPoint(m2::PointD const & pt, bool isValid); - void SetRouteFinishPoint(m2::PointD const & pt, bool isValid); - private: UserMarkContainer const * FindUserMarksContainer(UserMarkType type) const; UserMarkContainer * FindUserMarksContainer(UserMarkType type); diff --git a/map/framework.cpp b/map/framework.cpp index 4d466aebad..59cd461e20 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1829,12 +1829,16 @@ void Framework::BuildRoute(m2::PointD const & start, m2::PointD const & finish, [this] (Route const & route, IRouter::ResultCode code) { ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute_ReadyCallback")); + double const routeScale = 1.2; + vector absentFiles; vector absentRoutingIndexes; if (code == IRouter::NoError) { InsertRoute(route); - m_drapeEngine->SetModelViewRect(route.GetPoly().GetLimitRect(), true, -1, true); + m2::RectD routeRect = route.GetPoly().GetLimitRect(); + routeRect.Scale(routeScale); + m_drapeEngine->SetModelViewRect(routeRect, true, -1, true); } else { @@ -1913,10 +1917,8 @@ void Framework::SetRouterImpl(RouterType type) void Framework::RemoveRoute() { ASSERT_THREAD_CHECKER(m_threadChecker, ("RemoveRoute")); - - UserMarkControllerGuard g(m_bmManager, UserMarkType::DEBUG_MARK); - g.m_controller.Clear(); - m_bmManager.ResetRouteTrack(); + ASSERT(m_drapeEngine != nullptr, ()); + m_drapeEngine->RemoveRoute(); } bool Framework::DisableFollowMode() @@ -1937,9 +1939,6 @@ void Framework::FollowRoute() void Framework::CloseRouting() { ASSERT_THREAD_CHECKER(m_threadChecker, ("CloseRouting")); - - ///@TODO UVR - //GetLocationState()->StopRoutingMode(); m_routingSession.Reset(); RemoveRoute(); } @@ -1957,33 +1956,30 @@ void Framework::InsertRoute(Route const & route) ASSERT(m_drapeEngine != nullptr, ()); m_drapeEngine->AddRoute(route.GetPoly(), dp::Color(110, 180, 240, 200)); - //float const visScale = df::VisualParams::Instance().GetVisualScale(); + + // TODO(@kuznetsov): Some of this stuff we need + //track.SetName(route.GetName()); //RouteTrack track(route.GetPoly()); - // @TODO UVR - //vector turns; - //if (m_currentRouterType == RouterType::Vehicle) - //{ - // turns::TTurnsGeom const & turnsGeom = route.GetTurnsGeometry(); - // if (!turnsGeom.empty()) - // { - // turns.reserve(turnsGeom.size()); - // for (size_t i = 0; i < turnsGeom.size(); i++) - // turns.push_back(turnsGeom[i].m_mercatorDistance); - // } - //} + //track.SetName(route.GetName()); + //track.SetTurnsGeometry(route.GetTurnsGeometry()); /// @todo Consider a style parameter for the route color. //graphics::Color routeColor; //if (m_currentRouterType == RouterType::Pedestrian) - // routeColor = graphics::Color(5, 105, 175, 204); + // routeColor = graphics::Color(5, 105, 175, 255); //else - // routeColor = graphics::Color(30, 150, 240, 204); + // routeColor = graphics::Color(110, 180, 240, 255); - //m_bmManager.SetRouteTrack(route.GetPoly(), turns, routeColor); + //Track::TrackOutline outlines[] + //{ + // { 10.0f * visScale, routeColor } + //}; + + //track.AddOutline(outlines, ARRAY_SIZE(outlines)); + //track.AddClosingSymbol(false, "route_to", graphics::EPosCenter, graphics::routingFinishDepth); //m_informationDisplay.ResetRouteMatchingInfo(); - //Invalidate(); } void Framework::CheckLocationForRouting(GpsInfo const & info)