more anim math functions, some restructuring.. need to make the animated sliders...
authoresteel <esteel@f962a42d-fe04-0410-a3ab-8c8b0445ebaa>
Mon, 22 Feb 2010 19:44:12 +0000 (19:44 +0000)
committeresteel <esteel@f962a42d-fe04-0410-a3ab-8c8b0445ebaa>
Mon, 22 Feb 2010 19:44:12 +0000 (19:44 +0000)
git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8660 f962a42d-fe04-0410-a3ab-8c8b0445ebaa

data/qcsrc/menu/anim/animation.c
data/qcsrc/menu/anim/animhost.c
data/qcsrc/menu/nexuiz/slider.c

index 4ab146a..19482d8 100644 (file)
@@ -5,9 +5,12 @@ CLASS(Animation) EXTENDS(Object)
        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, isFinished, float(entity))
+       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)
@@ -17,28 +20,33 @@ CLASS(Animation) EXTENDS(Object)
        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)
-entity makeHostedAnimation(entity, void(entity, float), float, float, float);
-entity makeAnimation(entity, void(entity, float), float, float, float);
+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 duration, float start, float end)
+entity makeHostedAnimation(entity obj, void(entity, float) setter, float(float, float, float, float) func, float duration, float start, float end)
 {
        entity me;
-       me = makeAnimation(obj, setter, duration, start, end);
+       me = makeAnimation(obj, setter, func, duration, start, end);
        anim.addAnim(anim, me);
        return me;
 }
 
-entity makeAnimation(entity obj, void(entity, float) setter, float duration, float start, float end)
+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;
@@ -74,39 +82,79 @@ 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.isFinished(me))
+       if (me.isStopped(me) || me.isFinished(me))
                return;
 
-       me.value = me.math((time - me.startTime), me.duration, me.startValue, me.delta);
-       me.setter(me.object, me.value);
-
-       if (time > (me.startTime + me.duration))
+       if (time >= (me.startTime + me.duration))
                me.finishAnim(me);
+       else
+               me.value = me.math((time - me.startTime), me.duration, me.startValue, me.delta);
+
+       me.setter(me.object, me.value);
 }
 
-float isFinishedAnimation(entity me)
+float isStoppedAnimation(entity me)
 {
-       return me.finished;
+       return me.stopped;
 }
 
 void stopAnimAnimation(entity me)
 {
+       me.stopped = TRUE;
+}
+
+void resumeAnimAnimation(entity me)
+{
+       me.stopped = FALSE;
+}
+
+float isFinishedAnimation(entity me)
+{
+       return me.finished;
 }
 
 void finishAnimAnimation(entity me)
 {
+       me.value = me.delta + me.startValue;
        me.finished = TRUE;
 }
 
 float animLinear(float time, float duration, float start, float delta)
 {
-       if (time > duration)
-               return delta + start;
        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)
 {
 }
index b50e9a8..1052e2a 100644 (file)
@@ -66,31 +66,31 @@ void stopAllAnimAnimHost(entity me)
        entity e;
        for(e = me.firstChild; e; e = e.nextSibling)
        {
-               me.removeAnim(me, e);
                e.stopAnim(e);
        }
 }
 
 void finishAllAnimAnimHost(entity me)
 {
-       entity e;
+       entity e, tmp;
        for(e = me.firstChild; e; e = e.nextSibling)
        {
-               me.removeAnim(me, e);
-               e.finishAnim(e);
+               tmp = e;
+               e = tmp.prevSibling;
+               me.removeAnim(me, tmp);
+               e.finishAnim(tmp);
        }
 }
 
 void tickAllAnimHost(entity me)
 {
-       entity e;
+       entity e, tmp;
        for(e = me.firstChild; e; e = e.nextSibling)
        {
                e.tick(e, time);
        }
        for(e = me.firstChild; e; e = e.nextSibling)
        {
-               entity tmp;
                if (e.isFinished(e))
                {
                        tmp = e;
index 7fbde97..17f35ea 100644 (file)
@@ -56,7 +56,7 @@ void setValueNexuizSlider(entity me, float val)
                //float oldValue = me.value;
                me.value = val;
                me.saveCvars(me);
-               //makeHostedAnimation(me, setValueSlider, 1, oldValue, val);
+               //makeHostedAnimation(me, setValueSlider, animQuadInOut, 1, oldValue, val);
        }
 }
 void loadCvarsNexuizSlider(entity me)