1
+ use keyframe:: { ease, functions:: * } ;
2
+ use std:: time:: Instant ;
3
+ use crate :: actor:: Actor ;
4
+
5
+ #[ derive( Copy , Clone , Debug ) ]
6
+ pub enum EasingFunction {
7
+ EaseIn ,
8
+ EaseInCubic ,
9
+ EaseInOut ,
10
+ EaseInOutCubic ,
11
+ EaseInOutQuad ,
12
+ EaseInOutQuart ,
13
+ EaseInOutQuint ,
14
+ EaseInQuad ,
15
+ EaseInQuart ,
16
+ EaseInQuint ,
17
+ EaseOut ,
18
+ EaseOutCubic ,
19
+ EaseOutQuad ,
20
+ EaseOutQuart ,
21
+ EaseOutQuint ,
22
+ Linear ,
23
+ Step ,
24
+ }
25
+
26
+ pub struct Animation {
27
+ animation_time_instance : Instant ,
28
+ translation_x_running : bool ,
29
+ translation_x_starting_time : u128 ,
30
+ translation_x_time_duration : f32 ,
31
+ translation_x_from_value : i32 ,
32
+ translation_x_to_value : i32 ,
33
+ translation_x_ease : EasingFunction ,
34
+
35
+ translation_y_running : bool ,
36
+ translation_y_starting_time : u128 ,
37
+ translation_y_time_duration : f32 ,
38
+ translation_y_from_value : i32 ,
39
+ translation_y_to_value : i32 ,
40
+ translation_y_ease : EasingFunction ,
41
+
42
+ scale_running : bool ,
43
+ scale_starting_time : u128 ,
44
+ scale_time_duration : f32 ,
45
+ scale_from_value : f32 ,
46
+ scale_to_value : f32 ,
47
+ scale_ease : EasingFunction ,
48
+
49
+ rotation_running : bool ,
50
+ rotation_starting_time : u128 ,
51
+ rotation_time_duration : f32 ,
52
+ rotation_from_value : i32 ,
53
+ rotation_to_value : i32 ,
54
+ rotation_ease : EasingFunction ,
55
+ }
56
+
57
+
58
+ impl Animation {
59
+ pub fn new ( ) -> Animation {
60
+ Animation {
61
+ animation_time_instance : Instant :: now ( ) ,
62
+ translation_x_running : false ,
63
+ translation_x_starting_time : 0 ,
64
+ translation_x_time_duration : 0.0 ,
65
+ translation_x_from_value : 0 ,
66
+ translation_x_to_value : 0 ,
67
+ translation_x_ease : EasingFunction :: Linear ,
68
+
69
+ translation_y_running : false ,
70
+ translation_y_starting_time : 0 ,
71
+ translation_y_time_duration : 0.0 ,
72
+ translation_y_from_value : 0 ,
73
+ translation_y_to_value : 0 ,
74
+ translation_y_ease : EasingFunction :: Linear ,
75
+
76
+ scale_running : false ,
77
+ scale_starting_time : 0 ,
78
+ scale_time_duration : 0.0 ,
79
+ scale_from_value : 0.0 ,
80
+ scale_to_value : 0.0 ,
81
+ scale_ease : EasingFunction :: Linear ,
82
+
83
+ rotation_running : false ,
84
+ rotation_starting_time : 0 ,
85
+ rotation_time_duration : 0.0 ,
86
+ rotation_from_value : 0 ,
87
+ rotation_to_value : 0 ,
88
+ rotation_ease : EasingFunction :: Linear ,
89
+ }
90
+ }
91
+
92
+ fn easing_function ( easing : EasingFunction , from : f32 , to : f32 , duration : f32 ) -> f32 {
93
+ match easing {
94
+ EasingFunction :: EaseIn => ease ( EaseIn , from, to, duration) ,
95
+ EasingFunction :: EaseInCubic => ease ( EaseInCubic , from, to, duration) ,
96
+ EasingFunction :: EaseInOut => ease ( EaseInOut , from, to, duration) ,
97
+ EasingFunction :: EaseInOutCubic => ease ( EaseInOutCubic , from, to, duration) ,
98
+ EasingFunction :: EaseInOutQuad => ease ( EaseInOutQuad , from, to, duration) ,
99
+ EasingFunction :: EaseInOutQuart => ease ( EaseInOutQuart , from, to, duration) ,
100
+ EasingFunction :: EaseInOutQuint => ease ( EaseInOutQuint , from, to, duration) ,
101
+ EasingFunction :: EaseInQuad => ease ( EaseInQuad , from, to, duration) ,
102
+ EasingFunction :: EaseInQuart => ease ( EaseInQuart , from, to, duration) ,
103
+ EasingFunction :: EaseInQuint => ease ( EaseInQuint , from, to, duration) ,
104
+ EasingFunction :: EaseOut => ease ( EaseOut , from, to, duration) ,
105
+ EasingFunction :: EaseOutCubic => ease ( EaseOutCubic , from, to, duration) ,
106
+ EasingFunction :: EaseOutQuad => ease ( EaseOutQuad , from, to, duration) ,
107
+ EasingFunction :: EaseOutQuart => ease ( EaseOutQuart , from, to, duration) ,
108
+ EasingFunction :: EaseOutQuint => ease ( EaseOutQuint , from, to, duration) ,
109
+ EasingFunction :: Linear => ease ( Linear , from, to, duration) ,
110
+ EasingFunction :: Step => ease ( Step , from, to, duration) ,
111
+ }
112
+ }
113
+
114
+ pub fn apply_translation_x (
115
+ & mut self ,
116
+ from_value : i32 ,
117
+ to_value : i32 ,
118
+ time : f32 ,
119
+ easing : EasingFunction ,
120
+ ) {
121
+ self . translation_x_running = true ;
122
+ self . translation_x_ease = easing;
123
+ self . translation_x_from_value = from_value;
124
+ self . translation_x_to_value = to_value;
125
+ self . translation_x_time_duration = time * 1000.0 ; // msec.
126
+ }
127
+
128
+ pub fn apply_translation_y (
129
+ & mut self ,
130
+ from_value : i32 ,
131
+ to_value : i32 ,
132
+ time : f32 ,
133
+ easing : EasingFunction ,
134
+ ) {
135
+ self . translation_y_running = true ;
136
+ self . translation_y_ease = easing;
137
+ self . translation_y_from_value = from_value;
138
+ self . translation_y_to_value = to_value;
139
+ self . translation_y_time_duration = time * 1000.0 ; // msec.
140
+ }
141
+
142
+ pub fn apply_rotation (
143
+ & mut self ,
144
+ from_value : i32 ,
145
+ to_value : i32 ,
146
+ time : f32 ,
147
+ easing : EasingFunction ,
148
+ ) {
149
+ self . rotation_running = true ;
150
+ self . rotation_ease = easing;
151
+ self . rotation_from_value = from_value;
152
+ self . rotation_to_value = to_value;
153
+ self . rotation_time_duration = time * 1000.0 ; // msec.
154
+ }
155
+
156
+ pub fn apply_scale (
157
+ & mut self ,
158
+ from_value : f32 ,
159
+ to_value : f32 ,
160
+ time : f32 ,
161
+ easing : EasingFunction ,
162
+ ) {
163
+ self . scale_running = true ;
164
+ self . scale_ease = easing;
165
+ self . scale_from_value = from_value;
166
+ self . scale_to_value = to_value;
167
+ self . scale_time_duration = time * 1000.0 ; // msec.
168
+ }
169
+
170
+ pub fn run ( & mut self , actor : & mut Actor ) {
171
+ println ! ( "animation::run" ) ;
172
+ if self . translation_x_running == true {
173
+ if self . translation_x_starting_time == 0 {
174
+ self . translation_x_starting_time =
175
+ self . animation_time_instance . elapsed ( ) . as_millis ( ) ;
176
+ }
177
+ let cur_time = ( self . animation_time_instance . elapsed ( ) . as_millis ( )
178
+ - self . translation_x_starting_time ) as f32
179
+ / self . translation_x_time_duration ;
180
+ if cur_time <= 1.0 {
181
+ actor. x = Animation :: easing_function (
182
+ self . translation_x_ease ,
183
+ self . translation_x_from_value as f32 ,
184
+ self . translation_x_to_value as f32 ,
185
+ cur_time,
186
+ ) as i32 ;
187
+ } else {
188
+ self . translation_x_running = false ;
189
+ self . translation_x_starting_time = 0 ;
190
+ actor. x = self . translation_x_to_value ;
191
+ }
192
+ }
193
+
194
+ if self . translation_y_running == true {
195
+ if self . translation_y_starting_time == 0 {
196
+ self . translation_y_starting_time =
197
+ self . animation_time_instance . elapsed ( ) . as_millis ( ) ;
198
+ }
199
+ let cur_time = ( self . animation_time_instance . elapsed ( ) . as_millis ( )
200
+ - self . translation_y_starting_time ) as f32
201
+ / self . translation_y_time_duration ;
202
+ if cur_time <= 1.0 {
203
+ actor. y = Animation :: easing_function (
204
+ self . translation_y_ease ,
205
+ self . translation_y_from_value as f32 ,
206
+ self . translation_y_to_value as f32 ,
207
+ cur_time,
208
+ ) as i32 ;
209
+ } else {
210
+ self . translation_y_running = false ;
211
+ self . translation_y_starting_time = 0 ;
212
+ actor. y = self . translation_y_to_value ;
213
+ }
214
+ }
215
+
216
+ if self . rotation_running == true {
217
+ if self . rotation_starting_time == 0 {
218
+ self . rotation_starting_time = self . animation_time_instance . elapsed ( ) . as_millis ( ) ;
219
+ }
220
+
221
+ let cur_time = ( self . animation_time_instance . elapsed ( ) . as_millis ( )
222
+ - self . rotation_starting_time ) as f32
223
+ / self . rotation_time_duration as f32 ;
224
+ if cur_time <= 1.0 {
225
+ actor. rotation = Animation :: easing_function (
226
+ self . rotation_ease ,
227
+ self . rotation_from_value as f32 ,
228
+ self . rotation_to_value as f32 ,
229
+ cur_time,
230
+ ) as i32 ;
231
+ } else {
232
+ self . rotation_running = false ;
233
+ self . rotation_starting_time = 0 ;
234
+ actor. rotation = self . rotation_to_value ;
235
+ }
236
+ }
237
+
238
+ if self . scale_running == true {
239
+ if self . scale_starting_time == 0 {
240
+ self . scale_starting_time = self . animation_time_instance . elapsed ( ) . as_millis ( ) ;
241
+ }
242
+
243
+ let cur_time = ( self . animation_time_instance . elapsed ( ) . as_millis ( )
244
+ - self . scale_starting_time ) as f32
245
+ / self . scale_time_duration as f32 ;
246
+ if cur_time <= 1.0 {
247
+ actor. scale_x = Animation :: easing_function (
248
+ self . scale_ease ,
249
+ self . scale_from_value ,
250
+ self . scale_to_value ,
251
+ cur_time,
252
+ ) as f32 ;
253
+ actor. scale_y = Animation :: easing_function (
254
+ self . scale_ease ,
255
+ self . scale_from_value ,
256
+ self . scale_to_value ,
257
+ cur_time,
258
+ ) as f32 ;
259
+ } else {
260
+ self . scale_running = false ;
261
+ self . scale_starting_time = 0 ;
262
+ actor. scale_x = self . scale_to_value ;
263
+ actor. scale_y = self . scale_to_value ;
264
+ }
265
+ }
266
+
267
+ if self . translation_x_running == true
268
+ || self . translation_y_running == true
269
+ || self . rotation_running == true
270
+ || self . scale_running == true
271
+ {
272
+ actor. animated = true ;
273
+ } else {
274
+ actor. animated = false ;
275
+ }
276
+ }
277
+ }
0 commit comments