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 static void SCR_ScreenShot_f (void);
36 static void R_Envmap_f (void);
39 void R_ClearScreen(void);
42 ===============================================================================
46 ===============================================================================
49 char scr_centerstring[1024];
50 float scr_centertime_start; // for slow victory printing
51 float scr_centertime_off;
60 Called for important messages that should stay in the center of the screen
64 void SCR_CenterPrint (char *str)
66 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
67 scr_centertime_off = scr_centertime.value;
68 scr_centertime_start = cl.time;
70 // count the number of lines for centering
81 void SCR_DrawCenterString (void)
88 // the finale prints the characters one at a time
90 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
95 start = scr_centerstring;
97 if (scr_center_lines <= 4)
98 y = vid.conheight*0.35;
104 // scan the width of the line
105 for (l=0 ; l<40 ; l++)
106 if (start[l] == '\n' || !start[l])
108 x = (vid.conwidth - l*8)/2;
113 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
121 while (*start && *start != '\n')
126 start++; // skip the \n
130 void SCR_CheckDrawCenterString (void)
132 if (scr_center_lines > scr_erase_lines)
133 scr_erase_lines = scr_center_lines;
135 scr_centertime_off -= host_frametime;
137 // don't draw if this is a normal stats-screen intermission,
138 // only if it is not an intermission, or a finale intermission
139 if (cl.intermission == 1)
141 if (scr_centertime_off <= 0 && !cl.intermission)
143 if (key_dest != key_game)
146 SCR_DrawCenterString ();
154 void SCR_DrawTurtle (void)
158 if (cls.state != ca_connected)
161 if (!scr_showturtle.integer)
164 if (host_frametime < 0.1)
174 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
182 void SCR_DrawNet (void)
184 if (cls.state != ca_connected)
186 if (realtime - cl.last_received_message < 0.3)
188 if (cls.demoplayback)
191 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
199 void SCR_DrawPause (void)
203 if (cls.state != ca_connected)
206 if (!scr_showpause.integer) // turn off for screenshots
212 pic = Draw_CachePic ("gfx/pause.lmp");
213 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
223 void SCR_DrawLoading (void)
227 pic = Draw_CachePic ("gfx/loading.lmp");
228 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
233 //=============================================================================
238 SCR_SetUpToDrawConsole
241 void SCR_SetUpToDrawConsole (void)
245 if (key_dest == key_game && cls.signon != SIGNONS)
246 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
248 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
250 // decide on the height of the console
251 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
252 scr_conlines = vid.conheight; // full screen
253 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
254 scr_conlines = vid.conheight/2; // half screen
256 scr_conlines = 0; // none visible
258 if (scr_conspeed.value)
260 if (scr_conlines < scr_con_current)
262 scr_con_current -= scr_conspeed.value*host_realframetime;
263 if (scr_conlines > scr_con_current)
264 scr_con_current = scr_conlines;
267 else if (scr_conlines > scr_con_current)
269 scr_con_current += scr_conspeed.value*host_realframetime;
270 if (scr_conlines < scr_con_current)
271 scr_con_current = scr_conlines;
275 scr_con_current = scr_conlines;
283 void SCR_DrawConsole (void)
287 Con_DrawConsole (scr_con_current);
292 if (key_dest == key_game || key_dest == key_message)
293 Con_DrawNotify (); // only draw notify in game
299 SCR_BeginLoadingPlaque
303 void SCR_BeginLoadingPlaque (void)
308 S_StopAllSounds (true);
310 scr_drawloading = true;
312 scr_drawloading = true;
316 //=============================================================================
318 char r_speeds_string[1024];
319 int speedstringcount, r_timereport_active;
320 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
322 void R_TimeReport(char *desc)
328 if (!r_timereport_active)
331 r_timereport_temp = r_timereport_current;
332 r_timereport_current = Sys_DoubleTime();
333 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
335 sprintf(tempbuf, "%8i %s", t, desc);
336 length = strlen(tempbuf);
338 tempbuf[length++] = ' ';
340 if (speedstringcount + length > (vid.conwidth / 8))
342 strcat(r_speeds_string, "\n");
343 speedstringcount = 0;
345 // skip the space at the beginning if it's the first on the line
346 if (speedstringcount == 0)
348 strcat(r_speeds_string, tempbuf + 1);
349 speedstringcount = length - 1;
353 strcat(r_speeds_string, tempbuf);
354 speedstringcount += length;
358 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
359 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
360 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
361 void R_TimeReport_Start(void)
363 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
364 r_speeds_string[0] = 0;
365 if (r_timereport_active)
367 speedstringcount = 0;
368 sprintf(r_speeds_string,
369 "org:'%+8.2f %+8.2f %+8.2f' 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_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[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 (&vid_conwidth);
471 Cvar_RegisterVariable (&vid_conheight);
472 Cvar_RegisterVariable (&scr_screenshot_jpeg);
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 // load the image data for the player image in the config menu
484 dat = (qpic_t *)FS_LoadFile ("gfx/menuplyr.lmp", false);
486 Sys_Error("unable to load gfx/menuplyr.lmp");
489 if (dat->width*dat->height <= 4096)
490 memcpy (menuplyr_pixels, dat->data, dat->width * dat->height);
492 Con_Printf("gfx/menuplyr.lmp larger than 4k buffer");
496 void DrawQ_Clear(void)
498 r_refdef.drawqueuesize = 0;
501 static int picelements[6] = {0, 1, 2, 0, 2, 3};
502 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
504 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);
507 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)
512 if (alpha < (1.0f / 255.0f))
515 len = strlen(string);
517 for (len = 0;len < maxlen && string[len];len++);
518 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
519 for (;len > 0 && string[len - 1] == ' ';len--);
522 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
524 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
525 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
527 red = bound(0, red, 1);
528 green = bound(0, green, 1);
529 blue = bound(0, blue, 1);
530 alpha = bound(0, alpha, 1);
531 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
533 dq->command = DRAWQUEUE_STRING;
535 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));
540 out = (char *)(dq + 1);
541 memcpy(out, string, len);
543 r_refdef.drawqueuesize += dq->size;
546 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
548 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);
551 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)
555 drawqueuemesh_t mesh;
556 memset(&mesh, 0, sizeof(mesh));
557 if (picname && picname[0])
559 pic = Draw_CachePic(picname);
563 height = pic->height;
564 mesh.texture = pic->tex;
566 mesh.num_triangles = 2;
567 mesh.num_vertices = 4;
568 mesh.data_element3i = picelements;
569 mesh.data_vertex3f = floats;
570 mesh.data_texcoord2f = floats + 12;
571 mesh.data_color4f = floats + 20;
572 memset(floats, 0, sizeof(floats));
573 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
574 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
575 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
576 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
577 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;
578 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;
579 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;
580 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;
581 DrawQ_Mesh (&mesh, flags);
584 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
591 size += sizeof(drawqueuemesh_t);
592 size += sizeof(int[3]) * mesh->num_triangles;
593 size += sizeof(float[3]) * mesh->num_vertices;
594 size += sizeof(float[2]) * mesh->num_vertices;
595 size += sizeof(float[4]) * mesh->num_vertices;
596 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
598 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
600 dq->command = DRAWQUEUE_MESH;
607 p = (void *)(dq + 1);
608 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
609 m->num_triangles = mesh->num_triangles;
610 m->num_vertices = mesh->num_vertices;
611 m->texture = mesh->texture;
612 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]);
613 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]);
614 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]);
615 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]);
616 r_refdef.drawqueuesize += dq->size;
619 void DrawQ_SetClipArea(float x, float y, float width, float height)
622 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
624 Con_DPrintf("DrawQueue full !\n");
627 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
628 dq->size = sizeof(*dq);
629 dq->command = DRAWQUEUE_SETCLIP;
637 r_refdef.drawqueuesize += dq->size;
640 void DrawQ_ResetClipArea(void)
643 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
645 Con_DPrintf("DrawQueue full !\n");
648 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
649 dq->size = sizeof(*dq);
650 dq->command = DRAWQUEUE_RESETCLIP;
658 r_refdef.drawqueuesize += dq->size;
666 float CalcFov (float fov_x, float width, float height)
668 // calculate vision size and alter by aspect, then convert back to angle
669 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
676 Must be called whenever vid changes
680 static void SCR_CalcRefdef (void)
685 //========================================
688 if (scr_viewsize.value < 30)
689 Cvar_Set ("viewsize","30");
690 if (scr_viewsize.value > 120)
691 Cvar_Set ("viewsize","120");
693 // bound field of view
694 if (scr_fov.value < 10)
695 Cvar_Set ("fov","10");
696 if (scr_fov.value > 170)
697 Cvar_Set ("fov","170");
699 // intermission is always full screen
707 if (scr_viewsize.value >= 120)
708 sb_lines = 0; // no status bar at all
709 else if (scr_viewsize.value >= 110)
710 sb_lines = 24; // no inventory
713 size = scr_viewsize.value * (1.0 / 100.0);
718 r_refdef.width = vid.realwidth;
719 r_refdef.height = vid.realheight;
725 r_refdef.width = vid.realwidth * size;
726 r_refdef.height = vid.realheight * size;
727 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
728 r_refdef.y = (vid.realheight - r_refdef.height)/2;
731 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
732 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
733 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
734 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
736 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
737 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
738 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
742 Mod_CheckLoaded(cl.worldmodel);
743 contents = CL_PointSuperContents(r_vieworigin);
744 if (contents & SUPERCONTENTS_LIQUIDSMASK)
746 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
747 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
757 void SCR_ScreenShot_f (void)
761 char checkname[MAX_OSPATH];
763 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
770 // find a file name to save it to
771 for (; i<=9999 ; i++)
773 sprintf (filename, "dp%04i.%s", i, extens);
774 sprintf (checkname, "%s/%s", fs_gamedir, filename);
775 if (!FS_SysFileExists(checkname))
780 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
784 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
785 Con_Printf ("Wrote %s\n", filename);
787 Con_Printf ("unable to write %s\n", filename);
790 static int cl_avidemo_frame = 0;
792 void SCR_CaptureAVIDemo(void)
795 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
798 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
800 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
802 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
806 Cvar_SetValueQuick(&cl_avidemo, 0);
807 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
808 cl_avidemo_frame = 0;
816 Grab six views for environment mapping tests
828 {{ 0, 180, 0}, "bk"},
829 {{ 0, 270, 0}, "lf"},
830 {{-90, 90, 0}, "up"},
834 static void R_Envmap_f (void)
837 char filename[256], basename[256];
841 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");
845 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
846 size = atoi(Cmd_Argv(2));
847 if (size != 128 && size != 256 && size != 512 && size != 1024)
849 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
852 if (size > vid.realwidth || size > vid.realheight)
854 Con_Printf("envmap: your resolution is not big enough to render that size\n");
862 r_refdef.width = size;
863 r_refdef.height = size;
868 for (j = 0;j < 6;j++)
870 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
871 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);
874 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
880 //=============================================================================
882 // LordHavoc: SHOWLMP stuff
883 #define SHOWLMP_MAXLABELS 256
884 typedef struct showlmp_s
894 showlmp_t showlmp[SHOWLMP_MAXLABELS];
896 void SHOWLMP_decodehide(void)
900 lmplabel = MSG_ReadString();
901 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
902 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
904 showlmp[i].isactive = false;
909 void SHOWLMP_decodeshow(void)
912 qbyte lmplabel[256], picname[256];
914 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
915 strlcpy (picname, MSG_ReadString(), sizeof (picname));
916 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
927 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
928 if (showlmp[i].isactive)
930 if (strcmp(showlmp[i].label, lmplabel) == 0)
933 break; // drop out to replace it
936 else if (k < 0) // find first empty one to replace
939 return; // none found to replace
940 // change existing one
941 showlmp[k].isactive = true;
942 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
943 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
948 void SHOWLMP_drawall(void)
951 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
952 if (showlmp[i].isactive)
953 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
956 void SHOWLMP_clear(void)
959 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
960 showlmp[i].isactive = false;
963 void CL_SetupScreenSize(void)
965 float conwidth, conheight;
967 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
969 VID_UpdateGamma(false);
971 conwidth = bound(320, vid_conwidth.value, 2048);
972 conheight = bound(200, vid_conheight.value, 1536);
973 if (vid_conwidth.value != conwidth)
974 Cvar_SetValue("vid_conwidth", conwidth);
975 if (vid_conheight.value != conheight)
976 Cvar_SetValue("vid_conheight", conheight);
978 vid.conwidth = vid_conwidth.integer;
979 vid.conheight = vid_conheight.integer;
981 /* if (vid.realheight > 240)
983 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
984 vid.conheight = bound(240, vid.conheight, vid.realheight);
987 vid.conheight = 240;*/
989 SCR_SetUpToDrawConsole();
991 // determine size of refresh window
995 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
996 void CL_UpdateScreen(void)
998 if (!scr_initialized || !con_initialized || vid_hidden)
999 return; // not initialized yet
1001 if (cl_avidemo.integer)
1002 SCR_CaptureAVIDemo();
1004 cl_avidemo_frame = 0;
1006 if (cls.signon == SIGNONS)
1007 R_TimeReport("other");
1009 CL_SetupScreenSize();
1013 if (cls.signon == SIGNONS)
1014 R_TimeReport("setup");
1016 //FIXME: force menu if nothing else to look at?
1017 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
1019 if (scr_drawloading)
1021 scr_drawloading = false;
1026 if (cls.signon == SIGNONS)
1033 SCR_CheckDrawCenterString();
1038 if (cls.signon == SIGNONS)
1042 R_TimeReport_Start();
1044 R_Shadow_EditLights_DrawSelectedLightProperties();
1051 void CL_Screen_NewMap(void)