]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/slider_anim_improvements' into 'master'
authorMario <zacjardine@y7mail.com>
Sat, 3 Oct 2015 06:55:28 +0000 (06:55 +0000)
committerMario <zacjardine@y7mail.com>
Sat, 3 Oct 2015 06:55:28 +0000 (06:55 +0000)
Slider anim improvements

1. Fix sliders handle getting stuck in the initial position when dragging outside the handle

2. Make sliders animation work much better on quick repeated changes (e.g. with mouse wheel). Default animation is now easingQuadOut and lasts 0.5 s (instead of easingQuadInOut, 1 s), more similar to the list scrolling animation

3. Don't play any animation when loading the initial value of a slider since the animation can't be seen anyway (the menu takes 2-3 seconds to load); also the high number (200) of animations played at once on menu start caused a bug where slider's handles couldn't be moved for a while (up to 12 seconds with 30 fps)

Additional note about point 3: before the change of point 2 500+ animation were played at once on menu start, as 300+ animation updates counted as new animations!

See merge request !221

qcsrc/menu/anim/animation.qc
qcsrc/menu/item/slider.qc
qcsrc/menu/item/textslider.qc
qcsrc/menu/xonotic/slider.qc
qcsrc/menu/xonotic/slider_decibels.qc
qcsrc/menu/xonotic/slider_particles.qc
qcsrc/menu/xonotic/slider_resolution.qc
qcsrc/menu/xonotic/slider_sbfadetime.qc
qcsrc/menu/xonotic/textslider.qc

index d52ae4f719e07b5017216e0251a01a6749b5d9dd..5563b969d98bfb4751e29e661b2c97a6c5248c45 100644 (file)
@@ -4,6 +4,7 @@
 void setterDummy(entity, float);
 CLASS(Animation, Object)
        METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float));
+       METHOD(Animation, update, void(entity, float, float, float));
        METHOD(Animation, setTimeStartEnd, void(entity, float, float));
        METHOD(Animation, setTimeStartDuration, void(entity, float, float));
        METHOD(Animation, setValueStartEnd, void(entity, float, float));
@@ -36,6 +37,12 @@ void Animation_configureAnimation(entity me, entity obj, void(entity, float) obj
        me.setValueStartEnd(me, animStartValue, animEndValue);
 }
 
+void Animation_update(entity me, float animDuration, float animStartValue, float animEndValue)
+{
+       me.setTimeStartDuration(me, time, animDuration);
+       me.setValueStartEnd(me, animStartValue, animEndValue);
+}
+
 void Animation_setTimeStartEnd(entity me, float s, float e)
 {
        me.startTime = s;
index 03ad736b861fbbd49be229d9347eb73740f46c29..3340e335cb9aebe22d7b305022a52074cd84f123 100644 (file)
@@ -15,6 +15,8 @@ CLASS(Slider, Label)
        METHOD(Slider, mouseRelease, float(entity, vector));
        METHOD(Slider, valueToText, string(entity, float));
        METHOD(Slider, toString, string(entity));
+       METHOD(Slider, setValue_allowAnim, void(entity, float, bool));
+       METHOD(Slider, setValue_noAnim, void(entity, float));
        METHOD(Slider, setValue, void(entity, float));
        METHOD(Slider, setSliderValue, void(entity, float));
        METHOD(Slider, showNotify, void(entity));
@@ -24,6 +26,7 @@ CLASS(Slider, Label)
        ATTRIB(Slider, value, float, 0)
        ATTRIB(Slider, animated, float, 1)
        ATTRIB(Slider, sliderValue, float, 0)
+       ATTRIB(Slider, sliderAnim, entity, world)
        ATTRIB(Slider, valueMin, float, 0)
        ATTRIB(Slider, valueMax, float, 0)
        ATTRIB(Slider, valueStep, float, 0)
@@ -48,16 +51,27 @@ ENDCLASS(Slider)
 #endif
 
 #ifdef IMPLEMENTATION
-void Slider_setValue(entity me, float val)
+void Slider_setValue_allowAnim(entity me, float val, bool allowAnim)
 {
-       if (me.animated) {
-               anim.removeObjAnim(anim, me);
-               makeHostedEasing(me, Slider_setSliderValue, easingQuadInOut, 1, me.sliderValue, val);
+       if(allowAnim && me.animated) {
+               float t = 0.5;
+               if(!me.sliderAnim)
+                       me.sliderAnim = makeHostedEasing(me, Slider_setSliderValue, easingQuadOut, t, me.sliderValue, val);
+               else
+                       me.sliderAnim.update(me.sliderAnim, t, me.sliderValue, val);
        } else {
                me.setSliderValue(me, val);
        }
        me.value = val;
 }
+void Slider_setValue_noAnim(entity me, float val)
+{
+       Slider_setValue_allowAnim(me, val, false);
+}
+void Slider_setValue(entity me, float val)
+{
+       Slider_setValue_allowAnim(me, val, true);
+}
 void Slider_setSliderValue(entity me, float val)
 {
        me.sliderValue = val;
@@ -177,14 +191,10 @@ float Slider_keyUp(entity me, float key, float ascii, float shift)
 float Slider_mouseDrag(entity me, vector pos)
 {
        float hit;
-       float v, animed;
+       float v;
        if(me.disabled)
                return 0;
 
-       anim.removeObjAnim(anim, me);
-       animed = me.animated;
-       me.animated = false;
-
        if(me.pressed)
        {
                hit = 1;
@@ -194,17 +204,18 @@ float Slider_mouseDrag(entity me, vector pos)
                if(pos.y >= 1 + me.tolerance.y) hit = 0;
                if(hit)
                {
+                       // handle dragging
+                       me.pressed = 2;
+
                        v = median(0, (pos.x - me.pressOffset - 0.5 * me.controlWidth) / (1 - me.textSpace - me.controlWidth), 1) * (me.valueMax - me.valueMin) + me.valueMin;
                        if(me.valueStep)
                                v = floor(0.5 + v / me.valueStep) * me.valueStep;
-                       me.setValue(me, v);
+                       me.setValue_noAnim(me, v);
                }
                else
                        me.setValue(me, me.previousValue);
        }
 
-       me.animated = animed;
-
        return 1;
 }
 float Slider_mousePress(entity me, vector pos)
@@ -295,6 +306,14 @@ void Slider_draw(entity me)
                else
                        draw_Picture(eX * controlLeft, strcat(me.src, "_n"), eX * me.controlWidth + eY, me.color, 1);
        }
+
+       if(me.sliderAnim)
+       if(me.sliderAnim.isFinished(me.sliderAnim))
+       {
+               anim.removeObjAnim(anim, me);
+               me.sliderAnim = world;
+       }
+
        me.setText(me, me.valueToText(me, me.value));
        draw_alpha = save;
        SUPER(Slider).draw(me);
index 733b1d61255e155490021d7e12f6b53c61940acd..30b80c196d96884117def79c2c55496e65f34598 100644 (file)
@@ -6,6 +6,8 @@
 CLASS(TextSlider, Slider)
        METHOD(TextSlider, valueToText, string(entity, float));
        METHOD(TextSlider, valueToIdentifier, string(entity, float));
+       METHOD(TextSlider, setValueFromIdentifier_allowAnim, void(entity, string, bool));
+       METHOD(TextSlider, setValueFromIdentifier_noAnim, void(entity, string));
        METHOD(TextSlider, setValueFromIdentifier, void(entity, string));
        METHOD(TextSlider, getIdentifier, string(entity));
        METHOD(TextSlider, clearValues, void(entity));
@@ -35,16 +37,24 @@ string TextSlider_valueToText(entity me, int val)
                return _("Custom");
        return me.(valueStrings[val]);
 }
-void TextSlider_setValueFromIdentifier(entity me, string id)
+void TextSlider_setValueFromIdentifier_allowAnim(entity me, string id, bool allowAnim)
 {
        int i;
        for(i = 0; i < me.nValues; ++i)
                if(me.valueToIdentifier(me, i) == id)
                {
-                       SUPER(TextSlider).setValue( me, i );
+                       SUPER(TextSlider).setValue_allowAnim(me, i, allowAnim);
                        return;
                }
-       SUPER(TextSlider).setValue( me, -1 );
+       SUPER(TextSlider).setValue_allowAnim(me, -1, allowAnim);
+}
+void TextSlider_setValueFromIdentifier_noAnim(entity me, string id)
+{
+       TextSlider_setValueFromIdentifier_allowAnim(me, id, false);
+}
+void TextSlider_setValueFromIdentifier(entity me, string id)
+{
+       TextSlider_setValueFromIdentifier_allowAnim(me, id, true);
 }
 string TextSlider_getIdentifier(entity me)
 {
@@ -75,6 +85,6 @@ void TextSlider_insertValue(entity me, int pos, string theString, string theIden
 void TextSlider_configureTextSliderValues(entity me, string theDefault)
 {
        me.configureSliderValues(me, 0, 0, me.nValues - 1, 1, 1, 1);
-       me.setValueFromIdentifier(me, theDefault);
+       me.setValueFromIdentifier_noAnim(me, theDefault);
 }
 #endif
index ca65c66218b12efe4561f37baa377e85e284edf4..7ecd7a9d0a4e6a03ead4ee4e262ddaea22136813 100644 (file)
@@ -71,7 +71,7 @@ void XonoticSlider_loadCvars(entity me)
        if (!me.cvarName)
                return;
 
-       me.setValue( me, cvar(me.cvarName) );
+       me.setValue_noAnim(me, cvar(me.cvarName));
 }
 void XonoticSlider_saveCvars(entity me)
 {
index c840fb07ef7b3e47a5bb65a20097351dbae5a71f..e577cba66407ce84db002f16a1d7c860e7a7a365 100644 (file)
@@ -62,9 +62,9 @@ void XonoticDecibelsSlider_loadCvars(entity me)
 
        // snapping
        if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep, me.valueMin))
-               Slider_setValue(me, me.valueMax);
+               Slider_setValue_noAnim(me, me.valueMax);
        else
-               Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep) );
+               Slider_setValue_noAnim(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep));
 }
 void XonoticDecibelsSlider_saveCvars(entity me)
 {
index 0b2179d36eeede5497291f0afe6b8de486aed76e..1a7ee2c4a59101b65826e0ef2f1dce73485bc9d5 100644 (file)
@@ -32,7 +32,7 @@ void XonoticParticlesSlider_configureXonoticParticlesSlider(entity me)
 }
 void XonoticParticlesSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, sprintf("%s %s %s",
+       me.setValueFromIdentifier_noAnim(me, sprintf("%s %s %s",
                cvar_string("cl_particles_quality"),
                cvar_string("r_drawparticles_drawdistance"),
                cvar_string("cl_damageeffect")
index 8b91ecb1f3ad6180e7a2f84d9fede431a0e0d73c..c6d95b4304315381f3e3cbc973a572998079d244 100644 (file)
@@ -212,7 +212,7 @@ void XonoticResolutionSlider_loadResolutions(entity me, float fullscreen)
 }
 void XonoticResolutionSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
+       me.setValueFromIdentifier_noAnim(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
 }
 void XonoticResolutionSlider_saveCvars(entity me)
 {
index 5533a2361bf8bd2efc94cc42c4ad939f381b6ebe..ecf850f404f083b3548ed59138d7e34973c9ce80 100644 (file)
@@ -28,7 +28,7 @@ void XonoticScoreboardFadeTimeSlider_configureXonoticScoreboardFadeTimeSlider(en
 }
 void XonoticScoreboardFadeTimeSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, sprintf("%s %s",
+       me.setValueFromIdentifier_noAnim(me, sprintf("%s %s",
                cvar_string("scoreboard_fadeinspeed"),
                cvar_string("scoreboard_fadeoutspeed")
        ));
index 597772e340019f4d58077158dc710b619e3b5944..8c4682ee0ffbf9a25d5692bdd18ed1c267014777 100644 (file)
@@ -65,7 +65,7 @@ void XonoticTextSlider_loadCvars(entity me)
        float i;
        for(i = 1; i < n; ++i)
                s = strcat(s, " ", cvar_string(argv(i)));
-       me.setValueFromIdentifier(me, s);
+       me.setValueFromIdentifier_noAnim(me, s);
        if(me.value < 0 && n > 1)
        {
                // if it failed: check if all cvars have the same value
@@ -74,7 +74,7 @@ void XonoticTextSlider_loadCvars(entity me)
                        if(cvar_string(argv(i)) != cvar_string(argv(i-1)))
                                break;
                if(i >= n)
-                       me.setValueFromIdentifier(me, cvar_string(argv(0)));
+                       me.setValueFromIdentifier_noAnim(me, cvar_string(argv(0)));
        }
 }
 void XonoticTextSlider_saveCvars(entity me)