From b3d54ff1603da38c900b3b01c9b3f2522ad07127 Mon Sep 17 00:00:00 2001 From: oxmox Date: Thu, 23 Feb 2023 21:57:17 +0100 Subject: [PATCH] add doomlib which includes doomdef.h to fill out dp_doom_event_t structures Those dp_doom_event_t structs are doom even_t structs... --- src/CMakeLists.txt | 2 +- src/doomlib.cc | 140 +++++++++++++++++++++++++++++++++++++++++++++ src/doomlib.hpp | 10 ++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/doomlib.cc create mode 100644 src/doomlib.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8349f4..6739d89 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,7 +27,7 @@ target_link_libraries(dp_common ) target_include_directories(dp_common INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) -add_executable(doompanning doompanning.cc) +add_executable(doompanning doompanning.cc doomlib.cc) target_compile_features(doompanning PRIVATE cxx_std_17) target_link_libraries(doompanning PRIVATE dp_common diff --git a/src/doomlib.cc b/src/doomlib.cc new file mode 100644 index 0000000..7f9db24 --- /dev/null +++ b/src/doomlib.cc @@ -0,0 +1,140 @@ +#include "doomlib.hpp" +#include "dp_doom/linuxdoom-1.10/doomdef.h" + +// Taken from ib_video_sdl.c +static int xlatekey(SDL_Keycode keysym) +{ + int rc; + + switch(rc = keysym) + { + case SDLK_LEFT: rc = KEY_LEFTARROW; break; + case SDLK_RIGHT: rc = KEY_RIGHTARROW; break; + case SDLK_DOWN: rc = KEY_DOWNARROW; break; + case SDLK_UP: rc = KEY_UPARROW; break; + case SDLK_ESCAPE: rc = KEY_ESCAPE; break; + case SDLK_RETURN: rc = KEY_ENTER; break; + case SDLK_TAB: rc = KEY_TAB; break; + case SDLK_F1: rc = KEY_F1; break; + case SDLK_F2: rc = KEY_F2; break; + case SDLK_F3: rc = KEY_F3; break; + case SDLK_F4: rc = KEY_F4; break; + case SDLK_F5: rc = KEY_F5; break; + case SDLK_F6: rc = KEY_F6; break; + case SDLK_F7: rc = KEY_F7; break; + case SDLK_F8: rc = KEY_F8; break; + case SDLK_F9: rc = KEY_F9; break; + case SDLK_F10: rc = KEY_F10; break; + case SDLK_F11: rc = KEY_F11; break; + case SDLK_F12: rc = KEY_F12; break; + + case SDLK_BACKSPACE: + case SDLK_DELETE: rc = KEY_BACKSPACE; break; + + case SDLK_PAUSE: rc = KEY_PAUSE; break; + + case SDLK_KP_EQUALS: + case SDLK_EQUALS: rc = KEY_EQUALS; break; + + case SDLK_KP_MINUS: + case SDLK_MINUS: rc = KEY_MINUS; break; + + case SDLK_LSHIFT: + case SDLK_RSHIFT: + rc = KEY_RSHIFT; + break; + + case SDLK_LCTRL: + case SDLK_RCTRL: + rc = KEY_RCTRL; + break; + + case SDLK_LALT: + case SDLK_RALT: +#if SDL_MAJOR_VERSION >= 2 + case SDLK_LGUI: + case SDLK_RGUI: +#else + case SDLK_LMETA: + case SDLK_RMETA: +#endif + rc = KEY_RALT; + break; + + default: + if (rc >= SDLK_SPACE && rc <= SDLK_BACKQUOTE) + rc = rc - SDLK_SPACE + ' '; + else if (rc >= 'A' && rc <= 'Z') + rc = rc - 'A' + 'a'; + break; + } + + return rc; +} + +// Similar to IB_StartTic from ib_video_sdl.c +std::optional doomevent_from_sdlevent(const SDL_Event &sdl_event) +{ + dp_doom_event_t event; + static int button_state; + + switch (sdl_event.type) + { + case SDL_KEYDOWN: + event.type = DP_ev_keydown; + event.data1 = xlatekey(sdl_event.key.keysym.sym); + return event; + + case SDL_KEYUP: + event.type = DP_ev_keyup; + event.data1 = xlatekey(sdl_event.key.keysym.sym); + return event; + + case SDL_MOUSEBUTTONDOWN: + switch (sdl_event.button.button) + { + case SDL_BUTTON_LEFT: + button_state |= 1; + break; + case SDL_BUTTON_MIDDLE: + button_state |= 2; + break; + case SDL_BUTTON_RIGHT: + button_state |= 4; + break; + } + event.type = DP_ev_mouse; + event.data1 = button_state; + event.data2 = event.data3 = 0; + return event; + + case SDL_MOUSEBUTTONUP: + switch (sdl_event.button.button) + { + case SDL_BUTTON_LEFT: + button_state &= ~1; + break; + case SDL_BUTTON_MIDDLE: + button_state &= ~2; + break; + case SDL_BUTTON_RIGHT: + button_state &= ~4; + break; + } + event.type = DP_ev_mouse; + event.data1 = button_state; + event.data2 = event.data3 = 0; + return event; + + case SDL_MOUSEMOTION: + event.type = DP_ev_mouse; + event.data1 = button_state; + event.data2 = sdl_event.motion.xrel * (1 << 5); + event.data3 = -sdl_event.motion.yrel * (1 << 5); + + if (event.data2 || event.data3) + return event; + } + + return {}; +} diff --git a/src/doomlib.hpp b/src/doomlib.hpp new file mode 100644 index 0000000..53a81c2 --- /dev/null +++ b/src/doomlib.hpp @@ -0,0 +1,10 @@ +#ifndef SRC_DOOMLIB_HPP +#define SRC_DOOMLIB_HPP + +#include +#include +#include "dp_common.h" + +std::optional doomevent_from_sdlevent(const SDL_Event &sdl_event); + +#endif // SRC_DOOMLIB_HPP