diff options
author | 2023-02-24 19:31:12 +1100 | |
---|---|---|
committer | 2023-02-24 19:31:12 +1100 | |
commit | 65aeb63a2a1f4f65a6fa0dedabba1b852a189f96 (patch) | |
tree | 42a56bcf4d22b624dbb117946e376981e691a5f0 /src/osd/modules/input/input_rawinput.cpp | |
parent | 3b5dbeea3bad50ad04c966de4afffb864a9856d0 (diff) |
Update accumulating relative inputs exactly once per frame.
This fixes "amplification" effects that would happen if the frame rate
rose above 100 Hz (whether by unthrottling or otherwise).
Synchronise with wall clock any time inputs are read. Not doing this
has weird effects on relative inputs with frame skipping and contributes
to unresponsiveness of menus.
Reduce visual latency for mouse movement on menus when paused or
skipping frames. The rest of the code changes to menus won't provide
benefits until draw can happen after event handling.
Diffstat (limited to 'src/osd/modules/input/input_rawinput.cpp')
-rw-r--r-- | src/osd/modules/input/input_rawinput.cpp | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index ca6522f20e2..3ee8e2d8f7e 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -367,22 +367,28 @@ class rawinput_mouse_device : public rawinput_device public: rawinput_mouse_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : rawinput_device(std::move(name), std::move(id), module, handle), - m_mouse({0}) + m_mouse({0}), + m_x(0), + m_y(0), + m_z(0) { } - virtual void poll() override + virtual void poll(bool relative_reset) override { - m_mouse.lX = 0; - m_mouse.lY = 0; - m_mouse.lZ = 0; - - rawinput_device::poll(); + rawinput_device::poll(relative_reset); + if (relative_reset) + { + m_mouse.lX = std::exchange(m_x, 0); + m_mouse.lY = std::exchange(m_y, 0); + m_mouse.lZ = std::exchange(m_z, 0); + } } virtual void reset() override { memset(&m_mouse, 0, sizeof(m_mouse)); + m_x = m_y = m_z = 0; } virtual void configure(input_device &device) override @@ -417,12 +423,12 @@ public: if (rawinput.data.mouse.usFlags == MOUSE_MOVE_RELATIVE) { - m_mouse.lX += rawinput.data.mouse.lLastX * input_device::RELATIVE_PER_PIXEL; - m_mouse.lY += rawinput.data.mouse.lLastY * input_device::RELATIVE_PER_PIXEL; + m_x += rawinput.data.mouse.lLastX * input_device::RELATIVE_PER_PIXEL; + m_y += rawinput.data.mouse.lLastY * input_device::RELATIVE_PER_PIXEL; - // update zaxis + // update Z axis (vertical scroll) if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - m_mouse.lZ += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + m_z += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_mouse.rgbButtons[0] = 0x80; @@ -440,6 +446,7 @@ public: private: mouse_state m_mouse; + LONG m_x, m_y, m_z; }; @@ -452,20 +459,22 @@ class rawinput_lightgun_device : public rawinput_device public: rawinput_lightgun_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : rawinput_device(std::move(name), std::move(id), module, handle), - m_lightgun({0}) + m_lightgun({0}), + m_z(0) { } - virtual void poll() override + virtual void poll(bool relative_reset) override { - m_lightgun.lZ = 0; - - rawinput_device::poll(); + rawinput_device::poll(relative_reset); + if (relative_reset) + m_lightgun.lZ = std::exchange(m_z, 0); } virtual void reset() override { memset(&m_lightgun, 0, sizeof(m_lightgun)); + m_z = 0; } virtual void configure(input_device &device) override @@ -513,7 +522,7 @@ public: // update zaxis if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - m_lightgun.lZ += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + m_z += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_lightgun.rgbButtons[0] = 0x80; @@ -531,6 +540,7 @@ public: private: mouse_state m_lightgun; + LONG m_z; }; |