diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index c8b6c4dc03..d2afb09d40 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -39,7 +39,7 @@ namespace df namespace { -constexpr float kIsometryAngle = math::pi * 80.0f / 180.0f; +constexpr float kIsometryAngle = math::pi * 76.0f / 180.0f; const double VSyncInterval = 0.06; //const double VSyncInterval = 0.014; @@ -1210,18 +1210,7 @@ void FrontendRenderer::RefreshModelView(ScreenBase const & screen) m_generalUniforms.SetMatrix4x4Value("modelView", mv.m_data); - float zScale; - if (screen.isPerspective()) - { - // TODO: Calculate exact value of zScale - double const averageScale3d = 3.0; - zScale = 2.0f / (screen.PixelRectIn3d().SizeY() * averageScale3d * screen.GetScale()); - } - else - { - zScale = 2.0f / (screen.GetHeight() * screen.GetScale()); - } - + float const zScale = screen.GetZScale(); m_generalUniforms.SetFloatValue("zScale", zScale); } diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp index 08336eac6d..7da84dda33 100644 --- a/drape_frontend/text_shape.cpp +++ b/drape_frontend/text_shape.cpp @@ -43,7 +43,7 @@ public: { m2::PointD pivot = TBase::GetPivot(screen, false); if (perspective) - pivot = screen.PtoP3d(pivot - m_offset, -m_pivotZ / screen.GetScale()) + m_offset; + pivot = screen.PtoP3d(pivot - m_offset, -m_pivotZ) + m_offset; return pivot; } @@ -54,7 +54,7 @@ public: if (IsBillboard()) { m2::PointD const pxPivot = screen.GtoP(m_pivot); - m2::PointD const pxPivotPerspective = screen.PtoP3d(pxPivot, -m_pivotZ / screen.GetScale()); + m2::PointD const pxPivotPerspective = screen.PtoP3d(pxPivot, -m_pivotZ); m2::RectD pxRectPerspective = GetPixelRect(screen, false); pxRectPerspective.Offset(-pxPivot); diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp index 89455ae424..32ba27b523 100644 --- a/geometry/screenbase.cpp +++ b/geometry/screenbase.cpp @@ -440,14 +440,19 @@ m2::PointD ScreenBase::PtoP3d(m2::PointD const & pt) const return PtoP3d(pt, 0.0); } +double ScreenBase::GetZScale() const +{ + double const averageScale3d = m_isPerspective ? 2.7 : 1.0; + return 2.0 / (m_Scale * m_ViewportRect.SizeY() * averageScale3d); +} + m2::PointD ScreenBase::PtoP3d(m2::PointD const & pt, double ptZ) const { if (!m_isPerspective) return pt; - Vector3dT const normalizedPoint{float(2.0 * pt.x / m_PixelRect.SizeX() - 1.0), -float(2.0 * pt.y / m_PixelRect.SizeY() - 1.0), - float(2.0 * ptZ / m_PixelRect.SizeY()), 1.0}; + float(ptZ * GetZScale()), 1.0}; Vector3dT const perspectivePoint = normalizedPoint * m_Pto3d; diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp index 9ac6650bd6..2346f1dd0b 100644 --- a/geometry/screenbase.hpp +++ b/geometry/screenbase.hpp @@ -140,6 +140,7 @@ public: double GetMaxRotationAngle() const { return m_3dMaxAngleX; } double GetAngleFOV() const { return m_3dFOV; } double GetScale3d() const { return m_3dScale; } + double GetZScale() const; double GetDepth3d() const { return m_3dFarZ - m_3dNearZ; }