X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fslider_decibels.c;h=729bec00693e28f1707c8c12868cfe90d1bbb974;hb=e14bb786305e05541496fb5b28c090e0ff1b5783;hp=ba7cffc22f049b99564ca11fb7582225716b90db;hpb=1f5d48dd87aaf7d479958202f3960de01ac877d2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/xonotic/slider_decibels.c b/qcsrc/menu/xonotic/slider_decibels.c index ba7cffc22..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; @@ -16,7 +26,7 @@ entity makeXonoticDecibelsSlider(float theValueMin, float theValueMax, float the me.configureXonoticSlider(me, theValueMin, theValueMax, theValueStep, theCvar); return me; } -void loadCvarsXonoticDecibelsSlider(entity me) +void XonoticDecibelsSlider_loadCvars(entity me) { float v; @@ -24,33 +34,35 @@ void loadCvarsXonoticDecibelsSlider(entity me) return; v = cvar(me.cvarName); - if(v >= 0.98) - setValueSlider( me, 0 ); - else if(v < 0.0005) - setValueSlider( 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 - setValueSlider( 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 saveCvarsXonoticDecibelsSlider(entity me) +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 valueToTextXonoticDecibelsSlider(entity me, float v) +string XonoticDecibelsSlider_valueToText(entity me, float v) { - if(v < -33) - return "OFF"; - else if(v >= -0.1) - return "MAX"; - return strcat(valueToTextSlider(me, v), " dB"); + 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)); } #endif