Skip to content

Commit 094aeb9

Browse files
committed
bevy_gilrs changes
1 parent 120cd9e commit 094aeb9

File tree

3 files changed

+50
-29
lines changed

3 files changed

+50
-29
lines changed

crates/bevy_gilrs/src/gilrs_system.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
use crate::converter::{convert_axis, convert_button, convert_gamepad_id};
2+
use crate::Gilrs;
23
use bevy_ecs::event::EventWriter;
3-
use bevy_ecs::system::{NonSend, NonSendMut, Res, ResMut};
4+
use bevy_ecs::system::{Res, ResMut};
45
use bevy_input::gamepad::{
56
GamepadAxisChangedEvent, GamepadButtonChangedEvent, GamepadConnection, GamepadConnectionEvent,
67
GamepadSettings,
78
};
89
use bevy_input::gamepad::{GamepadEvent, GamepadInfo};
910
use bevy_input::prelude::{GamepadAxis, GamepadButton};
1011
use bevy_input::Axis;
11-
use gilrs::{ev::filter::axis_dpad_to_button, EventType, Filter, Gilrs};
12+
use gilrs::{ev::filter::axis_dpad_to_button, EventType, Filter};
1213

1314
pub fn gilrs_event_startup_system(
14-
gilrs: NonSend<Gilrs>,
15+
mut gilrs: ResMut<Gilrs>,
1516
mut connection_events: EventWriter<GamepadConnectionEvent>,
1617
) {
17-
for (id, gamepad) in gilrs.gamepads() {
18+
for (id, gamepad) in gilrs.get().gamepads() {
1819
let info = GamepadInfo {
1920
name: gamepad.name().into(),
2021
};
@@ -27,22 +28,23 @@ pub fn gilrs_event_startup_system(
2728
}
2829

2930
pub fn gilrs_event_system(
30-
mut gilrs: NonSendMut<Gilrs>,
31+
mut gilrs: ResMut<Gilrs>,
3132
mut events: EventWriter<GamepadEvent>,
3233
mut gamepad_buttons: ResMut<Axis<GamepadButton>>,
3334
gamepad_axis: Res<Axis<GamepadAxis>>,
3435
gamepad_settings: Res<GamepadSettings>,
3536
) {
3637
while let Some(gilrs_event) = gilrs
38+
.get()
3739
.next_event()
38-
.filter_ev(&axis_dpad_to_button, &mut gilrs)
40+
.filter_ev(&axis_dpad_to_button, gilrs.get())
3941
{
40-
gilrs.update(&gilrs_event);
42+
gilrs.get().update(&gilrs_event);
4143

4244
let gamepad = convert_gamepad_id(gilrs_event.id);
4345
match gilrs_event.event {
4446
EventType::Connected => {
45-
let pad = gilrs.gamepad(gilrs_event.id);
47+
let pad = gilrs.get().gamepad(gilrs_event.id);
4648
let info = GamepadInfo {
4749
name: pad.name().into(),
4850
};
@@ -88,5 +90,5 @@ pub fn gilrs_event_system(
8890
_ => (),
8991
};
9092
}
91-
gilrs.inc();
93+
gilrs.get().inc();
9294
}

crates/bevy_gilrs/src/lib.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,28 @@ mod rumble;
77
use bevy_app::{App, Plugin, PostUpdate, PreStartup, PreUpdate};
88
use bevy_ecs::prelude::*;
99
use bevy_input::InputSystem;
10-
use bevy_utils::tracing::error;
10+
use bevy_utils::{synccell::SyncCell, tracing::error};
1111
use gilrs::GilrsBuilder;
1212
use gilrs_system::{gilrs_event_startup_system, gilrs_event_system};
1313
use rumble::{play_gilrs_rumble, RunningRumbleEffects};
1414

15+
/// An instance of [`gilrs::Gilrs`] wrapped in a [`SyncCell`].
16+
#[derive(Resource)]
17+
pub struct Gilrs(SyncCell<gilrs::Gilrs>);
18+
19+
impl std::ops::Deref for Gilrs {
20+
type Target = SyncCell<gilrs::Gilrs>;
21+
fn deref(&self) -> &Self::Target {
22+
&self.0
23+
}
24+
}
25+
26+
impl std::ops::DerefMut for Gilrs {
27+
fn deref_mut(&mut self) -> &mut Self::Target {
28+
&mut self.0
29+
}
30+
}
31+
1532
#[derive(Default)]
1633
pub struct GilrsPlugin;
1734

@@ -27,8 +44,9 @@ impl Plugin for GilrsPlugin {
2744
.build()
2845
{
2946
Ok(gilrs) => {
30-
app.insert_non_send_resource(gilrs)
31-
.init_non_send_resource::<RunningRumbleEffects>()
47+
let res = Gilrs(SyncCell::new(gilrs));
48+
app.insert_resource(res)
49+
.init_resource::<RunningRumbleEffects>()
3250
.add_systems(PreStartup, gilrs_event_startup_system)
3351
.add_systems(PreUpdate, gilrs_event_system.before(InputSystem))
3452
.add_systems(PostUpdate, play_gilrs_rumble.in_set(RumbleSystem));

crates/bevy_gilrs/src/rumble.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
11
//! Handle user specified rumble request events.
2-
use bevy_ecs::{
3-
prelude::{EventReader, Res},
4-
system::NonSendMut,
5-
};
2+
use bevy_ecs::prelude::{EventReader, Res};
3+
use bevy_ecs::system::{ResMut, Resource};
64
use bevy_input::gamepad::{GamepadRumbleIntensity, GamepadRumbleRequest};
75
use bevy_log::{debug, warn};
86
use bevy_time::Time;
9-
use bevy_utils::{Duration, HashMap};
7+
use bevy_utils::{synccell::SyncCell, Duration, HashMap};
108
use gilrs::{
119
ff::{self, BaseEffect, BaseEffectType, Repeat, Replay},
12-
GamepadId, Gilrs,
10+
GamepadId,
1311
};
1412
use thiserror::Error;
1513

16-
use crate::converter::convert_gamepad_id;
14+
use crate::{converter::convert_gamepad_id, Gilrs};
1715

1816
/// A rumble effect that is currently in effect.
1917
struct RunningRumble {
20-
/// Duration from app startup when this effect will be finished
18+
/// The time (since app startup) when this effect will be finished.
2119
deadline: Duration,
22-
/// A ref-counted handle to the specific force-feedback effect
20+
/// A ref-counted handle to the specific force-feedback effect.
2321
///
24-
/// Dropping it will cause the effect to stop
22+
/// Dropping it will end the effect.
2523
#[allow(dead_code)]
26-
effect: ff::Effect,
24+
effect: SyncCell<ff::Effect>,
2725
}
2826

2927
#[derive(Error, Debug)]
@@ -35,7 +33,7 @@ enum RumbleError {
3533
}
3634

3735
/// Contains the gilrs rumble effects that are currently running for each gamepad
38-
#[derive(Default)]
36+
#[derive(Resource, Default)]
3937
pub(crate) struct RunningRumbleEffects {
4038
/// If multiple rumbles are running at the same time, their resulting rumble
4139
/// will be the saturated sum of their strengths up until [`u16::MAX`]
@@ -79,8 +77,8 @@ fn get_base_effects(
7977
}
8078

8179
fn handle_rumble_request(
80+
gilrs: &mut gilrs::Gilrs,
8281
running_rumbles: &mut RunningRumbleEffects,
83-
gilrs: &mut Gilrs,
8482
rumble: GamepadRumbleRequest,
8583
current_time: Duration,
8684
) -> Result<(), RumbleError> {
@@ -113,17 +111,20 @@ fn handle_rumble_request(
113111

114112
let gamepad_rumbles = running_rumbles.rumbles.entry(gamepad_id).or_default();
115113
let deadline = current_time + duration;
116-
gamepad_rumbles.push(RunningRumble { deadline, effect });
114+
gamepad_rumbles.push(RunningRumble {
115+
deadline,
116+
effect: SyncCell::new(effect),
117+
});
117118
}
118119
}
119120

120121
Ok(())
121122
}
122123
pub(crate) fn play_gilrs_rumble(
123124
time: Res<Time>,
124-
mut gilrs: NonSendMut<Gilrs>,
125125
mut requests: EventReader<GamepadRumbleRequest>,
126-
mut running_rumbles: NonSendMut<RunningRumbleEffects>,
126+
mut gilrs: ResMut<Gilrs>,
127+
mut running_rumbles: ResMut<RunningRumbleEffects>,
127128
) {
128129
let current_time = time.raw_elapsed();
129130
// Remove outdated rumble effects.
@@ -138,7 +139,7 @@ pub(crate) fn play_gilrs_rumble(
138139
// Add new effects.
139140
for rumble in requests.read().cloned() {
140141
let gamepad = rumble.gamepad();
141-
match handle_rumble_request(&mut running_rumbles, &mut gilrs, rumble, current_time) {
142+
match handle_rumble_request(gilrs.get(), &mut running_rumbles, rumble, current_time) {
142143
Ok(()) => {}
143144
Err(RumbleError::GilrsError(err)) => {
144145
if let ff::Error::FfNotSupported(_) = err {

0 commit comments

Comments
 (0)