X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fslider_decibels.c;h=729bec00693e28f1707c8c12868cfe90d1bbb974;hb=e14bb786305e05541496fb5b28c090e0ff1b5783;hp=24edb4cb91b6deef418b7d17053411e4912a578b;hpb=8ff442735589e4276cc3ed2b1626012f2d81f13c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/xonotic/slider_decibels.c b/qcsrc/menu/xonotic/slider_decibels.c index 24edb4cb9..729bec006 100644 --- a/qcsrc/menu/xonotic/slider_decibels.c +++ b/qcsrc/menu/xonotic/slider_decibels.c @@ -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)); }