]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
fix broken demos with csqc code
[xonotic/darkplaces.git] / cl_screen.c
index b1f5df21238939571a1463839d083fa050c91907..702635a2a2d68cd7583d58979a57c52f68336bd3 100644 (file)
@@ -81,6 +81,8 @@ float         scr_centertime_off;
 int                    scr_center_lines;
 int                    scr_erase_lines;
 int                    scr_erase_center;
+char        scr_infobarstring[MAX_INPUTLINE];
+float       scr_infobartime_off;
 
 /*
 ==============
@@ -90,7 +92,7 @@ Called for important messages that should stay in the center of the screen
 for a few moments
 ==============
 */
-void SCR_CenterPrint(char *str)
+void SCR_CenterPrint(const char *str)
 {
        strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
        scr_centertime_off = scr_centertime.value;
@@ -442,7 +444,7 @@ SCR_DrawQWDownload
 */
 static int SCR_DrawQWDownload(int offset)
 {
-       // sync with SCR_DownloadHeight
+       // sync with SCR_InfobarHeight
        int len;
        float x, y;
        float size = 8;
@@ -466,12 +468,30 @@ static int SCR_DrawQWDownload(int offset)
        else
                dpsnprintf(temp, sizeof(temp), "Downloading %s %3i%% (%i/%i) at %i bytes/s\n", cls.qw_downloadname, cls.qw_downloadpercent, cls.qw_downloadmemorycursize, cls.qw_downloadmemorymaxsize, cls.qw_downloadspeedrate);
        len = (int)strlen(temp);
-       x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, 0, FONT_INFOBAR) * size) / 2;
+       x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, true, FONT_INFOBAR) * size) / 2;
        y = vid_conheight.integer - size - offset;
        DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0);
        DrawQ_String_Font(x, y, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR);
        return 8;
 }
+/*
+==============
+SCR_DrawInfobarString
+==============
+*/
+static int SCR_DrawInfobarString(int offset)
+{
+       int len;
+       float x, y;
+       float size = 8;
+
+       len = (int)strlen(scr_infobarstring);
+       x = (vid_conwidth.integer - DrawQ_TextWidth_Font(scr_infobarstring, len, false, FONT_INFOBAR) * size) / 2;
+       y = vid_conheight.integer - size - offset;
+       DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0);
+       DrawQ_String_Font(x, y, scr_infobarstring, len, size, size, 1, 1, 1, 1, 0, NULL, false, FONT_INFOBAR);
+       return 8;
+}
 
 /*
 ==============
@@ -480,7 +500,7 @@ SCR_DrawCurlDownload
 */
 static int SCR_DrawCurlDownload(int offset)
 {
-       // sync with SCR_DownloadHeight
+       // sync with SCR_InfobarHeight
        int len;
        int nDownloads;
        int i;
@@ -499,7 +519,7 @@ static int SCR_DrawCurlDownload(int offset)
        if(addinfo)
        {
                len = (int)strlen(addinfo);
-               x = (vid_conwidth.integer - DrawQ_TextWidth_Font(addinfo, len, false, FONT_INFOBAR) * size) / 2;
+               x = (vid_conwidth.integer - DrawQ_TextWidth_Font(addinfo, len, true, FONT_INFOBAR) * size) / 2;
                DrawQ_Fill(0, y - size, vid_conwidth.integer, size, 1, 1, 1, cls.signon == SIGNONS ? 0.8 : 1, 0);
                DrawQ_String_Font(x, y - size, addinfo, len, size, size, 0, 0, 0, 1, 0, NULL, true, FONT_INFOBAR);
        }
@@ -513,7 +533,7 @@ static int SCR_DrawCurlDownload(int offset)
                else
                        dpsnprintf(temp, sizeof(temp), "Downloading %s ...  %5.1f%% @ %.1f KiB/s\n", downinfo[i].filename, 100.0 * downinfo[i].progress, downinfo[i].speed / 1024.0);
                len = (int)strlen(temp);
-               x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, false, FONT_INFOBAR) * size) / 2;
+               x = (vid_conwidth.integer - DrawQ_TextWidth_Font(temp, len, true, FONT_INFOBAR) * size) / 2;
                DrawQ_Fill(0, y + i * size, vid_conwidth.integer, size, 0, 0, 0, cls.signon == SIGNONS ? 0.5 : 1, 0);
                DrawQ_String_Font(x, y + i * size, temp, len, size, size, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR);
        }
@@ -525,27 +545,34 @@ static int SCR_DrawCurlDownload(int offset)
 
 /*
 ==============
-SCR_DrawDownload
+SCR_DrawInfobar
 ==============
 */
-static void SCR_DrawDownload()
+static void SCR_DrawInfobar()
 {
        int offset = 0;
+       if(scr_infobartime_off > 0)
+               offset += SCR_DrawInfobarString(offset);
        offset += SCR_DrawQWDownload(offset);
        offset += SCR_DrawCurlDownload(offset);
        if(offset != scr_con_margin_bottom)
                Con_DPrintf("broken console margin calculation: %d != %d\n", offset, scr_con_margin_bottom);
 }
 
-static int SCR_DownloadHeight()
+static int SCR_InfobarHeight()
 {
        int offset = 0;
        Curl_downloadinfo_t *downinfo;
        const char *addinfo;
        int nDownloads;
 
+       if (cl.time > cl.oldtime)
+               scr_infobartime_off -= cl.time - cl.oldtime;
+       if(scr_infobartime_off > 0)
+               offset += 8;
+
        if(cls.qw_downloadname[0])
-               offset += 0;
+               offset += 8;
 
        downinfo = Curl_GetDownloadInfo(&nDownloads, &addinfo);
        if(downinfo)
@@ -557,6 +584,23 @@ static int SCR_DownloadHeight()
        return offset;
 }
 
+/*
+==============
+SCR_InfoBar_f
+==============
+*/
+void SCR_InfoBar_f(void)
+{
+       if(Cmd_Argc() == 3)
+       {
+               scr_infobartime_off = atof(Cmd_Argv(1));
+               strlcpy(scr_infobarstring, Cmd_Argv(2), sizeof(scr_infobarstring));
+       }
+       else
+       {
+               Con_Printf("usage:\ninfobar expiretime \"string\"\n");
+       }
+}
 //=============================================================================
 
 /*
@@ -603,7 +647,7 @@ SCR_DrawConsole
 */
 void SCR_DrawConsole (void)
 {
-       scr_con_margin_bottom = SCR_DownloadHeight();
+       scr_con_margin_bottom = SCR_InfobarHeight();
        if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
        {
                // full screen
@@ -697,18 +741,23 @@ void R_TimeReport_EndFrame(void)
                // put the location name in the r_speeds display as it greatly helps
                // when creating loc files
                loc = CL_Locs_FindNearest(cl.movement_origin);
-               if (loc)
-                       sprintf(string + strlen(string), "Location: %s\n", loc->name);
-               sprintf(string + strlen(string), "%3i renders org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_refdef.stats.renders, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], r_refdef.view.forward[0], r_refdef.view.forward[1], r_refdef.view.forward[2]);
-               sprintf(string + strlen(string), "%7i surfaces%7i triangles %5i entities (%7i surfaces%7i triangles)\n", r_refdef.stats.world_surfaces, r_refdef.stats.world_triangles, r_refdef.stats.entities, r_refdef.stats.entities_surfaces, r_refdef.stats.entities_triangles);
-               sprintf(string + strlen(string), "%5i leafs%5i portals%6i/%6i particles%6i/%6i decals %3i%% quality\n", r_refdef.stats.world_leafs, r_refdef.stats.world_portals, r_refdef.stats.particles, cl.num_particles, r_refdef.stats.decals, cl.num_decals, (int)(100 * r_refdef.view.quality));
-               sprintf(string + strlen(string), "%7i lightmap updates (%7i pixels)\n", r_refdef.stats.lightmapupdates, r_refdef.stats.lightmapupdatepixels);
-               sprintf(string + strlen(string), "%4i lights%4i clears%4i scissored%7i light%7i shadow%7i dynamic\n", r_refdef.stats.lights, r_refdef.stats.lights_clears, r_refdef.stats.lights_scissored, r_refdef.stats.lights_lighttriangles, r_refdef.stats.lights_shadowtriangles, r_refdef.stats.lights_dynamicshadowtriangles);
-               if (r_refdef.stats.bloom)
-                       sprintf(string + strlen(string), "rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n", r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3, r_refdef.stats.bloom_copypixels, r_refdef.stats.bloom_drawpixels);
-               else
-                       sprintf(string + strlen(string), "rendered%6i meshes%8i triangles\n", r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3);
-               strlcat(string, r_speeds_timestring, sizeof(string));
+               dpsnprintf(string, sizeof(string),
+"%s%s\n"
+"%3i renders org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
+"%7i surfaces%7i triangles %5i entities (%7i surfaces%7i triangles)\n"
+"%5i leafs%5i portals%6i/%6i particles%6i/%6i decals %3i%% quality\n"
+"%7i lightmap updates (%7i pixels)\n"
+"%4i lights%4i clears%4i scissored%7i light%7i shadow%7i dynamic\n"
+"rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n"
+"%s"
+, loc ? "Location: " : "", loc ? loc->name : ""
+, r_refdef.stats.renders, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], r_refdef.view.forward[0], r_refdef.view.forward[1], r_refdef.view.forward[2]
+, r_refdef.stats.world_surfaces, r_refdef.stats.world_triangles, r_refdef.stats.entities, r_refdef.stats.entities_surfaces, r_refdef.stats.entities_triangles
+, r_refdef.stats.world_leafs, r_refdef.stats.world_portals, r_refdef.stats.particles, cl.num_particles, r_refdef.stats.decals, cl.num_decals, (int)(100 * r_refdef.view.quality)
+, r_refdef.stats.lightmapupdates, r_refdef.stats.lightmapupdatepixels
+, r_refdef.stats.lights, r_refdef.stats.lights_clears, r_refdef.stats.lights_scissored, r_refdef.stats.lights_lighttriangles, r_refdef.stats.lights_shadowtriangles, r_refdef.stats.lights_dynamicshadowtriangles
+, r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3, r_refdef.stats.bloom_copypixels, r_refdef.stats.bloom_drawpixels
+, r_speeds_timestring);
 
                memset(&r_refdef.stats, 0, sizeof(r_refdef.stats));
 
@@ -824,6 +873,7 @@ void CL_Screen_Init(void)
        Cmd_AddCommand ("sizedown",SCR_SizeDown_f, "decrease view size (decreases viewsize cvar)");
        Cmd_AddCommand ("screenshot",SCR_ScreenShot_f, "takes a screenshot of the next rendered frame");
        Cmd_AddCommand ("envmap", R_Envmap_f, "render a cubemap (skybox) of the current scene");
+       Cmd_AddCommand ("infobar", SCR_InfoBar_f, "display a text in the infobar (usage: infobar expiretime string)");
 
        scr_initialized = true;
 }
@@ -844,11 +894,11 @@ void SCR_ScreenShot_f (void)
        unsigned char *buffer3;
        qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
 
-       sprintf (base, "screenshots/%s", scr_screenshot_name.string);
+       dpsnprintf (base, sizeof(base), "screenshots/%s", scr_screenshot_name.string);
 
        if (strcmp (oldname, scr_screenshot_name.string))
        {
-               sprintf(oldname, "%s", scr_screenshot_name.string);
+               dpsnprintf(oldname, sizeof(oldname), "%s", scr_screenshot_name.string);
                shotnumber = 0;
        }
 
@@ -862,7 +912,7 @@ void SCR_ScreenShot_f (void)
                return;
        }
 
-       sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
+       dpsnprintf(filename, sizeof(filename), "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
 
        buffer1 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3);
        buffer2 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 3);
@@ -1220,7 +1270,7 @@ Cr = R *  .500 + G * -.419 + B * -.0813 + 128.;
        //else
        {
                cls.capturevideo.format = CAPTUREVIDEOFORMAT_AVI_I420;
-               cls.capturevideo.videofile = FS_Open (va("%s.avi", cls.capturevideo.basename), "wb", false, true);
+               cls.capturevideo.videofile = FS_OpenRealFile(va("%s.avi", cls.capturevideo.basename), "wb", false);
                SCR_CaptureVideo_RIFF_Start();
                // enclosing RIFF chunk (there can be multiple of these in >1GB files, the later ones are "AVIX" instead of "AVI " and have no header/stream info)
                SCR_CaptureVideo_RIFF_Push("RIFF", "AVI ");
@@ -1733,7 +1783,7 @@ static void R_Envmap_f (void)
 
        for (j = 0;j < 12;j++)
        {
-               sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
+               dpsnprintf(filename, sizeof(filename), "env/%s%s.tga", basename, envmapinfo[j].name);
                Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], envmapinfo[j].angles[0], envmapinfo[j].angles[1], envmapinfo[j].angles[2], 1);
                r_refdef.view.quality = 1;
                r_refdef.view.clear = true;
@@ -2013,7 +2063,7 @@ void SCR_DrawScreen (void)
 
        SCR_DrawBrand();
 
-       SCR_DrawDownload();
+       SCR_DrawInfobar();
 
        if (r_timereport_active)
                R_TimeReport("2d");
@@ -2277,11 +2327,11 @@ void CL_UpdateScreen(void)
        else if (key_consoleactive)
                VID_SetMouse(vid.fullscreen, false, false);
        else if (key_dest == key_menu_grabbed)
-               VID_SetMouse(true, !in_client_mouse, true);
+               VID_SetMouse(true, vid_mouse.integer && !in_client_mouse, true);
        else if (key_dest == key_menu)
-               VID_SetMouse(vid.fullscreen, !in_client_mouse, true);
+               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !in_client_mouse, true);
        else
-               VID_SetMouse(vid.fullscreen || (vid_mouse.integer && !cls.demoplayback && !cl.csqc_wantsmousemove), vid_mouse.integer && !cls.demoplayback && !cl.csqc_wantsmousemove, true);
+               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !cls.demoplayback && !cl.csqc_wantsmousemove, true);
 
        VID_Finish();
 }