#![allow(clippy::type_complexity)]
use crate::{
prelude::*, RotationEasingState, ScaleEasingState, TransformEasingSet, TranslationEasingState,
};
use bevy::prelude::*;
#[derive(Debug, Default)]
pub struct TransformInterpolationPlugin {
pub interpolate_translation_all: bool,
pub interpolate_rotation_all: bool,
pub interpolate_scale_all: bool,
}
impl TransformInterpolationPlugin {
pub const fn interpolate_all() -> Self {
Self {
interpolate_translation_all: true,
interpolate_rotation_all: true,
interpolate_scale_all: true,
}
}
}
impl Plugin for TransformInterpolationPlugin {
fn build(&self, app: &mut App) {
app.register_type::<(
TranslationInterpolation,
RotationInterpolation,
ScaleInterpolation,
)>();
app.add_systems(
FixedFirst,
(
complete_translation_easing,
complete_rotation_easing,
complete_scale_easing,
)
.chain()
.before(TransformEasingSet::Reset),
);
app.add_systems(
FixedFirst,
(
update_translation_interpolation_start,
update_rotation_interpolation_start,
update_scale_interpolation_start,
)
.chain()
.in_set(TransformEasingSet::UpdateStart),
);
app.add_systems(
FixedLast,
(
update_translation_interpolation_end,
update_rotation_interpolation_end,
update_scale_interpolation_end,
)
.chain()
.in_set(TransformEasingSet::UpdateEnd),
);
if self.interpolate_translation_all {
let _ = app.try_register_required_components::<Transform, TranslationInterpolation>();
}
if self.interpolate_rotation_all {
let _ = app.try_register_required_components::<Transform, RotationInterpolation>();
}
if self.interpolate_scale_all {
let _ = app.try_register_required_components::<Transform, ScaleInterpolation>();
}
}
fn finish(&self, app: &mut App) {
if !app.is_plugin_added::<TransformEasingPlugin>() {
app.add_plugins(TransformEasingPlugin);
}
}
}
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
#[reflect(Component, Debug, Default)]
#[require(TranslationInterpolation, RotationInterpolation, ScaleInterpolation)]
pub struct TransformInterpolation;
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
#[reflect(Component, Debug, Default)]
#[require(TranslationEasingState)]
pub struct TranslationInterpolation;
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
#[reflect(Component, Debug, Default)]
#[require(RotationEasingState)]
pub struct RotationInterpolation;
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
#[reflect(Component, Debug, Default)]
#[require(ScaleEasingState)]
pub struct ScaleInterpolation;
fn complete_translation_easing(
mut query: Query<
(&mut Transform, &TranslationEasingState),
(With<TranslationInterpolation>, Without<NoTranslationEasing>),
>,
) {
for (mut transform, easing) in &mut query {
if let Some(end) = easing.end {
transform.translation = end;
}
}
}
fn complete_rotation_easing(
mut query: Query<
(&mut Transform, &RotationEasingState),
(With<RotationInterpolation>, Without<NoRotationEasing>),
>,
) {
for (mut transform, easing) in &mut query {
if let Some(end) = easing.end {
transform.rotation = end;
}
}
}
fn complete_scale_easing(
mut query: Query<
(&mut Transform, &ScaleEasingState),
(With<ScaleInterpolation>, Without<NoScaleEasing>),
>,
) {
for (mut transform, easing) in &mut query {
if let Some(end) = easing.end {
transform.scale = end;
}
}
}
fn update_translation_interpolation_start(
mut query: Query<
(&Transform, &mut TranslationEasingState),
(With<TranslationInterpolation>, Without<NoTranslationEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.start = Some(transform.translation);
}
}
fn update_translation_interpolation_end(
mut query: Query<
(&Transform, &mut TranslationEasingState),
(With<TranslationInterpolation>, Without<NoTranslationEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.end = Some(transform.translation);
}
}
fn update_rotation_interpolation_start(
mut query: Query<
(&Transform, &mut RotationEasingState),
(With<RotationInterpolation>, Without<NoRotationEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.start = Some(transform.rotation);
}
}
fn update_rotation_interpolation_end(
mut query: Query<
(&Transform, &mut RotationEasingState),
(With<RotationInterpolation>, Without<NoRotationEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.end = Some(transform.rotation);
}
}
fn update_scale_interpolation_start(
mut query: Query<
(&Transform, &mut ScaleEasingState),
(With<ScaleInterpolation>, Without<NoScaleEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.start = Some(transform.scale);
}
}
fn update_scale_interpolation_end(
mut query: Query<
(&Transform, &mut ScaleEasingState),
(With<ScaleInterpolation>, Without<NoScaleEasing>),
>,
) {
for (transform, mut easing) in &mut query {
easing.end = Some(transform.scale);
}
}