]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
added rmesh_t and R_Mesh_AddVertex3f, R_Mesh_AddPolygon3f, R_Mesh_AddBrushMeshFromPla...
[xonotic/darkplaces.git] / cl_screen.c
index 9177d0e66b2ed9d3befd6b619c0ea0adeb1beb3a..02632b2c9aa80a7fc9b5e104c530f3960b2ac169 100644 (file)
@@ -23,6 +23,7 @@ cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","
 cvar_t scr_screenshot_gamma = {CVAR_SAVE, "scr_screenshot_gamma","2.2"};
 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
 cvar_t cl_capturevideo = {0, "cl_capturevideo", "0"};
+cvar_t cl_capturevideo_sound = {0, "cl_capturevideo_sound", "0"};
 cvar_t cl_capturevideo_fps = {0, "cl_capturevideo_fps", "30"};
 cvar_t cl_capturevideo_rawrgb = {0, "cl_capturevideo_rawrgb", "0"};
 cvar_t cl_capturevideo_rawyv12 = {0, "cl_capturevideo_rawyv12", "0"};
@@ -34,7 +35,6 @@ int jpeg_supported = false;
 qboolean       scr_initialized;                // ready to draw
 
 float          scr_con_current;
-float          scr_conlines;           // lines of console to display
 
 extern int     con_vislines;
 
@@ -178,7 +178,7 @@ void SCR_DrawTurtle (void)
        if (count < 3)
                return;
 
-       DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (0, 0, "gfx/turtle", 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -195,7 +195,7 @@ void SCR_DrawNet (void)
        if (cls.demoplayback)
                return;
 
-       DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (64, 0, "gfx/net", 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -216,8 +216,8 @@ void SCR_DrawPause (void)
        if (!cl.paused)
                return;
 
-       pic = Draw_CachePic ("gfx/pause.lmp");
-       DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
+       pic = Draw_CachePic ("gfx/pause", true);
+       DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause", 0, 0, 1, 1, 1, 1, 0);
 }
 
 
@@ -234,6 +234,9 @@ SCR_SetUpToDrawConsole
 */
 void SCR_SetUpToDrawConsole (void)
 {
+       // lines of console to display
+       float conlines;
+
        Con_CheckResize ();
 
        if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
@@ -242,31 +245,29 @@ void SCR_SetUpToDrawConsole (void)
                key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
 
 // decide on the height of the console
-       if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
-               scr_conlines = vid.conheight; // full screen
-       else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
-               scr_conlines = vid.conheight/2; // half screen
+       if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
+               conlines = vid.conheight/2;     // half screen
        else
-               scr_conlines = 0;                               // none visible
+               conlines = 0;                           // none visible
 
        if (scr_conspeed.value)
        {
-               if (scr_conlines < scr_con_current)
+               if (scr_con_current > conlines)
                {
                        scr_con_current -= scr_conspeed.value*host_realframetime;
-                       if (scr_conlines > scr_con_current)
-                               scr_con_current = scr_conlines;
+                       if (scr_con_current < conlines)
+                               scr_con_current = conlines;
 
                }
-               else if (scr_conlines > scr_con_current)
+               else if (scr_con_current < conlines)
                {
                        scr_con_current += scr_conspeed.value*host_realframetime;
-                       if (scr_conlines < scr_con_current)
-                               scr_con_current = scr_conlines;
+                       if (scr_con_current > conlines)
+                               scr_con_current = conlines;
                }
        }
        else
-               scr_con_current = scr_conlines;
+               scr_con_current = conlines;
 }
 
 /*
@@ -276,7 +277,12 @@ SCR_DrawConsole
 */
 void SCR_DrawConsole (void)
 {
-       if (scr_con_current)
+       if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
+       {
+               // full screen
+               Con_DrawConsole (vid.conheight);
+       }
+       else if (scr_con_current)
                Con_DrawConsole (scr_con_current);
        else
        {
@@ -294,7 +300,8 @@ SCR_BeginLoadingPlaque
 */
 void SCR_BeginLoadingPlaque (void)
 {
-       S_StopAllSounds ();
+       Host_StartVideo();
+       S_StopAllSounds();
        SCR_UpdateLoadingScreen();
 }
 
@@ -310,7 +317,7 @@ void R_TimeReport(char *desc)
        int length;
        int t;
 
-       if (!r_timereport_active)
+       if (!r_timereport_active || r_showtrispass)
                return;
 
        r_timereport_temp = r_timereport_current;
@@ -340,9 +347,6 @@ void R_TimeReport(char *desc)
        }
 }
 
-extern int c_rt_lights, c_rt_clears, c_rt_scissored;
-extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
-extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
 void R_TimeReport_Start(void)
 {
        r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
@@ -350,23 +354,14 @@ void R_TimeReport_Start(void)
        if (r_timereport_active)
        {
                speedstringcount = 0;
-               sprintf(r_speeds_string,
-                       "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
-                       "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
-                       "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
-                       "%6i modeltris%6i meshs%6i meshtris\n",
-                       r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
-                       c_faces, c_nodes, c_leafs, c_light_polys,
-                       c_models, c_bmodels, c_sprites, c_particles, c_dlights,
-                       c_alias_polys, c_meshs, c_meshelements / 3);
-
-               sprintf(r_speeds_string + strlen(r_speeds_string),
-                       "realtime lighting:%4i lights%4i clears%4i scissored\n"
-                       "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
-                       "precomputed: %6i shadowmeshes%6i shadowtris\n",
-                       c_rt_lights, c_rt_clears, c_rt_scissored,
-                       c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
-                       c_rtcached_shadowmeshes, c_rtcached_shadowtris);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n", r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2]);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n", c_faces, c_nodes, c_leafs, c_light_polys);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n", c_models, c_bmodels, c_sprites, c_particles, c_dlights);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "%6i modeltris%6i meshs%6i meshtris\n", c_alias_polys, c_meshs, c_meshelements / 3);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "bloom %s: %i copies (%i pixels) %i draws (%i pixels)\n", c_bloom ? "active" : "inactive", c_bloomcopies, c_bloomcopypixels, c_bloomdraws, c_bloomdrawpixels);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "realtime lighting:%4i lights%4i clears%4i scissored\n", c_rt_lights, c_rt_clears, c_rt_scissored);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n", c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris);
+               sprintf(r_speeds_string + strlen(r_speeds_string), "precomputed: %6i shadowmeshes%6i shadowtris\n", c_rtcached_shadowmeshes, c_rtcached_shadowtris);
 
                c_alias_polys = 0;
                c_light_polys = 0;
@@ -377,8 +372,23 @@ void R_TimeReport_Start(void)
                c_bmodels = 0;
                c_sprites = 0;
                c_particles = 0;
+               c_dlights = 0;
                c_meshs = 0;
                c_meshelements = 0;
+               c_rt_lights = 0;
+               c_rt_clears = 0;
+               c_rt_scissored = 0;
+               c_rt_shadowmeshes = 0;
+               c_rt_shadowtris = 0;
+               c_rt_lightmeshes = 0;
+               c_rt_lighttris = 0;
+               c_rtcached_shadowmeshes = 0;
+               c_rtcached_shadowtris = 0;
+               c_bloom = 0;
+               c_bloomcopies = 0;
+               c_bloomcopypixels = 0;
+               c_bloomdraws = 0;
+               c_bloomdrawpixels = 0;
 
                r_timereport_start = Sys_DoubleTime();
        }
@@ -458,6 +468,7 @@ void CL_Screen_Init(void)
        Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
        Cvar_RegisterVariable (&scr_screenshot_gamma);
        Cvar_RegisterVariable (&cl_capturevideo);
+       Cvar_RegisterVariable (&cl_capturevideo_sound);
        Cvar_RegisterVariable (&cl_capturevideo_fps);
        Cvar_RegisterVariable (&cl_capturevideo_rawrgb);
        Cvar_RegisterVariable (&cl_capturevideo_rawyv12);
@@ -498,7 +509,7 @@ void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float s
        for (;len > 0 && string[len - 1] == ' ';len--);
        if (len < 1)
                return;
-       if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
+       if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * len) || y < (-scaley))
                return;
        size = sizeof(*dq) + ((len + 1 + 3) & ~3);
        if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
@@ -527,7 +538,7 @@ void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex
        if (r_textshadow.integer)
                DrawQ_String_Real(x+scalex*0.25,y+scaley*0.25,string,maxlen,scalex,scaley,0,0,0,alpha*0.8,flags);
 
-       DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags); 
+       DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags);
 }
 
 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
@@ -543,7 +554,7 @@ void DrawQ_SuperPic(float x, float y, char *picname, float width, float height,
        memset(&mesh, 0, sizeof(mesh));
        if (picname && picname[0])
        {
-               pic = Draw_CachePic(picname);
+               pic = Draw_CachePic(picname, false);
                if (width == 0)
                        width = pic->width;
                if (height == 0)
@@ -714,15 +725,15 @@ static int cl_capturevideo_soundrate = 0;
 static int cl_capturevideo_frame = 0;
 static qbyte *cl_capturevideo_buffer = NULL;
 static qfile_t *cl_capturevideo_videofile = NULL;
-static qfile_t *cl_capturevideo_soundfile = NULL;
+qfile_t *cl_capturevideo_soundfile = NULL;
 static short cl_capturevideo_rgbtoyuvscaletable[3][3][256];
 static unsigned char cl_capturevideo_yuvnormalizetable[3][256];
-static unsigned char cl_capturevideo_rgbgammatable[3][256];
+//static unsigned char cl_capturevideo_rgbgammatable[3][256];
 
 void SCR_CaptureVideo_BeginVideo(void)
 {
        double gamma, g;
-       unsigned int i, j;
+       unsigned int i;
        qbyte out[44];
        if (cl_capturevideo_active)
                return;
@@ -735,13 +746,15 @@ void SCR_CaptureVideo_BeginVideo(void)
        cl_capturevideo_buffer = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * (3+3+3) + 18);
        gamma = 1.0/scr_screenshot_gamma.value;
 
+       /*
        for (i = 0;i < 256;i++)
        {
-               j = (unsigned char)bound(0, 255*pow(i/255.0, gamma), 255);
+               unsigned char j = (unsigned char)bound(0, 255*pow(i/255.0, gamma), 255);
                cl_capturevideo_rgbgammatable[0][i] = j;
                cl_capturevideo_rgbgammatable[1][i] = j;
                cl_capturevideo_rgbgammatable[2][i] = j;
        }
+       */
 /*
 R = Y + 1.4075 * (Cr - 128);
 G = Y + -0.3455 * (Cb - 128) + -0.7169 * (Cr - 128);
@@ -752,7 +765,7 @@ Cr = R *  .500 + G * -.419 + B * -.0813 + 128.;
 */
        for (i = 0;i < 256;i++)
        {
-               g = i;//255*pow(i/255.0, gamma);
+               g = 255*pow(i/255.0, gamma);
                // Y weights from RGB
                cl_capturevideo_rgbtoyuvscaletable[0][0][i] = (short)(g *  0.299);
                cl_capturevideo_rgbtoyuvscaletable[0][1][i] = (short)(g *  0.587);
@@ -774,12 +787,12 @@ Cr = R *  .500 + G * -.419 + B * -.0813 + 128.;
        if (cl_capturevideo_rawrgb.integer)
        {
                cl_capturevideo_format = CAPTUREVIDEOFORMAT_RAWRGB;
-               cl_capturevideo_videofile = FS_Open ("video/dpvideo.rgb", "wb", false);
+               cl_capturevideo_videofile = FS_Open ("video/dpvideo.rgb", "wb", false, true);
        }
        else if (cl_capturevideo_rawyv12.integer)
        {
                cl_capturevideo_format = CAPTUREVIDEOFORMAT_RAWYV12;
-               cl_capturevideo_videofile = FS_Open ("video/dpvideo.yv12", "wb", false);
+               cl_capturevideo_videofile = FS_Open ("video/dpvideo.yv12", "wb", false, true);
        }
        else if (scr_screenshot_jpeg.integer)
        {
@@ -792,11 +805,15 @@ Cr = R *  .500 + G * -.419 + B * -.0813 + 128.;
                cl_capturevideo_videofile = NULL;
        }
 
-       cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false);
-
-       // wave header will be filled out when video ends
-       memset(out, 0, 44);
-       FS_Write (cl_capturevideo_soundfile, out, 44);
+       if (cl_capturevideo_sound.integer)
+       {
+               cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false, true);
+               // wave header will be filled out when video ends
+               memset(out, 0, 44);
+               FS_Write (cl_capturevideo_soundfile, out, 44);
+       }
+       else
+               cl_capturevideo_soundfile = NULL;
 }
 
 void SCR_CaptureVideo_EndVideo(void)
@@ -957,6 +974,8 @@ qboolean SCR_CaptureVideo_VideoFrame(int newframenum)
 
 void SCR_CaptureVideo_SoundFrame(qbyte *bufstereo16le, size_t length, int rate)
 {
+       if (!cl_capturevideo_soundfile)
+               return;
        cl_capturevideo_soundrate = rate;
        if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < 4 * length)
        {
@@ -978,7 +997,13 @@ void SCR_CaptureVideo(void)
                        Con_Printf("You can not change the video framerate while recording a video.\n");
                        Cvar_SetValueQuick(&cl_capturevideo_fps, cl_capturevideo_framerate);
                }
-               newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate;
+               if (cl_capturevideo_soundfile)
+               {
+                       // preserve sound sync by duplicating frames when running slow
+                       newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate;
+               }
+               else
+                       newframenum = cl_capturevideo_frame + 1;
                // if falling behind more than one second, stop
                if (newframenum - cl_capturevideo_frame > (int)ceil(cl_capturevideo_framerate))
                {
@@ -1206,6 +1231,44 @@ void CL_UpdateScreen(void)
        if (!scr_initialized || !con_initialized || vid_hidden)
                return;                         // not initialized yet
 
+       // don't allow cheats in multiplayer
+       if (!cl.islocalgame && cl.worldmodel)
+       {
+               if (r_fullbright.integer != 0)
+                       Cvar_Set ("r_fullbright", "0");
+               if (r_ambient.value != 0)
+                       Cvar_Set ("r_ambient", "0");
+       }
+
+       // bound viewsize
+       if (scr_viewsize.value < 30)
+               Cvar_Set ("viewsize","30");
+       if (scr_viewsize.value > 120)
+               Cvar_Set ("viewsize","120");
+
+       // bound field of view
+       if (scr_fov.value < 1)
+               Cvar_Set ("fov","1");
+       if (scr_fov.value > 170)
+               Cvar_Set ("fov","170");
+
+       // intermission is always full screen
+       if (cl.intermission)
+               sb_lines = 0;
+       else
+       {
+               if (scr_viewsize.value >= 120)
+                       sb_lines = 0;           // no status bar at all
+               else if (scr_viewsize.value >= 110)
+                       sb_lines = 24;          // no inventory
+               else
+                       sb_lines = 24+16+8;
+       }
+
+       r_refdef.colormask[0] = 1;
+       r_refdef.colormask[1] = 1;
+       r_refdef.colormask[2] = 1;
+
        SCR_CaptureVideo();
 
        if (cls.signon == SIGNONS)