Skip to content

Commit

Permalink
Gamepad input overhaul (#943)
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Feb 1, 2025
1 parent b587a20 commit 76876d0
Show file tree
Hide file tree
Showing 53 changed files with 477 additions and 336 deletions.
34 changes: 17 additions & 17 deletions src/xrEngine/FDemoRecord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -709,32 +709,32 @@ void CDemoRecord::IR_OnMouseHold(int btn)
IR_OnKeyboardHold(btn);
}

void CDemoRecord::IR_OnControllerPress(int key, float x, float y)
void CDemoRecord::IR_OnControllerPress(int key, const ControllerAxisState& state)
{
if (m_b_redirect_input_to_level)
{
g_pGameLevel->IR_OnControllerPress(key, x, y);
g_pGameLevel->IR_OnControllerPress(key, state);
return;
}

IR_OnKeyboardPress(key);
}

void CDemoRecord::IR_OnControllerHold(int key, float x, float y)
void CDemoRecord::IR_OnControllerHold(int key, const ControllerAxisState& state)
{
if (m_b_redirect_input_to_level)
{
g_pGameLevel->IR_OnControllerHold(key, x, y);
g_pGameLevel->IR_OnControllerHold(key, state);
return;
}

const float look = std::max(std::abs(x), std::abs(y));
const float look = state.magnitude;
movement_speed speed = speed_1;
if (look >= 90.f)
if (look >= 0.9f)
speed = speed_3;
else if (look >= 75.f)
else if (look >= 0.75f)
speed = speed_2;
else if (look < 45.f)
else if (look < 0.45f)
speed = speed_0;

switch (GetBindedAction(key))
Expand All @@ -744,7 +744,7 @@ void CDemoRecord::IR_OnControllerHold(int key, float x, float y)
m_angle_speed = speed;
const float scaleX = .05f; // psControllerStickSensX;
const float scaleY = .05f; // psControllerStickSensY;
OnAxisMove(x, y, scaleX, scaleY, psControllerFlags.test(ControllerInvertX), psControllerFlags.test(ControllerInvertY));
OnAxisMove(state.x, state.y, scaleX, scaleY, psControllerFlags.test(ControllerInvertX), psControllerFlags.test(ControllerInvertY));
break;
}

Expand All @@ -769,18 +769,18 @@ void CDemoRecord::IR_OnControllerHold(int key, float x, float y)
m_speed = speed;
Fvector vT_delta = Fvector().set(0, 0, 0);

if (!fis_zero(x))
if (!fis_zero(state.x))
{
if (x > 35.f)
if (state.x > 0.35f)
vT_delta.x += 1.0f;
else if (x < -35.f)
else if (state.x < -0.35f)
vT_delta.x -= 1.0f;
}
if (!fis_zero(y))
if (!fis_zero(state.y))
{
if (y > 35.f)
if (state.y > 0.35f)
vT_delta.y -= 1.0f;
else if (y < -35.f)
else if (state.y < -0.35f)
vT_delta.y += 1.0f;
}

Expand All @@ -794,11 +794,11 @@ void CDemoRecord::IR_OnControllerHold(int key, float x, float y)
}
}

void CDemoRecord::IR_OnControllerRelease(int key, float x, float y)
void CDemoRecord::IR_OnControllerRelease(int key, const ControllerAxisState& state)
{
if (m_b_redirect_input_to_level)
{
g_pGameLevel->IR_OnControllerRelease(key, x, y);
g_pGameLevel->IR_OnControllerRelease(key, state);
return;
}

Expand Down
6 changes: 3 additions & 3 deletions src/xrEngine/FDemoRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ class ENGINE_API CDemoRecord : public CEffectorCam, public IInputReceiver, publi
virtual void IR_OnKeyboardHold(int dik);
virtual void IR_OnKeyboardRelease(int dik);

void IR_OnControllerPress(int key, float x, float y) override;
void IR_OnControllerHold(int key, float x, float y) override;
void IR_OnControllerRelease(int key, float x, float y) override;
void IR_OnControllerPress(int key, const ControllerAxisState& state) override;
void IR_OnControllerHold(int key, const ControllerAxisState& state) override;
void IR_OnControllerRelease(int key, const ControllerAxisState& state) override;

void IR_OnControllerAttitudeChange(Fvector change) override;

Expand Down
6 changes: 4 additions & 2 deletions src/xrEngine/IInputReceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,15 @@ void IInputReceiver::IR_OnDeactivate()
if (IR_GetKeyState(i))
IR_OnMouseRelease(i);

constexpr ControllerAxisState releasedAxis{};

for (i = XR_CONTROLLER_BUTTON_INVALID + 1; i < XR_CONTROLLER_BUTTON_MAX; i++)
if (IR_GetKeyState(i))
IR_OnControllerRelease(i, 0.0f, 0.0f);
IR_OnControllerRelease(i, releasedAxis);

for (i = XR_CONTROLLER_AXIS_INVALID + 1; i < XR_CONTROLLER_AXIS_MAX; i++)
if (IR_GetKeyState(i))
IR_OnControllerRelease(i, 0.0f, 0.0f);
IR_OnControllerRelease(i, releasedAxis);
}

bool IInputReceiver::IR_GetKeyState(int dik) const
Expand Down
10 changes: 6 additions & 4 deletions src/xrEngine/IInputReceiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ class ENGINE_API IInputReceiver
virtual void IR_OnKeyboardHold(int /*dik*/) {}
virtual void IR_OnTextInput(pcstr /*text*/) {}

virtual void IR_OnControllerPress(int /*dik*/, float /*x*/, float /*y*/) {}
virtual void IR_OnControllerRelease(int /*dik*/, float /*x*/, float /*y*/) {}
virtual void IR_OnControllerHold(int /*dik*/, float /*x*/, float /*y*/) {}
virtual void IR_OnControllerPress(int /*dik*/, const ControllerAxisState& /*state*/) {}
virtual void IR_OnControllerRelease(int /*dik*/, const ControllerAxisState& /*state*/) {}
virtual void IR_OnControllerHold(int /*dik*/, const ControllerAxisState& /*state*/) {}

virtual void IR_OnControllerAttitudeChange(Fvector /*change*/) {}
};
Expand All @@ -53,7 +53,9 @@ ENGINE_API extern Flags32 psMouseInvert;
ENGINE_API extern float psControllerStickSensX;
ENGINE_API extern float psControllerStickSensY;
ENGINE_API extern float psControllerStickSensScale;
ENGINE_API extern float psControllerStickDeadZone;
ENGINE_API extern float psControllerStickInnerDeadZone;
ENGINE_API extern float psControllerStickOuterDeadZone;
ENGINE_API extern float psControllerStickAngularDeadZone;
ENGINE_API extern float psControllerSensorSens;
ENGINE_API extern float psControllerSensorDeadZone;
ENGINE_API extern float psControllerCursorAutohideTime;
Expand Down
6 changes: 3 additions & 3 deletions src/xrEngine/editor_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,9 @@ class ENGINE_API ide final :
void IR_OnKeyboardHold(int key) override;
void IR_OnTextInput(pcstr text) override;

void IR_OnControllerPress(int key, float x, float y) override;
void IR_OnControllerRelease(int key, float x, float y) override;
void IR_OnControllerHold(int key, float x, float y) override;
void IR_OnControllerPress(int key, const ControllerAxisState& state) override;
void IR_OnControllerRelease(int key, const ControllerAxisState& state) override;
void IR_OnControllerHold(int key, const ControllerAxisState& state) override;

void IR_OnControllerAttitudeChange(Fvector change) override;

Expand Down
14 changes: 7 additions & 7 deletions src/xrEngine/editor_base_input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ void ide::IR_OnTextInput(pcstr text)
io.AddInputCharactersUTF8(text);
}

void ide::IR_OnControllerPress(int key, float x, float y)
void ide::IR_OnControllerPress(int key, const ControllerAxisState& state)
{
ImGuiIO& io = ImGui::GetIO();

Expand All @@ -462,10 +462,10 @@ void ide::IR_OnControllerPress(int key, float x, float y)
case XR_CONTROLLER_AXIS_RIGHT:
break;
case XR_CONTROLLER_AXIS_TRIGGER_LEFT:
io.AddKeyAnalogEvent(ImGuiKey_GamepadL2, true, x);
io.AddKeyAnalogEvent(ImGuiKey_GamepadL2, true, state.magnitude);
break;
case XR_CONTROLLER_AXIS_TRIGGER_RIGHT:
io.AddKeyAnalogEvent(ImGuiKey_GamepadR2, true, x);
io.AddKeyAnalogEvent(ImGuiKey_GamepadR2, true, state.magnitude);
break;
}

Expand Down Expand Up @@ -495,7 +495,7 @@ void ide::IR_OnControllerPress(int key, float x, float y)
#undef IM_SATURATE*/
}

void ide::IR_OnControllerRelease(int key, float x, float y)
void ide::IR_OnControllerRelease(int key, const ControllerAxisState& state)
{
ImGuiIO& io = ImGui::GetIO();

Expand All @@ -512,15 +512,15 @@ void ide::IR_OnControllerRelease(int key, float x, float y)
case XR_CONTROLLER_AXIS_RIGHT:
break;
case XR_CONTROLLER_AXIS_TRIGGER_LEFT:
io.AddKeyAnalogEvent(ImGuiKey_GamepadL2, false, x);
io.AddKeyAnalogEvent(ImGuiKey_GamepadL2, false, state.magnitude);
break;
case XR_CONTROLLER_AXIS_TRIGGER_RIGHT:
io.AddKeyAnalogEvent(ImGuiKey_GamepadR2, false, x);
io.AddKeyAnalogEvent(ImGuiKey_GamepadR2, false, state.magnitude);
break;
}
}

void ide::IR_OnControllerHold(int /*key*/, float /*x*/, float /*y*/)
void ide::IR_OnControllerHold(int /*key*/, const ControllerAxisState /*x*/& state)
{
// ImGui handles hold state on its own
}
Expand Down
Loading

0 comments on commit 76876d0

Please sign in to comment.