@@ -25,7 +25,6 @@ class InputTutorial : public WorldEntity | |||||
public: | public: | ||||
InputTutorial() | InputTutorial() | ||||
{ | { | ||||
#if LOL_INPUT_V2 | |||||
m_controller = new Controller(KEY_MAX, AXIS_MAX); | m_controller = new Controller(KEY_MAX, AXIS_MAX); | ||||
m_keyboard = InputDevice::Get("Keyboard"); | m_keyboard = InputDevice::Get("Keyboard"); | ||||
@@ -46,7 +45,6 @@ public: | |||||
m_controller->GetAxis(AXIS_PITCH).Bind("Joystick1", "Axis2"); | m_controller->GetAxis(AXIS_PITCH).Bind("Joystick1", "Axis2"); | ||||
m_controller->GetAxis(AXIS_YAW).Bind("Joystick1", "Axis1"); | m_controller->GetAxis(AXIS_YAW).Bind("Joystick1", "Axis1"); | ||||
} | } | ||||
#endif | |||||
m_pitch_angle = 0; | m_pitch_angle = 0; | ||||
m_yaw_angle = 0; | m_yaw_angle = 0; | ||||
@@ -90,7 +88,6 @@ public: | |||||
{ | { | ||||
WorldEntity::TickGame(seconds); | WorldEntity::TickGame(seconds); | ||||
#if LOL_INPUT_V2 | |||||
/* Handle keyboard */ | /* Handle keyboard */ | ||||
if (m_keyboard) | if (m_keyboard) | ||||
{ | { | ||||
@@ -129,7 +126,6 @@ public: | |||||
m_mouse->GetCursorPixel(0).x, m_mouse->GetCursorPixel(0).y)); | m_mouse->GetCursorPixel(0).x, m_mouse->GetCursorPixel(0).y)); | ||||
} | } | ||||
else | else | ||||
#endif | |||||
{ | { | ||||
m_text->SetText("no mouse detected"); | m_text->SetText("no mouse detected"); | ||||
} | } | ||||
@@ -217,10 +213,8 @@ private: | |||||
AXIS_MAX | AXIS_MAX | ||||
}; | }; | ||||
#if LOL_INPUT_V2 | |||||
InputDevice *m_keyboard, *m_mouse, *m_joystick; | InputDevice *m_keyboard, *m_mouse, *m_joystick; | ||||
Controller *m_controller; | Controller *m_controller; | ||||
#endif | |||||
bool m_autorot; | bool m_autorot; | ||||
float m_pitch_angle; | float m_pitch_angle; | ||||
@@ -124,14 +124,10 @@ static inline int isnan(float f) | |||||
#include "video.h" | #include "video.h" | ||||
#include "audio.h" | #include "audio.h" | ||||
#include "scene.h" | #include "scene.h" | ||||
#include "input/input.h" | |||||
#include "input/keyboard.h" | |||||
#include "input/stick.h" | |||||
#include "profiler.h" | #include "profiler.h" | ||||
// Input (v2) | |||||
// Input | |||||
#include "input/input.h" | #include "input/input.h" | ||||
#include "input/inputdevice.h" | |||||
#include "input/controller.h" | #include "input/controller.h" | ||||
// Entities | // Entities | ||||
@@ -87,13 +87,14 @@ void DebugFps::TickGame(float seconds) | |||||
1e3f * Profiler::GetMax(Profiler::STAT_TICK_FRAME)); | 1e3f * Profiler::GetMax(Profiler::STAT_TICK_FRAME)); | ||||
data->lines[4]->SetText(buf); | data->lines[4]->SetText(buf); | ||||
#else | #else | ||||
sprintf(buf, "%2.2f/%2.2f/%2.2f/%2.2f %2.2f fps (%i)", | |||||
sprintf(buf, "%2.2f/%2.2f/%2.2f/%2.2f %2.2f fps (%i) %2.2f", | |||||
1e3f * Profiler::GetAvg(Profiler::STAT_TICK_GAME), | 1e3f * Profiler::GetAvg(Profiler::STAT_TICK_GAME), | ||||
1e3f * Profiler::GetAvg(Profiler::STAT_TICK_DRAW), | 1e3f * Profiler::GetAvg(Profiler::STAT_TICK_DRAW), | ||||
1e3f * Profiler::GetAvg(Profiler::STAT_TICK_BLIT), | 1e3f * Profiler::GetAvg(Profiler::STAT_TICK_BLIT), | ||||
1e3f * Profiler::GetAvg(Profiler::STAT_TICK_FRAME), | 1e3f * Profiler::GetAvg(Profiler::STAT_TICK_FRAME), | ||||
1.0f / Profiler::GetAvg(Profiler::STAT_TICK_FRAME), | 1.0f / Profiler::GetAvg(Profiler::STAT_TICK_FRAME), | ||||
Ticker::GetFrameNum()); | |||||
1e3f * Profiler::GetAvg(Profiler::STAT_USER_00), | |||||
Ticker::GetFrameNum()); | |||||
data->lines[0]->SetText(buf); | data->lines[0]->SetText(buf); | ||||
#endif | #endif | ||||
} | } | ||||
@@ -251,11 +251,7 @@ EglApp::EglApp(char const *title, ivec2 res, float fps) : | |||||
# endif | # endif | ||||
# if defined USE_SDL | # if defined USE_SDL | ||||
# if defined LOL_INPUT_V2 | |||||
new SdlInput(res.x, res.y, data->screen_size.x, data->screen_size.y); | new SdlInput(res.x, res.y, data->screen_size.x, data->screen_size.y); | ||||
# else | |||||
new SdlInput(); | |||||
# endif | |||||
# endif | # endif | ||||
/* Initialise everything */ | /* Initialise everything */ | ||||
@@ -14,8 +14,6 @@ | |||||
#include "core.h" | #include "core.h" | ||||
#ifdef LOL_INPUT_V2 | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -137,5 +135,3 @@ Array<Controller*> Controller::DeactivateAll() | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
#endif // LOL_INPUT_V2 |
@@ -13,8 +13,6 @@ | |||||
#include "core.h" | #include "core.h" | ||||
#if defined LOL_INPUT_V2 | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -98,7 +96,5 @@ private: | |||||
} /* namespace lol */ | } /* namespace lol */ | ||||
#endif // LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_CONTROLLER_H__ | #endif // __LOL_INPUT_CONTROLLER_H__ | ||||
@@ -1,484 +1,69 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
// This program is free software; you can redistribute it and/or | // This program is free software; you can redistribute it and/or | ||||
// modify it under the terms of the Do What The Fuck You Want To | // modify it under the terms of the Do What The Fuck You Want To | ||||
// Public License, Version 2, as published by Sam Hocevar. See | // Public License, Version 2, as published by Sam Hocevar. See | ||||
// http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
// | // | ||||
#if defined HAVE_CONFIG_H | #if defined HAVE_CONFIG_H | ||||
# include "config.h" | # include "config.h" | ||||
#endif | #endif | ||||
#include <cstdlib> | |||||
#include "core.h" | #include "core.h" | ||||
#ifndef LOL_INPUT_V2 | |||||
#include "input/input_internal.h" | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
/* | |||||
* Input implementation class | |||||
*/ | |||||
InputTracker* Input::m_input_tracker = nullptr; | |||||
static class InputData | |||||
{ | |||||
friend class Input; | |||||
public: | |||||
InputData() | |||||
: mouse(-1), | |||||
buttons(0), | |||||
nentities(0), | |||||
lastfocus(0) | |||||
{ | |||||
m_keystate.Resize(Key::Last); | |||||
memset(&m_keystate[0], 0, m_keystate.Bytes()); | |||||
} | |||||
private: | |||||
ivec2 mouse; | |||||
uint32_t buttons; | |||||
Array<uint8_t> m_keystate; | |||||
static int const MAX_ENTITIES = 100; | |||||
WorldEntity *entities[MAX_ENTITIES]; | |||||
int nentities; | |||||
WorldEntity *lastfocus; | |||||
Array<Stick *> m_sticks; | |||||
} | |||||
inputdata; | |||||
static InputData * const data = &inputdata; | |||||
/* | |||||
* ButtonSetting class | |||||
*/ | |||||
int ButtonSetting::GetActionSettingIdx(Action a) | |||||
{ | |||||
for (int i = 0; i < m_associated_action_list.Count(); i++) | |||||
if (ACTION_CMP(m_associated_action_list[i].m_action, a)) | |||||
return i; | |||||
return -1; | |||||
} | |||||
/* | |||||
* InputTracker class | |||||
*/ | |||||
InputTracker::InputTracker() | |||||
{ | |||||
m_gamegroup = GAMEGROUP_BEFORE; | |||||
for (int i = 0; i < Key::Last * 2; ++i) | |||||
m_input_status << 0; | |||||
Ticker::Ref(this); | |||||
} | |||||
//Internal | |||||
int InputTracker::GetButtonSettingIdx(Key k) | |||||
{ | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
if (m_input_assocation_list[i].m_raw_button == k) | |||||
return i; | |||||
return -1; | |||||
} | |||||
//----- | |||||
int InputTracker::GetCurrentButtonStatus(Key k) | |||||
{ | |||||
if (k < m_input_status.Count()) | |||||
return m_input_status[k]; | |||||
return 0; | |||||
} | |||||
//----- | |||||
int InputTracker::GetPreviousButtonStatus(Key k) | |||||
{ | |||||
if (k < m_input_status.Count()) | |||||
return m_input_status[(int)k + (int)Key::Last]; | |||||
return 0; | |||||
} | |||||
//Internal : Updates the action status & timers | |||||
void InputTracker::UpdateActionStatus(float seconds) | |||||
{ | |||||
Array<uint8_t> &keystate = Input::GetKeyboardState(); | |||||
//SOOOoooo ugly. | |||||
for (int i = 0; i < Key::Last; ++i) | |||||
{ | |||||
m_input_status[i + Key::Last] = m_input_status[i]; | |||||
m_input_status[i] = keystate[i]; | |||||
} | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
{ | |||||
ButtonSetting &CurIT = m_input_assocation_list[i]; | |||||
for (int j = 0; j < CurIT.m_associated_action_list.Count(); j++) | |||||
{ | |||||
ActionSetting &CurAS = CurIT.m_associated_action_list[j]; | |||||
if (CurAS.m_buffered_since <= CurAS.m_buffering_time) | |||||
CurAS.m_buffered_since += seconds; | |||||
if (GetCurrentButtonStatus(CurIT.m_raw_button) && | |||||
CurAS.m_buffering_time >= .0f) | |||||
CurAS.m_buffered_since = .0f; | |||||
} | |||||
} | |||||
} | |||||
//Helps link a software input Action-Id to an hardware input Button-Id. | |||||
void InputTracker::LinkActionToKey(Action a, Key k) | |||||
{ | |||||
int ITIdx = GetButtonSettingIdx(k); | |||||
if (ITIdx == -1) | |||||
{ | |||||
ITIdx = m_input_assocation_list.Count(); | |||||
m_input_assocation_list << ButtonSetting(k); | |||||
} | |||||
ButtonSetting &CurIT = m_input_assocation_list[ITIdx]; | |||||
int ASIdx = CurIT.GetActionSettingIdx(a); | |||||
if (ASIdx == -1) | |||||
{ | |||||
ASIdx = CurIT.m_associated_action_list.Count(); | |||||
CurIT.m_associated_action_list << ActionSetting(a); | |||||
} | |||||
} | |||||
//Helps unlink a software input Action-Id to an hardware input k-Id. | |||||
void InputTracker::UnlinkAction(Action a) | |||||
{ | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
{ | |||||
ButtonSetting &CurIT = m_input_assocation_list[i]; | |||||
int ASIdx = CurIT.GetActionSettingIdx(a); | |||||
if (ASIdx != -1) | |||||
CurIT.m_associated_action_list.Remove(ASIdx); | |||||
} | |||||
} | |||||
//Returns the current status of a given action | |||||
int InputTracker::GetStatus(Action a) | |||||
{ | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
{ | |||||
ButtonSetting &CurIT = m_input_assocation_list[i]; | |||||
int ASIdx = CurIT.GetActionSettingIdx(a); | |||||
if (ASIdx != -1) | |||||
{ | |||||
ActionSetting &CurAS = CurIT.m_associated_action_list[ASIdx]; | |||||
if (CurAS.m_buffering_time >= .0f && CurAS.m_buffered_since <= CurAS.m_buffering_time) | |||||
return 1; | |||||
return 0; | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
//Returns TRUE if action status went from Active to Inactive this frame | |||||
bool InputTracker::WasReleased(Action a) | |||||
{ | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
{ | |||||
ButtonSetting &CurIT = m_input_assocation_list[i]; | |||||
int ASIdx = CurIT.GetActionSettingIdx(a); | |||||
if (ASIdx != -1) | |||||
{ | |||||
if (GetPreviousButtonStatus(CurIT.m_raw_button) && | |||||
!GetCurrentButtonStatus(CurIT.m_raw_button)) | |||||
return true; | |||||
return false; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
//Returns TRUE if action status went from Inactive to Active this frame | |||||
bool InputTracker::WasPressed(Action a) | |||||
{ | |||||
for (int i = 0; i < m_input_assocation_list.Count(); i++) | |||||
{ | |||||
ButtonSetting &CurIT = m_input_assocation_list[i]; | |||||
int ASIdx = CurIT.GetActionSettingIdx(a); | |||||
if (ASIdx != -1) | |||||
{ | |||||
if (!GetPreviousButtonStatus(CurIT.m_raw_button) && | |||||
GetCurrentButtonStatus(CurIT.m_raw_button)) | |||||
return true; | |||||
return false; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
//Returns the current status of a given action | |||||
int InputTracker::GetStatus(Key k) | |||||
{ | |||||
return GetCurrentButtonStatus(k); | |||||
} | |||||
//Returns TRUE if action status went from Active to Inactive this frame | |||||
bool InputTracker::WasReleased(Key k) | |||||
{ | |||||
if (GetPreviousButtonStatus(k) && | |||||
!GetCurrentButtonStatus(k)) | |||||
return true; | |||||
return false; | |||||
} | |||||
//Returns TRUE if action status went from Inactive to Active this frame | |||||
bool InputTracker::WasPressed(Key k) | |||||
{ | |||||
if (!GetPreviousButtonStatus(k) && | |||||
GetCurrentButtonStatus(k)) | |||||
return true; | |||||
return false; | |||||
} | |||||
/* | |||||
* Public Input class | |||||
*/ | |||||
#if 0 | |||||
vec2 Input::GetAxis(int axis) | |||||
{ | |||||
vec2 ret; | |||||
/* Simulate a joystick using the keyboard. */ | |||||
int left = GetKeyState(Key::D) - (GetKeyState(Key::A) | GetKeyState(Key::Q)); | |||||
int up = (GetKeyState(Key::W) | GetKeyState(Key::Z)) - GetKeyState(Key::S); | |||||
ret.x += left; | |||||
ret.y += up; | |||||
if (left && up) | |||||
ret = ret * sqrtf(0.5f); | |||||
return ret; | |||||
} | |||||
#endif | |||||
ivec2 Input::GetMousePos() | |||||
{ | |||||
return data->mouse; | |||||
} | |||||
uint32_t Input::GetMouseButtons() | |||||
{ | |||||
return data->buttons; | |||||
} | |||||
Array<uint8_t> &Input::GetKeyboardState() | |||||
{ | |||||
return data->m_keystate; | |||||
} | |||||
int Input::GetKeyState(int key) | |||||
{ | |||||
return data->m_keystate[key]; | |||||
} | |||||
//Helps link a software input Action-Id to an hardware input Button-Id. | |||||
void Input::LinkActionToKey(Action a, Key k) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
Input::m_input_tracker->LinkActionToKey(a, k); | |||||
} | |||||
//Helps unlink a software input Action-Id to an hardware input Button-Id. | |||||
void Input::UnlinkAction(Action a) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
Input::m_input_tracker->UnlinkAction(a); | |||||
} | |||||
//Returns the current status of a given action | |||||
int Input::GetStatus(Action a) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->GetStatus(a); | |||||
return 0; | |||||
} | |||||
//Returns TRUE if action status when from Active to Inactive this frame | |||||
bool Input::WasPressed(Action a) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->WasPressed(a); | |||||
return false; | |||||
} | |||||
//Returns TRUE if action status when from Active to Inactive this frame | |||||
bool Input::WasReleased(Action a) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->WasReleased(a); | |||||
return false; | |||||
} | |||||
//Returns the current status of a given action | |||||
int Input::GetStatus(Key k) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->GetStatus(k); | |||||
return 0; | |||||
} | |||||
//Returns TRUE if action status when from Active to Inactive this frame | |||||
bool Input::WasPressed(Key k) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->WasPressed(k); | |||||
return false; | |||||
} | |||||
//Returns TRUE if action status when from Active to Inactive this frame | |||||
bool Input::WasReleased(Key k) | |||||
{ | |||||
if (CheckInputTrackerInit()) | |||||
return Input::m_input_tracker->WasReleased(k); | |||||
return false; | |||||
} | |||||
//-- | |||||
void Input::TrackMouse(WorldEntity *e) | |||||
{ | |||||
if (data->nentities >= InputData::MAX_ENTITIES) | |||||
return; | |||||
data->entities[data->nentities] = e; | |||||
data->nentities++; | |||||
} | |||||
Array<InputDevice*> InputDevice::devices; | |||||
bool InputDevice::m_capturemouse; | |||||
void Input::UntrackMouse(WorldEntity *e) | |||||
void InputDeviceInternal::AddKey(const char* name) | |||||
{ | { | ||||
for (int n = 0; n < data->nentities; n++) | |||||
{ | |||||
if (data->entities[n] != e) | |||||
continue; | |||||
data->entities[n] = data->entities[data->nentities - 1]; | |||||
data->nentities--; | |||||
n--; | |||||
} | |||||
m_keynames.Push(name); | |||||
m_keys.Push(false); | |||||
} | } | ||||
void Input::SetMousePos(ivec2 coord) | |||||
void InputDeviceInternal::AddAxis(const char* name, float sensitivity) | |||||
{ | { | ||||
data->mouse = coord; | |||||
WorldEntity *top = nullptr; | |||||
/* Find the top “widget” amongst all entities that match the | |||||
* mouse coordinates */ | |||||
for (int n = 0; n < data->nentities; n++) | |||||
{ | |||||
if (coord.x < data->entities[n]->m_bbox[0].x | |||||
|| coord.x >= data->entities[n]->m_bbox[1].x | |||||
|| coord.y < data->entities[n]->m_bbox[0].y | |||||
|| coord.y >= data->entities[n]->m_bbox[1].y) | |||||
continue; | |||||
if (!top || top->m_bbox[1].z < data->entities[n]->m_bbox[1].z) | |||||
top = data->entities[n]; | |||||
} | |||||
for (int n = 0; n < data->nentities; n++) | |||||
{ | |||||
if (data->entities[n] == top) | |||||
{ | |||||
data->entities[n]->m_mousepos = coord - (ivec2)top->m_bbox[0].xy; | |||||
if (top != data->lastfocus) | |||||
data->entities[n]->m_pressed = data->buttons; | |||||
else | |||||
data->entities[n]->m_clicked = 0; | |||||
} | |||||
else | |||||
{ | |||||
data->entities[n]->m_mousepos = ivec2(-1); | |||||
/* FIXME */ | |||||
data->entities[n]->m_released = 0; | |||||
data->entities[n]->m_pressed = 0; | |||||
data->entities[n]->m_clicked = 0; | |||||
} | |||||
} | |||||
data->lastfocus = top; | |||||
m_axisnames.Push(name); | |||||
m_axis.Push(0.0f, sensitivity); | |||||
} | } | ||||
void Input::SetMouseButton(int index) | |||||
void InputDeviceInternal::AddCursor(const char* name) | |||||
{ | { | ||||
uint32_t flag = 1 << index; | |||||
data->buttons |= flag; | |||||
if (data->lastfocus) | |||||
{ | |||||
if (!(data->lastfocus->m_pressed & flag)) | |||||
data->lastfocus->m_clicked |= flag; | |||||
data->lastfocus->m_pressed |= flag; | |||||
data->lastfocus->m_released &= ~flag; | |||||
} | |||||
m_cursornames.Push(name); | |||||
m_cursors.Push(vec2(0.0), ivec2(0)); | |||||
} | } | ||||
void Input::UnsetMouseButton(int index) | |||||
InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() | |||||
{ | { | ||||
uint32_t flag = 1 << index; | |||||
data->buttons &= ~flag; | |||||
if (data->lastfocus) | |||||
{ | |||||
if (!(data->lastfocus->m_pressed & flag)) | |||||
data->lastfocus->m_released |= flag; | |||||
data->lastfocus->m_pressed &= ~flag; | |||||
data->lastfocus->m_clicked &= ~flag; | |||||
} | |||||
InputDeviceInternal* keyboard = new InputDeviceInternal("Keyboard"); | |||||
/* "value" is unused, what matters is the index. */ | |||||
# define KEY_FUNC(key, value) \ | |||||
keyboard->AddKey(#key); | |||||
# undef KEY_FUNC | |||||
return keyboard; | |||||
} | } | ||||
Stick *Input::CreateStick() | |||||
InputDeviceInternal* InputDeviceInternal::CreateStandardMouse() | |||||
{ | { | ||||
Stick *stick = new Stick(); | |||||
Ticker::Ref(stick); | |||||
data->m_sticks.Push(stick); | |||||
return stick; | |||||
} | |||||
InputDeviceInternal* mouse = new InputDeviceInternal("Mouse"); | |||||
mouse->AddKey("ButtonLeft"); | |||||
mouse->AddKey("ButtonMiddle"); | |||||
mouse->AddKey("ButtonRight"); | |||||
void Input::DestroyStick(Stick *stick) | |||||
{ | |||||
for (int i = 0; i < data->m_sticks.Count(); i++) | |||||
if (data->m_sticks[i] == stick) | |||||
data->m_sticks.Remove(i); | |||||
Ticker::Unref(stick); | |||||
} | |||||
mouse->AddAxis("X"); | |||||
mouse->AddAxis("Y"); | |||||
Stick *Input::TrackStick(int desired) | |||||
{ | |||||
/* FIXME: add the possibility to choose amongst sticks */ | |||||
if (desired >= data->m_sticks.Count()) | |||||
return nullptr; | |||||
Ticker::Ref(data->m_sticks[desired]); | |||||
return data->m_sticks[desired]; | |||||
} | |||||
mouse->AddCursor("Cursor"); | |||||
void Input::UntrackStick(Stick *stick) | |||||
{ | |||||
Ticker::Unref(stick); | |||||
// TODO: extended button, and wheel (as axis or as buttons? or both?) | |||||
return mouse; | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
#endif // !LOL_INPUT_V2 |
@@ -1,464 +1,122 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
// This program is free software; you can redistribute it and/or | // This program is free software; you can redistribute it and/or | ||||
// modify it under the terms of the Do What The Fuck You Want To | // modify it under the terms of the Do What The Fuck You Want To | ||||
// Public License, Version 2, as published by Sam Hocevar. See | // Public License, Version 2, as published by Sam Hocevar. See | ||||
// http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
// | // | ||||
// | |||||
// The Input static class | |||||
// ---------------------- | |||||
// | |||||
#if !defined __LOL_INPUT_INPUT_H__ | |||||
#define __LOL_INPUT_INPUT_H__ | |||||
#include <cstring> | |||||
#include <string.h> | |||||
#if !defined __LOL_INPUT_H__ | |||||
#define __LOL_INPUT_H__ | |||||
#include "core.h" | #include "core.h" | ||||
#ifndef LOL_INPUT_V2 | |||||
#include "lol/math/vector.h" | |||||
#include "input/keyboard.h" | |||||
#include "input/stick.h" | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
typedef std::string Action; | |||||
static inline int ACTION_CMP(Action a, Action b) { return a.compare(b) == 0; } | |||||
class WorldEntity; | |||||
/* | |||||
* The key enumeration values match libSDL's so that we can | |||||
* easily pass information between Lol and SDL. | |||||
*/ | |||||
struct Key | |||||
class InputDevice | |||||
{ | { | ||||
enum Value | |||||
{ | |||||
/* ASCII mapped keys */ | |||||
Unknown = 0, | |||||
First = 0, | |||||
Backspace = 8, | |||||
Tab = (int)'\t', | |||||
Clear = 12, | |||||
Return = 13, | |||||
Pause = 19, | |||||
Escape = 27, | |||||
Space = (int)' ', | |||||
Exclaim = (int)'!', | |||||
DoubleQuote = (int)'"', | |||||
Hash = (int)'#', | |||||
Dollar = (int)'$', | |||||
Ampersand = (int)'&', | |||||
Quote = (int)'\'', | |||||
LeftParen = (int)'(', | |||||
RightParen = (int)')', | |||||
Asterisk = (int)'*', | |||||
Plus = (int)'+', | |||||
Comma = (int)',', | |||||
Minus = (int)'-', | |||||
Period = (int)'.', | |||||
Slash = (int)'/', | |||||
K0 = (int)'0', | |||||
K1 = (int)'1', | |||||
K2 = (int)'2', | |||||
K3 = (int)'3', | |||||
K4 = (int)'4', | |||||
K5 = (int)'5', | |||||
K6 = (int)'6', | |||||
K7 = (int)'7', | |||||
K8 = (int)'8', | |||||
K9 = (int)'9', | |||||
Colon = (int)':', | |||||
Semicolon = (int)';', | |||||
Less = (int)'<', | |||||
Equals = (int)'=', | |||||
Greater = (int)'>', | |||||
Question = (int)'?', | |||||
At = (int)'@', | |||||
/* XXX: SDL decides to skip uppercase characters */ | |||||
LeftBracket = (int)'[', | |||||
BackSlash = (int)'\\', | |||||
RightBracket = (int)']', | |||||
Caret = (int)'^', | |||||
Underscore = (int)'_', | |||||
Backquote = (int)'`', | |||||
A = (int)'a', | |||||
B = (int)'b', | |||||
C = (int)'c', | |||||
D = (int)'d', | |||||
E = (int)'e', | |||||
F = (int)'f', | |||||
G = (int)'g', | |||||
H = (int)'h', | |||||
I = (int)'i', | |||||
J = (int)'j', | |||||
K = (int)'k', | |||||
L = (int)'l', | |||||
M = (int)'m', | |||||
N = (int)'n', | |||||
O = (int)'o', | |||||
P = (int)'p', | |||||
Q = (int)'q', | |||||
R = (int)'r', | |||||
S = (int)'s', | |||||
T = (int)'t', | |||||
U = (int)'u', | |||||
V = (int)'v', | |||||
W = (int)'w', | |||||
X = (int)'x', | |||||
Y = (int)'y', | |||||
Z = (int)'z', | |||||
Delete = 127, | |||||
/* International keyboard syms */ | |||||
World0 = 160, /* 0xA0 */ | |||||
World1 = 161, | |||||
World2 = 162, | |||||
World3 = 163, | |||||
World4 = 164, | |||||
World5 = 165, | |||||
World6 = 166, | |||||
World7 = 167, | |||||
World8 = 168, | |||||
World9 = 169, | |||||
World10 = 170, | |||||
World11 = 171, | |||||
World12 = 172, | |||||
World13 = 173, | |||||
World14 = 174, | |||||
World15 = 175, | |||||
World16 = 176, | |||||
World17 = 177, | |||||
World18 = 178, | |||||
World19 = 179, | |||||
World20 = 180, | |||||
World21 = 181, | |||||
World22 = 182, | |||||
World23 = 183, | |||||
World24 = 184, | |||||
World25 = 185, | |||||
World26 = 186, | |||||
World27 = 187, | |||||
World28 = 188, | |||||
World29 = 189, | |||||
World30 = 190, | |||||
World31 = 191, | |||||
World32 = 192, | |||||
World33 = 193, | |||||
World34 = 194, | |||||
World35 = 195, | |||||
World36 = 196, | |||||
World37 = 197, | |||||
World38 = 198, | |||||
World39 = 199, | |||||
World40 = 200, | |||||
World41 = 201, | |||||
World42 = 202, | |||||
World43 = 203, | |||||
World44 = 204, | |||||
World45 = 205, | |||||
World46 = 206, | |||||
World47 = 207, | |||||
World48 = 208, | |||||
World49 = 209, | |||||
World50 = 210, | |||||
World51 = 211, | |||||
World52 = 212, | |||||
World53 = 213, | |||||
World54 = 214, | |||||
World55 = 215, | |||||
World56 = 216, | |||||
World57 = 217, | |||||
World58 = 218, | |||||
World59 = 219, | |||||
World60 = 220, | |||||
World61 = 221, | |||||
World62 = 222, | |||||
World63 = 223, | |||||
World64 = 224, | |||||
World65 = 225, | |||||
World66 = 226, | |||||
World67 = 227, | |||||
World68 = 228, | |||||
World69 = 229, | |||||
World70 = 230, | |||||
World71 = 231, | |||||
World72 = 232, | |||||
World73 = 233, | |||||
World74 = 234, | |||||
World75 = 235, | |||||
World76 = 236, | |||||
World77 = 237, | |||||
World78 = 238, | |||||
World79 = 239, | |||||
World80 = 240, | |||||
World81 = 241, | |||||
World82 = 242, | |||||
World83 = 243, | |||||
World84 = 244, | |||||
World85 = 245, | |||||
World86 = 246, | |||||
World87 = 247, | |||||
World88 = 248, | |||||
World89 = 249, | |||||
World90 = 250, | |||||
World91 = 251, | |||||
World92 = 252, | |||||
World93 = 253, | |||||
World94 = 254, | |||||
World95 = 255, /* 0xFF */ | |||||
/* Numeric keypad */ | |||||
KP0 = 256, | |||||
KP1 = 257, | |||||
KP2 = 258, | |||||
KP3 = 259, | |||||
KP4 = 260, | |||||
KP5 = 261, | |||||
KP6 = 262, | |||||
KP7 = 263, | |||||
KP8 = 264, | |||||
KP9 = 265, | |||||
KPPeriod = 266, | |||||
KPDivide = 267, | |||||
KPMultiply = 268, | |||||
KPMinus = 269, | |||||
KPPlus = 270, | |||||
KPEnter = 271, | |||||
KPEquals = 272, | |||||
public: | |||||
/** Get the name of this input device */ | |||||
const String& GetName(); | |||||
/** Get the index of the corresponding key, needed to call GetKey */ | |||||
int GetKeyIndex(const char* name) const { return GetItemIndex(name, m_keynames); } | |||||
/** Get the index of the corresponding axis, needed to call GetAxis */ | |||||
int GetAxisIndex(const char* name) const { return GetItemIndex(name, m_axisnames); } | |||||
/** Get the index of the corresponding cursor, needed to call GetCursor */ | |||||
int GetCursorIndex(const char* name) const { return GetItemIndex(name, m_cursornames); } | |||||
/** Get the current state of the given key, true being pressed and false being released */ | |||||
bool GetKey(int index) const { return m_keys[index]; } | |||||
/** Get the current value of the given axis. Devices should cap this value between -1 and 1 as much as possible, through it is not guaranteed */ | |||||
float GetAxis(int index) const { return m_axis[index].m1 * m_axis[index].m2; } | |||||
/** Get the current value of the given cursor, 0,0 being the bottom-left corner and 1,1 being the top-right corner */ | |||||
vec2 GetCursor(int index) const { return m_cursors[index].m1; } | |||||
/** Get the coordinate of the pixel the cursor is currently over, 0,0 being the bottom-left corner. */ | |||||
ivec2 GetCursorPixel(int index) const { return m_cursors[index].m2; } | |||||
/** Set a per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
void SetAxisSensitivity(int index, float sensitivity) { m_axis[index].m2 = sensitivity; } | |||||
/** Get the per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
float GetAxisSensitivity(int index) const { return m_axis[index].m2; } | |||||
/** Get a list of the name of all available keys in this device */ | |||||
const Array<String>& GetAllKeys() const { return m_keynames; } | |||||
/** Get a list of the name of all available axis in this device */ | |||||
const Array<String>& GetAllAxis() const { return m_axisnames; } | |||||
/** Get a list of the name of all available cursors in this device */ | |||||
const Array<String>& GetAllCursors() const { return m_cursornames; } | |||||
/** Get an input device by its name */ | |||||
static InputDevice* Get(const char* name) { return GetDevice(name); } | |||||
/** Set whether the mouse cursor should be captured. */ | |||||
static void CaptureMouse(bool activated) { m_capturemouse = activated; } | |||||
/* Arrows + Home/End pad */ | |||||
Up = 273, | |||||
Down = 274, | |||||
Right = 275, | |||||
Left = 276, | |||||
Insert = 277, | |||||
Home = 278, | |||||
End = 279, | |||||
PageUp = 280, | |||||
PageDown = 281, | |||||
protected: | |||||
// TODO: hide all of this in a InputDeviceData? | |||||
/* Function keys */ | |||||
F1 = 282, | |||||
F2 = 283, | |||||
F3 = 284, | |||||
F4 = 285, | |||||
F5 = 286, | |||||
F6 = 287, | |||||
F7 = 288, | |||||
F8 = 289, | |||||
F9 = 290, | |||||
F10 = 291, | |||||
F11 = 292, | |||||
F12 = 293, | |||||
F13 = 294, | |||||
F14 = 295, | |||||
F15 = 296, | |||||
String m_name; | |||||
/* Modifier keys */ | |||||
NumLock = 300, | |||||
CapsLock = 301, | |||||
ScrollLock= 302, | |||||
RightShift = 303, | |||||
LeftShift = 304, | |||||
RightCtrl = 305, | |||||
LeftCtrl = 306, | |||||
RightAlt = 307, | |||||
LeftAlt = 308, | |||||
RightMeta = 309, | |||||
LeftMeta = 310, | |||||
LeftSuper = 311, /* Left "Windows" key */ | |||||
RightSuper = 312, /* Right "Windows" key */ | |||||
Mode = 313, /* "Alt Gr" key */ | |||||
Compose = 314, /* Multi-key compose key */ | |||||
Array<String> m_keynames; | |||||
Array<String> m_axisnames; | |||||
Array<String> m_cursornames; | |||||
/* Miscellaneous function keys */ | |||||
Help = 315, | |||||
Print = 316, | |||||
SysReq = 317, | |||||
Break = 318, | |||||
Menu = 319, | |||||
Power = 320, /* Power Macintosh power key */ | |||||
Euro = 321, /* Some european keyboards */ | |||||
Undo = 322, /* Atari keyboard has Undo */ | |||||
/** key states (pressed/released) */ | |||||
Array<bool> m_keys; | |||||
/** axis states (value and sensitivity) */ | |||||
Array<float, float> m_axis; | |||||
/** cursor position */ | |||||
Array<vec2, ivec2> m_cursors; | |||||
/* Add any other keys here */ | |||||
Last | |||||
static bool m_capturemouse; | |||||
InputDevice(const char* name) : m_name(name) | |||||
{ | |||||
devices.Push(this); | |||||
} | } | ||||
m_value; | |||||
//BH : Removed KMod from main enum, because I don't have any idea about handling them correctly for now. | |||||
/* | |||||
//Enumeration of valid key mods (possibly OR'd together) | |||||
KM_NONE = 0x0000, | |||||
KM_LSHIFT = 0x0001, | |||||
KM_RSHIFT = 0x0002, | |||||
KM_LCTRL = 0x0040, | |||||
KM_RCTRL = 0x0080, | |||||
KM_LALT = 0x0100, | |||||
KM_RALT = 0x0200, | |||||
KM_LMETA = 0x0400, | |||||
KM_RMETA = 0x0800, | |||||
KM_NUM = 0x1000, | |||||
KM_CAPS = 0x2000, | |||||
KM_MODE = 0x4000, | |||||
KM_RESERVED = 0x8000, | |||||
//Left/Right independent key mods definition | |||||
KM_CTRL = (KM_LCTRL|KM_RCTRL), | |||||
KM_SHIFT = (KM_LSHIFT|KM_RSHIFT), | |||||
KM_ALT = (KM_LALT|KM_RALT), | |||||
KM_META = (KM_LMETA|KM_RMETA), | |||||
*/ | |||||
inline Key(Value v) { m_value = v; } | |||||
inline operator Value() { return m_value; } | |||||
inline bool operator==(const Key& val) | |||||
~InputDevice() | |||||
{ | { | ||||
return m_value == val.m_value; | |||||
for (int i = 0; i < devices.Count(); ++i) | |||||
{ | |||||
if (devices[i] == this) | |||||
{ | |||||
devices.Remove(i); | |||||
return; | |||||
} | |||||
} | |||||
} | } | ||||
}; | |||||
struct ActionSetting | |||||
{ | |||||
Action m_action; | |||||
float m_buffering_time; | |||||
float m_buffered_since; | |||||
ActionSetting(Action NewAction) | |||||
: m_action(NewAction), | |||||
m_buffering_time(.0f), | |||||
m_buffered_since(.0f) | |||||
{ } | |||||
}; | |||||
struct ButtonSetting | |||||
{ | |||||
Key m_raw_button; | |||||
Array<ActionSetting> m_associated_action_list; | |||||
ButtonSetting(Key NewRawButton) | |||||
: m_raw_button(NewRawButton) | |||||
{ } | |||||
int GetActionSettingIdx(Action SearchAction); | |||||
}; | |||||
class InputTracker : public Entity | |||||
{ | |||||
friend class Input; | |||||
public: | |||||
InputTracker(); | |||||
private: | private: | ||||
Array<uint8_t> m_input_status; | |||||
Array<ButtonSetting> m_input_assocation_list; | |||||
int GetButtonSettingIdx(struct Key k); | |||||
int GetCurrentButtonStatus(struct Key k); | |||||
int GetPreviousButtonStatus(struct Key k); | |||||
void UpdateActionStatus(float seconds); | |||||
static Array<InputDevice*> devices; | |||||
protected: | |||||
virtual char const * GetName() | |||||
{ | |||||
return "<InputTracker>"; | |||||
} | |||||
virtual void TickGame(float seconds) | |||||
template <typename T> | |||||
int GetItemIndex(const char* name, const Array<String, T>& Array) const | |||||
{ | { | ||||
Entity::TickGame(seconds); | |||||
UpdateActionStatus(seconds); | |||||
for (int i = 0; i < Array.Count(); ++i) | |||||
{ | |||||
if (Array[i] == name) | |||||
return i; | |||||
} | |||||
return -1; | |||||
} | } | ||||
void LinkActionToKey(Action a, struct Key k); | |||||
void UnlinkAction(Action a); | |||||
int GetStatus(Action a); | |||||
bool WasPressed(Action a); | |||||
bool WasReleased(Action a); | |||||
//You should probably use the Action System | |||||
int GetStatus(Key k); | |||||
bool WasPressed(Key k); | |||||
bool WasReleased(Key k); | |||||
}; | |||||
class Input | |||||
{ | |||||
private: | |||||
static InputTracker* m_input_tracker; | |||||
static bool CheckInputTrackerInit() | |||||
static InputDevice* GetDevice(const char* name) | |||||
{ | { | ||||
if (Input::m_input_tracker) | |||||
return true; | |||||
Input::m_input_tracker = new InputTracker(); | |||||
return true; | |||||
for (int i = 0; i < devices.Count(); ++i) | |||||
{ | |||||
if (devices[i]->m_name == name) | |||||
return devices[i]; | |||||
} | |||||
return nullptr; | |||||
} | } | ||||
public: | |||||
/* These methods are general queries */ | |||||
static ivec2 GetMousePos(); | |||||
static uint32_t GetMouseButtons(); | |||||
/* Action management */ | |||||
static void LinkActionToKey(Action a, struct Key k); | |||||
static void UnlinkAction(Action a); | |||||
static int GetStatus(Action a); | |||||
static bool WasPressed(Action a); | |||||
static bool WasReleased(Action a); | |||||
/* Raw Button management. You should use actions. */ | |||||
static int GetStatus(Key k); | |||||
static bool WasPressed(Key k); | |||||
static bool WasReleased(Key k); | |||||
/* Entities can subscribe to events */ | |||||
static void TrackMouse(WorldEntity *e); | |||||
static void UntrackMouse(WorldEntity *e); | |||||
/* These methods are called by the underlying input listeners */ | |||||
/* FIXME: this should disappear and be replaced by an input | |||||
* system that abstracts mice */ | |||||
static void SetMousePos(ivec2 coord); | |||||
static void SetMouseButton(int index); | |||||
static void UnsetMouseButton(int index); | |||||
/* Keyboard handling */ | |||||
static Array<uint8_t> &GetKeyboardState(); | |||||
static int GetKeyState(int key); | |||||
static Keyboard *CreateKeyboard(); | |||||
static void DestroyKeyboard(Keyboard *keyboard); | |||||
static Keyboard *TrackKeyboard(int desired); | |||||
static void UntrackKeyboard(Keyboard *keyboard); | |||||
/* Joystick handling */ | |||||
static Stick *CreateStick(); | |||||
static void DestroyStick(Stick *stick); | |||||
static Stick *TrackStick(int desired); | |||||
static void UntrackStick(Stick *stick); | |||||
}; | }; | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
#endif // !LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_INPUT_H__ | |||||
#endif // __LOL_INPUT_H__ | |||||
@@ -1,74 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#if defined HAVE_CONFIG_H | |||||
# include "config.h" | |||||
#endif | |||||
#include "core.h" | |||||
#ifdef LOL_INPUT_V2 | |||||
#include "input/inputdevice_internal.h" | |||||
namespace lol | |||||
{ | |||||
Array<InputDevice*> InputDevice::devices; | |||||
bool InputDevice::m_capturemouse; | |||||
void InputDeviceInternal::AddKey(const char* name) | |||||
{ | |||||
m_keynames.Push(name); | |||||
m_keys.Push(false); | |||||
} | |||||
void InputDeviceInternal::AddAxis(const char* name, float sensitivity) | |||||
{ | |||||
m_axisnames.Push(name); | |||||
m_axis.Push(0.0f, sensitivity); | |||||
} | |||||
void InputDeviceInternal::AddCursor(const char* name) | |||||
{ | |||||
m_cursornames.Push(name); | |||||
m_cursors.Push(vec2(0.0), ivec2(0)); | |||||
} | |||||
InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() | |||||
{ | |||||
InputDeviceInternal* keyboard = new InputDeviceInternal("Keyboard"); | |||||
/* "value" is unused, what matters is the index. */ | |||||
# define KEY_FUNC(key, value) \ | |||||
keyboard->AddKey(#key); | |||||
# include "input/keys.h" | |||||
# undef KEY_FUNC | |||||
return keyboard; | |||||
} | |||||
InputDeviceInternal* InputDeviceInternal::CreateStandardMouse() | |||||
{ | |||||
InputDeviceInternal* mouse = new InputDeviceInternal("Mouse"); | |||||
mouse->AddKey("ButtonLeft"); | |||||
mouse->AddKey("ButtonMiddle"); | |||||
mouse->AddKey("ButtonRight"); | |||||
mouse->AddAxis("X"); | |||||
mouse->AddAxis("Y"); | |||||
mouse->AddCursor("Cursor"); | |||||
// TODO: extended button, and wheel (as axis or as buttons? or both?) | |||||
return mouse; | |||||
} | |||||
} /* namespace lol */ | |||||
#endif // LOL_INPUT_V2 |
@@ -1,126 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#if !defined __LOL_INPUT_DEVICE_H__ | |||||
#define __LOL_INPUT_DEVICE_H__ | |||||
#include "core.h" | |||||
#if defined LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
class InputDevice | |||||
{ | |||||
public: | |||||
/** Get the name of this input device */ | |||||
const String& GetName(); | |||||
/** Get the index of the corresponding key, needed to call GetKey */ | |||||
int GetKeyIndex(const char* name) const { return GetItemIndex(name, m_keynames); } | |||||
/** Get the index of the corresponding axis, needed to call GetAxis */ | |||||
int GetAxisIndex(const char* name) const { return GetItemIndex(name, m_axisnames); } | |||||
/** Get the index of the corresponding cursor, needed to call GetCursor */ | |||||
int GetCursorIndex(const char* name) const { return GetItemIndex(name, m_cursornames); } | |||||
/** Get the current state of the given key, true being pressed and false being released */ | |||||
bool GetKey(int index) const { return m_keys[index]; } | |||||
/** Get the current value of the given axis. Devices should cap this value between -1 and 1 as much as possible, through it is not guaranteed */ | |||||
float GetAxis(int index) const { return m_axis[index].m1 * m_axis[index].m2; } | |||||
/** Get the current value of the given cursor, 0,0 being the bottom-left corner and 1,1 being the top-right corner */ | |||||
vec2 GetCursor(int index) const { return m_cursors[index].m1; } | |||||
/** Get the coordinate of the pixel the cursor is currently over, 0,0 being the bottom-left corner. */ | |||||
ivec2 GetCursorPixel(int index) const { return m_cursors[index].m2; } | |||||
/** Set a per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
void SetAxisSensitivity(int index, float sensitivity) { m_axis[index].m2 = sensitivity; } | |||||
/** Get the per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */ | |||||
float GetAxisSensitivity(int index) const { return m_axis[index].m2; } | |||||
/** Get a list of the name of all available keys in this device */ | |||||
const Array<String>& GetAllKeys() const { return m_keynames; } | |||||
/** Get a list of the name of all available axis in this device */ | |||||
const Array<String>& GetAllAxis() const { return m_axisnames; } | |||||
/** Get a list of the name of all available cursors in this device */ | |||||
const Array<String>& GetAllCursors() const { return m_cursornames; } | |||||
/** Get an input device by its name */ | |||||
static InputDevice* Get(const char* name) { return GetDevice(name); } | |||||
/** Set whether the mouse cursor should be captured. */ | |||||
static void CaptureMouse(bool activated) { m_capturemouse = activated; } | |||||
protected: | |||||
// TODO: hide all of this in a InputDeviceData? | |||||
String m_name; | |||||
Array<String> m_keynames; | |||||
Array<String> m_axisnames; | |||||
Array<String> m_cursornames; | |||||
/** key states (pressed/released) */ | |||||
Array<bool> m_keys; | |||||
/** axis states (value and sensitivity) */ | |||||
Array<float, float> m_axis; | |||||
/** cursor position */ | |||||
Array<vec2, ivec2> m_cursors; | |||||
static bool m_capturemouse; | |||||
InputDevice(const char* name) : m_name(name) | |||||
{ | |||||
devices.Push(this); | |||||
} | |||||
~InputDevice() | |||||
{ | |||||
for (int i = 0; i < devices.Count(); ++i) | |||||
{ | |||||
if (devices[i] == this) | |||||
{ | |||||
devices.Remove(i); | |||||
return; | |||||
} | |||||
} | |||||
} | |||||
private: | |||||
static Array<InputDevice*> devices; | |||||
template <typename T> | |||||
int GetItemIndex(const char* name, const Array<String, T>& Array) const | |||||
{ | |||||
for (int i = 0; i < Array.Count(); ++i) | |||||
{ | |||||
if (Array[i] == name) | |||||
return i; | |||||
} | |||||
return -1; | |||||
} | |||||
static InputDevice* GetDevice(const char* name) | |||||
{ | |||||
for (int i = 0; i < devices.Count(); ++i) | |||||
{ | |||||
if (devices[i]->m_name == name) | |||||
return devices[i]; | |||||
} | |||||
return nullptr; | |||||
} | |||||
}; | |||||
} /* namespace lol */ | |||||
#endif // LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_DEVICE_H__ | |||||
@@ -1,46 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Benjamin Litzelmann | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#if !defined __LOL_INPUT_DEVICE_INTERNAL_H__ | |||||
#define __LOL_INPUT_DEVICE_H__ | |||||
#include "core.h" | |||||
#if defined LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
/** Internal class (not public) that allows to construct an InputDevice dynamically, when the keys, axis and cursors are not known at compile time */ | |||||
class InputDeviceInternal : InputDevice | |||||
{ | |||||
public: | |||||
InputDeviceInternal(const char* name) : InputDevice(name) { } | |||||
void AddKey(const char* name); | |||||
void AddAxis(const char* name, float sensitivity = 1.0f); | |||||
void AddCursor(const char* name); | |||||
void SetKey(int index, bool state) { m_keys[index] = state; } | |||||
void SetAxis(int index, float value) { m_axis[index].m1 = value; } | |||||
void SetCursor(int index, const vec2& position, const ivec2& pixel) { m_cursors[index].m1 = position; m_cursors[index].m2 = pixel; } | |||||
static bool GetMouseCapture() { return m_capturemouse; } | |||||
static InputDeviceInternal* CreateStandardKeyboard(); | |||||
static InputDeviceInternal* CreateStandardMouse(); | |||||
}; | |||||
} /* namespace lol */ | |||||
#endif // LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_DEVICE_INTERNAL_H__ | |||||
@@ -1,71 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#if defined HAVE_CONFIG_H | |||||
# include "config.h" | |||||
#endif | |||||
#include <cstdlib> | |||||
#include "core.h" | |||||
#ifndef LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
/* | |||||
* Keyboard implementation class | |||||
*/ | |||||
static class KeyboardData | |||||
{ | |||||
friend class Keyboard; | |||||
public: | |||||
KeyboardData() { } | |||||
private: | |||||
Array<uint32_t> m_chars; | |||||
} | |||||
keyboarddata; | |||||
/* | |||||
* Public Keyboard class | |||||
*/ | |||||
Keyboard::Keyboard() | |||||
: m_data(new KeyboardData()) | |||||
{ | |||||
} | |||||
Keyboard::~Keyboard() | |||||
{ | |||||
delete m_data; | |||||
} | |||||
void Keyboard::PushChar(uint32_t ch) | |||||
{ | |||||
m_data->m_chars.Push(ch); | |||||
} | |||||
uint32_t Keyboard::PopChar() | |||||
{ | |||||
if (!m_data->m_chars.Count()) | |||||
return 0; | |||||
uint32_t ret = m_data->m_chars[0]; | |||||
m_data->m_chars.Remove(0); | |||||
return ret; | |||||
} | |||||
} /* namespace lol */ | |||||
#endif // !LOL_INPUT_V2 |
@@ -1,47 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
// | |||||
// The Keyboard class | |||||
// ------------------ | |||||
// | |||||
#if !defined __LOL_INPUT_KEYBOARD_H__ | |||||
#define __LOL_INPUT_KEYBOARD_H__ | |||||
#include "entity.h" | |||||
#ifndef LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
class KeyboardData; | |||||
class Keyboard : public Entity | |||||
{ | |||||
friend class Input; | |||||
public: | |||||
void PushChar(uint32_t ch); | |||||
uint32_t PopChar(); | |||||
private: | |||||
Keyboard(); | |||||
~Keyboard(); | |||||
KeyboardData *m_data; | |||||
}; | |||||
} /* namespace lol */ | |||||
#endif // !LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_KEYBOARD_H__ | |||||
@@ -1,112 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#if defined HAVE_CONFIG_H | |||||
# include "config.h" | |||||
#endif | |||||
#include <cstdlib> | |||||
#include "core.h" | |||||
#ifndef LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
/* | |||||
* Stick implementation class | |||||
*/ | |||||
static class StickData | |||||
{ | |||||
friend class Stick; | |||||
public: | |||||
StickData() { } | |||||
private: | |||||
/* First element is the remap target */ | |||||
Array<int, float> m_axes; | |||||
Array<int, int> m_buttons; | |||||
} | |||||
stickdata; | |||||
/* | |||||
* Public Stick class | |||||
*/ | |||||
Stick::Stick() | |||||
: m_data(new StickData()) | |||||
{ | |||||
} | |||||
Stick::~Stick() | |||||
{ | |||||
delete m_data; | |||||
} | |||||
void Stick::SetAxisCount(int n) | |||||
{ | |||||
m_data->m_axes.Empty(); | |||||
for (int i = 0; i < n; i++) | |||||
m_data->m_axes.Push(i, 0.f); | |||||
} | |||||
void Stick::SetButtonCount(int n) | |||||
{ | |||||
m_data->m_buttons.Empty(); | |||||
for (int i = 0; i < n; i++) | |||||
m_data->m_buttons.Push(i, 0); | |||||
} | |||||
void Stick::SetAxis(int n, float val) | |||||
{ | |||||
m_data->m_axes[m_data->m_axes[n].m1].m2 = val; | |||||
} | |||||
void Stick::SetButton(int n, int val) | |||||
{ | |||||
m_data->m_buttons[m_data->m_buttons[n].m1].m2 = val; | |||||
} | |||||
void Stick::RemapAxis(int src, int dst) | |||||
{ | |||||
m_data->m_axes[src].m1 = dst; | |||||
} | |||||
void Stick::RemapButton(int src, int dst) | |||||
{ | |||||
m_data->m_buttons[src].m1 = dst; | |||||
} | |||||
int Stick::GetAxisCount() | |||||
{ | |||||
return m_data->m_axes.Count(); | |||||
} | |||||
int Stick::GetButtonCount() | |||||
{ | |||||
return m_data->m_buttons.Count(); | |||||
} | |||||
float Stick::GetAxis(int n) | |||||
{ | |||||
return m_data->m_axes[n].m2; | |||||
} | |||||
int Stick::GetButton(int n) | |||||
{ | |||||
return m_data->m_buttons[n].m2; | |||||
} | |||||
} /* namespace lol */ | |||||
#endif // !LOL_INPUT_V2 |
@@ -1,56 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
// | |||||
// The Stick class | |||||
// --------------- | |||||
// | |||||
#if !defined __LOL_INPUT_STICK_H__ | |||||
#define __LOL_INPUT_STICK_H__ | |||||
#include "entity.h" | |||||
#ifndef LOL_INPUT_V2 | |||||
namespace lol | |||||
{ | |||||
class StickData; | |||||
class Stick : public Entity | |||||
{ | |||||
friend class Input; | |||||
public: | |||||
void SetAxisCount(int n); | |||||
void SetButtonCount(int n); | |||||
void SetAxis(int n, float val); | |||||
void SetButton(int n, int val); | |||||
void RemapAxis(int src, int dst); | |||||
void RemapButton(int src, int dst); | |||||
int GetAxisCount(); | |||||
int GetButtonCount(); | |||||
float GetAxis(int n); | |||||
int GetButton(int n); | |||||
private: | |||||
Stick(); | |||||
~Stick(); | |||||
StickData *m_data; | |||||
}; | |||||
} /* namespace lol */ | |||||
#endif // !LOL_INPUT_V2 | |||||
#endif // __LOL_INPUT_STICK_H__ | |||||
@@ -146,9 +146,6 @@ | |||||
<ClCompile Include="image\image.cpp" /> | <ClCompile Include="image\image.cpp" /> | ||||
<ClCompile Include="input\controller.cpp" /> | <ClCompile Include="input\controller.cpp" /> | ||||
<ClCompile Include="input\input.cpp" /> | <ClCompile Include="input\input.cpp" /> | ||||
<ClCompile Include="input\inputdevice.cpp" /> | |||||
<ClCompile Include="input\keyboard.cpp" /> | |||||
<ClCompile Include="input\stick.cpp" /> | |||||
<ClCompile Include="layer.cpp" /> | <ClCompile Include="layer.cpp" /> | ||||
<ClCompile Include="light.cpp" /> | <ClCompile Include="light.cpp" /> | ||||
<ClCompile Include="map.cpp" /> | <ClCompile Include="map.cpp" /> | ||||
@@ -209,11 +206,8 @@ | |||||
<ClInclude Include="image\image-private.h" /> | <ClInclude Include="image\image-private.h" /> | ||||
<ClInclude Include="input\controller.h" /> | <ClInclude Include="input\controller.h" /> | ||||
<ClInclude Include="input\input.h" /> | <ClInclude Include="input\input.h" /> | ||||
<ClInclude Include="input\inputdevice.h" /> | |||||
<ClInclude Include="input\inputdevice_internal.h" /> | |||||
<ClInclude Include="input\keyboard.h" /> | |||||
<ClInclude Include="input\input_internal.h" /> | |||||
<ClInclude Include="input\keys.h" /> | <ClInclude Include="input\keys.h" /> | ||||
<ClInclude Include="input\stick.h" /> | |||||
<ClInclude Include="layer.h" /> | <ClInclude Include="layer.h" /> | ||||
<ClInclude Include="light.h" /> | <ClInclude Include="light.h" /> | ||||
<ClInclude Include="loldebug.h" /> | <ClInclude Include="loldebug.h" /> | ||||
@@ -43,21 +43,6 @@ | |||||
<Filter Include="mesh"> | <Filter Include="mesh"> | ||||
<UniqueIdentifier>{1eaa8df5-7a31-4358-a1e9-0e265de6ed49}</UniqueIdentifier> | <UniqueIdentifier>{1eaa8df5-7a31-4358-a1e9-0e265de6ed49}</UniqueIdentifier> | ||||
</Filter> | </Filter> | ||||
<Filter Include="platform"> | |||||
<UniqueIdentifier>{a11c55f8-8e10-4270-be24-38e8d4fcf589}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="platform\sdl"> | |||||
<UniqueIdentifier>{4089421f-2cc2-4036-a6b2-9df8a2f4efc8}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="platform\xbox"> | |||||
<UniqueIdentifier>{317cb5cc-5dcc-4e14-be90-40a125a2e2ec}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="platform\d3d9"> | |||||
<UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="platform\ps3"> | |||||
<UniqueIdentifier>{c6c6b597-ed6c-4d82-a166-964beeeeb525}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="lol\base"> | <Filter Include="lol\base"> | ||||
<UniqueIdentifier>{e17b998c-d494-480b-ae29-5d1564f73327}</UniqueIdentifier> | <UniqueIdentifier>{e17b998c-d494-480b-ae29-5d1564f73327}</UniqueIdentifier> | ||||
</Filter> | </Filter> | ||||
@@ -79,6 +64,21 @@ | |||||
<Filter Include="lol\debug"> | <Filter Include="lol\debug"> | ||||
<UniqueIdentifier>{01285b11-c6c7-4a9e-8dee-daa2c63901e4}</UniqueIdentifier> | <UniqueIdentifier>{01285b11-c6c7-4a9e-8dee-daa2c63901e4}</UniqueIdentifier> | ||||
</Filter> | </Filter> | ||||
<Filter Include="mesh\platform"> | |||||
<UniqueIdentifier>{a11c55f8-8e10-4270-be24-38e8d4fcf589}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="mesh\platform\sdl"> | |||||
<UniqueIdentifier>{4089421f-2cc2-4036-a6b2-9df8a2f4efc8}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="mesh\platform\xbox"> | |||||
<UniqueIdentifier>{317cb5cc-5dcc-4e14-be90-40a125a2e2ec}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="mesh\platform\d3d9"> | |||||
<UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier> | |||||
</Filter> | |||||
<Filter Include="mesh\platform\ps3"> | |||||
<UniqueIdentifier>{c6c6b597-ed6c-4d82-a166-964beeeeb525}</UniqueIdentifier> | |||||
</Filter> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ClCompile Include="image\image.cpp"> | <ClCompile Include="image\image.cpp"> | ||||
@@ -94,10 +94,10 @@ | |||||
<Filter>debug</Filter> | <Filter>debug</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\sdl\sdlapp.cpp"> | <ClCompile Include="platform\sdl\sdlapp.cpp"> | ||||
<Filter>platform\sdl</Filter> | |||||
<Filter>mesh\platform\sdl</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\sdl\sdlinput.cpp"> | <ClCompile Include="platform\sdl\sdlinput.cpp"> | ||||
<Filter>platform\sdl</Filter> | |||||
<Filter>mesh\platform\sdl</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="math\half.cpp"> | <ClCompile Include="math\half.cpp"> | ||||
<Filter>math</Filter> | <Filter>math</Filter> | ||||
@@ -151,10 +151,10 @@ | |||||
<Filter>image\codec</Filter> | <Filter>image\codec</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\xbox\xboxapp.cpp"> | <ClCompile Include="platform\xbox\xboxapp.cpp"> | ||||
<Filter>platform\xbox</Filter> | |||||
<Filter>mesh\platform\xbox</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\xbox\xboxinput.cpp"> | <ClCompile Include="platform\xbox\xboxinput.cpp"> | ||||
<Filter>platform\xbox</Filter> | |||||
<Filter>mesh\platform\xbox</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="gpu\indexbuffer.cpp"> | <ClCompile Include="gpu\indexbuffer.cpp"> | ||||
<Filter>gpu</Filter> | <Filter>gpu</Filter> | ||||
@@ -162,14 +162,8 @@ | |||||
<ClCompile Include="input\input.cpp"> | <ClCompile Include="input\input.cpp"> | ||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="input\keyboard.cpp"> | |||||
<Filter>input</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="input\stick.cpp"> | |||||
<Filter>input</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="platform\d3d9\d3d9input.cpp"> | <ClCompile Include="platform\d3d9\d3d9input.cpp"> | ||||
<Filter>platform\d3d9</Filter> | |||||
<Filter>mesh\platform\d3d9</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="audio.cpp"> | <ClCompile Include="audio.cpp"> | ||||
<Filter>...</Filter> | <Filter>...</Filter> | ||||
@@ -268,10 +262,10 @@ | |||||
<Filter>generated</Filter> | <Filter>generated</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\ps3\ps3app.cpp"> | <ClCompile Include="platform\ps3\ps3app.cpp"> | ||||
<Filter>platform\ps3</Filter> | |||||
<Filter>mesh\platform\ps3</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="platform\ps3\ps3input.cpp"> | <ClCompile Include="platform\ps3\ps3input.cpp"> | ||||
<Filter>platform\ps3</Filter> | |||||
<Filter>mesh\platform\ps3</Filter> | |||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="gpu\lolfx-compiler.cpp"> | <ClCompile Include="gpu\lolfx-compiler.cpp"> | ||||
<Filter>gpu</Filter> | <Filter>gpu</Filter> | ||||
@@ -315,9 +309,6 @@ | |||||
<ClCompile Include="input\controller.cpp"> | <ClCompile Include="input\controller.cpp"> | ||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="input\inputdevice.cpp"> | |||||
<Filter>input</Filter> | |||||
</ClCompile> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ClInclude Include="debug\fps.h"> | <ClInclude Include="debug\fps.h"> | ||||
@@ -330,10 +321,10 @@ | |||||
<Filter>debug</Filter> | <Filter>debug</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\sdl\sdlinput.h"> | <ClInclude Include="platform\sdl\sdlinput.h"> | ||||
<Filter>platform\sdl</Filter> | |||||
<Filter>mesh\platform\sdl</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\sdl\sdlapp.h"> | <ClInclude Include="platform\sdl\sdlapp.h"> | ||||
<Filter>platform\sdl</Filter> | |||||
<Filter>mesh\platform\sdl</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="lol\image\color.h"> | <ClInclude Include="lol\image\color.h"> | ||||
<Filter>lol\image</Filter> | <Filter>lol\image</Filter> | ||||
@@ -369,22 +360,16 @@ | |||||
<Filter>image</Filter> | <Filter>image</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\xbox\xboxapp.h"> | <ClInclude Include="platform\xbox\xboxapp.h"> | ||||
<Filter>platform\xbox</Filter> | |||||
<Filter>mesh\platform\xbox</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\xbox\xboxinput.h"> | <ClInclude Include="platform\xbox\xboxinput.h"> | ||||
<Filter>platform\xbox</Filter> | |||||
<Filter>mesh\platform\xbox</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="input\input.h"> | <ClInclude Include="input\input.h"> | ||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="input\keyboard.h"> | |||||
<Filter>input</Filter> | |||||
</ClInclude> | |||||
<ClInclude Include="input\stick.h"> | |||||
<Filter>input</Filter> | |||||
</ClInclude> | |||||
<ClInclude Include="platform\d3d9\d3d9input.h"> | <ClInclude Include="platform\d3d9\d3d9input.h"> | ||||
<Filter>platform\d3d9</Filter> | |||||
<Filter>mesh\platform\d3d9</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="audio.h"> | <ClInclude Include="audio.h"> | ||||
<Filter>...</Filter> | <Filter>...</Filter> | ||||
@@ -501,13 +486,13 @@ | |||||
<Filter>gpu</Filter> | <Filter>gpu</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\ps3\ps3app.h"> | <ClInclude Include="platform\ps3\ps3app.h"> | ||||
<Filter>platform\ps3</Filter> | |||||
<Filter>mesh\platform\ps3</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\ps3\ps3input.h"> | <ClInclude Include="platform\ps3\ps3input.h"> | ||||
<Filter>platform\ps3</Filter> | |||||
<Filter>mesh\platform\ps3</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="platform\ps3\threadbase.h"> | <ClInclude Include="platform\ps3\threadbase.h"> | ||||
<Filter>platform\ps3</Filter> | |||||
<Filter>mesh\platform\ps3</Filter> | |||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="map.h"> | <ClInclude Include="map.h"> | ||||
<Filter>src\...</Filter> | <Filter>src\...</Filter> | ||||
@@ -614,16 +599,13 @@ | |||||
<ClInclude Include="lol\image\image.h"> | <ClInclude Include="lol\image\image.h"> | ||||
<Filter>lol\image</Filter> | <Filter>lol\image</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="input\inputdevice.h"> | |||||
<Filter>input</Filter> | |||||
</ClInclude> | |||||
<ClInclude Include="input\keys.h"> | <ClInclude Include="input\keys.h"> | ||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="input\inputdevice_internal.h"> | |||||
<ClInclude Include="input\controller.h"> | |||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="input\controller.h"> | |||||
<ClInclude Include="input\input_internal.h"> | |||||
<Filter>input</Filter> | <Filter>input</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -20,9 +20,7 @@ | |||||
#include "core.h" | #include "core.h" | ||||
#include "d3d9input.h" | #include "d3d9input.h" | ||||
#ifdef LOL_INPUT_V2 | |||||
#include "input/inputdevice_internal.h" | |||||
#endif // LOL_INPUT_V2 | |||||
#include "input/input_internal.h" | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -37,11 +35,7 @@ class D3d9InputData | |||||
private: | private: | ||||
#if defined USE_XINPUT | #if defined USE_XINPUT | ||||
#if defined LOL_INPUT_V2 | |||||
Array<int, InputDeviceInternal*> m_joysticks; | Array<int, InputDeviceInternal*> m_joysticks; | ||||
#else | |||||
Array<int, Stick *> m_joysticks; | |||||
#endif // LOL_INPUT_V2 | |||||
#endif // USE_XINPUT | #endif // USE_XINPUT | ||||
}; | }; | ||||
@@ -58,7 +52,6 @@ D3d9Input::D3d9Input() | |||||
XINPUT_STATE state; | XINPUT_STATE state; | ||||
if (XInputGetState(i, &state) != ERROR_SUCCESS) | if (XInputGetState(i, &state) != ERROR_SUCCESS) | ||||
continue; | continue; | ||||
#if defined LOL_INPUT_V2 | |||||
// TODO: we can put more friendly name here, such as LeftAxisX, ButtonX... | // TODO: we can put more friendly name here, such as LeftAxisX, ButtonX... | ||||
InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | ||||
for (int j = 0; j < 4; ++j) | for (int j = 0; j < 4; ++j) | ||||
@@ -67,12 +60,6 @@ D3d9Input::D3d9Input() | |||||
stick->AddKey(String::Printf("Button%d", j+1).C()); | stick->AddKey(String::Printf("Button%d", j+1).C()); | ||||
m_data->m_joysticks.Push(i, stick); | m_data->m_joysticks.Push(i, stick); | ||||
#else | |||||
Stick *stick = Input::CreateStick(); | |||||
stick->SetAxisCount(4); | |||||
stick->SetButtonCount(16); | |||||
m_data->m_joysticks.Push(i, stick); | |||||
#endif // LOL_INPUT_V2 | |||||
} | } | ||||
#endif | #endif | ||||
@@ -85,11 +72,7 @@ D3d9Input::~D3d9Input() | |||||
/* Unregister all the joysticks we added */ | /* Unregister all the joysticks we added */ | ||||
while (m_data->m_joysticks.Count()) | while (m_data->m_joysticks.Count()) | ||||
{ | { | ||||
#if defined LOL_INPUT_V2 | |||||
delete m_data->m_joysticks[0].m2; | delete m_data->m_joysticks[0].m2; | ||||
#else | |||||
Input::DestroyStick(m_data->m_joysticks[0].m2); | |||||
#endif // LOL_INPUT_V2 | |||||
m_data->m_joysticks.Remove(0); | m_data->m_joysticks.Remove(0); | ||||
} | } | ||||
#endif | #endif | ||||
@@ -118,11 +101,7 @@ void D3d9Input::TickDraw(float seconds) | |||||
m_data->m_joysticks[i].m2->SetAxis(3, -(float)state.Gamepad.sThumbRY / 32768.f); | m_data->m_joysticks[i].m2->SetAxis(3, -(float)state.Gamepad.sThumbRY / 32768.f); | ||||
for (int b = 0; b < 16; b++) | for (int b = 0; b < 16; b++) | ||||
#if defined LOL_INPUT_V2 | |||||
m_data->m_joysticks[i].m2->SetKey(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | m_data->m_joysticks[i].m2->SetKey(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | ||||
#else | |||||
m_data->m_joysticks[i].m2->SetButton(b, ((uint16_t)(state.Gamepad.wButtons) >> b) & 1); | |||||
#endif // LOL_INPUT_V2 | |||||
} | } | ||||
#endif | #endif | ||||
} | } | ||||
@@ -66,11 +66,9 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||||
} | } | ||||
# ifdef LOL_INPUT_V2 | |||||
const SDL_VideoInfo* vidinfo = SDL_GetVideoInfo(); | const SDL_VideoInfo* vidinfo = SDL_GetVideoInfo(); | ||||
int screen_w = vidinfo->current_w; | int screen_w = vidinfo->current_w; | ||||
int screen_h = vidinfo->current_h; | int screen_h = vidinfo->current_h; | ||||
# endif | |||||
# if defined USE_D3D9 | # if defined USE_D3D9 | ||||
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0); | SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0); | ||||
@@ -83,9 +81,8 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
# else | # else | ||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | ||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); | SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); | ||||
# ifdef LOL_INPUT_V2 | |||||
// TODO: when implementing fullscreen, be sure to overwrite screen_w and screen_h with the value of vidinfo after the call to SDL_SetVideoMode | |||||
# endif | |||||
// TODO: when implementing fullscreen, be sure to overwrite screen_w and screen_h with the value of vidinfo after the call to SDL_SetVideoMode | |||||
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | ||||
# endif | # endif | ||||
if (!video) | if (!video) | ||||
@@ -109,11 +106,7 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||||
new D3d9Input(); | new D3d9Input(); | ||||
# endif | # endif | ||||
# ifdef LOL_INPUT_V2 | |||||
new SdlInput(video->w, video->h, screen_w, screen_h); | new SdlInput(video->w, video->h, screen_w, screen_h); | ||||
# else | |||||
new SdlInput(); | |||||
# endif | |||||
#endif | #endif | ||||
} | } | ||||
@@ -23,9 +23,7 @@ | |||||
#include "core.h" | #include "core.h" | ||||
#include "sdlinput.h" | #include "sdlinput.h" | ||||
#ifdef LOL_INPUT_V2 | |||||
#include "input/inputdevice_internal.h" | |||||
#endif // LOL_INPUT_V2 | |||||
#include "input/input_internal.h" | |||||
/* We force joystick polling because no events are received when | /* We force joystick polling because no events are received when | ||||
* there is no SDL display (eg. on the Raspberry Pi). */ | * there is no SDL display (eg. on the Raspberry Pi). */ | ||||
@@ -49,7 +47,6 @@ private: | |||||
static void SetMousePos(ivec2 position); | static void SetMousePos(ivec2 position); | ||||
#if USE_SDL | #if USE_SDL | ||||
# ifdef LOL_INPUT_V2 | |||||
SdlInputData(int app_w, int app_h, int screen_w, int screen_h) : | SdlInputData(int app_w, int app_h, int screen_w, int screen_h) : | ||||
m_prevmouse(ivec2(0)), | m_prevmouse(ivec2(0)), | ||||
m_app_w((float)app_w), | m_app_w((float)app_w), | ||||
@@ -68,9 +65,6 @@ private: | |||||
float m_screen_w; | float m_screen_w; | ||||
float m_screen_h; | float m_screen_h; | ||||
bool m_mousecapture; | bool m_mousecapture; | ||||
# else | |||||
Array<SDL_Joystick *, Stick *> m_joysticks; | |||||
# endif // LOL_INPUT_V2 | |||||
#endif // USE_SDL | #endif // USE_SDL | ||||
}; | }; | ||||
@@ -78,13 +72,8 @@ private: | |||||
* Public SdlInput class | * Public SdlInput class | ||||
*/ | */ | ||||
#ifdef LOL_INPUT_V2 | |||||
SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | ||||
: m_data(new SdlInputData(app_w, app_h, screen_w, screen_h)) | : m_data(new SdlInputData(app_w, app_h, screen_w, screen_h)) | ||||
#else | |||||
SdlInput::SdlInput() | |||||
: m_data(new SdlInputData()) | |||||
#endif | |||||
{ | { | ||||
#if USE_SDL | #if USE_SDL | ||||
/* Enable Unicode translation of keyboard events */ | /* Enable Unicode translation of keyboard events */ | ||||
@@ -99,10 +88,8 @@ SdlInput::SdlInput() | |||||
SDL_JoystickEventState(SDL_ENABLE); | SDL_JoystickEventState(SDL_ENABLE); | ||||
# endif | # endif | ||||
#ifdef LOL_INPUT_V2 | |||||
m_data->m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | m_data->m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | ||||
m_data->m_mouse = InputDeviceInternal::CreateStandardMouse(); | m_data->m_mouse = InputDeviceInternal::CreateStandardMouse(); | ||||
#endif | |||||
/* Register all the joysticks we can find, and let the input | /* Register all the joysticks we can find, and let the input | ||||
* system decide what it wants to track. */ | * system decide what it wants to track. */ | ||||
@@ -125,7 +112,6 @@ SdlInput::SdlInput() | |||||
continue; | continue; | ||||
} | } | ||||
# ifdef LOL_INPUT_V2 | |||||
InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | InputDeviceInternal* stick = new InputDeviceInternal(String::Printf("Joystick%d", i+1).C()); | ||||
for (int j = 0; j < SDL_JoystickNumAxes(sdlstick); ++j) | for (int j = 0; j < SDL_JoystickNumAxes(sdlstick); ++j) | ||||
stick->AddAxis(String::Printf("Axis%d", j + 1).C()); | stick->AddAxis(String::Printf("Axis%d", j + 1).C()); | ||||
@@ -133,17 +119,6 @@ SdlInput::SdlInput() | |||||
stick->AddKey(String::Printf("Button%d", j + 1).C()); | stick->AddKey(String::Printf("Button%d", j + 1).C()); | ||||
m_data->m_joysticks.Push(sdlstick, stick); | m_data->m_joysticks.Push(sdlstick, stick); | ||||
# else // !LOL_INPUT_V2 | |||||
Stick *stick = Input::CreateStick(); | |||||
stick->SetAxisCount(SDL_JoystickNumAxes(sdlstick)); | |||||
stick->SetButtonCount(SDL_JoystickNumButtons(sdlstick)); | |||||
/* It's possible to remap axes */ | |||||
//stick->RemapAxis(4, 2); | |||||
//stick->RemapAxis(2, 4); | |||||
m_data->m_joysticks.Push(sdlstick, stick); | |||||
# endif | |||||
} | } | ||||
# endif | # endif | ||||
#endif | #endif | ||||
@@ -158,11 +133,7 @@ SdlInput::~SdlInput() | |||||
while (m_data->m_joysticks.Count()) | while (m_data->m_joysticks.Count()) | ||||
{ | { | ||||
SDL_JoystickClose(m_data->m_joysticks[0].m1); | SDL_JoystickClose(m_data->m_joysticks[0].m1); | ||||
# ifdef LOL_INPUT_V2 | |||||
delete m_data->m_joysticks[0].m2; | delete m_data->m_joysticks[0].m2; | ||||
# else | |||||
Input::DestroyStick(m_data->m_joysticks[0].m2); | |||||
# endif | |||||
m_data->m_joysticks.Remove(0); | m_data->m_joysticks.Remove(0); | ||||
} | } | ||||
#endif | #endif | ||||
@@ -195,18 +166,10 @@ void SdlInputData::Tick(float seconds) | |||||
SDL_JoystickUpdate(); | SDL_JoystickUpdate(); | ||||
for (int j = 0; j < m_joysticks.Count(); j++) | for (int j = 0; j < m_joysticks.Count(); j++) | ||||
{ | { | ||||
# ifdef LOL_INPUT_V2 | |||||
for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | ||||
m_joysticks[j].m2->SetKey(i, SDL_JoystickGetButton(m_joysticks[j].m1, i) != 0); | m_joysticks[j].m2->SetKey(i, SDL_JoystickGetButton(m_joysticks[j].m1, i) != 0); | ||||
for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | ||||
m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | ||||
# else // !LOL_INPUT_V2 | |||||
for (int i = 0; i < SDL_JoystickNumButtons(m_joysticks[j].m1); i++) | |||||
m_joysticks[j].m2->SetButton(i, SDL_JoystickGetButton(m_joysticks[j].m1, i)); | |||||
for (int i = 0; i < SDL_JoystickNumAxes(m_joysticks[j].m1); i++) | |||||
m_joysticks[j].m2->SetAxis(i, (float)SDL_JoystickGetAxis(m_joysticks[j].m1, i) / 32768.f); | |||||
# endif | |||||
} | } | ||||
# endif | # endif | ||||
@@ -228,19 +191,11 @@ void SdlInputData::Tick(float seconds) | |||||
case SDL_MOUSEBUTTONDOWN: | case SDL_MOUSEBUTTONDOWN: | ||||
case SDL_MOUSEBUTTONUP: | case SDL_MOUSEBUTTONUP: | ||||
{ | { | ||||
#ifdef LOL_INPUT_V2 | |||||
m_mouse->SetKey(event.button.button - 1, event.type == SDL_MOUSEBUTTONDOWN); | m_mouse->SetKey(event.button.button - 1, event.type == SDL_MOUSEBUTTONDOWN); | ||||
#else // !LOL_INPUT_V2 | |||||
if (event.type == SDL_MOUSEBUTTONDOWN) | |||||
Input::SetMouseButton(event.button.button - 1); | |||||
else | |||||
Input::UnsetMouseButton(event.button.button - 1); | |||||
#endif // LOL_INPUT_V2 | |||||
break; | break; | ||||
} | } | ||||
# if !SDL_FORCE_POLL_JOYSTICK | # if !SDL_FORCE_POLL_JOYSTICK | ||||
# ifdef LOL_INPUT_V2 | |||||
case SDL_JOYAXISMOTION: | case SDL_JOYAXISMOTION: | ||||
m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | ||||
break; | break; | ||||
@@ -249,23 +204,12 @@ void SdlInputData::Tick(float seconds) | |||||
case SDL_JOYBUTTONDOWN: | case SDL_JOYBUTTONDOWN: | ||||
m_joysticks[event.jbutton.which].m2->SetKey(event.jbutton.button, event.jbutton.state); | m_joysticks[event.jbutton.which].m2->SetKey(event.jbutton.button, event.jbutton.state); | ||||
break; | break; | ||||
# else // !LOL_INPUT_V2 | |||||
case SDL_JOYAXISMOTION: | |||||
m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | |||||
break; | |||||
case SDL_JOYBUTTONUP: | |||||
case SDL_JOYBUTTONDOWN: | |||||
m_joysticks[event.jbutton.which].m2->SetButton(event.jbutton.button, event.jbutton.state); | |||||
break; | |||||
# endif // LOL_INPUT_V2 | |||||
# endif | # endif | ||||
} | } | ||||
} | } | ||||
/* Handle mouse input */ | /* Handle mouse input */ | ||||
ivec2 mouse = SdlInputData::GetMousePos(); | ivec2 mouse = SdlInputData::GetMousePos(); | ||||
# ifdef LOL_INPUT_V2 | |||||
if (InputDeviceInternal::GetMouseCapture() != m_mousecapture) | if (InputDeviceInternal::GetMouseCapture() != m_mousecapture) | ||||
{ | { | ||||
m_mousecapture = InputDeviceInternal::GetMouseCapture(); | m_mousecapture = InputDeviceInternal::GetMouseCapture(); | ||||
@@ -289,10 +233,6 @@ void SdlInputData::Tick(float seconds) | |||||
m_prevmouse = mouse; | m_prevmouse = mouse; | ||||
# else // !LOL_INPUT_V2 | |||||
Input::SetMousePos(mouse); | |||||
# endif // LOL_INPUT_V2 | |||||
# if SDL_VERSION_ATLEAST(1,3,0) | # if SDL_VERSION_ATLEAST(1,3,0) | ||||
Uint8 *sdlstate = SDL_GetKeyboardState(nullptr); | Uint8 *sdlstate = SDL_GetKeyboardState(nullptr); | ||||
# else | # else | ||||
@@ -300,262 +240,12 @@ void SdlInputData::Tick(float seconds) | |||||
# endif | # endif | ||||
int keyindex = 0; | int keyindex = 0; | ||||
# ifdef LOL_INPUT_V2 | |||||
# define KEY_FUNC(name, index) \ | # define KEY_FUNC(name, index) \ | ||||
m_keyboard->SetKey(keyindex++, sdlstate[index] != 0); | m_keyboard->SetKey(keyindex++, sdlstate[index] != 0); | ||||
/* FIXME: we ignore SDLK_WORLD_0, which means our list of | /* FIXME: we ignore SDLK_WORLD_0, which means our list of | ||||
* keys and SDL's list of keys could be out of sync. */ | * keys and SDL's list of keys could be out of sync. */ | ||||
# include "input/keys.h" | |||||
# undef KEY_FUNC | |||||
# else // !LOL_INPUT_V2 | |||||
/* Send the whole keyboard state to the input system */ | |||||
Array<uint8_t> &lolstate = Input::GetKeyboardState(); | |||||
lolstate[Key::Unknown] = sdlstate[SDLK_UNKNOWN]; | |||||
lolstate[Key::Backspace] = sdlstate[SDLK_BACKSPACE]; | |||||
lolstate[Key::Tab] = sdlstate[SDLK_TAB]; | |||||
lolstate[Key::Clear] = sdlstate[SDLK_CLEAR]; | |||||
lolstate[Key::Return] = sdlstate[SDLK_RETURN]; | |||||
lolstate[Key::Pause] = sdlstate[SDLK_PAUSE]; | |||||
lolstate[Key::Escape] = sdlstate[SDLK_ESCAPE]; | |||||
lolstate[Key::Space] = sdlstate[SDLK_SPACE]; | |||||
lolstate[Key::Exclaim] = sdlstate[SDLK_EXCLAIM]; | |||||
lolstate[Key::DoubleQuote] = sdlstate[SDLK_QUOTEDBL]; | |||||
lolstate[Key::Hash] = sdlstate[SDLK_HASH]; | |||||
lolstate[Key::Dollar] = sdlstate[SDLK_DOLLAR]; | |||||
lolstate[Key::Ampersand] = sdlstate[SDLK_AMPERSAND]; | |||||
lolstate[Key::Quote] = sdlstate[SDLK_QUOTE]; | |||||
lolstate[Key::LeftParen] = sdlstate[SDLK_LEFTPAREN]; | |||||
lolstate[Key::RightParen] = sdlstate[SDLK_RIGHTPAREN]; | |||||
lolstate[Key::Asterisk] = sdlstate[SDLK_ASTERISK]; | |||||
lolstate[Key::Plus] = sdlstate[SDLK_PLUS]; | |||||
lolstate[Key::Comma] = sdlstate[SDLK_COMMA]; | |||||
lolstate[Key::Minus] = sdlstate[SDLK_MINUS]; | |||||
lolstate[Key::Period] = sdlstate[SDLK_PERIOD]; | |||||
lolstate[Key::Slash] = sdlstate[SDLK_SLASH]; | |||||
lolstate[Key::K0] = sdlstate[SDLK_0]; | |||||
lolstate[Key::K1] = sdlstate[SDLK_1]; | |||||
lolstate[Key::K2] = sdlstate[SDLK_2]; | |||||
lolstate[Key::K3] = sdlstate[SDLK_3]; | |||||
lolstate[Key::K4] = sdlstate[SDLK_4]; | |||||
lolstate[Key::K5] = sdlstate[SDLK_5]; | |||||
lolstate[Key::K6] = sdlstate[SDLK_6]; | |||||
lolstate[Key::K7] = sdlstate[SDLK_7]; | |||||
lolstate[Key::K8] = sdlstate[SDLK_8]; | |||||
lolstate[Key::K9] = sdlstate[SDLK_9]; | |||||
lolstate[Key::Colon] = sdlstate[SDLK_COLON]; | |||||
lolstate[Key::Semicolon] = sdlstate[SDLK_SEMICOLON]; | |||||
lolstate[Key::Less] = sdlstate[SDLK_LESS]; | |||||
lolstate[Key::Equals] = sdlstate[SDLK_EQUALS]; | |||||
lolstate[Key::Greater] = sdlstate[SDLK_GREATER]; | |||||
lolstate[Key::Question] = sdlstate[SDLK_QUESTION]; | |||||
lolstate[Key::At] = sdlstate[SDLK_AT]; | |||||
lolstate[Key::LeftBracket] = sdlstate[SDLK_LEFTBRACKET]; | |||||
lolstate[Key::BackSlash] = sdlstate[SDLK_BACKSLASH]; | |||||
lolstate[Key::RightBracket] = sdlstate[SDLK_RIGHTBRACKET]; | |||||
lolstate[Key::Caret] = sdlstate[SDLK_CARET]; | |||||
lolstate[Key::Underscore] = sdlstate[SDLK_UNDERSCORE]; | |||||
lolstate[Key::Backquote] = sdlstate[SDLK_BACKQUOTE]; | |||||
lolstate[Key::A] = sdlstate[SDLK_a]; | |||||
lolstate[Key::B] = sdlstate[SDLK_b]; | |||||
lolstate[Key::C] = sdlstate[SDLK_c]; | |||||
lolstate[Key::D] = sdlstate[SDLK_d]; | |||||
lolstate[Key::E] = sdlstate[SDLK_e]; | |||||
lolstate[Key::F] = sdlstate[SDLK_f]; | |||||
lolstate[Key::G] = sdlstate[SDLK_g]; | |||||
lolstate[Key::H] = sdlstate[SDLK_h]; | |||||
lolstate[Key::I] = sdlstate[SDLK_i]; | |||||
lolstate[Key::J] = sdlstate[SDLK_j]; | |||||
lolstate[Key::K] = sdlstate[SDLK_k]; | |||||
lolstate[Key::L] = sdlstate[SDLK_l]; | |||||
lolstate[Key::M] = sdlstate[SDLK_m]; | |||||
lolstate[Key::N] = sdlstate[SDLK_n]; | |||||
lolstate[Key::O] = sdlstate[SDLK_o]; | |||||
lolstate[Key::P] = sdlstate[SDLK_p]; | |||||
lolstate[Key::Q] = sdlstate[SDLK_q]; | |||||
lolstate[Key::R] = sdlstate[SDLK_r]; | |||||
lolstate[Key::S] = sdlstate[SDLK_s]; | |||||
lolstate[Key::T] = sdlstate[SDLK_t]; | |||||
lolstate[Key::U] = sdlstate[SDLK_u]; | |||||
lolstate[Key::V] = sdlstate[SDLK_v]; | |||||
lolstate[Key::W] = sdlstate[SDLK_w]; | |||||
lolstate[Key::X] = sdlstate[SDLK_x]; | |||||
lolstate[Key::Y] = sdlstate[SDLK_y]; | |||||
lolstate[Key::Z] = sdlstate[SDLK_z]; | |||||
lolstate[Key::Delete] = sdlstate[SDLK_DELETE]; | |||||
#if SDLK_WORLD_0 | |||||
lolstate[Key::World0] = sdlstate[SDLK_WORLD_0]; | |||||
lolstate[Key::World1] = sdlstate[SDLK_WORLD_1]; | |||||
lolstate[Key::World2] = sdlstate[SDLK_WORLD_2]; | |||||
lolstate[Key::World3] = sdlstate[SDLK_WORLD_3]; | |||||
lolstate[Key::World4] = sdlstate[SDLK_WORLD_4]; | |||||
lolstate[Key::World5] = sdlstate[SDLK_WORLD_5]; | |||||
lolstate[Key::World6] = sdlstate[SDLK_WORLD_6]; | |||||
lolstate[Key::World7] = sdlstate[SDLK_WORLD_7]; | |||||
lolstate[Key::World8] = sdlstate[SDLK_WORLD_8]; | |||||
lolstate[Key::World9] = sdlstate[SDLK_WORLD_9]; | |||||
lolstate[Key::World10] = sdlstate[SDLK_WORLD_10]; | |||||
lolstate[Key::World11] = sdlstate[SDLK_WORLD_11]; | |||||
lolstate[Key::World12] = sdlstate[SDLK_WORLD_12]; | |||||
lolstate[Key::World13] = sdlstate[SDLK_WORLD_13]; | |||||
lolstate[Key::World14] = sdlstate[SDLK_WORLD_14]; | |||||
lolstate[Key::World15] = sdlstate[SDLK_WORLD_15]; | |||||
lolstate[Key::World16] = sdlstate[SDLK_WORLD_16]; | |||||
lolstate[Key::World17] = sdlstate[SDLK_WORLD_17]; | |||||
lolstate[Key::World18] = sdlstate[SDLK_WORLD_18]; | |||||
lolstate[Key::World19] = sdlstate[SDLK_WORLD_19]; | |||||
lolstate[Key::World20] = sdlstate[SDLK_WORLD_20]; | |||||
lolstate[Key::World21] = sdlstate[SDLK_WORLD_21]; | |||||
lolstate[Key::World22] = sdlstate[SDLK_WORLD_22]; | |||||
lolstate[Key::World23] = sdlstate[SDLK_WORLD_23]; | |||||
lolstate[Key::World24] = sdlstate[SDLK_WORLD_24]; | |||||
lolstate[Key::World25] = sdlstate[SDLK_WORLD_25]; | |||||
lolstate[Key::World26] = sdlstate[SDLK_WORLD_26]; | |||||
lolstate[Key::World27] = sdlstate[SDLK_WORLD_27]; | |||||
lolstate[Key::World28] = sdlstate[SDLK_WORLD_28]; | |||||
lolstate[Key::World29] = sdlstate[SDLK_WORLD_29]; | |||||
lolstate[Key::World30] = sdlstate[SDLK_WORLD_30]; | |||||
lolstate[Key::World31] = sdlstate[SDLK_WORLD_31]; | |||||
lolstate[Key::World32] = sdlstate[SDLK_WORLD_32]; | |||||
lolstate[Key::World33] = sdlstate[SDLK_WORLD_33]; | |||||
lolstate[Key::World34] = sdlstate[SDLK_WORLD_34]; | |||||
lolstate[Key::World35] = sdlstate[SDLK_WORLD_35]; | |||||
lolstate[Key::World36] = sdlstate[SDLK_WORLD_36]; | |||||
lolstate[Key::World37] = sdlstate[SDLK_WORLD_37]; | |||||
lolstate[Key::World38] = sdlstate[SDLK_WORLD_38]; | |||||
lolstate[Key::World39] = sdlstate[SDLK_WORLD_39]; | |||||
lolstate[Key::World40] = sdlstate[SDLK_WORLD_40]; | |||||
lolstate[Key::World41] = sdlstate[SDLK_WORLD_41]; | |||||
lolstate[Key::World42] = sdlstate[SDLK_WORLD_42]; | |||||
lolstate[Key::World43] = sdlstate[SDLK_WORLD_43]; | |||||
lolstate[Key::World44] = sdlstate[SDLK_WORLD_44]; | |||||
lolstate[Key::World45] = sdlstate[SDLK_WORLD_45]; | |||||
lolstate[Key::World46] = sdlstate[SDLK_WORLD_46]; | |||||
lolstate[Key::World47] = sdlstate[SDLK_WORLD_47]; | |||||
lolstate[Key::World48] = sdlstate[SDLK_WORLD_48]; | |||||
lolstate[Key::World49] = sdlstate[SDLK_WORLD_49]; | |||||
lolstate[Key::World50] = sdlstate[SDLK_WORLD_50]; | |||||
lolstate[Key::World51] = sdlstate[SDLK_WORLD_51]; | |||||
lolstate[Key::World52] = sdlstate[SDLK_WORLD_52]; | |||||
lolstate[Key::World53] = sdlstate[SDLK_WORLD_53]; | |||||
lolstate[Key::World54] = sdlstate[SDLK_WORLD_54]; | |||||
lolstate[Key::World55] = sdlstate[SDLK_WORLD_55]; | |||||
lolstate[Key::World56] = sdlstate[SDLK_WORLD_56]; | |||||
lolstate[Key::World57] = sdlstate[SDLK_WORLD_57]; | |||||
lolstate[Key::World58] = sdlstate[SDLK_WORLD_58]; | |||||
lolstate[Key::World59] = sdlstate[SDLK_WORLD_59]; | |||||
lolstate[Key::World60] = sdlstate[SDLK_WORLD_60]; | |||||
lolstate[Key::World61] = sdlstate[SDLK_WORLD_61]; | |||||
lolstate[Key::World62] = sdlstate[SDLK_WORLD_62]; | |||||
lolstate[Key::World63] = sdlstate[SDLK_WORLD_63]; | |||||
lolstate[Key::World64] = sdlstate[SDLK_WORLD_64]; | |||||
lolstate[Key::World65] = sdlstate[SDLK_WORLD_65]; | |||||
lolstate[Key::World66] = sdlstate[SDLK_WORLD_66]; | |||||
lolstate[Key::World67] = sdlstate[SDLK_WORLD_67]; | |||||
lolstate[Key::World68] = sdlstate[SDLK_WORLD_68]; | |||||
lolstate[Key::World69] = sdlstate[SDLK_WORLD_69]; | |||||
lolstate[Key::World70] = sdlstate[SDLK_WORLD_70]; | |||||
lolstate[Key::World71] = sdlstate[SDLK_WORLD_71]; | |||||
lolstate[Key::World72] = sdlstate[SDLK_WORLD_72]; | |||||
lolstate[Key::World73] = sdlstate[SDLK_WORLD_73]; | |||||
lolstate[Key::World74] = sdlstate[SDLK_WORLD_74]; | |||||
lolstate[Key::World75] = sdlstate[SDLK_WORLD_75]; | |||||
lolstate[Key::World76] = sdlstate[SDLK_WORLD_76]; | |||||
lolstate[Key::World77] = sdlstate[SDLK_WORLD_77]; | |||||
lolstate[Key::World78] = sdlstate[SDLK_WORLD_78]; | |||||
lolstate[Key::World79] = sdlstate[SDLK_WORLD_79]; | |||||
lolstate[Key::World80] = sdlstate[SDLK_WORLD_80]; | |||||
lolstate[Key::World81] = sdlstate[SDLK_WORLD_81]; | |||||
lolstate[Key::World82] = sdlstate[SDLK_WORLD_82]; | |||||
lolstate[Key::World83] = sdlstate[SDLK_WORLD_83]; | |||||
lolstate[Key::World84] = sdlstate[SDLK_WORLD_84]; | |||||
lolstate[Key::World85] = sdlstate[SDLK_WORLD_85]; | |||||
lolstate[Key::World86] = sdlstate[SDLK_WORLD_86]; | |||||
lolstate[Key::World87] = sdlstate[SDLK_WORLD_87]; | |||||
lolstate[Key::World88] = sdlstate[SDLK_WORLD_88]; | |||||
lolstate[Key::World89] = sdlstate[SDLK_WORLD_89]; | |||||
lolstate[Key::World90] = sdlstate[SDLK_WORLD_90]; | |||||
lolstate[Key::World91] = sdlstate[SDLK_WORLD_91]; | |||||
lolstate[Key::World92] = sdlstate[SDLK_WORLD_92]; | |||||
lolstate[Key::World93] = sdlstate[SDLK_WORLD_93]; | |||||
lolstate[Key::World94] = sdlstate[SDLK_WORLD_94]; | |||||
lolstate[Key::World95] = sdlstate[SDLK_WORLD_95]; | |||||
#endif // SDLK_WORLD_0 | |||||
lolstate[Key::KP0] = sdlstate[SDLK_KP0]; | |||||
lolstate[Key::KP1] = sdlstate[SDLK_KP1]; | |||||
lolstate[Key::KP2] = sdlstate[SDLK_KP2]; | |||||
lolstate[Key::KP3] = sdlstate[SDLK_KP3]; | |||||
lolstate[Key::KP4] = sdlstate[SDLK_KP4]; | |||||
lolstate[Key::KP5] = sdlstate[SDLK_KP5]; | |||||
lolstate[Key::KP6] = sdlstate[SDLK_KP6]; | |||||
lolstate[Key::KP7] = sdlstate[SDLK_KP7]; | |||||
lolstate[Key::KP8] = sdlstate[SDLK_KP8]; | |||||
lolstate[Key::KP9] = sdlstate[SDLK_KP9]; | |||||
lolstate[Key::KPPeriod] = sdlstate[SDLK_KP_PERIOD]; | |||||
lolstate[Key::KPDivide] = sdlstate[SDLK_KP_DIVIDE]; | |||||
lolstate[Key::KPMultiply] = sdlstate[SDLK_KP_MULTIPLY]; | |||||
lolstate[Key::KPMinus] = sdlstate[SDLK_KP_MINUS]; | |||||
lolstate[Key::KPPlus] = sdlstate[SDLK_KP_PLUS]; | |||||
lolstate[Key::KPEnter] = sdlstate[SDLK_KP_ENTER]; | |||||
lolstate[Key::KPEquals] = sdlstate[SDLK_KP_EQUALS]; | |||||
lolstate[Key::Up] = sdlstate[SDLK_UP]; | |||||
lolstate[Key::Down] = sdlstate[SDLK_DOWN]; | |||||
lolstate[Key::Right] = sdlstate[SDLK_RIGHT]; | |||||
lolstate[Key::Left] = sdlstate[SDLK_LEFT]; | |||||
lolstate[Key::Insert] = sdlstate[SDLK_INSERT]; | |||||
lolstate[Key::Home] = sdlstate[SDLK_HOME]; | |||||
lolstate[Key::End] = sdlstate[SDLK_END]; | |||||
lolstate[Key::PageUp] = sdlstate[SDLK_PAGEUP]; | |||||
lolstate[Key::PageDown] = sdlstate[SDLK_PAGEDOWN]; | |||||
lolstate[Key::F1] = sdlstate[SDLK_F1]; | |||||
lolstate[Key::F2] = sdlstate[SDLK_F2]; | |||||
lolstate[Key::F3] = sdlstate[SDLK_F3]; | |||||
lolstate[Key::F4] = sdlstate[SDLK_F4]; | |||||
lolstate[Key::F5] = sdlstate[SDLK_F5]; | |||||
lolstate[Key::F6] = sdlstate[SDLK_F6]; | |||||
lolstate[Key::F7] = sdlstate[SDLK_F7]; | |||||
lolstate[Key::F8] = sdlstate[SDLK_F8]; | |||||
lolstate[Key::F9] = sdlstate[SDLK_F9]; | |||||
lolstate[Key::F10] = sdlstate[SDLK_F10]; | |||||
lolstate[Key::F11] = sdlstate[SDLK_F11]; | |||||
lolstate[Key::F12] = sdlstate[SDLK_F12]; | |||||
lolstate[Key::F13] = sdlstate[SDLK_F13]; | |||||
lolstate[Key::F14] = sdlstate[SDLK_F14]; | |||||
lolstate[Key::F15] = sdlstate[SDLK_F15]; | |||||
lolstate[Key::NumLock] = sdlstate[SDLK_NUMLOCK]; | |||||
lolstate[Key::CapsLock] = sdlstate[SDLK_CAPSLOCK]; | |||||
lolstate[Key::ScrollLock] = sdlstate[SDLK_SCROLLOCK]; | |||||
lolstate[Key::RightShift] = sdlstate[SDLK_RSHIFT]; | |||||
lolstate[Key::LeftShift] = sdlstate[SDLK_LSHIFT]; | |||||
lolstate[Key::RightCtrl] = sdlstate[SDLK_RCTRL]; | |||||
lolstate[Key::LeftCtrl] = sdlstate[SDLK_LCTRL]; | |||||
lolstate[Key::RightAlt] = sdlstate[SDLK_RALT]; | |||||
lolstate[Key::LeftAlt] = sdlstate[SDLK_LALT]; | |||||
lolstate[Key::RightMeta] = sdlstate[SDLK_RMETA]; | |||||
lolstate[Key::LeftMeta] = sdlstate[SDLK_LMETA]; | |||||
lolstate[Key::LeftSuper] = sdlstate[SDLK_LSUPER]; | |||||
lolstate[Key::RightSuper] = sdlstate[SDLK_RSUPER]; | |||||
lolstate[Key::Mode] = sdlstate[SDLK_MODE]; | |||||
lolstate[Key::Compose] = sdlstate[SDLK_COMPOSE]; | |||||
lolstate[Key::Help] = sdlstate[SDLK_HELP]; | |||||
lolstate[Key::Print] = sdlstate[SDLK_PRINT]; | |||||
lolstate[Key::SysReq] = sdlstate[SDLK_SYSREQ]; | |||||
lolstate[Key::Break] = sdlstate[SDLK_BREAK]; | |||||
lolstate[Key::Menu] = sdlstate[SDLK_MENU]; | |||||
lolstate[Key::Power] = sdlstate[SDLK_POWER]; | |||||
lolstate[Key::Euro] = sdlstate[SDLK_EURO]; | |||||
lolstate[Key::Undo] = sdlstate[SDLK_UNDO]; | |||||
UNUSED(seconds); | |||||
# endif // LOL_INPUT_V2 | |||||
# include "input/keys.h" | |||||
# undef KEY_FUNC | |||||
#endif // USE_SDL | #endif // USE_SDL | ||||
} | } | ||||
@@ -26,13 +26,10 @@ class SdlInputData; | |||||
class SdlInput : public Entity | class SdlInput : public Entity | ||||
{ | { | ||||
public: | public: | ||||
#ifdef LOL_INPUT_V2 | |||||
/** passing the screen resolution (note: not the windowed app resolution!) allows to make the mouse axis resolution-independent */ | /** passing the screen resolution (note: not the windowed app resolution!) allows to make the mouse axis resolution-independent */ | ||||
SdlInput(int app_w, int app_h, int screen_w, int screen_h); | SdlInput(int app_w, int app_h, int screen_w, int screen_h); | ||||
#else | |||||
SdlInput(); | |||||
#endif | |||||
virtual ~SdlInput(); | |||||
virtual ~SdlInput(); | |||||
void SetScreenResolution(); | void SetScreenResolution(); | ||||
protected: | protected: | ||||