From a77d984bde27d4916b2d507b428213c45fe44a76 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Tue, 3 Jul 2018 13:11:02 +0300 Subject: [PATCH] Fixed transit scheme regeneration on Android. New lines caps. --- drape_frontend/backend_renderer.cpp | 33 ++------- drape_frontend/backend_renderer.hpp | 4 -- drape_frontend/frontend_renderer.cpp | 27 -------- drape_frontend/message_subclasses.hpp | 9 --- drape_frontend/transit_scheme_builder.cpp | 41 +++++++----- drape_frontend/transit_scheme_builder.hpp | 34 +++++----- drape_frontend/transit_scheme_renderer.cpp | 78 ++++++++++++++-------- drape_frontend/transit_scheme_renderer.hpp | 14 ++-- shaders/GL/transit_circle.fsh.glsl | 6 ++ 9 files changed, 111 insertions(+), 135 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index fde72cc3c3..d0da551c84 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -32,10 +32,7 @@ BackendRenderer::BackendRenderer(Params && params) , m_readManager(make_unique_dp(params.m_commutator, m_model, params.m_allow3dBuildings, params.m_trafficEnabled, std::move(params.m_isUGCFn))) - , m_transitBuilder(make_unique_dp(bind(&BackendRenderer::FlushTransitRenderData, this, _1), - bind(&BackendRenderer::FlushTransitMarkersRenderData, this, _1), - bind(&BackendRenderer::FlushTransitTextRenderData, this, _1), - bind(&BackendRenderer::FlushTransitStubsRenderData, this, _1))) + , m_transitBuilder(make_unique_dp(bind(&BackendRenderer::FlushTransitRenderData, this, _1))) , m_trafficGenerator(make_unique_dp(bind(&BackendRenderer::FlushTrafficRenderData, this, _1))) , m_userMarkGenerator(make_unique_dp(bind(&BackendRenderer::FlushUserMarksRenderData, this, _1))) , m_requestedTiles(params.m_requestedTiles) @@ -339,7 +336,7 @@ void BackendRenderer::AcceptMessage(ref_ptr message) m_texMng->OnSwitchMapStyle(); RecacheMapShapes(); m_trafficGenerator->InvalidateTexturesCache(); - m_transitBuilder->BuildScheme(m_texMng); + m_transitBuilder->RebuildSchemes(m_texMng); break; } @@ -440,14 +437,13 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_transitBuilder->SetVisibleMwms(msg->GetVisibleMwms()); - m_transitBuilder->UpdateScheme(msg->GetTransitDisplayInfos()); - m_transitBuilder->BuildScheme(m_texMng); + m_transitBuilder->UpdateSchemes(msg->GetTransitDisplayInfos(), m_texMng); break; } case Message::RegenerateTransitScheme: { - m_transitBuilder->BuildScheme(m_texMng); + m_transitBuilder->RebuildSchemes(m_texMng); break; } @@ -672,27 +668,6 @@ void BackendRenderer::FlushTransitRenderData(TransitRenderData && renderData) MessagePriority::Normal); } -void BackendRenderer::FlushTransitMarkersRenderData(TransitRenderData && renderData) -{ - m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(std::move(renderData)), - MessagePriority::Normal); -} - -void BackendRenderer::FlushTransitTextRenderData(TransitRenderData && renderData) -{ - m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(std::move(renderData)), - MessagePriority::Normal); -} - -void BackendRenderer::FlushTransitStubsRenderData(TransitRenderData && renderData) -{ - m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(std::move(renderData)), - MessagePriority::Normal); -} - void BackendRenderer::FlushTrafficRenderData(TrafficRenderData && renderData) { m_commutator->PostMessage(ThreadsCommutator::RenderThread, diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 40bdaf771f..09f227cffe 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -101,10 +101,6 @@ private: void FlushGeometry(TileKey const & key, dp::GLState const & state, drape_ptr && buffer); void FlushTransitRenderData(TransitRenderData && renderData); - void FlushTransitMarkersRenderData(TransitRenderData && renderData); - void FlushTransitTextRenderData(TransitRenderData && renderData); - void FlushTransitStubsRenderData(TransitRenderData && renderData); - void FlushTrafficRenderData(TrafficRenderData && renderData); void FlushUserMarksRenderData(TUserMarksRenderData && renderData); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 8a930046a7..33b14be677 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -471,33 +471,6 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) break; } - case Message::FlushTransitMarkers: - { - ref_ptr msg = message; - auto renderData = msg->AcceptRenderData(); - m_transitSchemeRenderer->AddMarkersRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree), - std::move(renderData)); - break; - } - - case Message::FlushTransitText: - { - ref_ptr msg = message; - auto renderData = msg->AcceptRenderData(); - m_transitSchemeRenderer->AddTextRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree), - std::move(renderData)); - break; - } - - case Message::FlushTransitStubs: - { - ref_ptr msg = message; - auto renderData = msg->AcceptRenderData(); - m_transitSchemeRenderer->AddStubsRenderData(make_ref(m_gpuProgramManager), make_ref(m_overlayTree), - std::move(renderData)); - break; - } - case Message::FlushSubrouteArrows: { ref_ptr msg = message; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index e6594480ce..6466ff5d3e 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1077,15 +1077,6 @@ public: using FlushTransitSchemeMessage = FlushRenderDataMessage; -using FlushTransitMarkersMessage = FlushRenderDataMessage; - -using FlushTransitTextMessage = FlushRenderDataMessage; - -using FlushTransitStubsMessage = FlushRenderDataMessage; - class DrapeApiAddLinesMessage : public Message { public: diff --git a/drape_frontend/transit_scheme_builder.cpp b/drape_frontend/transit_scheme_builder.cpp index 6565d55394..50c7129941 100644 --- a/drape_frontend/transit_scheme_builder.cpp +++ b/drape_frontend/transit_scheme_builder.cpp @@ -50,7 +50,7 @@ std::string const kTransitTransferOuterColor = "TransitTransferOuterMarker"; std::string const kTransitTransferInnerColor = "TransitTransferInnerMarker"; std::string const kTransitStopInnerColor = "TransitStopInnerMarker"; -float const kTransitMarkTextSize = 12.0f; +float const kTransitMarkTextSize = 11.0f; struct TransitStaticVertex { @@ -279,7 +279,8 @@ void TransitSchemeBuilder::SetVisibleMwms(std::vector const & vis m_visibleMwms = visibleMwms; } -void TransitSchemeBuilder::UpdateScheme(TransitDisplayInfos const & transitDisplayInfos) +void TransitSchemeBuilder::UpdateSchemes(TransitDisplayInfos const & transitDisplayInfos, + ref_ptr textures) { for (auto const & mwmInfo : transitDisplayInfos) { @@ -296,6 +297,7 @@ void TransitSchemeBuilder::UpdateScheme(TransitDisplayInfos const & transitDispl CollectShapes(transitDisplayInfo, scheme); PrepareScheme(scheme); + BuildScheme(mwmId, textures); } } @@ -309,16 +311,19 @@ void TransitSchemeBuilder::Clear(MwmSet::MwmId const & mwmId) m_schemes.erase(mwmId); } -void TransitSchemeBuilder::BuildScheme(ref_ptr textures) +void TransitSchemeBuilder::RebuildSchemes(ref_ptr textures) { + for (auto const & mwmScheme : m_schemes) + BuildScheme(mwmScheme.first, textures); +} + +void TransitSchemeBuilder::BuildScheme(MwmSet::MwmId const & mwmId, ref_ptr textures) +{ + if (m_schemes.find(mwmId) == m_schemes.end()) + return; ++m_recacheId; - for (auto const & mwmId : m_visibleMwms) - { - if (m_schemes.find(mwmId) == m_schemes.end()) - continue; - GenerateShapes(mwmId); - GenerateStops(mwmId, textures); - } + GenerateShapes(mwmId); + GenerateStops(mwmId, textures); } void TransitSchemeBuilder::CollectStops(TransitDisplayInfo const & transitDisplayInfo, @@ -537,7 +542,10 @@ void TransitSchemeBuilder::GenerateShapes(MwmSet::MwmId const & mwmId) { dp::SessionGuard guard(batcher, [this, &mwmId, &scheme](dp::GLState const & state, drape_ptr && b) { - TransitRenderData renderData(state, m_recacheId, mwmId, scheme.m_pivot, std::move(b)); + TransitRenderData::Type type = TransitRenderData::Type::Lines; + if (state.GetProgram() == gpu::Program::TransitCircle) + type = TransitRenderData::Type::LinesCaps; + TransitRenderData renderData(type, state, m_recacheId, mwmId, scheme.m_pivot, std::move(b)); m_flushRenderDataFn(std::move(renderData)); }); @@ -581,13 +589,14 @@ void TransitSchemeBuilder::GenerateStops(MwmSet::MwmId const & mwmId, ref_ptr && b) { - TransitRenderData renderData(state, m_recacheId, mwmId, scheme.m_pivot, std::move(b)); + TransitRenderData::Type type = TransitRenderData::Type::Stubs; if (state.GetProgram() == gpu::Program::TransitMarker) - m_flushMarkersRenderDataFn(std::move(renderData)); + type = TransitRenderData::Type::Markers; else if (state.GetProgram() == gpu::Program::TextOutlined) - m_flushTextRenderDataFn(std::move(renderData)); - else - m_flushStubsRenderDataFn(std::move(renderData)); + type = TransitRenderData::Type::Text; + + TransitRenderData renderData(type, state, m_recacheId, mwmId, scheme.m_pivot, std::move(b)); + m_flushRenderDataFn(std::move(renderData)); }; uint32_t const kBatchSize = 5000; diff --git a/drape_frontend/transit_scheme_builder.hpp b/drape_frontend/transit_scheme_builder.hpp index 60c2229949..567a728229 100644 --- a/drape_frontend/transit_scheme_builder.hpp +++ b/drape_frontend/transit_scheme_builder.hpp @@ -21,15 +21,26 @@ extern std::vector const kTransitLinesWidthInPixel; struct TransitRenderData { + enum class Type + { + LinesCaps, + Lines, + Markers, + Text, + Stubs + }; + + Type m_type; dp::GLState m_state; uint32_t m_recacheId; MwmSet::MwmId m_mwmId; m2::PointD m_pivot; drape_ptr m_bucket; - TransitRenderData(dp::GLState const & state, uint32_t recacheId, MwmSet::MwmId const & mwmId, m2::PointD const pivot, - drape_ptr && bucket) - : m_state(state) + TransitRenderData(Type type, dp::GLState const & state, uint32_t recacheId, MwmSet::MwmId const & mwmId, + m2::PointD const pivot, drape_ptr && bucket) + : m_type(type) + , m_state(state) , m_recacheId(recacheId) , m_mwmId(mwmId) , m_pivot(pivot) @@ -96,20 +107,14 @@ public: using TFlushRenderDataFn = function; - TransitSchemeBuilder(TFlushRenderDataFn const & flushFn, - TFlushRenderDataFn const & flushMarkersFn, - TFlushRenderDataFn const & flushTextFn, - TFlushRenderDataFn const & flushStubsFn) + TransitSchemeBuilder(TFlushRenderDataFn const & flushFn) : m_flushRenderDataFn(flushFn) - , m_flushMarkersRenderDataFn(flushMarkersFn) - , m_flushTextRenderDataFn(flushTextFn) - , m_flushStubsRenderDataFn(flushStubsFn) {} void SetVisibleMwms(std::vector const & visibleMwms); - void UpdateScheme(TransitDisplayInfos const & transitDisplayInfos); - void BuildScheme(ref_ptr textures); + void UpdateSchemes(TransitDisplayInfos const & transitDisplayInfos, ref_ptr textures); + void RebuildSchemes(ref_ptr textures); void Clear(); void Clear(MwmSet::MwmId const & mwmId); @@ -125,6 +130,8 @@ private: std::map m_transfers; }; + void BuildScheme(MwmSet::MwmId const & mwmId, ref_ptr textures); + void CollectStops(TransitDisplayInfo const & transitDisplayInfo, MwmSet::MwmId const & mwmId, MwmSchemeData & scheme); @@ -162,9 +169,6 @@ private: std::vector m_visibleMwms; TFlushRenderDataFn m_flushRenderDataFn; - TFlushRenderDataFn m_flushMarkersRenderDataFn; - TFlushRenderDataFn m_flushTextRenderDataFn; - TFlushRenderDataFn m_flushStubsRenderDataFn; uint32_t m_recacheId = 0; }; diff --git a/drape_frontend/transit_scheme_renderer.cpp b/drape_frontend/transit_scheme_renderer.cpp index aa90042778..23b2ed76f7 100644 --- a/drape_frontend/transit_scheme_renderer.cpp +++ b/drape_frontend/transit_scheme_renderer.cpp @@ -29,7 +29,7 @@ float CalculateHalfWidth(ScreenBase const & screen) bool TransitSchemeRenderer::HasRenderData(int zoomLevel) const { - return !m_renderData.empty() && zoomLevel >= kTransitSchemeMinZoomLevel; + return !m_linesRenderData.empty() && zoomLevel >= kTransitSchemeMinZoomLevel; } void TransitSchemeRenderer::ClearGLDependentResources(ref_ptr tree) @@ -40,7 +40,8 @@ void TransitSchemeRenderer::ClearGLDependentResources(ref_ptr t RemoveOverlays(tree, m_colorSymbolRenderData); } - m_renderData.clear(); + m_linesRenderData.clear(); + m_linesCapsRenderData.clear(); m_markersRenderData.clear(); m_textRenderData.clear(); m_colorSymbolRenderData.clear(); @@ -48,7 +49,8 @@ void TransitSchemeRenderer::ClearGLDependentResources(ref_ptr t void TransitSchemeRenderer::Clear(MwmSet::MwmId const & mwmId, ref_ptr tree) { - ClearRenderData(mwmId, nullptr /* tree */, m_renderData); + ClearRenderData(mwmId, nullptr /* tree */, m_linesRenderData); + ClearRenderData(mwmId, nullptr /* tree */, m_linesCapsRenderData); ClearRenderData(mwmId, nullptr /* tree */, m_markersRenderData); ClearRenderData(mwmId, tree, m_textRenderData); ClearRenderData(mwmId, tree, m_colorSymbolRenderData); @@ -80,25 +82,24 @@ void TransitSchemeRenderer::ClearRenderData(TRemovePredicate const & predicate, void TransitSchemeRenderer::AddRenderData(ref_ptr mng, ref_ptr tree, TransitRenderData && renderData) { - PrepareRenderData(mng, tree, m_renderData, std::move(renderData)); -} - -void TransitSchemeRenderer::AddMarkersRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData) -{ - PrepareRenderData(mng, tree, m_markersRenderData, std::move(renderData)); -} - -void TransitSchemeRenderer::AddTextRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData) -{ - PrepareRenderData(mng, tree, m_textRenderData, std::move(renderData)); -} - -void TransitSchemeRenderer::AddStubsRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData) -{ - PrepareRenderData(mng, tree, m_colorSymbolRenderData, std::move(renderData)); + switch (renderData.m_type) + { + case TransitRenderData::Type::LinesCaps: + PrepareRenderData(mng, tree, m_linesCapsRenderData, std::move(renderData)); + break; + case TransitRenderData::Type::Lines: + PrepareRenderData(mng, tree, m_linesRenderData, std::move(renderData)); + break; + case TransitRenderData::Type::Markers: + PrepareRenderData(mng, tree, m_markersRenderData, std::move(renderData)); + break; + case TransitRenderData::Type::Text: + PrepareRenderData(mng, tree, m_textRenderData, std::move(renderData)); + break; + case TransitRenderData::Type::Stubs: + PrepareRenderData(mng, tree, m_colorSymbolRenderData, std::move(renderData)); + break; + } } void TransitSchemeRenderer::PrepareRenderData(ref_ptr mng, ref_ptr tree, @@ -132,6 +133,7 @@ void TransitSchemeRenderer::RenderTransit(ScreenBase const & screen, int zoomLev float const pixelHalfWidth = CalculateHalfWidth(screen); + RenderLinesCaps(screen, mng, commonUniforms, pixelHalfWidth); RenderLines(screen, mng, commonUniforms, pixelHalfWidth); RenderMarkers(screen, mng, commonUniforms, pixelHalfWidth); { @@ -165,11 +167,12 @@ void TransitSchemeRenderer::RemoveOverlays(ref_ptr tree, std::v data.m_bucket->RemoveOverlayHandles(tree); } -void TransitSchemeRenderer::RenderLines(ScreenBase const & screen, ref_ptr mng, - dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth) +void TransitSchemeRenderer::RenderLinesCaps(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth) { - GLFunctions::glDisable(gl_const::GLDepthTest); - for (auto & renderData : m_renderData) + GLFunctions::glEnable(gl_const::GLDepthTest); + GLFunctions::glClear(gl_const::GLDepthBit); + for (auto & renderData : m_linesCapsRenderData) { ref_ptr program = mng->GetProgram(renderData.m_state.GetProgram()); program->Bind(); @@ -187,10 +190,32 @@ void TransitSchemeRenderer::RenderLines(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth) +{ + GLFunctions::glEnable(gl_const::GLDepthTest); + for (auto & renderData : m_linesRenderData) + { + ref_ptr program = mng->GetProgram(renderData.m_state.GetProgram()); + program->Bind(); + dp::ApplyState(renderData.m_state, program); + + dp::UniformValuesStorage uniforms = commonUniforms; + math::Matrix mv = screen.GetModelView(renderData.m_pivot, kShapeCoordScalar); + uniforms.SetMatrix4x4Value("u_modelView", mv.m_data); + + uniforms.SetFloatValue("u_lineHalfWidth", pixelHalfWidth); + dp::ApplyUniforms(uniforms, program); + + renderData.m_bucket->Render(false /* draw as line */); + } +} + void TransitSchemeRenderer::RenderMarkers(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth) { GLFunctions::glEnable(gl_const::GLDepthTest); + GLFunctions::glClear(gl_const::GLDepthBit); for (auto & renderData : m_markersRenderData) { auto program = mng->GetProgram(renderData.m_state.GetProgram()); @@ -213,6 +238,7 @@ void TransitSchemeRenderer::RenderMarkers(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms) { + GLFunctions::glDisable(gl_const::GLDepthTest); auto const & params = df::VisualParams::Instance().GetGlyphVisualParams(); for (auto & renderData : m_textRenderData) { diff --git a/drape_frontend/transit_scheme_renderer.hpp b/drape_frontend/transit_scheme_renderer.hpp index 556a3333f7..b222841d29 100644 --- a/drape_frontend/transit_scheme_renderer.hpp +++ b/drape_frontend/transit_scheme_renderer.hpp @@ -19,14 +19,7 @@ class OverlayTree; class TransitSchemeRenderer { public: - void AddRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData); - void AddMarkersRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData); - void AddTextRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData); - void AddStubsRenderData(ref_ptr mng, ref_ptr tree, - TransitRenderData && renderData); + void AddRenderData(ref_ptr mng, ref_ptr tree, TransitRenderData && renderData); bool HasRenderData(int zoomLevel) const; @@ -59,6 +52,8 @@ private: void RenderLines(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth); + void RenderLinesCaps(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth); void RenderMarkers(ScreenBase const & screen, ref_ptr mng, dp::UniformValuesStorage const & commonUniforms, float pixelHalfWidth); void RenderText(ScreenBase const & screen, ref_ptr mng, @@ -67,7 +62,8 @@ private: dp::UniformValuesStorage const & commonUniforms); uint32_t m_lastRecacheId = 0; - std::vector m_renderData; + std::vector m_linesRenderData; + std::vector m_linesCapsRenderData; std::vector m_markersRenderData; std::vector m_textRenderData; std::vector m_colorSymbolRenderData; diff --git a/shaders/GL/transit_circle.fsh.glsl b/shaders/GL/transit_circle.fsh.glsl index c47d3bd404..8eb6bb9aea 100644 --- a/shaders/GL/transit_circle.fsh.glsl +++ b/shaders/GL/transit_circle.fsh.glsl @@ -1,3 +1,7 @@ +// Warning! Beware to use this shader. "discard" command may significally reduce performance. +// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding +// fragments from depth buffer. + varying vec3 v_radius; varying vec4 v_color; @@ -15,5 +19,7 @@ void main() float stepValue = smoothstep(smallRadius * smallRadius, v_radius.z * v_radius.z, dot(v_radius.xy, v_radius.xy)); finalColor.a = finalColor.a * (1.0 - stepValue); + if (finalColor.a < 0.01) + discard; gl_FragColor = samsungGoogleNexusWorkaround(finalColor); }