1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use Matrix;
pub trait Animation {
fn animate(&self, percent: f32) -> Matrix;
}
pub struct Translation {
pub initial_offset: [f32; 2],
}
impl Translation {
#[inline]
pub fn new(initial_offset: [f32; 2]) -> Translation {
Translation {
initial_offset: initial_offset,
}
}
}
impl Animation for Translation {
#[inline]
fn animate(&self, percent: f32) -> Matrix {
let x = (1.0 - percent) * self.initial_offset[0];
let y = (1.0 - percent) * self.initial_offset[1];
Matrix::translate(x, y)
}
}
pub struct Zoom {
pub initial_zoom: f32,
}
impl Zoom {
#[inline]
pub fn new(initial_zoom: f32) -> Zoom {
Zoom {
initial_zoom: initial_zoom,
}
}
}
impl Animation for Zoom {
#[inline]
fn animate(&self, percent: f32) -> Matrix {
let s = (1.0 - percent) * (self.initial_zoom - 1.0) + 1.0;
Matrix::scale(s)
}
}
pub trait Interpolation {
fn calculate(&self, now: u64, start: u64, duration_ns: u64) -> f32;
}
#[derive(Copy, Clone, Default, Debug)]
pub struct Linear;
impl Interpolation for Linear {
#[inline]
fn calculate(&self, now: u64, start: u64, duration_ns: u64) -> f32 {
let anim_progress = (now - start) as f32 / duration_ns as f32;
if anim_progress >= 1.0 {
1.0
} else if anim_progress <= 0.0 {
0.0
} else {
anim_progress
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct EaseOut {
pub factor: f32,
}
impl EaseOut {
#[inline]
pub fn new(factor: f32) -> EaseOut {
EaseOut {
factor: factor,
}
}
}
impl Default for EaseOut {
#[inline]
fn default() -> EaseOut {
EaseOut { factor: 10.0 }
}
}
impl Interpolation for EaseOut {
#[inline]
fn calculate(&self, now: u64, start: u64, duration_ns: u64) -> f32 {
if now < start {
return 0.0;
}
let anim_progress = (now - start) as f32 / duration_ns as f32;
1.0 - (-anim_progress * self.factor).exp()
}
}