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 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
755 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
757 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
759 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
763 Cvar_SetValueQuick(&cl_avidemo, 0);
764 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
765 cl_avidemo_frame = 0;
773 Grab six views for environment mapping tests
785 {{ 0, 180, 0}, "bk"},
786 {{ 0, 270, 0}, "lf"},
787 {{-90, 90, 0}, "up"},
791 static void R_Envmap_f (void)
794 char filename[256], basename[256];
798 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");
802 strcpy(basename, Cmd_Argv(1));
803 size = atoi(Cmd_Argv(2));
804 if (size != 128 && size != 256 && size != 512 && size != 1024)
806 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
809 if (size > vid.realwidth || size > vid.realheight)
811 Con_Printf("envmap: your resolution is not big enough to render that size\n");
819 r_refdef.width = size;
820 r_refdef.height = size;
825 for (j = 0;j < 6;j++)
827 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
828 VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
831 SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false);
837 //=============================================================================
839 // LordHavoc: SHOWLMP stuff
840 #define SHOWLMP_MAXLABELS 256
841 typedef struct showlmp_s
851 showlmp_t showlmp[SHOWLMP_MAXLABELS];
853 void SHOWLMP_decodehide(void)
857 lmplabel = MSG_ReadString();
858 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
859 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
861 showlmp[i].isactive = false;
866 void SHOWLMP_decodeshow(void)
869 qbyte lmplabel[256], picname[256];
871 strcpy(lmplabel,MSG_ReadString());
872 strcpy(picname, MSG_ReadString());
873 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
884 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
885 if (showlmp[i].isactive)
887 if (strcmp(showlmp[i].label, lmplabel) == 0)
890 break; // drop out to replace it
893 else if (k < 0) // find first empty one to replace
896 return; // none found to replace
897 // change existing one
898 showlmp[k].isactive = true;
899 strcpy(showlmp[k].label, lmplabel);
900 strcpy(showlmp[k].pic, picname);
905 void SHOWLMP_drawall(void)
908 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
909 if (showlmp[i].isactive)
910 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
913 void SHOWLMP_clear(void)
916 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
917 showlmp[i].isactive = false;
920 void CL_SetupScreenSize(void)
922 static float old2dresolution = -1;
924 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
926 VID_UpdateGamma(false);
928 if (scr_2dresolution.value != old2dresolution)
930 Cvar_SetValue("scr_2dresolution", bound(0.0f, scr_2dresolution.value, 1.0f));
931 old2dresolution = scr_2dresolution.value;
934 if (vid.realwidth > 320)
936 vid.conwidth = (vid.realwidth - 320) * scr_2dresolution.value + 320;
937 vid.conwidth = bound(320, vid.conwidth, vid.realwidth);
942 if (vid.realheight > 240)
944 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
945 vid.conheight = bound(240, vid.conheight, vid.realheight);
950 SCR_SetUpToDrawConsole();
952 // determine size of refresh window
956 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
957 void CL_UpdateScreen(void)
959 if (!scr_initialized || !con_initialized || vid_hidden)
960 return; // not initialized yet
962 if (cl_avidemo.integer)
963 SCR_CaptureAVIDemo();
965 cl_avidemo_frame = 0;
967 if (cls.signon == SIGNONS)
968 R_TimeReport("other");
970 CL_SetupScreenSize();
977 if (cls.signon == SIGNONS)
978 R_TimeReport("setup");
980 //FIXME: force menu if nothing else to look at?
981 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
985 scr_drawloading = false;
990 if (cls.signon == SIGNONS)
997 SCR_CheckDrawCenterString();
1002 if (cls.signon == SIGNONS)
1006 R_TimeReport_Start();
1008 R_Shadow_EditLights_DrawSelectedLightProperties();
1015 void CL_Screen_NewMap(void)