From 4203ab75c3c408a0c3e86115a0007e44c9875dcb Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Mon, 5 Dec 2016 19:45:23 +0300 Subject: [PATCH 1/4] Fixed map blinking on traffic turning on --- drape_frontend/frontend_renderer.cpp | 8 +++++--- drape_frontend/frontend_renderer.hpp | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 85b41e1d39..72caf32006 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -132,6 +132,7 @@ FrontendRenderer::FrontendRenderer(Params const & params) , m_requestedTiles(params.m_requestedTiles) , m_maxGeneration(0) , m_needRestoreSize(false) + , m_trafficStateChanged(false) { #ifdef DRAW_INFO m_tpf = 0.0; @@ -745,7 +746,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; if (msg->IsTrafficEnabled()) - InvalidateRect(m_userEventStream.GetCurrentScreen().ClipRect()); + m_trafficStateChanged = true; else m_trafficRenderer->ClearGLDependentResources(); break; @@ -1733,7 +1734,7 @@ void FrontendRenderer::Routine::Do() isActiveFrame |= m_renderer.m_texMng->UpdateDynamicTextures(); m_renderer.RenderScene(modelView); - if (modelViewChanged) + if (modelViewChanged || m_renderer.m_trafficStateChanged) m_renderer.UpdateScene(modelView); isActiveFrame |= InterpolationHolder::Instance().Advance(frameTime); @@ -1882,8 +1883,9 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView) for (RenderLayer & layer : m_layers) layer.m_isDirty |= RemoveGroups(removePredicate, layer.m_renderGroups, make_ref(m_overlayTree)); - if (m_lastReadedModelView != modelView) + if (m_trafficStateChanged || m_lastReadedModelView != modelView) { + m_trafficStateChanged = false; EmitModelViewChanged(modelView); m_lastReadedModelView = modelView; m_requestedTiles->Set(modelView, m_isIsometry || modelView.isPerspective(), ResolveTileKeys(modelView)); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index a5ff64bd73..38fe6cf994 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -340,6 +340,8 @@ private: bool m_needRestoreSize; + bool m_trafficStateChanged; + #ifdef DEBUG bool m_isTeardowned; #endif From 60e63c885e74fa2dc752520b4cfd118c17ec3f06 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 6 Dec 2016 11:28:34 +0300 Subject: [PATCH 2/4] Fixed saving of traffic state on Android --- android/jni/com/mapswithme/maps/Framework.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 42f642bcf4..1987667f7c 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -429,11 +429,13 @@ void Framework::SetTrafficStateListener(TrafficManager::TrafficStateChangedFn co void Framework::EnableTraffic() { m_work.GetTrafficManager().SetEnabled(true); + NativeFramework()->SaveTrafficEnabled(true); } void Framework::DisableTraffic() { m_work.GetTrafficManager().SetEnabled(false); + NativeFramework()->SaveTrafficEnabled(false); } void Framework::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn) From 42475f3386c0d5ec81009cbecdafce9856c6ce86 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 6 Dec 2016 11:29:10 +0300 Subject: [PATCH 3/4] Added traffic button to Qt-app --- map/framework.cpp | 2 +- qt/mainwindow.cpp | 13 +++++++++++++ qt/mainwindow.hpp | 3 +++ qt/res/resources.qrc | 1 + qt/res/traffic.png | Bin 0 -> 1416 bytes 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 qt/res/traffic.png diff --git a/map/framework.cpp b/map/framework.cpp index 9fcc720e9c..400b3644a6 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2715,7 +2715,7 @@ void Framework::Load3dMode(bool & allow3d, bool & allow3dBuildings) bool Framework::LoadTrafficEnabled() { - bool enabled = true; //TODO(@rokuz): temporary. It has to be false by default. + bool enabled = false; settings::Get(kTrafficEnabledKey, enabled); return enabled; } diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index a233206e34..3f197a57eb 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -277,6 +277,12 @@ void MainWindow::CreateNavigationBar() } { + m_trafficEnableAction = pToolBar->addAction(QIcon(":/navig64/traffic.png"), tr("Show traffic"), + this, SLOT(OnTrafficEnabled())); + m_trafficEnableAction->setCheckable(true); + m_trafficEnableAction->setChecked(m_pDrawWidget->GetFramework().LoadTrafficEnabled()); + pToolBar->addSeparator(); + // TODO(AlexZ): Replace icon. m_pCreateFeatureAction = pToolBar->addAction(QIcon(":/navig64/select.png"), tr("Create Feature"), this, SLOT(OnCreateFeatureClicked())); @@ -588,4 +594,11 @@ void MainWindow::OnRetryDownloadClicked() m_pDrawWidget->RetryToDownloadCountry(m_lastCountry); } +void MainWindow::OnTrafficEnabled() +{ + bool const enabled = m_trafficEnableAction->isChecked(); + m_pDrawWidget->GetFramework().GetTrafficManager().SetEnabled(enabled); + m_pDrawWidget->GetFramework().SaveTrafficEnabled(enabled); +} + } diff --git a/qt/mainwindow.hpp b/qt/mainwindow.hpp index 0812beb2a2..7f8a8f9f46 100644 --- a/qt/mainwindow.hpp +++ b/qt/mainwindow.hpp @@ -31,6 +31,7 @@ namespace qt QAction * m_selectionMode; QAction * m_clearSelection; QAction * m_pSearchAction; + QAction * m_trafficEnableAction; DrawWidget * m_pDrawWidget; QDockWidget * m_Docks[1]; @@ -89,5 +90,7 @@ namespace qt void OnSwitchSelectionMode(); void OnClearSelection(); + + void OnTrafficEnabled(); }; } diff --git a/qt/res/resources.qrc b/qt/res/resources.qrc index 5f53a1fe33..f76648f7da 100644 --- a/qt/res/resources.qrc +++ b/qt/res/resources.qrc @@ -14,6 +14,7 @@ select.png selectmode.png clear.png + traffic.png logo.png diff --git a/qt/res/traffic.png b/qt/res/traffic.png new file mode 100644 index 0000000000000000000000000000000000000000..add88ebfbafa852074c4646152978a9e8d26b707 GIT binary patch literal 1416 zcmV;31$X+1P)MW)&9Ej4nvg2Mg?C(1rR?MD(Si`cPOP*oB}kK~mI*=u2cpSAsI_qUFq) z-PQ57W?JZ$iniJ|yK~O-?}Ka1uIo0VlLgHW2G0BN+~=J4eO{nWojP^u)TvYFe+p~p z%QBhFZIU)cQPkbu-aaNtk_n|!shQ*$0Oy&RNlM)P4@tk3N~ME^LSdkWIaEze8qn6( z)+lK?fH&Pe0Z=ltl%!)M4@){uvgq#P%$IMn{v)QlDCbvqdx&bXME#p$D)CvIi14skd1K{3VF8BH0*|xQ{H6}^YM{-jX zMTFFqno~qPOCX?9# zV3wIp-@JMAPp46{OeS-myRRboE`TSZDB53XjA}Tg0bv+UC3&-?agrvJY#})fz)S!( zTwl@_cVFDm(Q&krfMFP}CAkd1qq$t}xzp(_Sg>Gn9LMWOUIyTI0IQ3|;_6y&nx`}% zolf6jW^YvK=cv1Pnc1(BjsfT+*$<#3DFzUej3o__ydJ<60Cq`wX%wH+Nj^MG);;)x zq=e*gNrwUKC%Ff}4wBol*=%2>iJ#JdOeXUrfR&Xx_z&U$x+Q%NU?YI_qwOON!v&I> z$y$yF=Ntnto8)W&w*x>ro!)0=Z@K#m`F#Fhx$=-o7cN}b+}GE))yytFcln+>+^fm1I2ex+H_XT56tk1-ScmGaCR9ND|2ez<2;N%Jt0b zlBTAn41o22$;uTZHB}I=K(fi*r;_~6-PZv~x%&(N-=1wT)gtLTGn?k_<0P#I@U6RF zRyYCw* zAW1W`od7nO*#%}6NSfH#*f@*iE;IXr=kN$2X(Yb_uwBy3!CPk|$;l+M0J?_flS-wU z%h#tIgB=|mTLD}ehT+V?DQqf$Ns`6`m_qVeNg;rSVzKyoDwUc6U=o0(045F&JO4<* zBOm}109-}#%Q%jAj2%1nP=9~_GD#C8O*FHUJN^KGPjb23FXaxZ$~2u$x0u;hNe>1= z@SeNhO7h1fNq!_bUefzP5IiI4fV=CjAmqtsjkE@UllrIAEt4Zj5&?jjUFzGUi!TOcWk Date: Tue, 6 Dec 2016 11:31:42 +0300 Subject: [PATCH 4/4] Tuned route rendering in traffic mode --- drape/shaders/route_fragment_shader.fsh | 14 +++------ drape_frontend/color_constants.cpp | 4 ++- drape_frontend/color_constants.hpp | 1 + drape_frontend/route_renderer.cpp | 39 ++++++++++--------------- drape_frontend/route_renderer.hpp | 3 +- 5 files changed, 25 insertions(+), 36 deletions(-) diff --git a/drape/shaders/route_fragment_shader.fsh b/drape/shaders/route_fragment_shader.fsh index 4b6d10b2b6..3ff455a17d 100644 --- a/drape/shaders/route_fragment_shader.fsh +++ b/drape/shaders/route_fragment_shader.fsh @@ -6,6 +6,7 @@ uniform sampler2D u_colorTex; #endif uniform vec4 u_color; +uniform vec4 u_outlineColor; uniform vec4 u_routeParams; const float kAntialiasingThreshold = 0.92; @@ -24,16 +25,9 @@ void main(void) vec4 color = vec4(0.0, 0.0, 0.0, 0.0); if (v_length.x >= v_length.z) { - if (u_routeParams.w > 0.0) - { - color = mix(u_color, vec4(v_color.rgb, 1.0), v_color.a); - color = mix(color, u_color, step(kOutlineThreshold1, abs(v_length.y))); - color = mix(color, u_color, smoothstep(kOutlineThreshold2, kOutlineThreshold1, abs(v_length.y))); - } - else - { - color = u_color; - } + color = mix(mix(u_color, vec4(v_color.rgb, 1.0), v_color.a), u_color, step(u_routeParams.w, 0.0)); + color = mix(color, u_outlineColor, step(kOutlineThreshold1, abs(v_length.y))); + color = mix(color, u_outlineColor, smoothstep(kOutlineThreshold2, kOutlineThreshold1, abs(v_length.y))); color.a *= (1.0 - smoothstep(kAntialiasingThreshold, 1.0, abs(v_length.y))); } diff --git a/drape_frontend/color_constants.cpp b/drape_frontend/color_constants.cpp index 643a8c910b..6dbbb0d264 100644 --- a/drape_frontend/color_constants.cpp +++ b/drape_frontend/color_constants.cpp @@ -15,7 +15,8 @@ unordered_map> kColorConstants = { GuiText, dp::Color(77, 77, 77, 221) }, { MyPositionAccuracy, dp::Color(0, 0, 0, 20) }, { Selection, dp::Color(30, 150, 240, 164) }, - { Route, dp::Color(21, 121, 244, 204) }, + { Route, dp::Color(65, 165, 245, 204) }, + { RouteOutline, dp::Color(25, 120, 210, 204) }, { RoutePedestrian, dp::Color(29, 51, 158, 204) }, { RouteBicycle, dp::Color(156, 39, 176, 204) }, { Arrow3D, dp::Color(80, 170, 255, 255) }, @@ -43,6 +44,7 @@ unordered_map> kColorConstants = { MyPositionAccuracy, dp::Color(255, 255, 255, 15) }, { Selection, dp::Color(255, 230, 140, 164) }, { Route, dp::Color(255, 225, 120, 180) }, + { RouteOutline, dp::Color(205, 180, 95, 180) }, { RoutePedestrian, dp::Color(255, 185, 75, 180) }, { RouteBicycle, dp::Color(255, 75, 140, 180) }, { Arrow3D, dp::Color(255, 220, 120, 255) }, diff --git a/drape_frontend/color_constants.hpp b/drape_frontend/color_constants.hpp index b0faf94661..87267191db 100644 --- a/drape_frontend/color_constants.hpp +++ b/drape_frontend/color_constants.hpp @@ -13,6 +13,7 @@ enum ColorConstant MyPositionAccuracy, Selection, Route, + RouteOutline, RoutePedestrian, RouteBicycle, Arrow3D, diff --git a/drape_frontend/route_renderer.cpp b/drape_frontend/route_renderer.cpp index d03aa59d4b..094d8542d6 100644 --- a/drape_frontend/route_renderer.cpp +++ b/drape_frontend/route_renderer.cpp @@ -27,16 +27,6 @@ float const kHalfWidthInPixel[] = 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 8.0f, 10.0f, 24.0f, 36.0f }; -uint8_t const kAlphaValue[] = -{ - //1 2 3 4 5 6 7 8 9 10 - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - //11 12 13 14 15 16 17 18 19 20 - 204, 204, 204, 204, 190, 180, 170, 160, 140, 120 -}; - -uint8_t const kAlphaValueForTraffic = 204; - int const kArrowAppearingZoomLevel = 14; int const kInvalidGroup = -1; @@ -116,13 +106,21 @@ bool AreEqualArrowBorders(vector const & borders1, vector(kAlphaValue[index]) / numeric_limits::max(); - float const alpha2 = static_cast(kAlphaValue[index + 1]) / numeric_limits::max(); - alpha = alpha1 + lerpCoef * (alpha2 - alpha1); - } else - { halfWidth = kHalfWidthInPixel[scales::UPPER_STYLE_SCALE]; - alpha = static_cast(kAlphaValue[scales::UPPER_STYLE_SCALE]) / numeric_limits::max(); - } } void RouteRenderer::UpdateRoute(ScreenBase const & screen, TCacheRouteArrowsCallback const & callback) @@ -153,7 +142,7 @@ void RouteRenderer::UpdateRoute(ScreenBase const & screen, TCacheRouteArrowsCall // Interpolate values by zoom level. double zoom = 0.0; - InterpolateByZoom(screen, m_currentHalfWidth, m_currentAlpha, zoom); + InterpolateByZoom(screen, m_currentHalfWidth, zoom); // Update arrows. if (zoom >= kArrowAppearingZoomLevel && !m_routeData->m_sourceTurns.empty()) @@ -247,8 +236,7 @@ void RouteRenderer::RenderRoute(ScreenBase const & screen, bool trafficShown, uniforms.SetMatrix4x4Value("modelView", mv.m_data); glsl::vec4 const color = glsl::ToVec4(df::GetColorConstant(GetStyleReader().GetCurrentStyle(), m_routeData->m_color)); - uniforms.SetFloatValue("u_color", color.r, color.g, color.b, - trafficShown ? kAlphaValueForTraffic : m_currentAlpha); + uniforms.SetFloatValue("u_color", color.r, color.g, color.b, color.a); double const screenScale = screen.GetScale(); uniforms.SetFloatValue("u_routeParams", m_currentHalfWidth, m_currentHalfWidth * screenScale, m_distanceFromBegin, trafficShown ? 1.0f : 0.0f); @@ -258,6 +246,11 @@ void RouteRenderer::RenderRoute(ScreenBase const & screen, bool trafficShown, uniforms.SetFloatValue("u_pattern", m_currentHalfWidth * m_routeData->m_pattern.m_dashLength * screenScale, m_currentHalfWidth * m_routeData->m_pattern.m_gapLength * screenScale); } + else + { + glsl::vec4 const outlineColor = glsl::ToVec4(GetOutlineColor(m_routeData->m_color)); + uniforms.SetFloatValue("u_outlineColor", outlineColor.r, outlineColor.g, outlineColor.b, outlineColor.a); + } // Set up shaders and apply uniforms. ref_ptr prg = mng->GetProgram(m_routeData->m_pattern.m_isDashed ? diff --git a/drape_frontend/route_renderer.hpp b/drape_frontend/route_renderer.hpp index c8d2e283e1..fb7019cc0a 100644 --- a/drape_frontend/route_renderer.hpp +++ b/drape_frontend/route_renderer.hpp @@ -41,7 +41,7 @@ public: void UpdateDistanceFromBegin(double distanceFromBegin); private: - void InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const; + void InterpolateByZoom(ScreenBase const & screen, float & halfWidth, double & zoom) const; void RenderRouteSign(drape_ptr const & sign, ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); @@ -55,7 +55,6 @@ private: drape_ptr m_finishRouteSign; float m_currentHalfWidth = 0.0f; - float m_currentAlpha = 0.0f; }; } // namespace df