From 079eed0996e9711d9b68ff34ebaccbde6f1e6b7f Mon Sep 17 00:00:00 2001 From: Valeriy Mironov Date: Fri, 21 Mar 2025 22:26:35 +0000 Subject: [PATCH 1/2] Increase camera height for wider aspect ratios --- .../GameEngine/Source/Common/GlobalData.cpp | 19 +++++++++++++++++++ .../GameEngine/Source/Common/GlobalData.cpp | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp index 729cb478e4..6a58e64bed 100644 --- a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp @@ -1216,5 +1216,24 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_xResolution = xres; TheWritableGlobalData->m_yResolution = yres; + + // TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions + // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 + static const Real aspect_4_3 = 4.f / 3.f; + static const Real aspect_16_9 = 16.f / 9.f; + Real aspect = static_cast(xres) / static_cast(yres); + + // Resolution must be greater than 4:3 + // Screen width must be greater 640px and height greater 480 + if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { + if (aspect > aspect_16_9) + aspect = aspect_16_9; + const Real multi = aspect - aspect_4_3 + 1.0f; + const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; + + TheWritableGlobalData->m_maxCameraHeight *= multi * nerf; + TheWritableGlobalData->m_minCameraHeight *= multi * nerf; + TheWritableGlobalData->m_drawEntireTerrain = TRUE; + } } diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp index d9ad94723b..36a4f31f20 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp @@ -1252,5 +1252,24 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_xResolution = xres; TheWritableGlobalData->m_yResolution = yres; + + // TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions + // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 + static const Real aspect_4_3 = 4.f / 3.f; + static const Real aspect_16_9 = 16.f / 9.f; + Real aspect = static_cast(xres) / static_cast(yres); + + // Resolution must be greater than 4:3 + // Screen width must be greater 640px and height greater 480 + if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { + if (aspect > aspect_16_9) + aspect = aspect_16_9; + const Real multi = aspect - aspect_4_3 + 1.0f; + const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; + + TheWritableGlobalData->m_maxCameraHeight *= multi * nerf; + TheWritableGlobalData->m_minCameraHeight *= multi * nerf; + TheWritableGlobalData->m_drawEntireTerrain = TRUE; + } } From bf11d247d00e4b72d0e727716cbb3fbd022990fe Mon Sep 17 00:00:00 2001 From: Valeriy Mironov Date: Sat, 22 Mar 2025 12:10:10 +0000 Subject: [PATCH 2/2] Do not override max camera height, set camera height multiplier on resolution change --- .../GameEngine/Include/Common/GlobalData.h | 2 + .../GameEngine/Source/Common/CommandLine.cpp | 4 +- .../GameEngine/Source/Common/GlobalData.cpp | 53 ++++++++++-------- .../GUI/GUICallbacks/Menus/MainMenu.cpp | 3 +- .../GUI/GUICallbacks/Menus/OptionsMenu.cpp | 3 +- .../GameEngine/Source/GameClient/View.cpp | 2 +- .../Source/W3DDevice/GameClient/W3DView.cpp | 2 +- .../GameEngine/Include/Common/GlobalData.h | 2 + .../GameEngine/Source/Common/CommandLine.cpp | 4 +- .../GameEngine/Source/Common/GlobalData.cpp | 54 +++++++++++-------- .../GUI/GUICallbacks/Menus/MainMenu.cpp | 3 +- .../GUI/GUICallbacks/Menus/OptionsMenu.cpp | 3 +- .../GameEngine/Source/GameClient/View.cpp | 2 +- .../Source/W3DDevice/GameClient/W3DView.cpp | 2 +- 14 files changed, 79 insertions(+), 60 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/GlobalData.h b/Generals/Code/GameEngine/Include/Common/GlobalData.h index ac8e36f9e0..65bc0c93d1 100644 --- a/Generals/Code/GameEngine/Include/Common/GlobalData.h +++ b/Generals/Code/GameEngine/Include/Common/GlobalData.h @@ -72,6 +72,7 @@ class GlobalData : public SubsystemInterface void update() { } Bool setTimeOfDay( TimeOfDay tod ); ///< Use this function to set the Time of day; + void setResolution(Int xres, Int yres); static void parseGameDataDefinition( INI* ini ); @@ -159,6 +160,7 @@ class GlobalData : public SubsystemInterface Real m_cameraHeight; Real m_maxCameraHeight; Real m_minCameraHeight; + Real m_cameraHeightAspectRatioMultiplier; Real m_terrainHeightAtEdgeOfMap; Real m_unitDamagedThresh; Real m_unitReallyDamagedThresh; diff --git a/Generals/Code/GameEngine/Source/Common/CommandLine.cpp b/Generals/Code/GameEngine/Source/Common/CommandLine.cpp index 1563722b68..1c2bb3941f 100644 --- a/Generals/Code/GameEngine/Source/Common/CommandLine.cpp +++ b/Generals/Code/GameEngine/Source/Common/CommandLine.cpp @@ -389,7 +389,7 @@ Int parseXRes(char *args[], int num) { if (TheWritableGlobalData && num > 1) { - TheWritableGlobalData->m_xResolution = atoi(args[1]); + TheWritableGlobalData->setResolution(atoi(args[1]), TheWritableGlobalData->m_yResolution); return 2; } return 1; @@ -399,7 +399,7 @@ Int parseYRes(char *args[], int num) { if (TheWritableGlobalData && num > 1) { - TheWritableGlobalData->m_yResolution = atoi(args[1]); + TheWritableGlobalData->setResolution(TheWritableGlobalData->m_xResolution, atoi(args[1])); return 2; } return 1; diff --git a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp index 6a58e64bed..76db0c07ac 100644 --- a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp @@ -52,6 +52,7 @@ #include "GameClient/Color.h" #include "GameClient/TerrainVisual.h" +#include "GameClient/View.h" #include "GameNetwork/FirewallHelper.h" @@ -1076,6 +1077,35 @@ Bool GlobalData::setTimeOfDay( TimeOfDay tod ) } +// TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions +void GlobalData::setResolution(Int xres, Int yres) { + static const Real aspect_4_3 = 4.f / 3.f; + static const Real aspect_16_9 = 16.f / 9.f; + + m_xResolution = xres; + m_yResolution = yres; + + // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 + Real aspect = static_cast(xres) / static_cast(yres); + + if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { + if (aspect > aspect_16_9) + aspect = aspect_16_9; + const Real multi = aspect - aspect_4_3 + 1.0f; + const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; + m_cameraHeightAspectRatioMultiplier = multi * nerf; + m_drawEntireTerrain = TRUE; + } + else + { + m_cameraHeightAspectRatioMultiplier = 1.0f; + m_drawEntireTerrain = FALSE; + } + if (TheTacticalView) { + TheTacticalView->setDefaultView(0.0f, 0.0f, 1.0f); + } +} + //------------------------------------------------------------------------------------------------- /** Create a new global data instance to override the existing data set. The * initial values of the newly created instance will be a copy of the current @@ -1213,27 +1243,6 @@ void GlobalData::parseGameDataDefinition( INI* ini ) Int xres,yres; optionPref.getResolution(&xres, &yres); - - TheWritableGlobalData->m_xResolution = xres; - TheWritableGlobalData->m_yResolution = yres; - - // TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions - // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 - static const Real aspect_4_3 = 4.f / 3.f; - static const Real aspect_16_9 = 16.f / 9.f; - Real aspect = static_cast(xres) / static_cast(yres); - - // Resolution must be greater than 4:3 - // Screen width must be greater 640px and height greater 480 - if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { - if (aspect > aspect_16_9) - aspect = aspect_16_9; - const Real multi = aspect - aspect_4_3 + 1.0f; - const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; - - TheWritableGlobalData->m_maxCameraHeight *= multi * nerf; - TheWritableGlobalData->m_minCameraHeight *= multi * nerf; - TheWritableGlobalData->m_drawEntireTerrain = TRUE; - } + TheWritableGlobalData->setResolution(xres,yres); } diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp index c4d2321e1d..2f0f8d293d 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp @@ -737,8 +737,7 @@ void DeclineResolution() dispChanged = FALSE; newDispSettings = oldDispSettings; - TheWritableGlobalData->m_xResolution = newDispSettings.xRes; - TheWritableGlobalData->m_yResolution = newDispSettings.yRes; + TheWritableGlobalData->setResolution(newDispSettings.xRes, newDispSettings.yRes); TheHeaderTemplateManager->headerNotifyResolutionChange(); TheMouse->mouseNotifyResolutionChange(); diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index da7081488e..e909f167f1 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -1031,8 +1031,7 @@ static void saveOptions( void ) if (TheDisplay->setDisplayMode(xres,yres,bitDepth,TheDisplay->getWindowed())) { dispChanged = TRUE; - TheWritableGlobalData->m_xResolution = xres; - TheWritableGlobalData->m_yResolution = yres; + TheWritableGlobalData->setResolution(xres, yres); TheHeaderTemplateManager->headerNotifyResolutionChange(); TheMouse->mouseNotifyResolutionChange(); diff --git a/Generals/Code/GameEngine/Source/GameClient/View.cpp b/Generals/Code/GameEngine/Source/GameClient/View.cpp index ea453c9792..4eba5054b0 100644 --- a/Generals/Code/GameEngine/Source/GameClient/View.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/View.cpp @@ -102,7 +102,7 @@ void View::init( void ) m_maxZoom = 1.3f; m_minZoom = 0.2f; m_zoom = m_maxZoom; - m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight; + m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight * TheGlobalData->m_cameraHeightAspectRatioMultiplier; m_minHeightAboveGround = TheGlobalData->m_minCameraHeight; m_okToAdjustHeight = FALSE; diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp index 0740e7e3a5..0954b7c055 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp @@ -1617,7 +1617,7 @@ void W3DView::setDefaultView(Real pitch, Real angle, Real maxHeight) // MDC - we no longer want to rotate maps (design made all of them right to begin with) // m_defaultAngle = angle * M_PI/180.0f; m_defaultPitchAngle = pitch; - m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight*maxHeight; + m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight * TheGlobalData->m_cameraHeightAspectRatioMultiplier * maxHeight; if (m_minHeightAboveGround > m_maxHeightAboveGround) m_maxHeightAboveGround = m_minHeightAboveGround; } diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h index 792945072d..a42c15f6e4 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h @@ -75,6 +75,7 @@ class GlobalData : public SubsystemInterface void update() { } Bool setTimeOfDay( TimeOfDay tod ); ///< Use this function to set the Time of day; + void setResolution(Int xRes, Int yRes); static void parseGameDataDefinition( INI* ini ); @@ -166,6 +167,7 @@ class GlobalData : public SubsystemInterface Real m_cameraHeight; Real m_maxCameraHeight; Real m_minCameraHeight; + Real m_cameraHeightAspectRatioMultiplier; Real m_terrainHeightAtEdgeOfMap; Real m_unitDamagedThresh; Real m_unitReallyDamagedThresh; diff --git a/GeneralsMD/Code/GameEngine/Source/Common/CommandLine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/CommandLine.cpp index 41f4242bd6..fd72c67ab7 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/CommandLine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/CommandLine.cpp @@ -397,7 +397,7 @@ Int parseXRes(char *args[], int num) { if (TheWritableGlobalData && num > 1) { - TheWritableGlobalData->m_xResolution = atoi(args[1]); + TheWritableGlobalData->setResolution(atoi(args[1]), TheWritableGlobalData->m_yResolution); return 2; } return 1; @@ -407,7 +407,7 @@ Int parseYRes(char *args[], int num) { if (TheWritableGlobalData && num > 1) { - TheWritableGlobalData->m_yResolution = atoi(args[1]); + TheWritableGlobalData->setResolution(TheWritableGlobalData->m_xResolution, atoi(args[1])); return 2; } return 1; diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp index 36a4f31f20..030f984402 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp @@ -53,6 +53,7 @@ #include "GameClient/Color.h" #include "GameClient/TerrainVisual.h" +#include "GameClient/View.h" #include "GameNetwork/FirewallHelper.h" @@ -825,6 +826,7 @@ GlobalData::GlobalData() m_cameraHeight = 0.0f; m_minCameraHeight = 100.0f; m_maxCameraHeight = 300.0f; + m_cameraHeightAspectRatioMultiplier = 1.0f; m_terrainHeightAtEdgeOfMap = 0.0f; m_unitDamagedThresh = 0.5f; @@ -1122,6 +1124,35 @@ Bool GlobalData::setTimeOfDay( TimeOfDay tod ) } +// TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions +void GlobalData::setResolution(Int xres, Int yres) { + static const Real aspect_4_3 = 4.f / 3.f; + static const Real aspect_16_9 = 16.f / 9.f; + + m_xResolution = xres; + m_yResolution = yres; + + // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 + Real aspect = static_cast(xres) / static_cast(yres); + + if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { + if (aspect > aspect_16_9) + aspect = aspect_16_9; + const Real multi = aspect - aspect_4_3 + 1.0f; + const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; + m_cameraHeightAspectRatioMultiplier = multi * nerf; + m_drawEntireTerrain = TRUE; + } + else + { + m_cameraHeightAspectRatioMultiplier = 1.0f; + m_drawEntireTerrain = FALSE; + } + if (TheTacticalView) { + TheTacticalView->setDefaultView(0.0f, 0.0f, 1.0f); + } +} + //------------------------------------------------------------------------------------------------- /** Create a new global data instance to override the existing data set. The * initial values of the newly created instance will be a copy of the current @@ -1249,27 +1280,6 @@ void GlobalData::parseGameDataDefinition( INI* ini ) Int xres,yres; optionPref.getResolution(&xres, &yres); - - TheWritableGlobalData->m_xResolution = xres; - TheWritableGlobalData->m_yResolution = yres; - - // TheSuperHackers @tweak valeronm 21/03/2025 Increase camera height for wide resolutions - // Change camera height based on xezon code from https://github.com/TheSuperHackers/GeneralsGameCode/issues/78 - static const Real aspect_4_3 = 4.f / 3.f; - static const Real aspect_16_9 = 16.f / 9.f; - Real aspect = static_cast(xres) / static_cast(yres); - - // Resolution must be greater than 4:3 - // Screen width must be greater 640px and height greater 480 - if (aspect > aspect_4_3 && xres >= 640 && yres >= 480) { - if (aspect > aspect_16_9) - aspect = aspect_16_9; - const Real multi = aspect - aspect_4_3 + 1.0f; - const Real nerf = 1.0f - (aspect - aspect_4_3) / 12.0f; - - TheWritableGlobalData->m_maxCameraHeight *= multi * nerf; - TheWritableGlobalData->m_minCameraHeight *= multi * nerf; - TheWritableGlobalData->m_drawEntireTerrain = TRUE; - } + TheWritableGlobalData->setResolution(xres, yres); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp index e838ac6506..e5ee5cb9a9 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp @@ -747,8 +747,7 @@ void DeclineResolution() dispChanged = FALSE; newDispSettings = oldDispSettings; - TheWritableGlobalData->m_xResolution = newDispSettings.xRes; - TheWritableGlobalData->m_yResolution = newDispSettings.yRes; + TheWritableGlobalData->setResolution(newDispSettings.xRes, newDispSettings.yRes); TheHeaderTemplateManager->headerNotifyResolutionChange(); TheMouse->mouseNotifyResolutionChange(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index a5bfec7e6a..6725645277 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -1086,8 +1086,7 @@ static void saveOptions( void ) if (TheDisplay->setDisplayMode(xres,yres,bitDepth,TheDisplay->getWindowed())) { dispChanged = TRUE; - TheWritableGlobalData->m_xResolution = xres; - TheWritableGlobalData->m_yResolution = yres; + TheWritableGlobalData->setResolution(xres, yres); TheHeaderTemplateManager->headerNotifyResolutionChange(); TheMouse->mouseNotifyResolutionChange(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/View.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/View.cpp index c41f108027..81f7494eb5 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/View.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/View.cpp @@ -102,7 +102,7 @@ void View::init( void ) m_maxZoom = 1.3f; m_minZoom = 0.2f; m_zoom = m_maxZoom; - m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight; + m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight * TheGlobalData->m_cameraHeightAspectRatioMultiplier; m_minHeightAboveGround = TheGlobalData->m_minCameraHeight; m_okToAdjustHeight = FALSE; diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp index 840a06a9d5..dced35efe2 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp @@ -1916,7 +1916,7 @@ void W3DView::setDefaultView(Real pitch, Real angle, Real maxHeight) // MDC - we no longer want to rotate maps (design made all of them right to begin with) // m_defaultAngle = angle * M_PI/180.0f; m_defaultPitchAngle = pitch; - m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight*maxHeight; + m_maxHeightAboveGround = TheGlobalData->m_maxCameraHeight * TheGlobalData->m_cameraHeightAspectRatioMultiplier * maxHeight; if (m_minHeightAboveGround > m_maxHeightAboveGround) m_maxHeightAboveGround = m_minHeightAboveGround; }