5 #include "cl_collision.h"
7 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
8 cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 1 - 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_conforcewhiledisconnected = {CVAR_SAVE, "scr_conforcewhiledisconnected", "1"};
13 cvar_t scr_centertime = {0, "scr_centertime","2"};
14 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
15 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
16 cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
17 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
18 cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
19 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
20 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
21 cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
22 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
23 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
25 int jpeg_supported = false;
27 qboolean scr_initialized; // ready to draw
29 float scr_con_current;
30 float scr_conlines; // lines of console to display
35 qboolean scr_drawloading = false;
37 void DrawCrosshair(int num);
38 static void SCR_ScreenShot_f (void);
39 static void R_Envmap_f (void);
42 void R_ClearScreen(void);
45 ===============================================================================
49 ===============================================================================
52 char scr_centerstring[1024];
53 float scr_centertime_start; // for slow victory printing
54 float scr_centertime_off;
63 Called for important messages that should stay in the center of the screen
67 void SCR_CenterPrint(char *str)
69 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
70 scr_centertime_off = scr_centertime.value;
71 scr_centertime_start = cl.time;
73 // count the number of lines for centering
84 void SCR_DrawCenterString (void)
91 // the finale prints the characters one at a time
93 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
98 start = scr_centerstring;
100 if (scr_center_lines <= 4)
101 y = vid.conheight*0.35;
107 // scan the width of the line
108 for (l=0 ; l<40 ; l++)
109 if (start[l] == '\n' || !start[l])
111 x = (vid.conwidth - l*8)/2;
116 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
124 while (*start && *start != '\n')
129 start++; // skip the \n
133 void SCR_CheckDrawCenterString (void)
135 if (scr_center_lines > scr_erase_lines)
136 scr_erase_lines = scr_center_lines;
138 scr_centertime_off -= host_frametime;
140 // don't draw if this is a normal stats-screen intermission,
141 // only if it is not an intermission, or a finale intermission
142 if (cl.intermission == 1)
144 if (scr_centertime_off <= 0 && !cl.intermission)
146 if (key_dest != key_game)
149 SCR_DrawCenterString ();
157 void SCR_DrawTurtle (void)
161 if (cls.state != ca_connected)
164 if (!scr_showturtle.integer)
167 if (host_frametime < 0.1)
177 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
185 void SCR_DrawNet (void)
187 if (cls.state != ca_connected)
189 if (realtime - cl.last_received_message < 0.3)
191 if (cls.demoplayback)
194 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
202 void SCR_DrawPause (void)
206 if (cls.state != ca_connected)
209 if (!scr_showpause.integer) // turn off for screenshots
215 pic = Draw_CachePic ("gfx/pause.lmp");
216 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
226 void SCR_DrawLoading (void)
230 pic = Draw_CachePic ("gfx/loading.lmp");
231 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
236 //=============================================================================
241 SCR_SetUpToDrawConsole
244 void SCR_SetUpToDrawConsole (void)
248 if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
249 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
251 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
253 // decide on the height of the console
254 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
255 scr_conlines = vid.conheight; // full screen
256 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
257 scr_conlines = vid.conheight/2; // half screen
259 scr_conlines = 0; // none visible
261 if (scr_conspeed.value)
263 if (scr_conlines < scr_con_current)
265 scr_con_current -= scr_conspeed.value*host_realframetime;
266 if (scr_conlines > scr_con_current)
267 scr_con_current = scr_conlines;
270 else if (scr_conlines > scr_con_current)
272 scr_con_current += scr_conspeed.value*host_realframetime;
273 if (scr_conlines < scr_con_current)
274 scr_con_current = scr_conlines;
278 scr_con_current = scr_conlines;
286 void SCR_DrawConsole (void)
290 Con_DrawConsole (scr_con_current);
295 if (key_dest == key_game || key_dest == key_message)
296 Con_DrawNotify (); // only draw notify in game
302 SCR_BeginLoadingPlaque
306 void SCR_BeginLoadingPlaque (void)
311 S_StopAllSounds (true);
313 scr_drawloading = true;
315 scr_drawloading = true;
319 //=============================================================================
321 char r_speeds_string[1024];
322 int speedstringcount, r_timereport_active;
323 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
325 void R_TimeReport(char *desc)
331 if (!r_timereport_active)
334 r_timereport_temp = r_timereport_current;
335 r_timereport_current = Sys_DoubleTime();
336 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
338 sprintf(tempbuf, "%8i %s", t, desc);
339 length = strlen(tempbuf);
341 tempbuf[length++] = ' ';
343 if (speedstringcount + length > (vid.conwidth / 8))
345 strcat(r_speeds_string, "\n");
346 speedstringcount = 0;
348 // skip the space at the beginning if it's the first on the line
349 if (speedstringcount == 0)
351 strcat(r_speeds_string, tempbuf + 1);
352 speedstringcount = length - 1;
356 strcat(r_speeds_string, tempbuf);
357 speedstringcount += length;
361 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
362 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
363 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
364 void R_TimeReport_Start(void)
366 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
367 r_speeds_string[0] = 0;
368 if (r_timereport_active)
370 speedstringcount = 0;
371 sprintf(r_speeds_string,
372 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
373 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
374 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
375 "%6i modeltris%6i meshs%6i meshtris\n",
376 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
377 c_faces, c_nodes, c_leafs, c_light_polys,
378 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
379 c_alias_polys, c_meshs, c_meshelements / 3);
381 sprintf(r_speeds_string + strlen(r_speeds_string),
382 "realtime lighting:%4i lights%4i clears%4i scissored\n"
383 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
384 "precomputed: %6i shadowmeshes%6i shadowtris\n",
385 c_rt_lights, c_rt_clears, c_rt_scissored,
386 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
387 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
401 r_timereport_start = Sys_DoubleTime();
405 void R_TimeReport_End(void)
407 r_timereport_current = r_timereport_start;
408 R_TimeReport("total");
410 if (r_timereport_active)
414 for (i = 0;r_speeds_string[i];i++)
415 if (r_speeds_string[i] == '\n')
417 y = vid.conheight - sb_lines - lines * 8;
419 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
420 while (r_speeds_string[i])
423 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
426 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
427 if (r_speeds_string[i] == '\n')
441 void SCR_SizeUp_f (void)
443 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
454 void SCR_SizeDown_f (void)
456 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
459 void CL_Screen_Init(void)
461 Cvar_RegisterVariable (&scr_fov);
462 Cvar_RegisterVariable (&scr_viewsize);
463 Cvar_RegisterVariable (&scr_conspeed);
464 Cvar_RegisterVariable (&scr_conalpha);
465 Cvar_RegisterVariable (&scr_conbrightness);
466 Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
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 (&scr_screenshot_jpeg_quality);
476 Cvar_RegisterVariable (&cl_avidemo);
478 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
479 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
480 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
481 Cmd_AddCommand ("envmap", R_Envmap_f);
483 scr_initialized = true;
486 void DrawQ_Clear(void)
488 r_refdef.drawqueuesize = 0;
491 static int picelements[6] = {0, 1, 2, 0, 2, 3};
492 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
494 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);
497 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)
502 if (alpha < (1.0f / 255.0f))
505 len = strlen(string);
507 for (len = 0;len < maxlen && string[len];len++);
508 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
509 for (;len > 0 && string[len - 1] == ' ';len--);
512 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
514 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
515 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
517 red = bound(0, red, 1);
518 green = bound(0, green, 1);
519 blue = bound(0, blue, 1);
520 alpha = bound(0, alpha, 1);
521 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
523 dq->command = DRAWQUEUE_STRING;
525 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));
530 out = (char *)(dq + 1);
531 memcpy(out, string, len);
533 r_refdef.drawqueuesize += dq->size;
536 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
538 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);
541 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)
545 drawqueuemesh_t mesh;
546 memset(&mesh, 0, sizeof(mesh));
547 if (picname && picname[0])
549 pic = Draw_CachePic(picname);
553 height = pic->height;
554 mesh.texture = pic->tex;
556 mesh.num_triangles = 2;
557 mesh.num_vertices = 4;
558 mesh.data_element3i = picelements;
559 mesh.data_vertex3f = floats;
560 mesh.data_texcoord2f = floats + 12;
561 mesh.data_color4f = floats + 20;
562 memset(floats, 0, sizeof(floats));
563 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
564 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
565 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
566 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
567 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;
568 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;
569 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;
570 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;
571 DrawQ_Mesh (&mesh, flags);
574 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
581 size += sizeof(drawqueuemesh_t);
582 size += sizeof(int[3]) * mesh->num_triangles;
583 size += sizeof(float[3]) * mesh->num_vertices;
584 size += sizeof(float[2]) * mesh->num_vertices;
585 size += sizeof(float[4]) * mesh->num_vertices;
586 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
588 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
590 dq->command = DRAWQUEUE_MESH;
597 p = (void *)(dq + 1);
598 m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
599 m->num_triangles = mesh->num_triangles;
600 m->num_vertices = mesh->num_vertices;
601 m->texture = mesh->texture;
602 m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (qbyte*)p + m->num_triangles * sizeof(int[3]);
603 m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));p = (qbyte*)p + m->num_vertices * sizeof(float[3]);
604 m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));p = (qbyte*)p + m->num_vertices * sizeof(float[2]);
605 m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));p = (qbyte*)p + m->num_vertices * sizeof(float[4]);
606 r_refdef.drawqueuesize += dq->size;
609 void DrawQ_SetClipArea(float x, float y, float width, float height)
612 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
614 Con_DPrint("DrawQueue full !\n");
617 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
618 dq->size = sizeof(*dq);
619 dq->command = DRAWQUEUE_SETCLIP;
627 r_refdef.drawqueuesize += dq->size;
630 void DrawQ_ResetClipArea(void)
633 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
635 Con_DPrint("DrawQueue full !\n");
638 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
639 dq->size = sizeof(*dq);
640 dq->command = DRAWQUEUE_RESETCLIP;
648 r_refdef.drawqueuesize += dq->size;
656 void SCR_ScreenShot_f (void)
658 static int shotnumber;
659 static char oldname[MAX_QPATH];
660 char base[MAX_QPATH];
661 char filename[MAX_QPATH];
665 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
667 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
669 if (strcmp (oldname, scr_screenshot_name.string))
671 sprintf(oldname, "%s", scr_screenshot_name.string);
675 // find a file name to save it to
676 for (;shotnumber < 1000000;shotnumber++)
677 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
679 if (shotnumber >= 1000000)
681 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
686 sprintf(filename, "%s%06d.jpg", base, shotnumber);
688 sprintf(filename, "%s%06d.tga", base, shotnumber);
690 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
691 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
692 buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
694 if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
695 Con_Printf("Wrote %s\n", filename);
697 Con_Printf("unable to write %s\n", filename);
706 static int cl_avidemo_frame = 0;
708 void SCR_CaptureAVIDemo(void)
710 static qbyte *avi_buffer1 = NULL;
711 static qbyte *avi_buffer2 = NULL;
712 static qbyte *avi_buffer3 = NULL;
714 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
716 if (cl_avidemo.integer)
718 if (avi_buffer1 == NULL)
720 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
721 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
722 avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
727 if (avi_buffer1 != NULL)
729 Mem_Free (avi_buffer1);
730 Mem_Free (avi_buffer2);
731 Mem_Free (avi_buffer3);
736 cl_avidemo_frame = 0;
741 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
743 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
745 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
749 Cvar_SetValueQuick(&cl_avidemo, 0);
750 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
751 cl_avidemo_frame = 0;
759 Grab six views for environment mapping tests
766 qboolean flipx, flipy, flipdiagonaly;
770 {{ 0, 0, 0}, "rt", true, false, false},
771 {{ 0, 90, 0}, "ft", true, false, false},
772 {{ 0, 180, 0}, "lf", true, false, false},
773 {{ 0, 270, 0}, "bk", true, false, false},
774 {{-90, 180, 0}, "up", false, true, false},
775 {{ 90, 180, 0}, "dn", false, true, false},
777 {{ 0, 0, 0}, "px", true, true, true},
778 {{ 0, 90, 0}, "py", false, true, false},
779 {{ 0, 180, 0}, "nx", false, false, true},
780 {{ 0, 270, 0}, "ny", true, false, false},
781 {{-90, 180, 0}, "pz", false, false, true},
782 {{ 90, 180, 0}, "nz", false, false, true}
785 static void R_Envmap_f (void)
788 char filename[256], basename[256];
795 Con_Print("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");
799 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
800 size = atoi(Cmd_Argv(2));
801 if (size != 128 && size != 256 && size != 512 && size != 1024)
803 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
806 if (size > vid.realwidth || size > vid.realheight)
808 Con_Print("envmap: your resolution is not big enough to render that size\n");
816 r_refdef.width = size;
817 r_refdef.height = size;
822 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
823 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
824 buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
826 for (j = 0;j < 12;j++)
828 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
829 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);
834 SCR_ScreenShot(filename, buffer1, buffer2, buffer3, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false);
844 //=============================================================================
846 // LordHavoc: SHOWLMP stuff
847 #define SHOWLMP_MAXLABELS 256
848 typedef struct showlmp_s
858 showlmp_t showlmp[SHOWLMP_MAXLABELS];
860 void SHOWLMP_decodehide(void)
864 lmplabel = MSG_ReadString();
865 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
866 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
868 showlmp[i].isactive = false;
873 void SHOWLMP_decodeshow(void)
876 qbyte lmplabel[256], picname[256];
878 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
879 strlcpy (picname, MSG_ReadString(), sizeof (picname));
880 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
891 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
892 if (showlmp[i].isactive)
894 if (strcmp(showlmp[i].label, lmplabel) == 0)
897 break; // drop out to replace it
900 else if (k < 0) // find first empty one to replace
903 return; // none found to replace
904 // change existing one
905 showlmp[k].isactive = true;
906 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
907 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
912 void SHOWLMP_drawall(void)
915 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
916 if (showlmp[i].isactive)
917 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
920 void SHOWLMP_clear(void)
923 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
924 showlmp[i].isactive = false;
927 void CL_SetupScreenSize(void)
929 float conwidth, conheight;
931 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
933 VID_UpdateGamma(false);
935 conwidth = bound(320, vid_conwidth.value, 2048);
936 conheight = bound(200, vid_conheight.value, 1536);
937 if (vid_conwidth.value != conwidth)
938 Cvar_SetValue("vid_conwidth", conwidth);
939 if (vid_conheight.value != conheight)
940 Cvar_SetValue("vid_conheight", conheight);
942 vid.conwidth = vid_conwidth.integer;
943 vid.conheight = vid_conheight.integer;
945 /* if (vid.realheight > 240)
947 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
948 vid.conheight = bound(240, vid.conheight, vid.realheight);
951 vid.conheight = 240;*/
953 SCR_SetUpToDrawConsole();
956 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
957 void CL_UpdateScreen(void)
959 if (!scr_initialized || !con_initialized || vid_hidden)
960 return; // not initialized yet
962 SCR_CaptureAVIDemo();
964 if (cls.signon == SIGNONS)
965 R_TimeReport("other");
967 CL_SetupScreenSize();
971 if (cls.signon == SIGNONS)
972 R_TimeReport("setup");
974 //FIXME: force menu if nothing else to look at?
975 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
979 scr_drawloading = false;
984 if (cls.signon == SIGNONS)
991 SCR_CheckDrawCenterString();
997 if (cls.signon == SIGNONS)
1001 R_TimeReport_Start();
1003 R_Shadow_EditLights_DrawSelectedLightProperties();
1010 void CL_Screen_NewMap(void)