mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-18 19:12:44 +03:00
feat(gx): GLSDL window dispatches mouse and key events to input queue
This commit is contained in:
parent
dce8a76717
commit
eccf4db2e0
@ -1,9 +1,123 @@
|
||||
#include "gx/glsdl/GLSDLWindow.hpp"
|
||||
#include "event/Types.hpp"
|
||||
#include "event/Input.hpp"
|
||||
|
||||
#include <bc/Debug.hpp>
|
||||
#include <map>
|
||||
|
||||
static bool s_GLSDL_Initialized = false;
|
||||
|
||||
static const std::map<SDL_Scancode, KEY> s_keyConversion = {
|
||||
{SDL_SCANCODE_LSHIFT, KEY_LSHIFT},
|
||||
{SDL_SCANCODE_RSHIFT, KEY_RSHIFT},
|
||||
{SDL_SCANCODE_LCTRL, KEY_LCONTROL},
|
||||
{SDL_SCANCODE_RCTRL, KEY_RCONTROL},
|
||||
{SDL_SCANCODE_LALT, KEY_LALT},
|
||||
{SDL_SCANCODE_RALT, KEY_RALT},
|
||||
{SDL_SCANCODE_SPACE, KEY_SPACE},
|
||||
{SDL_SCANCODE_0, KEY_0},
|
||||
{SDL_SCANCODE_1, KEY_1},
|
||||
{SDL_SCANCODE_2, KEY_2},
|
||||
{SDL_SCANCODE_3, KEY_3},
|
||||
{SDL_SCANCODE_4, KEY_4},
|
||||
{SDL_SCANCODE_5, KEY_5},
|
||||
{SDL_SCANCODE_6, KEY_6},
|
||||
{SDL_SCANCODE_7, KEY_7},
|
||||
{SDL_SCANCODE_8, KEY_8},
|
||||
{SDL_SCANCODE_9, KEY_9},
|
||||
{SDL_SCANCODE_A, KEY_A},
|
||||
{SDL_SCANCODE_B, KEY_B},
|
||||
{SDL_SCANCODE_C, KEY_C},
|
||||
{SDL_SCANCODE_D, KEY_D},
|
||||
{SDL_SCANCODE_E, KEY_E},
|
||||
{SDL_SCANCODE_F, KEY_F},
|
||||
{SDL_SCANCODE_G, KEY_G},
|
||||
{SDL_SCANCODE_H, KEY_H},
|
||||
{SDL_SCANCODE_I, KEY_I},
|
||||
{SDL_SCANCODE_J, KEY_J},
|
||||
{SDL_SCANCODE_K, KEY_K},
|
||||
{SDL_SCANCODE_L, KEY_L},
|
||||
{SDL_SCANCODE_M, KEY_M},
|
||||
{SDL_SCANCODE_N, KEY_N},
|
||||
{SDL_SCANCODE_O, KEY_O},
|
||||
{SDL_SCANCODE_P, KEY_P},
|
||||
{SDL_SCANCODE_Q, KEY_Q},
|
||||
{SDL_SCANCODE_R, KEY_R},
|
||||
{SDL_SCANCODE_S, KEY_S},
|
||||
{SDL_SCANCODE_T, KEY_T},
|
||||
{SDL_SCANCODE_U, KEY_U},
|
||||
{SDL_SCANCODE_V, KEY_V},
|
||||
{SDL_SCANCODE_W, KEY_W},
|
||||
{SDL_SCANCODE_X, KEY_X},
|
||||
{SDL_SCANCODE_Y, KEY_Y},
|
||||
{SDL_SCANCODE_Z, KEY_Z},
|
||||
{SDL_SCANCODE_GRAVE, KEY_TILDE},
|
||||
{SDL_SCANCODE_KP_0, KEY_NUMPAD0},
|
||||
{SDL_SCANCODE_KP_1, KEY_NUMPAD1},
|
||||
{SDL_SCANCODE_KP_2, KEY_NUMPAD2},
|
||||
{SDL_SCANCODE_KP_3, KEY_NUMPAD3},
|
||||
{SDL_SCANCODE_KP_4, KEY_NUMPAD4},
|
||||
{SDL_SCANCODE_KP_5, KEY_NUMPAD5},
|
||||
{SDL_SCANCODE_KP_6, KEY_NUMPAD6},
|
||||
{SDL_SCANCODE_KP_7, KEY_NUMPAD7},
|
||||
{SDL_SCANCODE_KP_8, KEY_NUMPAD8},
|
||||
{SDL_SCANCODE_KP_9, KEY_NUMPAD9},
|
||||
{SDL_SCANCODE_KP_PLUS, KEY_NUMPAD_PLUS},
|
||||
{SDL_SCANCODE_KP_MINUS, KEY_NUMPAD_MINUS},
|
||||
{SDL_SCANCODE_KP_MULTIPLY, KEY_NUMPAD_MULTIPLY},
|
||||
{SDL_SCANCODE_KP_DIVIDE, KEY_NUMPAD_DIVIDE},
|
||||
{SDL_SCANCODE_KP_DECIMAL, KEY_NUMPAD_DECIMAL},
|
||||
{SDL_SCANCODE_KP_EQUALS, KEY_NUMPAD_EQUALS},
|
||||
{SDL_SCANCODE_EQUALS, KEY_PLUS},
|
||||
{SDL_SCANCODE_MINUS, KEY_MINUS},
|
||||
{SDL_SCANCODE_LEFTBRACKET, KEY_BRACKET_OPEN},
|
||||
{SDL_SCANCODE_RIGHTBRACKET, KEY_BRACKET_CLOSE},
|
||||
{SDL_SCANCODE_SLASH, KEY_SLASH},
|
||||
{SDL_SCANCODE_BACKSLASH, KEY_BACKSLASH},
|
||||
{SDL_SCANCODE_SEMICOLON, KEY_SEMICOLON},
|
||||
{SDL_SCANCODE_APOSTROPHE, KEY_APOSTROPHE},
|
||||
{SDL_SCANCODE_COMMA, KEY_COMMA},
|
||||
{SDL_SCANCODE_PERIOD, KEY_PERIOD},
|
||||
{SDL_SCANCODE_ESCAPE, KEY_ESCAPE},
|
||||
{SDL_SCANCODE_RETURN, KEY_ENTER},
|
||||
{SDL_SCANCODE_BACKSPACE, KEY_BACKSPACE},
|
||||
{SDL_SCANCODE_TAB, KEY_TAB},
|
||||
{SDL_SCANCODE_LEFT, KEY_LEFT},
|
||||
{SDL_SCANCODE_UP, KEY_UP},
|
||||
{SDL_SCANCODE_RIGHT, KEY_RIGHT},
|
||||
{SDL_SCANCODE_DOWN, KEY_DOWN},
|
||||
{SDL_SCANCODE_INSERT, KEY_INSERT},
|
||||
{SDL_SCANCODE_DELETE, KEY_DELETE},
|
||||
{SDL_SCANCODE_HOME, KEY_HOME},
|
||||
{SDL_SCANCODE_END, KEY_END},
|
||||
{SDL_SCANCODE_PAGEUP, KEY_PAGEUP},
|
||||
{SDL_SCANCODE_PAGEDOWN, KEY_PAGEDOWN},
|
||||
{SDL_SCANCODE_CAPSLOCK, KEY_CAPSLOCK},
|
||||
{SDL_SCANCODE_NUMLOCKCLEAR, KEY_NUMLOCK},
|
||||
{SDL_SCANCODE_SCROLLLOCK, KEY_SCROLLLOCK},
|
||||
{SDL_SCANCODE_PAUSE, KEY_PAUSE},
|
||||
{SDL_SCANCODE_PRINTSCREEN, KEY_PRINTSCREEN},
|
||||
{SDL_SCANCODE_F1, KEY_F1},
|
||||
{SDL_SCANCODE_F2, KEY_F2},
|
||||
{SDL_SCANCODE_F3, KEY_F3},
|
||||
{SDL_SCANCODE_F4, KEY_F4},
|
||||
{SDL_SCANCODE_F5, KEY_F5},
|
||||
{SDL_SCANCODE_F6, KEY_F6},
|
||||
{SDL_SCANCODE_F7, KEY_F7},
|
||||
{SDL_SCANCODE_F8, KEY_F8},
|
||||
{SDL_SCANCODE_F9, KEY_F9},
|
||||
{SDL_SCANCODE_F10, KEY_F10},
|
||||
{SDL_SCANCODE_F11, KEY_F11},
|
||||
{SDL_SCANCODE_F12, KEY_F12},
|
||||
{SDL_SCANCODE_F13, KEY_F13},
|
||||
{SDL_SCANCODE_F14, KEY_F14},
|
||||
{SDL_SCANCODE_F15, KEY_F15},
|
||||
{SDL_SCANCODE_F16, KEY_F16},
|
||||
{SDL_SCANCODE_F17, KEY_F17},
|
||||
{SDL_SCANCODE_F18, KEY_F18},
|
||||
{SDL_SCANCODE_F19, KEY_F19}
|
||||
};
|
||||
|
||||
void GLSDLWindow::Create(const char* title, const GLSDLWindowRect& rect, GLTextureFormat depthFormat, uint32_t sampleCount) {
|
||||
BLIZZARD_ASSERT(this->m_sdlWindow == nullptr);
|
||||
|
||||
@ -69,8 +183,14 @@ void GLSDLWindow::Create(const char* title, const GLSDLWindowRect& rect, GLTextu
|
||||
|
||||
void GLSDLWindow::Swap() {
|
||||
SDL_GL_SwapWindow(this->m_sdlWindow);
|
||||
|
||||
SDL_Event event;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
this->DispatchSDLEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GLSDLWindow::Destroy() {
|
||||
SDL_DestroyWindow(this->m_sdlWindow);
|
||||
this->m_sdlWindow = nullptr;
|
||||
@ -129,3 +249,39 @@ int32_t GLSDLWindow::GetHeight() {
|
||||
return this->GetBackingRect().size.height;
|
||||
}
|
||||
|
||||
void GLSDLWindow::DispatchSDLEvent(const SDL_Event& event) {
|
||||
switch (event.type) {
|
||||
case SDL_EVENT_KEY_DOWN:
|
||||
case SDL_EVENT_KEY_UP:
|
||||
this->DispatchSDLKeyboardEvent(event);
|
||||
break;
|
||||
case SDL_EVENT_MOUSE_MOTION:
|
||||
this->DispatchSDLMouseMotionEvent(event);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GLSDLWindow::DispatchSDLKeyboardEvent(const SDL_Event& event) {
|
||||
// Is this an up or down keypress?
|
||||
OSINPUT inputclass = event.type == SDL_EVENT_KEY_UP ? OS_INPUT_KEY_UP : OS_INPUT_KEY_DOWN;
|
||||
|
||||
// What key does this SDL scancode correspond to?
|
||||
auto lookup = s_keyConversion.find(event.key.keysym.scancode);
|
||||
if (lookup == s_keyConversion.end()) {
|
||||
// No corresponding KEY to this scancode
|
||||
return;
|
||||
}
|
||||
KEY key = lookup->second;
|
||||
|
||||
// Push key event into input queue
|
||||
OsQueuePut(inputclass, key, 0, 0, 0);
|
||||
}
|
||||
|
||||
void GLSDLWindow::DispatchSDLMouseMotionEvent(const SDL_Event& event) {
|
||||
auto x = static_cast<int32_t>(event.motion.x);
|
||||
auto y = static_cast<int32_t>(event.motion.y);
|
||||
|
||||
OsQueuePut(OS_INPUT_MOUSE_MOVE, 0, x, y, 0);
|
||||
}
|
||||
|
@ -30,6 +30,9 @@ class GLSDLWindow {
|
||||
void Create(const char* title, const GLSDLWindowRect& rect, GLTextureFormat depthFormat, uint32_t sampleCount);
|
||||
void Destroy();
|
||||
void Swap();
|
||||
void DispatchSDLEvent(const SDL_Event& event);
|
||||
void DispatchSDLKeyboardEvent(const SDL_Event& event);
|
||||
void DispatchSDLMouseMotionEvent(const SDL_Event& event);
|
||||
void Resize(const GLSDLWindowRect& rect);
|
||||
|
||||
GLSDLWindowRect GetRect();
|
||||
|
Loading…
Reference in New Issue
Block a user