Skip to content

Commit cfb0667

Browse files
committed
bugfix(fps): Decouple camera zoom and rotation time step from render update (#1451)
1 parent bb53980 commit cfb0667

File tree

8 files changed

+100
-94
lines changed

8 files changed

+100
-94
lines changed

Generals/Code/GameEngine/Include/GameClient/View.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ class View : public Snapshot
7373

7474
public:
7575

76+
enum
77+
{
78+
ZoomHeightPerSecond = 10,
79+
};
80+
7681
/// Add an impulse force to shake the camera
7782
enum CameraShakeType
7883
{
@@ -180,8 +185,7 @@ class View : public Snapshot
180185
virtual void setZoom(Real z) { }
181186
virtual Real getHeightAboveGround() { return m_heightAboveGround; }
182187
virtual void setHeightAboveGround(Real z) { m_heightAboveGround = z; }
183-
virtual void zoomIn( void ); ///< Zoom in, closer to the ground, limit to min
184-
virtual void zoomOut( void ); ///< Zoom out, farther away from the ground, limit to max
188+
virtual void zoom( Real height ); ///< Zoom in/out, closer to the ground, limit to min, or farther away from the ground, limit to max
185189
virtual void setZoomToDefault( void ) { } ///< Set zoom to default value
186190
virtual Real getMaxZoom( void ) { return m_maxZoom; } ///< return max zoom value
187191
virtual void setOkToAdjustHeight( Bool val ) { m_okToAdjustHeight = val; } ///< Set this to adjust camera height

Generals/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
#include "Common/ThingTemplate.h"
4646
#include "Common/BuildAssistant.h"
4747
#include "Common/Recorder.h"
48-
#include "Common/BuildAssistant.h"
4948
#include "Common/SpecialPower.h"
5049

5150
#include "GameClient/Anim2D.h"
@@ -66,7 +65,6 @@
6665
#include "GameClient/GadgetStaticText.h"
6766
#include "GameClient/View.h"
6867
#include "GameClient/TerrainVisual.h"
69-
#include "GameClient/ControlBar.h"
7068
#include "GameClient/Display.h"
7169
#include "GameClient/WindowLayout.h"
7270
#include "GameClient/LookAtXlat.h"
@@ -1830,26 +1828,30 @@ void InGameUI::update( void )
18301828
layout->runUpdate();
18311829
}
18321830

1833-
//Handle keyboard camera rotations
1834-
if( m_cameraRotatingLeft && !m_cameraRotatingRight )
1831+
if (m_cameraRotatingLeft || m_cameraRotatingRight || m_cameraZoomingIn || m_cameraZoomingOut)
18351832
{
1836-
//Keyboard rotate left
1837-
TheTacticalView->setAngle( TheTacticalView->getAngle() - TheGlobalData->m_keyboardCameraRotateSpeed );
1838-
}
1839-
if( m_cameraRotatingRight && !m_cameraRotatingLeft )
1840-
{
1841-
//Keyboard rotate right
1842-
TheTacticalView->setAngle( TheTacticalView->getAngle() + TheGlobalData->m_keyboardCameraRotateSpeed );
1843-
}
1844-
if( m_cameraZoomingIn && !m_cameraZoomingOut )
1845-
{
1846-
//Keyboard zoom in
1847-
TheTacticalView->zoomIn();
1848-
}
1849-
if( m_cameraZoomingOut && !m_cameraZoomingIn )
1850-
{
1851-
//Keyboard zoom out
1852-
TheTacticalView->zoomOut();
1833+
// TheSuperHackers @tweak The camera rotation and zoom are now decoupled from the render update.
1834+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
1835+
const Real rotateAngle = TheGlobalData->m_keyboardCameraRotateSpeed * fpsRatio;
1836+
const Real zoomHeight = (Real)View::ZoomHeightPerSecond * fpsRatio;
1837+
1838+
if( m_cameraRotatingLeft && !m_cameraRotatingRight )
1839+
{
1840+
TheTacticalView->setAngle( TheTacticalView->getAngle() - rotateAngle );
1841+
}
1842+
else if( m_cameraRotatingRight && !m_cameraRotatingLeft )
1843+
{
1844+
TheTacticalView->setAngle( TheTacticalView->getAngle() + rotateAngle );
1845+
}
1846+
1847+
if( m_cameraZoomingIn && !m_cameraZoomingOut )
1848+
{
1849+
TheTacticalView->zoom( -zoomHeight );
1850+
}
1851+
else if( m_cameraZoomingOut && !m_cameraZoomingIn )
1852+
{
1853+
TheTacticalView->zoom( +zoomHeight );
1854+
}
18531855
}
18541856

18551857

Generals/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
3030

3131
#include "Common/GameType.h"
32+
#include "Common/GameEngine.h"
3233
#include "Common/MessageStream.h"
3334
#include "Common/Player.h"
3435
#include "Common/PlayerList.h"
@@ -370,15 +371,19 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
370371

371372
Int spin = msg->getArgument( 1 )->integer;
372373

374+
// TheSuperHackers @tweak The camera zoom is now decoupled from the render update.
375+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
376+
const Real zoomHeight = (Real)View::ZoomHeightPerSecond * fpsRatio;
377+
373378
if (spin > 0)
374379
{
375380
for ( ; spin > 0; spin--)
376-
TheTacticalView->zoomIn();
381+
TheTacticalView->zoom( -zoomHeight );
377382
}
378383
else
379384
{
380385
for ( ;spin < 0; spin++ )
381-
TheTacticalView->zoomOut();
386+
TheTacticalView->zoom( +zoomHeight );
382387
}
383388

384389
break;
@@ -410,11 +415,8 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
410415
if (m_isScrolling)
411416
{
412417

413-
// TheSuperHackers @bugfix Mauller 07/06/2025 Adjust the viewport scrolling so it is independent of GameClient FPS
414-
// The scaling is based on the current logic rate, this provides a consistent scroll speed at all GameClient FPS
415-
// This also fixes scrolling within replays when fast forwarding due to the uncapped FPS
416-
// When the FPS is in excess of the expected frame rate, the ratio will reduce the offset of the cameras movement
417-
const Real logicToFpsRatio = TheGlobalData->m_framesPerSecondLimit / TheDisplay->getCurrentFPS();
418+
// TheSuperHackers @bugfix Mauller 07/06/2025 The camera scrolling is now decoupled from the render update.
419+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
418420

419421
switch (m_scrollType)
420422
{
@@ -443,27 +445,27 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
443445
// TheSuperHackers @info calculate the length of the vector to obtain the movement speed before the vector is normalized
444446
float vecLength = vec.length();
445447
vec.normalize();
446-
offset.x = TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * vecLength * vec.x * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
447-
offset.y = TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * vecLength * vec.y * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
448+
offset.x = TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * vecLength * vec.x * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
449+
offset.y = TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * vecLength * vec.y * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
448450
}
449451
break;
450452
case SCROLL_KEY:
451453
{
452454
if (scrollDir[DIR_UP])
453455
{
454-
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
456+
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
455457
}
456458
if (scrollDir[DIR_DOWN])
457459
{
458-
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
460+
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
459461
}
460462
if (scrollDir[DIR_LEFT])
461463
{
462-
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
464+
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
463465
}
464466
if (scrollDir[DIR_RIGHT])
465467
{
466-
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
468+
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
467469
}
468470
}
469471
break;
@@ -473,19 +475,19 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
473475
UnsignedInt width = TheDisplay->getWidth();
474476
if (m_currentPos.y < edgeScrollSize)
475477
{
476-
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
478+
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
477479
}
478480
if (m_currentPos.y >= height-edgeScrollSize)
479481
{
480-
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
482+
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
481483
}
482484
if (m_currentPos.x < edgeScrollSize)
483485
{
484-
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
486+
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
485487
}
486488
if (m_currentPos.x >= width-edgeScrollSize)
487489
{
488-
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
490+
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
489491
}
490492
}
491493
break;

Generals/Code/GameEngine/Source/GameClient/View.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,9 @@ View *View::prependViewToList( View *list )
125125
return this;
126126
}
127127

128-
void View::zoomIn( void )
128+
void View::zoom( Real height )
129129
{
130-
setHeightAboveGround(getHeightAboveGround() - 10.0f);
131-
}
132-
133-
void View::zoomOut( void )
134-
{
135-
setHeightAboveGround(getHeightAboveGround() + 10.0f);
130+
setHeightAboveGround(getHeightAboveGround() + height);
136131
}
137132

138133
/**

GeneralsMD/Code/GameEngine/Include/GameClient/View.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ class View : public Snapshot
7373

7474
public:
7575

76+
enum
77+
{
78+
ZoomHeightPerSecond = 10,
79+
};
80+
7681
/// Add an impulse force to shake the camera
7782
enum CameraShakeType
7883
{
@@ -184,8 +189,7 @@ class View : public Snapshot
184189
virtual void setZoom(Real z) { }
185190
virtual Real getHeightAboveGround() { return m_heightAboveGround; }
186191
virtual void setHeightAboveGround(Real z) { m_heightAboveGround = z; }
187-
virtual void zoomIn( void ); ///< Zoom in, closer to the ground, limit to min
188-
virtual void zoomOut( void ); ///< Zoom out, farther away from the ground, limit to max
192+
virtual void zoom( Real height ); ///< Zoom in/out, closer to the ground, limit to min, or farther away from the ground, limit to max
189193
virtual void setZoomToDefault( void ) { } ///< Set zoom to default value
190194
virtual Real getMaxZoom( void ) { return m_maxZoom; } ///< return max zoom value
191195
virtual void setOkToAdjustHeight( Bool val ) { m_okToAdjustHeight = val; } ///< Set this to adjust camera height

GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
#include "Common/ThingTemplate.h"
4646
#include "Common/BuildAssistant.h"
4747
#include "Common/Recorder.h"
48-
#include "Common/BuildAssistant.h"
4948
#include "Common/SpecialPower.h"
5049

5150
#include "GameClient/Anim2D.h"
@@ -67,7 +66,6 @@
6766
#include "GameClient/GadgetStaticText.h"
6867
#include "GameClient/View.h"
6968
#include "GameClient/TerrainVisual.h"
70-
#include "GameClient/ControlBar.h"
7169
#include "GameClient/Display.h"
7270
#include "GameClient/WindowLayout.h"
7371
#include "GameClient/LookAtXlat.h"
@@ -1886,26 +1884,30 @@ void InGameUI::update( void )
18861884
layout->runUpdate();
18871885
}
18881886

1889-
//Handle keyboard camera rotations
1890-
if( m_cameraRotatingLeft && !m_cameraRotatingRight )
1887+
if (m_cameraRotatingLeft || m_cameraRotatingRight || m_cameraZoomingIn || m_cameraZoomingOut)
18911888
{
1892-
//Keyboard rotate left
1893-
TheTacticalView->setAngle( TheTacticalView->getAngle() - TheGlobalData->m_keyboardCameraRotateSpeed );
1894-
}
1895-
if( m_cameraRotatingRight && !m_cameraRotatingLeft )
1896-
{
1897-
//Keyboard rotate right
1898-
TheTacticalView->setAngle( TheTacticalView->getAngle() + TheGlobalData->m_keyboardCameraRotateSpeed );
1899-
}
1900-
if( m_cameraZoomingIn && !m_cameraZoomingOut )
1901-
{
1902-
//Keyboard zoom in
1903-
TheTacticalView->zoomIn();
1904-
}
1905-
if( m_cameraZoomingOut && !m_cameraZoomingIn )
1906-
{
1907-
//Keyboard zoom out
1908-
TheTacticalView->zoomOut();
1889+
// TheSuperHackers @tweak The camera rotation and zoom are now decoupled from the render update.
1890+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
1891+
const Real rotateAngle = TheGlobalData->m_keyboardCameraRotateSpeed * fpsRatio;
1892+
const Real zoomHeight = (Real)View::ZoomHeightPerSecond * fpsRatio;
1893+
1894+
if( m_cameraRotatingLeft && !m_cameraRotatingRight )
1895+
{
1896+
TheTacticalView->setAngle( TheTacticalView->getAngle() - rotateAngle );
1897+
}
1898+
else if( m_cameraRotatingRight && !m_cameraRotatingLeft )
1899+
{
1900+
TheTacticalView->setAngle( TheTacticalView->getAngle() + rotateAngle );
1901+
}
1902+
1903+
if( m_cameraZoomingIn && !m_cameraZoomingOut )
1904+
{
1905+
TheTacticalView->zoom( -zoomHeight );
1906+
}
1907+
else if( m_cameraZoomingOut && !m_cameraZoomingIn )
1908+
{
1909+
TheTacticalView->zoom( +zoomHeight );
1910+
}
19091911
}
19101912

19111913

GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
3030

3131
#include "Common/GameType.h"
32+
#include "Common/GameEngine.h"
3233
#include "Common/MessageStream.h"
3334
#include "Common/Player.h"
3435
#include "Common/PlayerList.h"
@@ -369,15 +370,19 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
369370

370371
Int spin = msg->getArgument( 1 )->integer;
371372

373+
// TheSuperHackers @tweak The camera zoom is now decoupled from the render update.
374+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
375+
const Real zoomHeight = (Real)View::ZoomHeightPerSecond * fpsRatio;
376+
372377
if (spin > 0)
373378
{
374379
for ( ; spin > 0; spin--)
375-
TheTacticalView->zoomIn();
380+
TheTacticalView->zoom( -zoomHeight );
376381
}
377382
else
378383
{
379384
for ( ;spin < 0; spin++ )
380-
TheTacticalView->zoomOut();
385+
TheTacticalView->zoom( +zoomHeight );
381386
}
382387

383388
break;
@@ -409,11 +414,8 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
409414
if (m_isScrolling)
410415
{
411416

412-
// TheSuperHackers @bugfix Mauller 07/06/2025 Adjust the viewport scrolling so it is independent of GameClient FPS
413-
// The scaling is based on the current logic rate, this provides a consistent scroll speed at all GameClient FPS
414-
// This also fixes scrolling within replays when fast forwarding due to the uncapped FPS
415-
// When the FPS is in excess of the expected frame rate, the ratio will reduce the offset of the cameras movement
416-
const Real logicToFpsRatio = TheGlobalData->m_framesPerSecondLimit / TheDisplay->getCurrentFPS();
417+
// TheSuperHackers @bugfix Mauller 07/06/2025 The camera scrolling is now decoupled from the render update.
418+
const Real fpsRatio = (Real)BaseFps / TheGameEngine->getUpdateFps();
417419

418420
switch (m_scrollType)
419421
{
@@ -442,27 +444,27 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
442444
// TheSuperHackers @info calculate the length of the vector to obtain the movement speed before the vector is normalized
443445
float vecLength = vec.length();
444446
vec.normalize();
445-
offset.x = TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * vecLength * vec.x * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
446-
offset.y = TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * vecLength * vec.y * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
447+
offset.x = TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * vecLength * vec.x * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
448+
offset.y = TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * vecLength * vec.y * SCROLL_MULTIPLIER * TheGlobalData->m_keyboardScrollFactor;
447449
}
448450
break;
449451
case SCROLL_KEY:
450452
{
451453
if (scrollDir[DIR_UP])
452454
{
453-
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
455+
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
454456
}
455457
if (scrollDir[DIR_DOWN])
456458
{
457-
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
459+
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
458460
}
459461
if (scrollDir[DIR_LEFT])
460462
{
461-
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
463+
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
462464
}
463465
if (scrollDir[DIR_RIGHT])
464466
{
465-
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
467+
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
466468
}
467469
}
468470
break;
@@ -472,19 +474,19 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
472474
UnsignedInt width = TheDisplay->getWidth();
473475
if (m_currentPos.y < edgeScrollSize)
474476
{
475-
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
477+
offset.y -= TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
476478
}
477479
if (m_currentPos.y >= height-edgeScrollSize)
478480
{
479-
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
481+
offset.y += TheGlobalData->m_verticalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
480482
}
481483
if (m_currentPos.x < edgeScrollSize)
482484
{
483-
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
485+
offset.x -= TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
484486
}
485487
if (m_currentPos.x >= width-edgeScrollSize)
486488
{
487-
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * logicToFpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
489+
offset.x += TheGlobalData->m_horizontalScrollSpeedFactor * fpsRatio * SCROLL_AMT * TheGlobalData->m_keyboardScrollFactor;
488490
}
489491
}
490492
break;

0 commit comments

Comments
 (0)