]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/anim/animation.qc
Merge branch 'master' into terencehill/tooltips_cleanup
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / anim / animation.qc
1 #ifndef ANIM_ANIMATION_H
2 #define ANIM_ANIMATION_H
3 #include "../oo/base.qh"
4 void setterDummy(entity, float);
5 CLASS(Animation, Object)
6         METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float));
7         METHOD(Animation, update, void(entity, float, float, float));
8         METHOD(Animation, setTimeStartEnd, void(entity, float, float));
9         METHOD(Animation, setTimeStartDuration, void(entity, float, float));
10         METHOD(Animation, setValueStartEnd, void(entity, float, float));
11         METHOD(Animation, setValueStartDelta, void(entity, float, float));
12         METHOD(Animation, setObjectSetter, void(entity, entity, void(entity, float)));
13         METHOD(Animation, tick, void(entity, float));
14         METHOD(Animation, calcValue, float(entity, float, float, float, float));
15         METHOD(Animation, isStopped, float(entity));
16         METHOD(Animation, stopAnim, void(entity));
17         METHOD(Animation, resumeAnim, void(entity));
18         METHOD(Animation, isFinished, float(entity));
19         METHOD(Animation, finishAnim, void(entity));
20         ATTRIB(Animation, object, entity, NULL)
21         ATTRIB(Animation, setter, void(entity, float), setterDummy)
22         ATTRIB(Animation, value, float, 0)
23         ATTRIB(Animation, startTime, float, 0)
24         ATTRIB(Animation, duration, float, 0)
25         ATTRIB(Animation, startValue, float, 0)
26         ATTRIB(Animation, delta, float, 0)
27         ATTRIB(Animation, stopped, float, false)
28         ATTRIB(Animation, finished, float, false)
29 ENDCLASS(Animation)
30 #endif
31
32 #ifdef IMPLEMENTATION
33 void Animation_configureAnimation(entity me, entity obj, void(entity, float) objSetter, float animStartTime, float animDuration, float animStartValue, float animEndValue)
34 {
35         me.setObjectSetter(me, obj, objSetter);
36         me.setTimeStartDuration(me, animStartTime, animDuration);
37         me.setValueStartEnd(me, animStartValue, animEndValue);
38 }
39
40 void Animation_update(entity me, float animDuration, float animStartValue, float animEndValue)
41 {
42         me.setTimeStartDuration(me, time, animDuration);
43         me.setValueStartEnd(me, animStartValue, animEndValue);
44 }
45
46 void Animation_setTimeStartEnd(entity me, float s, float e)
47 {
48         me.startTime = s;
49         me.duration = e - s;
50 }
51
52 void Animation_setTimeStartDuration(entity me, float s, float d)
53 {
54         me.startTime = s;
55         me.duration = d;
56 }
57
58 void Animation_setValueStartEnd(entity me, float s, float e)
59 {
60         me.startValue = s;
61         me.delta = e - s;
62 }
63
64 void Animation_setValueStartDelta(entity me, float s, float d)
65 {
66         me.startValue = s;
67         me.delta = d;
68 }
69
70 void Animation_setObjectSetter(entity me, entity o, void(entity, float) s)
71 {
72         me.object = o;
73         me.setter = s;
74 }
75
76 void Animation_tick(entity me, float tickTime)
77 {
78         if (me.isStopped(me) || me.isFinished(me) || (tickTime < me.startTime))
79                 return;
80
81         if (tickTime >= (me.startTime + me.duration))
82                 me.finishAnim(me);
83         else
84                 me.value = me.calcValue(me, (tickTime - me.startTime), me.duration, me.startValue, me.delta);
85
86         me.setter(me.object, me.value);
87 }
88
89 float Animation_calcValue(entity me, float tickTime, float animDuration, float animStartValue, float animDelta)
90 {
91         return animStartValue;
92 }
93
94 float Animation_isStopped(entity me)
95 {
96         return me.stopped;
97 }
98
99 void Animation_stopAnim(entity me)
100 {
101         me.stopped = true;
102 }
103
104 void Animation_resumeAnim(entity me)
105 {
106         me.stopped = false;
107 }
108
109 float Animation_isFinished(entity me)
110 {
111         return me.finished;
112 }
113
114 void Animation_finishAnim(entity me)
115 {
116         me.value = me.delta + me.startValue;
117         me.finished = true;
118         me.setter(me.object, me.value);
119 }
120
121 void setterDummy(entity obj, float objValue)
122 {
123 }
124
125 #endif