From 2ac8539d73b9502c5ca05b85f2a05c019f393a84 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Thu, 9 Jun 2016 16:30:39 +0300 Subject: [PATCH] Calculate current rotation angle in perspective mode. --- drape_frontend/frontend_renderer.cpp | 6 ++++- drape_frontend/navigator.cpp | 4 ++-- drape_frontend/rule_drawer.cpp | 4 ++-- geometry/screenbase.cpp | 35 ++++++++++++++++++++-------- geometry/screenbase.hpp | 2 +- 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 3b06a0adbf..9b826a08c7 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1232,7 +1232,11 @@ void FrontendRenderer::RefreshModelView(ScreenBase const & screen) m_generalUniforms.SetMatrix4x4Value("modelView", mv.m_data); - float const zScale = 2.0f / (screen.GetHeight() * screen.GetScale()); + // TODO: Calculate exact value of zScale + double const averageScale3d = 3.0; + float const zScale = 2.0f / (screen.PixelRectIn3d().SizeY() * averageScale3d * screen.GetScale()); + //float const zScale = 2.0f / (screen.GetHeight() * screen.GetScale()); + m_generalUniforms.SetFloatValue("zScale", zScale); } diff --git a/drape_frontend/navigator.cpp b/drape_frontend/navigator.cpp index b68c595e37..a2e2034ec1 100644 --- a/drape_frontend/navigator.cpp +++ b/drape_frontend/navigator.cpp @@ -309,9 +309,9 @@ void Navigator::Disable3dMode() bool Navigator::UpdatePerspective() { - bool const isPerspective = m_Screen.isPerspective(); + double const maxPerspAngle = m_Screen.GetMaxRotationAngle(); m_Screen.UpdatePerspectiveParameters(); - return isPerspective != m_Screen.isPerspective(); + return maxPerspAngle != m_Screen.GetMaxRotationAngle(); } m2::AnyRectD ToRotated(Navigator const & navigator, m2::RectD const & rect) diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index a3b2ba949a..2a7a3a8102 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -203,10 +203,10 @@ void RuleDrawer::operator()(FeatureType const & f) double const lat = MercatorBounds::YToLat(featureCenter.y); m2::RectD rectMercator = MercatorBounds::MetresToXY(lon, lat, heightInMeters); - areaHeight = m2::PointD(rectMercator.SizeX(), rectMercator.SizeY()).Length(); + areaHeight = (rectMercator.SizeX() + rectMercator.SizeY()) / 2.0; rectMercator = MercatorBounds::MetresToXY(lon, lat, minHeigthInMeters); - areaMinHeight = m2::PointD(rectMercator.SizeX(), rectMercator.SizeY()).Length(); + areaMinHeight = (rectMercator.SizeX() + rectMercator.SizeY()) / 2.0; } bool applyPointStyle = s.PointStyleExists(); diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp index fd5ce38f9b..7dc94b4efd 100644 --- a/geometry/screenbase.cpp +++ b/geometry/screenbase.cpp @@ -7,6 +7,13 @@ #include "std/cmath.hpp" +double constexpr kPerspectiveAngleFOV = math::pi / 3.0; +double constexpr kMaxPerspectiveAngle1 = math::pi4; +double constexpr kMaxPerspectiveAngle2 = math::pi * 55.0 / 180.0; + +double constexpr kStartPerspectiveScale1 = 1.7e-5; +double constexpr kEndPerspectiveScale1 = 0.3e-5; +double constexpr kEndPerspectiveScale2 = 0.13e-5; ScreenBase::ScreenBase() : m_PixelRect(0, 0, 640, 480), @@ -26,7 +33,6 @@ ScreenBase::ScreenBase() : { m_GtoP = math::Identity(); m_PtoG = math::Identity(); -// UpdateDependentParameters(); } ScreenBase::ScreenBase(m2::RectI const & pxRect, m2::AnyRectD const & glbRect) @@ -77,13 +83,20 @@ void ScreenBase::UpdateDependentParameters() double ScreenBase::CalculatePerspectiveAngle(double scale) { - double const kStartPerspectiveScale = 0.13e-4; - double const kMaxScale = 0.13e-5; - double const kMaxPerspectiveAngle = math::pi4; - - if (scale > kStartPerspectiveScale) + if (scale > kStartPerspectiveScale1) return 0.0; - return kMaxPerspectiveAngle * (kStartPerspectiveScale - scale) / (kStartPerspectiveScale - kMaxScale); + else if (scale > kEndPerspectiveScale1) + { + double const k = (kStartPerspectiveScale1 - scale) / (kStartPerspectiveScale1 - kEndPerspectiveScale1); + return kMaxPerspectiveAngle1 * k; + } + else if (scale > kEndPerspectiveScale2) + { + double const k = (kEndPerspectiveScale1 - scale) / (kEndPerspectiveScale1 - kEndPerspectiveScale2); + return kMaxPerspectiveAngle1 + (kMaxPerspectiveAngle2 - kMaxPerspectiveAngle1) * k; + } + else + return kMaxPerspectiveAngle2 * 0.99; } void ScreenBase::UpdatePerspectiveParameters() @@ -91,10 +104,12 @@ void ScreenBase::UpdatePerspectiveParameters() double const angle = CalculatePerspectiveAngle(m_Scale); if (angle > 0.0) { - if (m_isPerspective) - SetRotationAngle(angle); + if (!m_isPerspective || (angle < kMaxPerspectiveAngle1 && m_3dMaxAngleX > kMaxPerspectiveAngle1)) + ApplyPerspective(angle, kMaxPerspectiveAngle1, kPerspectiveAngleFOV); + else if (angle > m_3dMaxAngleX) + ApplyPerspective(angle, kMaxPerspectiveAngle2, kPerspectiveAngleFOV); else - ApplyPerspective(angle, math::pi4, math::pi / 3); + SetRotationAngle(angle); } else if (m_isPerspective) ResetPerspective(); diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp index ef5125d9e4..24b4076643 100644 --- a/geometry/screenbase.hpp +++ b/geometry/screenbase.hpp @@ -132,7 +132,7 @@ public: void SetRotationAngle(double rotationAngle); double GetRotationAngle() const { return m_3dAngleX; } - + double GetMaxRotationAngle() const { return m_3dMaxAngleX; } double GetAngleFOV() const { return m_3dFOV; } m2::PointD P3dtoP(m2::PointD const & pt) const;