]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/engineinfo.qc
Merge branch 'master' into Mario/bulldozer
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / engineinfo.qc
1 // Engine info panel (#13)
2
3 float prevfps;
4 float prevfps_time;
5 int framecounter;
6
7 float frametimeavg;
8 float frametimeavg1; // 1 frame ago
9 float frametimeavg2; // 2 frames ago
10 void HUD_EngineInfo()
11 {
12         if(!autocvar__hud_configure)
13         {
14                 if(!autocvar_hud_panel_engineinfo) return;
15         }
16
17         HUD_Panel_UpdateCvars();
18         vector pos, mySize;
19         pos = panel_pos;
20         mySize = panel_size;
21
22         HUD_Panel_DrawBg(1);
23         if(panel_bg_padding)
24         {
25                 pos += '1 1 0' * panel_bg_padding;
26                 mySize -= '2 2 0' * panel_bg_padding;
27         }
28
29         float currentTime = gettime(GETTIME_REALTIME);
30         if(cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage"))
31         {
32                 float currentframetime = currentTime - prevfps_time;
33                 frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
34                 frametimeavg2 = frametimeavg1;
35                 frametimeavg1 = frametimeavg;
36
37                 float weight;
38                 weight = cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight");
39                 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.
40                 {
41                         if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("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
42                                 prevfps = (1/currentframetime);
43                         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"
44                 }
45                 prevfps_time = currentTime;
46         }
47         else
48         {
49                 framecounter += 1;
50                 if(currentTime - prevfps_time > autocvar_hud_panel_engineinfo_framecounter_time)
51                 {
52                         prevfps = framecounter/(currentTime - prevfps_time);
53                         framecounter = 0;
54                         prevfps_time = currentTime;
55                 }
56         }
57
58         vector color;
59         color = HUD_Get_Num_Color (prevfps, 100);
60         drawstring_aspect(pos, sprintf(_("FPS: %.*f"), autocvar_hud_panel_engineinfo_framecounter_decimals, prevfps), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
61 }