use crate::interpolate::Interpolator;
use bevy::prelude::*;
#[derive(Debug, Default, Clone, PartialEq, Reflect)]
pub struct SpriteColor {
#[allow(missing_docs)]
pub start: Color,
#[allow(missing_docs)]
pub end: Color,
pub delta: bool
}
impl Interpolator for SpriteColor {
type Item = Sprite;
fn interpolate(&self, item: &mut Self::Item, value: f32, previous_value: f32) {
if self.delta{
let previous_color_as_vec = self.start.mix(&self.end, previous_value).to_linear();
let next_color_as_vec = self.start.mix(&self.end, value).to_linear();
let updated_color = item.color.to_linear() + (next_color_as_vec - previous_color_as_vec);
item.color = updated_color.into();
}else{
item.color = self.start.mix(&self.end, value)
}
}
}
pub fn sprite_color(start: Color, end: Color) -> SpriteColor {
SpriteColor { start, end, delta: false }
}
pub fn sprite_color_to(to: Color) -> impl Fn(&mut Color) -> SpriteColor {
move |state| {
let start = *state;
let end = to;
*state = to;
sprite_color(start, end)
}
}
pub fn sprite_color_delta_to(to: Color) -> impl Fn(&mut Color) -> SpriteColor {
move |state| {
let start = *state;
let end = to;
*state = to;
SpriteColor {start, end, delta: true}
}
}
#[derive(Debug, Default, Clone, PartialEq, Reflect)]
pub struct ColorMaterial {
#[allow(missing_docs)]
pub start: Color,
#[allow(missing_docs)]
pub end: Color,
pub delta: bool
}
impl Interpolator for ColorMaterial {
type Item = bevy::sprite_render::ColorMaterial;
fn interpolate(&self, item: &mut Self::Item, value: f32, previous_value: f32) {
if self.delta {
let previous_color_as_vec = self.start.mix(&self.end, previous_value).to_linear();
let next_color_as_vec = self.start.mix(&self.end, value).to_linear();
let updated_color = item.color.to_linear() + (next_color_as_vec - previous_color_as_vec);
item.color = updated_color.into();
}else{
item.color = self.start.mix(&self.end, value);
}
}
}
pub fn color_material(start: Color, end: Color) -> ColorMaterial {
ColorMaterial { start, end, delta: false }
}
pub fn color_material_to(to: Color) -> impl Fn(&mut Color) -> ColorMaterial {
move |state| {
let start = *state;
let end = to;
*state = to;
color_material(start, end)
}
}
pub fn color_material_delta_to(to: Color) -> impl Fn(&mut Color) -> ColorMaterial {
move |state| {
let start = *state;
let end = to;
*state = to;
ColorMaterial{start, end, delta: true}
}
}