diff --git a/src/gx/glsdl/GLSDLWindow.cpp b/src/gx/glsdl/GLSDLWindow.cpp index 2ac49af..00d3f72 100644 --- a/src/gx/glsdl/GLSDLWindow.cpp +++ b/src/gx/glsdl/GLSDLWindow.cpp @@ -1,9 +1,123 @@ #include "gx/glsdl/GLSDLWindow.hpp" +#include "event/Types.hpp" +#include "event/Input.hpp" #include +#include static bool s_GLSDL_Initialized = false; +static const std::map 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(event.motion.x); + auto y = static_cast(event.motion.y); + + OsQueuePut(OS_INPUT_MOUSE_MOVE, 0, x, y, 0); +} diff --git a/src/gx/glsdl/GLSDLWindow.hpp b/src/gx/glsdl/GLSDLWindow.hpp index 40d84bb..a238c07 100644 --- a/src/gx/glsdl/GLSDLWindow.hpp +++ b/src/gx/glsdl/GLSDLWindow.hpp @@ -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();