diff --git a/code/ryzom/client/src/events_listener.cpp b/code/ryzom/client/src/events_listener.cpp index a35fdbcb7..89963a2ab 100644 --- a/code/ryzom/client/src/events_listener.cpp +++ b/code/ryzom/client/src/events_listener.cpp @@ -182,30 +182,33 @@ void CEventsListener::operator()(const CEvent& event) s_MouseFreeLookLastY = pscY; s_MouseFreeLookWaitCenter = false; } - if (s_MouseFreeLookWaitCenter && scX == 0 && scY == 0) + + // NOTE: No 0, 0 center mouse message in Windows (lower mouse message rate), but safe to assume any movement messages are requeued relative to our new position + // In case free look bugs on other platform, we may need to push in our own message on setMousePos for Windows + if (s_MouseFreeLookWaitCenter) // scX == 0 && scY == 0) { - // Centered, ignore + // Centered, set last to 0 s_MouseFreeLookLastX = 0; s_MouseFreeLookLastY = 0; + s_MouseFreeLookWaitCenter = false; } - else + + // Get delta since last center + sint scXd = scX - s_MouseFreeLookLastX; + sint scYd = scY - s_MouseFreeLookLastY; + s_MouseFreeLookLastX = scX; + s_MouseFreeLookLastY = scY; + + s_MouseFreeLookFrameX += scXd; + s_MouseFreeLookFrameY += scYd; + // updateFreeLookPos is called in updateMouseSmoothing per frame + + // Center cursor + bool outsideBounds = ((abs(scX) > (drW >> 3)) || (abs(scY) > (drH >> 3))); + if (outsideBounds) { - // Get delta since last center - sint scXd = scX - s_MouseFreeLookLastX; - sint scYd = scY - s_MouseFreeLookLastY; - s_MouseFreeLookLastX = scX; - s_MouseFreeLookLastY = scY; - - s_MouseFreeLookFrameX += scXd; - s_MouseFreeLookFrameY += scYd; - // updateFreeLookPos is called in updateMouseSmoothing per frame - - // Center cursor - if (abs(scX) > (drW >> 3) || abs(scY) > (drH >> 3)) - { - s_MouseFreeLookWaitCenter = true; - Driver->setMousePos(0.5f, 0.5f); - } + s_MouseFreeLookWaitCenter = true; + Driver->setMousePos(0.5f, 0.5f); } } }