diff --git a/src/tween.rs b/src/tween.rs index 97d2029..f10d7c1 100644 --- a/src/tween.rs +++ b/src/tween.rs @@ -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 @@ -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( - q_tweener: Query<(Option<&Parent>, Has)>, - q_tween: Query<( - Entity, - &Tween, I>, - &TweenInterpolationValue, - )>, - q_component: Query<&mut I::Item>, -) where - C: Component, - I: Interpolator + 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( - q_tweener: Query<(Option<&Parent>, Has)>, - q_tween: Query<( - Entity, - &Tween, 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::>() - ); - 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::>()); - return; - } - }; - tween - .interpolator - .interpolate(&mut target_component, ease_value.0); - }) -} - -/// System alias for [`component_tween_system`] that uses boxed dynamic [`Interpolator`]. (`Box() -> SystemConfigs -where - C: Component, -{ - component_tween_system::>>.into_configs() -} - /// Convenient alias for [`Tween`] that [`TargetResource`] with generic [`Interpolator`]. pub type ResourceTween = Tween::Item>, I>; @@ -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( - q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, - resource: Option>, -) where - R: Resource, - I: Interpolator + 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( - q_tween: Query<( - &Tween, I>, - &TweenInterpolationValue, - )>, - resource: Option>, -) 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() -> SystemConfigs -where - R: Resource, -{ - resource_tween_system::>>.into_configs() -} - /// Convenient alias for [`Tween`] that [`TargetAsset`] with generic [`Interpolator`]. #[cfg(feature = "bevy_asset")] pub type AssetTween = Tween::Item>, I>; @@ -819,69 +676,3 @@ impl From<&[Handle; N]> for TargetAsset { 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( - q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, - asset: Option>>, -) where - A: Asset, - I: Interpolator + 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( - q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, - asset: Option>>, -) 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() -> SystemConfigs -where - A: Asset, -{ - asset_tween_system::>>.into_configs() -} diff --git a/src/tween/systems.rs b/src/tween/systems.rs new file mode 100644 index 0000000..02dadbb --- /dev/null +++ b/src/tween/systems.rs @@ -0,0 +1,226 @@ +use super::*; +use crate::interpolate::Interpolator; +use bevy::ecs::schedule::SystemConfigs; + +/// 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( + q_tweener: Query<(Option<&Parent>, Has)>, + q_tween: Query<( + Entity, + &Tween, I>, + &TweenInterpolationValue, + )>, + q_component: Query<&mut I::Item>, +) where + C: Component, + I: Interpolator + 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( + q_tweener: Query<(Option<&Parent>, Has)>, + q_tween: Query<( + Entity, + &Tween, 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::>() + ); + 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::>()); + return; + } + }; + tween + .interpolator + .interpolate(&mut target_component, ease_value.0); + }) +} + +/// System alias for [`component_tween_system`] that uses boxed dynamic [`Interpolator`]. (`Box() -> SystemConfigs +where + C: Component, +{ + component_tween_system::>>.into_configs() +} + +/// 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( + q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, + resource: Option>, +) where + R: Resource, + I: Interpolator + 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( + q_tween: Query<( + &Tween, I>, + &TweenInterpolationValue, + )>, + resource: Option>, +) 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() -> SystemConfigs +where + R: Resource, +{ + resource_tween_system::>>.into_configs() +} + +/// 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( + q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, + asset: Option>>, +) where + A: Asset, + I: Interpolator + 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( + q_tween: Query<(&Tween, I>, &TweenInterpolationValue)>, + asset: Option>>, +) 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() -> SystemConfigs +where + A: Asset, +{ + asset_tween_system::>>.into_configs() +}