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];
664 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
666 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
668 if (strcmp (oldname, scr_screenshot_name.string))
670 sprintf(oldname, "%s", scr_screenshot_name.string);
674 // find a file name to save it to
675 for (;shotnumber < 1000000;shotnumber++)
676 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
678 if (shotnumber >= 1000000)
680 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
685 sprintf(filename, "%s%06d.jpg", base, shotnumber);
687 sprintf(filename, "%s%06d.tga", base, shotnumber);
689 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
690 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
692 if (SCR_ScreenShot (filename, buffer1, buffer2, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
693 Con_Printf("Wrote %s\n", filename);
695 Con_Printf("unable to write %s\n", filename);
703 static int cl_avidemo_frame = 0;
705 void SCR_CaptureAVIDemo(void)
707 static qbyte *avi_buffer1 = NULL;
708 static qbyte *avi_buffer2 = NULL;
710 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
712 if (cl_avidemo.integer)
714 if (avi_buffer1 == NULL)
716 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
717 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
722 if (avi_buffer1 != NULL)
724 Mem_Free (avi_buffer1);
725 Mem_Free (avi_buffer2);
729 cl_avidemo_frame = 0;
734 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
736 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
738 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
742 Cvar_SetValueQuick(&cl_avidemo, 0);
743 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
744 cl_avidemo_frame = 0;
752 Grab six views for environment mapping tests
759 qboolean flipx, flipy, flipdiagonaly;
763 {{ 0, 0, 0}, "rt", true, false, false},
764 {{ 0, 90, 0}, "ft", true, false, false},
765 {{ 0, 180, 0}, "lf", true, false, false},
766 {{ 0, 270, 0}, "bk", true, false, false},
767 {{-90, 180, 0}, "up", false, true, false},
768 {{ 90, 180, 0}, "dn", false, true, false},
770 {{ 0, 0, 0}, "px", true, true, true},
771 {{ 0, 90, 0}, "py", false, true, false},
772 {{ 0, 180, 0}, "nx", false, false, true},
773 {{ 0, 270, 0}, "ny", true, false, false},
774 {{-90, 180, 0}, "pz", false, false, true},
775 {{ 90, 180, 0}, "nz", false, false, true}
778 static void R_Envmap_f (void)
781 char filename[256], basename[256];
787 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");
791 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
792 size = atoi(Cmd_Argv(2));
793 if (size != 128 && size != 256 && size != 512 && size != 1024)
795 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
798 if (size > vid.realwidth || size > vid.realheight)
800 Con_Print("envmap: your resolution is not big enough to render that size\n");
808 r_refdef.width = size;
809 r_refdef.height = size;
814 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
815 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
817 for (j = 0;j < 12;j++)
819 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
820 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);
825 SCR_ScreenShot(filename, buffer1, buffer2, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false);
834 //=============================================================================
836 // LordHavoc: SHOWLMP stuff
837 #define SHOWLMP_MAXLABELS 256
838 typedef struct showlmp_s
848 showlmp_t showlmp[SHOWLMP_MAXLABELS];
850 void SHOWLMP_decodehide(void)
854 lmplabel = MSG_ReadString();
855 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
856 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
858 showlmp[i].isactive = false;
863 void SHOWLMP_decodeshow(void)
866 qbyte lmplabel[256], picname[256];
868 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
869 strlcpy (picname, MSG_ReadString(), sizeof (picname));
870 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
881 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
882 if (showlmp[i].isactive)
884 if (strcmp(showlmp[i].label, lmplabel) == 0)
887 break; // drop out to replace it
890 else if (k < 0) // find first empty one to replace
893 return; // none found to replace
894 // change existing one
895 showlmp[k].isactive = true;
896 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
897 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
902 void SHOWLMP_drawall(void)
905 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
906 if (showlmp[i].isactive)
907 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
910 void SHOWLMP_clear(void)
913 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
914 showlmp[i].isactive = false;
917 void CL_SetupScreenSize(void)
919 float conwidth, conheight;
921 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
923 VID_UpdateGamma(false);
925 conwidth = bound(320, vid_conwidth.value, 2048);
926 conheight = bound(200, vid_conheight.value, 1536);
927 if (vid_conwidth.value != conwidth)
928 Cvar_SetValue("vid_conwidth", conwidth);
929 if (vid_conheight.value != conheight)
930 Cvar_SetValue("vid_conheight", conheight);
932 vid.conwidth = vid_conwidth.integer;
933 vid.conheight = vid_conheight.integer;
935 /* if (vid.realheight > 240)
937 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
938 vid.conheight = bound(240, vid.conheight, vid.realheight);
941 vid.conheight = 240;*/
943 SCR_SetUpToDrawConsole();
946 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
947 void CL_UpdateScreen(void)
949 if (!scr_initialized || !con_initialized || vid_hidden)
950 return; // not initialized yet
952 SCR_CaptureAVIDemo();
954 if (cls.signon == SIGNONS)
955 R_TimeReport("other");
957 CL_SetupScreenSize();
961 if (cls.signon == SIGNONS)
962 R_TimeReport("setup");
964 //FIXME: force menu if nothing else to look at?
965 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
969 scr_drawloading = false;
974 if (cls.signon == SIGNONS)
981 SCR_CheckDrawCenterString();
987 if (cls.signon == SIGNONS)
991 R_TimeReport_Start();
993 R_Shadow_EditLights_DrawSelectedLightProperties();
1000 void CL_Screen_NewMap(void)