From 2751db324536a8f1bca8519a628ac1d39d7f1911 Mon Sep 17 00:00:00 2001 From: immibis Date: Sat, 5 Aug 2017 19:45:08 +1200 Subject: [PATCH] Add horizontal FoV to CEngine --- src/graphics/engine/engine.cpp | 14 ++++++++++++++ src/graphics/engine/engine.h | 12 +++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index a1458384..a6d21cd2 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -2631,6 +2631,10 @@ void CEngine::SetFocus(float focus) float farPlane = m_deepView[0] * m_clippingDistance; float aspect = static_cast(m_size.x) / static_cast(m_size.y); + + // Compute H-FoV from V-FoV and aspect ratio. + m_hfov = 2.0f * atan(aspect * tan(focus / 2.0f)); + Math::LoadProjectionMatrix(m_matProj, m_focus, aspect, 0.5f, farPlane); } @@ -2639,6 +2643,16 @@ float CEngine::GetFocus() return m_focus; } +float CEngine::GetVFovAngle() +{ + return m_focus; +} + +float CEngine::GetHFovAngle() +{ + return m_hfov; +} + void CEngine::SetShadowColor(float value) { m_shadowColor = value; diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 429bca14..655bc024 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -921,12 +921,16 @@ public: void SetTerrainVision(float vision); //@{ - //! Management of camera angle - /** + //! Management of camera vertical field-of-view angle. + /** This is specified in radians. + Horizontal FoV is calculated based on vertical FoV and aspect ratio. 0.75 = normal 1.50 = wide-angle */ void SetFocus(float focus); + //! Deprecated alias for GetVFovAngle float GetFocus(); + float GetVFovAngle(); + float GetHFovAngle(); //@} //@{ @@ -1318,8 +1322,10 @@ protected: Math::Matrix m_matProj; //! View matrix for 3D scene Math::Matrix m_matView; - //! Camera angle for 3D scene + //! Camera vertical field-of-view angle for 3D scene. A.k.a. m_vfov float m_focus; + //! Horizontal field-of-view angle, calculated from vertical FOV and aspect ratio + float m_hfov; //! Projection matrix for rendering shadow maps Math::Matrix m_shadowProjMat;