Mouse move work

This commit is contained in:
Stepanov Igor 2025-10-05 13:20:52 +03:00
parent 51927ee350
commit 6a7335900f
3 changed files with 22 additions and 14 deletions

View file

@ -8,6 +8,8 @@
#include <SDL3/SDL_mouse.h> #include <SDL3/SDL_mouse.h>
#include <SDL3/SDL_video.h> #include <SDL3/SDL_video.h>
#include <cstring>
#include "debug/Logger.hpp" #include "debug/Logger.hpp"
#include "window/detail/window_sdl.hpp" #include "window/detail/window_sdl.hpp"
#include "window/input.hpp" #include "window/input.hpp"
@ -17,17 +19,17 @@ static debug::Logger logger("input");
std::string input_util::to_string(Keycode code) { std::string input_util::to_string(Keycode code) {
int icode_repr = static_cast<int>(code); int icode_repr = static_cast<int>(code);
const char* name = SDL_GetKeyName(icode_repr); const char* name = SDL_GetKeyName(icode_repr);
logger.info() << icode_repr << ": " << name;
return std::string(name); return std::string(name);
} }
Keycode input_util::keycode_from(const std::string& name) { Keycode input_util::keycode_from(const std::string& name) {
logger.info() << name << ": " << SDL_GetKeyFromName(name.c_str());
return static_cast<Keycode>(SDL_GetKeyFromName(name.c_str())); return static_cast<Keycode>(SDL_GetKeyFromName(name.c_str()));
} }
input_sdl::input_sdl(window_sdl& window) : window(window) { input_sdl::input_sdl(window_sdl& window) : window(window) {
input_util::initialize(); input_util::initialize();
// We should always get char stream (maybe)
SDL_StartTextInput(window.getSdlWindow());
} }
void input_sdl::pollEvents() { void input_sdl::pollEvents() {
@ -47,7 +49,6 @@ void input_sdl::pollEvents() {
window.setShouldClose(true); window.setShouldClose(true);
break; break;
case SDL_EVENT_KEY_DOWN: case SDL_EVENT_KEY_DOWN:
logger.info() << "Keyboard button: " << event.key.scancode;
prevPressed = keys[event.key.scancode]; prevPressed = keys[event.key.scancode];
keys[event.key.scancode] = true; keys[event.key.scancode] = true;
frames[event.key.scancode] = currentFrame; frames[event.key.scancode] = currentFrame;
@ -58,10 +59,6 @@ void input_sdl::pollEvents() {
pressedKeys.push_back(static_cast<Keycode>(event.key.scancode)); pressedKeys.push_back(static_cast<Keycode>(event.key.scancode));
break; break;
case SDL_EVENT_KEY_UP: case SDL_EVENT_KEY_UP:
if (event.key.scancode >= keys_buffer_size) {
// Win key return 1073742051
break;
}
keys[event.key.scancode] = false; keys[event.key.scancode] = false;
frames[event.key.scancode] = currentFrame; frames[event.key.scancode] = currentFrame;
break; break;
@ -81,11 +78,23 @@ void input_sdl::pollEvents() {
frames[event.button.button + mouse_keys_offset] = currentFrame; frames[event.button.button + mouse_keys_offset] = currentFrame;
break; break;
case SDL_EVENT_MOUSE_MOTION: case SDL_EVENT_MOUSE_MOTION:
if (cursorDrag) {
delta += glm::vec2{event.motion.xrel, event.motion.yrel};
} else {
cursorDrag = true;
}
cursor = {event.motion.x, event.motion.y}; cursor = {event.motion.x, event.motion.y};
delta = {event.motion.xrel, event.motion.yrel};
break; break;
case SDL_EVENT_WINDOW_RESIZED: case SDL_EVENT_WINDOW_RESIZED:
break; break;
case SDL_EVENT_TEXT_INPUT:
std::vector<char> vec(
event.text.text,
event.text.text + std::strlen(event.text.text)
);
std::copy(
vec.begin(), vec.end(), std::back_inserter(codepoints)
);
} }
} }
for (auto& [_, binding] : bindings.getAll()) { for (auto& [_, binding] : bindings.getAll()) {
@ -136,7 +145,6 @@ bool input_sdl::pressed(Keycode key) const {
if (keycode < 0 || keycode >= keys_buffer_size) { if (keycode < 0 || keycode >= keys_buffer_size) {
return false; return false;
} }
if (keys[keycode]) logger.info() << "kek";
return keys[keycode]; return keys[keycode];
} }
bool input_sdl::jpressed(Keycode keycode) const { bool input_sdl::jpressed(Keycode keycode) const {
@ -164,8 +172,8 @@ bool input_sdl::isCursorLocked() const {
void input_sdl::toggleCursor() { void input_sdl::toggleCursor() {
cursorDrag = false; cursorDrag = false;
SDL_SetWindowMouseGrab(window.getSdlWindow(), cursorLocked);
cursorLocked = !cursorLocked; cursorLocked = !cursorLocked;
SDL_SetWindowRelativeMouseMode(window.getSdlWindow(), cursorLocked);
} }
Bindings& input_sdl::getBindings() { Bindings& input_sdl::getBindings() {
@ -184,6 +192,6 @@ const std::vector<Keycode>& input_sdl::getPressedKeys() const {
return pressedKeys; return pressedKeys;
} }
const std::vector<uint>& input_sdl::getCodepoints() const { const std::vector<char>& input_sdl::getCodepoints() const {
return codepoints; return codepoints;
} }

View file

@ -38,7 +38,7 @@ public:
ObserverHandler addKeyCallback(Keycode key, KeyCallback callback) override; ObserverHandler addKeyCallback(Keycode key, KeyCallback callback) override;
const std::vector<Keycode>& getPressedKeys() const override; const std::vector<Keycode>& getPressedKeys() const override;
const std::vector<uint>& getCodepoints() const override; const std::vector<char>& getCodepoints() const override;
private: private:
glm::vec2 delta; glm::vec2 delta;
glm::vec2 cursor; glm::vec2 cursor;
@ -49,7 +49,7 @@ private:
bool cursorLocked = false; bool cursorLocked = false;
bool cursorDrag = false; bool cursorDrag = false;
Bindings bindings; Bindings bindings;
std::vector<uint> codepoints; std::vector<char> codepoints;
std::vector<Keycode> pressedKeys; std::vector<Keycode> pressedKeys;
std::unordered_map<Keycode, util::HandlersList<>> keyCallbacks; std::unordered_map<Keycode, util::HandlersList<>> keyCallbacks;

View file

@ -281,7 +281,7 @@ public:
) = 0; ) = 0;
virtual const std::vector<Keycode>& getPressedKeys() const = 0; virtual const std::vector<Keycode>& getPressedKeys() const = 0;
virtual const std::vector<uint>& getCodepoints() const = 0; virtual const std::vector<char>& getCodepoints() const = 0;
ObserverHandler addCallback(const std::string& name, KeyCallback callback) { ObserverHandler addCallback(const std::string& name, KeyCallback callback) {
return getBindings().require(name).onactived.add(callback); return getBindings().require(name).onactived.add(callback);