Merge branch 'master' into Mario/vaporizer_damage
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / anim / easing.qc
1 #ifndef ANIM_EASING_H
2 #define ANIM_EASING_H
3 #include "animation.qc"
4 entity makeHostedEasing(entity, void(entity, float), float(float, float, float, float), float, float, float);
5 entity makeEasing(entity, void(entity, float), float(float, float, float, float), float, float, float, float);
6 float easingLinear(float, float, float, float);
7 float easingQuadIn(float, float, float, float);
8 float easingQuadOut(float, float, float, float);
9 float easingQuadInOut(float, float, float, float);
10 CLASS(Easing, Animation)
11         METHOD(Easing, calcValue, float(entity, float, float, float, float));
12         METHOD(Easing, setMath, void(entity, float(float, float, float, float)));
13         ATTRIB(Easing, math, float(float, float, float, float), easingLinear)
14 ENDCLASS(Easing)
15 #endif
16
17 #ifdef IMPLEMENTATION
18 entity makeHostedEasing(entity obj, void(entity, float) objSetter, float(float, float, float, float) func, float animDuration, float animStartValue, float animEnd)
19 {
20         entity me;
21         me = makeEasing(obj, objSetter, func, time, animDuration, animStartValue, animEnd);
22         anim.addAnim(anim, me);
23         return me;
24 }
25
26 entity makeEasing(entity obj, void(entity, float) objSetter, float(float, float, float, float) func, float animStartTime, float animDuration, float animStartValue, float animEnd)
27 {
28         entity me;
29         me = NEW(Easing);
30         me.configureAnimation(me, obj, objSetter, animStartTime, animDuration, animStartValue, animEnd);
31         me.setMath(me, func);
32         return me;
33 }
34
35 float Easing_calcValue(entity me, float tickTime, float animDuration, float animStart, float animDelta)
36 {
37         return me.math(tickTime, animDuration, animStart, animDelta);
38 }
39
40 void Easing_setMath(entity me, float(float, float, float, float) func)
41 {
42         me.math = func;
43 }
44
45 float easingLinear(float tickTime, float animDuration, float animStart, float animDelta)
46 {
47         return (animDelta * (tickTime / animDuration)) + animStart;
48 }
49
50 float easingQuadIn(float tickTime, float animDuration, float animStart, float animDelta)
51 {
52         float frac = tickTime / animDuration;
53         return (animDelta * frac * frac) + animStart;
54 }
55
56 float easingQuadOut(float tickTime, float animDuration, float animStart, float animDelta)
57 {
58         float frac = tickTime / animDuration;
59         return (-animDelta * frac * (frac - 2)) + animStart;
60 }
61
62 float easingQuadInOut(float tickTime, float animDuration, float animStart, float animDelta)
63 {
64         if (tickTime < (animDuration / 2))
65         {
66                 return easingQuadIn(tickTime, (animDuration / 2), animStart, (animDelta / 2));
67         }
68         else
69         {
70                 return easingQuadOut((tickTime - (animDuration / 2)), (animDuration / 2), (animStart + (animDelta / 2)), (animDelta / 2));
71         }
72 }
73
74 #endif