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, 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, 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
725 {{ 0, 180, 0}, "bk"},
726 {{ 0, 270, 0}, "lf"},
727 {{-90, 90, 0}, "up"},
731 static void R_Envmap_f (void)
734 char filename[256], basename[256];
738 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");
742 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
743 size = atoi(Cmd_Argv(2));
744 if (size != 128 && size != 256 && size != 512 && size != 1024)
746 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
749 if (size > vid.realwidth || size > vid.realheight)
751 Con_Print("envmap: your resolution is not big enough to render that size\n");
759 r_refdef.width = size;
760 r_refdef.height = size;
765 for (j = 0;j < 6;j++)
767 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
768 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);
771 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
777 //=============================================================================
779 // LordHavoc: SHOWLMP stuff
780 #define SHOWLMP_MAXLABELS 256
781 typedef struct showlmp_s
791 showlmp_t showlmp[SHOWLMP_MAXLABELS];
793 void SHOWLMP_decodehide(void)
797 lmplabel = MSG_ReadString();
798 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
799 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
801 showlmp[i].isactive = false;
806 void SHOWLMP_decodeshow(void)
809 qbyte lmplabel[256], picname[256];
811 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
812 strlcpy (picname, MSG_ReadString(), sizeof (picname));
813 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
824 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
825 if (showlmp[i].isactive)
827 if (strcmp(showlmp[i].label, lmplabel) == 0)
830 break; // drop out to replace it
833 else if (k < 0) // find first empty one to replace
836 return; // none found to replace
837 // change existing one
838 showlmp[k].isactive = true;
839 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
840 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
845 void SHOWLMP_drawall(void)
848 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
849 if (showlmp[i].isactive)
850 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
853 void SHOWLMP_clear(void)
856 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
857 showlmp[i].isactive = false;
860 void CL_SetupScreenSize(void)
862 float conwidth, conheight;
864 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
866 VID_UpdateGamma(false);
868 conwidth = bound(320, vid_conwidth.value, 2048);
869 conheight = bound(200, vid_conheight.value, 1536);
870 if (vid_conwidth.value != conwidth)
871 Cvar_SetValue("vid_conwidth", conwidth);
872 if (vid_conheight.value != conheight)
873 Cvar_SetValue("vid_conheight", conheight);
875 vid.conwidth = vid_conwidth.integer;
876 vid.conheight = vid_conheight.integer;
878 /* if (vid.realheight > 240)
880 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
881 vid.conheight = bound(240, vid.conheight, vid.realheight);
884 vid.conheight = 240;*/
886 SCR_SetUpToDrawConsole();
889 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
890 void CL_UpdateScreen(void)
892 if (!scr_initialized || !con_initialized || vid_hidden)
893 return; // not initialized yet
895 if (cl_avidemo.integer)
896 SCR_CaptureAVIDemo();
898 cl_avidemo_frame = 0;
900 if (cls.signon == SIGNONS)
901 R_TimeReport("other");
903 CL_SetupScreenSize();
907 if (cls.signon == SIGNONS)
908 R_TimeReport("setup");
910 //FIXME: force menu if nothing else to look at?
911 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
915 scr_drawloading = false;
920 if (cls.signon == SIGNONS)
927 SCR_CheckDrawCenterString();
933 if (cls.signon == SIGNONS)
937 R_TimeReport_Start();
939 R_Shadow_EditLights_DrawSelectedLightProperties();
946 void CL_Screen_NewMap(void)