use bevy::prelude::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{clip::Clip, easing::Easing};
#[derive(Debug, Clone, Copy, Reflect)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[reflect(Debug)]
pub enum AnimationDuration {
PerFrame(u32),
PerRepetition(u32),
}
impl Default for AnimationDuration {
fn default() -> Self {
Self::PerFrame(100)
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[reflect(Debug, PartialEq, Hash)]
pub enum AnimationRepeat {
#[default]
Loop,
Times(usize),
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[reflect(Debug, PartialEq, Hash)]
pub enum AnimationDirection {
#[default]
Forwards,
Backwards,
PingPong,
}
#[derive(Asset, Debug, Clone, Reflect)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[reflect(Debug)]
pub struct Animation {
pub(crate) clips: Vec<Clip>,
pub(crate) duration: Option<AnimationDuration>,
pub(crate) repetitions: Option<AnimationRepeat>,
pub(crate) direction: Option<AnimationDirection>,
pub(crate) easing: Option<Easing>,
}
impl Animation {
pub(crate) fn empty() -> Self {
Self {
clips: vec![Clip::empty()],
duration: None,
repetitions: None,
direction: None,
easing: None,
}
}
pub fn clips(&self) -> &[Clip] {
&self.clips
}
pub fn duration(&self) -> &Option<AnimationDuration> {
&self.duration
}
pub fn repetitions(&self) -> &Option<AnimationRepeat> {
&self.repetitions
}
pub fn direction(&self) -> &Option<AnimationDirection> {
&self.direction
}
pub fn easing(&self) -> &Option<Easing> {
&self.easing
}
}