]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/engineinfo.qc
Merge branch 'master' into terencehill/lms_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / engineinfo.qc
1 #include "engineinfo.qh"
2
3 #include <client/draw.qh>
4
5 // Engine info (#13)
6
7 void HUD_EngineInfo_Export(int fh)
8 {
9         // allow saving cvars that aesthetically change the panel into hud skin files
10 }
11
12 float prevfps;
13 float prevfps_time;
14 int framecounter;
15
16 float frametimeavg;
17 float frametimeavg1; // 1 frame ago
18 float frametimeavg2; // 2 frames ago
19 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage;
20 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight;
21 float autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold;
22 void HUD_EngineInfo()
23 {
24         if(!autocvar__hud_configure)
25         {
26                 if(!autocvar_hud_panel_engineinfo) return;
27         }
28
29         HUD_Panel_LoadCvars();
30         vector pos, mySize;
31         pos = panel_pos;
32         mySize = panel_size;
33
34         if (autocvar_hud_panel_engineinfo_dynamichud)
35                 HUD_Scale_Enable();
36         else
37                 HUD_Scale_Disable();
38         HUD_Panel_DrawBg();
39         if(panel_bg_padding)
40         {
41                 pos += '1 1 0' * panel_bg_padding;
42                 mySize -= '2 2 0' * panel_bg_padding;
43         }
44
45         float currentTime = gettime(GETTIME_FRAMESTART);
46         if(autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage)
47         {
48                 float currentframetime = currentTime - prevfps_time;
49                 frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
50                 frametimeavg2 = frametimeavg1;
51                 frametimeavg1 = frametimeavg;
52
53                 float weight;
54                 weight = autocvar_hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight;
55                 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.
56                 {
57                         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
58                                 prevfps = (1/currentframetime);
59                         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"
60                 }
61                 prevfps_time = currentTime;
62         }
63         else
64         {
65                 framecounter += 1;
66                 if(currentTime - prevfps_time > autocvar_hud_panel_engineinfo_framecounter_time)
67                 {
68                         prevfps = framecounter/(currentTime - prevfps_time);
69                         framecounter = 0;
70                         prevfps_time = currentTime;
71                 }
72         }
73
74         vector color = HUD_Get_Num_Color(prevfps, 100, true);
75         drawstring_aspect(pos, sprintf(_("FPS: %.*f"), autocvar_hud_panel_engineinfo_framecounter_decimals, prevfps), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
76 }