Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## Unreleased - XXXX-XX-XX

- Make AnimationTarget derives Clone and Copy by [#90](https://github.com/Multirious/bevy_tween/pull/90)
- Add UiScale interpolator for UiTransform by [#92](https://github.com/Multirious/bevy_tween/pull/92)

## v0.13.0 - 2026-07-03

Expand Down Expand Up @@ -36,6 +37,7 @@
- Add `time_context_animation` example.

Internal:

- Update flake by [#77](https://github.com/Multirious/bevy_tween/pull/77)
- Use latest instead of a version for stableRust in flake.nix
- `nix flake update`
Expand Down
5 changes: 5 additions & 0 deletions src/interpolate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ mod sprite;
mod transform;
#[cfg(feature = "bevy_ui")]
mod ui;
#[cfg(feature = "bevy_ui")]
mod ui_transform;

use std::marker::PhantomData;

Expand All @@ -86,6 +88,9 @@ pub use sprite::*;
#[cfg(feature = "bevy_ui")]
pub use ui::*;

#[cfg(feature = "bevy_ui")]
pub use ui_transform::*;

use crate::{BevyTweenRegisterSystems, tween};
use bevy::ecs::schedule::{InternedScheduleLabel, ScheduleLabel};

Expand Down
76 changes: 76 additions & 0 deletions src/interpolate/ui_transform.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
use crate::interpolate::Interpolator;
use bevy::prelude::*;

/// [`Interpolator`] for [`UiTransform`]'s scale
#[derive(Debug, Default, Clone, PartialEq, Reflect)]
pub struct UiScale {
/// Starting [`UiTransform`]'s scale
pub start: Vec2,
/// Ending [`UiTransform`]'s scale
pub end: Vec2,
/// whether it increments by delta or sets absolute values
pub delta: bool,
}
impl Interpolator for UiScale {
type Item = UiTransform;

fn interpolate(
&self,
item: &mut Self::Item,
value: f32,
previous_value: f32,
) {
if self.delta {
let previous_scale = self.start.lerp(self.end, previous_value);
let next_scale = self.start.lerp(self.end, value);
let scale_delta = next_scale - previous_scale;
item.scale += scale_delta;
} else {
item.scale = self.start.lerp(self.end, value);
}
}
}

/// Constructor for [`UiScale`]
pub fn ui_scale(start: Vec2, end: Vec2) -> UiScale {
UiScale {
start,
end,
delta: false,
}
}

/// Constructor for [`UiScale`] relative to previous value using currying.
pub fn ui_scale_to(to: Vec2) -> impl Fn(&mut Vec2) -> UiScale {
move |state| {
let start = *state;
let end = to;
*state = to;
ui_scale(start, end)
}
}

/// Constructor for [`UiScale`] relative to previous value using currying.
pub fn ui_scale_by(by: Vec2) -> impl Fn(&mut Vec2) -> UiScale {
move |state| {
let start = *state;
let end = *state + by;
*state += by;
ui_scale(start, end)
}
}

/// Constructor for [`UiScale`] relative to previous value.
/// Since this is a delta tween, it can run alongside other ongoing tweens of that type.
pub fn ui_scale_delta_by(by: Vec2) -> impl Fn(&mut Vec2) -> UiScale {
move |state| {
let start = *state;
let end = *state + by;
*state += by;
UiScale {
start,
end,
delta: true,
}
}
}
Loading