From 748e601ff9730469e674eafe34e5092a59e3171a Mon Sep 17 00:00:00 2001 From: Mohab <133429578+MohabCodeX@users.noreply.github.com> Date: Sat, 6 Sep 2025 15:28:15 +0300 Subject: [PATCH 1/3] Calculate camera roll from matrix when not in fixed mode --- .../logic/CStaticFunctionDefinitions.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 7faddeef7ca..5fa5db66840 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -5016,11 +5016,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 = atan2(sinRoll, cosRoll) * (180.0f / 3.14159265359f); } return true; From 511ae199217679ae7c625c37c93f77d3ce72639d Mon Sep 17 00:00:00 2001 From: Mohab <133429578+MohabCodeX@users.noreply.github.com> Date: Sat, 6 Sep 2025 16:16:52 +0300 Subject: [PATCH 2/3] Refactor --- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 5fa5db66840..fc3b8abc3f1 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -5033,7 +5033,7 @@ bool CStaticFunctionDefinitions::GetCameraMatrix(CVector& vecPosition, CVector& float cosRoll = worldUp.DotProduct(&projectedUp); float sinRoll = cameraRight.DotProduct(&worldUp); - fRoll = atan2(sinRoll, cosRoll) * (180.0f / 3.14159265359f); + fRoll = std::atan2(sinRoll, cosRoll) * (180.0f / std::numbers::pi_v); } return true; From 6a0bb33324ebfd24cffc5a34f3d6f5c97c7fa2b9 Mon Sep 17 00:00:00 2001 From: Mohab <133429578+MohabCodeX@users.noreply.github.com> Date: Sat, 6 Sep 2025 16:42:12 +0300 Subject: [PATCH 3/3] Add missing include for in CStaticFunctionDefinitions.cpp --- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index fc3b8abc3f1..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;