5 #include "cl_collision.h"
7 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
8 cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 10 - 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 cl_avidemo = {0, "cl_avidemo", "0"};
22 qboolean scr_initialized; // ready to draw
24 float scr_con_current;
25 float scr_conlines; // lines of console to display
30 qboolean scr_drawloading = false;
32 static qbyte menuplyr_pixels[4096];
34 void DrawCrosshair(int num);
35 void V_CalcRefdef (void);
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 AngleVectors (r_refdef.viewangles, vpn, NULL, NULL);
370 sprintf(r_speeds_string,
371 "org:'%+8.2f %+8.2f %+8.2f' ang:'%+4.0f %+4.0f %+4.0f' 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_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],
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)
462 Cvar_RegisterVariable (&scr_fov);
463 Cvar_RegisterVariable (&scr_viewsize);
464 Cvar_RegisterVariable (&scr_conspeed);
465 Cvar_RegisterVariable (&scr_conalpha);
466 Cvar_RegisterVariable (&scr_conbrightness);
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 (&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 scr_initialized = true;
485 // load the image data for the player image in the config menu
486 dat = (qpic_t *)FS_LoadFile ("gfx/menuplyr.lmp", false);
488 Sys_Error("unable to load gfx/menuplyr.lmp");
491 if (dat->width*dat->height <= 4096)
492 memcpy (menuplyr_pixels, dat->data, dat->width * dat->height);
494 Con_Printf("gfx/menuplyr.lmp larger than 4k buffer");
498 void DrawQ_Clear(void)
500 r_refdef.drawqueuesize = 0;
503 static int picelements[6] = {0, 1, 2, 0, 2, 3};
504 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
506 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);
509 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)
514 if (alpha < (1.0f / 255.0f))
517 len = strlen(string);
519 for (len = 0;len < maxlen && string[len];len++);
520 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
521 for (;len > 0 && string[len - 1] == ' ';len--);
524 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
526 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
527 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
529 red = bound(0, red, 1);
530 green = bound(0, green, 1);
531 blue = bound(0, blue, 1);
532 alpha = bound(0, alpha, 1);
533 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
535 dq->command = DRAWQUEUE_STRING;
537 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));
542 out = (char *)(dq + 1);
543 memcpy(out, string, len);
545 r_refdef.drawqueuesize += dq->size;
548 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
550 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);
553 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)
557 drawqueuemesh_t mesh;
558 memset(&mesh, 0, sizeof(mesh));
559 if (picname && picname[0])
561 pic = Draw_CachePic(picname);
565 height = pic->height;
566 mesh.texture = pic->tex;
568 mesh.num_triangles = 2;
569 mesh.num_vertices = 4;
570 mesh.data_element3i = picelements;
571 mesh.data_vertex3f = floats;
572 mesh.data_texcoord2f = floats + 12;
573 mesh.data_color4f = floats + 20;
574 memset(floats, 0, sizeof(floats));
575 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
576 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
577 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
578 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
579 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;
580 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;
581 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;
582 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;
583 DrawQ_Mesh (&mesh, flags);
586 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
593 size += sizeof(drawqueuemesh_t);
594 size += sizeof(int[3]) * mesh->num_triangles;
595 size += sizeof(float[3]) * mesh->num_vertices;
596 size += sizeof(float[2]) * mesh->num_vertices;
597 size += sizeof(float[4]) * mesh->num_vertices;
598 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
600 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
602 dq->command = DRAWQUEUE_MESH;
609 p = (void *)(dq + 1);
610 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
611 m->num_triangles = mesh->num_triangles;
612 m->num_vertices = mesh->num_vertices;
613 m->texture = mesh->texture;
614 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]);
615 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]);
616 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]);
617 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]);
618 r_refdef.drawqueuesize += dq->size;
626 float CalcFov (float fov_x, float width, float height)
628 // calculate vision size and alter by aspect, then convert back to angle
629 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
636 Must be called whenever vid changes
640 static void SCR_CalcRefdef (void)
645 //========================================
648 if (scr_viewsize.value < 30)
649 Cvar_Set ("viewsize","30");
650 if (scr_viewsize.value > 120)
651 Cvar_Set ("viewsize","120");
653 // bound field of view
654 if (scr_fov.value < 10)
655 Cvar_Set ("fov","10");
656 if (scr_fov.value > 170)
657 Cvar_Set ("fov","170");
659 // intermission is always full screen
667 if (scr_viewsize.value >= 120)
668 sb_lines = 0; // no status bar at all
669 else if (scr_viewsize.value >= 110)
670 sb_lines = 24; // no inventory
673 size = scr_viewsize.value * (1.0 / 100.0);
678 r_refdef.width = vid.realwidth;
679 r_refdef.height = vid.realheight;
685 r_refdef.width = vid.realwidth * size;
686 r_refdef.height = vid.realheight * size;
687 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
688 r_refdef.y = (vid.realheight - r_refdef.height)/2;
691 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
692 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
693 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
694 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
696 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
697 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
698 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
702 Mod_CheckLoaded(cl.worldmodel);
703 contents = CL_PointSuperContents(r_refdef.vieworg);
704 if (contents & SUPERCONTENTS_LIQUIDSMASK)
706 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
707 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
717 void SCR_ScreenShot_f (void)
721 char checkname[MAX_OSPATH];
723 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
730 // find a file name to save it to
731 for (; i<=9999 ; i++)
733 sprintf (filename, "dp%04i.%s", i, extens);
734 sprintf (checkname, "%s/%s", fs_gamedir, filename);
735 if (!FS_SysFileExists(checkname))
740 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
744 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
745 Con_Printf ("Wrote %s\n", filename);
747 Con_Printf ("unable to write %s\n", filename);
750 static int cl_avidemo_frame = 0;
752 void SCR_CaptureAVIDemo(void)
755 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
758 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
760 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
762 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
766 Cvar_SetValueQuick(&cl_avidemo, 0);
767 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
768 cl_avidemo_frame = 0;
776 Grab six views for environment mapping tests
788 {{ 0, 180, 0}, "bk"},
789 {{ 0, 270, 0}, "lf"},
790 {{-90, 90, 0}, "up"},
794 static void R_Envmap_f (void)
797 char filename[256], basename[256];
801 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");
805 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
806 size = atoi(Cmd_Argv(2));
807 if (size != 128 && size != 256 && size != 512 && size != 1024)
809 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
812 if (size > vid.realwidth || size > vid.realheight)
814 Con_Printf("envmap: your resolution is not big enough to render that size\n");
822 r_refdef.width = size;
823 r_refdef.height = size;
828 for (j = 0;j < 6;j++)
830 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
831 VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
834 SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false);
840 //=============================================================================
842 // LordHavoc: SHOWLMP stuff
843 #define SHOWLMP_MAXLABELS 256
844 typedef struct showlmp_s
854 showlmp_t showlmp[SHOWLMP_MAXLABELS];
856 void SHOWLMP_decodehide(void)
860 lmplabel = MSG_ReadString();
861 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
862 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
864 showlmp[i].isactive = false;
869 void SHOWLMP_decodeshow(void)
872 qbyte lmplabel[256], picname[256];
874 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
875 strlcpy (picname, MSG_ReadString(), sizeof (picname));
876 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
887 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
888 if (showlmp[i].isactive)
890 if (strcmp(showlmp[i].label, lmplabel) == 0)
893 break; // drop out to replace it
896 else if (k < 0) // find first empty one to replace
899 return; // none found to replace
900 // change existing one
901 showlmp[k].isactive = true;
902 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
903 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
908 void SHOWLMP_drawall(void)
911 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
912 if (showlmp[i].isactive)
913 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
916 void SHOWLMP_clear(void)
919 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
920 showlmp[i].isactive = false;
923 void CL_SetupScreenSize(void)
925 float conwidth, conheight;
927 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
929 VID_UpdateGamma(false);
931 conwidth = bound(320, vid_conwidth.value, 2048);
932 conheight = bound(200, vid_conheight.value, 1536);
933 if (vid_conwidth.value != conwidth)
934 Cvar_SetValue("vid_conwidth", conwidth);
935 if (vid_conheight.value != conheight)
936 Cvar_SetValue("vid_conheight", conheight);
938 vid.conwidth = vid_conwidth.integer;
939 vid.conheight = vid_conheight.integer;
941 SCR_SetUpToDrawConsole();
943 // determine size of refresh window
947 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
948 void CL_UpdateScreen(void)
950 if (!scr_initialized || !con_initialized || vid_hidden)
951 return; // not initialized yet
953 if (cl_avidemo.integer)
954 SCR_CaptureAVIDemo();
956 cl_avidemo_frame = 0;
958 if (cls.signon == SIGNONS)
959 R_TimeReport("other");
961 CL_SetupScreenSize();
965 if (cls.signon == SIGNONS)
966 R_TimeReport("setup");
968 //FIXME: force menu if nothing else to look at?
969 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
973 scr_drawloading = false;
978 if (cls.signon == SIGNONS)
985 SCR_CheckDrawCenterString();
990 if (cls.signon == SIGNONS)
994 R_TimeReport_Start();
996 R_Shadow_EditLights_DrawSelectedLightProperties();
1003 void CL_Screen_NewMap(void)