载入中...
搜索中...
未找到
WheelInput.cpp
浏览该文件的文档.
1#include <SDL2/SDL_events.h>
2#include <SDL2/SDL_version.h>
3#include <cmath>
4#include "mouse/Mouse.h"
6
7namespace eve::mouse::sdl {
8namespace {
9// The linked backend owns one event-thread frame snapshot. Reading it never
10// consumes input, so two independent camera/UI readers see the same frame.
11class WheelSink final : public platform_event::IPlatformEventSink {
12public:
13 platform_event::Message* translatePlatformEvent(const void* nativeEvent) override {
14 const auto& event = *static_cast<const SDL_Event*>(nativeEvent);
15 if (event.type != SDL_MOUSEWHEEL) return nullptr;
16#if SDL_VERSION_ATLEAST(2, 0, 18)
17 const float x = event.wheel.preciseX, y = event.wheel.preciseY;
18#else
19 const float x = static_cast<float>(event.wheel.x), y = static_cast<float>(event.wheel.y);
20#endif
21 const float direction = event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1.f : 1.f;
22 if (std::isfinite(x) && std::isfinite(y)) {
23 pendingX += x * direction;
24 pendingY += y * direction;
25 }
26 return nullptr; // Other listeners may still inspect the event.
27 }
28 void onPumpFinished() override {
29 frameX = pendingX;
30 frameY = pendingY;
31 pendingX = pendingY = 0.f;
32 }
33 float frameX = 0.f, frameY = 0.f;
34
35private:
36 float pendingX = 0.f, pendingY = 0.f;
37};
38WheelSink& wheelSink() {
39 static WheelSink sink;
40 return sink;
41}
42struct Register {
43 Register() {
44 cap::addListener<platform_event::IPlatformEventSink>(&wheelSink(), platform_event::IPlatformEventSink::kInput);
45 }
46} registration;
47} // namespace
48} // namespace eve::mouse::sdl
49
50namespace eve::mouse {
51float Mouse::getWheelX() const { return sdl::wheelSink().frameX; }
52float Mouse::getWheelY() const { return sdl::wheelSink().frameY; }
53} // namespace eve::mouse
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
RoadLaneDirection direction
float frameY
float frameX
float getWheelY() const
Vertical scroll from the latest platform pump; event-thread read, non-consuming.
float getWheelX() const
Horizontal scroll from the latest platform pump; event-thread read, non-consuming.