1
1
//! Handle user specified rumble request events.
2
- use bevy_ecs :: {
3
- prelude:: { EventReader , Res } ,
4
- system :: NonSendMut ,
5
- } ;
2
+ use crate :: Gilrs ;
3
+ use bevy_ecs :: prelude:: { EventReader , Res , ResMut , Resource } ;
4
+ # [ cfg ( target_arch = "wasm32" ) ]
5
+ use bevy_ecs :: system :: NonSendMut ;
6
6
use bevy_input:: gamepad:: { GamepadRumbleIntensity , GamepadRumbleRequest } ;
7
7
use bevy_log:: { debug, warn} ;
8
8
use bevy_time:: { Real , Time } ;
9
- use bevy_utils:: { Duration , HashMap } ;
9
+ use bevy_utils:: { synccell :: SyncCell , Duration , HashMap } ;
10
10
use gilrs:: {
11
11
ff:: { self , BaseEffect , BaseEffectType , Repeat , Replay } ,
12
- GamepadId , Gilrs ,
12
+ GamepadId ,
13
13
} ;
14
14
use thiserror:: Error ;
15
15
@@ -23,7 +23,7 @@ struct RunningRumble {
23
23
///
24
24
/// Dropping it will cause the effect to stop
25
25
#[ allow( dead_code) ]
26
- effect : ff:: Effect ,
26
+ effect : SyncCell < ff:: Effect > ,
27
27
}
28
28
29
29
#[ derive( Error , Debug ) ]
@@ -35,7 +35,7 @@ enum RumbleError {
35
35
}
36
36
37
37
/// Contains the gilrs rumble effects that are currently running for each gamepad
38
- #[ derive( Default ) ]
38
+ #[ derive( Default , Resource ) ]
39
39
pub ( crate ) struct RunningRumbleEffects {
40
40
/// If multiple rumbles are running at the same time, their resulting rumble
41
41
/// will be the saturated sum of their strengths up until [`u16::MAX`]
@@ -80,7 +80,7 @@ fn get_base_effects(
80
80
81
81
fn handle_rumble_request (
82
82
running_rumbles : & mut RunningRumbleEffects ,
83
- gilrs : & mut Gilrs ,
83
+ gilrs : & mut gilrs :: Gilrs ,
84
84
rumble : GamepadRumbleRequest ,
85
85
current_time : Duration ,
86
86
) -> Result < ( ) , RumbleError > {
@@ -113,18 +113,23 @@ fn handle_rumble_request(
113
113
114
114
let gamepad_rumbles = running_rumbles. rumbles . entry ( gamepad_id) . or_default ( ) ;
115
115
let deadline = current_time + duration;
116
- gamepad_rumbles. push ( RunningRumble { deadline, effect } ) ;
116
+ gamepad_rumbles. push ( RunningRumble {
117
+ deadline,
118
+ effect : SyncCell :: new ( effect) ,
119
+ } ) ;
117
120
}
118
121
}
119
122
120
123
Ok ( ( ) )
121
124
}
122
125
pub ( crate ) fn play_gilrs_rumble (
123
126
time : Res < Time < Real > > ,
124
- mut gilrs : NonSendMut < Gilrs > ,
127
+ #[ cfg( target_arch = "wasm32" ) ] mut gilrs : NonSendMut < Gilrs > ,
128
+ #[ cfg( not( target_arch = "wasm32" ) ) ] mut gilrs : ResMut < Gilrs > ,
125
129
mut requests : EventReader < GamepadRumbleRequest > ,
126
- mut running_rumbles : NonSendMut < RunningRumbleEffects > ,
130
+ mut running_rumbles : ResMut < RunningRumbleEffects > ,
127
131
) {
132
+ let gilrs = gilrs. 0 . get ( ) ;
128
133
let current_time = time. elapsed ( ) ;
129
134
// Remove outdated rumble effects.
130
135
for rumbles in running_rumbles. rumbles . values_mut ( ) {
@@ -138,7 +143,7 @@ pub(crate) fn play_gilrs_rumble(
138
143
// Add new effects.
139
144
for rumble in requests. read ( ) . cloned ( ) {
140
145
let gamepad = rumble. gamepad ( ) ;
141
- match handle_rumble_request ( & mut running_rumbles, & mut gilrs, rumble, current_time) {
146
+ match handle_rumble_request ( & mut running_rumbles, gilrs, rumble, current_time) {
142
147
Ok ( ( ) ) => { }
143
148
Err ( RumbleError :: GilrsError ( err) ) => {
144
149
if let ff:: Error :: FfNotSupported ( _) = err {
0 commit comments