From 61302d6c64c2b17e07db8748761674b9beffba9d Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Tue, 12 Jan 2016 15:39:57 +0300 Subject: [PATCH] Show 3d buildings right after enabling the setting. --- drape_frontend/backend_renderer.cpp | 2 +- drape_frontend/backend_renderer.hpp | 4 +- drape_frontend/drape_engine.cpp | 5 +- drape_frontend/drape_engine.hpp | 5 +- drape_frontend/frontend_renderer.cpp | 126 ++++++++++++++++----------- drape_frontend/frontend_renderer.hpp | 9 +- drape_frontend/read_manager.cpp | 4 +- drape_frontend/read_manager.hpp | 2 +- map/framework.cpp | 10 ++- 9 files changed, 102 insertions(+), 65 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 2f54a2ec66..8be34cb08c 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -25,7 +25,7 @@ namespace df BackendRenderer::BackendRenderer(Params const & params) : BaseRenderer(ThreadsCommutator::ResourceUploadThread, params) , m_model(params.m_model) - , m_readManager(make_unique_dp(params.m_commutator, m_model)) + , m_readManager(make_unique_dp(params.m_commutator, m_model, params.m_allow3dBuildings)) , m_requestedTiles(params.m_requestedTiles) { #ifdef DEBUG diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 7d5eee462c..6f18e246f5 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -32,14 +32,16 @@ public: { Params(ref_ptr commutator, ref_ptr factory, ref_ptr texMng, MapDataProvider const & model, - ref_ptr requestedTiles) + ref_ptr requestedTiles, bool allow3dBuildings) : BaseRenderer::Params(commutator, factory, texMng) , m_model(model) , m_requestedTiles(requestedTiles) + , m_allow3dBuildings(allow3dBuildings) {} MapDataProvider const & m_model; ref_ptr m_requestedTiles; + bool m_allow3dBuildings; }; BackendRenderer(Params const & params); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 6b753d01ba..0fb3ee6bc6 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -62,12 +62,13 @@ DrapeEngine::DrapeEngine(Params && params) bind(&DrapeEngine::TapEvent, this, _1, _2, _3, _4), bind(&DrapeEngine::UserPositionChanged, this, _1), bind(&DrapeEngine::MyPositionModeChanged, this, _1), - mode, make_ref(m_requestedTiles)); + mode, make_ref(m_requestedTiles), params.m_allow3dBuildings); m_frontend = make_unique_dp(frParams); BackendRenderer::Params brParams(frParams.m_commutator, frParams.m_oglContextFactory, - frParams.m_texMng, params.m_model, make_ref(m_requestedTiles)); + frParams.m_texMng, params.m_model, make_ref(m_requestedTiles), + params.m_allow3dBuildings); m_backend = make_unique_dp(brParams); m_widgetsInfo = move(params.m_info); diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 8184a79177..b8ce24fa66 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -39,7 +39,8 @@ public: MapDataProvider const & model, double vs, gui::TWidgetsInitInfo && info, - pair const & initialMyPositionMode) + pair const & initialMyPositionMode, + bool allow3dBuildings) : m_factory(factory) , m_stringsBundle(stringBundle) , m_viewport(viewport) @@ -47,6 +48,7 @@ public: , m_vs(vs) , m_info(move(info)) , m_initialMyPositionMode(initialMyPositionMode) + , m_allow3dBuildings(allow3dBuildings) {} ref_ptr m_factory; @@ -56,6 +58,7 @@ public: double m_vs; gui::TWidgetsInitInfo m_info; pair m_initialMyPositionMode; + bool m_allow3dBuildings; }; DrapeEngine(Params && params); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 76874a8dc0..3bd7901ddf 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -49,7 +49,7 @@ FrontendRenderer::FrontendRenderer(Params const & params) , m_transparentLayer(new TransparentLayer()) , m_overlayTree(new dp::OverlayTree()) , m_enablePerspectiveInNavigation(false) - , m_enable3dBuildings(false) + , m_enable3dBuildings(params.m_allow3dBuildings) , m_isIsometry(false) , m_viewport(params.m_viewport) , m_userEventStream(params.m_isCountryLoadedFn) @@ -171,40 +171,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::InvalidateRect: { ref_ptr m = message; - TTilesCollection tiles; - ScreenBase screen = m_userEventStream.GetCurrentScreen(); - m2::RectD rect = m->GetRect(); - if (rect.Intersect(screen.ClipRect())) - { - m_tileTree->Invalidate(); - ResolveTileKeys(rect, tiles); - - auto eraseFunction = [&tiles](vector> & groups) - { - vector > newGroups; - for (drape_ptr & group : groups) - { - if (tiles.find(group->GetTileKey()) == tiles.end()) - newGroups.push_back(move(group)); - } - - swap(groups, newGroups); - }; - - eraseFunction(m_renderGroups); - eraseFunction(m_deferredRenderGroups); - - BaseBlockingMessage::Blocker blocker; - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(blocker, tiles), - MessagePriority::High); - blocker.Wait(); - - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), move(tiles)); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(), - MessagePriority::UberHighSingleton); - } + InvalidateRect(m->GetRect()); break; } @@ -516,10 +483,11 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::Allow3dMode: { ref_ptr const msg = message; - bool const isPerspective = m_userEventStream.GetCurrentScreen().isPerspective(); + ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); + #ifdef OMIM_OS_DESKTOP if (m_enablePerspectiveInNavigation == msg->AllowPerspective() && - m_enablePerspectiveInNavigation != isPerspective) + m_enablePerspectiveInNavigation != screen.isPerspective()) { if (m_enablePerspectiveInNavigation) AddUserEvent(EnablePerspectiveEvent(msg->GetRotationAngle(), msg->GetAngleFOV(), @@ -528,19 +496,28 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) AddUserEvent(DisablePerspectiveEvent()); } #endif - m_enablePerspectiveInNavigation = msg->AllowPerspective(); - m_enable3dBuildings = msg->Allow3dBuildings(); - if (m_myPositionController->IsInRouting()) + if (m_enable3dBuildings != msg->Allow3dBuildings()) { - if (m_enablePerspectiveInNavigation && !isPerspective && !m_perspectiveDiscarded) + m_enable3dBuildings = msg->Allow3dBuildings(); + CheckIsometryMinScale(screen); + InvalidateRect(screen.ClipRect()); + } + + if (m_enablePerspectiveInNavigation != msg->AllowPerspective()) + { + m_enablePerspectiveInNavigation = msg->AllowPerspective(); + if (m_myPositionController->IsInRouting()) { - AddUserEvent(EnablePerspectiveEvent(msg->GetRotationAngle(), msg->GetAngleFOV(), - true /* animated */, true /* immediately start */)); - } - else if (!m_enablePerspectiveInNavigation && (isPerspective || m_perspectiveDiscarded)) - { - DisablePerspective(); + if (m_enablePerspectiveInNavigation && !screen.isPerspective() && !m_perspectiveDiscarded) + { + AddUserEvent(EnablePerspectiveEvent(msg->GetRotationAngle(), msg->GetAngleFOV(), + true /* animated */, true /* immediately start */)); + } + else if (!m_enablePerspectiveInNavigation && (screen.isPerspective() || m_perspectiveDiscarded)) + { + DisablePerspective(); + } } } break; @@ -562,6 +539,44 @@ unique_ptr FrontendRenderer::CreateRoutine() return make_unique(*this); } +void FrontendRenderer::InvalidateRect(m2::RectD const & gRect) +{ + TTilesCollection tiles; + ScreenBase screen = m_userEventStream.GetCurrentScreen(); + m2::RectD rect = gRect; + if (rect.Intersect(screen.ClipRect())) + { + m_tileTree->Invalidate(); + ResolveTileKeys(rect, tiles); + + auto eraseFunction = [&tiles](vector> & groups) + { + vector > newGroups; + for (drape_ptr & group : groups) + { + if (tiles.find(group->GetTileKey()) == tiles.end()) + newGroups.push_back(move(group)); + } + + swap(groups, newGroups); + }; + + eraseFunction(m_renderGroups); + eraseFunction(m_deferredRenderGroups); + + BaseBlockingMessage::Blocker blocker; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(blocker, tiles), + MessagePriority::High); + blocker.Wait(); + + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), move(tiles)); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::UberHighSingleton); + } +} + void FrontendRenderer::OnResize(ScreenBase const & screen) { m2::RectD const viewportRect = screen.isPerspective() ? screen.PixelRectIn3d() : screen.PixelRect(); @@ -1035,15 +1050,23 @@ void FrontendRenderer::DisablePerspective() AddUserEvent(DisablePerspectiveEvent()); } -void FrontendRenderer::CheckMinAllowableIn3dScale() +void FrontendRenderer::CheckIsometryMinScale(const ScreenBase &screen) { bool const isScaleAllowableIn3d = UserEventStream::IsScaleAllowableIn3d(m_currentZoomLevel); - m_isIsometry = m_enable3dBuildings && isScaleAllowableIn3d; + bool const isIsometry = m_enable3dBuildings && isScaleAllowableIn3d; + if (m_isIsometry != isIsometry) + { + m_isIsometry = isIsometry; + RefreshPivotTransform(screen); + } +} +void FrontendRenderer::CheckPerspectiveMinScale() +{ if (!m_enablePerspectiveInNavigation || m_userEventStream.IsInPerspectiveAnimation()) return; - bool const switchTo2d = !isScaleAllowableIn3d; + bool const switchTo2d = !UserEventStream::IsScaleAllowableIn3d(m_currentZoomLevel); if ((!switchTo2d && !m_perspectiveDiscarded) || (switchTo2d && !m_userEventStream.GetCurrentScreen().isPerspective())) return; @@ -1056,7 +1079,8 @@ void FrontendRenderer::ResolveZoomLevel(ScreenBase const & screen) { m_currentZoomLevel = GetDrawTileScale(screen); - CheckMinAllowableIn3dScale(); + CheckIsometryMinScale(screen); + CheckPerspectiveMinScale(); } void FrontendRenderer::OnTap(m2::PointD const & pt, bool isLongTap) diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 4ffdf3a16c..bdbac1100b 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -80,7 +80,8 @@ public: TUserPositionChangedFn const & positionChangedFn, location::TMyPositionModeChanged myPositionModeCallback, location::EMyPositionMode initMode, - ref_ptr requestedTiles) + ref_ptr requestedTiles, + bool allow3dBuildings) : BaseRenderer::Params(commutator, factory, texMng) , m_viewport(viewport) , m_modelViewChangedFn(modelViewChangedFn) @@ -90,6 +91,7 @@ public: , m_myPositionModeCallback(myPositionModeCallback) , m_initMyPositionMode(initMode) , m_requestedTiles(requestedTiles) + , m_allow3dBuildings(allow3dBuildings) {} Viewport m_viewport; @@ -100,6 +102,7 @@ public: location::TMyPositionModeChanged m_myPositionModeCallback; location::EMyPositionMode m_initMyPositionMode; ref_ptr m_requestedTiles; + bool m_allow3dBuildings; }; FrontendRenderer(Params const & params); @@ -155,7 +158,8 @@ private: int GetCurrentZoomLevel() const; int GetCurrentZoomLevelForData() const; void ResolveZoomLevel(ScreenBase const & screen); - void CheckMinAllowableIn3dScale(); + void CheckPerspectiveMinScale(); + void CheckIsometryMinScale(ScreenBase const & screen); void DisablePerspective(); @@ -208,6 +212,7 @@ private: using TRenderGroupRemovePredicate = function const &)>; void RemoveRenderGroups(TRenderGroupRemovePredicate const & predicate); + void InvalidateRect(m2::RectD const & gRect); bool CheckTileGenerations(TileKey const & tileKey); void OnCompassTapped(); diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index 84c301fd98..e7445d3be0 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -31,13 +31,13 @@ struct LessCoverageCell } // namespace -ReadManager::ReadManager(ref_ptr commutator, MapDataProvider & model) +ReadManager::ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings) : m_commutator(commutator) , m_model(model) , m_pool(make_unique_dp(ReadCount(), bind(&ReadManager::OnTaskFinished, this, _1))) , m_forceUpdate(true) , m_need3dBuildings(false) - , m_allow3dBuildings(false) + , m_allow3dBuildings(allow3dBuildings) , m_modeChanged(false) , myPool(64, ReadMWMTaskFactory(m_memIndex, m_model)) , m_counter(0) diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index 34fba548cf..232b7d9c82 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -28,7 +28,7 @@ class CoverageUpdateDescriptor; class ReadManager { public: - ReadManager(ref_ptr commutator, MapDataProvider & model); + ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings); void UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, TTilesCollection const & tiles, ref_ptr texMng); diff --git a/map/framework.cpp b/map/framework.cpp index dbb4af00fa..f4732ae79f 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1248,6 +1248,10 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, GetPlatform().RunOnGuiThread(bind(&Framework::OnDownloadRetryCallback, this, countryIndex)); }; + bool allow3d; + bool allow3dBuildings; + Load3dMode(allow3d, allow3dBuildings); + df::DrapeEngine::Params p(contextFactory, make_ref(&m_stringsBundle), df::Viewport(0, 0, params.m_surfaceWidth, params.m_surfaceHeight), @@ -1257,7 +1261,8 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, downloadRetryFn), params.m_visualScale, move(params.m_widgetsInitInfo), - make_pair(params.m_initialMyPositionState, params.m_hasMyPositionState)); + make_pair(params.m_initialMyPositionState, params.m_hasMyPositionState), + allow3dBuildings); m_drapeEngine = make_unique_dp(move(p)); AddViewportListener([this](ScreenBase const & screen) @@ -1283,9 +1288,6 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, ActivateUserMark(mark, true); } - bool allow3d; - bool allow3dBuildings; - Load3dMode(allow3d, allow3dBuildings); Allow3dMode(allow3d, allow3dBuildings); // In case of the engine reinitialization recover route.