diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-01-23 23:58:43 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-01-23 23:58:43 +0100 |
| commit | 2cd8461c738e857f054f4c65c0a1baf8bb9ba5b3 (patch) | |
| tree | a03ed914aacedd7cecb510b9da8cb088f565e80c | |
| parent | 953f8ffb5b1cbb732b4dac57ac9e2ec0cdebfcdf (diff) | |
Handle keyboard and mouse inputs on windows
| -rw-r--r-- | include/window.hpp | 82 | ||||
| -rw-r--r-- | src/main.cpp | 42 | ||||
| -rw-r--r-- | src/window.cpp | 95 |
3 files changed, 171 insertions, 48 deletions
diff --git a/include/window.hpp b/include/window.hpp index 7667bbc..66bd0eb 100644 --- a/include/window.hpp +++ b/include/window.hpp @@ -16,30 +16,64 @@ class vkrenderer; #include <Windows.h> #endif -enum MODIFIERS { - SHIFT = 1, - LOCK = 2, - CTRL = 4, - ALT = 8, - MOD2 = 16, - MOD3 = 32, - MOD4 = 64, - MOD5 = 128, - BUTTON1 = 256, - BUTTON2 = 512, - BUTTON3 = 1024, - BUTTON4 = 2048, - BUTTON5 = 4096, -}; +// enum MODIFIERS: uint32_t { +// SHIFT = 1, +// LOCK = 2, +// CTRL = 4, +// ALT = 8, +// MOD2 = 16, +// MOD3 = 32, +// MOD4 = 64, +// MOD5 = 128, +// BUTTON1 = 256, +// BUTTON2 = 512, +// BUTTON3 = 1024, +// BUTTON4 = 2048, +// BUTTON5 = 4096, +// }; -enum KEYS { - SPACE, - Z, +#if defined(WINDOWS) +enum KEYS: uint32_t { + SHIFT = 0x10, + CTRL, + ALT, + A = 0x41, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, Q, + R, S, - D, + T, + U, + V, + W, + X, + Y, + Z, + MAX_KEYS = 255 }; +enum BUTTONS: uint32_t { + LEFT, + RIGHT, + MIDDLE, + MAX_BUTTONS = 255 +}; +#endif + enum EVENT_TYPES: int32_t { QUIT, RESIZE, @@ -53,9 +87,10 @@ enum EVENT_TYPES: int32_t { struct event { uint32_t width; uint32_t height; - // KEYS key; - uint32_t modifiers; - uint32_t keycode; + KEYS key; + BUTTONS button; + // uint32_t modifiers; + // uint32_t keycode; int32_t x; int32_t y; EVENT_TYPES type; @@ -92,6 +127,9 @@ class window { uint32_t height; bool isOpen; + + bool keyboard[KEYS::MAX_KEYS] = { false }; + bool mouse[BUTTONS::MAX_BUTTONS] = { false }; }; #endif // !__WINDOW_HPP_ diff --git a/src/main.cpp b/src/main.cpp index d7e6462..9d4a0bf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,32 +72,34 @@ int main() { break; } case EVENT_TYPES::KEY_PRESS: { - auto move_speed = 0.1; - if (event.modifiers & MODIFIERS::SHIFT) { - move_speed *= 10; + auto move_speed = 0.1f; + if (wnd.keyboard[KEYS::SHIFT]) { + move_speed *= 10.f; } - switch((uint8_t)event.keycode) { - case('w'): { - renderer.mapped_data->cam.move(renderer.mapped_data->cam.forward * move_speed); - break; - } - case('s'): { - renderer.mapped_data->cam.move(-renderer.mapped_data->cam.forward * move_speed); - break; - } - case('d'): { - renderer.mapped_data->cam.move(renderer.mapped_data->cam.right * move_speed); - break; - } - case('a'): { - renderer.mapped_data->cam.move(-renderer.mapped_data->cam.right * move_speed); - break; - } + vec3 move_vec {}; + if (wnd.keyboard[KEYS::W]) { + move_vec += renderer.mapped_data->cam.forward; } + if (wnd.keyboard[KEYS::S]) { + move_vec += -renderer.mapped_data->cam.forward; + } + if (wnd.keyboard[KEYS::D]) { + move_vec += renderer.mapped_data->cam.right; + } + if (wnd.keyboard[KEYS::A]) { + move_vec += -renderer.mapped_data->cam.right; + } + + move_vec = move_vec.unit() * move_speed; + + renderer.mapped_data->cam.move(move_vec); + + break; } case EVENT_TYPES::MOVE: { std::cerr << "X : " << event.x << " Y : " << event.y << std::endl; + break; } default: { } diff --git a/src/window.cpp b/src/window.cpp index 43fff2a..273d7e9 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -123,11 +123,10 @@ void window::poll_events() { auto keysym = xkb_state_key_get_one_sym(keyboard_state, key_press_event->detail); struct event new_event = { .type = event->response_type == XCB_KEY_PRESS ? EVENT_TYPES::KEY_PRESS :EVENT_TYPES::KEY_RELEASE + .modifiers = key_press_event->state; + .keycode = keysym; }; - new_event.modifiers = key_press_event->state; - new_event.keycode = keysym; - events.push_back(new_event); break; } @@ -166,6 +165,10 @@ void window::poll_events() { } #elif defined(WINDOWS) + +#include <windowsx.h> +#include <cctype> + LRESULT CALLBACK window::window_procedure(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) { window* win = nullptr; @@ -219,6 +222,8 @@ window::window(uint32_t width, uint32_t height) isOpen = true; } +window::~window() {} + void window::poll_events() { MSG msg = {}; @@ -235,7 +240,7 @@ LRESULT window::message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lpar case WM_QUIT: { events.push_back({ .type = EVENT_TYPES::QUIT }); isOpen = false; - return 0; + break; } case WM_SIZE: { width = LOWORD(lparam); @@ -246,9 +251,87 @@ LRESULT window::message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lpar .height = height, .type = EVENT_TYPES::RESIZE }); - return 0; + break; + } + + case WM_KEYDOWN: { + auto key_press_event = event { + .key = (KEYS)wparam, + .type = EVENT_TYPES::KEY_PRESS, + }; + + keyboard[wparam] = true; + + events.push_back(key_press_event); + break; + } + + case WM_KEYUP: { + auto key_press_event = event { + .key = (KEYS)wparam, + .type = EVENT_TYPES::KEY_RELEASE, + }; + + keyboard[wparam] = false; + + events.push_back(key_press_event); + break; + } + + case WM_LBUTTONDOWN: { + events.push_back({ + .button = BUTTONS::LEFT, + .type = EVENT_TYPES::BUTTON_PRESS, + }); + break; + } + case WM_LBUTTONUP: { + events.push_back({ + .button = BUTTONS::LEFT, + .type = EVENT_TYPES::BUTTON_RELEASE, + }); + break; + } + case WM_RBUTTONDOWN: { + events.push_back({ + .button = BUTTONS::RIGHT, + .type = EVENT_TYPES::BUTTON_PRESS, + }); + break; + } + case WM_RBUTTONUP: { + events.push_back({ + .button = BUTTONS::RIGHT, + .type = EVENT_TYPES::BUTTON_RELEASE, + }); + break; + } + case WM_MBUTTONDOWN: { + events.push_back({ + .button = BUTTONS::MIDDLE, + .type = EVENT_TYPES::BUTTON_PRESS, + }); + break; + } + case WM_MBUTTONUP: { + events.push_back({ + .button = BUTTONS::MIDDLE, + .type = EVENT_TYPES::BUTTON_RELEASE, + }); + break; + } + case WM_MOUSEMOVE: { + events.push_back({ + .x = GET_X_LPARAM(lparam), + .y = GET_Y_LPARAM(lparam), + .type = EVENT_TYPES::MOVE, + }); + break; + } + default: { + return DefWindowProc(hwnd, umsg, wparam, lparam); } } - return DefWindowProc(hwnd, umsg, wparam, lparam); + return 0; } #endif |
