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 (&scr_screenshot_jpeg_quality);
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 void DrawQ_Clear(void)
485 r_refdef.drawqueuesize = 0;
488 static int picelements[6] = {0, 1, 2, 0, 2, 3};
489 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
491 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);
494 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)
499 if (alpha < (1.0f / 255.0f))
502 len = strlen(string);
504 for (len = 0;len < maxlen && string[len];len++);
505 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
506 for (;len > 0 && string[len - 1] == ' ';len--);
509 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
511 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
512 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
514 red = bound(0, red, 1);
515 green = bound(0, green, 1);
516 blue = bound(0, blue, 1);
517 alpha = bound(0, alpha, 1);
518 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
520 dq->command = DRAWQUEUE_STRING;
522 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));
527 out = (char *)(dq + 1);
528 memcpy(out, string, len);
530 r_refdef.drawqueuesize += dq->size;
533 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
535 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);
538 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)
542 drawqueuemesh_t mesh;
543 memset(&mesh, 0, sizeof(mesh));
544 if (picname && picname[0])
546 pic = Draw_CachePic(picname);
550 height = pic->height;
551 mesh.texture = pic->tex;
553 mesh.num_triangles = 2;
554 mesh.num_vertices = 4;
555 mesh.data_element3i = picelements;
556 mesh.data_vertex3f = floats;
557 mesh.data_texcoord2f = floats + 12;
558 mesh.data_color4f = floats + 20;
559 memset(floats, 0, sizeof(floats));
560 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
561 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
562 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
563 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
564 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;
565 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;
566 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;
567 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;
568 DrawQ_Mesh (&mesh, flags);
571 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
578 size += sizeof(drawqueuemesh_t);
579 size += sizeof(int[3]) * mesh->num_triangles;
580 size += sizeof(float[3]) * mesh->num_vertices;
581 size += sizeof(float[2]) * mesh->num_vertices;
582 size += sizeof(float[4]) * mesh->num_vertices;
583 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
585 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
587 dq->command = DRAWQUEUE_MESH;
594 p = (void *)(dq + 1);
595 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
596 m->num_triangles = mesh->num_triangles;
597 m->num_vertices = mesh->num_vertices;
598 m->texture = mesh->texture;
599 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]);
600 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]);
601 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]);
602 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]);
603 r_refdef.drawqueuesize += dq->size;
606 void DrawQ_SetClipArea(float x, float y, float width, float height)
609 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
611 Con_DPrintf("DrawQueue full !\n");
614 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
615 dq->size = sizeof(*dq);
616 dq->command = DRAWQUEUE_SETCLIP;
624 r_refdef.drawqueuesize += dq->size;
627 void DrawQ_ResetClipArea(void)
630 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
632 Con_DPrintf("DrawQueue full !\n");
635 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
636 dq->size = sizeof(*dq);
637 dq->command = DRAWQUEUE_RESETCLIP;
645 r_refdef.drawqueuesize += dq->size;
653 float CalcFov (float fov_x, float width, float height)
655 // calculate vision size and alter by aspect, then convert back to angle
656 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
663 Must be called whenever vid changes
667 static void SCR_CalcRefdef (void)
672 //========================================
675 if (scr_viewsize.value < 30)
676 Cvar_Set ("viewsize","30");
677 if (scr_viewsize.value > 120)
678 Cvar_Set ("viewsize","120");
680 // bound field of view
681 if (scr_fov.value < 10)
682 Cvar_Set ("fov","10");
683 if (scr_fov.value > 170)
684 Cvar_Set ("fov","170");
686 // intermission is always full screen
694 if (scr_viewsize.value >= 120)
695 sb_lines = 0; // no status bar at all
696 else if (scr_viewsize.value >= 110)
697 sb_lines = 24; // no inventory
700 size = scr_viewsize.value * (1.0 / 100.0);
705 r_refdef.width = vid.realwidth;
706 r_refdef.height = vid.realheight;
712 r_refdef.width = vid.realwidth * size;
713 r_refdef.height = vid.realheight * size;
714 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
715 r_refdef.y = (vid.realheight - r_refdef.height)/2;
718 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
719 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
720 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
721 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
723 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
724 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
725 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
729 Mod_CheckLoaded(cl.worldmodel);
730 contents = CL_PointSuperContents(r_vieworigin);
731 if (contents & SUPERCONTENTS_LIQUIDSMASK)
733 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
734 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
744 void SCR_ScreenShot_f (void)
748 char checkname[MAX_OSPATH];
750 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
757 // find a file name to save it to
758 for (; i<=9999 ; i++)
760 sprintf (filename, "dp%04i.%s", i, extens);
761 sprintf (checkname, "%s/%s", fs_gamedir, filename);
762 if (!FS_SysFileExists(checkname))
767 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
771 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
772 Con_Printf ("Wrote %s\n", filename);
774 Con_Printf ("unable to write %s\n", filename);
777 static int cl_avidemo_frame = 0;
779 void SCR_CaptureAVIDemo(void)
782 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
785 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
787 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
789 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
793 Cvar_SetValueQuick(&cl_avidemo, 0);
794 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
795 cl_avidemo_frame = 0;
803 Grab six views for environment mapping tests
815 {{ 0, 180, 0}, "bk"},
816 {{ 0, 270, 0}, "lf"},
817 {{-90, 90, 0}, "up"},
821 static void R_Envmap_f (void)
824 char filename[256], basename[256];
828 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");
832 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
833 size = atoi(Cmd_Argv(2));
834 if (size != 128 && size != 256 && size != 512 && size != 1024)
836 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
839 if (size > vid.realwidth || size > vid.realheight)
841 Con_Printf("envmap: your resolution is not big enough to render that size\n");
849 r_refdef.width = size;
850 r_refdef.height = size;
855 for (j = 0;j < 6;j++)
857 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
858 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);
861 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
867 //=============================================================================
869 // LordHavoc: SHOWLMP stuff
870 #define SHOWLMP_MAXLABELS 256
871 typedef struct showlmp_s
881 showlmp_t showlmp[SHOWLMP_MAXLABELS];
883 void SHOWLMP_decodehide(void)
887 lmplabel = MSG_ReadString();
888 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
889 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
891 showlmp[i].isactive = false;
896 void SHOWLMP_decodeshow(void)
899 qbyte lmplabel[256], picname[256];
901 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
902 strlcpy (picname, MSG_ReadString(), sizeof (picname));
903 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
914 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
915 if (showlmp[i].isactive)
917 if (strcmp(showlmp[i].label, lmplabel) == 0)
920 break; // drop out to replace it
923 else if (k < 0) // find first empty one to replace
926 return; // none found to replace
927 // change existing one
928 showlmp[k].isactive = true;
929 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
930 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
935 void SHOWLMP_drawall(void)
938 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
939 if (showlmp[i].isactive)
940 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
943 void SHOWLMP_clear(void)
946 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
947 showlmp[i].isactive = false;
950 void CL_SetupScreenSize(void)
952 float conwidth, conheight;
954 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
956 VID_UpdateGamma(false);
958 conwidth = bound(320, vid_conwidth.value, 2048);
959 conheight = bound(200, vid_conheight.value, 1536);
960 if (vid_conwidth.value != conwidth)
961 Cvar_SetValue("vid_conwidth", conwidth);
962 if (vid_conheight.value != conheight)
963 Cvar_SetValue("vid_conheight", conheight);
965 vid.conwidth = vid_conwidth.integer;
966 vid.conheight = vid_conheight.integer;
968 /* if (vid.realheight > 240)
970 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
971 vid.conheight = bound(240, vid.conheight, vid.realheight);
974 vid.conheight = 240;*/
976 SCR_SetUpToDrawConsole();
978 // determine size of refresh window
982 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
983 void CL_UpdateScreen(void)
985 if (!scr_initialized || !con_initialized || vid_hidden)
986 return; // not initialized yet
988 if (cl_avidemo.integer)
989 SCR_CaptureAVIDemo();
991 cl_avidemo_frame = 0;
993 if (cls.signon == SIGNONS)
994 R_TimeReport("other");
996 CL_SetupScreenSize();
1000 if (cls.signon == SIGNONS)
1001 R_TimeReport("setup");
1003 //FIXME: force menu if nothing else to look at?
1004 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
1006 if (scr_drawloading)
1008 scr_drawloading = false;
1013 if (cls.signon == SIGNONS)
1020 SCR_CheckDrawCenterString();
1025 if (cls.signon == SIGNONS)
1029 R_TimeReport_Start();
1031 R_Shadow_EditLights_DrawSelectedLightProperties();
1038 void CL_Screen_NewMap(void)