Moved some files around
Input manager is ported and just needs to be used by the coreGui_Panel_Refactor
parent
f8d2df5007
commit
9ad0276d3c
@ -1,7 +1,7 @@
|
||||
add_library(dearimgui imgui.cpp imgui_demo.cpp imgui_widgets.cpp imgui_tables.cpp imgui_draw.cpp imgui_impl_glfw.cpp imgui_impl_opengl3.cpp)
|
||||
|
||||
target_include_directories(dearimgui
|
||||
PUBLIC ../../external/glfw/include
|
||||
PUBLIC ../../../external/glfw/include
|
||||
)
|
||||
|
||||
# message( " current source dir: ${CMAKE_CURRENT_SOURCE_DIR}" )
|
||||
@ -0,0 +1,132 @@
|
||||
|
||||
/******************************************************************************
|
||||
* File - InputManager.pp
|
||||
* Author - Joey Pollack
|
||||
* Date - 2019/11/14 (y/m/d)
|
||||
* Mod Date - 2019/11/25 (y/m/d)
|
||||
* Description - Handles all input for windows systems
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <core/window.h>
|
||||
#include "inputManager.h"
|
||||
#include <utils/logger.h>
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
InputManager::InputManager()
|
||||
: mpWindow(nullptr)
|
||||
{
|
||||
memset(mKeyboardState, 0, NUM_KEYS);
|
||||
}
|
||||
|
||||
void InputManager::Initialize(Window* pWindow)
|
||||
{
|
||||
mpWindow = pWindow;
|
||||
}
|
||||
|
||||
const InputManager::_KeyEvents& InputManager::PollKeys()
|
||||
{
|
||||
mKeyEvents.KeysPressed.clear();
|
||||
mKeyEvents.KeysReleased.clear();
|
||||
|
||||
// Check Modifiers first so we only have to do it once
|
||||
// bool shiftHeld = GetAsyncKeyState(VK_SHIFT);
|
||||
// bool controlHeld = GetAsyncKeyState(VK_CONTROL);
|
||||
// bool altHeld = GetAsyncKeyState(VK_MENU);
|
||||
bool shiftHeld = mpWindow->IsKeyDown(KeyCode::SHIFT);
|
||||
bool controlHeld = mpWindow->IsKeyDown(KeyCode::CONTROL);
|
||||
bool altHeld = mpWindow->IsKeyDown(KeyCode::ALT);
|
||||
|
||||
|
||||
for (int i = 0; i < NUM_KEYS; i++)
|
||||
{
|
||||
Keyboard::Key key = Keyboard::GetInstance()->GetKey((KeyCode)i);
|
||||
bool keyIsDown = mpWindow->IsKeyDown(KeyCodeList[i]);
|
||||
|
||||
// Mouse Buttons are a special case
|
||||
if (IsMouseButton(i))
|
||||
{
|
||||
if (keyIsDown)
|
||||
{
|
||||
mKeyboardState[i] = KEY_DOWN;
|
||||
}
|
||||
else
|
||||
{
|
||||
mKeyboardState[i] = KEY_UP;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Key is a known keyboard key
|
||||
if (keyIsDown)
|
||||
{
|
||||
// Ignore key presses for unknown keys
|
||||
if (KeyCode::KEY_UNKNOWN == key.Code)
|
||||
{
|
||||
Logger::Log(LogCategory::CORE, LogLevel::INFO_VERBOSE,
|
||||
"Input Manager skipping unknown key press: idx: %d, code: %d", i, KeyCodeList[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Key was just pressed this frame
|
||||
if (KEY_UP == mKeyboardState[i])
|
||||
{
|
||||
mKeyboardState[i] = KEY_DOWN;
|
||||
|
||||
KeyPress kp;
|
||||
kp.Key = key;
|
||||
kp.ShiftHeld = shiftHeld;
|
||||
kp.ControlHeld = controlHeld;
|
||||
kp.AltHeld = altHeld;
|
||||
|
||||
mKeyEvents.KeysPressed.push_back(kp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Key was just released this frame
|
||||
if (KEY_DOWN == mKeyboardState[i])
|
||||
{
|
||||
mKeyboardState[i] = KEY_UP;
|
||||
mKeyEvents.KeysReleased.push_back(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mKeyEvents;
|
||||
}
|
||||
|
||||
bool InputManager::IsMouseButton(int keyCode)
|
||||
{
|
||||
return (keyCode == KeyCode::MOUSE_LEFT_BUTTON ||
|
||||
keyCode == KeyCode::MOUSE_RIGHT_BUTTON ||
|
||||
keyCode == KeyCode::MOUSE_MIDDLE_BUTTON ||
|
||||
keyCode == KeyCode::MOUSE_X1_BUTTON ||
|
||||
keyCode == KeyCode::MOUSE_X2_BUTTON );
|
||||
}
|
||||
|
||||
bool InputManager::IsKeyDown(KeyCode key)
|
||||
{
|
||||
return (mKeyboardState[key] == KEY_DOWN);
|
||||
}
|
||||
|
||||
// TODO: FIX WINDOWS SPECIFIC CODE:
|
||||
glm::vec2 InputManager::GetMousePosition()
|
||||
{
|
||||
// POINT p;
|
||||
// memset(&p, 0, sizeof(POINT));
|
||||
// GetCursorPos(&p);
|
||||
|
||||
// return { (float)p.x, (float)p.y };
|
||||
return mpWindow->GetCursorPos();
|
||||
}
|
||||
|
||||
void InputManager::SetMousePosition(glm::vec2 p)
|
||||
{
|
||||
//SetCursorPos((int)p.X, (int)p.Y);
|
||||
mpWindow->SetCursorPos(p);
|
||||
}
|
||||
///////////////////////////////////////////////////
|
||||
}
|
||||
@ -0,0 +1,88 @@
|
||||
|
||||
/******************************************************************************
|
||||
* File - InputManager.h
|
||||
* Author - Joey Pollack
|
||||
* Date - 2019/11/14 (y/m/d)
|
||||
* Mod Date - 2021/09/08 (y/m/d)
|
||||
* Description - Handles all input for windows systems
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef INPUT_MANAGER_H_
|
||||
#define INPUT_MANAGER_H_
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
class Window;
|
||||
|
||||
class InputManager
|
||||
{
|
||||
public:
|
||||
|
||||
struct KeyPress
|
||||
{
|
||||
Keyboard::Key Key;
|
||||
|
||||
// Modifiers
|
||||
bool ShiftHeld;
|
||||
bool ControlHeld;
|
||||
bool AltHeld;
|
||||
};
|
||||
|
||||
struct MouseButton
|
||||
{
|
||||
KeyCode code;
|
||||
std::string Name;
|
||||
};
|
||||
|
||||
private:
|
||||
friend class Core;
|
||||
|
||||
struct _KeyEvents
|
||||
{
|
||||
std::vector<KeyPress> KeysPressed;
|
||||
std::vector<Keyboard::Key> KeysReleased;
|
||||
|
||||
} mKeyEvents;
|
||||
|
||||
const int KEY_UP = 0;
|
||||
const int KEY_DOWN = 0xFF;
|
||||
|
||||
|
||||
private: // ENGINE ONLY METHODS
|
||||
InputManager();
|
||||
void Initialize(Window* pWindow);
|
||||
|
||||
// Returns an array of keys that were pressed
|
||||
// Keys are only pressed if they were not held on the previous frame
|
||||
const _KeyEvents& PollKeys();
|
||||
|
||||
bool IsMouseButton(int keyCode);
|
||||
// TODO: Remove these functions
|
||||
// KeyCode TranslateKey(int k);
|
||||
// char GetAsciiFromKeyPress(KeyCode k, bool shiftHeld);
|
||||
|
||||
public:
|
||||
|
||||
bool IsKeyDown(KeyCode key);
|
||||
|
||||
// Returns the mouse position in screen coordinates
|
||||
glm::vec2 GetMousePosition();
|
||||
void SetMousePosition(glm::vec2 p);
|
||||
|
||||
private:
|
||||
Window* mpWindow;
|
||||
|
||||
unsigned char mKeyboardState[NUM_KEYS];
|
||||
//unsigned char mKeyboardPreviousState[NUM_KEYS];
|
||||
std::vector<KeyCode> mModifiers;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // WIN_INPUT_MANAGER_H_
|
||||
@ -0,0 +1,223 @@
|
||||
/******************************************************************************
|
||||
* File - KeyCodes.h
|
||||
* Author - Joey Pollack
|
||||
* Date - 2019/11/14 (y/m/d)
|
||||
* Mod Date - 2021/09/08 (y/m/d)
|
||||
* Description - Key code definitions using GLFW
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef KEY_CODES_H_
|
||||
#define KEY_CODES_H_
|
||||
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
enum KeyCode
|
||||
{
|
||||
A = 'A',
|
||||
B = 'B',
|
||||
C = 'C',
|
||||
D = 'D',
|
||||
E = 'E',
|
||||
F = 'F',
|
||||
G = 'G',
|
||||
H = 'H',
|
||||
I = 'I',
|
||||
J = 'J',
|
||||
K = 'K',
|
||||
L = 'L',
|
||||
M = 'M',
|
||||
N = 'N',
|
||||
O = 'O',
|
||||
P = 'P',
|
||||
Q = 'Q',
|
||||
R = 'R',
|
||||
S = 'S',
|
||||
T = 'T',
|
||||
U = 'U',
|
||||
V = 'V',
|
||||
W = 'W',
|
||||
X = 'X',
|
||||
Y = 'Y',
|
||||
Z = 'Z',
|
||||
|
||||
NUM_0 = '0',
|
||||
NUM_1 = '1',
|
||||
NUM_2 = '2',
|
||||
NUM_3 = '3',
|
||||
NUM_4 = '4',
|
||||
NUM_5 = '5',
|
||||
NUM_6 = '6',
|
||||
NUM_7 = '7',
|
||||
NUM_8 = '8',
|
||||
NUM_9 = '9',
|
||||
|
||||
F1 = GLFW_KEY_F1,
|
||||
F2 = GLFW_KEY_F2,
|
||||
F3 = GLFW_KEY_F3,
|
||||
F4 = GLFW_KEY_F4,
|
||||
F5 = GLFW_KEY_F5,
|
||||
F6 = GLFW_KEY_F6,
|
||||
F7 = GLFW_KEY_F7,
|
||||
F8 = GLFW_KEY_F8,
|
||||
F9 = GLFW_KEY_F9,
|
||||
F10 = GLFW_KEY_F10,
|
||||
F11 = GLFW_KEY_F11,
|
||||
F12 = GLFW_KEY_F12,
|
||||
|
||||
LSHIFT = GLFW_KEY_LEFT_SHIFT,
|
||||
RSHIFT = GLFW_KEY_RIGHT_SHIFT,
|
||||
LCONTROL = GLFW_KEY_LEFT_CONTROL,
|
||||
RCONTROL = GLFW_KEY_RIGHT_CONTROL,
|
||||
LALT = GLFW_KEY_LEFT_ALT,
|
||||
RALT = GLFW_KEY_RIGHT_ALT,
|
||||
|
||||
SPACE = GLFW_KEY_SPACE,
|
||||
|
||||
// Left Arrow Key
|
||||
LEFT = GLFW_KEY_LEFT,
|
||||
|
||||
// Up Arrow Key
|
||||
UP = GLFW_KEY_UP,
|
||||
|
||||
// Right Arrow Key
|
||||
RIGHT = GLFW_KEY_RIGHT,
|
||||
|
||||
// Down Arrow Key
|
||||
DOWN = GLFW_KEY_DOWN,
|
||||
|
||||
// DELETE
|
||||
DEL = GLFW_KEY_DELETE,
|
||||
|
||||
// ENTER
|
||||
RETURN = GLFW_KEY_ENTER,
|
||||
|
||||
BACKSPACE = GLFW_KEY_BACKSPACE,
|
||||
TAB = GLFW_KEY_TAB,
|
||||
|
||||
ESCAPE = GLFW_KEY_ESCAPE,
|
||||
|
||||
// Punctuation
|
||||
SEMICOLON = GLFW_KEY_SEMICOLON, // ';:' for US
|
||||
EQUALS = GLFW_KEY_EQUAL, // '+' any country
|
||||
COMMA = GLFW_KEY_COMMA, // ',' any country
|
||||
DASH = GLFW_KEY_MINUS, // '-' any country
|
||||
DOT = GLFW_KEY_PERIOD, // '.' any country
|
||||
FORWARD_SLASH = GLFW_KEY_SLASH, // '/?' for US
|
||||
TILDE = GLFW_KEY_GRAVE_ACCENT, // '`~' for US
|
||||
|
||||
OPEN_BRACKET = GLFW_KEY_LEFT_BRACKET, // '[{' for US
|
||||
BACKSLASH = GLFW_KEY_BACKSLASH, // '\|' for US
|
||||
CLOSE_BRACKET = GLFW_KEY_RIGHT_BRACKET, // ']}' for US
|
||||
QUOTE = GLFW_KEY_APOSTROPHE, // ''"' for US
|
||||
|
||||
// MOUSE BUTTONS
|
||||
MOUSE_LEFT_BUTTON = GLFW_MOUSE_BUTTON_LEFT,
|
||||
MOUSE_RIGHT_BUTTON = GLFW_MOUSE_BUTTON_RIGHT,
|
||||
MOUSE_MIDDLE_BUTTON = GLFW_MOUSE_BUTTON_MIDDLE,
|
||||
|
||||
// NOTE: Not sure about these
|
||||
MOUSE_X1_BUTTON = GLFW_MOUSE_BUTTON_4,
|
||||
MOUSE_X2_BUTTON = GLFW_MOUSE_BUTTON_5,
|
||||
|
||||
NUM_KEYS,
|
||||
|
||||
// ALTERNATE NAMES
|
||||
SHIFT = GLFW_KEY_LEFT_SHIFT,
|
||||
CONTROL = GLFW_KEY_LEFT_CONTROL,
|
||||
ALT = GLFW_KEY_LEFT_ALT,
|
||||
|
||||
KEY_UNKNOWN = 0xFF
|
||||
};
|
||||
|
||||
static int KeyCodeList[] = {
|
||||
KeyCode::A,
|
||||
KeyCode::B,
|
||||
KeyCode::C,
|
||||
KeyCode::D,
|
||||
KeyCode::E,
|
||||
KeyCode::F,
|
||||
KeyCode::G,
|
||||
KeyCode::H,
|
||||
KeyCode::I,
|
||||
KeyCode::J,
|
||||
KeyCode::K,
|
||||
KeyCode::L,
|
||||
KeyCode::M,
|
||||
KeyCode::N,
|
||||
KeyCode::O,
|
||||
KeyCode::P,
|
||||
KeyCode::Q,
|
||||
KeyCode::R,
|
||||
KeyCode::S,
|
||||
KeyCode::T,
|
||||
KeyCode::U,
|
||||
KeyCode::V,
|
||||
KeyCode::W,
|
||||
KeyCode::X,
|
||||
KeyCode::Y,
|
||||
KeyCode::Z,
|
||||
|
||||
KeyCode::NUM_0,
|
||||
KeyCode::NUM_1,
|
||||
KeyCode::NUM_2,
|
||||
KeyCode::NUM_3,
|
||||
KeyCode::NUM_4,
|
||||
KeyCode::NUM_5,
|
||||
KeyCode::NUM_6,
|
||||
KeyCode::NUM_7,
|
||||
KeyCode::NUM_8,
|
||||
KeyCode::NUM_9,
|
||||
|
||||
KeyCode::F1,
|
||||
KeyCode::F2,
|
||||
KeyCode::F3,
|
||||
KeyCode::F4,
|
||||
KeyCode::F5,
|
||||
KeyCode::F6,
|
||||
KeyCode::F7,
|
||||
KeyCode::F8,
|
||||
KeyCode::F9,
|
||||
KeyCode::F10,
|
||||
KeyCode::F11,
|
||||
KeyCode::F12,
|
||||
|
||||
KeyCode::LSHIFT,
|
||||
KeyCode::RSHIFT,
|
||||
KeyCode::LCONTROL,
|
||||
KeyCode::RCONTROL,
|
||||
KeyCode::LALT,
|
||||
KeyCode::RALT,
|
||||
KeyCode::SPACE,
|
||||
KeyCode::LEFT,
|
||||
KeyCode::UP,
|
||||
KeyCode::RIGHT,
|
||||
KeyCode::DOWN,
|
||||
KeyCode::DEL,
|
||||
KeyCode::RETURN,
|
||||
KeyCode::BACKSPACE,
|
||||
KeyCode::TAB,
|
||||
KeyCode::ESCAPE,
|
||||
KeyCode::SEMICOLON,
|
||||
KeyCode::EQUALS,
|
||||
KeyCode::COMMA,
|
||||
KeyCode::DASH,
|
||||
KeyCode::DOT,
|
||||
KeyCode::FORWARD_SLASH,
|
||||
KeyCode::TILDE,
|
||||
KeyCode::OPEN_BRACKET,
|
||||
KeyCode::BACKSLASH,
|
||||
KeyCode::CLOSE_BRACKET,
|
||||
KeyCode::QUOTE,
|
||||
KeyCode::MOUSE_LEFT_BUTTON,
|
||||
KeyCode::MOUSE_RIGHT_BUTTON,
|
||||
KeyCode::MOUSE_MIDDLE_BUTTON,
|
||||
KeyCode::MOUSE_X1_BUTTON,
|
||||
KeyCode::MOUSE_X2_BUTTON
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif // KEY_CODES_H_
|
||||
@ -0,0 +1,188 @@
|
||||
|
||||
/******************************************************************************
|
||||
* File - Keyboard.cpp
|
||||
* Author - Joey Pollack
|
||||
* Date - 2019/11/15 (y/m/d)
|
||||
* Mod Date - 2019/11/15 (y/m/d)
|
||||
* Description - Stores data about the keys on the keyboard
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
Keyboard* Keyboard::mpInstance = nullptr;
|
||||
|
||||
void Keyboard::Shutdown()
|
||||
{
|
||||
if (mpInstance)
|
||||
{
|
||||
delete mpInstance;
|
||||
mpInstance = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
Keyboard * Keyboard::GetInstance()
|
||||
{
|
||||
if (!mpInstance)
|
||||
{
|
||||
mpInstance = new Keyboard;
|
||||
mpInstance->Initialize();
|
||||
}
|
||||
|
||||
return mpInstance;
|
||||
}
|
||||
|
||||
Keyboard::Keyboard()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Keyboard::Initialize()
|
||||
{
|
||||
// Add letters
|
||||
for (char letter = 'A'; letter <= 'Z'; letter++)
|
||||
{
|
||||
Key k;
|
||||
k.Code = (KeyCode)letter;
|
||||
k.Name = std::string() + letter;
|
||||
k.ShiftName = std::string() + (char)(letter + 32);
|
||||
k.AsciiValue = letter;
|
||||
k.ShiftAsciiValue = letter + 32;
|
||||
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(k.Code, k));
|
||||
}
|
||||
|
||||
// Add Numbers
|
||||
char numShift[10] = { ')', '!', '@', '#', '$', '%', '^', '&', '*', '(' };
|
||||
for (int i = 0; i <= 9; i++)
|
||||
{
|
||||
Key k;
|
||||
k.Code = (KeyCode)(i + 48);
|
||||
|
||||
char name[2];
|
||||
sprintf_s(name, 2, "%d", i);
|
||||
|
||||
k.Name = std::string(name);
|
||||
k.ShiftName = std::string() + numShift[i];
|
||||
k.AsciiValue = (char)(i + 48);
|
||||
k.ShiftAsciiValue = numShift[i];
|
||||
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(k.Code, k));
|
||||
}
|
||||
|
||||
// Punctuation
|
||||
/*
|
||||
SEMICOLON = GLFW_KEY_SEMICOLON, // ';:' for US
|
||||
EQUALS = GLFW_KEY_EQUAL, // '+' any country
|
||||
COMMA = GLFW_KEY_COMMA, // ',' any country
|
||||
DASH = GLFW_KEY_MINUS, // '-' any country
|
||||
DOT = GLFW_KEY_PERIOD, // '.' any country
|
||||
FORWARD_SLASH = GLFW_KEY_SLASH, // '/?' for US
|
||||
TILDE = GLFW_KEY_GRAVE_ACCENT, // '`~' for US
|
||||
|
||||
OPEN_BRACKET = GLFW_KEY_LEFT_BRACKET, // '[{' for US
|
||||
BACKSLASH = GLFW_KEY_BACKSLASH, // '\|' for US
|
||||
CLOSE_BRACKET = GLFW_KEY_RIGHT_BRACKET, // ']}' for US
|
||||
QUOTE = GLFW_KEY_APOSTROPHE, // ''"' for US
|
||||
*/
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(SEMICOLON, { SEMICOLON, "semi colon", "colon", ';', ';' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(EQUALS, { EQUALS, "equals", "plus", '=', '+' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(COMMA, { COMMA, "comma", "less than", ',', '<' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(DASH, { DASH, "dash", "underscore", '-', '_' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(DOT, { DOT, "dot", "greater than", '.', '>' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(FORWARD_SLASH, { FORWARD_SLASH, "forward slash", "question mark", '/', '?' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(TILDE, { TILDE, "tick", "tilde", '`', '~' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(OPEN_BRACKET, { OPEN_BRACKET, "open square bracket", "open curly brace", '[', '{' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(BACKSLASH, { BACKSLASH, "back slash", "pipe", '\\', '|' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(CLOSE_BRACKET, { CLOSE_BRACKET, "close square bracket", "close curly brace", ']', '}' }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(QUOTE, { QUOTE, "single quote", "double quote", '\'', '\"' }));
|
||||
|
||||
|
||||
// Modifiers
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::LSHIFT, { KeyCode::LSHIFT, "left shift", "left shift", (char)0, (char)0 }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::RSHIFT, { KeyCode::RSHIFT, "right shift", "right shift", (char)0, (char)0 }));
|
||||
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::LCONTROL, { KeyCode::LCONTROL, "left control", "left control", (char)0, (char)0 }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::RCONTROL, { KeyCode::RCONTROL, "right control", "right control", (char)0, (char)0 }));
|
||||
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::LALT, { KeyCode::LALT, "left alt", "left alt", (char)0, (char)0 }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::RALT, { KeyCode::RALT, "right alt", "right alt", (char)0, (char)0 }));
|
||||
|
||||
|
||||
// Control characters
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::DEL, { KeyCode::DEL, "delete", "delete", (char)(127), (char)(127) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::BACKSPACE, { KeyCode::BACKSPACE, "backspace", "backspace", (char)(8), (char)(8) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::TAB, { KeyCode::TAB, "tab", "tab", (char)(9), (char)(9) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::RETURN, { KeyCode::RETURN, "return", "return", (char)(10), (char)(10) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::ESCAPE, { KeyCode::ESCAPE, "escape", "escape", (char)(27), (char)(27) }));
|
||||
|
||||
// Arrow Keys
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::LEFT, { KeyCode::LEFT, "Left Arrow", "Left Arrow", (char)(0), (char)(0) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::UP, { KeyCode::UP, "Up Arrow", "Up Arrow", (char)(0), (char)(0) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::RIGHT, { KeyCode::RIGHT, "Right Arrow", "Right Arrow", (char)(0), (char)(0) }));
|
||||
mKeyboard.insert(std::pair<KeyCode, Key>(KeyCode::DOWN, { KeyCode::DOWN, "Down Arrow", "Down Arrow", (char)(0), (char)(0) }));
|
||||
|
||||
// Set up the cross references
|
||||
InitKeysByName();
|
||||
InitKeysByAscii();
|
||||
}
|
||||
|
||||
|
||||
Keyboard::Key Keyboard::GetKey(KeyCode code)
|
||||
{
|
||||
auto iter = mKeyboard.find(code);
|
||||
if (mKeyboard.end() == iter)
|
||||
return Key::Unknown();
|
||||
|
||||
return (*iter).second;
|
||||
}
|
||||
|
||||
Keyboard::Key Keyboard::GetKey(std::string name)
|
||||
{
|
||||
auto iter = mKeysByName.find(name);
|
||||
if (mKeysByName.end() == iter)
|
||||
return Key::Unknown();
|
||||
|
||||
return (*iter).second;
|
||||
}
|
||||
|
||||
Keyboard::Key Keyboard::GetKey(char ascii)
|
||||
{
|
||||
auto iter = mKeysByAscii.find(ascii);
|
||||
if (mKeysByAscii.end() == iter)
|
||||
return Key::Unknown();
|
||||
|
||||
return (*iter).second;
|
||||
}
|
||||
|
||||
void Keyboard::InitKeysByName()
|
||||
{
|
||||
for (auto iter = mKeyboard.begin(); iter != mKeyboard.end(); iter++)
|
||||
{
|
||||
mKeysByName.insert(std::pair<std::string, Key&>((*iter).second.Name, (*iter).second));
|
||||
}
|
||||
}
|
||||
|
||||
void Keyboard::InitKeysByAscii()
|
||||
{
|
||||
for (auto iter = mKeyboard.begin(); iter != mKeyboard.end(); iter++)
|
||||
{
|
||||
mKeysByAscii.insert(std::pair<char, Key&>((*iter).second.AsciiValue, (*iter).second));
|
||||
mKeysByAscii.insert(std::pair<char, Key&>((*iter).second.ShiftAsciiValue, (*iter).second));
|
||||
}
|
||||
}
|
||||
|
||||
Keyboard::Key Keyboard::Key::Unknown()
|
||||
{
|
||||
Key k;
|
||||
k.Code = KeyCode::KEY_UNKNOWN;
|
||||
k.Name = "unknown";
|
||||
k.ShiftName = "unknown";
|
||||
k.AsciiValue = (char)0;
|
||||
k.ShiftAsciiValue = (char)0;
|
||||
|
||||
return k;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
|
||||
/******************************************************************************
|
||||
* File - Keyboard.h
|
||||
* Author - Joey Pollack
|
||||
* Date - 2019/11/15 (y/m/d)
|
||||
* Mod Date - 2019/11/15 (y/m/d)
|
||||
* Description - Stores data about the keys on the keyboard
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef KEYBOARD_H_
|
||||
#define KEYBOARD_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include "keyCodes.h"
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
class Keyboard
|
||||
{
|
||||
friend class Core;
|
||||
|
||||
public: // Data structures
|
||||
struct Key
|
||||
{
|
||||
KeyCode Code;
|
||||
std::string Name;
|
||||
std::string ShiftName;
|
||||
char AsciiValue;
|
||||
char ShiftAsciiValue;
|
||||
|
||||
static Key Unknown();
|
||||
};
|
||||
|
||||
private: // Internal / Engine Only
|
||||
Keyboard();
|
||||
Keyboard(const Keyboard&) = delete;
|
||||
Keyboard& operator=(const Keyboard&) = delete;
|
||||
|
||||
void Initialize();
|
||||
static void Shutdown();
|
||||
|
||||
public: // Interface
|
||||
|
||||
static Keyboard* GetInstance();
|
||||
|
||||
Key GetKey(KeyCode code);
|
||||
Key GetKey(std::string name);
|
||||
Key GetKey(char ascii);
|
||||
|
||||
private: // The instance
|
||||
static Keyboard* mpInstance;
|
||||
|
||||
private: // Data
|
||||
std::map<KeyCode, Key> mKeyboard;
|
||||
|
||||
// Cross references
|
||||
std::map<std::string, Key&> mKeysByName;
|
||||
std::map<char, Key&> mKeysByAscii;
|
||||
|
||||
private: // Helper methods
|
||||
void InitKeysByName();
|
||||
void InitKeysByAscii();
|
||||
};
|
||||
}
|
||||
|
||||
#endif // KEYBOARD_H_
|
||||
Loading…
Reference in New Issue