]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/slider_decibels.c
Merge remote-tracking branch 'origin/master' into samual/update_effects_tab
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / slider_decibels.c
index 24edb4cb91b6deef418b7d17053411e4912a578b..729bec00693e28f1707c8c12868cfe90d1bbb974 100644 (file)
@@ -9,6 +9,16 @@ entity makeXonoticDecibelsSlider(float, float, float, string);
 
 #ifdef IMPLEMENTATION
 
+float toDecibelOfSquare(float f)
+{
+       return 20.0 * log10(f);
+}
+
+float fromDecibelOfSquare(float f)
+{
+       return pow(10, f / 20.0);
+}
+
 entity makeXonoticDecibelsSlider(float theValueMin, float theValueMax, float theValueStep, string theCvar)
 {
        entity me;
@@ -24,32 +34,34 @@ void XonoticDecibelsSlider_loadCvars(entity me)
                return;
 
        v = cvar(me.cvarName);
-       if(v >= 0.98)
-               Slider_setValue( me, 0 );
-       else if(v < 0.0005)
-               Slider_setValue( me, -1000000 );
+
+       // snapping
+       if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep))
+               Slider_setValue(me, me.valueMax);
+       else if(v < fromDecibelOfSquare(me.valueMin - 0.5 * me.valueStep))
+               Slider_setValue(me, -1000000); // virtually infinite
        else
-               Slider_setValue( me, 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10) );
+               Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v) / me.valueStep) );
 }
 void XonoticDecibelsSlider_saveCvars(entity me)
 {
        if not(me.cvarName)
                return;
 
-       if(me.value >= -0.1)
-               cvar_set(me.cvarName, "1");
-       if(me.value < -33)
+       if(me.value > me.valueMax - 0.5 * me.valueStep)
+               cvar_set(me.cvarName, ftos(fromDecibelOfSquare(me.valueMax)));
+       else if(me.value < me.valueMin - 0.5 * me.valueStep)
                cvar_set(me.cvarName, "0");
        else
-               cvar_set(me.cvarName, ftos(pow(10, me.value / 10)));
+               cvar_set(me.cvarName, ftos(fromDecibelOfSquare(me.value)));
 }
 
 string XonoticDecibelsSlider_valueToText(entity me, float v)
 {
-       if(v < -33)
-               return CTX(_("VOL^OFF"));
-       else if(v >= -0.1)
+       if(v > me.valueMax - 0.5 * me.valueStep)
                return CTX(_("VOL^MAX"));
+       else if(v < me.valueMin - 0.5 * me.valueStep)
+               return CTX(_("VOL^OFF"));
        return sprintf(_("%s dB"), SUPER(XonoticDecibelsSlider).valueToText(me, v));
 }