1
1
use crate :: {
2
2
converter:: { convert_axis, convert_button} ,
3
- Gilrs , GilrsGamepads ,
3
+ GilrsGamepads , GILRS ,
4
4
} ;
5
5
use bevy_ecs:: event:: EventWriter ;
6
6
use bevy_ecs:: prelude:: Commands ;
7
- #[ cfg( target_arch = "wasm32" ) ]
8
- use bevy_ecs:: system:: NonSendMut ;
9
7
use bevy_ecs:: system:: ResMut ;
10
8
use bevy_input:: gamepad:: {
11
9
GamepadConnection , GamepadConnectionEvent , RawGamepadAxisChangedEvent ,
@@ -15,101 +13,109 @@ use gilrs::{ev::filter::axis_dpad_to_button, EventType, Filter};
15
13
16
14
pub fn gilrs_event_startup_system (
17
15
mut commands : Commands ,
18
- #[ cfg( target_arch = "wasm32" ) ] mut gilrs : NonSendMut < Gilrs > ,
19
- #[ cfg( not( target_arch = "wasm32" ) ) ] mut gilrs : ResMut < Gilrs > ,
20
16
mut gamepads : ResMut < GilrsGamepads > ,
21
17
mut events : EventWriter < GamepadConnectionEvent > ,
22
18
) {
23
- for ( id, gamepad) in gilrs. 0 . get ( ) . gamepads ( ) {
24
- // Create entity and add to mapping
25
- let entity = commands. spawn_empty ( ) . id ( ) ;
26
- gamepads. id_to_entity . insert ( id, entity) ;
27
- gamepads. entity_to_id . insert ( entity, id) ;
19
+ GILRS . with ( |gilrs_ref_cell| {
20
+ for ( id, gamepad) in gilrs_ref_cell
21
+ . borrow ( )
22
+ . as_ref ( )
23
+ . expect ( "gilrs should have been initialized" )
24
+ . gamepads ( )
25
+ {
26
+ // Create entity and add to mapping
27
+ let entity = commands. spawn_empty ( ) . id ( ) ;
28
+ gamepads. id_to_entity . insert ( id, entity) ;
29
+ gamepads. entity_to_id . insert ( entity, id) ;
28
30
29
- events. send ( GamepadConnectionEvent {
30
- gamepad : entity,
31
- connection : GamepadConnection :: Connected {
32
- name : gamepad. name ( ) . to_string ( ) ,
33
- vendor_id : gamepad. vendor_id ( ) ,
34
- product_id : gamepad. product_id ( ) ,
35
- } ,
36
- } ) ;
37
- }
31
+ events. send ( GamepadConnectionEvent {
32
+ gamepad : entity,
33
+ connection : GamepadConnection :: Connected {
34
+ name : gamepad. name ( ) . to_string ( ) ,
35
+ vendor_id : gamepad. vendor_id ( ) ,
36
+ product_id : gamepad. product_id ( ) ,
37
+ } ,
38
+ } ) ;
39
+ }
40
+ } ) ;
38
41
}
39
42
40
43
pub fn gilrs_event_system (
41
44
mut commands : Commands ,
42
- #[ cfg( target_arch = "wasm32" ) ] mut gilrs : NonSendMut < Gilrs > ,
43
- #[ cfg( not( target_arch = "wasm32" ) ) ] mut gilrs : ResMut < Gilrs > ,
44
45
mut gamepads : ResMut < GilrsGamepads > ,
45
46
mut events : EventWriter < RawGamepadEvent > ,
46
47
mut connection_events : EventWriter < GamepadConnectionEvent > ,
47
48
mut button_events : EventWriter < RawGamepadButtonChangedEvent > ,
48
49
mut axis_event : EventWriter < RawGamepadAxisChangedEvent > ,
49
50
) {
50
- let gilrs = gilrs. 0 . get ( ) ;
51
- while let Some ( gilrs_event) = gilrs. next_event ( ) . filter_ev ( & axis_dpad_to_button, gilrs) {
52
- gilrs. update ( & gilrs_event) ;
53
- match gilrs_event. event {
54
- EventType :: Connected => {
55
- let pad = gilrs. gamepad ( gilrs_event. id ) ;
56
- let entity = gamepads. get_entity ( gilrs_event. id ) . unwrap_or_else ( || {
57
- let entity = commands. spawn_empty ( ) . id ( ) ;
58
- gamepads. id_to_entity . insert ( gilrs_event. id , entity) ;
59
- gamepads. entity_to_id . insert ( entity, gilrs_event. id ) ;
60
- entity
61
- } ) ;
51
+ GILRS . with ( |gilrs_ref_cell| {
52
+ let mut gilrs_ref = gilrs_ref_cell. borrow_mut ( ) ;
53
+ let gilrs = gilrs_ref. as_mut ( ) . expect ( "" ) ;
54
+ while let Some ( gilrs_event) = gilrs. next_event ( ) . filter_ev ( & axis_dpad_to_button, gilrs) {
55
+ gilrs. update ( & gilrs_event) ;
56
+ match gilrs_event. event {
57
+ EventType :: Connected => {
58
+ let pad = gilrs. gamepad ( gilrs_event. id ) ;
59
+ let entity = gamepads. get_entity ( gilrs_event. id ) . unwrap_or_else ( || {
60
+ let entity = commands. spawn_empty ( ) . id ( ) ;
61
+ gamepads. id_to_entity . insert ( gilrs_event. id , entity) ;
62
+ gamepads. entity_to_id . insert ( entity, gilrs_event. id ) ;
63
+ entity
64
+ } ) ;
62
65
63
- let event = GamepadConnectionEvent :: new (
64
- entity,
65
- GamepadConnection :: Connected {
66
- name : pad. name ( ) . to_string ( ) ,
67
- vendor_id : pad. vendor_id ( ) ,
68
- product_id : pad. product_id ( ) ,
69
- } ,
70
- ) ;
66
+ let event = GamepadConnectionEvent :: new (
67
+ entity,
68
+ GamepadConnection :: Connected {
69
+ name : pad. name ( ) . to_string ( ) ,
70
+ vendor_id : pad. vendor_id ( ) ,
71
+ product_id : pad. product_id ( ) ,
72
+ } ,
73
+ ) ;
71
74
72
- events. send ( event. clone ( ) . into ( ) ) ;
73
- connection_events. send ( event) ;
74
- }
75
- EventType :: Disconnected => {
76
- let gamepad = gamepads
77
- . id_to_entity
78
- . get ( & gilrs_event. id )
79
- . copied ( )
80
- . expect ( "mapping should exist from connection" ) ;
81
- let event = GamepadConnectionEvent :: new ( gamepad, GamepadConnection :: Disconnected ) ;
82
- events. send ( event. clone ( ) . into ( ) ) ;
83
- connection_events. send ( event) ;
84
- }
85
- EventType :: ButtonChanged ( gilrs_button, raw_value, _) => {
86
- let Some ( button) = convert_button ( gilrs_button) else {
87
- continue ;
88
- } ;
89
- let gamepad = gamepads
90
- . id_to_entity
91
- . get ( & gilrs_event. id )
92
- . copied ( )
93
- . expect ( "mapping should exist from connection" ) ;
94
- events. send ( RawGamepadButtonChangedEvent :: new ( gamepad, button, raw_value) . into ( ) ) ;
95
- button_events. send ( RawGamepadButtonChangedEvent :: new (
96
- gamepad, button, raw_value,
97
- ) ) ;
98
- }
99
- EventType :: AxisChanged ( gilrs_axis, raw_value, _) => {
100
- let Some ( axis) = convert_axis ( gilrs_axis) else {
101
- continue ;
102
- } ;
103
- let gamepad = gamepads
104
- . id_to_entity
105
- . get ( & gilrs_event. id )
106
- . copied ( )
107
- . expect ( "mapping should exist from connection" ) ;
108
- events. send ( RawGamepadAxisChangedEvent :: new ( gamepad, axis, raw_value) . into ( ) ) ;
109
- axis_event. send ( RawGamepadAxisChangedEvent :: new ( gamepad, axis, raw_value) ) ;
110
- }
111
- _ => ( ) ,
112
- } ;
113
- }
114
- gilrs. inc ( ) ;
75
+ events. send ( event. clone ( ) . into ( ) ) ;
76
+ connection_events. send ( event) ;
77
+ }
78
+ EventType :: Disconnected => {
79
+ let gamepad = gamepads
80
+ . id_to_entity
81
+ . get ( & gilrs_event. id )
82
+ . copied ( )
83
+ . expect ( "mapping should exist from connection" ) ;
84
+ let event =
85
+ GamepadConnectionEvent :: new ( gamepad, GamepadConnection :: Disconnected ) ;
86
+ events. send ( event. clone ( ) . into ( ) ) ;
87
+ connection_events. send ( event) ;
88
+ }
89
+ EventType :: ButtonChanged ( gilrs_button, raw_value, _) => {
90
+ let Some ( button) = convert_button ( gilrs_button) else {
91
+ continue ;
92
+ } ;
93
+ let gamepad = gamepads
94
+ . id_to_entity
95
+ . get ( & gilrs_event. id )
96
+ . copied ( )
97
+ . expect ( "mapping should exist from connection" ) ;
98
+ events
99
+ . send ( RawGamepadButtonChangedEvent :: new ( gamepad, button, raw_value) . into ( ) ) ;
100
+ button_events. send ( RawGamepadButtonChangedEvent :: new (
101
+ gamepad, button, raw_value,
102
+ ) ) ;
103
+ }
104
+ EventType :: AxisChanged ( gilrs_axis, raw_value, _) => {
105
+ let Some ( axis) = convert_axis ( gilrs_axis) else {
106
+ continue ;
107
+ } ;
108
+ let gamepad = gamepads
109
+ . id_to_entity
110
+ . get ( & gilrs_event. id )
111
+ . copied ( )
112
+ . expect ( "mapping should exist from connection" ) ;
113
+ events. send ( RawGamepadAxisChangedEvent :: new ( gamepad, axis, raw_value) . into ( ) ) ;
114
+ axis_event. send ( RawGamepadAxisChangedEvent :: new ( gamepad, axis, raw_value) ) ;
115
+ }
116
+ _ => ( ) ,
117
+ } ;
118
+ }
119
+ gilrs. inc ( ) ;
120
+ } ) ;
115
121
}
0 commit comments