more work on the menu animation framework, now it has keyframe animations too.
authoresteel <esteel@f962a42d-fe04-0410-a3ab-8c8b0445ebaa>
Wed, 24 Feb 2010 22:07:55 +0000 (22:07 +0000)
committeresteel <esteel@f962a42d-fe04-0410-a3ab-8c8b0445ebaa>
Wed, 24 Feb 2010 22:07:55 +0000 (22:07 +0000)
removed the example comment-code from slider, guess its better to create a git branch as playground..

git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8667 f962a42d-fe04-0410-a3ab-8c8b0445ebaa

data/qcsrc/menu/anim/animation.c
data/qcsrc/menu/anim/easing.c [new file with mode: 0644]
data/qcsrc/menu/anim/keyframe.c [new file with mode: 0644]
data/qcsrc/menu/classes.c
data/qcsrc/menu/nexuiz/slider.c

index 19482d8..4aacb27 100644 (file)
@@ -1,12 +1,13 @@
 #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, setMath, void(entity, float(float, float, float, 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))
@@ -14,7 +15,6 @@ CLASS(Animation) EXTENDS(Object)
        METHOD(Animation, finishAnim, void(entity))
        ATTRIB(Animation, object, entity, NULL)
        ATTRIB(Animation, setter, void(entity, float), setterDummy)
-       ATTRIB(Animation, math, float(float, float, float, float), animLinear)
        ATTRIB(Animation, value, float, 0)
        ATTRIB(Animation, startTime, float, 0)
        ATTRIB(Animation, duration, float, 0)
@@ -23,33 +23,15 @@ CLASS(Animation) EXTENDS(Object)
        ATTRIB(Animation, stopped, float, FALSE)
        ATTRIB(Animation, finished, float, FALSE)
 ENDCLASS(Animation)
-entity makeHostedAnimation(entity, void(entity, float), float(float, float, float, float), float, float, float);
-entity makeAnimation(entity, void(entity, float), float(float, float, float, float), float, float, float);
-float animLinear(float, float, float, float);
-float animQuadIn(float, float, float, float);
-float animQuadOut(float, float, float, float);
-float animQuadInOut(float, float, float, float);
 void setterDummy(entity, float);
 #endif
 
 #ifdef IMPLEMENTATION
-entity makeHostedAnimation(entity obj, void(entity, float) setter, float(float, float, float, float) func, float duration, float start, float end)
+void configureAnimationAnimation(entity me, entity obj, void(entity, float) setter, float startTime, float duration, float startValue, float end)
 {
-       entity me;
-       me = makeAnimation(obj, setter, func, duration, start, end);
-       anim.addAnim(anim, me);
-       return me;
-}
-
-entity makeAnimation(entity obj, void(entity, float) setter, float(float, float, float, float) func, float duration, float start, float end)
-{
-       entity me;
-       me = spawnAnimation();
        me.setObjectSetter(me, obj, setter);
-       me.setMath(me, func);
-       me.setTimeStartDuration(me, time, duration);
-       me.setValueStartEnd(me, start, end);
-       return me;
+       me.setTimeStartDuration(me, startTime, duration);
+       me.setValueStartEnd(me, startValue, end);
 }
 
 void setTimeStartEndAnimation(entity me, float s, float e)
@@ -82,24 +64,24 @@ void setObjectSetterAnimation(entity me, entity o, void(entity, float) s)
        me.setter = s;
 }
 
-void setMathAnimation(entity me, float(float, float, float, float) func)
-{
-       me.math = func;
-}
-
 void tickAnimation(entity me, float time)
 {
-       if (me.isStopped(me) || me.isFinished(me))
+       if (me.isStopped(me) || me.isFinished(me) || (time < me.startTime))
                return;
 
        if (time >= (me.startTime + me.duration))
                me.finishAnim(me);
        else
-               me.value = me.math((time - me.startTime), me.duration, me.startValue, me.delta);
+               me.value = me.calcValue(me, (time - me.startTime), me.duration, me.startValue, me.delta);
 
        me.setter(me.object, me.value);
 }
 
+float calcValueAnimation(entity me, float time, float duration, float startValue, float delta)
+{
+       return startValue;
+}
+
 float isStoppedAnimation(entity me)
 {
        return me.stopped;
@@ -126,35 +108,6 @@ void finishAnimAnimation(entity me)
        me.finished = TRUE;
 }
 
-float animLinear(float time, float duration, float start, float delta)
-{
-       return (delta * (time / duration)) + start;
-}
-
-float animQuadIn(float time, float duration, float start, float delta)
-{
-       float frac = time / duration;
-       return (delta * frac * frac) + start;
-}
-
-float animQuadOut(float time, float duration, float start, float delta)
-{
-       float frac = time / duration;
-       return (-delta * frac * (frac - 2)) + start;
-}
-
-float animQuadInOut(float time, float duration, float start, float delta)
-{
-       if (time < (duration / 2))
-       {
-               return animQuadIn(time, (duration / 2), start, (delta / 2));
-       }
-       else
-       {
-               return animQuadOut((time - (duration / 2)), (duration / 2), (start + (delta / 2)), (delta / 2));
-       }
-}
-
 void setterDummy(entity object, float value)
 {
 }
diff --git a/data/qcsrc/menu/anim/easing.c b/data/qcsrc/menu/anim/easing.c
new file mode 100644 (file)
index 0000000..2c82f81
--- /dev/null
@@ -0,0 +1,72 @@
+#ifdef INTERFACE
+CLASS(Easing) EXTENDS(Animation)
+       METHOD(Easing, calcValue, float(entity, float, float, float, float))
+       METHOD(Easing, setMath, void(entity, float(float, float, float, float)))
+       ATTRIB(Easing, math, float(float, float, float, float), easingLinear)
+ENDCLASS(Easing)
+entity makeHostedEasing(entity, void(entity, float), float(float, float, float, float), float, float, float);
+entity makeEasing(entity, void(entity, float), float(float, float, float, float), float, float, float, float);
+float easingLinear(float, float, float, float);
+float easingQuadIn(float, float, float, float);
+float easingQuadOut(float, float, float, float);
+float easingQuadInOut(float, float, float, float);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeHostedEasing(entity obj, void(entity, float) setter, float(float, float, float, float) func, float duration, float startValue, float end)
+{
+       entity me;
+       me = makeEasing(obj, setter, func, time, duration, startValue, end);
+       anim.addAnim(anim, me);
+       return me;
+}
+
+entity makeEasing(entity obj, void(entity, float) setter, float(float, float, float, float) func, float startTime, float duration, float startValue, float end)
+{
+       entity me;
+       me = spawnEasing();
+       me.configureAnimation(me, obj, setter, startTime, duration, startValue, end);
+       me.setMath(me, func);
+       return me;
+}
+
+float calcValueEasing(entity me, float time, float duration, float start, float delta)
+{
+       return me.math(time, duration, start, delta);
+}
+
+void setMathEasing(entity me, float(float, float, float, float) func)
+{
+       me.math = func;
+}
+
+float easingLinear(float time, float duration, float start, float delta)
+{
+       return (delta * (time / duration)) + start;
+}
+
+float easingQuadIn(float time, float duration, float start, float delta)
+{
+       float frac = time / duration;
+       return (delta * frac * frac) + start;
+}
+
+float easingQuadOut(float time, float duration, float start, float delta)
+{
+       float frac = time / duration;
+       return (-delta * frac * (frac - 2)) + start;
+}
+
+float easingQuadInOut(float time, float duration, float start, float delta)
+{
+       if (time < (duration / 2))
+       {
+               return easingQuadIn(time, (duration / 2), start, (delta / 2));
+       }
+       else
+       {
+               return easingQuadOut((time - (duration / 2)), (duration / 2), (start + (delta / 2)), (delta / 2));
+       }
+}
+
+#endif
diff --git a/data/qcsrc/menu/anim/keyframe.c b/data/qcsrc/menu/anim/keyframe.c
new file mode 100644 (file)
index 0000000..39e1fd8
--- /dev/null
@@ -0,0 +1,71 @@
+#ifdef INTERFACE
+CLASS(Keyframe) EXTENDS(Animation)
+       METHOD(Keyframe, addAnim, void(entity, entity))
+       METHOD(Keyframe, calcValue, float(entity, float, float, float, float))
+       ATTRIB(Keyframe, currentChild, entity, NULL)
+       ATTRIB(Keyframe, firstChild, entity, NULL)
+       ATTRIB(Keyframe, lastChild, entity, NULL)
+ENDCLASS(Animation)
+entity makeHostedKeyframe(entity, void(entity, float), float, float, float);
+entity makeKeyframe(entity, void(entity, float), float, float, float);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeHostedKeyframe(entity obj, void(entity, float) setter, float duration, float start, float end)
+{
+       entity me;
+       me = makeKeyframe(obj, setter, duration, start, end);
+       anim.addAnim(anim, me);
+       return me;
+}
+
+entity makeKeyframe(entity obj, void(entity, float) setter, float duration, float start, float end)
+{
+       entity me;
+       me = spawnKeyframe();
+       me.configureAnimation(me, obj, setter, time, duration, start, end);
+       return me;
+}
+
+void addAnimKeyframe(entity me, entity other)
+{
+       if(other.parent)
+               error("Can't add already added anim!");
+
+       if(other.isFinished(other))
+               error("Can't add finished anim!");
+
+       other.parent = me;
+
+       entity f, l;
+       f = me.firstChild;
+       l = me.lastChild;
+
+       if(l)
+               l.nextSibling = other;
+       else
+       {
+               me.currentChild = other;
+               me.firstChild = other;
+       }
+
+       other.prevSibling = l;
+       other.nextSibling = NULL;
+       me.lastChild = other;
+}
+
+float calcValueKeyframe(entity me, float time, float duration, float startValue, float delta)
+{
+       if (me.currentChild)
+               if (me.currentChild.isFinished(me.currentChild))
+                       me.currentChild = me.currentChild.nextSibling;
+
+       if (me.currentChild)
+       {
+               me.currentChild.tick(me.currentChild, time);
+               return me.currentChild.value;
+       }
+
+       return startValue + delta;
+}
+#endif
index 6cdf856..0a8de3e 100644 (file)
@@ -1,5 +1,7 @@
 #include "anim/animhost.c"
 #include "anim/animation.c"
+#include "anim/easing.c"
+#include "anim/keyframe.c"
 #include "item.c"
 #include "item/container.c"
 #include "item/inputcontainer.c"
index 17f35ea..3b9a575 100644 (file)
@@ -53,10 +53,8 @@ void setValueNexuizSlider(entity me, float val)
 {
        if(val != me.value)
        {
-               //float oldValue = me.value;
                me.value = val;
                me.saveCvars(me);
-               //makeHostedAnimation(me, setValueSlider, animQuadInOut, 1, oldValue, val);
        }
 }
 void loadCvarsNexuizSlider(entity me)