From de09827846bf6433a897fec3a130ff3e6c08a9cb Mon Sep 17 00:00:00 2001 From: esteel Date: Mon, 22 Feb 2010 19:44:12 +0000 Subject: [PATCH] more anim math functions, some restructuring.. need to make the animated sliders go to near the point you clicked and work with dragging then it might be useful :P git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8660 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/menu/anim/animation.c | 78 ++++++++++++++++++++++++++------ data/qcsrc/menu/anim/animhost.c | 12 ++--- data/qcsrc/menu/nexuiz/slider.c | 2 +- 3 files changed, 70 insertions(+), 22 deletions(-) diff --git a/data/qcsrc/menu/anim/animation.c b/data/qcsrc/menu/anim/animation.c index 4ab146ab6..19482d845 100644 --- a/data/qcsrc/menu/anim/animation.c +++ b/data/qcsrc/menu/anim/animation.c @@ -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) { } diff --git a/data/qcsrc/menu/anim/animhost.c b/data/qcsrc/menu/anim/animhost.c index b50e9a812..1052e2a1b 100644 --- a/data/qcsrc/menu/anim/animhost.c +++ b/data/qcsrc/menu/anim/animhost.c @@ -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; diff --git a/data/qcsrc/menu/nexuiz/slider.c b/data/qcsrc/menu/nexuiz/slider.c index 7fbde9715..17f35eaa6 100644 --- a/data/qcsrc/menu/nexuiz/slider.c +++ b/data/qcsrc/menu/nexuiz/slider.c @@ -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) -- 2.39.2