use bevy::prelude::*;
pub trait Lens<T> {
fn lerp(&mut self, target: Mut<'_, T>, ratio: f32);
}
#[cfg(feature = "bevy_text")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TextColorLens {
pub start: Color,
pub end: Color,
}
#[cfg(feature = "bevy_text")]
impl Lens<TextColor> for TextColorLens {
fn lerp(&mut self, mut target: Mut<TextColor>, ratio: f32) {
target.0 = self.start.mix(&self.end, ratio);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformPositionLens {
pub start: Vec3,
pub end: Vec3,
}
impl Lens<Transform> for TransformPositionLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
target.translation = self.start.lerp(self.end, ratio);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotationLens {
pub start: Quat,
pub end: Quat,
}
impl Lens<Transform> for TransformRotationLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
target.rotation = self.start.slerp(self.end, ratio);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateXLens {
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateXLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = Quat::from_rotation_x(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateYLens {
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateYLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = Quat::from_rotation_y(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateZLens {
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateZLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = Quat::from_rotation_z(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateAdditiveXLens {
pub base_rotation: Quat,
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateAdditiveXLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = self.base_rotation * Quat::from_rotation_x(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateAdditiveYLens {
pub base_rotation: Quat,
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateAdditiveYLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = self.base_rotation * Quat::from_rotation_y(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateAdditiveZLens {
pub base_rotation: Quat,
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateAdditiveZLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = self.base_rotation * Quat::from_rotation_z(angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotateAxisLens {
pub axis: Vec3,
pub start: f32,
pub end: f32,
}
impl Lens<Transform> for TransformRotateAxisLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
let angle = (self.end - self.start).mul_add(ratio, self.start);
target.rotation = Quat::from_axis_angle(self.axis, angle);
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformScaleLens {
pub start: Vec3,
pub end: Vec3,
}
impl Lens<Transform> for TransformScaleLens {
fn lerp(&mut self, mut target: Mut<Transform>, ratio: f32) {
target.scale = self.start + (self.end - self.start) * ratio;
}
}
#[cfg(feature = "bevy_ui")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiPositionLens {
pub start: UiRect,
pub end: UiRect,
}
#[cfg(feature = "bevy_ui")]
fn lerp_val(start: &Val, end: &Val, ratio: f32) -> Val {
match (start, end) {
(Val::Percent(start), Val::Percent(end)) => {
Val::Percent((end - start).mul_add(ratio, *start))
}
(Val::Px(start), Val::Px(end)) => Val::Px((end - start).mul_add(ratio, *start)),
(Val::Vw(start), Val::Vw(end)) => Val::Vw((end - start).mul_add(ratio, *start)),
(Val::Vh(start), Val::Vh(end)) => Val::Vh((end - start).mul_add(ratio, *start)),
(Val::VMin(start), Val::VMin(end)) => Val::VMin((end - start).mul_add(ratio, *start)),
(Val::VMax(start), Val::VMax(end)) => Val::VMax((end - start).mul_add(ratio, *start)),
_ => *start,
}
}
#[cfg(feature = "bevy_ui")]
impl Lens<Node> for UiPositionLens {
fn lerp(&mut self, mut target: Mut<Node>, ratio: f32) {
target.left = lerp_val(&self.start.left, &self.end.left, ratio);
target.right = lerp_val(&self.start.right, &self.end.right, ratio);
target.top = lerp_val(&self.start.top, &self.end.top, ratio);
target.bottom = lerp_val(&self.start.bottom, &self.end.bottom, ratio);
}
}
#[cfg(feature = "bevy_ui")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiTransformScaleLens {
pub start: Vec2,
pub end: Vec2,
}
#[cfg(feature = "bevy_ui")]
impl Lens<UiTransform> for UiTransformScaleLens {
fn lerp(&mut self, mut target: Mut<UiTransform>, ratio: f32) {
target.scale = self.start.lerp(self.end, ratio);
}
}
#[cfg(feature = "bevy_ui")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiTransformRotationLens {
pub start: Rot2,
pub end: Rot2,
}
#[cfg(feature = "bevy_ui")]
impl Lens<UiTransform> for UiTransformRotationLens {
fn lerp(&mut self, mut target: Mut<UiTransform>, ratio: f32) {
target.rotation = self.start.slerp(self.end, ratio);
}
}
#[cfg(feature = "bevy_ui")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiTransformTranslationPxLens {
pub start: Vec2,
pub end: Vec2,
}
#[cfg(feature = "bevy_ui")]
impl Lens<UiTransform> for UiTransformTranslationPxLens {
fn lerp(&mut self, mut target: Mut<UiTransform>, ratio: f32) {
let p = self.start.lerp(self.end, ratio);
target.translation = Val2::px(p.x, p.y);
}
}
#[cfg(feature = "bevy_ui")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiBackgroundColorLens {
pub start: Color,
pub end: Color,
}
#[cfg(feature = "bevy_ui")]
impl Lens<BackgroundColor> for UiBackgroundColorLens {
fn lerp(&mut self, mut target: Mut<BackgroundColor>, ratio: f32) {
target.0 = self.start.mix(&self.end, ratio);
}
}
#[cfg(feature = "bevy_sprite")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct ColorMaterialColorLens {
pub start: Color,
pub end: Color,
}
#[cfg(feature = "bevy_sprite")]
impl Lens<ColorMaterial> for ColorMaterialColorLens {
fn lerp(&mut self, mut target: Mut<ColorMaterial>, ratio: f32) {
target.color = self.start.mix(&self.end, ratio);
}
}
#[cfg(feature = "bevy_sprite")]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct SpriteColorLens {
pub start: Color,
pub end: Color,
}
#[cfg(feature = "bevy_sprite")]
impl Lens<Sprite> for SpriteColorLens {
fn lerp(&mut self, mut target: Mut<Sprite>, ratio: f32) {
let value = self.start.mix(&self.end, ratio);
target.color = value;
}
}
#[cfg(test)]
mod tests {
use std::f32::consts::TAU;
#[cfg(any(feature = "bevy_sprite", feature = "bevy_text"))]
use bevy::color::palettes::css::{BLUE, RED};
use bevy::ecs::{change_detection::MaybeLocation, change_detection::Tick};
use super::*;
#[cfg(feature = "bevy_text")]
#[test]
fn text_color() {
let mut lens = TextColorLens {
start: RED.into(),
end: BLUE.into(),
};
let mut text_color = TextColor::default();
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut text_color,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert_eq!(text_color.0, RED.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut text_color,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert_eq!(text_color.0, BLUE.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut text_color,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert_eq!(text_color.0, Color::srgba(0.7, 0., 0.3, 1.0));
}
#[test]
fn transform_position() {
let mut lens = TransformPositionLens {
start: Vec3::ZERO,
end: Vec3::new(1., 2., -4.),
};
let mut transform = Transform::default();
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert!(transform
.translation
.abs_diff_eq(Vec3::new(1., 2., -4.), 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert!(transform
.translation
.abs_diff_eq(Vec3::new(0.3, 0.6, -1.2), 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_rotation() {
let mut lens = TransformRotationLens {
start: Quat::IDENTITY,
end: Quat::from_rotation_z(100_f32.to_radians()),
};
let mut transform = Transform::default();
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_rotation_z(100_f32.to_radians()), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_rotation_z(30_f32.to_radians()), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_rotate_x() {
let mut lens = TransformRotateXLens {
start: 0.,
end: 1440_f32.to_radians(), };
let mut transform = Transform::default();
for (index, ratio) in [0., 0.25, 0.5, 0.75, 1.].iter().enumerate() {
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, *ratio);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
if index == 1 || index == 3 {
assert!(transform
.rotation
.abs_diff_eq(Quat::from_xyzw(0., 0., 0., -1.), 1e-5));
} else {
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
}
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.1);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_rotation_x(0.1 * (4. * TAU)), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_rotate_y() {
let mut lens = TransformRotateYLens {
start: 0.,
end: 1440_f32.to_radians(), };
let mut transform = Transform::default();
for (index, ratio) in [0., 0.25, 0.5, 0.75, 1.].iter().enumerate() {
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, *ratio);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
if index == 1 || index == 3 {
assert!(transform
.rotation
.abs_diff_eq(Quat::from_xyzw(0., 0., 0., -1.), 1e-5));
} else {
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
}
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.1);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_rotation_y(0.1 * (4. * TAU)), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_rotate_z() {
let mut lens = TransformRotateZLens {
start: 0.,
end: 1440_f32.to_radians(), };
let mut transform = Transform::default();
for (index, ratio) in [0., 0.25, 0.5, 0.75, 1.].iter().enumerate() {
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, *ratio);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
if index == 1 || index == 3 {
assert!(transform
.rotation
.abs_diff_eq(Quat::from_xyzw(0., 0., 0., -1.), 1e-5));
} else {
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
}
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.1);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_rotation_z(0.1 * (4. * TAU)), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_rotate_axis() {
let axis = Vec3::ONE.normalize();
let mut lens = TransformRotateAxisLens {
axis,
start: 0.,
end: 1440_f32.to_radians(), };
let mut transform = Transform::default();
for (index, ratio) in [0., 0.25, 0.5, 0.75, 1.].iter().enumerate() {
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, *ratio);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
if index == 1 || index == 3 {
assert!(transform
.rotation
.abs_diff_eq(Quat::from_xyzw(0., 0., 0., -1.), 1e-5));
} else {
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
}
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.1);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform
.rotation
.abs_diff_eq(Quat::from_axis_angle(axis, 0.1 * (4. * TAU)), 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ONE, 1e-5));
}
#[test]
fn transform_scale() {
let mut lens = TransformScaleLens {
start: Vec3::ZERO,
end: Vec3::new(1., 2., -4.),
};
let mut transform = Transform::default();
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::ZERO, 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::new(1., 2., -4.), 1e-5));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut transform,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert!(transform.translation.abs_diff_eq(Vec3::ZERO, 1e-5));
assert!(transform.rotation.abs_diff_eq(Quat::IDENTITY, 1e-5));
assert!(transform.scale.abs_diff_eq(Vec3::new(0.3, 0.6, -1.2), 1e-5));
}
#[cfg(feature = "bevy_ui")]
#[test]
fn ui_position() {
let mut lens = UiPositionLens {
start: UiRect {
left: Val::Px(0.),
top: Val::Px(0.),
right: Val::Auto,
bottom: Val::Percent(25.),
},
end: UiRect {
left: Val::Px(1.),
top: Val::Px(5.),
right: Val::Auto,
bottom: Val::Percent(45.),
},
};
let mut node = Node::default();
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut node,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert_eq!(node.left, Val::Px(0.));
assert_eq!(node.top, Val::Px(0.));
assert_eq!(node.right, Val::Auto);
assert_eq!(node.bottom, Val::Percent(25.));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut node,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert_eq!(node.left, Val::Px(1.));
assert_eq!(node.top, Val::Px(5.));
assert_eq!(node.right, Val::Auto);
assert_eq!(node.bottom, Val::Percent(45.));
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut node,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert_eq!(node.left, Val::Px(0.3));
assert_eq!(node.top, Val::Px(1.5));
assert_eq!(node.right, Val::Auto);
assert_eq!(node.bottom, Val::Percent(31.));
}
#[cfg(feature = "bevy_sprite")]
#[test]
fn colormaterial_color() {
let mut lens = ColorMaterialColorLens {
start: RED.into(),
end: BLUE.into(),
};
let mut assets = Assets::default();
let handle = assets.add(ColorMaterial {
color: Color::WHITE,
texture: None,
..default()
});
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let asset = assets.get_mut(handle.id()).unwrap();
let target = Mut::new(
asset,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert_eq!(assets.get(handle.id()).unwrap().color, RED.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let asset = assets.get_mut(handle.id()).unwrap();
let target = Mut::new(
asset,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert_eq!(assets.get(handle.id()).unwrap().color, BLUE.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let asset = assets.get_mut(handle.id()).unwrap();
let target = Mut::new(
asset,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert_eq!(
assets.get(handle.id()).unwrap().color,
Color::srgba(0.7, 0., 0.3, 1.0)
);
}
#[cfg(feature = "bevy_sprite")]
#[test]
fn sprite_color() {
let mut lens = SpriteColorLens {
start: RED.into(),
end: BLUE.into(),
};
let mut sprite = Sprite {
color: Color::WHITE,
..default()
};
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut sprite,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.);
}
assert_eq!(sprite.color, RED.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut sprite,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 1.);
}
assert_eq!(sprite.color, BLUE.into());
{
let mut added = Tick::new(0);
let mut last_changed = Tick::new(0);
let mut caller = MaybeLocation::caller();
let target = Mut::new(
&mut sprite,
&mut added,
&mut last_changed,
Tick::new(0),
Tick::new(0),
caller.as_mut(),
);
lens.lerp(target, 0.3);
}
assert_eq!(sprite.color, Color::srgba(0.7, 0., 0.3, 1.0));
}
}