]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/engineinfo.qc
Merge branch 'master' into Mirio/balance
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / engineinfo.qc
1 #include "engineinfo.qh"
2 // Engine info panel (#13)
3
4 float prevfps;
5 float prevfps_time;
6 int framecounter;
7
8 float frametimeavg;
9 float frametimeavg1; // 1 frame ago
10 float frametimeavg2; // 2 frames ago
11 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage;
12 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight;
13 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold;
14 void HUD_EngineInfo()
15 {
16         if(!autocvar__hud_configure)
17         {
18                 if(!autocvar_hud_panel_engineinfo) return;
19         }
20
21         HUD_Panel_UpdateCvars();
22         vector pos, mySize;
23         pos = panel_pos;
24         mySize = panel_size;
25
26         if (autocvar_hud_panel_engineinfo_dynamichud)
27                 HUD_Scale_Enable();
28         else
29                 HUD_Scale_Disable();
30         HUD_Panel_DrawBg(1);
31         if(panel_bg_padding)
32         {
33                 pos += '1 1 0' * panel_bg_padding;
34                 mySize -= '2 2 0' * panel_bg_padding;
35         }
36
37         float currentTime = gettime(GETTIME_REALTIME);
38         if(autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage)
39         {
40                 float currentframetime = currentTime - prevfps_time;
41                 frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
42                 frametimeavg2 = frametimeavg1;
43                 frametimeavg1 = frametimeavg;
44
45                 float weight;
46                 weight = autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight;
47                 if(currentframetime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter.
48                 {
49                         if(fabs(prevfps - (1/frametimeavg)) > prevfps * autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold) // if there was a big jump in fps, just force prevfps at current (1/currentframetime) to make big updates instant
50                                 prevfps = (1/currentframetime);
51                         prevfps = (1 - weight) * prevfps + weight * (1/frametimeavg); // framecounter just used so there's no need for a new variable, think of it as "frametime average"
52                 }
53                 prevfps_time = currentTime;
54         }
55         else
56         {
57                 framecounter += 1;
58                 if(currentTime - prevfps_time > autocvar_hud_panel_engineinfo_framecounter_time)
59                 {
60                         prevfps = framecounter/(currentTime - prevfps_time);
61                         framecounter = 0;
62                         prevfps_time = currentTime;
63                 }
64         }
65
66         vector color;
67         color = HUD_Get_Num_Color (prevfps, 100);
68         drawstring_aspect(pos, sprintf(_("FPS: %.*f"), autocvar_hud_panel_engineinfo_framecounter_decimals, prevfps), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
69 }