 1fccb99d3a
			
		
	
	
		1fccb99d3a
		
	
	
	
	
		
			
			# Objective - Enable the `axis_dpad_to_button` gilrs filter to map hats to dpad buttons on supported remotes. - Fixes https://github.com/Leafwing-Studios/leafwing-input-manager/issues/149 - Might have fixed the confusion related to https://github.com/bevyengine/bevy/issues/3229 ## Solution - Enables the `axis_dpad_to_button` filter in `gilrs` which will use it's remote mapping information to see if there are hats mapped to dpads for that remote model. I don't really understand the logic it uses exactly, but it is usually enabled by default in gilrs and I believe it probably leads to more intuitive mapping compared to the current situation of dpad buttons being mapped to an axis. - Removes the `GamepadAxisType::DPadX` and `GamepadAxisType::DPadY` enum variants to avoid user confusion. Those variants should never be emitted anyway, for all supported remotes. --- ## Changelog ### Changed - Removed `GamepadAxisType::DPadX` and `GamepadAxisType::DPadY` in favor of using `GamepadButtonType::DPad[Up/Down/Left/Right]` instead. ## Migration Guide If your game reads gamepad events or queries the axis state of `GamePadAxisType::DPadX` or `GamePadAxisType::DPadY`, then you must migrate your code to check whether or not the `GamepadButtonType::DPadUp`, `GamepadButtonType::DPadDown`, etc. buttons were pressed instead.
		
			
				
	
	
		
			57 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::converter::{convert_axis, convert_button, convert_gamepad_id};
 | |
| use bevy_ecs::event::EventWriter;
 | |
| use bevy_ecs::system::{NonSend, NonSendMut};
 | |
| use bevy_input::{gamepad::GamepadEventRaw, prelude::*};
 | |
| use gilrs::{ev::filter::axis_dpad_to_button, EventType, Filter, Gilrs};
 | |
| 
 | |
| pub fn gilrs_event_startup_system(gilrs: NonSend<Gilrs>, mut events: EventWriter<GamepadEventRaw>) {
 | |
|     for (id, _) in gilrs.gamepads() {
 | |
|         events.send(GamepadEventRaw::new(
 | |
|             convert_gamepad_id(id),
 | |
|             GamepadEventType::Connected,
 | |
|         ));
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub fn gilrs_event_system(mut gilrs: NonSendMut<Gilrs>, mut events: EventWriter<GamepadEventRaw>) {
 | |
|     while let Some(gilrs_event) = gilrs
 | |
|         .next_event()
 | |
|         .filter_ev(&axis_dpad_to_button, &mut gilrs)
 | |
|     {
 | |
|         gilrs.update(&gilrs_event);
 | |
| 
 | |
|         match gilrs_event.event {
 | |
|             EventType::Connected => {
 | |
|                 events.send(GamepadEventRaw::new(
 | |
|                     convert_gamepad_id(gilrs_event.id),
 | |
|                     GamepadEventType::Connected,
 | |
|                 ));
 | |
|             }
 | |
|             EventType::Disconnected => {
 | |
|                 events.send(GamepadEventRaw::new(
 | |
|                     convert_gamepad_id(gilrs_event.id),
 | |
|                     GamepadEventType::Disconnected,
 | |
|                 ));
 | |
|             }
 | |
|             EventType::ButtonChanged(gilrs_button, value, _) => {
 | |
|                 if let Some(button_type) = convert_button(gilrs_button) {
 | |
|                     events.send(GamepadEventRaw::new(
 | |
|                         convert_gamepad_id(gilrs_event.id),
 | |
|                         GamepadEventType::ButtonChanged(button_type, value),
 | |
|                     ));
 | |
|                 }
 | |
|             }
 | |
|             EventType::AxisChanged(gilrs_axis, value, _) => {
 | |
|                 if let Some(axis_type) = convert_axis(gilrs_axis) {
 | |
|                     events.send(GamepadEventRaw::new(
 | |
|                         convert_gamepad_id(gilrs_event.id),
 | |
|                         GamepadEventType::AxisChanged(axis_type, value),
 | |
|                     ));
 | |
|                 }
 | |
|             }
 | |
|             _ => (),
 | |
|         };
 | |
|     }
 | |
|     gilrs.inc();
 | |
| }
 |