From 6bb582c26fea6dbed783c5822a66a55a63ec00e5 Mon Sep 17 00:00:00 2001 From: ceski <56656010+ceski-1@users.noreply.github.com> Date: Tue, 5 Mar 2024 21:42:17 -0800 Subject: [PATCH] Improve simultaneous mouse and gamepad input (#1563) * Improve simultaneous mouse and gamepad input * Defer first event (don't eat it) in strict mode --- src/g_game.c | 5 ++--- src/i_gamepad.c | 8 +++++++- src/i_gamepad.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 62406666..fb5d9248 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -529,9 +529,8 @@ void G_PrepTiccmd(void) // Gamepad - if (I_UseController()) + if (I_UseController() && I_CalcControllerAxes()) { - I_CalcControllerAxes(); D_UpdateDeltaTics(); if (axes[AXIS_TURN] && !strafe) @@ -1181,7 +1180,7 @@ static boolean G_StrictModeSkipEvent(event_t *ev) first_event = false; enable_controller = true; } - return true; // Already "ate" the event above. + I_ResetControllerLevel(); } return !enable_controller; diff --git a/src/i_gamepad.c b/src/i_gamepad.c index ec44045d..8e2f7697 100644 --- a/src/i_gamepad.c +++ b/src/i_gamepad.c @@ -261,8 +261,10 @@ static void CalcRadial(axes_t *ax, float *xaxis, float *yaxis) static void (*CalcMovement)(axes_t *ax, float *xaxis, float *yaxis); static void (*CalcCamera)(axes_t *ax, float *xaxis, float *yaxis); -void I_CalcControllerAxes(void) +boolean I_CalcControllerAxes(void) { + boolean camera_update = false; + if (movement.x.data || movement.y.data) { CalcMovement(&movement, &axes[AXIS_STRAFE], &axes[AXIS_FORWARD]); @@ -282,7 +284,11 @@ void I_CalcControllerAxes(void) camera.x.data = 0; camera.y.data = 0; + + camera_update = true; } + + return camera_update; } void I_UpdateAxesData(const event_t *ev) diff --git a/src/i_gamepad.h b/src/i_gamepad.h index 69d6662d..e391c2fc 100644 --- a/src/i_gamepad.h +++ b/src/i_gamepad.h @@ -48,7 +48,7 @@ extern boolean joy_invert_look; // Invert look axis. extern float axes[NUM_AXES]; // Calculated controller values. extern int trigger_threshold; // Trigger threshold (axis resolution). -void I_CalcControllerAxes(void); +boolean I_CalcControllerAxes(void); void I_UpdateAxesData(const struct event_s *ev); void I_ResetControllerAxes(void); void I_ResetControllerLevel(void);