Play-/Source/ui_libretro/PH_Libretro_Input.cpp

73 lines
2 KiB
C++
Raw Normal View History

2019-12-31 21:02:35 +01:00
#include "PH_Libretro_Input.h"
#include "ext/libretro.h"
2019-12-31 21:02:35 +01:00
extern bool libretro_supports_bitmasks;
2019-12-31 21:02:35 +01:00
extern retro_input_poll_t g_input_poll_cb;
extern retro_input_state_t g_input_state_cb;
extern std::map<int, int> g_ds2_to_retro_btn_map;
void CPH_Libretro_Input::UpdateInputState()
2019-12-31 21:02:35 +01:00
{
std::lock_guard<std::mutex> lock(m_input_mutex);
2019-12-31 21:02:35 +01:00
g_input_poll_cb();
if(libretro_supports_bitmasks)
{
m_btns_state = g_input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK);
}
else
{
m_btns_state = 0;
2019-06-28 20:01:28 +01:00
for(unsigned int i = 0; i <= RETRO_DEVICE_ID_JOYPAD_R3; i++)
{
2019-06-28 20:01:28 +01:00
if(g_input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i))
m_btns_state |= (1 << i);
}
}
for(unsigned int i = 0; i <= PS2::CControllerInfo::ANALOG_RIGHT_Y + 1; i++)
{
auto currentButtonId = static_cast<PS2::CControllerInfo::BUTTON>(i);
if(PS2::CControllerInfo::IsAxis(currentButtonId))
{
int index;
if(i < 2)
index = RETRO_DEVICE_INDEX_ANALOG_LEFT;
else
index = RETRO_DEVICE_INDEX_ANALOG_RIGHT;
float value = g_input_state_cb(0, RETRO_DEVICE_ANALOG, index, g_ds2_to_retro_btn_map[currentButtonId]);
uint8 val = static_cast<int8>((value / 0xFF) + 0.5) + 0x7F;
if(val > 0x7F - 5 && val < 0x7F + 5)
val = 0x7F;
m_axis_btn_state[currentButtonId] = val;
}
}
}
2019-12-31 21:02:35 +01:00
void CPH_Libretro_Input::Update(uint8* ram)
{
std::lock_guard<std::mutex> lock(m_input_mutex);
2023-10-31 19:50:26 +00:00
for(auto* interface : m_interfaces)
2019-12-31 21:02:35 +01:00
{
for(unsigned int i = 0; i < PS2::CControllerInfo::MAX_BUTTONS; i++)
{
auto currentButtonId = static_cast<PS2::CControllerInfo::BUTTON>(i);
if(PS2::CControllerInfo::IsAxis(currentButtonId))
{
2023-10-31 19:50:26 +00:00
interface->SetAxisState(0, currentButtonId, m_axis_btn_state[currentButtonId], ram);
2019-12-31 21:02:35 +01:00
}
else
{
uint32 val = m_btns_state & (1 << g_ds2_to_retro_btn_map[currentButtonId]);
2023-10-31 19:50:26 +00:00
interface->SetButtonState(0, currentButtonId, val != 0, ram);
2019-12-31 21:02:35 +01:00
}
}
}
}
CPadHandler::FactoryFunction CPH_Libretro_Input::GetFactoryFunction()
{
return []() { return new CPH_Libretro_Input(); };
}