]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/anim/animation.qc
Rename menu files to be consistent
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / anim / animation.qc
diff --git a/qcsrc/menu/anim/animation.qc b/qcsrc/menu/anim/animation.qc
new file mode 100644 (file)
index 0000000..99ccc78
--- /dev/null
@@ -0,0 +1,116 @@
+#ifdef INTERFACE
+CLASS(Animation) EXTENDS(Object)
+       METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float))
+       METHOD(Animation, setTimeStartEnd, void(entity, float, float))
+       METHOD(Animation, setTimeStartDuration, void(entity, float, float))
+       METHOD(Animation, setValueStartEnd, void(entity, float, float))
+       METHOD(Animation, setValueStartDelta, void(entity, float, float))
+       METHOD(Animation, setObjectSetter, void(entity, entity, void(entity, float)))
+       METHOD(Animation, tick, void(entity, float))
+       METHOD(Animation, calcValue, float(entity, float, float, float, float))
+       METHOD(Animation, isStopped, float(entity))
+       METHOD(Animation, stopAnim, void(entity))
+       METHOD(Animation, resumeAnim, void(entity))
+       METHOD(Animation, isFinished, float(entity))
+       METHOD(Animation, finishAnim, void(entity))
+       ATTRIB(Animation, object, entity, NULL)
+       ATTRIB(Animation, setter, void(entity, float), setterDummy)
+       ATTRIB(Animation, value, float, 0)
+       ATTRIB(Animation, startTime, float, 0)
+       ATTRIB(Animation, duration, float, 0)
+       ATTRIB(Animation, startValue, float, 0)
+       ATTRIB(Animation, delta, float, 0)
+       ATTRIB(Animation, stopped, float, FALSE)
+       ATTRIB(Animation, finished, float, FALSE)
+ENDCLASS(Animation)
+void setterDummy(entity, float);
+#endif
+
+#ifdef IMPLEMENTATION
+void Animation_configureAnimation(entity me, entity obj, void(entity, float) objSetter, float animStartTime, float animDuration, float animStartValue, float animEndValue)
+{
+       me.setObjectSetter(me, obj, objSetter);
+       me.setTimeStartDuration(me, animStartTime, animDuration);
+       me.setValueStartEnd(me, animStartValue, animEndValue);
+}
+
+void Animation_setTimeStartEnd(entity me, float s, float e)
+{
+       me.startTime = s;
+       me.duration = e - s;
+}
+
+void Animation_setTimeStartDuration(entity me, float s, float d)
+{
+       me.startTime = s;
+       me.duration = d;
+}
+
+void Animation_setValueStartEnd(entity me, float s, float e)
+{
+       me.startValue = s;
+       me.delta = e - s;
+}
+
+void Animation_setValueStartDelta(entity me, float s, float d)
+{
+       me.startValue = s;
+       me.delta = d;
+}
+
+void Animation_setObjectSetter(entity me, entity o, void(entity, float) s)
+{
+       me.object = o;
+       me.setter = s;
+}
+
+void Animation_tick(entity me, float tickTime)
+{
+       if (me.isStopped(me) || me.isFinished(me) || (tickTime < me.startTime))
+               return;
+
+       if (tickTime >= (me.startTime + me.duration))
+               me.finishAnim(me);
+       else
+               me.value = me.calcValue(me, (tickTime - me.startTime), me.duration, me.startValue, me.delta);
+
+       me.setter(me.object, me.value);
+}
+
+float Animation_calcValue(entity me, float tickTime, float animDuration, float animStartValue, float animDelta)
+{
+       return animStartValue;
+}
+
+float Animation_isStopped(entity me)
+{
+       return me.stopped;
+}
+
+void Animation_stopAnim(entity me)
+{
+       me.stopped = TRUE;
+}
+
+void Animation_resumeAnim(entity me)
+{
+       me.stopped = FALSE;
+}
+
+float Animation_isFinished(entity me)
+{
+       return me.finished;
+}
+
+void Animation_finishAnim(entity me)
+{
+       me.value = me.delta + me.startValue;
+       me.finished = TRUE;
+       me.setter(me.object, me.value);
+}
+
+void setterDummy(entity obj, float objValue)
+{
+}
+
+#endif