Skip to content

Commit 7465f46

Browse files
committed
refactor(input): Convert mouse movement tracking from frames to real-time
1 parent 39de2ca commit 7465f46

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class LookAtTranslator : public GameMessageTranslator
8181
ViewLocation m_viewLocation[ MAX_VIEW_LOCS ];
8282
ScrollType m_scrollType;
8383
ScreenEdgeScrollMode m_screenEdgeScrollMode;
84-
UnsignedInt m_lastMouseMoveFrame;
84+
UnsignedInt m_lastMouseMoveTimeMsec; // real-time in milliseconds when mouse last moved
8585

8686
void setScrolling( ScrollType scrollType );
8787
void stopScrolling( void );

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ LookAtTranslator::LookAtTranslator() :
139139
m_isChangingFOV(false),
140140
m_middleButtonDownTimeMsec(0),
141141
m_lastPlaneID(INVALID_DRAWABLE_ID),
142-
m_lastMouseMoveFrame(0),
142+
m_lastMouseMoveTimeMsec(0),
143143
m_scrollType(SCROLL_NONE)
144144
{
145145
m_anchor.x = m_anchor.y = 0;
@@ -171,10 +171,14 @@ const ICoord2D* LookAtTranslator::getRMBScrollAnchor(void)
171171

172172
Bool LookAtTranslator::hasMouseMovedRecently( void )
173173
{
174-
if (m_lastMouseMoveFrame > TheGameLogic->getFrame())
175-
m_lastMouseMoveFrame = 0; // reset for new game
174+
const UnsignedInt ONE_SECOND_MSEC = 1000;
175+
UnsignedInt now = timeGetTime();
176176

177-
if (m_lastMouseMoveFrame + LOGICFRAMES_PER_SECOND < TheGameLogic->getFrame())
177+
// Handle time wraparound
178+
if (now < m_lastMouseMoveTimeMsec)
179+
m_lastMouseMoveTimeMsec = now;
180+
181+
if (now - m_lastMouseMoveTimeMsec > ONE_SECOND_MSEC)
178182
return false;
179183

180184
return true;
@@ -256,7 +260,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
256260
//-----------------------------------------------------------------------------
257261
case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_DOWN:
258262
{
259-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
263+
m_lastMouseMoveTimeMsec = timeGetTime();
260264

261265
m_anchor = msg->getArgument( 0 )->pixel;
262266
m_currentPos = msg->getArgument( 0 )->pixel;
@@ -272,7 +276,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
272276
//-----------------------------------------------------------------------------
273277
case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_UP:
274278
{
275-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
279+
m_lastMouseMoveTimeMsec = timeGetTime();
276280

277281
if (m_scrollType == SCROLL_RMB)
278282
{
@@ -284,7 +288,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
284288
//-----------------------------------------------------------------------------
285289
case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_DOWN:
286290
{
287-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
291+
m_lastMouseMoveTimeMsec = timeGetTime();
288292

289293
m_isRotating = true;
290294
m_anchor = msg->getArgument( 0 )->pixel;
@@ -298,7 +302,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
298302
//-----------------------------------------------------------------------------
299303
case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_UP:
300304
{
301-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
305+
m_lastMouseMoveTimeMsec = timeGetTime();
302306

303307
const UnsignedInt CLICK_DURATION_MSEC = 167;
304308
const UnsignedInt PIXEL_OFFSET = 5;
@@ -322,7 +326,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
322326
case GameMessage::MSG_RAW_MOUSE_POSITION:
323327
{
324328
if (m_currentPos.x != msg->getArgument( 0 )->pixel.x || m_currentPos.y != msg->getArgument( 0 )->pixel.y)
325-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
329+
m_lastMouseMoveTimeMsec = timeGetTime();
326330

327331
m_currentPos = msg->getArgument( 0 )->pixel;
328332

@@ -402,7 +406,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
402406
//-----------------------------------------------------------------------------
403407
case GameMessage::MSG_RAW_MOUSE_WHEEL:
404408
{
405-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
409+
m_lastMouseMoveTimeMsec = timeGetTime();
406410

407411
Int spin = msg->getArgument( 1 )->integer;
408412

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class LookAtTranslator : public GameMessageTranslator
8181
ViewLocation m_viewLocation[ MAX_VIEW_LOCS ];
8282
ScrollType m_scrollType;
8383
ScreenEdgeScrollMode m_screenEdgeScrollMode;
84-
UnsignedInt m_lastMouseMoveFrame;
84+
UnsignedInt m_lastMouseMoveTimeMsec; // real-time in milliseconds when mouse last moved
8585

8686
void setScrolling( ScrollType scrollType );
8787
void stopScrolling( void );

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ LookAtTranslator::LookAtTranslator() :
139139
m_isChangingFOV(false),
140140
m_middleButtonDownTimeMsec(0),
141141
m_lastPlaneID(INVALID_DRAWABLE_ID),
142-
m_lastMouseMoveFrame(0),
142+
m_lastMouseMoveTimeMsec(0),
143143
m_scrollType(SCROLL_NONE)
144144
{
145145
m_anchor.x = m_anchor.y = 0;
@@ -171,10 +171,14 @@ const ICoord2D* LookAtTranslator::getRMBScrollAnchor(void)
171171

172172
Bool LookAtTranslator::hasMouseMovedRecently( void )
173173
{
174-
if (m_lastMouseMoveFrame > TheGameLogic->getFrame())
175-
m_lastMouseMoveFrame = 0; // reset for new game
174+
const UnsignedInt ONE_SECOND_MSEC = 1000;
175+
UnsignedInt now = timeGetTime();
176176

177-
if (m_lastMouseMoveFrame + LOGICFRAMES_PER_SECOND < TheGameLogic->getFrame())
177+
// Handle time wraparound
178+
if (now < m_lastMouseMoveTimeMsec)
179+
m_lastMouseMoveTimeMsec = now;
180+
181+
if (now - m_lastMouseMoveTimeMsec > ONE_SECOND_MSEC)
178182
return false;
179183

180184
return true;
@@ -256,7 +260,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
256260
//-----------------------------------------------------------------------------
257261
case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_DOWN:
258262
{
259-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
263+
m_lastMouseMoveTimeMsec = timeGetTime();
260264

261265
m_anchor = msg->getArgument( 0 )->pixel;
262266
m_currentPos = msg->getArgument( 0 )->pixel;
@@ -271,7 +275,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
271275
//-----------------------------------------------------------------------------
272276
case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_UP:
273277
{
274-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
278+
m_lastMouseMoveTimeMsec = timeGetTime();
275279

276280
if (m_scrollType == SCROLL_RMB)
277281
{
@@ -283,7 +287,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
283287
//-----------------------------------------------------------------------------
284288
case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_DOWN:
285289
{
286-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
290+
m_lastMouseMoveTimeMsec = timeGetTime();
287291

288292
m_isRotating = true;
289293
m_anchor = msg->getArgument( 0 )->pixel;
@@ -297,7 +301,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
297301
//-----------------------------------------------------------------------------
298302
case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_UP:
299303
{
300-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
304+
m_lastMouseMoveTimeMsec = timeGetTime();
301305

302306
const UnsignedInt CLICK_DURATION_MSEC = 167;
303307
const UnsignedInt PIXEL_OFFSET = 5;
@@ -321,7 +325,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
321325
case GameMessage::MSG_RAW_MOUSE_POSITION:
322326
{
323327
if (m_currentPos.x != msg->getArgument( 0 )->pixel.x || m_currentPos.y != msg->getArgument( 0 )->pixel.y)
324-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
328+
m_lastMouseMoveTimeMsec = timeGetTime();
325329

326330
m_currentPos = msg->getArgument( 0 )->pixel;
327331

@@ -401,7 +405,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage
401405
//-----------------------------------------------------------------------------
402406
case GameMessage::MSG_RAW_MOUSE_WHEEL:
403407
{
404-
m_lastMouseMoveFrame = TheGameLogic->getFrame();
408+
m_lastMouseMoveTimeMsec = timeGetTime();
405409

406410
Int spin = msg->getArgument( 1 )->integer;
407411

0 commit comments

Comments
 (0)