Merge pull request #4875 from rokuz/traffic-fixed-screen-blinking

Fixed map blinking on traffic turning on, fixes
This commit is contained in:
Daria Volvenkova 2016-12-06 14:58:50 +03:00 committed by GitHub
commit 1d2f02c0e6
13 changed files with 52 additions and 40 deletions

View file

@ -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)

View file

@ -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)));
}

View file

@ -15,7 +15,8 @@ unordered_map<int, unordered_map<int, dp::Color>> 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<int, unordered_map<int, dp::Color>> 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) },

View file

@ -13,6 +13,7 @@ enum ColorConstant
MyPositionAccuracy,
Selection,
Route,
RouteOutline,
RoutePedestrian,
RouteBicycle,
Arrow3D,

View file

@ -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> message)
{
ref_ptr<EnableTrafficMessage> 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));

View file

@ -340,6 +340,8 @@ private:
bool m_needRestoreSize;
bool m_trafficStateChanged;
#ifdef DEBUG
bool m_isTeardowned;
#endif

View file

@ -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<ArrowBorders> const & borders1, vector<ArrowBor
return true;
}
dp::Color GetOutlineColor(df::ColorConstant routeColor)
{
df::ColorConstant c = routeColor;
if (routeColor == df::ColorConstant::Route)
c = df::ColorConstant::RouteOutline;
return df::GetColorConstant(GetStyleReader().GetCurrentStyle(), c);
}
} // namespace
RouteRenderer::RouteRenderer()
: m_distanceFromBegin(0.0)
{}
void RouteRenderer::InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const
void RouteRenderer::InterpolateByZoom(ScreenBase const & screen, float & halfWidth, double & zoom) const
{
double const zoomLevel = GetZoomLevel(screen.GetScale());
zoom = trunc(zoomLevel);
@ -130,18 +128,9 @@ void RouteRenderer::InterpolateByZoom(ScreenBase const & screen, float & halfWid
float const lerpCoef = zoomLevel - zoom;
if (index < scales::UPPER_STYLE_SCALE)
{
halfWidth = kHalfWidthInPixel[index] + lerpCoef * (kHalfWidthInPixel[index + 1] - kHalfWidthInPixel[index]);
float const alpha1 = static_cast<float>(kAlphaValue[index]) / numeric_limits<uint8_t>::max();
float const alpha2 = static_cast<float>(kAlphaValue[index + 1]) / numeric_limits<uint8_t>::max();
alpha = alpha1 + lerpCoef * (alpha2 - alpha1);
}
else
{
halfWidth = kHalfWidthInPixel[scales::UPPER_STYLE_SCALE];
alpha = static_cast<float>(kAlphaValue[scales::UPPER_STYLE_SCALE]) / numeric_limits<uint8_t>::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<dp::GpuProgram> prg = mng->GetProgram(m_routeData->m_pattern.m_isDashed ?

View file

@ -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<RouteSignData> const & sign, ScreenBase const & screen,
ref_ptr<dp::GpuProgramManager> mng, dp::UniformValuesStorage const & commonUniforms);
@ -55,7 +55,6 @@ private:
drape_ptr<RouteSignData> m_finishRouteSign;
float m_currentHalfWidth = 0.0f;
float m_currentAlpha = 0.0f;
};
} // namespace df

View file

@ -2717,7 +2717,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;
}

View file

@ -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);
}
}

View file

@ -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();
};
}

View file

@ -14,6 +14,7 @@
<file>select.png</file>
<file>selectmode.png</file>
<file>clear.png</file>
<file>traffic.png</file>
</qresource>
<qresource prefix="/ui">
<file>logo.png</file>

BIN
qt/res/traffic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB