In particular, get rid of the enum magic; we can use map<string,int> if we really need some named enums. Which we usually don’t.legacy
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine — BtPhys tutorial | // Lol Engine — BtPhys tutorial | ||||
| // | // | ||||
| // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -77,26 +77,10 @@ void BtPhysTest::InitApp() | |||||
| m_loc_dp = .0f; | m_loc_dp = .0f; | ||||
| #endif //CAT_MODE | #endif //CAT_MODE | ||||
| #if 1 //HAS_INPUT | |||||
| InputProfile& ip = m_profile; | |||||
| ip.AddBindings<BtPhysTestKeyInput, BtPhysTestKeyInput::KEY_START, BtPhysTestKeyInput::KEY_MAX>(InputProfileType::Keyboard); | |||||
| m_profile.register_default_keys(); | |||||
| m_controller = new Controller("Default"); | m_controller = new Controller("Default"); | ||||
| m_controller->Init(m_profile); | m_controller->Init(m_profile); | ||||
| Ticker::Ref(m_controller); | Ticker::Ref(m_controller); | ||||
| #else | |||||
| /* Register an input controller for the keyboard */ | |||||
| m_controller = new Controller("Default"); | |||||
| m_controller->SetInputCount(KEY_MAX, 0); | |||||
| m_controller->GetKey(KEY_MOVE_FORWARD).Bind("Keyboard", "Up"); | |||||
| m_controller->GetKey(KEY_MOVE_BACK).Bind("Keyboard", "Down"); | |||||
| m_controller->GetKey(KEY_MOVE_LEFT).Bind("Keyboard", "Left"); | |||||
| m_controller->GetKey(KEY_MOVE_RIGHT).Bind("Keyboard", "Right"); | |||||
| m_controller->GetKey(KEY_MOVE_JUMP).Bind("Keyboard", "Space"); | |||||
| m_controller->GetKey(KEY_MOVE_UP).Bind("Keyboard", "PageUp"); | |||||
| m_controller->GetKey(KEY_MOVE_DOWN).Bind("Keyboard", "PageDown"); | |||||
| m_controller->GetKey(KEY_QUIT).Bind("Keyboard", "Escape"); | |||||
| #endif | |||||
| /* Create a camera that matches the settings of XNA BtPhysTest */ | /* Create a camera that matches the settings of XNA BtPhysTest */ | ||||
| m_camera = new Camera(); | m_camera = new Camera(); | ||||
| @@ -417,7 +401,7 @@ void BtPhysTest::tick_game(float seconds) | |||||
| auto context = Debug::DrawContext::New(Color::white, 1.f); | auto context = Debug::DrawContext::New(Color::white, 1.f); | ||||
| Debug::DrawGrid(vec3::zero, vec3::axis_x, vec3::axis_y, vec3::axis_z, 10.f); | Debug::DrawGrid(vec3::zero, vec3::axis_x, vec3::axis_y, vec3::axis_z, 10.f); | ||||
| if (m_controller->WasKeyReleasedThisFrame(BtPhysTestKeyInput::KEY_QUIT)) | |||||
| if (m_controller->WasKeyReleasedThisFrame((int)input::key::SC_Escape)) | |||||
| Ticker::Shutdown(); | Ticker::Shutdown(); | ||||
| m_loop_value += seconds; | m_loop_value += seconds; | ||||
| @@ -601,15 +585,15 @@ void BtPhysTest::tick_game(float seconds) | |||||
| mat4 CtlrMx = Character->GetTransform(); | mat4 CtlrMx = Character->GetTransform(); | ||||
| vec3 movement(0.f); | vec3 movement(0.f); | ||||
| movement.z = (m_controller->IsKeyPressed(KEY_MOVE_RIGHT) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(KEY_MOVE_LEFT) ? 1.f : 0.f); | |||||
| movement.x = (m_controller->IsKeyPressed(KEY_MOVE_FORWARD) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(KEY_MOVE_BACK) ? 1.f : 0.f); | |||||
| movement.y = (m_controller->IsKeyPressed(KEY_MOVE_UP) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(KEY_MOVE_DOWN) ? 1.f : 0.f); | |||||
| movement.z = (m_controller->IsKeyPressed(input::key::SC_Right) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(input::key::SC_Left) ? 1.f : 0.f); | |||||
| movement.x = (m_controller->IsKeyPressed(input::key::SC_Up) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(input::key::SC_Down) ? 1.f : 0.f); | |||||
| movement.y = (m_controller->IsKeyPressed(input::key::SC_PageUp) ? 1.f : 0.f) | |||||
| - (m_controller->IsKeyPressed(input::key::SC_PageDown) ? 1.f : 0.f); | |||||
| vec3 CharMove = movement * seconds * vec3(4.f, 10.f, 4.f); | vec3 CharMove = movement * seconds * vec3(4.f, 10.f, 4.f); | ||||
| if (m_controller->WasKeyReleasedThisFrame(KEY_MOVE_JUMP)) | |||||
| if (m_controller->WasKeyReleasedThisFrame(input::key::SC_Space)) | |||||
| Character->Jump(); | Character->Jump(); | ||||
| Character->SetMovementForFrame(CharMove); | Character->SetMovementForFrame(CharMove); | ||||
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine — Bullet physics test | // Lol Engine — Bullet physics test | ||||
| // | // | ||||
| // Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -74,14 +74,14 @@ private: | |||||
| protected: | protected: | ||||
| virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map) | virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map) | ||||
| { | { | ||||
| enum_map[KEY_MOVE_FORWARD] = g_name_key_Up; | |||||
| enum_map[KEY_MOVE_BACK] = g_name_key_Down; | |||||
| enum_map[KEY_MOVE_LEFT] = g_name_key_Left; | |||||
| enum_map[KEY_MOVE_RIGHT] = g_name_key_Right; | |||||
| enum_map[KEY_MOVE_UP] = g_name_key_PageUp; | |||||
| enum_map[KEY_MOVE_DOWN] = g_name_key_PageDown; | |||||
| enum_map[KEY_MOVE_JUMP] = g_name_key_Space; | |||||
| enum_map[KEY_QUIT] = g_name_key_Escape; | |||||
| enum_map[KEY_MOVE_FORWARD] = input::key_to_name(input::key::SC_Up); | |||||
| enum_map[KEY_MOVE_BACK] = input::key_to_name(input::key::SC_Down); | |||||
| enum_map[KEY_MOVE_LEFT] = input::key_to_name(input::key::SC_Left); | |||||
| enum_map[KEY_MOVE_RIGHT] = input::key_to_name(input::key::SC_Right); | |||||
| enum_map[KEY_MOVE_UP] = input::key_to_name(input::key::SC_PageUp); | |||||
| enum_map[KEY_MOVE_DOWN] = input::key_to_name(input::key::SC_PageDown); | |||||
| enum_map[KEY_MOVE_JUMP] = input::key_to_name(input::key::SC_Space); | |||||
| enum_map[KEY_QUIT] = input::key_to_name(input::key::SC_Escape); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -99,7 +99,7 @@ liblol_core_sources = \ | |||||
| \ | \ | ||||
| audio/audio.cpp audio/sample.cpp \ | audio/audio.cpp audio/sample.cpp \ | ||||
| \ | \ | ||||
| input/input.cpp input/input.h input/input_internal.h input/keys.h \ | |||||
| input/input.cpp input/input.h input/input_internal.h input/keys.inc \ | |||||
| input/controller.cpp input/controller.h \ | input/controller.cpp input/controller.h \ | ||||
| \ | \ | ||||
| gpu/default-material.lolfx \ | gpu/default-material.lolfx \ | ||||
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Benjamin Litzelmann | |||||
| // © 2017—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2017—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2010—2015 Benjamin Litzelmann | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -318,40 +318,10 @@ public: | |||||
| return *this; | return *this; | ||||
| } | } | ||||
| //BindingType ------------------------------------------------------------- | |||||
| struct InputTypeBase : public StructSafeEnum | |||||
| void register_default_keys() | |||||
| { | { | ||||
| enum Type | |||||
| { | |||||
| Keyboard = 0, | |||||
| MouseKey, | |||||
| JoystickKey, | |||||
| MouseAxis, | |||||
| JoystickAxis, | |||||
| MAX, | |||||
| }; | |||||
| protected: | |||||
| virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map) { UNUSED(enum_map); return true; } | |||||
| }; | |||||
| typedef SafeEnum<InputTypeBase> InputType; | |||||
| //Template helper --------------------------------------------------------- | |||||
| template <typename T, int N_BEGIN, int N_END> | |||||
| void AddBindings(InputType const& type, uint64_t joy = 0) | |||||
| { | |||||
| for (int i = N_BEGIN; i < N_END; ++i) | |||||
| { | |||||
| switch (type.ToScalar()) | |||||
| { | |||||
| case InputType::Keyboard:/******/*this << InputProfile::Keyboard/******/(/***/i, T(i).tostring()); break; | |||||
| case InputType::MouseKey:/******/*this << InputProfile::MouseKey/******/(/***/i, T(i).tostring()); break; | |||||
| case InputType::JoystickKey:/***/*this << InputProfile::JoystickKey/***/(joy, i, T(i).tostring()); break; | |||||
| case InputType::MouseAxis:/*****/*this << InputProfile::MouseAxis/*****/(/***/i, T(i).tostring()); break; | |||||
| case InputType::JoystickAxis:/**/*this << InputProfile::JoystickAxis/**/(joy, i, T(i).tostring()); break; | |||||
| default: break; | |||||
| } | |||||
| } | |||||
| #define _SC(id, str, name) *this << InputProfile::Keyboard(id, #name); | |||||
| #include "input/keys.inc" | |||||
| } | } | ||||
| private: | private: | ||||
| @@ -362,7 +332,6 @@ private: | |||||
| array<JoystickKey> m_joystick_keys; | array<JoystickKey> m_joystick_keys; | ||||
| array<JoystickAxis> m_joystick_axis; | array<JoystickAxis> m_joystick_axis; | ||||
| }; | }; | ||||
| typedef InputProfile::InputType InputProfileType; | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| //TODO: Add mask|layer system to prevent several controllers from interfering with another. (input overlay in menus) | //TODO: Add mask|layer system to prevent several controllers from interfering with another. (input overlay in menus) | ||||
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Benjamin Litzelmann | |||||
| // © 2017—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2017—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2010—2015 Benjamin Litzelmann | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -14,12 +14,49 @@ | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| #include <string> | #include <string> | ||||
| #include <map> | |||||
| #include "input/input_internal.h" | #include "input/input_internal.h" | ||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| // Lookup tables for scancode and key name lookups | |||||
| static std::vector<input::key> g_all_keys | |||||
| { | |||||
| #define _SC(code, str, name) input::key::SC_##name, | |||||
| #include "input/keys.inc" | |||||
| }; | |||||
| static std::map<input::key, std::string> g_key_to_name | |||||
| { | |||||
| #define _SC(code, str, name) { input::key::SC_##name, #name }, | |||||
| #include "input/keys.inc" | |||||
| }; | |||||
| static std::map<std::string, input::key> g_name_to_key | |||||
| { | |||||
| #define _SC(code, str, name) { #name, input::key::SC_##name }, | |||||
| #include "input/keys.inc" | |||||
| }; | |||||
| std::vector<input::key> const &input::all_keys() | |||||
| { | |||||
| return g_all_keys; | |||||
| } | |||||
| std::string const &input::key_to_name(input::key k) | |||||
| { | |||||
| auto it = g_key_to_name.find(k); | |||||
| return it == g_key_to_name.end() ? "Unknown" : it->second; | |||||
| } | |||||
| input::key input::name_to_key(std::string const &name) | |||||
| { | |||||
| auto it = g_name_to_key.find(name); | |||||
| return it == g_name_to_key.end() ? key::SC_Unknown : it->second; | |||||
| } | |||||
| array<InputDevice*> InputDevice::devices; | array<InputDevice*> InputDevice::devices; | ||||
| int InputDevice::joystick_count = 0; | int InputDevice::joystick_count = 0; | ||||
| bool InputDevice::m_capturemouse; | bool InputDevice::m_capturemouse; | ||||
| @@ -99,7 +136,7 @@ InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() | |||||
| /* Register all scancodes known to SDL (from the USB standard) */ | /* Register all scancodes known to SDL (from the USB standard) */ | ||||
| # define _SC(id, str, name) keyboard->AddKey(id, #name); | # define _SC(id, str, name) keyboard->AddKey(id, #name); | ||||
| # include "input/keys.h" | |||||
| # include "input/keys.inc" | |||||
| return keyboard; | return keyboard; | ||||
| } | } | ||||
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Benjamin Litzelmann | |||||
| // © 2017—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2017—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2010—2015 Benjamin Litzelmann | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -14,10 +14,25 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <string> | #include <string> | ||||
| #include <vector> | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| class input | |||||
| { | |||||
| public: | |||||
| enum class key : uint16_t | |||||
| { | |||||
| #define _SC(id, str, name) SC_##name = id, | |||||
| #include "input/keys.inc" | |||||
| }; | |||||
| static std::vector<key> const &all_keys(); | |||||
| static std::string const &key_to_name(key k); | |||||
| static key name_to_key(std::string const &name); | |||||
| }; | |||||
| const std::string g_name_max("MAX"); | const std::string g_name_max("MAX"); | ||||
| const std::string g_name_mouse("Mouse"); | const std::string g_name_mouse("Mouse"); | ||||
| const std::string g_name_keyboard("Keyboard"); | const std::string g_name_keyboard("Keyboard"); | ||||
| @@ -28,10 +43,7 @@ static std::string g_name_joystick(const uint64_t num) | |||||
| return format("Joystick%d", (int)num); | return format("Joystick%d", (int)num); | ||||
| } | } | ||||
| # define _SC(id, str, name) const std::string g_name_key_##name(#name); | |||||
| # include "input/keys.h" | |||||
| //Mouse default buttons/axis | |||||
| // Mouse default buttons/axis | |||||
| const std::string g_name_mouse_key_left("Left"); | const std::string g_name_mouse_key_left("Left"); | ||||
| const std::string g_name_mouse_key_middle("Middle"); | const std::string g_name_mouse_key_middle("Middle"); | ||||
| const std::string g_name_mouse_key_right("Right"); | const std::string g_name_mouse_key_right("Right"); | ||||
| @@ -43,7 +55,7 @@ const std::string g_name_mouse_axis_ypixel("YPixel"); | |||||
| const std::string g_name_mouse_axis_scroll("Scroll"); | const std::string g_name_mouse_axis_scroll("Scroll"); | ||||
| const std::string g_name_mouse_cursor("Cursor"); | const std::string g_name_mouse_cursor("Cursor"); | ||||
| //Xbox default buttons/axis | |||||
| // Xbox default buttons/axis | |||||
| const std::string g_name_xbox_key_dpad_up("DPadUp"); | const std::string g_name_xbox_key_dpad_up("DPadUp"); | ||||
| const std::string g_name_xbox_key_dpad_down("DPadDown"); | const std::string g_name_xbox_key_dpad_down("DPadDown"); | ||||
| const std::string g_name_xbox_key_dpad_left("DPadLeft"); | const std::string g_name_xbox_key_dpad_left("DPadLeft"); | ||||
| @@ -1,8 +1,8 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2013 Benjamin Litzelmann | |||||
| // © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2010—2013 Benjamin Litzelmann | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -15,7 +15,7 @@ | |||||
| * name and, if possible, a string representation. */ | * name and, if possible, a string representation. */ | ||||
| #if !defined _SC | #if !defined _SC | ||||
| # error scancode.h included without the _SC macro | |||||
| # error keys.inc included without the _SC macro | |||||
| #endif | #endif | ||||
| _SC(0, "", Unknown) | _SC(0, "", Unknown) | ||||
| @@ -285,7 +285,7 @@ _SC(282, "", Sleep) | |||||
| _SC(283, "", App1) | _SC(283, "", App1) | ||||
| _SC(284, "", App2) | _SC(284, "", App2) | ||||
| //Custom Lock management | |||||
| /* Custom Lock management */ | |||||
| _SC(285, "", CapsLockStatus) | _SC(285, "", CapsLockStatus) | ||||
| _SC(286, "", ScrollLockStatus) | _SC(286, "", ScrollLockStatus) | ||||
| _SC(287, "", NumLockClearStatus) | _SC(287, "", NumLockClearStatus) | ||||
| @@ -39,9 +39,6 @@ | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| #define _SC(id, str, name) static const uint16_t SDLOL_##name = id; | |||||
| #include "input/keys.h" | |||||
| //------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
| /* DEBUG STUFF | /* DEBUG STUFF | ||||
| static String ScanCodeToText(int sc) | static String ScanCodeToText(int sc) | ||||
| @@ -50,7 +47,7 @@ static String ScanCodeToText(int sc) | |||||
| { | { | ||||
| #define _SC(id, str, name) \ | #define _SC(id, str, name) \ | ||||
| case id: return String(str); | case id: return String(str); | ||||
| #include "input/keys.h" | |||||
| #include "input/keys.inc" | |||||
| default: | default: | ||||
| msg::error("ScanCodeToText unknown scancode %0d\n", sc); | msg::error("ScanCodeToText unknown scancode %0d\n", sc); | ||||
| } | } | ||||
| @@ -65,7 +62,7 @@ static String ScanCodeToName(int sc) | |||||
| { | { | ||||
| #define _SC(id, str, name) \ | #define _SC(id, str, name) \ | ||||
| case id: return String(#name); | case id: return String(#name); | ||||
| #include "input/keys.h" | |||||
| #include "input/keys.inc" | |||||
| default: | default: | ||||
| msg::error("ScanCodeToText unknown scancode %0d\n", sc); | msg::error("ScanCodeToText unknown scancode %0d\n", sc); | ||||
| } | } | ||||
| @@ -95,9 +92,8 @@ SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||||
| m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | ||||
| m_mouse = InputDeviceInternal::CreateStandardMouse(); | m_mouse = InputDeviceInternal::CreateStandardMouse(); | ||||
| #if LOL_USE_SDL | |||||
| // XXX: another option is to properly handle gamepad support | |||||
| # if !__EMSCRIPTEN__ | |||||
| // XXX: another option for emscripten is to properly support gamepads | |||||
| #if LOL_USE_SDL && !__EMSCRIPTEN__ | |||||
| SDL_JoystickEventState(SDL_FORCE_POLL_JOYSTICK ? SDL_QUERY : SDL_ENABLE); | SDL_JoystickEventState(SDL_FORCE_POLL_JOYSTICK ? SDL_QUERY : SDL_ENABLE); | ||||
| /* Register all the joysticks we can find, and let the input | /* Register all the joysticks we can find, and let the input | ||||
| @@ -130,7 +126,6 @@ SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||||
| m_joysticks.push(sdlstick, stick); | m_joysticks.push(sdlstick, stick); | ||||
| } | } | ||||
| # endif // __EMSCRIPTEN__ | |||||
| #endif | #endif | ||||
| m_gamegroup = GAMEGROUP_INPUT; | m_gamegroup = GAMEGROUP_INPUT; | ||||
| @@ -204,35 +199,33 @@ void SdlInput::tick(float seconds) | |||||
| case SDL_KEYUP: | case SDL_KEYUP: | ||||
| switch (int sc = event.key.keysym.scancode) | switch (int sc = event.key.keysym.scancode) | ||||
| { | { | ||||
| //Lock management | |||||
| case SDLOL_CapsLock: | |||||
| case SDLOL_ScrollLock: | |||||
| case SDLOL_NumLockClear: | |||||
| # if defined SDLOL_CapsLock && defined SDLOL_ScrollLock && defined SDLOL_NumLockClear | |||||
| //Update status on key down only | |||||
| // Lock management | |||||
| case (int)input::key::SC_CapsLock: | |||||
| case (int)input::key::SC_ScrollLock: | |||||
| case (int)input::key::SC_NumLockClear: | |||||
| // Update status on key down only | |||||
| if (event.type == SDL_KEYDOWN) | if (event.type == SDL_KEYDOWN) | ||||
| { | { | ||||
| int sc2 = sc; | int sc2 = sc; | ||||
| switch (sc) | switch (sc) | ||||
| { | { | ||||
| case SDLOL_CapsLock: | |||||
| sc2 = SDLOL_CapsLockStatus; | |||||
| case (int)input::key::SC_CapsLock: | |||||
| sc2 = (int)input::key::SC_CapsLockStatus; | |||||
| break; | break; | ||||
| case SDLOL_ScrollLock: | |||||
| sc2 = SDLOL_ScrollLockStatus; | |||||
| case (int)input::key::SC_ScrollLock: | |||||
| sc2 = (int)input::key::SC_ScrollLockStatus; | |||||
| break; | break; | ||||
| case SDLOL_NumLockClear: | |||||
| sc2 = SDLOL_NumLockClearStatus; | |||||
| case (int)input::key::SC_NumLockClear: | |||||
| sc2 = (int)input::key::SC_NumLockClearStatus; | |||||
| break; | break; | ||||
| } | } | ||||
| m_keyboard->internal_set_key(sc2, !m_keyboard->GetKey(sc2)); | |||||
| m_keyboard->internal_set_key(sc2, !m_keyboard->key((int)sc2)); | |||||
| /* DEBUG STUFF | /* DEBUG STUFF | ||||
| msg::debug("Repeat: 0x%02x : %s/%s/%s/%i\n", | msg::debug("Repeat: 0x%02x : %s/%s/%s/%i\n", | ||||
| (int)m_keyboard, ScanCodeToText(sc2).C(), ScanCodeToName(sc2).C(), | (int)m_keyboard, ScanCodeToText(sc2).C(), ScanCodeToName(sc2).C(), | ||||
| m_keyboard->GetKey(sc2) ? "up" : "down", event.key.repeat); | m_keyboard->GetKey(sc2) ? "up" : "down", event.key.repeat); | ||||
| */ | */ | ||||
| } | } | ||||
| # endif | |||||
| default: | default: | ||||
| // Set key updates the corresponding key | // Set key updates the corresponding key | ||||
| m_keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | m_keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | ||||
| @@ -208,7 +208,7 @@ | |||||
| <ClInclude Include="input\controller.h" /> | <ClInclude Include="input\controller.h" /> | ||||
| <ClInclude Include="input\input.h" /> | <ClInclude Include="input\input.h" /> | ||||
| <ClInclude Include="input\input_internal.h" /> | <ClInclude Include="input\input_internal.h" /> | ||||
| <ClInclude Include="input\keys.h" /> | |||||
| <ClInclude Include="input\keys.inc" /> | |||||
| <ClInclude Include="input\sdl-input.h"> | <ClInclude Include="input\sdl-input.h"> | ||||
| <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -666,7 +666,7 @@ | |||||
| <ClInclude Include="lol\image\movie.h"> | <ClInclude Include="lol\image\movie.h"> | ||||
| <Filter>lol\image</Filter> | <Filter>lol\image</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="input\keys.h"> | |||||
| <ClInclude Include="input\keys.inc"> | |||||
| <Filter>input</Filter> | <Filter>input</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="input\controller.h"> | <ClInclude Include="input\controller.h"> | ||||
| @@ -22,6 +22,22 @@ | |||||
| using namespace lol; | using namespace lol; | ||||
| namespace | |||||
| { | |||||
| enum key_enum | |||||
| { | |||||
| LeftClick = 300, | |||||
| RightClick, | |||||
| MiddleClick, | |||||
| Focus, | |||||
| }; | |||||
| enum axis_enum | |||||
| { | |||||
| Scroll, | |||||
| }; | |||||
| } | |||||
| static gui* g_gui = nullptr; | static gui* g_gui = nullptr; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -74,27 +90,19 @@ gui::gui(ImFontAtlas *shared_font_atlas) | |||||
| << ShaderProgram::Pixel << imgui_pixel; | << ShaderProgram::Pixel << imgui_pixel; | ||||
| // Input Setup ------------------------------------------------------------- | // Input Setup ------------------------------------------------------------- | ||||
| InputProfile& ip = m_profile; | |||||
| ip.AddBindings<key_enum, key_enum::KEY_START, key_enum::KEY_END>(InputProfileType::Keyboard); | |||||
| //for (int i = key_enum::KEY_START; i < key_enum::KEY_END; ++i) | |||||
| // m_profile << InputProfile::Keyboard(i, key_enum(i).tostring()); | |||||
| for (int i = key_enum::MOUSE_KEY_START; i < key_enum::MOUSE_KEY_END; ++i) | |||||
| m_profile << InputProfile::MouseKey(i, key_enum(i).tostring()); | |||||
| m_profile.register_default_keys(); | |||||
| m_profile << InputProfile::MouseKey(key_enum::LeftClick, g_name_mouse_key_left); | |||||
| m_profile << InputProfile::MouseKey(key_enum::RightClick, g_name_mouse_key_right); | |||||
| m_profile << InputProfile::MouseKey(key_enum::MiddleClick, g_name_mouse_key_middle); | |||||
| m_profile << InputProfile::MouseKey(key_enum::Focus, g_name_mouse_key_in_screen); | |||||
| for (int i = axis_enum::MOUSE_AXIS_START; i < axis_enum::MOUSE_AXIS_END; ++i) | |||||
| m_profile << InputProfile::MouseAxis(i, axis_enum(i).tostring()); | |||||
| m_profile << InputProfile::MouseAxis(axis_enum::Scroll, g_name_mouse_axis_scroll); | |||||
| Ticker::Ref(m_controller = new Controller("ImGui_Controller")); | Ticker::Ref(m_controller = new Controller("ImGui_Controller")); | ||||
| m_controller->Init(m_profile); | m_controller->Init(m_profile); | ||||
| m_mouse = InputDevice::GetMouse(); | m_mouse = InputDevice::GetMouse(); | ||||
| m_keyboard = InputDevice::GetKeyboard(); | m_keyboard = InputDevice::GetKeyboard(); | ||||
| //m_controller->Get | |||||
| //# define KB InputProfile::Keyboard | |||||
| // m_profile | |||||
| // << InputProfile::Keyboard(idx, g_name_key_Left); | |||||
| //# undef KB | |||||
| } | } | ||||
| gui::~gui() | gui::~gui() | ||||
| @@ -114,24 +122,25 @@ void gui::init(ImFontAtlas *shared_font_atlas) | |||||
| ImGuiIO& io = ImGui::GetIO(); | ImGuiIO& io = ImGui::GetIO(); | ||||
| //ImFont* font0 = io.Fonts->AddFontDefault(); | //ImFont* font0 = io.Fonts->AddFontDefault(); | ||||
| // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array. | |||||
| io.KeyMap[ImGuiKey_Tab] = key_enum::Tab; | |||||
| io.KeyMap[ImGuiKey_LeftArrow] = key_enum::LeftArrow; | |||||
| io.KeyMap[ImGuiKey_RightArrow] = key_enum::RightArrow; | |||||
| io.KeyMap[ImGuiKey_UpArrow] = key_enum::UpArrow; | |||||
| io.KeyMap[ImGuiKey_DownArrow] = key_enum::DownArrow; | |||||
| io.KeyMap[ImGuiKey_Home] = key_enum::Home; | |||||
| io.KeyMap[ImGuiKey_End] = key_enum::End; | |||||
| io.KeyMap[ImGuiKey_Delete] = key_enum::Delete; | |||||
| io.KeyMap[ImGuiKey_Backspace] = key_enum::Backspace; | |||||
| io.KeyMap[ImGuiKey_Enter] = key_enum::Enter; | |||||
| io.KeyMap[ImGuiKey_Escape] = key_enum::Escape; | |||||
| io.KeyMap[ImGuiKey_A] = key_enum::A; | |||||
| io.KeyMap[ImGuiKey_C] = key_enum::C; | |||||
| io.KeyMap[ImGuiKey_V] = key_enum::V; | |||||
| io.KeyMap[ImGuiKey_X] = key_enum::X; | |||||
| io.KeyMap[ImGuiKey_Y] = key_enum::Y; | |||||
| io.KeyMap[ImGuiKey_Z] = key_enum::Z; | |||||
| // Keyboard mapping; these are the only ones ImGui cares about, the | |||||
| // rest is just handled by the application. | |||||
| io.KeyMap[ImGuiKey_Tab] = (int)input::key::SC_Tab; | |||||
| io.KeyMap[ImGuiKey_LeftArrow] = (int)input::key::SC_Left; | |||||
| io.KeyMap[ImGuiKey_RightArrow] = (int)input::key::SC_Right; | |||||
| io.KeyMap[ImGuiKey_UpArrow] = (int)input::key::SC_Up; | |||||
| io.KeyMap[ImGuiKey_DownArrow] = (int)input::key::SC_Down; | |||||
| io.KeyMap[ImGuiKey_Home] = (int)input::key::SC_Home; | |||||
| io.KeyMap[ImGuiKey_End] = (int)input::key::SC_End; | |||||
| io.KeyMap[ImGuiKey_Delete] = (int)input::key::SC_Delete; | |||||
| io.KeyMap[ImGuiKey_Backspace] = (int)input::key::SC_Backspace; | |||||
| io.KeyMap[ImGuiKey_Enter] = (int)input::key::SC_Return; | |||||
| io.KeyMap[ImGuiKey_Escape] = (int)input::key::SC_Escape; | |||||
| io.KeyMap[ImGuiKey_A] = (int)input::key::SC_A; | |||||
| io.KeyMap[ImGuiKey_C] = (int)input::key::SC_C; | |||||
| io.KeyMap[ImGuiKey_V] = (int)input::key::SC_V; | |||||
| io.KeyMap[ImGuiKey_X] = (int)input::key::SC_X; | |||||
| io.KeyMap[ImGuiKey_Y] = (int)input::key::SC_Y; | |||||
| io.KeyMap[ImGuiKey_Z] = (int)input::key::SC_Z; | |||||
| // Func pointer | // Func pointer | ||||
| io.RenderDrawListsFn = gui::static_render_draw_lists; | io.RenderDrawListsFn = gui::static_render_draw_lists; | ||||
| @@ -223,25 +232,13 @@ void gui::tick_game(float seconds) | |||||
| io.MouseDrawCursor = true; | io.MouseDrawCursor = true; | ||||
| // Update Keyboard | // Update Keyboard | ||||
| io.KeyCtrl = false; | |||||
| io.KeyShift = false; | |||||
| for (int i = key_enum::KEY_START; i < key_enum::KEY_END; ++i) | |||||
| { | |||||
| switch (i) | |||||
| { | |||||
| case key_enum::LShift: | |||||
| case key_enum::RShift: | |||||
| io.KeyShift = (io.KeyShift || m_controller->IsKeyPressed(i)); | |||||
| break; | |||||
| case key_enum::LCtrl: | |||||
| case key_enum::RCtrl: | |||||
| io.KeyCtrl = (io.KeyCtrl || m_controller->IsKeyPressed(i)); | |||||
| break; | |||||
| default: | |||||
| io.KeysDown[i] = m_controller->IsKeyPressed(i); | |||||
| break; | |||||
| } | |||||
| } | |||||
| io.KeyCtrl = m_controller->IsKeyPressed((int)input::key::SC_LCtrl) | |||||
| || m_controller->IsKeyPressed((int)input::key::SC_RCtrl); | |||||
| io.KeyShift = m_controller->IsKeyPressed((int)input::key::SC_LShift) | |||||
| || m_controller->IsKeyPressed((int)input::key::SC_RShift); | |||||
| for (input::key k : input::all_keys()) | |||||
| io.KeysDown[(int)k] = m_controller->IsKeyPressed((int)k); | |||||
| m_keyboard->SetTextInputActive(io.WantTextInput); | m_keyboard->SetTextInputActive(io.WantTextInput); | ||||
| @@ -261,26 +258,10 @@ void gui::tick_game(float seconds) | |||||
| //msg::debug("%.2f/%.2f\n", io.MousePos.x, io.MousePos.y); | //msg::debug("%.2f/%.2f\n", io.MousePos.x, io.MousePos.y); | ||||
| io.MouseWheel = m_controller->GetAxisValue(axis_enum::Scroll); | io.MouseWheel = m_controller->GetAxisValue(axis_enum::Scroll); | ||||
| for (int i = key_enum::MOUSE_KEY_START; i < key_enum::MOUSE_KEY_END; ++i) | |||||
| { | |||||
| switch (i) | |||||
| { | |||||
| default: | |||||
| io.MouseDown[i - key_enum::MOUSE_KEY_START] = m_controller->IsKeyPressed(i); | |||||
| break; | |||||
| case key_enum::Focus: | |||||
| if (m_controller->IsKeyReleased(i)) | |||||
| { | |||||
| //msg::debug("Not focused .....\n"); | |||||
| //io.MousePos = vec2(-1.f); | |||||
| } | |||||
| else | |||||
| { | |||||
| //msg::debug("Focused !!\n"); | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| io.MouseDown[0] = m_controller->IsKeyPressed(key_enum::LeftClick); | |||||
| io.MouseDown[1] = m_controller->IsKeyPressed(key_enum::RightClick); | |||||
| io.MouseDown[2] = m_controller->IsKeyPressed(key_enum::MiddleClick); | |||||
| // FIXME: handle key_enum::Focus? | |||||
| } | } | ||||
| // Start the frame | // Start the frame | ||||
| @@ -56,103 +56,6 @@ public: | |||||
| private: | private: | ||||
| typedef Entity super; | typedef Entity super; | ||||
| //ImGuiKeyBase ------------------------------------------------------------ | |||||
| struct key_base : public StructSafeEnum | |||||
| { | |||||
| enum Type | |||||
| { | |||||
| KEY_START, | |||||
| Tab = KEY_START, | |||||
| LeftArrow, | |||||
| RightArrow, | |||||
| UpArrow, | |||||
| DownArrow, | |||||
| Home, | |||||
| End, | |||||
| Delete, | |||||
| Backspace, | |||||
| Enter, | |||||
| Escape, | |||||
| A, C, V, X, Y, Z, | |||||
| LShift, RShift, LCtrl, RCtrl, | |||||
| KEY_END, | |||||
| MOUSE_KEY_START = KEY_END, | |||||
| LeftClick = MOUSE_KEY_START, | |||||
| RightClick, | |||||
| MiddleClick, | |||||
| Focus, | |||||
| MOUSE_KEY_END, | |||||
| MAX = MOUSE_KEY_END, | |||||
| }; | |||||
| protected: | |||||
| virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map) | |||||
| { | |||||
| enum_map[Tab] = g_name_key_Tab; | |||||
| enum_map[LeftArrow] = g_name_key_Left; | |||||
| enum_map[RightArrow] = g_name_key_Right; | |||||
| enum_map[UpArrow] = g_name_key_Up; | |||||
| enum_map[DownArrow] = g_name_key_Down; | |||||
| enum_map[Home] = g_name_key_Home; | |||||
| enum_map[End] = g_name_key_End; | |||||
| enum_map[Delete] = g_name_key_Delete; | |||||
| enum_map[Backspace] = g_name_key_Backspace; | |||||
| enum_map[Enter] = g_name_key_Return; | |||||
| enum_map[Escape] = g_name_key_Escape; | |||||
| enum_map[A] = g_name_key_A; | |||||
| enum_map[C] = g_name_key_C; | |||||
| enum_map[V] = g_name_key_V; | |||||
| enum_map[X] = g_name_key_X; | |||||
| enum_map[Y] = g_name_key_Y; | |||||
| enum_map[Z] = g_name_key_Z; | |||||
| enum_map[LShift] = g_name_key_LShift; | |||||
| enum_map[RShift] = g_name_key_RShift; | |||||
| enum_map[LCtrl] = g_name_key_LCtrl; | |||||
| enum_map[RCtrl] = g_name_key_RCtrl; | |||||
| enum_map[LeftClick] = g_name_mouse_key_left; | |||||
| enum_map[RightClick] = g_name_mouse_key_right; | |||||
| enum_map[MiddleClick] = g_name_mouse_key_middle; | |||||
| enum_map[Focus] = g_name_mouse_key_in_screen; | |||||
| return true; | |||||
| } | |||||
| }; | |||||
| typedef SafeEnum<key_base> key_enum; | |||||
| //ImGuiKeyBase ------------------------------------------------------------ | |||||
| struct axis_base : public StructSafeEnum | |||||
| { | |||||
| enum Type | |||||
| { | |||||
| MOUSE_AXIS_START = 0, | |||||
| Scroll = MOUSE_AXIS_START, | |||||
| MOUSE_AXIS_END, | |||||
| MAX = MOUSE_AXIS_END, | |||||
| }; | |||||
| protected: | |||||
| virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map) | |||||
| { | |||||
| enum_map[Scroll] = g_name_mouse_axis_scroll; | |||||
| return true; | |||||
| } | |||||
| }; | |||||
| typedef SafeEnum<axis_base> axis_enum; | |||||
| protected: | protected: | ||||
| virtual void tick_game(float seconds); | virtual void tick_game(float seconds); | ||||
| virtual void tick_draw(float seconds, Scene &scene); | virtual void tick_draw(float seconds, Scene &scene); | ||||
| @@ -186,7 +89,6 @@ protected: | |||||
| InputDevice* m_mouse = nullptr; | InputDevice* m_mouse = nullptr; | ||||
| InputDevice* m_keyboard = nullptr; | InputDevice* m_keyboard = nullptr; | ||||
| InputProfile m_profile; | InputProfile m_profile; | ||||
| //std::map<ImGuiKey_, key_enum> m_keys; | |||||
| std::string m_clipboard; | std::string m_clipboard; | ||||
| class primitive : public PrimitiveRenderer | class primitive : public PrimitiveRenderer | ||||