Controller::WasKeyReleasedThisFrame() is now keyboard->key_released() so there is usually no need for a controller. They will completely disappear when joystick axis binding has been ported to InputDevice.legacy
@@ -77,11 +77,6 @@ void BtPhysTest::InitApp() | |||||
m_loc_dp = .0f; | m_loc_dp = .0f; | ||||
#endif //CAT_MODE | #endif //CAT_MODE | ||||
m_profile.register_default_keys(); | |||||
m_controller = new Controller("Default"); | |||||
m_controller->Init(m_profile); | |||||
Ticker::Ref(m_controller); | |||||
/* Create a camera that matches the settings of XNA BtPhysTest */ | /* Create a camera that matches the settings of XNA BtPhysTest */ | ||||
m_camera = new Camera(); | m_camera = new Camera(); | ||||
@@ -304,7 +299,6 @@ BtPhysTest::~BtPhysTest() | |||||
{ | { | ||||
Scene& scene = Scene::GetScene(); | Scene& scene = Scene::GetScene(); | ||||
scene.PopCamera(m_camera); | scene.PopCamera(m_camera); | ||||
Ticker::Unref(m_controller); | |||||
Ticker::Unref(m_light1); | Ticker::Unref(m_light1); | ||||
Ticker::Unref(m_light2); | Ticker::Unref(m_light2); | ||||
@@ -401,7 +395,7 @@ void BtPhysTest::tick_game(float seconds) | |||||
auto context = Debug::DrawContext::New(Color::white, 1.f); | auto context = Debug::DrawContext::New(Color::white, 1.f); | ||||
Debug::DrawGrid(vec3::zero, vec3::axis_x, vec3::axis_y, vec3::axis_z, 10.f); | Debug::DrawGrid(vec3::zero, vec3::axis_x, vec3::axis_y, vec3::axis_z, 10.f); | ||||
if (m_controller->WasKeyReleasedThisFrame((int)input::key::SC_Escape)) | |||||
if (input::keyboard()->key_released(input::key::SC_Escape)) | |||||
Ticker::Shutdown(); | Ticker::Shutdown(); | ||||
m_loop_value += seconds; | m_loop_value += seconds; | ||||
@@ -578,6 +572,8 @@ void BtPhysTest::tick_game(float seconds) | |||||
#if USE_CHARACTER | #if USE_CHARACTER | ||||
{ | { | ||||
auto keyboard = input::keyboard(); | |||||
for (int i = 0; i < m_character_list.count(); i++) | for (int i = 0; i < m_character_list.count(); i++) | ||||
{ | { | ||||
PhysicsObject* PhysObj = m_character_list[i]; | PhysicsObject* PhysObj = m_character_list[i]; | ||||
@@ -585,15 +581,15 @@ void BtPhysTest::tick_game(float seconds) | |||||
mat4 CtlrMx = Character->GetTransform(); | mat4 CtlrMx = Character->GetTransform(); | ||||
vec3 movement(0.f); | vec3 movement(0.f); | ||||
movement.z = (m_controller->IsKeyPressed(input::key::SC_Right) ? 1.f : 0.f) | |||||
- (m_controller->IsKeyPressed(input::key::SC_Left) ? 1.f : 0.f); | |||||
movement.x = (m_controller->IsKeyPressed(input::key::SC_Up) ? 1.f : 0.f) | |||||
- (m_controller->IsKeyPressed(input::key::SC_Down) ? 1.f : 0.f); | |||||
movement.y = (m_controller->IsKeyPressed(input::key::SC_PageUp) ? 1.f : 0.f) | |||||
- (m_controller->IsKeyPressed(input::key::SC_PageDown) ? 1.f : 0.f); | |||||
movement.z = (keyboard->key(input::key::SC_Right) ? 1.f : 0.f) | |||||
- (keyboard->key(input::key::SC_Left) ? 1.f : 0.f); | |||||
movement.x = (keyboard->key(input::key::SC_Up) ? 1.f : 0.f) | |||||
- (keyboard->key(input::key::SC_Down) ? 1.f : 0.f); | |||||
movement.y = (keyboard->key(input::key::SC_PageUp) ? 1.f : 0.f) | |||||
- (keyboard->key(input::key::SC_PageDown) ? 1.f : 0.f); | |||||
vec3 CharMove = movement * seconds * vec3(4.f, 10.f, 4.f); | vec3 CharMove = movement * seconds * vec3(4.f, 10.f, 4.f); | ||||
if (m_controller->WasKeyReleasedThisFrame(input::key::SC_Space)) | |||||
if (input::keyboard()->key_released(input::key::SC_Space)) | |||||
Character->Jump(); | Character->Jump(); | ||||
Character->SetMovementForFrame(CharMove); | Character->SetMovementForFrame(CharMove); | ||||
@@ -93,8 +93,6 @@ private: | |||||
std::shared_ptr<Shader> m_cat_shader; | std::shared_ptr<Shader> m_cat_shader; | ||||
CatShaderData* m_cat_sdata; | CatShaderData* m_cat_sdata; | ||||
Camera* m_camera; | Camera* m_camera; | ||||
Controller* m_controller; | |||||
InputProfile m_profile; | |||||
Light* m_light1; | Light* m_light1; | ||||
Light* m_light2; | Light* m_light2; | ||||
int m_init_status; | int m_init_status; | ||||
@@ -28,38 +28,13 @@ public: | |||||
{ | { | ||||
m_controller = new Controller("Default"); | m_controller = new Controller("Default"); | ||||
# ifdef OLD_SCHOOL | |||||
m_controller->SetInputCount(KEY_MAX, AXIS_MAX); | |||||
auto keyboard = input::keyboard(); | |||||
m_controller->GetKey(KEY_MANUAL_ROTATION).Bind(g_name_keyboard, "Space"); | |||||
auto mouse = input::mouse(); | |||||
if (mouse) | |||||
{ | |||||
m_controller->GetKey(KEY_DRAG_MESH).Bind(g_name_mouse, "Left"); | |||||
m_controller->GetAxis(AXIS_DRAG_PITCH).Bind(g_name_mouse, "Y"); | |||||
m_controller->GetAxis(AXIS_DRAG_YAW).Bind(g_name_mouse, "X"); | |||||
} | |||||
m_joystick = InputDevice::Get(g_name_joystick(1)); | |||||
if (m_joystick) | |||||
{ | |||||
m_controller->GetAxis(AXIS_PITCH).Bind(g_name_joystick(1), "Axis2"); | |||||
m_controller->GetAxis(AXIS_YAW).Bind(g_name_joystick(1), "Axis1"); | |||||
} | |||||
# else | |||||
m_profile | m_profile | ||||
<< InputProfile::KeyboardKey(KEY_MANUAL_ROTATION, "Space") | |||||
<< InputProfile::MouseKey(KEY_DRAG_MESH, "Left") | |||||
<< InputProfile::JoystickAxis(1, AXIS_PITCH, "Axis2") | << InputProfile::JoystickAxis(1, AXIS_PITCH, "Axis2") | ||||
<< InputProfile::JoystickAxis(1, AXIS_YAW, "Axis1") | << InputProfile::JoystickAxis(1, AXIS_YAW, "Axis1") | ||||
<< InputProfile::MouseAxis(AXIS_DRAG_PITCH, "Y") | << InputProfile::MouseAxis(AXIS_DRAG_PITCH, "Y") | ||||
<< InputProfile::MouseAxis(AXIS_DRAG_YAW, "X"); | << InputProfile::MouseAxis(AXIS_DRAG_YAW, "X"); | ||||
m_controller->Init(m_profile); | m_controller->Init(m_profile); | ||||
m_joystick = InputDevice::GetJoystick(1); | |||||
# endif //OLD_SCHOOL | |||||
m_pitch_angle = 0; | m_pitch_angle = 0; | ||||
m_yaw_angle = 0; | m_yaw_angle = 0; | ||||
@@ -103,24 +78,22 @@ public: | |||||
{ | { | ||||
WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
auto mouse = input::mouse(); | |||||
auto keyboard = input::keyboard(); | |||||
/* Handle keyboard */ | /* Handle keyboard */ | ||||
if (m_controller->WasKeyPressedThisFrame(KEY_MANUAL_ROTATION)) | |||||
if (keyboard->key_pressed(input::key::SC_Space)) | |||||
m_autorot = !m_autorot; | m_autorot = !m_autorot; | ||||
/* Handle joystick */ | /* Handle joystick */ | ||||
if (m_joystick) | |||||
{ | |||||
if (lol::abs(m_controller->GetAxisValue(AXIS_PITCH)) > 0.2f) | |||||
m_pitch_angle += m_controller->GetAxisValue(AXIS_PITCH) * seconds; | |||||
if (lol::abs(m_controller->GetAxisValue(AXIS_YAW)) > 0.2f) | |||||
m_yaw_angle += m_controller->GetAxisValue(AXIS_YAW) * seconds; | |||||
} | |||||
if (lol::abs(m_controller->GetAxisValue(AXIS_PITCH)) > 0.2f) | |||||
m_pitch_angle += m_controller->GetAxisValue(AXIS_PITCH) * seconds; | |||||
if (lol::abs(m_controller->GetAxisValue(AXIS_YAW)) > 0.2f) | |||||
m_yaw_angle += m_controller->GetAxisValue(AXIS_YAW) * seconds; | |||||
/* Handle mouse */ | /* Handle mouse */ | ||||
if (true) | if (true) | ||||
{ | { | ||||
auto mouse = input::mouse(); | |||||
if (mouse->button(input::button::BTN_Left)) | if (mouse->button(input::button::BTN_Left)) | ||||
{ | { | ||||
mouse->capture(true); | mouse->capture(true); | ||||
@@ -207,13 +180,6 @@ public: | |||||
} | } | ||||
private: | private: | ||||
enum | |||||
{ | |||||
KEY_MANUAL_ROTATION, | |||||
KEY_DRAG_MESH, | |||||
KEY_MAX | |||||
}; | |||||
enum | enum | ||||
{ | { | ||||
AXIS_DRAG_PITCH, | AXIS_DRAG_PITCH, | ||||
@@ -223,7 +189,6 @@ private: | |||||
AXIS_MAX | AXIS_MAX | ||||
}; | }; | ||||
InputDevice *m_joystick; | |||||
Controller *m_controller; | Controller *m_controller; | ||||
InputProfile m_profile; | InputProfile m_profile; | ||||
@@ -28,11 +28,6 @@ public: | |||||
for (auto &val : m_streams) | for (auto &val : m_streams) | ||||
val = -1; | val = -1; | ||||
m_controller = new Controller("Default"); | |||||
m_profile << InputProfile::KeyboardKey(0, "Space") | |||||
<< InputProfile::MouseKey(1, "Left"); | |||||
m_controller->Init(m_profile); | |||||
m_text = new Text("SPACE for sine wave, Left Click for white noise", | m_text = new Text("SPACE for sine wave, Left Click for white noise", | ||||
"data/font/ascii.png"); | "data/font/ascii.png"); | ||||
m_text->SetPos(vec3(5, 5, 1)); | m_text->SetPos(vec3(5, 5, 1)); | ||||
@@ -65,9 +60,14 @@ public: | |||||
{ | { | ||||
WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
auto mouse = input::mouse(); | |||||
auto keyboard = input::keyboard(); | |||||
for (int i = 0; i < 2; ++i) | for (int i = 0; i < 2; ++i) | ||||
{ | { | ||||
if (!m_controller->WasKeyPressedThisFrame(i)) | |||||
if (i == 0 && !keyboard->key_pressed(input::key::SC_Space)) | |||||
continue; | |||||
if (i == 1 && !mouse->button_pressed(input::button::BTN_Left)) | |||||
continue; | continue; | ||||
if (m_streams[i] < 0) | if (m_streams[i] < 0) | ||||
@@ -92,10 +92,6 @@ public: | |||||
private: | private: | ||||
int m_streams[2]; | int m_streams[2]; | ||||
Controller *m_controller; | |||||
InputProfile m_profile; | |||||
Text *m_text; | Text *m_text; | ||||
}; | }; | ||||
@@ -42,13 +42,6 @@ public: | |||||
m_texel_settings = vec4(1.0, 1.0, 2.0, 2.0) / (vec4)m_size.xyxy; | m_texel_settings = vec4(1.0, 1.0, 2.0, 2.0) / (vec4)m_size.xyxy; | ||||
m_screen_settings = vec4(1.0, 1.0, 0.5, 0.5) * (vec4)m_size.xyxy; | m_screen_settings = vec4(1.0, 1.0, 0.5, 0.5) * (vec4)m_size.xyxy; | ||||
m_controller = new Controller("Default"); | |||||
m_profile << InputProfile::MouseKey(0, "Left") | |||||
<< InputProfile::MouseKey(1, "Right") | |||||
<< InputProfile::MouseKey(2, "Middle") | |||||
<< InputProfile::KeyboardKey(3, "Space"); | |||||
m_controller->Init(m_profile); | |||||
/* Window size decides the world aspect ratio. For instance, 640×480 | /* Window size decides the world aspect ratio. For instance, 640×480 | ||||
* will be mapped to (-0.66,-0.5) - (0.66,0.5). */ | * will be mapped to (-0.66,-0.5) - (0.66,0.5). */ | ||||
m_window_size = Video::GetSize(); | m_window_size = Video::GetSize(); | ||||
@@ -157,12 +150,15 @@ public: | |||||
{ | { | ||||
WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
ivec2 mousepos = input::mouse()->get_cursor_pixel(0); | |||||
auto mouse = input::mouse(); | |||||
auto keyboard = input::keyboard(); | |||||
ivec2 mousepos = mouse->get_cursor_pixel(0); | |||||
int prev_frame = (m_frame + 4) % 4; | int prev_frame = (m_frame + 4) % 4; | ||||
m_frame = (m_frame + 1) % 4; | m_frame = (m_frame + 1) % 4; | ||||
if (m_controller->WasKeyPressedThisFrame(3)) | |||||
if (keyboard->key_pressed(input::key::SC_Space)) | |||||
{ | { | ||||
m_julia = !m_julia; | m_julia = !m_julia; | ||||
if (m_julia) | if (m_julia) | ||||
@@ -180,7 +176,7 @@ public: | |||||
rcmplx worldmouse = m_view.center + rcmplx(ScreenToWorldOffset((vec2)mousepos)); | rcmplx worldmouse = m_view.center + rcmplx(ScreenToWorldOffset((vec2)mousepos)); | ||||
if (m_controller->IsKeyPressed(2)) | |||||
if (mouse->button(input::button::BTN_Middle)) | |||||
{ | { | ||||
if (!m_drag) | if (!m_drag) | ||||
{ | { | ||||
@@ -208,8 +204,8 @@ public: | |||||
} | } | ||||
} | } | ||||
bool hold_right = m_controller->IsKeyPressed(0); | |||||
bool hold_left = m_controller->IsKeyPressed(1); | |||||
bool hold_right = mouse->button(input::button::BTN_Right); | |||||
bool hold_left = mouse->button(input::button::BTN_Left); | |||||
if ((hold_right || hold_left) && mousepos.x != -1) | if ((hold_right || hold_left) && mousepos.x != -1) | ||||
{ | { | ||||
double zoom = hold_right ? -0.5 : 0.5; | double zoom = hold_right ? -0.5 : 0.5; | ||||
@@ -564,10 +560,6 @@ private: | |||||
vec4 m_texel_settings, m_screen_settings; | vec4 m_texel_settings, m_screen_settings; | ||||
mat4 m_zoom_settings; | mat4 m_zoom_settings; | ||||
// Input support | |||||
Controller *m_controller; | |||||
InputProfile m_profile; | |||||
#if LOL_FEATURE_THREADS | #if LOL_FEATURE_THREADS | ||||
/* Worker threads */ | /* Worker threads */ | ||||
thread *m_threads[MAX_THREADS]; | thread *m_threads[MAX_THREADS]; | ||||
@@ -282,31 +282,6 @@ AxisBinding& Controller::GetAxis(int index) | |||||
return m_axis_bindings[index]; | return m_axis_bindings[index]; | ||||
} | } | ||||
// Key methods: should not go directly to binding | |||||
bool Controller::IsKeyPressed(int index) const | |||||
{ | |||||
auto key = m_key_bindings.find(index); | |||||
return key != m_key_bindings.end() && key->second.IsPressed(); | |||||
} | |||||
bool Controller::IsKeyReleased(int index) const | |||||
{ | |||||
auto key = m_key_bindings.find(index); | |||||
return key != m_key_bindings.end() && key->second.IsReleased(); | |||||
} | |||||
bool Controller::WasKeyPressedThisFrame(int index) const | |||||
{ | |||||
auto key = m_key_bindings.find(index); | |||||
return key != m_key_bindings.end() && key->second.WasPressedThisFrame(); | |||||
} | |||||
bool Controller::WasKeyReleasedThisFrame(int index) const | |||||
{ | |||||
auto key = m_key_bindings.find(index); | |||||
return key != m_key_bindings.end() && key->second.WasReleasedThisFrame(); | |||||
} | |||||
//Axis methods: should not go directly to binding ----------------------------- | //Axis methods: should not go directly to binding ----------------------------- | ||||
float Controller::GetAxisValue(int index) const | float Controller::GetAxisValue(int index) const | ||||
{ | { | ||||
@@ -30,10 +30,6 @@ protected: | |||||
bool IsPressed() const { return m_current; } | bool IsPressed() const { return m_current; } | ||||
/** Indicates wheither the key is currently up */ | /** Indicates wheither the key is currently up */ | ||||
bool IsReleased() const { return !m_current; } | bool IsReleased() const { return !m_current; } | ||||
/** Indicates wheither the key has just been pressed */ | |||||
bool WasPressedThisFrame() const { return m_current && !m_previous; } | |||||
/** Indicates wheither the key has just been released */ | |||||
bool WasReleasedThisFrame() const { return !m_current && m_previous; } | |||||
public: | public: | ||||
//Binding methods --------------------------------------------------------- | //Binding methods --------------------------------------------------------- | ||||
@@ -322,16 +318,6 @@ public: | |||||
AxisBinding& GetAxis(int index); | AxisBinding& GetAxis(int index); | ||||
AxisBinding const& GetAxis(int index) const; | AxisBinding const& GetAxis(int index) const; | ||||
/** Key methods: should not go directly to binding */ | |||||
/** Indicates wheither the key is currently down */ | |||||
bool IsKeyPressed(int index) const; | |||||
/** Indicates wheither the key is currently up */ | |||||
bool IsKeyReleased(int index) const; | |||||
/** Indicates wheither the key has just been pressed */ | |||||
bool WasKeyPressedThisFrame(int index) const; | |||||
/** Indicates wheither the key has just been released */ | |||||
bool WasKeyReleasedThisFrame(int index) const; | |||||
/** Axis methods: should not go directly to binding */ | /** Axis methods: should not go directly to binding */ | ||||
/** Gets the current absolute value of this axis */ | /** Gets the current absolute value of this axis */ | ||||
float GetAxisValue(int index) const; | float GetAxisValue(int index) const; | ||||
@@ -176,18 +176,12 @@ void SdlInput::tick(float seconds) | |||||
if (event.type == SDL_KEYDOWN) | if (event.type == SDL_KEYDOWN) | ||||
{ | { | ||||
auto sc2 = sc; | auto sc2 = sc; | ||||
switch (sc) | |||||
{ | |||||
case input::key::SC_CapsLock: | |||||
if (sc == input::key::SC_CapsLock) | |||||
sc2 = input::key::SC_CapsLockStatus; | sc2 = input::key::SC_CapsLockStatus; | ||||
break; | |||||
case input::key::SC_ScrollLock: | |||||
else if (sc == input::key::SC_ScrollLock) | |||||
sc2 = input::key::SC_ScrollLockStatus; | sc2 = input::key::SC_ScrollLockStatus; | ||||
break; | |||||
case input::key::SC_NumLockClear: | |||||
else if (sc == input::key::SC_NumLockClear) | |||||
sc2 = input::key::SC_NumLockClearStatus; | sc2 = input::key::SC_NumLockClearStatus; | ||||
break; | |||||
} | |||||
keyboard->internal_set_key(sc2, !keyboard->key(sc2)); | keyboard->internal_set_key(sc2, !keyboard->key(sc2)); | ||||
} | } | ||||
LOL_ATTR_FALLTHROUGH | LOL_ATTR_FALLTHROUGH | ||||