diff --git a/Generals/Code/GameEngine/Include/GameClient/Keyboard.h b/Generals/Code/GameEngine/Include/GameClient/Keyboard.h index e4ee92bf495..8e54ae6ac1c 100644 --- a/Generals/Code/GameEngine/Include/GameClient/Keyboard.h +++ b/Generals/Code/GameEngine/Include/GameClient/Keyboard.h @@ -76,7 +76,7 @@ struct KeyboardIO UnsignedByte key; // KeyDefType, key data UnsignedByte status; // StatusType, above UnsignedShort state; // KEY_STATE_* in KeyDefs.h - UnsignedInt sequence; // sequence info from DirectX used for order + UnsignedInt keyDownTimeMsec; // real-time in milliseconds when key went down }; @@ -86,7 +86,11 @@ struct KeyboardIO class Keyboard : public SubsystemInterface { - enum { KEY_REPEAT_DELAY = 10 }; + enum + { + KEY_REPEAT_DELAY_MSEC = 333, // 10 frames at 30 FPS + KEY_REPEAT_INTERVAL_MSEC = 67 // ~2 frames at 30 FPS + }; public: @@ -133,7 +137,6 @@ class Keyboard : public SubsystemInterface Bool checkKeyRepeat( void ); ///< check for repeating keys UnsignedByte getKeyStatusData( KeyDefType key ); ///< get key status Bool getKeyStateBit( KeyDefType key, Int bit ); ///< get key state bit - UnsignedInt getKeySequenceData( KeyDefType key ); ///< get key sequence void setKeyStateData( KeyDefType key, UnsignedByte data ); ///< get key state UnsignedShort m_modifiers; @@ -161,7 +164,6 @@ class Keyboard : public SubsystemInterface WideChar shifted2; } m_keyNames[ KEY_COUNT ]; - UnsignedInt m_inputFrame; ///< frame input was gathered on }; diff --git a/Generals/Code/GameEngine/Include/GameClient/LookAtXlat.h b/Generals/Code/GameEngine/Include/GameClient/LookAtXlat.h index 91522d87b1a..619f9bea85e 100644 --- a/Generals/Code/GameEngine/Include/GameClient/LookAtXlat.h +++ b/Generals/Code/GameEngine/Include/GameClient/LookAtXlat.h @@ -76,12 +76,12 @@ class LookAtTranslator : public GameMessageTranslator Bool m_isRotating; // set to true if we are in the act of MMB rotating Bool m_isPitching; // set to true if we are in the act of ALT pitch rotation Bool m_isChangingFOV; // set to true if we are in the act of changing the field of view - UnsignedInt m_timestamp; // set when button goes down + UnsignedInt m_middleButtonDownTimeMsec; // real-time in milliseconds when middle button goes down DrawableID m_lastPlaneID; ViewLocation m_viewLocation[ MAX_VIEW_LOCS ]; ScrollType m_scrollType; ScreenEdgeScrollMode m_screenEdgeScrollMode; - UnsignedInt m_lastMouseMoveFrame; + UnsignedInt m_lastMouseMoveTimeMsec; // real-time in milliseconds when mouse last moved void setScrolling( ScrollType scrollType ); void stopScrolling( void ); diff --git a/Generals/Code/GameEngine/Include/GameClient/Mouse.h b/Generals/Code/GameEngine/Include/GameClient/Mouse.h index 92fd80497c6..07583b79f78 100644 --- a/Generals/Code/GameEngine/Include/GameClient/Mouse.h +++ b/Generals/Code/GameEngine/Include/GameClient/Mouse.h @@ -62,6 +62,7 @@ enum GameMode CPP_11(: Int); enum MouseButtonState CPP_11(: Int) { + MBS_None = -1, MBS_Up = 0, MBS_Down, MBS_DoubleClick, @@ -105,17 +106,14 @@ struct MouseIO user while - is down/toward user */ ICoord2D deltaPos; ///< overall change in mouse pointer this frame - MouseButtonState leftState; // button state: Up, Down, DoubleClick (Which is also down) + MouseButtonState leftState; // button state: None (no event), Up, Down, DoubleClick Int leftEvent; // Most important event this frame - Int leftFrame; // last frame button state changed MouseButtonState rightState; Int rightEvent; - Int rightFrame; MouseButtonState middleState; Int middleEvent; - Int middleFrame; }; class CursorInfo @@ -393,9 +391,6 @@ class Mouse : public SubsystemInterface Int m_minY; ///< mouse is locked to this region Int m_maxY; ///< mouse is locked to this region - UnsignedInt m_inputFrame; ///< frame input was gathered on - UnsignedInt m_deadInputFrame; ///< Frame which last input occured - Bool m_inputMovesAbsolute; /**< if TRUE, when processing mouse position chanages the movement will be done treating the coords as ABSOLUTE positions and NOT diff --git a/Generals/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp b/Generals/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp index 5eb6a69ccec..3e69d321a36 100644 --- a/Generals/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp @@ -140,7 +140,12 @@ void Keyboard::updateKeys( void ) m_keyStatus[ m_keys[ index ].key ].state = m_keys[ index ].state; m_keyStatus[ m_keys[ index ].key ].status = m_keys[ index ].status; - m_keyStatus[ m_keys[ index ].key ].sequence = m_inputFrame; + + // Update key down time for new key presses + if( BitIsSet( m_keys[ index ].state, KEY_STATE_DOWN ) ) + { + m_keyStatus[ m_keys[ index ].key ].keyDownTimeMsec = m_keys[ index ].keyDownTimeMsec; + } // prevent ALT-TAB from causing a TAB event if( m_keys[ index ].key == KEY_TAB ) @@ -195,7 +200,7 @@ void Keyboard::updateKeys( void ) } //------------------------------------------------------------------------------------------------- -/** check key repeat sequences, TRUE is returned if repeat is occurring */ +/** check key repeat timing, TRUE is returned if repeat is occurring */ //------------------------------------------------------------------------------------------------- Bool Keyboard::checkKeyRepeat( void ) { @@ -220,7 +225,13 @@ Bool Keyboard::checkKeyRepeat( void ) if( BitIsSet( m_keyStatus[ key ].state, KEY_STATE_DOWN ) ) { - if( (m_inputFrame - m_keyStatus[ key ].sequence) > Keyboard::KEY_REPEAT_DELAY ) + const UnsignedInt now = timeGetTime(); + const UnsignedInt keyDownTime = m_keyStatus[ key ].keyDownTimeMsec; + + // Unsigned subtraction handles wraparound correctly + const UnsignedInt elapsedMsec = now - keyDownTime; + + if( elapsedMsec > Keyboard::KEY_REPEAT_DELAY_MSEC ) { // Add key to this frame m_keys[ index ].key = (UnsignedByte)key; @@ -232,10 +243,10 @@ Bool Keyboard::checkKeyRepeat( void ) // Set all keys as new to prevent multiple keys repeating for( index = 0; index< NUM_KEYS; index++ ) - m_keyStatus[ index ].sequence = m_inputFrame; + m_keyStatus[ index ].keyDownTimeMsec = now; - // Set repeated key so it will repeat again in two frames - m_keyStatus[ key ].sequence = m_inputFrame - (Keyboard::KEY_REPEAT_DELAY + 2); + // Set repeated key so it will repeat again after the interval + m_keyStatus[ key ].keyDownTimeMsec = now - (Keyboard::KEY_REPEAT_DELAY_MSEC + Keyboard::KEY_REPEAT_INTERVAL_MSEC); retVal = TRUE; break; // exit for key @@ -694,7 +705,6 @@ Keyboard::Keyboard( void ) m_shift2Key = KEY_NONE; memset( m_keyNames, 0, sizeof( m_keyNames ) ); - m_inputFrame = 0; } @@ -714,9 +724,6 @@ void Keyboard::init( void ) // initialize the key names initKeyNames(); - // first input frame - m_inputFrame = 0; - } //------------------------------------------------------------------------------------------------- @@ -733,9 +740,6 @@ void Keyboard::reset( void ) void Keyboard::update( void ) { - // increment input frame - m_inputFrame++; - // update the key data updateKeys(); @@ -819,14 +823,6 @@ Bool Keyboard::getKeyStateBit( KeyDefType key, Int bit ) return (m_keyStatus[ key ].state & bit) ? 1 : 0; } -//------------------------------------------------------------------------------------------------- -/** return the sequence data for the given key */ -//------------------------------------------------------------------------------------------------- -UnsignedInt Keyboard::getKeySequenceData( KeyDefType key ) -{ - return m_keyStatus[ key ].sequence; -} - //------------------------------------------------------------------------------------------------- /** set the key status data */ //------------------------------------------------------------------------------------------------- diff --git a/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp b/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp index 903a52b8a20..8f02f88d27a 100644 --- a/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp @@ -183,9 +183,6 @@ void Mouse::updateMouseData( ) else m_eventsThisFrame = 0; - if( index != 0 ) - m_deadInputFrame = m_inputFrame; - } //------------------------------------------------------------------------------------------------- @@ -221,7 +218,7 @@ void Mouse::processMouseEvent( Int index ) m_currMouse.wheelPos += m_mouseEvents[ index ].wheelPos; // Check Left Mouse State - if( m_mouseEvents[ index ].leftFrame ) + if( m_mouseEvents[ index ].leftState != MBS_None ) { if( m_currMouse.leftState != m_mouseEvents[ index ].leftState ) { @@ -231,21 +228,18 @@ void Mouse::processMouseEvent( Int index ) // Mouse Down m_currMouse.leftEvent = GWM_LEFT_DOWN; m_currMouse.leftState = MBS_Down; - m_currMouse.leftFrame = m_inputFrame; } else if ( m_mouseEvents[ index ].leftState == MBS_DoubleClick ) { // Mouse Double Click m_currMouse.leftEvent = GWM_LEFT_DOUBLE_CLICK; m_currMouse.leftState = MBS_DoubleClick; - m_currMouse.leftFrame = m_inputFrame; } else { // Mouse Up m_currMouse.leftEvent = GWM_LEFT_UP; m_currMouse.leftState = MBS_Up; - m_currMouse.leftFrame = m_inputFrame; } } } @@ -257,7 +251,7 @@ void Mouse::processMouseEvent( Int index ) } // Check Right Mouse State - if( m_mouseEvents[ index ].rightFrame ) + if( m_mouseEvents[ index ].rightState != MBS_None ) { if( m_currMouse.rightState != m_mouseEvents[ index ].rightState ) { @@ -267,21 +261,18 @@ void Mouse::processMouseEvent( Int index ) // Mouse Down m_currMouse.rightEvent = GWM_RIGHT_DOWN; m_currMouse.rightState = MBS_Down; - m_currMouse.rightFrame = m_inputFrame; } else if( m_mouseEvents[ index ].rightState == MBS_DoubleClick ) { // Mouse Double Click m_currMouse.rightEvent = GWM_RIGHT_DOUBLE_CLICK; m_currMouse.rightState = MBS_DoubleClick; - m_currMouse.rightFrame = m_inputFrame; } else { // Mouse Up m_currMouse.rightEvent = GWM_RIGHT_UP; m_currMouse.rightState = MBS_Up; - m_currMouse.rightFrame = m_inputFrame; } } } @@ -293,7 +284,7 @@ void Mouse::processMouseEvent( Int index ) } // Check Middle Mouse State - if( m_mouseEvents[ index ].middleFrame ) + if( m_mouseEvents[ index ].middleState != MBS_None ) { if( m_currMouse.middleState != m_mouseEvents[index].middleState ) { @@ -302,20 +293,17 @@ void Mouse::processMouseEvent( Int index ) { m_currMouse.middleEvent = GWM_MIDDLE_DOWN; m_currMouse.middleState = MBS_Down; - m_currMouse.middleFrame = m_inputFrame; } else if( m_mouseEvents[index].middleState == MBS_DoubleClick ) { m_currMouse.middleEvent = GWM_MIDDLE_DOUBLE_CLICK; m_currMouse.middleState = MBS_DoubleClick; - m_currMouse.middleFrame = m_inputFrame; } else { // Mouse Up m_currMouse.middleEvent = GWM_MIDDLE_UP; m_currMouse.middleState = MBS_Up; - m_currMouse.middleFrame = m_inputFrame; } } } @@ -328,7 +316,7 @@ void Mouse::processMouseEvent( Int index ) m_currMouse.deltaPos.x = m_currMouse.pos.x - m_prevMouse.pos.x; m_currMouse.deltaPos.y = m_currMouse.pos.y - m_prevMouse.pos.y; -// DEBUG_LOG(("Mouse dx %d, dy %d, index %d, frame %d", m_currMouse.deltaPos.x, m_currMouse.deltaPos.y, index, m_inputFrame)); +// DEBUG_LOG(("Mouse dx %d, dy %d, index %d", m_currMouse.deltaPos.x, m_currMouse.deltaPos.y, index)); // // check if mouse is still and flag tooltip // if( ((dx*dx) + (dy*dy)) < CURSOR_MOVE_TOL_SQ ) // { @@ -474,9 +462,6 @@ Mouse::Mouse( void ) m_maxY = 0; m_eventsThisFrame = 0; - m_inputFrame = 0; - m_deadInputFrame =0; - m_inputMovesAbsolute = FALSE; m_currentCursor = ARROW; @@ -590,9 +575,6 @@ void Mouse::init( void ) m_minY = 0; m_maxY = 599; - m_inputFrame = 0; - m_deadInputFrame =0; - m_inputMovesAbsolute = FALSE; m_eventsThisFrame = 0; @@ -676,9 +658,6 @@ void Mouse::reset( void ) void Mouse::update( void ) { - // increment input frame - m_inputFrame++; - // update the mouse data updateMouseData( ); diff --git a/Generals/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp b/Generals/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp index 1f0d4e7cc7a..761992f7438 100644 --- a/Generals/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp @@ -137,9 +137,9 @@ LookAtTranslator::LookAtTranslator() : m_isRotating(false), m_isPitching(false), m_isChangingFOV(false), - m_timestamp(0), + m_middleButtonDownTimeMsec(0), m_lastPlaneID(INVALID_DRAWABLE_ID), - m_lastMouseMoveFrame(0), + m_lastMouseMoveTimeMsec(0), m_scrollType(SCROLL_NONE) { m_anchor.x = m_anchor.y = 0; @@ -171,13 +171,12 @@ const ICoord2D* LookAtTranslator::getRMBScrollAnchor(void) Bool LookAtTranslator::hasMouseMovedRecently( void ) { - if (m_lastMouseMoveFrame > TheGameLogic->getFrame()) - m_lastMouseMoveFrame = 0; // reset for new game + const UnsignedInt now = timeGetTime(); + const UnsignedInt lastMove = m_lastMouseMoveTimeMsec; - if (m_lastMouseMoveFrame + LOGICFRAMES_PER_SECOND < TheGameLogic->getFrame()) - return false; + const UnsignedInt elapsedMsec = now - lastMove; - return true; + return elapsedMsec <= MSEC_PER_SECOND; } void LookAtTranslator::setCurrentPos( const ICoord2D& pos ) @@ -256,7 +255,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_DOWN: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); m_anchor = msg->getArgument( 0 )->pixel; m_currentPos = msg->getArgument( 0 )->pixel; @@ -272,7 +271,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_UP: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); if (m_scrollType == SCROLL_RMB) { @@ -284,23 +283,25 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_DOWN: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + const UnsignedInt now = timeGetTime(); + m_lastMouseMoveTimeMsec = now; + m_middleButtonDownTimeMsec = now; m_isRotating = true; m_anchor = msg->getArgument( 0 )->pixel; m_anchorAngle = TheTacticalView->getAngle(); m_originalAnchor = msg->getArgument( 0 )->pixel; m_currentPos = msg->getArgument( 0 )->pixel; - m_timestamp = TheGameClient->getFrame(); break; } //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_UP: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + const UnsignedInt now = timeGetTime(); + m_lastMouseMoveTimeMsec = now; - const UnsignedInt CLICK_DURATION = 5; + const UnsignedInt CLICK_DURATION_MSEC = 167; const UnsignedInt PIXEL_OFFSET = 5; m_isRotating = false; @@ -308,8 +309,11 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage if (dx<0) dx = -dx; Int dy = m_currentPos.y-m_originalAnchor.y; Bool didMove = dx>PIXEL_OFFSET || dy>PIXEL_OFFSET; + + const UnsignedInt elapsedMsec = now - m_middleButtonDownTimeMsec; + // if middle button is "clicked", reset to "home" orientation - if (!didMove && TheGameClient->getFrame() - m_timestamp < CLICK_DURATION) + if (!didMove && elapsedMsec < CLICK_DURATION_MSEC) { TheTacticalView->setAngleAndPitchToDefault(); TheTacticalView->setZoomToDefault(); @@ -322,7 +326,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage case GameMessage::MSG_RAW_MOUSE_POSITION: { if (m_currentPos.x != msg->getArgument( 0 )->pixel.x || m_currentPos.y != msg->getArgument( 0 )->pixel.y) - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); m_currentPos = msg->getArgument( 0 )->pixel; @@ -402,7 +406,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_WHEEL: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); Int spin = msg->getArgument( 1 )->integer; diff --git a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp index 6bc06e14eaf..f0b7d39b155 100644 --- a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp +++ b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp @@ -251,7 +251,6 @@ void DirectInputKeyboard::getKey( KeyboardIO *key ) HRESULT hr; assert( key ); - key->sequence = 0; key->key = KEY_NONE; if( m_pKeyboardDevice ) @@ -315,15 +314,20 @@ void DirectInputKeyboard::getKey( KeyboardIO *key ) // set the key key->key = (UnsignedByte)(kbdat.dwOfs & 0xFF); - // sequence - key->sequence = kbdat.dwSequence; - // // state of key, note we are setting the key state here with an assignment // and not a bit set of the up/down state, this is the "start" // of building this "key" // - key->state = (( kbdat.dwData & 0x0080 ) ? KEY_STATE_DOWN : KEY_STATE_UP); + if( kbdat.dwData & 0x0080 ) + { + key->state = KEY_STATE_DOWN; + key->keyDownTimeMsec = kbdat.dwTimeStamp; + } + else + { + key->state = KEY_STATE_UP; + } // set status as unused (unprocessed) key->status = KeyboardIO::STATUS_UNUSED; diff --git a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp index 56eadc80fb2..0df595f04ca 100644 --- a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp +++ b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp @@ -202,7 +202,7 @@ UnsignedByte DirectInputMouse::getMouseEvent( MouseIO *result, Bool flush ) /* set these to defaults */ result->leftState = result->middleState = result->rightState = FALSE; - result->leftFrame = result->middleFrame = result->rightFrame = 0; + result->leftState = result->middleState = result->rightState = MBS_None; result->pos.x = result->pos.y = result->wheelPos = 0; if( m_pMouseDevice ) @@ -282,18 +282,15 @@ void DirectInputMouse::mapDirectInputMouse( MouseIO *mouse, switch( mdat->dwOfs ) { case DIMOFS_BUTTON0: - mouse->leftState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->leftFrame = mdat->dwSequence; + mouse->leftState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON1: - mouse->rightState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->rightFrame = mdat->dwSequence; + mouse->rightState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON2: - mouse->middleState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->middleFrame = mdat->dwSequence; + mouse->middleState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON3: diff --git a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp index 5f84cca905b..533c0d908a9 100644 --- a/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp +++ b/Generals/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp @@ -85,21 +85,9 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) UINT msg = m_eventBuffer[ eventIndex ].msg; WPARAM wParam = m_eventBuffer[ eventIndex ].wParam; LPARAM lParam = m_eventBuffer[ eventIndex ].lParam; - UnsignedInt frame; - - // - // get the current input frame from the client, if we don't have - // a client (like in the GUI editor) we just use frame 1 so it - // registers with the system - // - if( TheGameClient ) - frame = TheGameClient->getFrame(); - else - frame = 1; // set these to defaults - result->leftState = result->middleState = result->rightState = MBS_Up; - result->leftFrame = result->middleFrame = result->rightFrame = 0; + result->leftState = result->middleState = result->rightState = MBS_None; result->pos.x = result->pos.y = result->wheelPos = 0; // Time is the same for all events @@ -113,7 +101,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_Down; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -125,7 +112,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_Up; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -137,7 +123,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_DoubleClick; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -149,7 +134,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_Down; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -161,7 +145,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_Up; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -173,7 +156,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_DoubleClick; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -185,7 +167,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_Down; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -197,7 +178,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_Up; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -209,7 +189,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_DoubleClick; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/Keyboard.h b/GeneralsMD/Code/GameEngine/Include/GameClient/Keyboard.h index fa54abe2265..79a11a6d82d 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/Keyboard.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/Keyboard.h @@ -76,7 +76,7 @@ struct KeyboardIO UnsignedByte key; // KeyDefType, key data UnsignedByte status; // StatusType, above UnsignedShort state; // KEY_STATE_* in KeyDefs.h - UnsignedInt sequence; // sequence info from DirectX used for order + UnsignedInt keyDownTimeMsec; // real-time in milliseconds when key went down }; @@ -86,7 +86,11 @@ struct KeyboardIO class Keyboard : public SubsystemInterface { - enum { KEY_REPEAT_DELAY = 10 }; + enum + { + KEY_REPEAT_DELAY_MSEC = 333, // 10 frames at 30 FPS + KEY_REPEAT_INTERVAL_MSEC = 67 // ~2 frames at 30 FPS + }; public: @@ -133,7 +137,6 @@ class Keyboard : public SubsystemInterface Bool checkKeyRepeat( void ); ///< check for repeating keys UnsignedByte getKeyStatusData( KeyDefType key ); ///< get key status Bool getKeyStateBit( KeyDefType key, Int bit ); ///< get key state bit - UnsignedInt getKeySequenceData( KeyDefType key ); ///< get key sequence void setKeyStateData( KeyDefType key, UnsignedByte data ); ///< get key state UnsignedShort m_modifiers; @@ -161,7 +164,6 @@ class Keyboard : public SubsystemInterface WideChar shifted2; } m_keyNames[ KEY_COUNT ]; - UnsignedInt m_inputFrame; ///< frame input was gathered on }; diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/LookAtXlat.h b/GeneralsMD/Code/GameEngine/Include/GameClient/LookAtXlat.h index e91b98f66ec..db162de3ede 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/LookAtXlat.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/LookAtXlat.h @@ -76,12 +76,12 @@ class LookAtTranslator : public GameMessageTranslator Bool m_isRotating; // set to true if we are in the act of MMB rotating Bool m_isPitching; // set to true if we are in the act of ALT pitch rotation Bool m_isChangingFOV; // set to true if we are in the act of changing the field of view - UnsignedInt m_timestamp; // set when button goes down + UnsignedInt m_middleButtonDownTimeMsec; // real-time in milliseconds when middle button goes down DrawableID m_lastPlaneID; ViewLocation m_viewLocation[ MAX_VIEW_LOCS ]; ScrollType m_scrollType; ScreenEdgeScrollMode m_screenEdgeScrollMode; - UnsignedInt m_lastMouseMoveFrame; + UnsignedInt m_lastMouseMoveTimeMsec; // real-time in milliseconds when mouse last moved void setScrolling( ScrollType scrollType ); void stopScrolling( void ); diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h b/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h index abd5c0c403d..6170da909f1 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h @@ -62,6 +62,7 @@ enum GameMode CPP_11(: Int); enum MouseButtonState CPP_11(: Int) { + MBS_None = -1, MBS_Up = 0, MBS_Down, MBS_DoubleClick, @@ -105,17 +106,14 @@ struct MouseIO user while - is down/toward user */ ICoord2D deltaPos; ///< overall change in mouse pointer this frame - MouseButtonState leftState; // button state: Up, Down, DoubleClick (Which is also down) + MouseButtonState leftState; // button state: None (no event), Up, Down, DoubleClick Int leftEvent; // Most important event this frame - Int leftFrame; // last frame button state changed MouseButtonState rightState; Int rightEvent; - Int rightFrame; MouseButtonState middleState; Int middleEvent; - Int middleFrame; }; class CursorInfo @@ -394,9 +392,6 @@ class Mouse : public SubsystemInterface Int m_minY; ///< mouse is locked to this region Int m_maxY; ///< mouse is locked to this region - UnsignedInt m_inputFrame; ///< frame input was gathered on - UnsignedInt m_deadInputFrame; ///< Frame which last input occured - Bool m_inputMovesAbsolute; /**< if TRUE, when processing mouse position chanages the movement will be done treating the coords as ABSOLUTE positions and NOT diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp index bb151a18d78..9ef9c3b1423 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Keyboard.cpp @@ -140,7 +140,12 @@ void Keyboard::updateKeys( void ) m_keyStatus[ m_keys[ index ].key ].state = m_keys[ index ].state; m_keyStatus[ m_keys[ index ].key ].status = m_keys[ index ].status; - m_keyStatus[ m_keys[ index ].key ].sequence = m_inputFrame; + + // Update key down time for new key presses + if( BitIsSet( m_keys[ index ].state, KEY_STATE_DOWN ) ) + { + m_keyStatus[ m_keys[ index ].key ].keyDownTimeMsec = m_keys[ index ].keyDownTimeMsec; + } // prevent ALT-TAB from causing a TAB event if( m_keys[ index ].key == KEY_TAB ) @@ -195,7 +200,7 @@ void Keyboard::updateKeys( void ) } //------------------------------------------------------------------------------------------------- -/** check key repeat sequences, TRUE is returned if repeat is occurring */ +/** check key repeat timing, TRUE is returned if repeat is occurring */ //------------------------------------------------------------------------------------------------- Bool Keyboard::checkKeyRepeat( void ) { @@ -220,7 +225,11 @@ Bool Keyboard::checkKeyRepeat( void ) if( BitIsSet( m_keyStatus[ key ].state, KEY_STATE_DOWN ) ) { - if( (m_inputFrame - m_keyStatus[ key ].sequence) > Keyboard::KEY_REPEAT_DELAY ) + const UnsignedInt now = timeGetTime(); + const UnsignedInt keyDownTime = m_keyStatus[ key ].keyDownTimeMsec; + const UnsignedInt elapsedMsec = now - keyDownTime; + + if( elapsedMsec > Keyboard::KEY_REPEAT_DELAY_MSEC ) { // Add key to this frame m_keys[ index ].key = (UnsignedByte)key; @@ -232,10 +241,10 @@ Bool Keyboard::checkKeyRepeat( void ) // Set all keys as new to prevent multiple keys repeating for( index = 0; index< NUM_KEYS; index++ ) - m_keyStatus[ index ].sequence = m_inputFrame; + m_keyStatus[ index ].keyDownTimeMsec = now; - // Set repeated key so it will repeat again in two frames - m_keyStatus[ key ].sequence = m_inputFrame - (Keyboard::KEY_REPEAT_DELAY + 2); + // Set repeated key so it will repeat again after the interval + m_keyStatus[ key ].keyDownTimeMsec = now - (Keyboard::KEY_REPEAT_DELAY_MSEC + Keyboard::KEY_REPEAT_INTERVAL_MSEC); retVal = TRUE; break; // exit for key @@ -694,7 +703,6 @@ Keyboard::Keyboard( void ) m_shift2Key = KEY_NONE; memset( m_keyNames, 0, sizeof( m_keyNames ) ); - m_inputFrame = 0; } @@ -714,9 +722,6 @@ void Keyboard::init( void ) // initialize the key names initKeyNames(); - // first input frame - m_inputFrame = 0; - } //------------------------------------------------------------------------------------------------- @@ -733,9 +738,6 @@ void Keyboard::reset( void ) void Keyboard::update( void ) { - // increment input frame - m_inputFrame++; - // update the key data updateKeys(); @@ -819,14 +821,6 @@ Bool Keyboard::getKeyStateBit( KeyDefType key, Int bit ) return (m_keyStatus[ key ].state & bit) ? 1 : 0; } -//------------------------------------------------------------------------------------------------- -/** return the sequence data for the given key */ -//------------------------------------------------------------------------------------------------- -UnsignedInt Keyboard::getKeySequenceData( KeyDefType key ) -{ - return m_keyStatus[ key ].sequence; -} - //------------------------------------------------------------------------------------------------- /** set the key status data */ //------------------------------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp index db0e9c745f2..2310d9ccc6c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp @@ -183,9 +183,6 @@ void Mouse::updateMouseData( ) else m_eventsThisFrame = 0; - if( index != 0 ) - m_deadInputFrame = m_inputFrame; - } //------------------------------------------------------------------------------------------------- @@ -221,7 +218,7 @@ void Mouse::processMouseEvent( Int index ) m_currMouse.wheelPos += m_mouseEvents[ index ].wheelPos; // Check Left Mouse State - if( m_mouseEvents[ index ].leftFrame ) + if( m_mouseEvents[ index ].leftState != MBS_None ) { if( m_currMouse.leftState != m_mouseEvents[ index ].leftState ) { @@ -231,21 +228,18 @@ void Mouse::processMouseEvent( Int index ) // Mouse Down m_currMouse.leftEvent = GWM_LEFT_DOWN; m_currMouse.leftState = MBS_Down; - m_currMouse.leftFrame = m_inputFrame; } else if ( m_mouseEvents[ index ].leftState == MBS_DoubleClick ) { // Mouse Double Click m_currMouse.leftEvent = GWM_LEFT_DOUBLE_CLICK; m_currMouse.leftState = MBS_DoubleClick; - m_currMouse.leftFrame = m_inputFrame; } else { // Mouse Up m_currMouse.leftEvent = GWM_LEFT_UP; m_currMouse.leftState = MBS_Up; - m_currMouse.leftFrame = m_inputFrame; } } } @@ -257,7 +251,7 @@ void Mouse::processMouseEvent( Int index ) } // Check Right Mouse State - if( m_mouseEvents[ index ].rightFrame ) + if( m_mouseEvents[ index ].rightState != MBS_None ) { if( m_currMouse.rightState != m_mouseEvents[ index ].rightState ) { @@ -267,21 +261,18 @@ void Mouse::processMouseEvent( Int index ) // Mouse Down m_currMouse.rightEvent = GWM_RIGHT_DOWN; m_currMouse.rightState = MBS_Down; - m_currMouse.rightFrame = m_inputFrame; } else if( m_mouseEvents[ index ].rightState == MBS_DoubleClick ) { // Mouse Double Click m_currMouse.rightEvent = GWM_RIGHT_DOUBLE_CLICK; m_currMouse.rightState = MBS_DoubleClick; - m_currMouse.rightFrame = m_inputFrame; } else { // Mouse Up m_currMouse.rightEvent = GWM_RIGHT_UP; m_currMouse.rightState = MBS_Up; - m_currMouse.rightFrame = m_inputFrame; } } } @@ -293,7 +284,7 @@ void Mouse::processMouseEvent( Int index ) } // Check Middle Mouse State - if( m_mouseEvents[ index ].middleFrame ) + if( m_mouseEvents[ index ].middleState != MBS_None ) { if( m_currMouse.middleState != m_mouseEvents[index].middleState ) { @@ -302,20 +293,17 @@ void Mouse::processMouseEvent( Int index ) { m_currMouse.middleEvent = GWM_MIDDLE_DOWN; m_currMouse.middleState = MBS_Down; - m_currMouse.middleFrame = m_inputFrame; } else if( m_mouseEvents[index].middleState == MBS_DoubleClick ) { m_currMouse.middleEvent = GWM_MIDDLE_DOUBLE_CLICK; m_currMouse.middleState = MBS_DoubleClick; - m_currMouse.middleFrame = m_inputFrame; } else { // Mouse Up m_currMouse.middleEvent = GWM_MIDDLE_UP; m_currMouse.middleState = MBS_Up; - m_currMouse.middleFrame = m_inputFrame; } } } @@ -328,7 +316,7 @@ void Mouse::processMouseEvent( Int index ) m_currMouse.deltaPos.x = m_currMouse.pos.x - m_prevMouse.pos.x; m_currMouse.deltaPos.y = m_currMouse.pos.y - m_prevMouse.pos.y; -// DEBUG_LOG(("Mouse dx %d, dy %d, index %d, frame %d", m_currMouse.deltaPos.x, m_currMouse.deltaPos.y, index, m_inputFrame)); +// DEBUG_LOG(("Mouse dx %d, dy %d, index %d", m_currMouse.deltaPos.x, m_currMouse.deltaPos.y, index)); // // check if mouse is still and flag tooltip // if( ((dx*dx) + (dy*dy)) < CURSOR_MOVE_TOL_SQ ) // { @@ -474,9 +462,6 @@ Mouse::Mouse( void ) m_maxY = 0; m_eventsThisFrame = 0; - m_inputFrame = 0; - m_deadInputFrame =0; - m_inputMovesAbsolute = FALSE; m_currentCursor = ARROW; @@ -590,9 +575,6 @@ void Mouse::init( void ) m_minY = 0; m_maxY = 599; - m_inputFrame = 0; - m_deadInputFrame =0; - m_inputMovesAbsolute = FALSE; m_eventsThisFrame = 0; @@ -676,9 +658,6 @@ void Mouse::reset( void ) void Mouse::update( void ) { - // increment input frame - m_inputFrame++; - // update the mouse data updateMouseData( ); diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp index 8d900a3636e..6168f28233a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp @@ -137,9 +137,9 @@ LookAtTranslator::LookAtTranslator() : m_isRotating(false), m_isPitching(false), m_isChangingFOV(false), - m_timestamp(0), + m_middleButtonDownTimeMsec(0), m_lastPlaneID(INVALID_DRAWABLE_ID), - m_lastMouseMoveFrame(0), + m_lastMouseMoveTimeMsec(0), m_scrollType(SCROLL_NONE) { m_anchor.x = m_anchor.y = 0; @@ -171,13 +171,12 @@ const ICoord2D* LookAtTranslator::getRMBScrollAnchor(void) Bool LookAtTranslator::hasMouseMovedRecently( void ) { - if (m_lastMouseMoveFrame > TheGameLogic->getFrame()) - m_lastMouseMoveFrame = 0; // reset for new game + const UnsignedInt now = timeGetTime(); + const UnsignedInt lastMove = m_lastMouseMoveTimeMsec; - if (m_lastMouseMoveFrame + LOGICFRAMES_PER_SECOND < TheGameLogic->getFrame()) - return false; + const UnsignedInt elapsedMsec = now - lastMove; - return true; + return elapsedMsec <= MSEC_PER_SECOND; } void LookAtTranslator::setCurrentPos( const ICoord2D& pos ) @@ -256,7 +255,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_DOWN: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); m_anchor = msg->getArgument( 0 )->pixel; m_currentPos = msg->getArgument( 0 )->pixel; @@ -271,7 +270,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_RIGHT_BUTTON_UP: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); if (m_scrollType == SCROLL_RMB) { @@ -283,23 +282,25 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_DOWN: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + const UnsignedInt now = timeGetTime(); + m_lastMouseMoveTimeMsec = now; + m_middleButtonDownTimeMsec = now; m_isRotating = true; m_anchor = msg->getArgument( 0 )->pixel; m_anchorAngle = TheTacticalView->getAngle(); m_originalAnchor = msg->getArgument( 0 )->pixel; m_currentPos = msg->getArgument( 0 )->pixel; - m_timestamp = TheGameClient->getFrame(); break; } //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_MIDDLE_BUTTON_UP: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + const UnsignedInt now = timeGetTime(); + m_lastMouseMoveTimeMsec = now; - const UnsignedInt CLICK_DURATION = 5; + const UnsignedInt CLICK_DURATION_MSEC = 167; const UnsignedInt PIXEL_OFFSET = 5; m_isRotating = false; @@ -307,8 +308,11 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage if (dx<0) dx = -dx; Int dy = m_currentPos.y-m_originalAnchor.y; Bool didMove = dx>PIXEL_OFFSET || dy>PIXEL_OFFSET; + + const UnsignedInt elapsedMsec = now - m_middleButtonDownTimeMsec; + // if middle button is "clicked", reset to "home" orientation - if (!didMove && TheGameClient->getFrame() - m_timestamp < CLICK_DURATION) + if (!didMove && elapsedMsec < CLICK_DURATION_MSEC) { TheTacticalView->setAngleAndPitchToDefault(); TheTacticalView->setZoomToDefault(); @@ -321,7 +325,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage case GameMessage::MSG_RAW_MOUSE_POSITION: { if (m_currentPos.x != msg->getArgument( 0 )->pixel.x || m_currentPos.y != msg->getArgument( 0 )->pixel.y) - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); m_currentPos = msg->getArgument( 0 )->pixel; @@ -401,7 +405,7 @@ GameMessageDisposition LookAtTranslator::translateGameMessage(const GameMessage //----------------------------------------------------------------------------- case GameMessage::MSG_RAW_MOUSE_WHEEL: { - m_lastMouseMoveFrame = TheGameLogic->getFrame(); + m_lastMouseMoveTimeMsec = timeGetTime(); Int spin = msg->getArgument( 1 )->integer; diff --git a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp index 027a95f479d..0591902e29f 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIKeyboard.cpp @@ -251,7 +251,6 @@ void DirectInputKeyboard::getKey( KeyboardIO *key ) HRESULT hr; assert( key ); - key->sequence = 0; key->key = KEY_NONE; if( m_pKeyboardDevice ) @@ -315,15 +314,20 @@ void DirectInputKeyboard::getKey( KeyboardIO *key ) // set the key key->key = (UnsignedByte)(kbdat.dwOfs & 0xFF); - // sequence - key->sequence = kbdat.dwSequence; - // // state of key, note we are setting the key state here with an assignment // and not a bit set of the up/down state, this is the "start" // of building this "key" // - key->state = (( kbdat.dwData & 0x0080 ) ? KEY_STATE_DOWN : KEY_STATE_UP); + if( kbdat.dwData & 0x0080 ) + { + key->state = KEY_STATE_DOWN; + key->keyDownTimeMsec = kbdat.dwTimeStamp; + } + else + { + key->state = KEY_STATE_UP; + } // set status as unused (unprocessed) key->status = KeyboardIO::STATUS_UNUSED; diff --git a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp index e5b195fe6c1..c8b59e10e62 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32DIMouse.cpp @@ -202,7 +202,7 @@ UnsignedByte DirectInputMouse::getMouseEvent( MouseIO *result, Bool flush ) /* set these to defaults */ result->leftState = result->middleState = result->rightState = FALSE; - result->leftFrame = result->middleFrame = result->rightFrame = 0; + result->leftState = result->middleState = result->rightState = MBS_None; result->pos.x = result->pos.y = result->wheelPos = 0; if( m_pMouseDevice ) @@ -282,18 +282,15 @@ void DirectInputMouse::mapDirectInputMouse( MouseIO *mouse, switch( mdat->dwOfs ) { case DIMOFS_BUTTON0: - mouse->leftState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->leftFrame = mdat->dwSequence; + mouse->leftState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON1: - mouse->rightState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->rightFrame = mdat->dwSequence; + mouse->rightState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON2: - mouse->middleState = (( mdat->dwData & 0x0080 ) ? TRUE : FALSE); - mouse->middleFrame = mdat->dwSequence; + mouse->middleState = (( mdat->dwData & 0x0080 ) ? MBS_Down : MBS_Up); break; case DIMOFS_BUTTON3: diff --git a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp index 9b89deba00d..085bcd461d3 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/Win32Device/GameClient/Win32Mouse.cpp @@ -85,21 +85,9 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) UINT msg = m_eventBuffer[ eventIndex ].msg; WPARAM wParam = m_eventBuffer[ eventIndex ].wParam; LPARAM lParam = m_eventBuffer[ eventIndex ].lParam; - UnsignedInt frame; - - // - // get the current input frame from the client, if we don't have - // a client (like in the GUI editor) we just use frame 1 so it - // registers with the system - // - if( TheGameClient ) - frame = TheGameClient->getFrame(); - else - frame = 1; // set these to defaults - result->leftState = result->middleState = result->rightState = MBS_Up; - result->leftFrame = result->middleFrame = result->rightFrame = 0; + result->leftState = result->middleState = result->rightState = MBS_None; result->pos.x = result->pos.y = result->wheelPos = 0; // Time is the same for all events @@ -113,7 +101,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_Down; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -125,7 +112,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_Up; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -137,7 +123,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->leftState = MBS_DoubleClick; - result->leftFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -149,7 +134,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_Down; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -161,7 +145,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_Up; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -173,7 +156,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->middleState = MBS_DoubleClick; - result->middleFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -185,7 +167,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_Down; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -197,7 +178,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_Up; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break; @@ -209,7 +189,6 @@ void Win32Mouse::translateEvent( UnsignedInt eventIndex, MouseIO *result ) { result->rightState = MBS_DoubleClick; - result->rightFrame = frame; result->pos.x = LOWORD( lParam ); result->pos.y = HIWORD( lParam ); break;