Add horizontal FoV to CEngine

1008-fix
immibis 2017-08-05 19:45:08 +12:00
parent 0de347d430
commit 2751db3245
2 changed files with 23 additions and 3 deletions

View File

@ -2631,6 +2631,10 @@ void CEngine::SetFocus(float focus)
float farPlane = m_deepView[0] * m_clippingDistance; float farPlane = m_deepView[0] * m_clippingDistance;
float aspect = static_cast<float>(m_size.x) / static_cast<float>(m_size.y); float aspect = static_cast<float>(m_size.x) / static_cast<float>(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); Math::LoadProjectionMatrix(m_matProj, m_focus, aspect, 0.5f, farPlane);
} }
@ -2639,6 +2643,16 @@ float CEngine::GetFocus()
return m_focus; return m_focus;
} }
float CEngine::GetVFovAngle()
{
return m_focus;
}
float CEngine::GetHFovAngle()
{
return m_hfov;
}
void CEngine::SetShadowColor(float value) void CEngine::SetShadowColor(float value)
{ {
m_shadowColor = value; m_shadowColor = value;

View File

@ -921,12 +921,16 @@ public:
void SetTerrainVision(float vision); 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 0.75 = normal
1.50 = wide-angle */ 1.50 = wide-angle */
void SetFocus(float focus); void SetFocus(float focus);
//! Deprecated alias for GetVFovAngle
float GetFocus(); float GetFocus();
float GetVFovAngle();
float GetHFovAngle();
//@} //@}
//@{ //@{
@ -1318,8 +1322,10 @@ protected:
Math::Matrix m_matProj; Math::Matrix m_matProj;
//! View matrix for 3D scene //! View matrix for 3D scene
Math::Matrix m_matView; 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; float m_focus;
//! Horizontal field-of-view angle, calculated from vertical FOV and aspect ratio
float m_hfov;
//! Projection matrix for rendering shadow maps //! Projection matrix for rendering shadow maps
Math::Matrix m_shadowProjMat; Math::Matrix m_shadowProjMat;