enricobuehler 8523e44029 add staggered text
rename box to rect
refactor rust
2023-05-23 10:27:45 +02:00

128 lines
3.2 KiB
Rust

use super::{
entities::common::AnimationData,
keyframe::{Keyframe, Keyframes},
};
use serde::{Deserialize, Serialize};
pub trait AnimatedValue<T> {
fn sort_keyframes(&mut self);
fn get_value_at_frame(&self, curr_frame: i32, animation_data: &AnimationData, fps: i16) -> T;
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AnimatedFloat {
pub keyframes: Keyframes,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AnimatedFloatVec2 {
pub keyframes: (AnimatedFloat, AnimatedFloat),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AnimatedFloatVec3 {
pub keyframes: (AnimatedFloat, AnimatedFloat, AnimatedFloat),
}
impl AnimatedFloat {
pub fn new(val: f32) -> AnimatedFloat {
AnimatedFloat {
keyframes: Keyframes {
values: vec![Keyframe {
value: val,
offset: 0.0,
interpolation: None,
}],
},
}
}
}
impl AnimatedFloatVec2 {
pub fn new(x: f32, y: f32) -> AnimatedFloatVec2 {
AnimatedFloatVec2 {
keyframes: (AnimatedFloat::new(x), AnimatedFloat::new(y)),
}
}
}
impl AnimatedFloatVec3 {
pub fn new(x: f32, y: f32, z: f32) -> AnimatedFloatVec3 {
AnimatedFloatVec3 {
keyframes: (
AnimatedFloat::new(x),
AnimatedFloat::new(y),
AnimatedFloat::new(z),
),
}
}
}
impl AnimatedValue<f32> for AnimatedFloat {
fn sort_keyframes(&mut self) {
self.keyframes.sort();
}
fn get_value_at_frame(&self, curr_frame: i32, animation_data: &AnimationData, fps: i16) -> f32 {
self.keyframes
.get_value_at_frame(curr_frame, &animation_data, fps)
}
}
impl AnimatedValue<(f32, f32, f32)> for AnimatedFloatVec3 {
fn sort_keyframes(&mut self) {
self.keyframes.0.sort_keyframes();
self.keyframes.1.sort_keyframes();
self.keyframes.2.sort_keyframes();
}
fn get_value_at_frame(
&self,
curr_frame: i32,
animation_data: &AnimationData,
fps: i16,
) -> (f32, f32, f32) {
let x = self
.keyframes
.0
.get_value_at_frame(curr_frame, animation_data, fps);
let y = self
.keyframes
.1
.get_value_at_frame(curr_frame, animation_data, fps);
let z = self
.keyframes
.1
.get_value_at_frame(curr_frame, animation_data, fps);
return (x, y, z);
}
}
impl AnimatedValue<(f32, f32)> for AnimatedFloatVec2 {
fn sort_keyframes(&mut self) {
self.keyframes.0.sort_keyframes();
self.keyframes.1.sort_keyframes();
}
fn get_value_at_frame(
&self,
curr_frame: i32,
animation_data: &AnimationData,
fps: i16,
) -> (f32, f32) {
let x = self
.keyframes
.0
.get_value_at_frame(curr_frame, animation_data, fps);
let y = self
.keyframes
.1
.get_value_at_frame(curr_frame, animation_data, fps);
return (x, y);
}
}