5 #include "cl_collision.h"
7 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
8 cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 1 - 170
9 cvar_t scr_conspeed = {CVAR_SAVE, "scr_conspeed","900"}; // LordHavoc: quake used 300
10 cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"};
11 cvar_t scr_conbrightness = {CVAR_SAVE, "scr_conbrightness", "0.2"};
12 cvar_t scr_conforcewhiledisconnected = {CVAR_SAVE, "scr_conforcewhiledisconnected", "1"};
13 cvar_t scr_centertime = {0, "scr_centertime","2"};
14 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
15 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
16 cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
17 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
18 cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
19 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
20 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
21 cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
22 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
23 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
25 int jpeg_supported = false;
27 qboolean scr_initialized; // ready to draw
29 float scr_con_current;
30 float scr_conlines; // lines of console to display
35 qboolean scr_drawloading = false;
37 void DrawCrosshair(int num);
38 static void SCR_ScreenShot_f (void);
39 static void R_Envmap_f (void);
42 void R_ClearScreen(void);
45 ===============================================================================
49 ===============================================================================
52 char scr_centerstring[1024];
53 float scr_centertime_start; // for slow victory printing
54 float scr_centertime_off;
63 Called for important messages that should stay in the center of the screen
67 void SCR_CenterPrint(char *str)
69 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
70 scr_centertime_off = scr_centertime.value;
71 scr_centertime_start = cl.time;
73 // count the number of lines for centering
84 void SCR_DrawCenterString (void)
91 // the finale prints the characters one at a time
93 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
98 start = scr_centerstring;
100 if (scr_center_lines <= 4)
101 y = vid.conheight*0.35;
107 // scan the width of the line
108 for (l=0 ; l<40 ; l++)
109 if (start[l] == '\n' || !start[l])
111 x = (vid.conwidth - l*8)/2;
116 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
124 while (*start && *start != '\n')
129 start++; // skip the \n
133 void SCR_CheckDrawCenterString (void)
135 if (scr_center_lines > scr_erase_lines)
136 scr_erase_lines = scr_center_lines;
138 scr_centertime_off -= host_frametime;
140 // don't draw if this is a normal stats-screen intermission,
141 // only if it is not an intermission, or a finale intermission
142 if (cl.intermission == 1)
144 if (scr_centertime_off <= 0 && !cl.intermission)
146 if (key_dest != key_game)
149 SCR_DrawCenterString ();
157 void SCR_DrawTurtle (void)
161 if (cls.state != ca_connected)
164 if (!scr_showturtle.integer)
167 if (host_frametime < 0.1)
177 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
185 void SCR_DrawNet (void)
187 if (cls.state != ca_connected)
189 if (realtime - cl.last_received_message < 0.3)
191 if (cls.demoplayback)
194 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
202 void SCR_DrawPause (void)
206 if (cls.state != ca_connected)
209 if (!scr_showpause.integer) // turn off for screenshots
215 pic = Draw_CachePic ("gfx/pause.lmp");
216 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
226 void SCR_DrawLoading (void)
230 pic = Draw_CachePic ("gfx/loading.lmp");
231 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
236 //=============================================================================
241 SCR_SetUpToDrawConsole
244 void SCR_SetUpToDrawConsole (void)
248 if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
249 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
251 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
253 // decide on the height of the console
254 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
255 scr_conlines = vid.conheight; // full screen
256 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
257 scr_conlines = vid.conheight/2; // half screen
259 scr_conlines = 0; // none visible
261 if (scr_conspeed.value)
263 if (scr_conlines < scr_con_current)
265 scr_con_current -= scr_conspeed.value*host_realframetime;
266 if (scr_conlines > scr_con_current)
267 scr_con_current = scr_conlines;
270 else if (scr_conlines > scr_con_current)
272 scr_con_current += scr_conspeed.value*host_realframetime;
273 if (scr_conlines < scr_con_current)
274 scr_con_current = scr_conlines;
278 scr_con_current = scr_conlines;
286 void SCR_DrawConsole (void)
290 Con_DrawConsole (scr_con_current);
295 if (key_dest == key_game || key_dest == key_message)
296 Con_DrawNotify (); // only draw notify in game
302 SCR_BeginLoadingPlaque
306 void SCR_BeginLoadingPlaque (void)
311 S_StopAllSounds (true);
313 scr_drawloading = true;
315 scr_drawloading = true;
319 //=============================================================================
321 char r_speeds_string[1024];
322 int speedstringcount, r_timereport_active;
323 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
325 void R_TimeReport(char *desc)
331 if (!r_timereport_active)
334 r_timereport_temp = r_timereport_current;
335 r_timereport_current = Sys_DoubleTime();
336 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
338 sprintf(tempbuf, "%8i %s", t, desc);
339 length = strlen(tempbuf);
341 tempbuf[length++] = ' ';
343 if (speedstringcount + length > (vid.conwidth / 8))
345 strcat(r_speeds_string, "\n");
346 speedstringcount = 0;
348 // skip the space at the beginning if it's the first on the line
349 if (speedstringcount == 0)
351 strcat(r_speeds_string, tempbuf + 1);
352 speedstringcount = length - 1;
356 strcat(r_speeds_string, tempbuf);
357 speedstringcount += length;
361 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
362 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
363 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
364 void R_TimeReport_Start(void)
366 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
367 r_speeds_string[0] = 0;
368 if (r_timereport_active)
370 speedstringcount = 0;
371 sprintf(r_speeds_string,
372 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
373 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
374 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
375 "%6i modeltris%6i meshs%6i meshtris\n",
376 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
377 c_faces, c_nodes, c_leafs, c_light_polys,
378 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
379 c_alias_polys, c_meshs, c_meshelements / 3);
381 sprintf(r_speeds_string + strlen(r_speeds_string),
382 "realtime lighting:%4i lights%4i clears%4i scissored\n"
383 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
384 "precomputed: %6i shadowmeshes%6i shadowtris\n",
385 c_rt_lights, c_rt_clears, c_rt_scissored,
386 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
387 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
401 r_timereport_start = Sys_DoubleTime();
405 void R_TimeReport_End(void)
407 r_timereport_current = r_timereport_start;
408 R_TimeReport("total");
410 if (r_timereport_active)
414 for (i = 0;r_speeds_string[i];i++)
415 if (r_speeds_string[i] == '\n')
417 y = vid.conheight - sb_lines - lines * 8;
419 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
420 while (r_speeds_string[i])
423 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
426 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
427 if (r_speeds_string[i] == '\n')
441 void SCR_SizeUp_f (void)
443 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
454 void SCR_SizeDown_f (void)
456 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
459 void CL_Screen_Init(void)
461 Cvar_RegisterVariable (&scr_fov);
462 Cvar_RegisterVariable (&scr_viewsize);
463 Cvar_RegisterVariable (&scr_conspeed);
464 Cvar_RegisterVariable (&scr_conalpha);
465 Cvar_RegisterVariable (&scr_conbrightness);
466 Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
467 Cvar_RegisterVariable (&scr_showram);
468 Cvar_RegisterVariable (&scr_showturtle);
469 Cvar_RegisterVariable (&scr_showpause);
470 Cvar_RegisterVariable (&scr_centertime);
471 Cvar_RegisterVariable (&scr_printspeed);
472 Cvar_RegisterVariable (&vid_conwidth);
473 Cvar_RegisterVariable (&vid_conheight);
474 Cvar_RegisterVariable (&scr_screenshot_jpeg);
475 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
476 Cvar_RegisterVariable (&cl_avidemo);
478 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
479 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
480 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
481 Cmd_AddCommand ("envmap", R_Envmap_f);
483 scr_initialized = true;
486 void DrawQ_Clear(void)
488 r_refdef.drawqueuesize = 0;
491 static int picelements[6] = {0, 1, 2, 0, 2, 3};
492 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
494 DrawQ_SuperPic(x,y,picname,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
497 void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
502 if (alpha < (1.0f / 255.0f))
505 len = strlen(string);
507 for (len = 0;len < maxlen && string[len];len++);
508 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
509 for (;len > 0 && string[len - 1] == ' ';len--);
512 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
514 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
515 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
517 red = bound(0, red, 1);
518 green = bound(0, green, 1);
519 blue = bound(0, blue, 1);
520 alpha = bound(0, alpha, 1);
521 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
523 dq->command = DRAWQUEUE_STRING;
525 dq->color = ((unsigned int) (red * 255.0f) << 24) | ((unsigned int) (green * 255.0f) << 16) | ((unsigned int) (blue * 255.0f) << 8) | ((unsigned int) (alpha * 255.0f));
530 out = (char *)(dq + 1);
531 memcpy(out, string, len);
533 r_refdef.drawqueuesize += dq->size;
536 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
538 DrawQ_SuperPic(x,y,NULL,w,h,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
541 void DrawQ_SuperPic(float x, float y, char *picname, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags)
545 drawqueuemesh_t mesh;
546 memset(&mesh, 0, sizeof(mesh));
547 if (picname && picname[0])
549 pic = Draw_CachePic(picname);
553 height = pic->height;
554 mesh.texture = pic->tex;
556 mesh.num_triangles = 2;
557 mesh.num_vertices = 4;
558 mesh.data_element3i = picelements;
559 mesh.data_vertex3f = floats;
560 mesh.data_texcoord2f = floats + 12;
561 mesh.data_color4f = floats + 20;
562 memset(floats, 0, sizeof(floats));
563 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
564 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
565 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
566 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
567 mesh.data_texcoord2f[0] = s1;mesh.data_texcoord2f[1] = t1;mesh.data_color4f[ 0] = r1;mesh.data_color4f[ 1] = g1;mesh.data_color4f[ 2] = b1;mesh.data_color4f[ 3] = a1;
568 mesh.data_texcoord2f[2] = s2;mesh.data_texcoord2f[3] = t2;mesh.data_color4f[ 4] = r2;mesh.data_color4f[ 5] = g2;mesh.data_color4f[ 6] = b2;mesh.data_color4f[ 7] = a2;
569 mesh.data_texcoord2f[4] = s4;mesh.data_texcoord2f[5] = t4;mesh.data_color4f[ 8] = r4;mesh.data_color4f[ 9] = g4;mesh.data_color4f[10] = b4;mesh.data_color4f[11] = a4;
570 mesh.data_texcoord2f[6] = s3;mesh.data_texcoord2f[7] = t3;mesh.data_color4f[12] = r3;mesh.data_color4f[13] = g3;mesh.data_color4f[14] = b3;mesh.data_color4f[15] = a3;
571 DrawQ_Mesh (&mesh, flags);
574 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
581 size += sizeof(drawqueuemesh_t);
582 size += sizeof(int[3]) * mesh->num_triangles;
583 size += sizeof(float[3]) * mesh->num_vertices;
584 size += sizeof(float[2]) * mesh->num_vertices;
585 size += sizeof(float[4]) * mesh->num_vertices;
586 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
588 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
590 dq->command = DRAWQUEUE_MESH;
597 p = (void *)(dq + 1);
598 m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
599 m->num_triangles = mesh->num_triangles;
600 m->num_vertices = mesh->num_vertices;
601 m->texture = mesh->texture;
602 m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (qbyte*)p + m->num_triangles * sizeof(int[3]);
603 m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));p = (qbyte*)p + m->num_vertices * sizeof(float[3]);
604 m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));p = (qbyte*)p + m->num_vertices * sizeof(float[2]);
605 m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));p = (qbyte*)p + m->num_vertices * sizeof(float[4]);
606 r_refdef.drawqueuesize += dq->size;
609 void DrawQ_SetClipArea(float x, float y, float width, float height)
612 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
614 Con_DPrint("DrawQueue full !\n");
617 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
618 dq->size = sizeof(*dq);
619 dq->command = DRAWQUEUE_SETCLIP;
627 r_refdef.drawqueuesize += dq->size;
630 void DrawQ_ResetClipArea(void)
633 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
635 Con_DPrint("DrawQueue full !\n");
638 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
639 dq->size = sizeof(*dq);
640 dq->command = DRAWQUEUE_RESETCLIP;
648 r_refdef.drawqueuesize += dq->size;
656 void SCR_ScreenShot_f (void)
659 char base[MAX_QPATH];
660 char filename[MAX_QPATH];
661 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
663 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
665 // find a file name to save it to
666 for (shotnumber=0;shotnumber < 1000000;shotnumber++)
667 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
669 if (shotnumber >= 1000000)
671 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
676 sprintf(filename, "%s%06d.jpg", base, shotnumber);
678 sprintf(filename, "%s%06d.tga", base, shotnumber);
680 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
681 Con_Printf("Wrote %s\n", filename);
683 Con_Printf("unable to write %s\n", filename);
687 static int cl_avidemo_frame = 0;
689 void SCR_CaptureAVIDemo(void)
692 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
695 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
697 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
699 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
703 Cvar_SetValueQuick(&cl_avidemo, 0);
704 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
705 cl_avidemo_frame = 0;
713 Grab six views for environment mapping tests
720 qboolean flipx, flipy;
724 {{ 0, 0, 0}, "rt", true, false},
725 {{ 0, 90, 0}, "ft", true, false},
726 {{ 0, 180, 0}, "lf", true, false},
727 {{ 0, 270, 0}, "bk", true, false},
728 {{-90, 180, 0}, "up", false, true},
729 {{ 90, 180, 0}, "dn", false, true}
732 static void R_Envmap_f (void)
735 char filename[256], basename[256];
739 Con_Print("envmap <basename> <size>: save out 6 cubic environment map images, usable with loadsky, note that size must one of 128, 256, 512, or 1024 and can't be bigger than your current resolution\n");
743 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
744 size = atoi(Cmd_Argv(2));
745 if (size != 128 && size != 256 && size != 512 && size != 1024)
747 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
750 if (size > vid.realwidth || size > vid.realheight)
752 Con_Print("envmap: your resolution is not big enough to render that size\n");
760 r_refdef.width = size;
761 r_refdef.height = size;
766 for (j = 0;j < 6;j++)
768 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
769 Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], envmapinfo[j].angles[0], envmapinfo[j].angles[1], envmapinfo[j].angles[2], 1);
774 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, false, false);
780 //=============================================================================
782 // LordHavoc: SHOWLMP stuff
783 #define SHOWLMP_MAXLABELS 256
784 typedef struct showlmp_s
794 showlmp_t showlmp[SHOWLMP_MAXLABELS];
796 void SHOWLMP_decodehide(void)
800 lmplabel = MSG_ReadString();
801 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
802 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
804 showlmp[i].isactive = false;
809 void SHOWLMP_decodeshow(void)
812 qbyte lmplabel[256], picname[256];
814 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
815 strlcpy (picname, MSG_ReadString(), sizeof (picname));
816 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
827 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
828 if (showlmp[i].isactive)
830 if (strcmp(showlmp[i].label, lmplabel) == 0)
833 break; // drop out to replace it
836 else if (k < 0) // find first empty one to replace
839 return; // none found to replace
840 // change existing one
841 showlmp[k].isactive = true;
842 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
843 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
848 void SHOWLMP_drawall(void)
851 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
852 if (showlmp[i].isactive)
853 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
856 void SHOWLMP_clear(void)
859 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
860 showlmp[i].isactive = false;
863 void CL_SetupScreenSize(void)
865 float conwidth, conheight;
867 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
869 VID_UpdateGamma(false);
871 conwidth = bound(320, vid_conwidth.value, 2048);
872 conheight = bound(200, vid_conheight.value, 1536);
873 if (vid_conwidth.value != conwidth)
874 Cvar_SetValue("vid_conwidth", conwidth);
875 if (vid_conheight.value != conheight)
876 Cvar_SetValue("vid_conheight", conheight);
878 vid.conwidth = vid_conwidth.integer;
879 vid.conheight = vid_conheight.integer;
881 /* if (vid.realheight > 240)
883 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
884 vid.conheight = bound(240, vid.conheight, vid.realheight);
887 vid.conheight = 240;*/
889 SCR_SetUpToDrawConsole();
892 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
893 void CL_UpdateScreen(void)
895 if (!scr_initialized || !con_initialized || vid_hidden)
896 return; // not initialized yet
898 if (cl_avidemo.integer)
899 SCR_CaptureAVIDemo();
901 cl_avidemo_frame = 0;
903 if (cls.signon == SIGNONS)
904 R_TimeReport("other");
906 CL_SetupScreenSize();
910 if (cls.signon == SIGNONS)
911 R_TimeReport("setup");
913 //FIXME: force menu if nothing else to look at?
914 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
918 scr_drawloading = false;
923 if (cls.signon == SIGNONS)
930 SCR_CheckDrawCenterString();
936 if (cls.signon == SIGNONS)
940 R_TimeReport_Start();
942 R_Shadow_EditLights_DrawSelectedLightProperties();
949 void CL_Screen_NewMap(void)