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

View file

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

View file

@ -281,7 +281,7 @@ public:
) = 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) {
return getBindings().require(name).onactived.add(callback);