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;
621 void DrawQ_SetClipArea(float x, float y, float width, float height)
624 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
626 Con_DPrintf("DrawQueue full !\n");
629 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
630 dq->size = sizeof(*dq);
631 dq->command = DRAWQUEUE_SETCLIP;
639 r_refdef.drawqueuesize += dq->size;
642 void DrawQ_ResetClipArea(void)
645 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
647 Con_DPrintf("DrawQueue full !\n");
650 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
651 dq->size = sizeof(*dq);
652 dq->command = DRAWQUEUE_RESETCLIP;
660 r_refdef.drawqueuesize += dq->size;
668 float CalcFov (float fov_x, float width, float height)
670 // calculate vision size and alter by aspect, then convert back to angle
671 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
678 Must be called whenever vid changes
682 static void SCR_CalcRefdef (void)
687 //========================================
690 if (scr_viewsize.value < 30)
691 Cvar_Set ("viewsize","30");
692 if (scr_viewsize.value > 120)
693 Cvar_Set ("viewsize","120");
695 // bound field of view
696 if (scr_fov.value < 10)
697 Cvar_Set ("fov","10");
698 if (scr_fov.value > 170)
699 Cvar_Set ("fov","170");
701 // intermission is always full screen
709 if (scr_viewsize.value >= 120)
710 sb_lines = 0; // no status bar at all
711 else if (scr_viewsize.value >= 110)
712 sb_lines = 24; // no inventory
715 size = scr_viewsize.value * (1.0 / 100.0);
720 r_refdef.width = vid.realwidth;
721 r_refdef.height = vid.realheight;
727 r_refdef.width = vid.realwidth * size;
728 r_refdef.height = vid.realheight * size;
729 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
730 r_refdef.y = (vid.realheight - r_refdef.height)/2;
733 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
734 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
735 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
736 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
738 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
739 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
740 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
744 Mod_CheckLoaded(cl.worldmodel);
745 contents = CL_PointSuperContents(r_refdef.vieworg);
746 if (contents & SUPERCONTENTS_LIQUIDSMASK)
748 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
749 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
759 void SCR_ScreenShot_f (void)
763 char checkname[MAX_OSPATH];
765 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
772 // find a file name to save it to
773 for (; i<=9999 ; i++)
775 sprintf (filename, "dp%04i.%s", i, extens);
776 sprintf (checkname, "%s/%s", fs_gamedir, filename);
777 if (!FS_SysFileExists(checkname))
782 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
786 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
787 Con_Printf ("Wrote %s\n", filename);
789 Con_Printf ("unable to write %s\n", filename);
792 static int cl_avidemo_frame = 0;
794 void SCR_CaptureAVIDemo(void)
797 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
800 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
802 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
804 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
808 Cvar_SetValueQuick(&cl_avidemo, 0);
809 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
810 cl_avidemo_frame = 0;
818 Grab six views for environment mapping tests
830 {{ 0, 180, 0}, "bk"},
831 {{ 0, 270, 0}, "lf"},
832 {{-90, 90, 0}, "up"},
836 static void R_Envmap_f (void)
839 char filename[256], basename[256];
843 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");
847 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
848 size = atoi(Cmd_Argv(2));
849 if (size != 128 && size != 256 && size != 512 && size != 1024)
851 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
854 if (size > vid.realwidth || size > vid.realheight)
856 Con_Printf("envmap: your resolution is not big enough to render that size\n");
864 r_refdef.width = size;
865 r_refdef.height = size;
870 for (j = 0;j < 6;j++)
872 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
873 VectorCopy(envmapinfo[j].angles, r_refdef.viewangles);
876 SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false);
882 //=============================================================================
884 // LordHavoc: SHOWLMP stuff
885 #define SHOWLMP_MAXLABELS 256
886 typedef struct showlmp_s
896 showlmp_t showlmp[SHOWLMP_MAXLABELS];
898 void SHOWLMP_decodehide(void)
902 lmplabel = MSG_ReadString();
903 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
904 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
906 showlmp[i].isactive = false;
911 void SHOWLMP_decodeshow(void)
914 qbyte lmplabel[256], picname[256];
916 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
917 strlcpy (picname, MSG_ReadString(), sizeof (picname));
918 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
929 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
930 if (showlmp[i].isactive)
932 if (strcmp(showlmp[i].label, lmplabel) == 0)
935 break; // drop out to replace it
938 else if (k < 0) // find first empty one to replace
941 return; // none found to replace
942 // change existing one
943 showlmp[k].isactive = true;
944 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
945 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
950 void SHOWLMP_drawall(void)
953 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
954 if (showlmp[i].isactive)
955 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
958 void SHOWLMP_clear(void)
961 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
962 showlmp[i].isactive = false;
965 void CL_SetupScreenSize(void)
967 float conwidth, conheight;
969 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
971 VID_UpdateGamma(false);
973 conwidth = bound(320, vid_conwidth.value, 2048);
974 conheight = bound(200, vid_conheight.value, 1536);
975 if (vid_conwidth.value != conwidth)
976 Cvar_SetValue("vid_conwidth", conwidth);
977 if (vid_conheight.value != conheight)
978 Cvar_SetValue("vid_conheight", conheight);
980 vid.conwidth = vid_conwidth.integer;
981 vid.conheight = vid_conheight.integer;
983 /* if (vid.realheight > 240)
985 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
986 vid.conheight = bound(240, vid.conheight, vid.realheight);
989 vid.conheight = 240;*/
991 SCR_SetUpToDrawConsole();
993 // determine size of refresh window
997 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
998 void CL_UpdateScreen(void)
1000 if (!scr_initialized || !con_initialized || vid_hidden)
1001 return; // not initialized yet
1003 if (cl_avidemo.integer)
1004 SCR_CaptureAVIDemo();
1006 cl_avidemo_frame = 0;
1008 if (cls.signon == SIGNONS)
1009 R_TimeReport("other");
1011 CL_SetupScreenSize();
1015 if (cls.signon == SIGNONS)
1016 R_TimeReport("setup");
1018 //FIXME: force menu if nothing else to look at?
1019 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
1021 if (scr_drawloading)
1023 scr_drawloading = false;
1028 if (cls.signon == SIGNONS)
1035 SCR_CheckDrawCenterString();
1040 if (cls.signon == SIGNONS)
1044 R_TimeReport_Start();
1046 R_Shadow_EditLights_DrawSelectedLightProperties();
1053 void CL_Screen_NewMap(void)