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 cl_avidemo = {0, "cl_avidemo", "0"};
24 int jpeg_supported = false;
26 qboolean scr_initialized; // ready to draw
28 float scr_con_current;
29 float scr_conlines; // lines of console to display
34 qboolean scr_drawloading = false;
36 void DrawCrosshair(int num);
37 static void SCR_ScreenShot_f (void);
38 static void R_Envmap_f (void);
41 void R_ClearScreen(void);
44 ===============================================================================
48 ===============================================================================
51 char scr_centerstring[1024];
52 float scr_centertime_start; // for slow victory printing
53 float scr_centertime_off;
62 Called for important messages that should stay in the center of the screen
66 void SCR_CenterPrint (char *str)
68 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
69 scr_centertime_off = scr_centertime.value;
70 scr_centertime_start = cl.time;
72 // count the number of lines for centering
83 void SCR_DrawCenterString (void)
90 // the finale prints the characters one at a time
92 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
97 start = scr_centerstring;
99 if (scr_center_lines <= 4)
100 y = vid.conheight*0.35;
106 // scan the width of the line
107 for (l=0 ; l<40 ; l++)
108 if (start[l] == '\n' || !start[l])
110 x = (vid.conwidth - l*8)/2;
115 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
123 while (*start && *start != '\n')
128 start++; // skip the \n
132 void SCR_CheckDrawCenterString (void)
134 if (scr_center_lines > scr_erase_lines)
135 scr_erase_lines = scr_center_lines;
137 scr_centertime_off -= host_frametime;
139 // don't draw if this is a normal stats-screen intermission,
140 // only if it is not an intermission, or a finale intermission
141 if (cl.intermission == 1)
143 if (scr_centertime_off <= 0 && !cl.intermission)
145 if (key_dest != key_game)
148 SCR_DrawCenterString ();
156 void SCR_DrawTurtle (void)
160 if (cls.state != ca_connected)
163 if (!scr_showturtle.integer)
166 if (host_frametime < 0.1)
176 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
184 void SCR_DrawNet (void)
186 if (cls.state != ca_connected)
188 if (realtime - cl.last_received_message < 0.3)
190 if (cls.demoplayback)
193 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
201 void SCR_DrawPause (void)
205 if (cls.state != ca_connected)
208 if (!scr_showpause.integer) // turn off for screenshots
214 pic = Draw_CachePic ("gfx/pause.lmp");
215 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
225 void SCR_DrawLoading (void)
229 pic = Draw_CachePic ("gfx/loading.lmp");
230 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
235 //=============================================================================
240 SCR_SetUpToDrawConsole
243 void SCR_SetUpToDrawConsole (void)
247 if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
248 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
250 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
252 // decide on the height of the console
253 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
254 scr_conlines = vid.conheight; // full screen
255 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
256 scr_conlines = vid.conheight/2; // half screen
258 scr_conlines = 0; // none visible
260 if (scr_conspeed.value)
262 if (scr_conlines < scr_con_current)
264 scr_con_current -= scr_conspeed.value*host_realframetime;
265 if (scr_conlines > scr_con_current)
266 scr_con_current = scr_conlines;
269 else if (scr_conlines > scr_con_current)
271 scr_con_current += scr_conspeed.value*host_realframetime;
272 if (scr_conlines < scr_con_current)
273 scr_con_current = scr_conlines;
277 scr_con_current = scr_conlines;
285 void SCR_DrawConsole (void)
289 Con_DrawConsole (scr_con_current);
294 if (key_dest == key_game || key_dest == key_message)
295 Con_DrawNotify (); // only draw notify in game
301 SCR_BeginLoadingPlaque
305 void SCR_BeginLoadingPlaque (void)
310 S_StopAllSounds (true);
312 scr_drawloading = true;
314 scr_drawloading = true;
318 //=============================================================================
320 char r_speeds_string[1024];
321 int speedstringcount, r_timereport_active;
322 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
324 void R_TimeReport(char *desc)
330 if (!r_timereport_active)
333 r_timereport_temp = r_timereport_current;
334 r_timereport_current = Sys_DoubleTime();
335 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
337 sprintf(tempbuf, "%8i %s", t, desc);
338 length = strlen(tempbuf);
340 tempbuf[length++] = ' ';
342 if (speedstringcount + length > (vid.conwidth / 8))
344 strcat(r_speeds_string, "\n");
345 speedstringcount = 0;
347 // skip the space at the beginning if it's the first on the line
348 if (speedstringcount == 0)
350 strcat(r_speeds_string, tempbuf + 1);
351 speedstringcount = length - 1;
355 strcat(r_speeds_string, tempbuf);
356 speedstringcount += length;
360 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
361 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
362 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
363 void R_TimeReport_Start(void)
365 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
366 r_speeds_string[0] = 0;
367 if (r_timereport_active)
369 speedstringcount = 0;
370 sprintf(r_speeds_string,
371 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
372 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
373 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
374 "%6i modeltris%6i meshs%6i meshtris\n",
375 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
376 c_faces, c_nodes, c_leafs, c_light_polys,
377 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
378 c_alias_polys, c_meshs, c_meshelements / 3);
380 sprintf(r_speeds_string + strlen(r_speeds_string),
381 "realtime lighting:%4i lights%4i clears%4i scissored\n"
382 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
383 "precomputed: %6i shadowmeshes%6i shadowtris\n",
384 c_rt_lights, c_rt_clears, c_rt_scissored,
385 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
386 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
400 r_timereport_start = Sys_DoubleTime();
404 void R_TimeReport_End(void)
406 r_timereport_current = r_timereport_start;
407 R_TimeReport("total");
409 if (r_timereport_active)
413 for (i = 0;r_speeds_string[i];i++)
414 if (r_speeds_string[i] == '\n')
416 y = vid.conheight - sb_lines - lines * 8;
418 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
419 while (r_speeds_string[i])
422 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
425 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
426 if (r_speeds_string[i] == '\n')
440 void SCR_SizeUp_f (void)
442 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
453 void SCR_SizeDown_f (void)
455 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
458 void CL_Screen_Init(void)
460 Cvar_RegisterVariable (&scr_fov);
461 Cvar_RegisterVariable (&scr_viewsize);
462 Cvar_RegisterVariable (&scr_conspeed);
463 Cvar_RegisterVariable (&scr_conalpha);
464 Cvar_RegisterVariable (&scr_conbrightness);
465 Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
466 Cvar_RegisterVariable (&scr_showram);
467 Cvar_RegisterVariable (&scr_showturtle);
468 Cvar_RegisterVariable (&scr_showpause);
469 Cvar_RegisterVariable (&scr_centertime);
470 Cvar_RegisterVariable (&scr_printspeed);
471 Cvar_RegisterVariable (&vid_conwidth);
472 Cvar_RegisterVariable (&vid_conheight);
473 Cvar_RegisterVariable (&scr_screenshot_jpeg);
474 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
475 Cvar_RegisterVariable (&cl_avidemo);
477 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
478 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
479 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
480 Cmd_AddCommand ("envmap", R_Envmap_f);
482 // different default in GAME_FNIGGIUM
483 if (gamemode == GAME_FNIGGIUM)
484 Cvar_SetQuick(&scr_conforcewhiledisconnected, 0);
486 scr_initialized = true;
489 void DrawQ_Clear(void)
491 r_refdef.drawqueuesize = 0;
494 static int picelements[6] = {0, 1, 2, 0, 2, 3};
495 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
497 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);
500 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)
505 if (alpha < (1.0f / 255.0f))
508 len = strlen(string);
510 for (len = 0;len < maxlen && string[len];len++);
511 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
512 for (;len > 0 && string[len - 1] == ' ';len--);
515 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
517 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
518 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
520 red = bound(0, red, 1);
521 green = bound(0, green, 1);
522 blue = bound(0, blue, 1);
523 alpha = bound(0, alpha, 1);
524 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
526 dq->command = DRAWQUEUE_STRING;
528 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));
533 out = (char *)(dq + 1);
534 memcpy(out, string, len);
536 r_refdef.drawqueuesize += dq->size;
539 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
541 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);
544 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)
548 drawqueuemesh_t mesh;
549 memset(&mesh, 0, sizeof(mesh));
550 if (picname && picname[0])
552 pic = Draw_CachePic(picname);
556 height = pic->height;
557 mesh.texture = pic->tex;
559 mesh.num_triangles = 2;
560 mesh.num_vertices = 4;
561 mesh.data_element3i = picelements;
562 mesh.data_vertex3f = floats;
563 mesh.data_texcoord2f = floats + 12;
564 mesh.data_color4f = floats + 20;
565 memset(floats, 0, sizeof(floats));
566 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
567 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
568 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
569 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
570 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;
571 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;
572 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;
573 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;
574 DrawQ_Mesh (&mesh, flags);
577 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
584 size += sizeof(drawqueuemesh_t);
585 size += sizeof(int[3]) * mesh->num_triangles;
586 size += sizeof(float[3]) * mesh->num_vertices;
587 size += sizeof(float[2]) * mesh->num_vertices;
588 size += sizeof(float[4]) * mesh->num_vertices;
589 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
591 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
593 dq->command = DRAWQUEUE_MESH;
600 p = (void *)(dq + 1);
601 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
602 m->num_triangles = mesh->num_triangles;
603 m->num_vertices = mesh->num_vertices;
604 m->texture = mesh->texture;
605 m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));(qbyte *)p += m->num_triangles * sizeof(int[3]);
606 m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));(qbyte *)p += m->num_vertices * sizeof(float[3]);
607 m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));(qbyte *)p += m->num_vertices * sizeof(float[2]);
608 m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));(qbyte *)p += m->num_vertices * sizeof(float[4]);
609 r_refdef.drawqueuesize += dq->size;
612 void DrawQ_SetClipArea(float x, float y, float width, float height)
615 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
617 Con_DPrintf("DrawQueue full !\n");
620 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
621 dq->size = sizeof(*dq);
622 dq->command = DRAWQUEUE_SETCLIP;
630 r_refdef.drawqueuesize += dq->size;
633 void DrawQ_ResetClipArea(void)
636 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
638 Con_DPrintf("DrawQueue full !\n");
641 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
642 dq->size = sizeof(*dq);
643 dq->command = DRAWQUEUE_RESETCLIP;
651 r_refdef.drawqueuesize += dq->size;
659 void SCR_ScreenShot_f (void)
661 static int shotnumber = 0;
664 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
666 base = "screenshots/dp";
667 if (gamemode == GAME_FNIGGIUM)
668 base = "screenshots/fniggium";
670 // find a file name to save it to
671 for (;shotnumber < 1000000;shotnumber++)
672 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
674 if (shotnumber >= 1000000)
676 Con_Printf("SCR_ScreenShot_f: Couldn't create the image file\n");
681 sprintf(filename, "%s%06d.jpg", base, shotnumber);
683 sprintf(filename, "%s%06d.tga", base, shotnumber);
685 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
686 Con_Printf("Wrote %s\n", filename);
688 Con_Printf("unable to write %s\n", filename);
692 static int cl_avidemo_frame = 0;
694 void SCR_CaptureAVIDemo(void)
697 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
700 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
702 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
704 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
708 Cvar_SetValueQuick(&cl_avidemo, 0);
709 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
710 cl_avidemo_frame = 0;
718 Grab six views for environment mapping tests
730 {{ 0, 180, 0}, "bk"},
731 {{ 0, 270, 0}, "lf"},
732 {{-90, 90, 0}, "up"},
736 static void R_Envmap_f (void)
739 char filename[256], basename[256];
743 Con_Printf ("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");
747 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
748 size = atoi(Cmd_Argv(2));
749 if (size != 128 && size != 256 && size != 512 && size != 1024)
751 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
754 if (size > vid.realwidth || size > vid.realheight)
756 Con_Printf("envmap: your resolution is not big enough to render that size\n");
764 r_refdef.width = size;
765 r_refdef.height = size;
770 for (j = 0;j < 6;j++)
772 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
773 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);
776 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
782 //=============================================================================
784 // LordHavoc: SHOWLMP stuff
785 #define SHOWLMP_MAXLABELS 256
786 typedef struct showlmp_s
796 showlmp_t showlmp[SHOWLMP_MAXLABELS];
798 void SHOWLMP_decodehide(void)
802 lmplabel = MSG_ReadString();
803 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
804 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
806 showlmp[i].isactive = false;
811 void SHOWLMP_decodeshow(void)
814 qbyte lmplabel[256], picname[256];
816 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
817 strlcpy (picname, MSG_ReadString(), sizeof (picname));
818 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
829 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
830 if (showlmp[i].isactive)
832 if (strcmp(showlmp[i].label, lmplabel) == 0)
835 break; // drop out to replace it
838 else if (k < 0) // find first empty one to replace
841 return; // none found to replace
842 // change existing one
843 showlmp[k].isactive = true;
844 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
845 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
850 void SHOWLMP_drawall(void)
853 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
854 if (showlmp[i].isactive)
855 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
858 void SHOWLMP_clear(void)
861 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
862 showlmp[i].isactive = false;
865 void CL_SetupScreenSize(void)
867 float conwidth, conheight;
869 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
871 VID_UpdateGamma(false);
873 conwidth = bound(320, vid_conwidth.value, 2048);
874 conheight = bound(200, vid_conheight.value, 1536);
875 if (vid_conwidth.value != conwidth)
876 Cvar_SetValue("vid_conwidth", conwidth);
877 if (vid_conheight.value != conheight)
878 Cvar_SetValue("vid_conheight", conheight);
880 vid.conwidth = vid_conwidth.integer;
881 vid.conheight = vid_conheight.integer;
883 /* if (vid.realheight > 240)
885 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
886 vid.conheight = bound(240, vid.conheight, vid.realheight);
889 vid.conheight = 240;*/
891 SCR_SetUpToDrawConsole();
894 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
895 void CL_UpdateScreen(void)
897 if (!scr_initialized || !con_initialized || vid_hidden)
898 return; // not initialized yet
900 if (cl_avidemo.integer)
901 SCR_CaptureAVIDemo();
903 cl_avidemo_frame = 0;
905 if (cls.signon == SIGNONS)
906 R_TimeReport("other");
908 CL_SetupScreenSize();
912 if (cls.signon == SIGNONS)
913 R_TimeReport("setup");
915 //FIXME: force menu if nothing else to look at?
916 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
920 scr_drawloading = false;
925 if (cls.signon == SIGNONS)
932 SCR_CheckDrawCenterString();
938 if (cls.signon == SIGNONS)
942 R_TimeReport_Start();
944 R_Shadow_EditLights_DrawSelectedLightProperties();
951 void CL_Screen_NewMap(void)