use bevy::prelude::*;
pub trait Lens<T> {
fn lerp(&mut self, target: &mut T, ratio: f32);
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TextColorLens {
pub start: Color,
pub end: Color,
pub section: usize,
}
impl Lens<Text> for TextColorLens {
fn lerp(&mut self, target: &mut Text, ratio: f32) {
let value = self.start + (self.end + self.start * -1.0) * ratio;
target.sections[self.section].style.color = value;
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformPositionLens {
pub start: Vec3,
pub end: Vec3,
}
impl Lens<Transform> for TransformPositionLens {
fn lerp(&mut self, target: &mut Transform, ratio: f32) {
let value = self.start + (self.end - self.start) * ratio;
target.translation = value;
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformRotationLens {
pub start: Quat,
pub end: Quat,
}
impl Lens<Transform> for TransformRotationLens {
fn lerp(&mut self, target: &mut Transform, ratio: f32) {
let value = self.start + (self.end - self.start) * ratio;
target.rotation = value;
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TransformScaleLens {
pub start: Vec3,
pub end: Vec3,
}
impl Lens<Transform> for TransformScaleLens {
fn lerp(&mut self, target: &mut Transform, ratio: f32) {
let value = self.start + (self.end - self.start) * ratio;
target.scale = value;
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct UiPositionLens {
pub start: Rect<Val>,
pub end: Rect<Val>,
}
fn lerp_val(start: &Val, end: &Val, ratio: f32) -> Val {
match (start, end) {
(Val::Percent(start), Val::Percent(end)) => Val::Percent(start + (end - start) * ratio),
(Val::Px(start), Val::Px(end)) => Val::Px(start + (end - start) * ratio),
_ => *start,
}
}
impl Lens<Style> for UiPositionLens {
fn lerp(&mut self, target: &mut Style, ratio: f32) {
target.position = Rect {
left: lerp_val(&self.start.left, &self.end.left, ratio),
right: lerp_val(&self.start.right, &self.end.right, ratio),
top: lerp_val(&self.start.top, &self.end.top, ratio),
bottom: lerp_val(&self.start.bottom, &self.end.bottom, ratio),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct ColorMaterialColorLens {
pub start: Color,
pub end: Color,
}
impl Lens<ColorMaterial> for ColorMaterialColorLens {
fn lerp(&mut self, target: &mut ColorMaterial, ratio: f32) {
let value = self.start + (self.end + self.start * -1.) * ratio;
target.color = value;
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct SpriteColorLens {
pub start: Color,
pub end: Color,
}
impl Lens<Sprite> for SpriteColorLens {
fn lerp(&mut self, target: &mut Sprite, ratio: f32) {
let value = self.start + (self.end + self.start * -1.) * ratio;
target.color = value;
}
}