From cb8dcb7106541707409507c3b52bad5481c2acd5 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 6 Jan 2016 16:13:40 +0300 Subject: [PATCH] Fixed rotation on compass tap in perspective mode. --- drape_frontend/frontend_renderer.cpp | 4 ++-- drape_frontend/my_position_controller.cpp | 10 ++++++---- drape_frontend/my_position_controller.hpp | 3 ++- drape_frontend/user_event_stream.cpp | 20 ++++++++++---------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 4d78799b29..e71407b4da 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -670,8 +670,8 @@ bool FrontendRenderer::CheckTileGenerations(TileKey const & tileKey) void FrontendRenderer::OnCompassTapped() { - m_myPositionController->StopCompassFollow(); - m_userEventStream.AddEvent(RotateEvent(0.0)); + if (!m_myPositionController->StopCompassFollow()) + m_userEventStream.AddEvent(RotateEvent(0.0)); } FeatureID FrontendRenderer::GetVisiblePOI(m2::PointD const & pixelPoint) const diff --git a/drape_frontend/my_position_controller.cpp b/drape_frontend/my_position_controller.cpp index dcdd70a90a..95c292b2c8 100644 --- a/drape_frontend/my_position_controller.cpp +++ b/drape_frontend/my_position_controller.cpp @@ -120,6 +120,7 @@ void MyPositionController::UpdatePixelPosition(ScreenBase const & screen) { m_positionYOffset = screen.isPerspective() ? POSITION_Y_OFFSET_3D : POSITION_Y_OFFSET; m_pixelPositionRaF = screen.P3dtoP(GetRaFPixelBinding()); + m_pixelPositionF = screen.P3dtoP(m_pixelRect.Center()); } void MyPositionController::SetListener(ref_ptr listener) @@ -365,8 +366,7 @@ void MyPositionController::AnimateStateTransition(location::EMyPositionMode oldM else if (oldMode == location::MODE_ROTATE_AND_FOLLOW && (newMode == location::MODE_FOLLOW || newMode == location::MODE_UNKNOWN_POSITION)) { - ChangeModelView(0.0); - ChangeModelView(m_position); + ChangeModelView(m_position, 0.0, m_pixelPositionF, -1); } } @@ -481,13 +481,15 @@ void MyPositionController::StopLocationFollow() m_afterPendingMode = location::MODE_NOT_FOLLOW; } -void MyPositionController::StopCompassFollow() +bool MyPositionController::StopCompassFollow() { if (GetMode() != location::MODE_ROTATE_AND_FOLLOW) - return; + return false; SetModeInfo(ChangeMode(m_modeInfo, location::MODE_FOLLOW)); Follow(); + + return true; } void MyPositionController::ChangeModelView(m2::PointD const & center) diff --git a/drape_frontend/my_position_controller.hpp b/drape_frontend/my_position_controller.hpp index ca2a5ae300..bac83c5460 100644 --- a/drape_frontend/my_position_controller.hpp +++ b/drape_frontend/my_position_controller.hpp @@ -75,7 +75,7 @@ public: void DeactivateRouting(); void StopLocationFollow(); - void StopCompassFollow(); + bool StopCompassFollow(); void NextMode(int preferredZoomLevel = -1); void TurnOff(); void Invalidate(); @@ -148,6 +148,7 @@ private: m2::RectD m_pixelRect; m2::PointD m_pixelPositionRaF; + m2::PointD m_pixelPositionF; double m_positionYOffset; bool m_isVisible; diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 51bde907c1..c976d36539 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -178,18 +178,18 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChange, bool & break; case UserEvent::EVENT_ROTATE: { - m2::AnyRectD dstRect = GetTargetRect(); - dstRect.SetAngle(e.m_rotate.m_targetAzimut); - if (m_navigator.Screen().isPerspective()) + ScreenBase const & screen = m_navigator.Screen(); + if (screen.isPerspective()) { - ScreenBase const & screen = m_navigator.Screen(); - ScreenBase screenNew = screen; - screenNew.SetAngle(e.m_rotate.m_targetAzimut); - - m2::PointD const screenCenter = screen.P3dtoP(screen.PixelRectIn3d().Center()); - dstRect.Offset(screen.PtoG(screenCenter) - screenNew.PtoG(screenCenter)); + m2::PointD pt = screen.P3dtoP(screen.PixelRectIn3d().Center()); + breakAnim = SetFollowAndRotate(screen.PtoG(pt), pt, e.m_rotate.m_targetAzimut, -1, true); + } + else + { + m2::AnyRectD dstRect = GetTargetRect(); + dstRect.SetAngle(e.m_rotate.m_targetAzimut); + breakAnim = SetRect(dstRect, true); } - breakAnim = SetRect(dstRect, true); } break; case UserEvent::EVENT_FOLLOW_AND_ROTATE: