Skip to content

Commit

Permalink
Fix InputMap not receiving from all gamepads
Browse files Browse the repository at this point in the history
  • Loading branch information
100-TomatoJuice committed Sep 8, 2023
1 parent 538dad8 commit f7c48f4
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 14 deletions.
1 change: 1 addition & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Bugs
- Fixed system order ambiguity between bevy_ui and update_action_state systems
- Fixed unassigned `InputMaps`s not receiving input from all connected gamepads

### Docs

Expand Down
57 changes: 43 additions & 14 deletions src/input_streams.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,6 @@ impl<'a> InputStreams<'a> {

// Input checking
impl<'a> InputStreams<'a> {
/// Guess which registered [`Gamepad`] should be used.
///
/// If an associated gamepad is set, use that.
/// Otherwise use the first registered gamepad, if any.
pub fn guess_gamepad(&self) -> Option<Gamepad> {
match self.associated_gamepad {
Some(gamepad) => Some(gamepad),
None => self.gamepads.iter().next(),
}
}

/// Is the `input` matched by the [`InputStreams`]?
pub fn input_pressed(&self, input: &UserInput) -> bool {
match input {
Expand Down Expand Up @@ -142,12 +131,23 @@ impl<'a> InputStreams<'a> {
value < axis.negative_low || value > axis.positive_low
}
InputKind::GamepadButton(gamepad_button) => {
if let Some(gamepad) = self.guess_gamepad() {
if let Some(gamepad) = self.associated_gamepad {
self.gamepad_buttons.pressed(GamepadButton {
gamepad,
button_type: gamepad_button,
})
} else {
for gamepad in self.gamepads.iter() {
if self.gamepad_buttons.pressed(GamepadButton {
gamepad,
button_type: gamepad_button,
}) {
// Return early if *any* gamepad is pressing this button
return true;
}
}

// If we don't have the required data, fall back to false
false
}
}
Expand Down Expand Up @@ -276,14 +276,27 @@ impl<'a> InputStreams<'a> {
UserInput::Single(InputKind::SingleAxis(single_axis)) => {
match single_axis.axis_type {
AxisType::Gamepad(axis_type) => {
if let Some(gamepad) = self.guess_gamepad() {
if let Some(gamepad) = self.associated_gamepad {
let value = self
.gamepad_axes
.get(GamepadAxis { gamepad, axis_type })
.unwrap_or_default();

value_in_axis_range(single_axis, value)
} else {
for gamepad in self.gamepads.iter() {
let value = self
.gamepad_axes
.get(GamepadAxis { gamepad, axis_type })
.unwrap_or_default();

// Return early if *any* gamepad is pressing this axis
if value != 0.0 {
return value_in_axis_range(single_axis, value);
}
}

// If we don't have the required data, fall back to 0.0
0.0
}
}
Expand Down Expand Up @@ -332,7 +345,7 @@ impl<'a> InputStreams<'a> {
}
// This is required because upstream bevy::input still waffles about whether triggers are buttons or axes
UserInput::Single(InputKind::GamepadButton(button_type)) => {
if let Some(gamepad) = self.guess_gamepad() {
if let Some(gamepad) = self.associated_gamepad {
// Get the value from the registered gamepad
self.gamepad_button_axes
.get(GamepadButton {
Expand All @@ -341,6 +354,22 @@ impl<'a> InputStreams<'a> {
})
.unwrap_or_else(use_button_value)
} else {
for gamepad in self.gamepads.iter() {
let value = self
.gamepad_button_axes
.get(GamepadButton {
gamepad,
button_type: *button_type,
})
.unwrap_or_else(use_button_value);

// Return early if *any* gamepad is pressing this button
if value != 0.0 {
return value;
}
}

// If we don't have the required data, fall back to 0.0
0.0
}
}
Expand Down

0 comments on commit f7c48f4

Please sign in to comment.