Skip to content

Commit

Permalink
Move tween systems into its own module
Browse files Browse the repository at this point in the history
  • Loading branch information
Multirious committed Mar 26, 2024
1 parent 964f2f1 commit 61db1ec
Show file tree
Hide file tree
Showing 2 changed files with 244 additions and 227 deletions.
245 changes: 18 additions & 227 deletions src/tween.rs
Original file line number Diff line number Diff line change
Expand Up @@ -230,13 +230,27 @@
//! [`interpolate`]: crate::interpolate
//! [`DefaultTweenPlugins`]: crate::DefaultTweenPlugins

use bevy::prelude::*;
use std::{any::type_name, marker::PhantomData, time::Duration};

use bevy::ecs::schedule::SystemConfigs;
use bevy::prelude::*;
use crate::{interpolate::Interpolator, tween_timer::AnimationDirection};

use crate::interpolate::Interpolator;
use crate::tween_timer::AnimationDirection;
mod systems;
#[allow(deprecated)]
#[cfg(feature = "bevy_asset")]
pub use systems::{
asset_dyn_tween_system, asset_tween_system, asset_tween_system_full,
};
#[allow(deprecated)]
pub use systems::{
component_dyn_tween_system, component_tween_system,
component_tween_system_full,
};
#[allow(deprecated)]
pub use systems::{
resource_dyn_tween_system, resource_tween_system,
resource_tween_system_full,
};

/// [`TweenState`] should be automatically managed by a tweener.
/// User just have to add this component to a tween entity and an assigned
Expand Down Expand Up @@ -534,114 +548,6 @@ where
}
}

/// Tween any [`Tween`] with the [`Interpolator`] that [`TargetComponent`] with
/// value provided by [`TweenInterpolationValue`] component.
#[allow(clippy::type_complexity)]
#[deprecated(
since = "0.3.0",
note = "Use `component_tween_system` instead with less required generic"
)]
pub fn component_tween_system_full<C, I>(
q_tweener: Query<(Option<&Parent>, Has<TweenerMarker>)>,
q_tween: Query<(
Entity,
&Tween<TargetComponent<C>, I>,
&TweenInterpolationValue,
)>,
q_component: Query<&mut I::Item>,
) where
C: Component,
I: Interpolator<Item = C> + Send + Sync + 'static,
{
component_tween_system(q_tweener, q_tween, q_component);
}

/// Tween any [`Tween`] with the [`Interpolator`] that [`TargetComponent`] with
/// value provided by [`TweenInterpolationValue`] component.
#[allow(clippy::type_complexity)]
pub fn component_tween_system<I>(
q_tweener: Query<(Option<&Parent>, Has<TweenerMarker>)>,
q_tween: Query<(
Entity,
&Tween<TargetComponent<I::Item>, I>,
&TweenInterpolationValue,
)>,
mut q_component: Query<&mut I::Item>,
) where
I: Interpolator + Send + Sync + 'static,
I::Item: Component,
{
q_tween.iter().for_each(|(entity, tween, ease_value)| {
let target = match &tween.target {
TargetComponent::TweenerEntity(_) => match q_tweener.get(entity) {
Ok((_, true)) => entity,
Ok((Some(this_parent), false)) => {
match q_tweener.get(this_parent.get()) {
Ok((_, true)) => this_parent.get(),
_ => return,
}
}
_ => return,
},
TargetComponent::TweenerParent(_) => match q_tweener.get(entity) {
Ok((Some(this_parent), true)) => this_parent.get(),
Ok((Some(this_parent), false)) => {
match q_tweener.get(this_parent.get()) {
Ok((Some(tweener_parent), true)) => {
tweener_parent.get()
}
_ => return,
}
}
_ => return,
},
TargetComponent::Entity(e, _) => *e,
TargetComponent::Entities(e, _) => {
for &target in e {
let mut target_component = match q_component.get_mut(target)
{
Ok(target_component) => target_component,
Err(e) => {
warn!(
"{} query error: {e}",
type_name::<ComponentTween<I>>()
);
continue;
}
};
tween
.interpolator
.interpolate(&mut target_component, ease_value.0);
}
return;
}
};

let mut target_component = match q_component.get_mut(target) {
Ok(target_component) => target_component,
Err(e) => {
warn!("{} query error: {e}", type_name::<ComponentTween<I>>());
return;
}
};
tween
.interpolator
.interpolate(&mut target_component, ease_value.0);
})
}

/// System alias for [`component_tween_system`] that uses boxed dynamic [`Interpolator`]. (`Box<dyn Interpolator`)
#[deprecated(
since = "0.3.0",
note = "Use `component_tween_system::<BoxedInterpolator<...>>` for consistency"
)]
pub fn component_dyn_tween_system<C>() -> SystemConfigs
where
C: Component,
{
component_tween_system::<Box<dyn Interpolator<Item = C>>>.into_configs()
}

/// Convenient alias for [`Tween`] that [`TargetResource`] with generic [`Interpolator`].
pub type ResourceTween<I> = Tween<TargetResource<<I as Interpolator>::Item>, I>;

Expand Down Expand Up @@ -672,55 +578,6 @@ where
type Item = R;
}

/// Tween any [`Tween`] with the [`Interpolator`] that [`TargetResource`] with
/// value provided by [`TweenInterpolationValue`] component.
#[deprecated(
since = "0.3.0",
note = "Use `resource_tween_system` instead with less required generic"
)]
pub fn resource_tween_system_full<R, I>(
q_tween: Query<(&Tween<TargetResource<R>, I>, &TweenInterpolationValue)>,
resource: Option<ResMut<I::Item>>,
) where
R: Resource,
I: Interpolator<Item = R> + Send + Sync + 'static,
{
resource_tween_system(q_tween, resource);
}

/// System alias for [`resource_tween_system_full`] that uses generic [`Interpolator`]..
#[allow(clippy::type_complexity)]
pub fn resource_tween_system<I>(
q_tween: Query<(
&Tween<TargetResource<I::Item>, I>,
&TweenInterpolationValue,
)>,
resource: Option<ResMut<I::Item>>,
) where
I: Interpolator,
I::Item: Resource,
{
let Some(mut resource) = resource else {
warn!("Resource does not exists for a resource tween.");
return;
};
q_tween.iter().for_each(|(tween, ease_value)| {
tween.interpolator.interpolate(&mut resource, ease_value.0);
})
}

/// System alias for [`resource_tween_system_full`] that uses boxed dynamic [`Interpolator`]. (`Box<dyn Interpolator`)
#[deprecated(
since = "0.3.0",
note = "Use `resource_tween_system::<BoxedInterpolator<...>>` for consistency"
)]
pub fn resource_dyn_tween_system<R>() -> SystemConfigs
where
R: Resource,
{
resource_tween_system::<Box<dyn Interpolator<Item = R>>>.into_configs()
}

/// Convenient alias for [`Tween`] that [`TargetAsset`] with generic [`Interpolator`].
#[cfg(feature = "bevy_asset")]
pub type AssetTween<I> = Tween<TargetAsset<<I as Interpolator>::Item>, I>;
Expand Down Expand Up @@ -819,69 +676,3 @@ impl<A: Asset, const N: usize> From<&[Handle<A>; N]> for TargetAsset<A> {
TargetAsset::assets(value.iter().cloned())
}
}

/// Tween any [`Tween`] with the [`Interpolator`] that [`TargetAsset`] with
/// value provided by [`TweenInterpolationValue`] component.
#[cfg(feature = "bevy_asset")]
#[deprecated(
since = "0.3.0",
note = "Use `asset_tween_system` instead with less required generic"
)]
pub fn asset_tween_system_full<A, I>(
q_tween: Query<(&Tween<TargetAsset<A>, I>, &TweenInterpolationValue)>,
asset: Option<ResMut<Assets<I::Item>>>,
) where
A: Asset,
I: Interpolator<Item = A> + Send + Sync + 'static,
{
asset_tween_system(q_tween, asset);
}

/// System alias for [`asset_tween_system_full`] that uses generic [`Interpolator`].
#[cfg(feature = "bevy_asset")]
#[allow(clippy::type_complexity)]
pub fn asset_tween_system<I>(
q_tween: Query<(&Tween<TargetAsset<I::Item>, I>, &TweenInterpolationValue)>,
asset: Option<ResMut<Assets<I::Item>>>,
) where
I: Interpolator,
I::Item: Asset,
{
let Some(mut asset) = asset else {
warn!("Asset resource does not exists for an asset tween.");
return;
};
q_tween
.iter()
.for_each(|(tween, ease_value)| match &tween.target {
TargetAsset::Asset(a) => {
let Some(asset) = asset.get_mut(a) else {
warn!("Asset not found for an asset tween");
return;
};
tween.interpolator.interpolate(asset, ease_value.0);
}
TargetAsset::Assets(assets) => {
for a in assets {
let Some(a) = asset.get_mut(a) else {
warn!("Asset not found for an asset tween");
continue;
};
tween.interpolator.interpolate(a, ease_value.0);
}
}
})
}

/// System alias for [`asset_tween_system_full`] that uses boxed dynamic [`Interpolator`]. (`Box<dyn Interpolator`)
#[cfg(feature = "bevy_asset")]
#[deprecated(
since = "0.3.0",
note = "Use `asset_tween_system::<BoxedInterpolator<...>>` for consistency"
)]
pub fn asset_dyn_tween_system<A>() -> SystemConfigs
where
A: Asset,
{
asset_tween_system::<Box<dyn Interpolator<Item = A>>>.into_configs()
}
Loading

0 comments on commit 61db1ec

Please sign in to comment.