metaforce/Runtime/Input/CFinalInput.cpp

259 lines
9.7 KiB
C++

#include "zeus/Math.hpp"
#include "CFinalInput.hpp"
namespace urde
{
CFinalInput::CFinalInput()
: x0_dt(0.0)
, x4_controllerIdx(0)
, x8_anaLeftX(0.0)
, xc_anaLeftY(0.0)
, x10_anaRightX(0.0)
, x14_anaRightY(0.0)
, x18_anaLeftTrigger(0.0)
, x1c_anaRightTrigger(0.0)
, x20_enableAnaLeftXP(false)
, x20_enableAnaLeftNegXP(false)
, x21_enableAnaLeftYP(false)
, x21_enableAnaLeftNegYP(false)
, x22_enableAnaRightXP(false)
, x22_enableAnaRightNegXP(false)
, x23_enableAnaRightYP(false)
, x23_enableAnaRightNegYP(false)
, x24_anaLeftTriggerP(false)
, x28_anaRightTriggerP(false)
, x2c_b24_A(false)
, x2c_b25_B(false)
, x2c_b26_X(false)
, x2c_b27_Y(false)
, x2c_b28_Z(false)
, x2c_b29_L(false)
, x2c_b30_R(false)
, x2c_b31_DPUp(false)
, x2d_b24_DPRight(false)
, x2d_b25_DPDown(false)
, x2d_b26_DPLeft(false)
, x2d_b27_Start(false)
, x2d_b28_PA(false)
, x2d_b29_PB(false)
, x2d_b30_PX(false)
, x2d_b31_PY(false)
, x2e_b24_PZ(false)
, x2e_b25_PL(false)
, x2e_b26_PR(false)
, x2e_b27_PDPUp(false)
, x2e_b28_PDPRight(false)
, x2e_b29_PDPDown(false)
, x2e_b30_PDPLeft(false)
, x2e_b31_PStart(false)
{
}
CFinalInput::CFinalInput(int cIdx, float dt, const boo::DolphinControllerState& data, const CFinalInput& prevInput,
float leftDiv, float rightDiv)
: x0_dt(dt)
, x4_controllerIdx(cIdx)
, x8_anaLeftX(zeus::clamp(-1.0f, data.m_leftStick[0] / 72.0f / leftDiv, 1.0f))
, xc_anaLeftY(zeus::clamp(-1.0f, data.m_leftStick[1] / 72.0f / leftDiv, 1.0f))
, x10_anaRightX(zeus::clamp(-1.0f, data.m_rightStick[0] / 59.0f / rightDiv, 1.0f))
, x14_anaRightY(zeus::clamp(-1.0f, data.m_rightStick[1] / 59.0f / rightDiv, 1.0f))
, x18_anaLeftTrigger(data.m_analogTriggers[0] * 0.007f)
, x1c_anaRightTrigger(data.m_analogTriggers[1] * 0.007f)
, x20_enableAnaLeftXP(DLARight() && !prevInput.DLARight())
, x20_enableAnaLeftNegXP(DLALeft() && !prevInput.DLALeft())
, x21_enableAnaLeftYP(DLAUp() && !prevInput.DLAUp())
, x21_enableAnaLeftNegYP(DLADown() && !prevInput.DLADown())
, x22_enableAnaRightXP(DRARight() && !prevInput.DRARight())
, x22_enableAnaRightNegXP(DRALeft() && !prevInput.DRALeft())
, x23_enableAnaRightYP(DRAUp() && !prevInput.DRAUp())
, x23_enableAnaRightNegYP(DRADown() && !prevInput.DRADown())
, x24_anaLeftTriggerP(DLTrigger() && !prevInput.DLTrigger())
, x28_anaRightTriggerP(DRTrigger() && !prevInput.DRTrigger())
, x2c_b24_A(data.m_btns & uint16_t(boo::EDolphinControllerButtons::A))
, x2c_b25_B(data.m_btns & uint16_t(boo::EDolphinControllerButtons::B))
, x2c_b26_X(data.m_btns & uint16_t(boo::EDolphinControllerButtons::X))
, x2c_b27_Y(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Y))
, x2c_b28_Z(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Z))
, x2c_b29_L(data.m_btns & uint16_t(boo::EDolphinControllerButtons::L))
, x2c_b30_R(data.m_btns & uint16_t(boo::EDolphinControllerButtons::R))
, x2c_b31_DPUp(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Up))
, x2d_b24_DPRight(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Right))
, x2d_b25_DPDown(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Down))
, x2d_b26_DPLeft(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Left))
, x2d_b27_Start(data.m_btns & uint16_t(boo::EDolphinControllerButtons::Start))
, x2d_b28_PA(DA() && !prevInput.DA())
, x2d_b29_PB(DB() && !prevInput.DB())
, x2d_b30_PX(DX() && !prevInput.DX())
, x2d_b31_PY(DY() && !prevInput.DY())
, x2e_b24_PZ(DZ() && !prevInput.DZ())
, x2e_b25_PL(DL() && !prevInput.DL())
, x2e_b26_PR(DR() && !prevInput.DR())
, x2e_b27_PDPUp(DDPUp() && !prevInput.DDPUp())
, x2e_b28_PDPRight(DDPRight() && !prevInput.DDPRight())
, x2e_b29_PDPDown(DDPDown() && !prevInput.DDPDown())
, x2e_b30_PDPLeft(DDPLeft() && !prevInput.DDPLeft())
, x2e_b31_PStart(DStart() && !prevInput.DStart())
{
}
static float KBToAnaLeftX(const CKeyboardMouseControllerData& data)
{
float retval = 0.0;
if (data.m_charKeys[int('a')])
retval -= 1.0;
if (data.m_charKeys[int('d')])
retval += 1.0;
return retval;
}
static float KBToAnaLeftY(const CKeyboardMouseControllerData& data)
{
float retval = 0.0;
if (data.m_charKeys[int('s')])
retval -= 1.0;
if (data.m_charKeys[int('w')])
retval += 1.0;
return retval;
}
static float KBToAnaRightX(const CKeyboardMouseControllerData& data)
{
float retval = 0.0;
if (data.m_charKeys[int('2')])
retval -= 1.0;
if (data.m_charKeys[int('4')])
retval += 1.0;
return retval;
}
static float KBToAnaRightY(const CKeyboardMouseControllerData& data)
{
float retval = 0.0;
if (data.m_charKeys[int('3')])
retval -= 1.0;
if (data.m_charKeys[int('1')])
retval += 1.0;
return retval;
}
CFinalInput::CFinalInput(int cIdx, float dt, const CKeyboardMouseControllerData& data, const CFinalInput& prevInput)
: x0_dt(dt)
, x4_controllerIdx(cIdx)
, x8_anaLeftX(KBToAnaLeftX(data))
, xc_anaLeftY(KBToAnaLeftY(data))
, x10_anaRightX(KBToAnaRightX(data))
, x14_anaRightY(KBToAnaRightY(data))
, x18_anaLeftTrigger(data.m_charKeys[int('q')] ? 1.0 : 0.0)
, x1c_anaRightTrigger(data.m_charKeys[int('e')] ? 1.0 : 0.0)
, x20_enableAnaLeftXP(DLARight() && !prevInput.DLARight())
, x20_enableAnaLeftNegXP(DLALeft() && !prevInput.DLALeft())
, x21_enableAnaLeftYP(DLAUp() && !prevInput.DLAUp())
, x21_enableAnaLeftNegYP(DLADown() && !prevInput.DLADown())
, x22_enableAnaRightXP(DRARight() && !prevInput.DRARight())
, x22_enableAnaRightNegXP(DRALeft() && !prevInput.DRALeft())
, x23_enableAnaRightYP(DRAUp() && !prevInput.DRAUp())
, x23_enableAnaRightNegYP(DRADown() && !prevInput.DRADown())
, x24_anaLeftTriggerP(DLTrigger() && !prevInput.DLTrigger())
, x28_anaRightTriggerP(DRTrigger() && !prevInput.DRTrigger())
, x2c_b24_A(data.m_mouseButtons[int(boo::EMouseButton::Primary)])
, x2c_b25_B(data.m_charKeys[int(' ')])
, x2c_b26_X(data.m_charKeys[int('c')])
, x2c_b27_Y(data.m_mouseButtons[int(boo::EMouseButton::Secondary)])
, x2c_b28_Z(data.m_charKeys[int('\t')])
, x2c_b29_L(data.m_charKeys[int('q')])
, x2c_b30_R(data.m_charKeys[int('e')])
, x2c_b31_DPUp(data.m_specialKeys[int(boo::ESpecialKey::Up)])
, x2d_b24_DPRight(data.m_specialKeys[int(boo::ESpecialKey::Right)])
, x2d_b25_DPDown(data.m_specialKeys[int(boo::ESpecialKey::Down)])
, x2d_b26_DPLeft(data.m_specialKeys[int(boo::ESpecialKey::Left)])
, x2d_b27_Start(data.m_specialKeys[int(boo::ESpecialKey::Esc)])
, x2d_b28_PA(DA() && !prevInput.DA())
, x2d_b29_PB(DB() && !prevInput.DB())
, x2d_b30_PX(DX() && !prevInput.DX())
, x2d_b31_PY(DY() && !prevInput.DY())
, x2e_b24_PZ(DZ() && !prevInput.DZ())
, x2e_b25_PL(DL() && !prevInput.DL())
, x2e_b26_PR(DR() && !prevInput.DR())
, x2e_b27_PDPUp(DDPUp() && !prevInput.DDPUp())
, x2e_b28_PDPRight(DDPRight() && !prevInput.DDPRight())
, x2e_b29_PDPDown(DDPDown() && !prevInput.DDPDown())
, x2e_b30_PDPLeft(DDPLeft() && !prevInput.DDPLeft())
, x2e_b31_PStart(DStart() && !prevInput.DStart())
{
if (x8_anaLeftX || xc_anaLeftY)
{
float len = std::sqrt(x8_anaLeftX * x8_anaLeftX + xc_anaLeftY * xc_anaLeftY);
x8_anaLeftX /= len;
xc_anaLeftY /= len;
}
if (x10_anaRightX || x14_anaRightY)
{
float len = std::sqrt(x10_anaRightX * x10_anaRightX + x14_anaRightY * x14_anaRightY);
x10_anaRightX /= len;
x14_anaRightY /= len;
}
}
CFinalInput& CFinalInput::operator|=(const CFinalInput& other)
{
if (std::fabs(other.x8_anaLeftX) > std::fabs(x8_anaLeftX))
x8_anaLeftX = other.x8_anaLeftX;
if (std::fabs(other.xc_anaLeftY) > std::fabs(xc_anaLeftY))
xc_anaLeftY = other.xc_anaLeftY;
if (std::fabs(other.x10_anaRightX) > std::fabs(x10_anaRightX))
x10_anaRightX = other.x10_anaRightX;
if (std::fabs(other.x14_anaRightY) > std::fabs(x14_anaRightY))
x14_anaRightY = other.x14_anaRightY;
if (std::fabs(other.x18_anaLeftTrigger) > std::fabs(x18_anaLeftTrigger))
x18_anaLeftTrigger = other.x18_anaLeftTrigger;
if (std::fabs(other.x1c_anaRightTrigger) > std::fabs(x1c_anaRightTrigger))
x1c_anaRightTrigger = other.x1c_anaRightTrigger;
x20_enableAnaLeftXP |= other.x20_enableAnaLeftXP;
x20_enableAnaLeftNegXP |= other.x20_enableAnaLeftNegXP;
x21_enableAnaLeftYP |= other.x21_enableAnaLeftYP;
x21_enableAnaLeftNegYP |= other.x21_enableAnaLeftNegYP;
x22_enableAnaRightXP |= other.x22_enableAnaRightXP;
x22_enableAnaRightNegXP |= other.x22_enableAnaRightNegXP;
x23_enableAnaRightYP |= other.x23_enableAnaRightYP;
x23_enableAnaRightNegYP |= other.x23_enableAnaRightNegYP;
x24_anaLeftTriggerP |= other.x24_anaLeftTriggerP;
x28_anaRightTriggerP |= other.x28_anaRightTriggerP;
x2c_b24_A |= other.x2c_b24_A;
x2c_b25_B |= other.x2c_b25_B;
x2c_b26_X |= other.x2c_b26_X;
x2c_b27_Y |= other.x2c_b27_Y;
x2c_b28_Z |= other.x2c_b28_Z;
x2c_b29_L |= other.x2c_b29_L;
x2c_b30_R |= other.x2c_b30_R;
x2c_b31_DPUp |= other.x2c_b31_DPUp;
x2d_b24_DPRight |= other.x2d_b24_DPRight;
x2d_b25_DPDown |= other.x2d_b25_DPDown;
x2d_b26_DPLeft |= other.x2d_b26_DPLeft;
x2d_b27_Start |= other.x2d_b27_Start;
x2d_b28_PA |= other.x2d_b28_PA;
x2d_b29_PB |= other.x2d_b29_PB;
x2d_b30_PX |= other.x2d_b30_PX;
x2d_b31_PY |= other.x2d_b31_PY;
x2e_b24_PZ |= other.x2e_b24_PZ;
x2e_b25_PL |= other.x2e_b25_PL;
x2e_b26_PR |= other.x2e_b26_PR;
x2e_b27_PDPUp |= other.x2e_b27_PDPUp;
x2e_b28_PDPRight |= other.x2e_b28_PDPRight;
x2e_b29_PDPDown |= other.x2e_b29_PDPDown;
x2e_b30_PDPLeft |= other.x2e_b30_PDPLeft;
x2e_b31_PStart |= other.x2e_b31_PStart;
return *this;
}
CFinalInput CFinalInput::ScaleAnalogueSticks(float leftDiv, float rightDiv) const
{
CFinalInput ret = *this;
ret.x8_anaLeftX = zeus::clamp(-1.f, x8_anaLeftX / leftDiv, 1.f);
ret.xc_anaLeftY = zeus::clamp(-1.f, xc_anaLeftY / leftDiv, 1.f);
ret.x10_anaRightX = zeus::clamp(-1.f, x10_anaRightX / rightDiv, 1.f);
ret.x14_anaRightY = zeus::clamp(-1.f, x14_anaRightY / rightDiv, 1.f);
return ret;
}
}