Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
slider_decibels.qc
Go to the documentation of this file.
1#include "slider_decibels.qh"
2
3float toDecibelOfSquare(float f, float mi)
4{
5 float A = log(10) / 20; // note: about 0.115; inverse: about 8.686
6 if(mi != 0)
7 {
8 // linear scale part
9 float t = 1 / A + mi;
10 float u = exp(1 + A * mi);
11 if(f <= u)
12 return mi + (t - mi) * (f / u);
13 }
14 return log(f) / A;
15}
16
17float fromDecibelOfSquare(float f, float mi)
18{
19 float A = log(10) / 20; // note: about 0.115; inverse: about 8.686
20 if(mi != 0)
21 {
22 // linear scale part
23 float t = 1 / A + mi;
24 float u = exp(1 + A * mi);
25 if(f <= t)
26 return u * ((f - mi) / (t - mi));
27 }
28 return exp(A * f);
29}
30
31entity makeXonoticDecibelsSlider_T(float theValueMin, float theValueMax, float theValueStep, string theCvar, string theTooltip)
32{
33 entity me;
35 me.configureXonoticSlider(me, theValueMin, theValueMax, theValueStep, theCvar, theTooltip);
36 return me;
37}
38entity makeXonoticDecibelsSlider(float theValueMin, float theValueMax, float theValueStep, string theCvar)
39{
40 return makeXonoticDecibelsSlider_T(theValueMin, theValueMax, theValueStep, theCvar, string_null);
41}
43{
44 float v;
45
46 if (!me.controlledCvar)
47 return;
48
49 v = cvar(me.controlledCvar);
50
51 // snapping
52 if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep, me.valueMin))
53 Slider_setValue(me, me.valueMax, false);
54 else
55 Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep), false);
56}
58{
59 if (!me.controlledCvar)
60 return;
61
62 if(me.value > me.valueMax - 0.5 * me.valueStep)
63 cvar_set(me.controlledCvar, ftos(fromDecibelOfSquare(me.valueMax, me.valueMin)));
64 else
65 cvar_set(me.controlledCvar, ftos(fromDecibelOfSquare(me.value, me.valueMin)));
66}
67
70{
71 if(v > me.valueMax - 0.5 * me.valueStep)
72 return CTX(_("VOL^MAX"));
73 else if(v <= me.valueMin)
74 return CTX(_("VOL^OFF"));
75 else if(autocvar_menu_snd_sliderscale == 3) // fake percent scale
76 return ftos_decimals_percentage((v - me.valueMin) / (me.valueMax - me.valueMin), 0);
77 else if(autocvar_menu_snd_sliderscale == 2) // 0..10 scale
78 return sprintf("%.1f", (v - me.valueMin) / (me.valueMax - me.valueMin) * 10);
79 else if(autocvar_menu_snd_sliderscale == 1) // real percent scale
80 return ftos_decimals_percentage(fromDecibelOfSquare(v, me.valueMin), 2);
81 else // decibel scale
82 return sprintf(_("%s dB"), ftos_decimals(toDecibelOfSquare(fromDecibelOfSquare(v, me.valueMin), 0), me.valueDigits));
83}
84
87{
89 for (int i = -400; i < 0; ++i)
90 {
91 float db = i * 0.1;
92 float v = fromDecibelOfSquare(db, -40);
93 float dbv = toDecibelOfSquare(v, -40);
94 float d = dbv - db;
95 LOG_INFOF("%f -> %f -> %f (diff: %f)", db, v, dbv, d);
96 EXPECT_LT(fabs(d), 0.02);
97 }
98 SUCCEED();
99}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float log(float f)
ERASEABLE string CTX(string s)
Definition i18n.qh:45
void Slider_setValue(entity me, float val, bool allowAnim)
Definition slider.qc:40
#define LOG_INFOF(...)
Definition log.qh:66
float exp(float e)
Definition mathlib.qc:73
void cvar_set(string name, string value)
float cvar(string name)
string ftos(float f)
float fabs(float f)
float floor(float f)
string string_null
Definition nil.qh:9
#define NEW(cname,...)
Definition oo.qh:117
bool autocvar_test_XonoticDecibelsSlider
void XonoticDecibelsSlider_saveCvars(entity me)
float fromDecibelOfSquare(float f, float mi)
entity makeXonoticDecibelsSlider_T(float theValueMin, float theValueMax, float theValueStep, string theCvar, string theTooltip)
string XonoticDecibelsSlider_valueToText(entity me, float v)
entity makeXonoticDecibelsSlider(float theValueMin, float theValueMax, float theValueStep, string theCvar)
void XonoticDecibelsSlider_loadCvars(entity me)
float autocvar_menu_snd_sliderscale
float toDecibelOfSquare(float f, float mi)
ERASEABLE string ftos_decimals(float number, int decimals)
converts a number to a string with the indicated number of decimals
Definition string.qh:469
ERASEABLE string ftos_decimals_percentage(float number, int decimals)
converts a percentage to a string with the indicated number of decimals
Definition string.qh:480
#define TEST(suite, test)
Use UpperCamelCase for suite and test only.
Definition test.qh:6
#define SUCCEED()
Must be present at the end of a test.
Definition test.qh:15
#define EXPECT_LT(val1, val2)
Definition test.qh:55