From 2bb74377c1a92f7d0a4851e7a08114b7761925a7 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 6 Dec 2016 11:31:42 +0300 Subject: [PATCH] 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