From 632ef0c823a665cd5f56c05f12cee8506aed1043 Mon Sep 17 00:00:00 2001 From: radiish Date: Tue, 15 Aug 2023 23:50:29 +0200 Subject: [PATCH] input: allow multiple gamepad inputs to be registered for one button in one frame (#9446) # Objective - Currently, (AFAIC, accidentally) after registering an event for a Gilrs button event, we ignore all subsequent events for the same button in the same frame, because we don't update our filter. This is rare, but I noticed it while adding gamepad support to a terminal app rendering at 15fps. - Related to #4664, but does not quite fix it. ## Solution - Move the edit to the `Axis` resource to when we read the events from Gilrs. --- crates/bevy_gilrs/src/gilrs_system.rs | 7 +++++-- crates/bevy_input/src/gamepad.rs | 3 --- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/bevy_gilrs/src/gilrs_system.rs b/crates/bevy_gilrs/src/gilrs_system.rs index de1d0afb3c..5531928103 100644 --- a/crates/bevy_gilrs/src/gilrs_system.rs +++ b/crates/bevy_gilrs/src/gilrs_system.rs @@ -1,6 +1,6 @@ use crate::converter::{convert_axis, convert_button, convert_gamepad_id}; use bevy_ecs::event::EventWriter; -use bevy_ecs::system::{NonSend, NonSendMut, Res}; +use bevy_ecs::system::{NonSend, NonSendMut, Res, ResMut}; use bevy_input::gamepad::{ GamepadAxisChangedEvent, GamepadButtonChangedEvent, GamepadConnection, GamepadConnectionEvent, GamepadSettings, @@ -29,8 +29,8 @@ pub fn gilrs_event_startup_system( pub fn gilrs_event_system( mut gilrs: NonSendMut, mut events: EventWriter, + mut gamepad_buttons: ResMut>, gamepad_axis: Res>, - gamepad_buttons: Res>, gamepad_settings: Res, ) { while let Some(gilrs_event) = gilrs @@ -65,6 +65,9 @@ pub fn gilrs_event_system( GamepadButtonChangedEvent::new(gamepad, button_type, filtered_value) .into(), ); + // Update the current value prematurely so that `old_value` is correct in + // future iterations of the loop. + gamepad_buttons.set(button, filtered_value); } } } diff --git a/crates/bevy_input/src/gamepad.rs b/crates/bevy_input/src/gamepad.rs index e81c075b75..6948d7e628 100644 --- a/crates/bevy_input/src/gamepad.rs +++ b/crates/bevy_input/src/gamepad.rs @@ -1133,7 +1133,6 @@ pub fn gamepad_axis_event_system( pub fn gamepad_button_event_system( mut button_events: EventReader, mut button_input: ResMut>, - mut button_axis: ResMut>, settings: Res, ) { for button_event in button_events.iter() { @@ -1148,8 +1147,6 @@ pub fn gamepad_button_event_system( } else if button_property.is_pressed(value) { button_input.press(button); }; - - button_axis.set(button, value); } }