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 scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
21 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
23 int jpeg_supported = false;
25 qboolean scr_initialized; // ready to draw
27 float scr_con_current;
28 float scr_conlines; // lines of console to display
33 qboolean scr_drawloading = false;
35 void DrawCrosshair(int num);
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 sprintf(r_speeds_string,
370 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
371 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
372 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
373 "%6i modeltris%6i meshs%6i meshtris\n",
374 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
375 c_faces, c_nodes, c_leafs, c_light_polys,
376 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
377 c_alias_polys, c_meshs, c_meshelements / 3);
379 sprintf(r_speeds_string + strlen(r_speeds_string),
380 "realtime lighting:%4i lights%4i clears%4i scissored\n"
381 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
382 "precomputed: %6i shadowmeshes%6i shadowtris\n",
383 c_rt_lights, c_rt_clears, c_rt_scissored,
384 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
385 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
399 r_timereport_start = Sys_DoubleTime();
403 void R_TimeReport_End(void)
405 r_timereport_current = r_timereport_start;
406 R_TimeReport("total");
408 if (r_timereport_active)
412 for (i = 0;r_speeds_string[i];i++)
413 if (r_speeds_string[i] == '\n')
415 y = vid.conheight - sb_lines - lines * 8;
417 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
418 while (r_speeds_string[i])
421 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
424 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
425 if (r_speeds_string[i] == '\n')
439 void SCR_SizeUp_f (void)
441 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
452 void SCR_SizeDown_f (void)
454 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
457 void CL_Screen_Init(void)
459 Cvar_RegisterVariable (&scr_fov);
460 Cvar_RegisterVariable (&scr_viewsize);
461 Cvar_RegisterVariable (&scr_conspeed);
462 Cvar_RegisterVariable (&scr_conalpha);
463 Cvar_RegisterVariable (&scr_conbrightness);
464 Cvar_RegisterVariable (&scr_showram);
465 Cvar_RegisterVariable (&scr_showturtle);
466 Cvar_RegisterVariable (&scr_showpause);
467 Cvar_RegisterVariable (&scr_centertime);
468 Cvar_RegisterVariable (&scr_printspeed);
469 Cvar_RegisterVariable (&vid_conwidth);
470 Cvar_RegisterVariable (&vid_conheight);
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 void DrawQ_Clear(void)
484 r_refdef.drawqueuesize = 0;
487 static int picelements[6] = {0, 1, 2, 0, 2, 3};
488 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
490 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);
493 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)
498 if (alpha < (1.0f / 255.0f))
501 len = strlen(string);
503 for (len = 0;len < maxlen && string[len];len++);
504 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
505 for (;len > 0 && string[len - 1] == ' ';len--);
508 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
510 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
511 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
513 red = bound(0, red, 1);
514 green = bound(0, green, 1);
515 blue = bound(0, blue, 1);
516 alpha = bound(0, alpha, 1);
517 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
519 dq->command = DRAWQUEUE_STRING;
521 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));
526 out = (char *)(dq + 1);
527 memcpy(out, string, len);
529 r_refdef.drawqueuesize += dq->size;
532 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
534 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);
537 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)
541 drawqueuemesh_t mesh;
542 memset(&mesh, 0, sizeof(mesh));
543 if (picname && picname[0])
545 pic = Draw_CachePic(picname);
549 height = pic->height;
550 mesh.texture = pic->tex;
552 mesh.num_triangles = 2;
553 mesh.num_vertices = 4;
554 mesh.data_element3i = picelements;
555 mesh.data_vertex3f = floats;
556 mesh.data_texcoord2f = floats + 12;
557 mesh.data_color4f = floats + 20;
558 memset(floats, 0, sizeof(floats));
559 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
560 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
561 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
562 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
563 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;
564 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;
565 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;
566 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;
567 DrawQ_Mesh (&mesh, flags);
570 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
577 size += sizeof(drawqueuemesh_t);
578 size += sizeof(int[3]) * mesh->num_triangles;
579 size += sizeof(float[3]) * mesh->num_vertices;
580 size += sizeof(float[2]) * mesh->num_vertices;
581 size += sizeof(float[4]) * mesh->num_vertices;
582 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
584 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
586 dq->command = DRAWQUEUE_MESH;
593 p = (void *)(dq + 1);
594 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
595 m->num_triangles = mesh->num_triangles;
596 m->num_vertices = mesh->num_vertices;
597 m->texture = mesh->texture;
598 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]);
599 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]);
600 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]);
601 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]);
602 r_refdef.drawqueuesize += dq->size;
605 void DrawQ_SetClipArea(float x, float y, float width, float height)
608 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
610 Con_DPrintf("DrawQueue full !\n");
613 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
614 dq->size = sizeof(*dq);
615 dq->command = DRAWQUEUE_SETCLIP;
623 r_refdef.drawqueuesize += dq->size;
626 void DrawQ_ResetClipArea(void)
629 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
631 Con_DPrintf("DrawQueue full !\n");
634 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
635 dq->size = sizeof(*dq);
636 dq->command = DRAWQUEUE_RESETCLIP;
644 r_refdef.drawqueuesize += dq->size;
652 float CalcFov (float fov_x, float width, float height)
654 // calculate vision size and alter by aspect, then convert back to angle
655 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
662 Must be called whenever vid changes
666 static void SCR_CalcRefdef (void)
671 //========================================
674 if (scr_viewsize.value < 30)
675 Cvar_Set ("viewsize","30");
676 if (scr_viewsize.value > 120)
677 Cvar_Set ("viewsize","120");
679 // bound field of view
680 if (scr_fov.value < 10)
681 Cvar_Set ("fov","10");
682 if (scr_fov.value > 170)
683 Cvar_Set ("fov","170");
685 // intermission is always full screen
693 if (scr_viewsize.value >= 120)
694 sb_lines = 0; // no status bar at all
695 else if (scr_viewsize.value >= 110)
696 sb_lines = 24; // no inventory
699 size = scr_viewsize.value * (1.0 / 100.0);
704 r_refdef.width = vid.realwidth;
705 r_refdef.height = vid.realheight;
711 r_refdef.width = vid.realwidth * size;
712 r_refdef.height = vid.realheight * size;
713 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
714 r_refdef.y = (vid.realheight - r_refdef.height)/2;
717 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
718 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
719 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
720 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
722 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
723 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
724 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
728 Mod_CheckLoaded(cl.worldmodel);
729 contents = CL_PointSuperContents(r_vieworigin);
730 if (contents & SUPERCONTENTS_LIQUIDSMASK)
732 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
733 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
743 void SCR_ScreenShot_f (void)
747 char checkname[MAX_OSPATH];
749 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
756 // find a file name to save it to
757 for (; i<=9999 ; i++)
759 sprintf (filename, "dp%04i.%s", i, extens);
760 sprintf (checkname, "%s/%s", fs_gamedir, filename);
761 if (!FS_SysFileExists(checkname))
766 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
770 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
771 Con_Printf ("Wrote %s\n", filename);
773 Con_Printf ("unable to write %s\n", filename);
776 static int cl_avidemo_frame = 0;
778 void SCR_CaptureAVIDemo(void)
781 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
784 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
786 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
788 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
792 Cvar_SetValueQuick(&cl_avidemo, 0);
793 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
794 cl_avidemo_frame = 0;
802 Grab six views for environment mapping tests
814 {{ 0, 180, 0}, "bk"},
815 {{ 0, 270, 0}, "lf"},
816 {{-90, 90, 0}, "up"},
820 static void R_Envmap_f (void)
823 char filename[256], basename[256];
827 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");
831 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
832 size = atoi(Cmd_Argv(2));
833 if (size != 128 && size != 256 && size != 512 && size != 1024)
835 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
838 if (size > vid.realwidth || size > vid.realheight)
840 Con_Printf("envmap: your resolution is not big enough to render that size\n");
848 r_refdef.width = size;
849 r_refdef.height = size;
854 for (j = 0;j < 6;j++)
856 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
857 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);
860 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
866 //=============================================================================
868 // LordHavoc: SHOWLMP stuff
869 #define SHOWLMP_MAXLABELS 256
870 typedef struct showlmp_s
880 showlmp_t showlmp[SHOWLMP_MAXLABELS];
882 void SHOWLMP_decodehide(void)
886 lmplabel = MSG_ReadString();
887 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
888 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
890 showlmp[i].isactive = false;
895 void SHOWLMP_decodeshow(void)
898 qbyte lmplabel[256], picname[256];
900 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
901 strlcpy (picname, MSG_ReadString(), sizeof (picname));
902 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
913 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
914 if (showlmp[i].isactive)
916 if (strcmp(showlmp[i].label, lmplabel) == 0)
919 break; // drop out to replace it
922 else if (k < 0) // find first empty one to replace
925 return; // none found to replace
926 // change existing one
927 showlmp[k].isactive = true;
928 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
929 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
934 void SHOWLMP_drawall(void)
937 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
938 if (showlmp[i].isactive)
939 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
942 void SHOWLMP_clear(void)
945 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
946 showlmp[i].isactive = false;
949 void CL_SetupScreenSize(void)
951 float conwidth, conheight;
953 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
955 VID_UpdateGamma(false);
957 conwidth = bound(320, vid_conwidth.value, 2048);
958 conheight = bound(200, vid_conheight.value, 1536);
959 if (vid_conwidth.value != conwidth)
960 Cvar_SetValue("vid_conwidth", conwidth);
961 if (vid_conheight.value != conheight)
962 Cvar_SetValue("vid_conheight", conheight);
964 vid.conwidth = vid_conwidth.integer;
965 vid.conheight = vid_conheight.integer;
967 /* if (vid.realheight > 240)
969 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
970 vid.conheight = bound(240, vid.conheight, vid.realheight);
973 vid.conheight = 240;*/
975 SCR_SetUpToDrawConsole();
977 // determine size of refresh window
981 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
982 void CL_UpdateScreen(void)
984 if (!scr_initialized || !con_initialized || vid_hidden)
985 return; // not initialized yet
987 if (cl_avidemo.integer)
988 SCR_CaptureAVIDemo();
990 cl_avidemo_frame = 0;
992 if (cls.signon == SIGNONS)
993 R_TimeReport("other");
995 CL_SetupScreenSize();
999 if (cls.signon == SIGNONS)
1000 R_TimeReport("setup");
1002 //FIXME: force menu if nothing else to look at?
1003 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
1005 if (scr_drawloading)
1007 scr_drawloading = false;
1012 if (cls.signon == SIGNONS)
1019 SCR_CheckDrawCenterString();
1024 if (cls.signon == SIGNONS)
1028 R_TimeReport_Start();
1030 R_Shadow_EditLights_DrawSelectedLightProperties();
1037 void CL_Screen_NewMap(void)