Skip to content

Commit

Permalink
Fix behavior when a source state transitions but the computed state i…
Browse files Browse the repository at this point in the history
…s unchanged
  • Loading branch information
benfrankel committed May 14, 2024
1 parent c1094ba commit 72b13ad
Showing 1 changed file with 20 additions and 20 deletions.
40 changes: 20 additions & 20 deletions crates/bevy_state/src/state/state_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,24 +94,24 @@ impl<S: InnerStateSet> StateSet for S {
fn register_computed_state_systems_in_schedule<T: ComputedStates<SourceStates = Self>>(
schedule: &mut Schedule,
) {
let system = |refresh: Option<ResMut<RefreshState<T>>>,
mut parent_changed: EventReader<StateTransitionEvent<S::RawState>>,
let system = |mut parent_changed: EventReader<StateTransitionEvent<S::RawState>>,
event: EventWriter<StateTransitionEvent<T>>,
commands: Commands,
current_state: Option<ResMut<State<T>>>,
refresh: Option<ResMut<RefreshState<T>>>,
state_set: Option<Res<State<S::RawState>>>| {
let refresh = refresh.is_some_and(|mut x| std::mem::take(&mut x.0));
if !refresh && parent_changed.is_empty() {
if parent_changed.is_empty() {
return;
}
parent_changed.clear();

let new_state =
if let Some(state_set) = S::convert_to_usable_state(state_set.as_deref()) {
T::compute(state_set)
} else {
None
};
let new_state = S::convert_to_usable_state(state_set.as_deref()).and_then(T::compute);

let same_state = current_state.as_ref().map(|x| x.get()) == new_state.as_ref();
let should_refresh = refresh.is_some_and(|mut x| std::mem::take(&mut x.0));
if same_state && !should_refresh {
return;
}

internal_apply_state_transition(event, commands, current_state, new_state);
};
Expand Down Expand Up @@ -153,12 +153,7 @@ impl<S: InnerStateSet> StateSet for S {
}
parent_changed.clear();

let new_state =
if let Some(state_set) = S::convert_to_usable_state(state_set.as_deref()) {
T::should_exist(state_set)
} else {
None
};
let new_state = S::convert_to_usable_state(state_set.as_deref()).and_then(T::should_exist);

if current_state.is_none() || new_state.is_none() {
internal_apply_state_transition(event, commands, current_state, new_state);
Expand Down Expand Up @@ -205,14 +200,13 @@ macro_rules! impl_state_set_sealed_tuples {
fn register_computed_state_systems_in_schedule<T: ComputedStates<SourceStates = Self>>(
schedule: &mut Schedule,
) {
let system = |refresh: Option<ResMut<RefreshState<T>>>,
($(mut $evt),*,): ($(EventReader<StateTransitionEvent<$param::RawState>>),*,),
let system = |($(mut $evt),*,): ($(EventReader<StateTransitionEvent<$param::RawState>>),*,),
event: EventWriter<StateTransitionEvent<T>>,
commands: Commands,
current_state: Option<ResMut<State<T>>>,
refresh: Option<ResMut<RefreshState<T>>>,
($($val),*,): ($(Option<Res<State<$param::RawState>>>),*,)| {
let refresh = refresh.is_some_and(|mut x| std::mem::take(&mut x.0));
if !refresh && ($($evt.is_empty())&&*) {
if ($($evt.is_empty())&&*) {
return;
}
$($evt.clear();)*
Expand All @@ -223,6 +217,12 @@ macro_rules! impl_state_set_sealed_tuples {
None
};

let same_state = current_state.as_ref().map(|x| x.get()) == new_state.as_ref();
let should_refresh = refresh.is_some_and(|mut x| std::mem::take(&mut x.0));
if same_state && !should_refresh {
return;
}

internal_apply_state_transition(event, commands, current_state, new_state);
};

Expand Down

0 comments on commit 72b13ad

Please sign in to comment.