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 | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -77,26 +77,10 @@ void BtPhysTest::InitApp() | |||
m_loc_dp = .0f; | |||
#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->Init(m_profile); | |||
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 */ | |||
m_camera = new Camera(); | |||
@@ -417,7 +401,7 @@ void BtPhysTest::tick_game(float seconds) | |||
auto context = Debug::DrawContext::New(Color::white, 1.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(); | |||
m_loop_value += seconds; | |||
@@ -601,15 +585,15 @@ void BtPhysTest::tick_game(float seconds) | |||
mat4 CtlrMx = Character->GetTransform(); | |||
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); | |||
if (m_controller->WasKeyReleasedThisFrame(KEY_MOVE_JUMP)) | |||
if (m_controller->WasKeyReleasedThisFrame(input::key::SC_Space)) | |||
Character->Jump(); | |||
Character->SetMovementForFrame(CharMove); | |||
@@ -1,8 +1,8 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -74,14 +74,14 @@ private: | |||
protected: | |||
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; | |||
} | |||
@@ -99,7 +99,7 @@ liblol_core_sources = \ | |||
\ | |||
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 \ | |||
\ | |||
gpu/default-material.lolfx \ | |||
@@ -1,8 +1,8 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -318,40 +318,10 @@ public: | |||
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: | |||
@@ -362,7 +332,6 @@ private: | |||
array<JoystickKey> m_joystick_keys; | |||
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) | |||
@@ -1,8 +1,8 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -14,12 +14,49 @@ | |||
#include <lol/engine-internal.h> | |||
#include <string> | |||
#include <map> | |||
#include "input/input_internal.h" | |||
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; | |||
int InputDevice::joystick_count = 0; | |||
bool InputDevice::m_capturemouse; | |||
@@ -99,7 +136,7 @@ InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() | |||
/* Register all scancodes known to SDL (from the USB standard) */ | |||
# define _SC(id, str, name) keyboard->AddKey(id, #name); | |||
# include "input/keys.h" | |||
# include "input/keys.inc" | |||
return keyboard; | |||
} | |||
@@ -1,8 +1,8 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -14,10 +14,25 @@ | |||
#pragma once | |||
#include <string> | |||
#include <vector> | |||
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_mouse("Mouse"); | |||
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); | |||
} | |||
# 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_middle("Middle"); | |||
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_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_down("DPadDown"); | |||
const std::string g_name_xbox_key_dpad_left("DPadLeft"); | |||
@@ -1,8 +1,8 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -15,7 +15,7 @@ | |||
* name and, if possible, a string representation. */ | |||
#if !defined _SC | |||
# error scancode.h included without the _SC macro | |||
# error keys.inc included without the _SC macro | |||
#endif | |||
_SC(0, "", Unknown) | |||
@@ -285,7 +285,7 @@ _SC(282, "", Sleep) | |||
_SC(283, "", App1) | |||
_SC(284, "", App2) | |||
//Custom Lock management | |||
/* Custom Lock management */ | |||
_SC(285, "", CapsLockStatus) | |||
_SC(286, "", ScrollLockStatus) | |||
_SC(287, "", NumLockClearStatus) |
@@ -39,9 +39,6 @@ | |||
namespace lol | |||
{ | |||
#define _SC(id, str, name) static const uint16_t SDLOL_##name = id; | |||
#include "input/keys.h" | |||
//------------------------------------------------------------------------- | |||
/* DEBUG STUFF | |||
static String ScanCodeToText(int sc) | |||
@@ -50,7 +47,7 @@ static String ScanCodeToText(int sc) | |||
{ | |||
#define _SC(id, str, name) \ | |||
case id: return String(str); | |||
#include "input/keys.h" | |||
#include "input/keys.inc" | |||
default: | |||
msg::error("ScanCodeToText unknown scancode %0d\n", sc); | |||
} | |||
@@ -65,7 +62,7 @@ static String ScanCodeToName(int sc) | |||
{ | |||
#define _SC(id, str, name) \ | |||
case id: return String(#name); | |||
#include "input/keys.h" | |||
#include "input/keys.inc" | |||
default: | |||
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_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); | |||
/* 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); | |||
} | |||
# endif // __EMSCRIPTEN__ | |||
#endif | |||
m_gamegroup = GAMEGROUP_INPUT; | |||
@@ -204,35 +199,33 @@ void SdlInput::tick(float seconds) | |||
case SDL_KEYUP: | |||
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) | |||
{ | |||
int sc2 = sc; | |||
switch (sc) | |||
{ | |||
case SDLOL_CapsLock: | |||
sc2 = SDLOL_CapsLockStatus; | |||
case (int)input::key::SC_CapsLock: | |||
sc2 = (int)input::key::SC_CapsLockStatus; | |||
break; | |||
case SDLOL_ScrollLock: | |||
sc2 = SDLOL_ScrollLockStatus; | |||
case (int)input::key::SC_ScrollLock: | |||
sc2 = (int)input::key::SC_ScrollLockStatus; | |||
break; | |||
case SDLOL_NumLockClear: | |||
sc2 = SDLOL_NumLockClearStatus; | |||
case (int)input::key::SC_NumLockClear: | |||
sc2 = (int)input::key::SC_NumLockClearStatus; | |||
break; | |||
} | |||
m_keyboard->internal_set_key(sc2, !m_keyboard->GetKey(sc2)); | |||
m_keyboard->internal_set_key(sc2, !m_keyboard->key((int)sc2)); | |||
/* DEBUG STUFF | |||
msg::debug("Repeat: 0x%02x : %s/%s/%s/%i\n", | |||
(int)m_keyboard, ScanCodeToText(sc2).C(), ScanCodeToName(sc2).C(), | |||
m_keyboard->GetKey(sc2) ? "up" : "down", event.key.repeat); | |||
*/ | |||
} | |||
# endif | |||
default: | |||
// Set key updates the corresponding key | |||
m_keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | |||
@@ -208,7 +208,7 @@ | |||
<ClInclude Include="input\controller.h" /> | |||
<ClInclude Include="input\input.h" /> | |||
<ClInclude Include="input\input_internal.h" /> | |||
<ClInclude Include="input\keys.h" /> | |||
<ClInclude Include="input\keys.inc" /> | |||
<ClInclude Include="input\sdl-input.h"> | |||
<ExcludedFromBuild Condition="'$(enable_sdl)'=='no'">true</ExcludedFromBuild> | |||
</ClInclude> | |||
@@ -666,7 +666,7 @@ | |||
<ClInclude Include="lol\image\movie.h"> | |||
<Filter>lol\image</Filter> | |||
</ClInclude> | |||
<ClInclude Include="input\keys.h"> | |||
<ClInclude Include="input\keys.inc"> | |||
<Filter>input</Filter> | |||
</ClInclude> | |||
<ClInclude Include="input\controller.h"> | |||
@@ -22,6 +22,22 @@ | |||
using namespace lol; | |||
namespace | |||
{ | |||
enum key_enum | |||
{ | |||
LeftClick = 300, | |||
RightClick, | |||
MiddleClick, | |||
Focus, | |||
}; | |||
enum axis_enum | |||
{ | |||
Scroll, | |||
}; | |||
} | |||
static gui* g_gui = nullptr; | |||
//----------------------------------------------------------------------------- | |||
@@ -74,27 +90,19 @@ gui::gui(ImFontAtlas *shared_font_atlas) | |||
<< ShaderProgram::Pixel << imgui_pixel; | |||
// 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")); | |||
m_controller->Init(m_profile); | |||
m_mouse = InputDevice::GetMouse(); | |||
m_keyboard = InputDevice::GetKeyboard(); | |||
//m_controller->Get | |||
//# define KB InputProfile::Keyboard | |||
// m_profile | |||
// << InputProfile::Keyboard(idx, g_name_key_Left); | |||
//# undef KB | |||
} | |||
gui::~gui() | |||
@@ -114,24 +122,25 @@ void gui::init(ImFontAtlas *shared_font_atlas) | |||
ImGuiIO& io = ImGui::GetIO(); | |||
//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 | |||
io.RenderDrawListsFn = gui::static_render_draw_lists; | |||
@@ -223,25 +232,13 @@ void gui::tick_game(float seconds) | |||
io.MouseDrawCursor = true; | |||
// 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); | |||
@@ -261,26 +258,10 @@ void gui::tick_game(float seconds) | |||
//msg::debug("%.2f/%.2f\n", io.MousePos.x, io.MousePos.y); | |||
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 | |||
@@ -56,103 +56,6 @@ public: | |||
private: | |||
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: | |||
virtual void tick_game(float seconds); | |||
virtual void tick_draw(float seconds, Scene &scene); | |||
@@ -186,7 +89,6 @@ protected: | |||
InputDevice* m_mouse = nullptr; | |||
InputDevice* m_keyboard = nullptr; | |||
InputProfile m_profile; | |||
//std::map<ImGuiKey_, key_enum> m_keys; | |||
std::string m_clipboard; | |||
class primitive : public PrimitiveRenderer | |||