From 13a826a7906500ee41ca0b71b745fc827fdb03cd Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Tue, 15 May 2018 11:55:41 +0300 Subject: [PATCH] Debug ugc rendering. --- drape_frontend/apply_feature_functors.cpp | 29 ++++++++++++++++++++--- drape_frontend/apply_feature_functors.hpp | 3 ++- drape_frontend/backend_renderer.cpp | 13 +++++++++- drape_frontend/backend_renderer.hpp | 6 ++++- drape_frontend/colored_symbol_shape.cpp | 1 + drape_frontend/drape_engine.cpp | 10 +++++++- drape_frontend/drape_engine.hpp | 7 +++++- drape_frontend/engine_context.cpp | 4 +++- drape_frontend/engine_context.hpp | 6 ++++- drape_frontend/frontend_renderer.cpp | 1 + drape_frontend/message.hpp | 1 + drape_frontend/message_subclasses.hpp | 14 +++++++++++ drape_frontend/read_manager.cpp | 13 ++++++++-- drape_frontend/read_manager.hpp | 9 ++++++- drape_frontend/rule_drawer.cpp | 7 ++++-- map/framework.cpp | 17 ++++++++++++- 16 files changed, 125 insertions(+), 16 deletions(-) diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index d3faf7c3c3..9affc9a142 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -495,11 +495,12 @@ ApplyPointFeature::ApplyPointFeature(TileKey const & tileKey, TInsertShapeFn con , m_displacementMode(displacementMode) {} -void ApplyPointFeature::operator()(m2::PointD const & point, bool hasArea) +void ApplyPointFeature::operator()(m2::PointD const & point, bool hasArea, bool isUGC) { auto const & editor = osm::Editor::Instance(); m_hasPoint = true; m_hasArea = hasArea; + m_isUGC = isUGC; auto const featureStatus = editor.GetFeatureStatus(m_id); m_createdByEditor = featureStatus == osm::Editor::FeatureStatus::Created; m_obsoleteInEditor = featureStatus == osm::Editor::FeatureStatus::Obsolete; @@ -570,7 +571,7 @@ void ApplyPointFeature::Finish(ref_ptr texMng) } bool const hasPOI = m_symbolRule != nullptr; - + double const mainScale = df::VisualParams::Instance().GetVisualScale(); if (hasPOI) { PoiSymbolViewParams params(m_id); @@ -580,7 +581,6 @@ void ApplyPointFeature::Finish(ref_ptr texMng) params.m_minVisibleScale = m_minVisibleScale; params.m_rank = m_rank; params.m_symbolName = m_symbolRule->name(); - double const mainScale = df::VisualParams::Instance().GetVisualScale(); params.m_extendingSize = static_cast(mainScale * m_symbolRule->min_distance()); params.m_posZ = m_posZ; params.m_hasArea = m_hasArea; @@ -614,6 +614,29 @@ void ApplyPointFeature::Finish(ref_ptr texMng) m2::PointF(0.0f, 0.0f) /* symbolOffset */, dp::Center /* symbolAnchor */, 0 /* textIndex */)); } + + if (m_isUGC) + { + df::ColoredSymbolViewParams params; + params.m_featureID = m_id; + params.m_tileCenter = m_tileRect.Center(); + params.m_color = dp::Color::Yellow(); + params.m_radiusInPixels = hasPOI ? static_cast(symbolSize.x / 2.0 + mainScale * 3) + : static_cast(mainScale * 7); + params.m_anchor = dp::Center; + params.m_startOverlayRank = hasPOI ? dp::OverlayRank2 : dp::OverlayRank1; + params.m_specialDisplacement = specialDisplacementMode ? SpecialDisplacement::SpecialMode + : SpecialDisplacement::None; + params.m_specialPriority = specialModePriority; + params.m_depthLayer = m_depthLayer; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; + params.m_depth = static_cast(m_symbolDepth); + + auto coloredShape = make_unique_dp(m2::PointD(m_centerPoint), params, + m_tileKey, 0 /* textIndex */, true); + m_insertShape(std::move(coloredShape)); + } } ApplyAreaFeature::ApplyAreaFeature(TileKey const & tileKey, TInsertShapeFn const & insertShape, diff --git a/drape_frontend/apply_feature_functors.hpp b/drape_frontend/apply_feature_functors.hpp index da857828f0..f276a57f9a 100644 --- a/drape_frontend/apply_feature_functors.hpp +++ b/drape_frontend/apply_feature_functors.hpp @@ -81,7 +81,7 @@ public: CaptionDescription const & captions, float posZ, int displacementMode, RenderState::DepthLayer depthLayer); - void operator()(m2::PointD const & point, bool hasArea); + void operator()(m2::PointD const & point, bool hasArea, bool isUGC); void ProcessPointRule(Stylist::TRuleWrapper const & rule); void Finish(ref_ptr texMng); @@ -93,6 +93,7 @@ private: bool m_hasArea; bool m_createdByEditor; bool m_obsoleteInEditor; + bool m_isUGC; RenderState::DepthLayer m_depthLayer; double m_symbolDepth; SymbolRuleProto const * m_symbolRule; diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 2cbbeab6ba..566e45cce6 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -30,7 +30,8 @@ BackendRenderer::BackendRenderer(Params && params) : BaseRenderer(ThreadsCommutator::ResourceUploadThread, params) , m_model(params.m_model) , m_readManager(make_unique_dp(params.m_commutator, m_model, - params.m_allow3dBuildings, params.m_trafficEnabled)) + params.m_allow3dBuildings, params.m_trafficEnabled, + std::move(params.m_isUGCFn))) , 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) @@ -493,6 +494,16 @@ void BackendRenderer::AcceptMessage(ref_ptr message) break; } + case Message::EnableUGCRendering: + { + ref_ptr msg = message; + m_readManager->EnableUGCRendering(msg->IsEnabled()); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(msg->IsEnabled()), + MessagePriority::Normal); + break; + } + default: ASSERT(false, ()); break; diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 4d07e3383b..670728d3bb 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -27,6 +27,8 @@ class ReadManager; class RouteBuilder; class MetalineManager; +using TIsUGCFn = function; + class BackendRenderer : public BaseRenderer { public: @@ -38,7 +40,7 @@ public: ref_ptr factory, ref_ptr texMng, MapDataProvider const & model, TUpdateCurrentCountryFn const & updateCurrentCountryFn, ref_ptr requestedTiles, bool allow3dBuildings, bool trafficEnabled, - bool simplifiedTrafficColors) + bool simplifiedTrafficColors, TIsUGCFn && isUGCFn) : BaseRenderer::Params(apiVersion, commutator, factory, texMng) , m_model(model) , m_updateCurrentCountryFn(updateCurrentCountryFn) @@ -46,6 +48,7 @@ public: , m_allow3dBuildings(allow3dBuildings) , m_trafficEnabled(trafficEnabled) , m_simplifiedTrafficColors(simplifiedTrafficColors) + , m_isUGCFn(std::move(isUGCFn)) { } @@ -55,6 +58,7 @@ public: bool m_allow3dBuildings; bool m_trafficEnabled; bool m_simplifiedTrafficColors; + TIsUGCFn m_isUGCFn; }; BackendRenderer(Params && params); diff --git a/drape_frontend/colored_symbol_shape.cpp b/drape_frontend/colored_symbol_shape.cpp index 80fa3de490..197cab63e9 100644 --- a/drape_frontend/colored_symbol_shape.cpp +++ b/drape_frontend/colored_symbol_shape.cpp @@ -291,6 +291,7 @@ void ColoredSymbolShape::Draw(ref_ptr batcher, if (m_params.m_specialDisplacement == SpecialDisplacement::UserMark) handle->SetUserMarkOverlay(true); + handle->SetOverlayRank(m_params.m_startOverlayRank); } auto state = CreateGLState(gpu::COLORED_SYMBOL_PROGRAM, m_params.m_depthLayer); state.SetProgram3dIndex(gpu::COLORED_SYMBOL_BILLBOARD_PROGRAM); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 7fe08c3b52..4fee4b813f 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -98,7 +98,8 @@ DrapeEngine::DrapeEngine(Params && params) make_ref(m_requestedTiles), params.m_allow3dBuildings, params.m_trafficEnabled, - params.m_simplifiedTrafficColors); + params.m_simplifiedTrafficColors, + std::move(params.m_isUGCFn)); m_backend = make_unique_dp(std::move(brParams)); @@ -787,6 +788,13 @@ void DrapeEngine::SetPosteffectEnabled(PostprocessRenderer::Effect effect, bool MessagePriority::Normal); } +void DrapeEngine::EnableUGCRendering(bool enabled) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(enabled), + MessagePriority::Normal); +} + void DrapeEngine::RunFirstLaunchAnimation() { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index b56724b9bb..d309cfddd0 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -66,7 +66,9 @@ public: bool isRoutingActive, bool isAutozoomEnabled, bool simplifiedTrafficColors, - OverlaysShowStatsCallback && overlaysShowStatsCallback) + OverlaysShowStatsCallback && overlaysShowStatsCallback, + TIsUGCFn && isUGCFn + ) : m_apiVersion(apiVersion) , m_factory(factory) , m_viewport(viewport) @@ -86,6 +88,7 @@ public: , m_isAutozoomEnabled(isAutozoomEnabled) , m_simplifiedTrafficColors(simplifiedTrafficColors) , m_overlaysShowStatsCallback(std::move(overlaysShowStatsCallback)) + , m_isUGCFn(std::move(isUGCFn)) {} dp::ApiVersion m_apiVersion; @@ -107,6 +110,7 @@ public: bool m_isAutozoomEnabled; bool m_simplifiedTrafficColors; OverlaysShowStatsCallback m_overlaysShowStatsCallback; + TIsUGCFn m_isUGCFn; }; DrapeEngine(Params && params); @@ -211,6 +215,7 @@ public: void RemoveAllCustomFeatures(); void SetPosteffectEnabled(PostprocessRenderer::Effect effect, bool enabled); + void EnableUGCRendering(bool enabled); void RunFirstLaunchAnimation(); diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index 72b3bc21b0..8d1d64ed9c 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -15,7 +15,8 @@ EngineContext::EngineContext(TileKey tileKey, CustomFeaturesContextWeakPtr customFeaturesContext, bool is3dBuildingsEnabled, bool isTrafficEnabled, - int displacementMode) + int displacementMode, + TIsUGCFn const & isUGCFn) : m_tileKey(tileKey) , m_commutator(commutator) , m_texMng(texMng) @@ -24,6 +25,7 @@ EngineContext::EngineContext(TileKey tileKey, , m_3dBuildingsEnabled(is3dBuildingsEnabled) , m_trafficEnabled(isTrafficEnabled) , m_displacementMode(displacementMode) + , m_isUGCFn(isUGCFn) {} ref_ptr EngineContext::GetTextureManager() const diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index 71a3af3ca9..936e8838c0 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -22,6 +22,7 @@ class MetalineManager; class EngineContext { public: + using TIsUGCFn = function; EngineContext(TileKey tileKey, ref_ptr commutator, ref_ptr texMng, @@ -29,11 +30,13 @@ public: CustomFeaturesContextWeakPtr customFeaturesContext, bool is3dBuildingsEnabled, bool isTrafficEnabled, - int displacementMode); + int displacementMode, + TIsUGCFn const & isUGCFn); TileKey const & GetTileKey() const { return m_tileKey; } bool Is3dBuildingsEnabled() const { return m_3dBuildingsEnabled; } bool IsTrafficEnabled() const { return m_trafficEnabled; } + bool IsUGC(FeatureID const & fid) { return m_isUGCFn ? m_isUGCFn(fid) : false; } int GetDisplacementMode() const { return m_displacementMode; } CustomFeaturesContextWeakPtr GetCustomFeaturesContext() const { return m_customFeaturesContext; } ref_ptr GetTextureManager() const; @@ -56,5 +59,6 @@ private: bool m_3dBuildingsEnabled; bool m_trafficEnabled; int m_displacementMode; + TIsUGCFn m_isUGCFn; }; } // namespace df diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 0eeca0d50d..62a88aea9b 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -755,6 +755,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::SetSimplifiedTrafficColors: case Message::SetDisplacementMode: case Message::UpdateMetalines: + case Message::EnableUGCRendering: { m_forceUpdateScene = true; break; diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index f7604d2fc0..32abe518d7 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -85,6 +85,7 @@ public: UpdateMetalines, PostUserEvent, FinishTexturesInitialization, + EnableUGCRendering, }; virtual ~Message() {} diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 66a3773f99..5c05a47cf1 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1149,6 +1149,20 @@ private: bool const m_enabled; }; +class EnableUGCRenderingMessage : public Message +{ +public: + EnableUGCRenderingMessage(bool enabled) + : m_enabled(enabled) + {} + + Type GetType() const override { return Message::EnableUGCRendering; } + bool IsEnabled() const { return m_enabled; } + +private: + bool const m_enabled; +}; + class RunFirstLaunchAnimationMessage : public Message { public: diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index 320eba5776..960542f950 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -44,7 +44,7 @@ bool ReadManager::LessByTileInfo::operator()(std::shared_ptr const & l } ReadManager::ReadManager(ref_ptr commutator, MapDataProvider & model, - bool allow3dBuildings, bool trafficEnabled) + bool allow3dBuildings, bool trafficEnabled, TIsUGCFn && isUGCFn) : m_commutator(commutator) , m_model(model) , m_have3dBuildings(false) @@ -52,10 +52,12 @@ ReadManager::ReadManager(ref_ptr commutator, MapDataProvider , m_trafficEnabled(trafficEnabled) , m_displacementMode(dp::displacement::kDefaultMode) , m_modeChanged(false) + , m_ugcRenderingEnabled(false) , m_tasksPool(64, ReadMWMTaskFactory(m_model)) , m_counter(0) , m_generationCounter(0) , m_userMarksGenerationCounter(0) + , m_isUGCFn(isUGCFn) { Start(); } @@ -235,7 +237,8 @@ void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey, m_commutator, texMng, metalineMng, m_customFeaturesContext, m_have3dBuildings && m_allow3dBuildings, - m_trafficEnabled, m_displacementMode); + m_trafficEnabled, m_displacementMode, + m_ugcRenderingEnabled ? m_isUGCFn : nullptr); std::shared_ptr tileInfo = std::make_shared(std::move(context)); m_tileInfos.insert(tileInfo); ReadMWMTask * task = m_tasksPool.Get(); @@ -379,4 +382,10 @@ bool ReadManager::RemoveAllCustomFeatures() m_customFeaturesContext = std::make_shared(CustomFeatures()); return true; } + +void ReadManager::EnableUGCRendering(bool enabled) +{ + m_ugcRenderingEnabled = enabled; +} + } // namespace df diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index df2ee53633..88fd375c99 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -32,8 +32,10 @@ uint8_t constexpr kReadingThreadsCount = 2; class ReadManager { public: + using TIsUGCFn = function; + ReadManager(ref_ptr commutator, MapDataProvider & model, - bool allow3dBuildings, bool trafficEnabled); + bool allow3dBuildings, bool trafficEnabled, TIsUGCFn && isUGCFn); void Start(); void Stop(); @@ -60,6 +62,8 @@ public: bool IsModeChanged() const { return m_modeChanged; } + void EnableUGCRendering(bool enabled); + private: void OnTaskFinished(threads::IRoutine * task); bool MustDropAllTiles(ScreenBase const & screen) const; @@ -79,6 +83,7 @@ private: bool m_trafficEnabled; int m_displacementMode; bool m_modeChanged; + bool m_ugcRenderingEnabled; struct LessByTileInfo { @@ -101,6 +106,8 @@ private: CustomFeaturesContextPtr m_customFeaturesContext; + TIsUGCFn m_isUGCFn; + void CancelTileInfo(std::shared_ptr const & tileToCancel); void ClearTileInfo(std::shared_ptr const & tileToClear); void IncreaseCounter(int value); diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index ee193c7f17..16e0bca94c 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -22,6 +22,7 @@ #include "base/assert.hpp" #include "base/logging.hpp" +#include "drape_frontend/text_shape.hpp" #ifdef DRAW_TILE_NET #include "drape_frontend/line_shape.hpp" #include "drape_frontend/text_shape.hpp" @@ -329,7 +330,8 @@ void RuleDrawer::ProcessAreaStyle(FeatureType const & f, Stylist const & s, f.ResetGeometry(); featureCenter = feature::GetCenter(f, FeatureType::BEST_GEOMETRY); } - apply(featureCenter, true /* hasArea */); + bool const isUGC = m_context->IsUGC(f.GetID()); + apply(featureCenter, true /* hasArea */, isUGC); } if (CheckCancelled()) @@ -450,7 +452,8 @@ void RuleDrawer::ProcessPointStyle(FeatureType const & f, Stylist const & s, TIn s.GetCaptionDescription(), 0.0f /* posZ */, m_context->GetDisplacementMode(), depthLayer); apply.SetHotelData(ExtractHotelData(f)); - f.ForEachPoint([&apply](m2::PointD const & pt) { apply(pt, false /* hasArea */); }, zoomLevel); + bool const isUGC = m_context->IsUGC(f.GetID()); + f.ForEachPoint([&apply, isUGC](m2::PointD const & pt) { apply(pt, false /* hasArea */, isUGC); }, zoomLevel); if (CheckCancelled()) return; diff --git a/map/framework.cpp b/map/framework.cpp index d3e40ac28e..ec33aa1cee 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1701,6 +1701,11 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, m_localAdsManager.GetStatistics().RegisterEvents(std::move(statEvents)); }; + auto isUGCFn = [this](FeatureID const & id) + { + auto const ugc = m_ugcApi->GetLoader().GetUGC(id); + return !ugc.IsEmpty(); + }; auto isCountryLoadedByNameFn = bind(&Framework::IsCountryLoadedByName, this, _1); auto updateCurrentCountryFn = bind(&Framework::OnUpdateCurrentCountry, this, _1, _2); @@ -1725,7 +1730,7 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, move(myPositionModeChangedFn), allow3dBuildings, trafficEnabled, params.m_isChoosePositionMode, params.m_isChoosePositionMode, GetSelectedFeatureTriangles(), m_routingManager.IsRoutingActive() && m_routingManager.IsRoutingFollowing(), - isAutozoomEnabled, simplifiedTrafficColors, move(overlaysShowStatsFn)); + isAutozoomEnabled, simplifiedTrafficColors, move(overlaysShowStatsFn), move(isUGCFn)); m_drapeEngine = make_unique_dp(move(p)); m_drapeEngine->SetModelViewListener([this](ScreenBase const & screen) @@ -2635,6 +2640,16 @@ bool Framework::ParseDrapeDebugCommand(string const & query) false /* enabled */); return true; } + else if (query == "?ugc") + { + m_drapeEngine->EnableUGCRendering(true /* enabled */); + return true; + } + else if (query == "?no-ugc") + { + m_drapeEngine->EnableUGCRendering(false /* enabled */); + return true; + } return false; }