diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 7faddeef7ca..18430ed7f92 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -31,6 +31,7 @@ #include #include #include +#include using std::list; @@ -5016,11 +5017,24 @@ bool CStaticFunctionDefinitions::GetCameraMatrix(CVector& vecPosition, CVector& fFOV = m_pCamera->GetAccurateFOV(); - if (!m_pCamera->IsInFixedMode() && fRoll == 0.0f) + if (fRoll == 0.0f) { - CVector rotation; - m_pCamera->GetRotationDegrees(rotation); - fRoll = rotation.fZ; + // Calculate roll from camera matrix when not directly available + CMatrix matrix; + m_pCamera->GetMatrix(matrix); + + CVector worldUp(0.0f, 0.0f, 1.0f); + CVector cameraUp = matrix.vUp; + CVector cameraRight = matrix.vRight; + + // Project camera up vector onto plane perpendicular to camera front + CVector projectedUp = cameraUp - matrix.vFront * cameraUp.DotProduct(&matrix.vFront); + projectedUp.Normalize(); + + float cosRoll = worldUp.DotProduct(&projectedUp); + float sinRoll = cameraRight.DotProduct(&worldUp); + + fRoll = std::atan2(sinRoll, cosRoll) * (180.0f / std::numbers::pi_v); } return true;