use tween::ComponentTween;
use crate::interpolate::*;
use crate::tween::{self, TargetComponent, Tween};
use bevy::prelude::*;
pub struct TargetState<T, V> {
pub target: T,
pub value: V,
}
impl<T, V> TargetState<T, V> {
pub fn new(target: T, value: V) -> Self {
TargetState { target, value }
}
pub fn set_value(&mut self, new_value: V) -> &mut Self {
self.value = new_value;
self
}
pub fn set_target(&mut self, new_target: T) -> &mut Self {
self.target = new_target;
self
}
}
impl<T, V> TargetState<T, V>
where
T: Clone,
{
pub fn with<I>(&mut self, f: impl FnOnce(&mut V) -> I) -> Tween<T, I> {
let interpolator = f(&mut self.value);
Tween {
target: self.target.clone(),
interpolator,
}
}
}
pub trait TransformTargetStateExt {
fn transform_state(&self, value: Transform) -> TransformTargetState;
}
impl TransformTargetStateExt for TargetComponent {
fn transform_state(&self, value: Transform) -> TransformTargetState {
TransformTargetState::new(self.clone(), value)
}
}
pub struct TransformTargetState {
target: TargetComponent,
value: Transform,
}
impl TransformTargetState {
pub fn new(
target: TargetComponent,
value: Transform,
) -> TransformTargetState {
TransformTargetState { target, value }
}
pub fn transform_with<I>(
&mut self,
f: impl FnOnce(&mut Transform) -> I,
) -> Tween<TargetComponent, I> {
let interpolator = f(&mut self.value);
Tween {
target: self.target.clone(),
interpolator,
}
}
pub fn translation_with<I>(
&mut self,
f: impl FnOnce(&mut Vec3) -> I,
) -> Tween<TargetComponent, I> {
self.transform_with(|v| f(&mut v.translation))
}
pub fn rotation_with<I>(
&mut self,
f: impl FnOnce(&mut Quat) -> I,
) -> Tween<TargetComponent, I> {
self.transform_with(|v| f(&mut v.rotation))
}
pub fn scale_with<I>(
&mut self,
f: impl FnOnce(&mut Vec3) -> I,
) -> Tween<TargetComponent, I> {
self.transform_with(|v| f(&mut v.scale))
}
pub fn translation_to(&mut self, to: Vec3) -> ComponentTween<Translation> {
self.translation_with(translation_to(to))
}
pub fn rotation_to(&mut self, to: Quat) -> ComponentTween<Rotation> {
self.rotation_with(rotation_to(to))
}
pub fn scale_to(&mut self, to: Vec3) -> ComponentTween<Scale> {
self.scale_with(scale_to(to))
}
pub fn translation_by(&mut self, by: Vec3) -> ComponentTween<Translation> {
self.translation_with(translation_by(by))
}
pub fn rotation_by(&mut self, by: Quat) -> ComponentTween<Rotation> {
self.rotation_with(rotation_by(by))
}
pub fn scale_by(&mut self, by: Vec3) -> ComponentTween<Scale> {
self.scale_with(scale_by(by))
}
pub fn translation_delta_by(&mut self, by: Vec3) -> ComponentTween<Translation> {
self.translation_with(translation_delta_by(by))
}
pub fn rotation_delta_by(&mut self, by: Quat) -> ComponentTween<Rotation> {
self.rotation_with(rotation_delta_by(by))
}
pub fn scale_delta_by(&mut self, by: Vec3) -> ComponentTween<Scale> {
self.scale_with(scale_delta_by(by))
}
}