Initial commit
This commit is contained in:
176
inc/EliteInput/EInputCodes.h
Normal file
176
inc/EliteInput/EInputCodes.h
Normal file
@@ -0,0 +1,176 @@
|
||||
/*=============================================================================*/
|
||||
// Copyright 2021-2022 Elite Engine
|
||||
// Authors: Matthieu Delaere, Thomas Goussaert
|
||||
/*=============================================================================*/
|
||||
// EInputCodes.h: all codes for all possible input types.
|
||||
/*=============================================================================*/
|
||||
#ifndef ELITE_INPUT_CODES
|
||||
#define ELITE_INPUT_CODES
|
||||
namespace Elite
|
||||
{
|
||||
/*! InputType: holds what type of input this action comes from */
|
||||
enum InputType
|
||||
{
|
||||
eDefault,
|
||||
eKeyboard,
|
||||
eMouseButton,
|
||||
eMouseWheel,
|
||||
eMouseMotion
|
||||
};
|
||||
|
||||
/*! InputState: holds current state of input */
|
||||
enum InputState
|
||||
{
|
||||
eDown,
|
||||
eReleased,
|
||||
};
|
||||
|
||||
/*! InputMouseButton: holds current button of mouse used */
|
||||
enum InputMouseButton
|
||||
{
|
||||
eLeft = 1,
|
||||
eMiddle = 2,
|
||||
eRight = 3,
|
||||
};
|
||||
|
||||
/*! InputScancode: scancode based on SDL
|
||||
(which is based on the USB usage page: http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) */
|
||||
enum InputScancode
|
||||
{
|
||||
eScancode_Unknown = 0,
|
||||
eScancode_A = 4,
|
||||
eScancode_B = 5,
|
||||
eScancode_C = 6,
|
||||
eScancode_D = 7,
|
||||
eScancode_E = 8,
|
||||
eScancode_F = 9,
|
||||
eScancode_G = 10,
|
||||
eScancode_H = 11,
|
||||
eScancode_I = 12,
|
||||
eScancode_J = 13,
|
||||
eScancode_K = 14,
|
||||
eScancode_L = 15,
|
||||
eScancode_M = 16,
|
||||
eScancode_N = 17,
|
||||
eScancode_O = 18,
|
||||
eScancode_P = 19,
|
||||
eScancode_Q = 20,
|
||||
eScancode_R = 21,
|
||||
eScancode_S = 22,
|
||||
eScancode_T = 23,
|
||||
eScancode_U = 24,
|
||||
eScancode_V = 25,
|
||||
eScancode_W = 26,
|
||||
eScancode_X = 27,
|
||||
eScancode_Y = 28,
|
||||
eScancode_Z = 29,
|
||||
|
||||
eScancode_1 = 30,
|
||||
eScancode_2 = 31,
|
||||
eScancode_3 = 32,
|
||||
eScancode_4 = 33,
|
||||
eScancode_5 = 34,
|
||||
eScancode_6 = 35,
|
||||
eScancode_7 = 36,
|
||||
eScancode_8 = 37,
|
||||
eScancode_9 = 38,
|
||||
eScancode_0 = 39,
|
||||
|
||||
eScancode_Return = 40,
|
||||
eScancode_Escape = 41,
|
||||
eScancode_Backspace = 42,
|
||||
eScancode_Tab = 43,
|
||||
eScancode_Space = 44,
|
||||
|
||||
eScancode_Minus = 45,
|
||||
eScancode_Equals = 46,
|
||||
eScancode_LeftBracket = 47,
|
||||
eScancode_RightBracket = 48,
|
||||
eScancode_Backslash = 49,
|
||||
eScancode_Nonuslash = 50,
|
||||
eScancode_Semicolon = 51,
|
||||
eScancode_Apostrophe = 52,
|
||||
eScancode_Grave = 53,
|
||||
eScancode_Comma = 54,
|
||||
eScancode_Period = 55,
|
||||
eScancode_Slash = 56,
|
||||
|
||||
eScancode_Capslock = 57,
|
||||
|
||||
eScancode_F1 = 58,
|
||||
eScancode_F2 = 59,
|
||||
eScancode_F3 = 60,
|
||||
eScancode_F4 = 61,
|
||||
eScancode_F5 = 62,
|
||||
eScancode_F6 = 63,
|
||||
eScancode_F7 = 64,
|
||||
eScancode_F8 = 65,
|
||||
eScancode_F9 = 66,
|
||||
eScancode_F10 = 67,
|
||||
eScancode_F11 = 68,
|
||||
eScancode_F12 = 69,
|
||||
|
||||
eScancode_PrintScreen = 70,
|
||||
eScancode_ScrollLock = 71,
|
||||
eScancode_Pause = 72,
|
||||
eScancode_Insert = 73,
|
||||
eScancode_Home = 74,
|
||||
eScancode_PageUp = 75,
|
||||
eScancode_Delete = 76,
|
||||
eScancode_End = 77,
|
||||
eScancode_PageDown = 78,
|
||||
eScancode_Right = 79,
|
||||
eScancode_Left = 80,
|
||||
eScancode_Down = 81,
|
||||
eScancode_Up = 82,
|
||||
|
||||
eScancode_NumLockClear = 83,
|
||||
eScancode_KP_Divide = 84,
|
||||
eScancode_KP_Mulitply = 85,
|
||||
eScancode_KP_Minus = 86,
|
||||
eScancode_KP_Plus = 87,
|
||||
eScancode_KP_Enter = 88,
|
||||
eScancode_KP_1 = 89,
|
||||
eScancode_KP_2 = 90,
|
||||
eScancode_KP_3 = 91,
|
||||
eScancode_KP_4 = 92,
|
||||
eScancode_KP_5 = 93,
|
||||
eScancode_KP_6 = 94,
|
||||
eScancode_KP_7 = 95,
|
||||
eScancode_KP_8 = 96,
|
||||
eScancode_KP_9 = 97,
|
||||
eScancode_KP_0 = 98,
|
||||
eScancode_KP_Period = 99,
|
||||
|
||||
eScancode_F13 = 104,
|
||||
eScancode_F14 = 105,
|
||||
eScancode_F15 = 106,
|
||||
eScancode_F16 = 107,
|
||||
eScancode_F17 = 108,
|
||||
eScancode_F18 = 109,
|
||||
eScancode_F19 = 110,
|
||||
eScancode_F20 = 111,
|
||||
eScancode_F21 = 112,
|
||||
eScancode_F22 = 113,
|
||||
eScancode_F23 = 114,
|
||||
eScancode_F24 = 115,
|
||||
|
||||
eScancode_VolumeUp = 128,
|
||||
eScancode_VolumeDown = 129,
|
||||
eScancode_LockingCapsLock = 130,
|
||||
eScancode_LockingNumLock = 131,
|
||||
eScancode_LockingScrollLock = 132,
|
||||
eScancode_KP_Comma = 133,
|
||||
eScancode_KP_EqualsSAS400 = 134,
|
||||
|
||||
eScancode_LCtrl = 224,
|
||||
eScancode_LShift = 225,
|
||||
eScancode_LAlt = 226,
|
||||
eScancode_LGUI = 227,
|
||||
eScancode_RCtrl = 228,
|
||||
eScancode_RShift = 229,
|
||||
eScancode_RAlt = 230,
|
||||
eScancode_RGUI = 231,
|
||||
};
|
||||
}
|
||||
#endif
|
||||
60
inc/EliteInput/EInputData.h
Normal file
60
inc/EliteInput/EInputData.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/*=============================================================================*/
|
||||
// Copyright 2018-2019 Elite Engine
|
||||
// Authors: Matthieu Delaere
|
||||
/*=============================================================================*/
|
||||
// EInputData.h: all structs/data used by the input manager
|
||||
/*=============================================================================*/
|
||||
#ifndef ELITE_INPUT_DATA
|
||||
#define ELITE_INPUT_DATA
|
||||
namespace Elite
|
||||
{
|
||||
struct KeyboardData //8 bytes
|
||||
{
|
||||
int TimeStamp = 0;
|
||||
InputScancode ScanCode = eScancode_Unknown;
|
||||
|
||||
KeyboardData() = default;
|
||||
KeyboardData(int timeStamp, InputScancode keyCode) :
|
||||
TimeStamp(timeStamp), ScanCode(keyCode)
|
||||
{}
|
||||
};
|
||||
|
||||
struct MouseData //== 24 bytes
|
||||
{
|
||||
int TimeStamp = 0;
|
||||
InputMouseButton Button = InputMouseButton(0);
|
||||
int X = 0; //Position X relative to window OR amound of scroll, based on Type!
|
||||
int Y = 0; //Position Y relative to window OR amound of scroll, based on Type!
|
||||
int XRel = 0;
|
||||
int YRel = 0; //Y == Direction when scrolling (1 == UP, -1 == DOWN)
|
||||
|
||||
MouseData() = default;
|
||||
MouseData(int timeStamp, InputMouseButton button, int x, int y,
|
||||
int xRel = 0, int yRel = 0) :
|
||||
TimeStamp(timeStamp), Button(button), X(x), Y(y),
|
||||
XRel(xRel), YRel(yRel)
|
||||
{}
|
||||
};
|
||||
|
||||
union InputData //"Wasting" 16 bytes for a more user-friendly setup, SDL wastes even more memory (= 48 bytes)
|
||||
{
|
||||
MouseData MouseInputData;
|
||||
KeyboardData KeyboardInputData;
|
||||
|
||||
InputData(MouseData data) : MouseInputData(data) {}
|
||||
InputData(KeyboardData data) : KeyboardInputData(data) {}
|
||||
};
|
||||
|
||||
//=== Actual InputAction used by the InputManager ===
|
||||
struct InputAction
|
||||
{
|
||||
InputType InputActionType = InputType::eDefault;
|
||||
InputState InputActionState = eDown;
|
||||
InputData InputActionData;
|
||||
|
||||
InputAction(InputType type, InputState state, InputData data) :
|
||||
InputActionType(type), InputActionState(state), InputActionData(data) {}
|
||||
InputAction() = default;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
48
inc/EliteInput/EInputManager.cpp
Normal file
48
inc/EliteInput/EInputManager.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
//=== General Includes ===
|
||||
#include "stdafx.h"
|
||||
#include "EInputManager.h"
|
||||
using namespace Elite;
|
||||
|
||||
//=== Public Functions ===
|
||||
MouseData EInputManager::GetMouseData(InputType type, InputMouseButton button)
|
||||
{
|
||||
auto result = std::find_if(m_InputContainer.begin(), m_InputContainer.end(),
|
||||
[type, button](const InputAction& ia)
|
||||
{
|
||||
return
|
||||
(ia.InputActionType == type) &&
|
||||
(ia.InputActionData.MouseInputData.Button == button);
|
||||
});
|
||||
|
||||
if (result != m_InputContainer.end())
|
||||
return (*result).InputActionData.MouseInputData;
|
||||
return
|
||||
MouseData();
|
||||
}
|
||||
|
||||
//=== Private Functions ===
|
||||
bool EInputManager::IsKeyPresent(InputType type, InputState state, InputScancode code)
|
||||
{
|
||||
auto result = std::find_if(m_InputContainer.begin(), m_InputContainer.end(),
|
||||
[type, state, code](const InputAction& ia)
|
||||
{
|
||||
return
|
||||
(ia.InputActionType == type) &&
|
||||
(ia.InputActionState == state) &&
|
||||
(ia.InputActionData.KeyboardInputData.ScanCode == code);
|
||||
});
|
||||
return (result != m_InputContainer.end());
|
||||
}
|
||||
|
||||
bool EInputManager::IsMousePresent(InputType type, InputState state, InputMouseButton button)
|
||||
{
|
||||
auto result = std::find_if(m_InputContainer.begin(), m_InputContainer.end(),
|
||||
[type, state, button](const InputAction& ia)
|
||||
{
|
||||
return
|
||||
(ia.InputActionType == type) &&
|
||||
(ia.InputActionState == state) &&
|
||||
(ia.InputActionData.MouseInputData.Button == button);
|
||||
});
|
||||
return (result != m_InputContainer.end());
|
||||
}
|
||||
49
inc/EliteInput/EInputManager.h
Normal file
49
inc/EliteInput/EInputManager.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*=============================================================================*/
|
||||
// Copyright 2021-2022 Elite Engine
|
||||
// Authors: Matthieu Delaere
|
||||
/*=============================================================================*/
|
||||
// EInputManager.h: manager class that controls the input in the engine.
|
||||
/*=============================================================================*/
|
||||
#ifndef ELITE_INPUT_MANAGER
|
||||
#define ELITE_INPUT_MANAGER
|
||||
|
||||
namespace Elite
|
||||
{
|
||||
//=== Forward Declaration ===
|
||||
#if (PLATFORM_ID == PLATFORM_WINDOWS)
|
||||
class SDLWindow;
|
||||
#endif
|
||||
|
||||
/*! EInputManager: manager class that controls all the input, captured from active platform & window*/
|
||||
class EInputManager final : public ESingleton<EInputManager>
|
||||
{
|
||||
public:
|
||||
bool IsKeyboardKeyDown(InputScancode key) { return IsKeyPresent(eKeyboard, eDown, key); };
|
||||
bool IsKeyboardKeyUp(InputScancode key) { return IsKeyPresent(eKeyboard, eReleased, key); }
|
||||
|
||||
bool IsMouseButtonDown(InputMouseButton button) { return IsMousePresent(eMouseButton, eDown, button); }
|
||||
bool IsMouseButtonUp(InputMouseButton button) { return IsMousePresent(eMouseButton, eReleased, button); }
|
||||
bool IsMouseScrolling() { return IsMousePresent(eMouseWheel); }
|
||||
bool IsMouseMoving() { return IsMousePresent(eMouseMotion); }
|
||||
MouseData GetMouseData(InputType type, InputMouseButton button = InputMouseButton(0));
|
||||
|
||||
private:
|
||||
//=== Friends ===
|
||||
//Our window has access to add input events to our queue, our application can later use these events
|
||||
#if (PLATFORM_ID == PLATFORM_WINDOWS)
|
||||
friend SDLWindow;
|
||||
#endif
|
||||
|
||||
//=== Internal Functions
|
||||
void Flush(){ m_InputContainer.clear();};
|
||||
void AddInputAction(const InputAction& inputAction)
|
||||
{ m_InputContainer.push_back(inputAction); };
|
||||
|
||||
bool IsKeyPresent(InputType type, InputState state, InputScancode code);
|
||||
bool IsMousePresent(InputType type, InputState state = InputState(0), InputMouseButton button = InputMouseButton(0));
|
||||
|
||||
//=== Datamembers ===
|
||||
std::vector<InputAction> m_InputContainer;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user