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_centertime = {0, "scr_centertime","2"};
13 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
14 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
15 cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
16 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
17 cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
18 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
19 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
20 cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
21 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
23 int jpeg_supported = false;
25 qboolean scr_initialized; // ready to draw
27 float scr_con_current;
28 float scr_conlines; // lines of console to display
33 qboolean scr_drawloading = false;
35 void DrawCrosshair(int num);
36 static void SCR_ScreenShot_f (void);
37 static void R_Envmap_f (void);
40 void R_ClearScreen(void);
43 ===============================================================================
47 ===============================================================================
50 char scr_centerstring[1024];
51 float scr_centertime_start; // for slow victory printing
52 float scr_centertime_off;
61 Called for important messages that should stay in the center of the screen
65 void SCR_CenterPrint (char *str)
67 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
68 scr_centertime_off = scr_centertime.value;
69 scr_centertime_start = cl.time;
71 // count the number of lines for centering
82 void SCR_DrawCenterString (void)
89 // the finale prints the characters one at a time
91 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
96 start = scr_centerstring;
98 if (scr_center_lines <= 4)
99 y = vid.conheight*0.35;
105 // scan the width of the line
106 for (l=0 ; l<40 ; l++)
107 if (start[l] == '\n' || !start[l])
109 x = (vid.conwidth - l*8)/2;
114 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
122 while (*start && *start != '\n')
127 start++; // skip the \n
131 void SCR_CheckDrawCenterString (void)
133 if (scr_center_lines > scr_erase_lines)
134 scr_erase_lines = scr_center_lines;
136 scr_centertime_off -= host_frametime;
138 // don't draw if this is a normal stats-screen intermission,
139 // only if it is not an intermission, or a finale intermission
140 if (cl.intermission == 1)
142 if (scr_centertime_off <= 0 && !cl.intermission)
144 if (key_dest != key_game)
147 SCR_DrawCenterString ();
155 void SCR_DrawTurtle (void)
159 if (cls.state != ca_connected)
162 if (!scr_showturtle.integer)
165 if (host_frametime < 0.1)
175 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
183 void SCR_DrawNet (void)
185 if (cls.state != ca_connected)
187 if (realtime - cl.last_received_message < 0.3)
189 if (cls.demoplayback)
192 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
200 void SCR_DrawPause (void)
204 if (cls.state != ca_connected)
207 if (!scr_showpause.integer) // turn off for screenshots
213 pic = Draw_CachePic ("gfx/pause.lmp");
214 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
224 void SCR_DrawLoading (void)
228 pic = Draw_CachePic ("gfx/loading.lmp");
229 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
234 //=============================================================================
239 SCR_SetUpToDrawConsole
242 void SCR_SetUpToDrawConsole (void)
246 if (key_dest == key_game && cls.signon != SIGNONS)
247 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
249 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
251 // decide on the height of the console
252 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
253 scr_conlines = vid.conheight; // full screen
254 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
255 scr_conlines = vid.conheight/2; // half screen
257 scr_conlines = 0; // none visible
259 if (scr_conspeed.value)
261 if (scr_conlines < scr_con_current)
263 scr_con_current -= scr_conspeed.value*host_realframetime;
264 if (scr_conlines > scr_con_current)
265 scr_con_current = scr_conlines;
268 else if (scr_conlines > scr_con_current)
270 scr_con_current += scr_conspeed.value*host_realframetime;
271 if (scr_conlines < scr_con_current)
272 scr_con_current = scr_conlines;
276 scr_con_current = scr_conlines;
284 void SCR_DrawConsole (void)
288 Con_DrawConsole (scr_con_current);
293 if (key_dest == key_game || key_dest == key_message)
294 Con_DrawNotify (); // only draw notify in game
300 SCR_BeginLoadingPlaque
304 void SCR_BeginLoadingPlaque (void)
309 S_StopAllSounds (true);
311 scr_drawloading = true;
313 scr_drawloading = true;
317 //=============================================================================
319 char r_speeds_string[1024];
320 int speedstringcount, r_timereport_active;
321 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
323 void R_TimeReport(char *desc)
329 if (!r_timereport_active)
332 r_timereport_temp = r_timereport_current;
333 r_timereport_current = Sys_DoubleTime();
334 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
336 sprintf(tempbuf, "%8i %s", t, desc);
337 length = strlen(tempbuf);
339 tempbuf[length++] = ' ';
341 if (speedstringcount + length > (vid.conwidth / 8))
343 strcat(r_speeds_string, "\n");
344 speedstringcount = 0;
346 // skip the space at the beginning if it's the first on the line
347 if (speedstringcount == 0)
349 strcat(r_speeds_string, tempbuf + 1);
350 speedstringcount = length - 1;
354 strcat(r_speeds_string, tempbuf);
355 speedstringcount += length;
359 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
360 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
361 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
362 void R_TimeReport_Start(void)
364 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
365 r_speeds_string[0] = 0;
366 if (r_timereport_active)
368 speedstringcount = 0;
369 sprintf(r_speeds_string,
370 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
371 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
372 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
373 "%6i modeltris%6i meshs%6i meshtris\n",
374 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
375 c_faces, c_nodes, c_leafs, c_light_polys,
376 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
377 c_alias_polys, c_meshs, c_meshelements / 3);
379 sprintf(r_speeds_string + strlen(r_speeds_string),
380 "realtime lighting:%4i lights%4i clears%4i scissored\n"
381 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
382 "precomputed: %6i shadowmeshes%6i shadowtris\n",
383 c_rt_lights, c_rt_clears, c_rt_scissored,
384 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
385 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
399 r_timereport_start = Sys_DoubleTime();
403 void R_TimeReport_End(void)
405 r_timereport_current = r_timereport_start;
406 R_TimeReport("total");
408 if (r_timereport_active)
412 for (i = 0;r_speeds_string[i];i++)
413 if (r_speeds_string[i] == '\n')
415 y = vid.conheight - sb_lines - lines * 8;
417 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
418 while (r_speeds_string[i])
421 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
424 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
425 if (r_speeds_string[i] == '\n')
439 void SCR_SizeUp_f (void)
441 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
452 void SCR_SizeDown_f (void)
454 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
457 void CL_Screen_Init(void)
459 Cvar_RegisterVariable (&scr_fov);
460 Cvar_RegisterVariable (&scr_viewsize);
461 Cvar_RegisterVariable (&scr_conspeed);
462 Cvar_RegisterVariable (&scr_conalpha);
463 Cvar_RegisterVariable (&scr_conbrightness);
464 Cvar_RegisterVariable (&scr_showram);
465 Cvar_RegisterVariable (&scr_showturtle);
466 Cvar_RegisterVariable (&scr_showpause);
467 Cvar_RegisterVariable (&scr_centertime);
468 Cvar_RegisterVariable (&scr_printspeed);
469 Cvar_RegisterVariable (&vid_conwidth);
470 Cvar_RegisterVariable (&vid_conheight);
471 Cvar_RegisterVariable (&scr_screenshot_jpeg);
472 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
473 Cvar_RegisterVariable (&cl_avidemo);
475 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
476 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
477 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
478 Cmd_AddCommand ("envmap", R_Envmap_f);
480 scr_initialized = true;
483 void DrawQ_Clear(void)
485 r_refdef.drawqueuesize = 0;
488 static int picelements[6] = {0, 1, 2, 0, 2, 3};
489 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
491 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);
494 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)
499 if (alpha < (1.0f / 255.0f))
502 len = strlen(string);
504 for (len = 0;len < maxlen && string[len];len++);
505 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
506 for (;len > 0 && string[len - 1] == ' ';len--);
509 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
511 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
512 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
514 red = bound(0, red, 1);
515 green = bound(0, green, 1);
516 blue = bound(0, blue, 1);
517 alpha = bound(0, alpha, 1);
518 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
520 dq->command = DRAWQUEUE_STRING;
522 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));
527 out = (char *)(dq + 1);
528 memcpy(out, string, len);
530 r_refdef.drawqueuesize += dq->size;
533 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
535 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);
538 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)
542 drawqueuemesh_t mesh;
543 memset(&mesh, 0, sizeof(mesh));
544 if (picname && picname[0])
546 pic = Draw_CachePic(picname);
550 height = pic->height;
551 mesh.texture = pic->tex;
553 mesh.num_triangles = 2;
554 mesh.num_vertices = 4;
555 mesh.data_element3i = picelements;
556 mesh.data_vertex3f = floats;
557 mesh.data_texcoord2f = floats + 12;
558 mesh.data_color4f = floats + 20;
559 memset(floats, 0, sizeof(floats));
560 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
561 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
562 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
563 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
564 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;
565 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;
566 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;
567 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;
568 DrawQ_Mesh (&mesh, flags);
571 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
578 size += sizeof(drawqueuemesh_t);
579 size += sizeof(int[3]) * mesh->num_triangles;
580 size += sizeof(float[3]) * mesh->num_vertices;
581 size += sizeof(float[2]) * mesh->num_vertices;
582 size += sizeof(float[4]) * mesh->num_vertices;
583 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
585 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
587 dq->command = DRAWQUEUE_MESH;
594 p = (void *)(dq + 1);
595 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
596 m->num_triangles = mesh->num_triangles;
597 m->num_vertices = mesh->num_vertices;
598 m->texture = mesh->texture;
599 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]);
600 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]);
601 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]);
602 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]);
603 r_refdef.drawqueuesize += dq->size;
606 void DrawQ_SetClipArea(float x, float y, float width, float height)
609 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
611 Con_DPrintf("DrawQueue full !\n");
614 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
615 dq->size = sizeof(*dq);
616 dq->command = DRAWQUEUE_SETCLIP;
624 r_refdef.drawqueuesize += dq->size;
627 void DrawQ_ResetClipArea(void)
630 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
632 Con_DPrintf("DrawQueue full !\n");
635 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
636 dq->size = sizeof(*dq);
637 dq->command = DRAWQUEUE_RESETCLIP;
645 r_refdef.drawqueuesize += dq->size;
653 void SCR_ScreenShot_f (void)
655 static int shotnumber = 0;
658 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
660 base = "screenshots/dp";
661 if (gamemode == GAME_FNIGGIUM)
662 base = "screenshots/fniggium";
664 // find a file name to save it to
665 for (;shotnumber < 1000000;shotnumber++)
666 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
668 if (shotnumber >= 1000000)
670 Con_Printf("SCR_ScreenShot_f: Couldn't create the image file\n");
675 sprintf(filename, "%s%06d.jpg", base, shotnumber);
677 sprintf(filename, "%s%06d.tga", base, shotnumber);
679 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
680 Con_Printf("Wrote %s\n", filename);
682 Con_Printf("unable to write %s\n", filename);
686 static int cl_avidemo_frame = 0;
688 void SCR_CaptureAVIDemo(void)
691 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
694 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
696 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
698 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
702 Cvar_SetValueQuick(&cl_avidemo, 0);
703 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
704 cl_avidemo_frame = 0;
712 Grab six views for environment mapping tests
724 {{ 0, 180, 0}, "bk"},
725 {{ 0, 270, 0}, "lf"},
726 {{-90, 90, 0}, "up"},
730 static void R_Envmap_f (void)
733 char filename[256], basename[256];
737 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");
741 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
742 size = atoi(Cmd_Argv(2));
743 if (size != 128 && size != 256 && size != 512 && size != 1024)
745 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
748 if (size > vid.realwidth || size > vid.realheight)
750 Con_Printf("envmap: your resolution is not big enough to render that size\n");
758 r_refdef.width = size;
759 r_refdef.height = size;
764 for (j = 0;j < 6;j++)
766 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
767 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);
770 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
776 //=============================================================================
778 // LordHavoc: SHOWLMP stuff
779 #define SHOWLMP_MAXLABELS 256
780 typedef struct showlmp_s
790 showlmp_t showlmp[SHOWLMP_MAXLABELS];
792 void SHOWLMP_decodehide(void)
796 lmplabel = MSG_ReadString();
797 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
798 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
800 showlmp[i].isactive = false;
805 void SHOWLMP_decodeshow(void)
808 qbyte lmplabel[256], picname[256];
810 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
811 strlcpy (picname, MSG_ReadString(), sizeof (picname));
812 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
823 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
824 if (showlmp[i].isactive)
826 if (strcmp(showlmp[i].label, lmplabel) == 0)
829 break; // drop out to replace it
832 else if (k < 0) // find first empty one to replace
835 return; // none found to replace
836 // change existing one
837 showlmp[k].isactive = true;
838 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
839 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
844 void SHOWLMP_drawall(void)
847 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
848 if (showlmp[i].isactive)
849 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
852 void SHOWLMP_clear(void)
855 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
856 showlmp[i].isactive = false;
859 void CL_SetupScreenSize(void)
861 float conwidth, conheight;
863 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
865 VID_UpdateGamma(false);
867 conwidth = bound(320, vid_conwidth.value, 2048);
868 conheight = bound(200, vid_conheight.value, 1536);
869 if (vid_conwidth.value != conwidth)
870 Cvar_SetValue("vid_conwidth", conwidth);
871 if (vid_conheight.value != conheight)
872 Cvar_SetValue("vid_conheight", conheight);
874 vid.conwidth = vid_conwidth.integer;
875 vid.conheight = vid_conheight.integer;
877 /* if (vid.realheight > 240)
879 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
880 vid.conheight = bound(240, vid.conheight, vid.realheight);
883 vid.conheight = 240;*/
885 SCR_SetUpToDrawConsole();
888 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
889 void CL_UpdateScreen(void)
891 if (!scr_initialized || !con_initialized || vid_hidden)
892 return; // not initialized yet
894 if (cl_avidemo.integer)
895 SCR_CaptureAVIDemo();
897 cl_avidemo_frame = 0;
899 if (cls.signon == SIGNONS)
900 R_TimeReport("other");
902 CL_SetupScreenSize();
906 if (cls.signon == SIGNONS)
907 R_TimeReport("setup");
909 //FIXME: force menu if nothing else to look at?
910 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
914 scr_drawloading = false;
919 if (cls.signon == SIGNONS)
926 SCR_CheckDrawCenterString();
932 if (cls.signon == SIGNONS)
936 R_TimeReport_Start();
938 R_Shadow_EditLights_DrawSelectedLightProperties();
945 void CL_Screen_NewMap(void)