6 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
7 cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 10 - 170
8 cvar_t scr_conspeed = {CVAR_SAVE, "scr_conspeed","900"}; // LordHavoc: quake used 300
9 cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"};
10 cvar_t scr_conbrightness = {CVAR_SAVE, "scr_conbrightness", "0.2"};
11 cvar_t scr_centertime = {0, "scr_centertime","2"};
12 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
13 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
14 cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
15 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
16 cvar_t scr_2dresolution = {CVAR_SAVE, "scr_2dresolution", "1"};
17 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
18 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
20 qboolean scr_initialized; // ready to draw
22 float scr_con_current;
23 float scr_conlines; // lines of console to display
28 qboolean scr_drawloading = false;
30 static qbyte menuplyr_pixels[4096];
32 void DrawCrosshair(int num);
33 void V_CalcRefdef (void);
34 static void SCR_ScreenShot_f (void);
35 static void R_Envmap_f (void);
38 void R_ClearScreen(void);
41 ===============================================================================
45 ===============================================================================
48 char scr_centerstring[1024];
49 float scr_centertime_start; // for slow victory printing
50 float scr_centertime_off;
59 Called for important messages that should stay in the center of the screen
63 void SCR_CenterPrint (char *str)
65 strncpy (scr_centerstring, str, sizeof(scr_centerstring)-1);
66 scr_centertime_off = scr_centertime.value;
67 scr_centertime_start = cl.time;
69 // count the number of lines for centering
80 void SCR_DrawCenterString (void)
87 // the finale prints the characters one at a time
89 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
94 start = scr_centerstring;
96 if (scr_center_lines <= 4)
97 y = vid.conheight*0.35;
103 // scan the width of the line
104 for (l=0 ; l<40 ; l++)
105 if (start[l] == '\n' || !start[l])
107 x = (vid.conwidth - l*8)/2;
112 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
120 while (*start && *start != '\n')
125 start++; // skip the \n
129 void SCR_CheckDrawCenterString (void)
131 if (scr_center_lines > scr_erase_lines)
132 scr_erase_lines = scr_center_lines;
134 scr_centertime_off -= host_frametime;
136 // don't draw if this is a normal stats-screen intermission,
137 // only if it is not an intermission, or a finale intermission
138 if (cl.intermission == 1)
140 if (scr_centertime_off <= 0 && !cl.intermission)
142 if (key_dest != key_game)
145 SCR_DrawCenterString ();
153 void SCR_DrawTurtle (void)
157 if (cls.state != ca_connected)
160 if (!scr_showturtle.integer)
163 if (host_frametime < 0.1)
173 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
181 void SCR_DrawNet (void)
183 if (cls.state != ca_connected)
185 if (realtime - cl.last_received_message < 0.3)
187 if (cls.demoplayback)
190 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
198 void SCR_DrawPause (void)
202 if (cls.state != ca_connected)
205 if (!scr_showpause.integer) // turn off for screenshots
211 pic = Draw_CachePic ("gfx/pause.lmp");
212 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
222 void SCR_DrawLoading (void)
226 pic = Draw_CachePic ("gfx/loading.lmp");
227 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
232 //=============================================================================
237 SCR_SetUpToDrawConsole
240 void SCR_SetUpToDrawConsole (void)
244 if (key_dest == key_game && cls.signon != SIGNONS)
245 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
247 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
249 // decide on the height of the console
250 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
251 scr_conlines = vid.conheight; // full screen
252 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
253 scr_conlines = vid.conheight/2; // half screen
255 scr_conlines = 0; // none visible
257 if (scr_conspeed.value)
259 if (scr_conlines < scr_con_current)
261 scr_con_current -= scr_conspeed.value*host_realframetime;
262 if (scr_conlines > scr_con_current)
263 scr_con_current = scr_conlines;
266 else if (scr_conlines > scr_con_current)
268 scr_con_current += scr_conspeed.value*host_realframetime;
269 if (scr_conlines < scr_con_current)
270 scr_con_current = scr_conlines;
274 scr_con_current = scr_conlines;
282 void SCR_DrawConsole (void)
286 Con_DrawConsole (scr_con_current);
291 if (key_dest == key_game || key_dest == key_message)
292 Con_DrawNotify (); // only draw notify in game
298 SCR_BeginLoadingPlaque
302 void SCR_BeginLoadingPlaque (void)
307 S_StopAllSounds (true);
309 scr_drawloading = true;
311 scr_drawloading = true;
315 //=============================================================================
317 char r_speeds_string[1024];
318 int speedstringcount, r_timereport_active;
319 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
321 void R_TimeReport(char *desc)
327 if (!r_timereport_active)
330 r_timereport_temp = r_timereport_current;
331 r_timereport_current = Sys_DoubleTime();
332 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
334 sprintf(tempbuf, "%8i %s", t, desc);
335 length = strlen(tempbuf);
337 tempbuf[length++] = ' ';
339 if (speedstringcount + length > (vid.conwidth / 8))
341 strcat(r_speeds_string, "\n");
342 speedstringcount = 0;
344 // skip the space at the beginning if it's the first on the line
345 if (speedstringcount == 0)
347 strcat(r_speeds_string, tempbuf + 1);
348 speedstringcount = length - 1;
352 strcat(r_speeds_string, tempbuf);
353 speedstringcount += length;
357 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
358 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
359 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
360 void R_TimeReport_Start(void)
362 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
363 r_speeds_string[0] = 0;
364 if (r_timereport_active)
366 speedstringcount = 0;
367 AngleVectors (r_refdef.viewangles, vpn, NULL, NULL);
368 sprintf(r_speeds_string,
369 "org:'%+8.2f %+8.2f %+8.2f' ang:'%+4.0f %+4.0f %+4.0f' dir:'%+2.3f %+2.3f %+2.3f'\n"
370 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
371 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
372 "%6i modeltris%6i meshs%6i meshtris\n",
373 r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[0], r_refdef.viewangles[1], r_refdef.viewangles[2], vpn[0], vpn[1], vpn[2],
374 c_faces, c_nodes, c_leafs, c_light_polys,
375 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
376 c_alias_polys, c_meshs, c_meshelements / 3);
378 sprintf(r_speeds_string + strlen(r_speeds_string),
379 "realtime lighting:%4i lights%4i clears%4i scissored\n"
380 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
381 "precomputed: %6i shadowmeshes%6i shadowtris\n",
382 c_rt_lights, c_rt_clears, c_rt_scissored,
383 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
384 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
398 r_timereport_start = Sys_DoubleTime();
402 void R_TimeReport_End(void)
404 r_timereport_current = r_timereport_start;
405 R_TimeReport("total");
407 if (r_timereport_active)
411 for (i = 0;r_speeds_string[i];i++)
412 if (r_speeds_string[i] == '\n')
414 y = vid.conheight - sb_lines - lines * 8;
416 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
417 while (r_speeds_string[i])
420 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
423 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
424 if (r_speeds_string[i] == '\n')
438 void SCR_SizeUp_f (void)
440 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
451 void SCR_SizeDown_f (void)
453 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
456 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_showram);
466 Cvar_RegisterVariable (&scr_showturtle);
467 Cvar_RegisterVariable (&scr_showpause);
468 Cvar_RegisterVariable (&scr_centertime);
469 Cvar_RegisterVariable (&scr_printspeed);
470 Cvar_RegisterVariable (&scr_2dresolution);
471 Cvar_RegisterVariable (&scr_screenshot_jpeg);
472 Cvar_RegisterVariable (&cl_avidemo);
474 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
475 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
476 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
477 Cmd_AddCommand ("envmap", R_Envmap_f);
479 scr_initialized = true;
482 // load the image data for the player image in the config menu
483 dat = (qpic_t *)FS_LoadFile ("gfx/menuplyr.lmp", false);
485 Sys_Error("unable to load gfx/menuplyr.lmp");
488 if (dat->width*dat->height <= 4096)
489 memcpy (menuplyr_pixels, dat->data, dat->width * dat->height);
491 Con_Printf("gfx/menuplyr.lmp larger than 4k buffer");
495 void DrawQ_Clear(void)
497 r_refdef.drawqueuesize = 0;
500 static int picelements[6] = {0, 1, 2, 0, 2, 3};
501 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
503 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);
506 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)
511 if (alpha < (1.0f / 255.0f))
514 len = strlen(string);
516 for (len = 0;len < maxlen && string[len];len++);
517 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
518 for (;len > 0 && string[len - 1] == ' ';len--);
521 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
523 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
524 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
526 red = bound(0, red, 1);
527 green = bound(0, green, 1);
528 blue = bound(0, blue, 1);
529 alpha = bound(0, alpha, 1);
530 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
532 dq->command = DRAWQUEUE_STRING;
534 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));
539 out = (char *)(dq + 1);
540 memcpy(out, string, len);
542 r_refdef.drawqueuesize += dq->size;
545 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
547 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);
550 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)
554 drawqueuemesh_t mesh;
555 memset(&mesh, 0, sizeof(mesh));
556 if (picname && picname[0])
558 pic = Draw_CachePic(picname);
562 height = pic->height;
563 mesh.texture = pic->tex;
565 mesh.numtriangles = 2;
566 mesh.numvertices = 4;
567 mesh.element3i = picelements;
568 mesh.vertex3f = floats;
569 mesh.texcoord2f = floats + 12;
570 mesh.color4f = floats + 20;
571 memset(floats, 0, sizeof(floats));
572 mesh.vertex3f[0] = mesh.vertex3f[9] = x;
573 mesh.vertex3f[1] = mesh.vertex3f[4] = y;
574 mesh.vertex3f[3] = mesh.vertex3f[6] = x + width;
575 mesh.vertex3f[7] = mesh.vertex3f[10] = y + height;
576 mesh.texcoord2f[0] = s1;mesh.texcoord2f[1] = t1;mesh.color4f[ 0] = r1;mesh.color4f[ 1] = g1;mesh.color4f[ 2] = b1;mesh.color4f[ 3] = a1;
577 mesh.texcoord2f[2] = s2;mesh.texcoord2f[3] = t2;mesh.color4f[ 4] = r2;mesh.color4f[ 5] = g2;mesh.color4f[ 6] = b2;mesh.color4f[ 7] = a2;
578 mesh.texcoord2f[4] = s4;mesh.texcoord2f[5] = t4;mesh.color4f[ 8] = r4;mesh.color4f[ 9] = g4;mesh.color4f[10] = b4;mesh.color4f[11] = a4;
579 mesh.texcoord2f[6] = s3;mesh.texcoord2f[7] = t3;mesh.color4f[12] = r3;mesh.color4f[13] = g3;mesh.color4f[14] = b3;mesh.color4f[15] = a3;
580 DrawQ_Mesh (&mesh, flags);
583 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
590 size += sizeof(drawqueuemesh_t);
591 size += sizeof(int[3]) * mesh->numtriangles;
592 size += sizeof(float[3]) * mesh->numvertices;
593 size += sizeof(float[2]) * mesh->numvertices;
594 size += sizeof(float[4]) * mesh->numvertices;
595 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
597 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
599 dq->command = DRAWQUEUE_MESH;
606 p = (void *)(dq + 1);
607 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
608 m->numtriangles = mesh->numtriangles;
609 m->numvertices = mesh->numvertices;
610 m->texture = mesh->texture;
611 m->element3i = p;memcpy(m->element3i , mesh->element3i , m->numtriangles * sizeof(int[3]));(qbyte *)p += m->numtriangles * sizeof(int[3]);
612 m->vertex3f = p;memcpy(m->vertex3f , mesh->vertex3f , m->numvertices * sizeof(float[3]));(qbyte *)p += m->numvertices * sizeof(float[3]);
613 m->texcoord2f = p;memcpy(m->texcoord2f, mesh->texcoord2f, m->numvertices * sizeof(float[2]));(qbyte *)p += m->numvertices * sizeof(float[2]);
614 m->color4f = p;memcpy(m->color4f , mesh->color4f , m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * sizeof(float[4]);
615 r_refdef.drawqueuesize += dq->size;
623 float CalcFov (float fov_x, float width, float height)
625 // calculate vision size and alter by aspect, then convert back to angle
626 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
633 Must be called whenever vid changes
637 static void SCR_CalcRefdef (void)
642 //========================================
645 if (scr_viewsize.value < 30)
646 Cvar_Set ("viewsize","30");
647 if (scr_viewsize.value > 120)
648 Cvar_Set ("viewsize","120");
650 // bound field of view
651 if (scr_fov.value < 10)
652 Cvar_Set ("fov","10");
653 if (scr_fov.value > 170)
654 Cvar_Set ("fov","170");
656 // intermission is always full screen
664 if (scr_viewsize.value >= 120)
665 sb_lines = 0; // no status bar at all
666 else if (scr_viewsize.value >= 110)
667 sb_lines = 24; // no inventory
670 size = scr_viewsize.value * (1.0 / 100.0);
675 r_refdef.width = vid.realwidth;
676 r_refdef.height = vid.realheight;
682 r_refdef.width = vid.realwidth * size;
683 r_refdef.height = vid.realheight * size;
684 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
685 r_refdef.y = (vid.realheight - r_refdef.height)/2;
688 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
689 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
690 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
691 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
693 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
694 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
695 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
699 Mod_CheckLoaded(cl.worldmodel);
700 contents = cl.worldmodel ? cl.worldmodel->PointContents(cl.worldmodel, r_refdef.vieworg) : CONTENTS_EMPTY;
701 if (contents != CONTENTS_EMPTY && contents != CONTENTS_SOLID)
703 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
704 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
714 void SCR_ScreenShot_f (void)
718 char checkname[MAX_OSPATH];
720 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
727 // find a file name to save it to
728 for (; i<=9999 ; i++)
730 sprintf (filename, "dp%04i.%s", i, extens);
731 sprintf (checkname, "%s/%s", fs_gamedir, filename);
732 if (!FS_SysFileExists(checkname))
737 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
741 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
742 Con_Printf ("Wrote %s\n", filename);
744 Con_Printf ("unable to write %s\n", filename);
747 static int cl_avidemo_frame = 0;
749 void SCR_CaptureAVIDemo(void)
752 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
753 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false))
757 Cvar_SetValueQuick(&cl_avidemo, 0);
758 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
759 cl_avidemo_frame = 0;
767 Grab six views for environment mapping tests
779 {{ 0, 180, 0}, "bk"},
780 {{ 0, 270, 0}, "lf"},
781 {{-90, 90, 0}, "up"},
785 static void R_Envmap_f (void)
788 char filename[256], basename[256];
792 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");
796 strcpy(basename, Cmd_Argv(1));
797 size = atoi(Cmd_Argv(2));
798 if (size != 128 && size != 256 && size != 512 && size != 1024)
800 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
803 if (size > vid.realwidth || size > vid.realheight)
805 Con_Printf("envmap: your resolution is not big enough to render that size\n");
813 r_refdef.width = size;
814 r_refdef.height = size;
819 for (j = 0;j < 6;j++)
821 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
822 VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
825 SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false);
831 //=============================================================================
833 // LordHavoc: SHOWLMP stuff
834 #define SHOWLMP_MAXLABELS 256
835 typedef struct showlmp_s
845 showlmp_t showlmp[SHOWLMP_MAXLABELS];
847 void SHOWLMP_decodehide(void)
851 lmplabel = MSG_ReadString();
852 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
853 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
855 showlmp[i].isactive = false;
860 void SHOWLMP_decodeshow(void)
863 qbyte lmplabel[256], picname[256];
865 strcpy(lmplabel,MSG_ReadString());
866 strcpy(picname, MSG_ReadString());
867 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
878 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
879 if (showlmp[i].isactive)
881 if (strcmp(showlmp[i].label, lmplabel) == 0)
884 break; // drop out to replace it
887 else if (k < 0) // find first empty one to replace
890 return; // none found to replace
891 // change existing one
892 showlmp[k].isactive = true;
893 strcpy(showlmp[k].label, lmplabel);
894 strcpy(showlmp[k].pic, picname);
899 void SHOWLMP_drawall(void)
902 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
903 if (showlmp[i].isactive)
904 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
907 void SHOWLMP_clear(void)
910 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
911 showlmp[i].isactive = false;
914 void CL_SetupScreenSize(void)
916 static float old2dresolution = -1;
918 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
920 VID_UpdateGamma(false);
922 if (scr_2dresolution.value != old2dresolution)
924 Cvar_SetValue("scr_2dresolution", bound(0.0f, scr_2dresolution.value, 1.0f));
925 old2dresolution = scr_2dresolution.value;
928 if (vid.realwidth > 320)
930 vid.conwidth = (vid.realwidth - 320) * scr_2dresolution.value + 320;
931 vid.conwidth = bound(320, vid.conwidth, vid.realwidth);
936 if (vid.realheight > 240)
938 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
939 vid.conheight = bound(240, vid.conheight, vid.realheight);
944 SCR_SetUpToDrawConsole();
946 // determine size of refresh window
950 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
951 void CL_UpdateScreen(void)
953 if (!scr_initialized || !con_initialized || vid_hidden)
954 return; // not initialized yet
956 if (cl_avidemo.integer)
957 SCR_CaptureAVIDemo();
959 cl_avidemo_frame = 0;
961 if (cls.signon == SIGNONS)
962 R_TimeReport("other");
964 CL_SetupScreenSize();
971 if (cls.signon == SIGNONS)
972 R_TimeReport("setup");
974 //FIXME: force menu if nothing else to look at?
975 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
979 scr_drawloading = false;
984 if (cls.signon == SIGNONS)
991 SCR_CheckDrawCenterString();
996 if (cls.signon == SIGNONS)
1000 R_TimeReport_Start();
1002 R_Shadow_EditLights_DrawSelectedLightProperties();
1009 void CL_Screen_NewMap(void)