void FGamePadState::InitAxes(FEventHandler& EventHandler) { F_Assert(IsValid(), "This class must be valid."); Int32 AxisCount = 0; TRawPtr<const Float32> AxesArray = glfwGetJoystickAxes(GamePadID, &AxisCount); F_Assert(AxesArray.IsValid(), "Failed to retrieve JoystickAxes for GamePadID: " << GamePadID); Axes.resize(AxisCount); std::copy(AxesArray.Get(), AxesArray.Get() + AxisCount, Axes.begin()); for (SizeT I = 0; I < Axes.size(); ++I) { const auto& Axis = Axes[I]; if (!FMathf::IsCloseTo(Axis, 0.f, AxisPickUpRange)) { const EGamePadAxis::Value Axis = static_cast<EGamePadAxis::Value>(I); const Float32 TimeStamp = FHighResolutionTimer::GetTimeInSeconds<Float32>(); EventHandler.GamePadEventCallback(GamePadID, Axis, 0.f, Axis, TimeStamp); } } }
void FGamePadState::InitButtons(FEventHandler& EventHandler) { F_Assert(IsValid(), "This class must be valid."); Int32 ButtonCount = 0; TRawPtr<const UInt8> ButtonsArray = glfwGetJoystickButtons(GamePadID, &ButtonCount); F_Assert(ButtonsArray.IsValid(), "Failed to retrieve JoystickButtons for GamePadID: " << GamePadID); Buttons.resize(ButtonCount); std::copy(ButtonsArray.Get(), ButtonsArray.Get() + ButtonCount, Buttons.begin()); for (SizeT I = 0; I < Buttons.size(); ++I) { const auto& Button = Buttons[I]; if (Button == EInputAction::Press) { const EGamePadButton::Value GPButton = static_cast<EGamePadButton::Value>(I); const Float32 TimeStamp = FHighResolutionTimer::GetTimeInSeconds(); EventHandler.GamePadEventCallback(GamePadID, GPButton, EInputAction::Press, TimeStamp); } } }
void FGamePadState::ProcessButtonEvents(FEventHandler& EventHandler) { Int32 ButtonCount = 0; TRawPtr<const UInt8> ButtonsArray = glfwGetJoystickButtons(GamePadID, &ButtonCount); if (!ButtonsArray.IsValid()) { F_Assert(false, "Failed to retrieve ButtonsArray for GamePadID: " << GamePadID); ResetButtons(EventHandler); return; } const SizeT ButtonsArraySize = Buttons.size(); const bool ArraySizesMatch = ButtonsArraySize == static_cast<SizeT>(ButtonCount); if (!ArraySizesMatch) { F_Assert(false, "Array size mismatch. Size: " << ButtonsArraySize << ", Expected: " << ButtonCount); ResetButtons(EventHandler); InitButtons(EventHandler); return; } for (SizeT I = 0; I < ButtonsArraySize; ++I) { if (ButtonsArray[I] != Buttons[I]) { const EGamePadButton::Value GPButton = static_cast<EGamePadButton::Value>(I); const EInputAction::Value InputAction = ButtonsArray[I] == GLFW_PRESS ? EInputAction::Press : EInputAction::Release; const Float32 TimeStamp = FHighResolutionTimer::GetTimeInSeconds<Float32>(); EventHandler.GamePadEventCallback(GamePadID, GPButton, InputAction, TimeStamp); Buttons[I] = ButtonsArray[I]; } } }
void FGamePadState::ProcessAxisEvents(FEventHandler& EventHandler) { Int32 AxisCount = 0; TRawPtr<const Float32> AxesArray = glfwGetJoystickAxes(GamePadID, &AxisCount); if (!AxesArray.IsValid()) { F_Assert(false, "Failed to retrieve JoystickAxes for GamePadID: " << GamePadID); ResetAxes(EventHandler); return; } const SizeT AxesArraySize = Axes.size(); const bool ArraySizesMatch = AxesArraySize == static_cast<SizeT>(AxisCount); if (!ArraySizesMatch) { F_Assert(false, "Array size mismatch. Size: " << AxesArraySize << ", Expected: " << AxisCount); ResetAxes(EventHandler); InitAxes(EventHandler); return; } for (SizeT I = 0; I < AxesArraySize; ++I) { if (!FMathf::IsCloseTo(Axes[I], AxesArray[I], AxisPickUpRange)) { const EGamePadAxis::Value GPAxis = static_cast<EGamePadAxis::Value>(I); const Float32 PrevAxis = Axes[I]; const Float32 CurrAxis = AxesArray[I]; const Float32 TimeStamp = FHighResolutionTimer::GetTimeInSeconds<Float32>(); EventHandler.GamePadEventCallback(GamePadID, GPAxis, PrevAxis, CurrAxis, TimeStamp); Axes[I] = AxesArray[I]; } } }