1const BACK_CONST: f32 = 1.70158;
4
5const BACK_IN_OUT_CONST: f32 = BACK_CONST * 1.525;
8
9declare_tween! {
10 pub struct BackIn;
12
13 pub fn back_in;
15
16 pub fn back_in_at;
18
19 pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, percent: f32) -> Value {
20 let scalar = percent * percent * ((BACK_CONST + 1.0) * percent - BACK_CONST);
21
22 value_delta.scale(scalar)
23 }
24}
25
26declare_tween! {
27 pub struct BackOut;
29
30 pub fn back_out;
32
33 pub fn back_out_at;
35
36 pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, percent: f32) -> Value {
37 let t = percent - 1.0;
38 let scalar = t * t * ((BACK_CONST + 1.0) * t + BACK_CONST) + 1.0;
39
40 value_delta.scale(scalar)
41 }
42}
43
44declare_tween! {
45 pub struct BackInOut;
47
48 pub fn back_in_out;
50
51 pub fn back_in_out_at;
53
54 pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, mut percent: f32) -> Value {
55 percent *= 2.0;
56
57 let scalar = if percent < 1.0 {
58 percent * percent * ((BACK_IN_OUT_CONST + 1.0) * percent - BACK_IN_OUT_CONST)
59 } else {
60 let t = percent - 2.0;
61
62 t * t * ((BACK_IN_OUT_CONST + 1.0) * t + BACK_IN_OUT_CONST) + 2.0
63 };
64
65 value_delta.scale(scalar / 2.0)
66 }
67}
68
69test_tween!(Back);