diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a1730..6be00e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 @@ -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` diff --git a/Cargo.toml b/Cargo.toml index d265396..9b62720 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,9 +6,7 @@ edition = "2024" authors = ["Multirious", "Rabbival"] license = "MIT OR Apache-2.0" repository = "https://github.com/Multirious/bevy_tween" -homepage = "https://github.com/Multirious/bevy_tween" documentation = "https://docs.rs/bevy_tween" -readme = "README.md" keywords = ["bevy", "tween", "tweening", "easing", "animation"] categories = ["game-development"] @@ -39,7 +37,7 @@ features = ["derive"] version = "0.1.41" features = ["std"] -[dependencies.bevy_lookup_curve ] +[dependencies.bevy_lookup_curve] version = "0.12.0" optional = true @@ -59,19 +57,14 @@ features = [ "tonemapping_luts", "png", "bevy_sprite_render", - "bevy_post_process" + "bevy_post_process", ] [build-dependencies] rustc_version = "0.4.1" [features] -default = [ - "bevy_asset", - "bevy_render", - "bevy_sprite", - "bevy_ui", -] +default = ["bevy_asset", "bevy_render", "bevy_sprite", "bevy_ui"] # Adds tweening systems for asset bevy_asset = ["bevy/bevy_asset"] @@ -92,57 +85,37 @@ all-features = true [[example]] name = "banner_bounce" path = "examples/animation/banner_bounce.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "banner_triangle" path = "examples/animation/banner_triangle.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "thumbnail_triangle" path = "examples/animation/thumbnail_triangle.rs" -required-features = [ - "bevy_sprite", -] +required-features = ["bevy_sprite"] [[example]] name = "follow" path = "examples/demo/follow.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "click" path = "examples/demo/click.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "hold" path = "examples/demo/hold.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "event" path = "examples/demo/event.rs" -required-features = [ - "bevy_sprite", - "bevy_asset", -] +required-features = ["bevy_sprite", "bevy_asset"] [[example]] name = "entity_event" @@ -151,9 +124,7 @@ path = "examples/demo/entity_event.rs" [[example]] name = "sprite_sheet" path = "examples/demo/sprite_sheet.rs" -required-features = [ - "bevy_sprite", -] +required-features = ["bevy_sprite"] [[example]] name = "entity_structure" @@ -162,10 +133,7 @@ path = "examples/entity_structure.rs" [[example]] name = "bevy_lookup_curve" path = "examples/bevy_lookup_curve.rs" -required-features = [ - "bevy_sprite", - "bevy_lookup_curve", -] +required-features = ["bevy_sprite", "bevy_lookup_curve"] [[example]] name = "delta_tweens" diff --git a/src/interpolate.rs b/src/interpolate.rs index 97443a8..246a6c7 100644 --- a/src/interpolate.rs +++ b/src/interpolate.rs @@ -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; @@ -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}; diff --git a/src/interpolate/ui_transform.rs b/src/interpolate/ui_transform.rs new file mode 100644 index 0000000..96cf124 --- /dev/null +++ b/src/interpolate/ui_transform.rs @@ -0,0 +1,77 @@ +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 [`crate::interpolate::UiScale`] +pub fn ui_scale(start: Vec2, end: Vec2) -> UiScale { + UiScale { + start, + end, + delta: false, + } +} + +/// Constructor for [`crate::interpolate::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 [`crate::interpolate::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 [`crate::interpolate::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, + } + } +}