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 vid_pixelaspect = {CVAR_SAVE, "vid_pixelaspect", "1"};
21 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
22 cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"};
23 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"};
24 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
26 int jpeg_supported = false;
28 qboolean scr_initialized; // ready to draw
30 float scr_con_current;
31 float scr_conlines; // lines of console to display
36 qboolean scr_drawloading = false;
38 void DrawCrosshair(int num);
39 static void SCR_ScreenShot_f (void);
40 static void R_Envmap_f (void);
43 void R_ClearScreen(void);
46 ===============================================================================
50 ===============================================================================
53 char scr_centerstring[1024];
54 float scr_centertime_start; // for slow victory printing
55 float scr_centertime_off;
64 Called for important messages that should stay in the center of the screen
68 void SCR_CenterPrint(char *str)
70 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
71 scr_centertime_off = scr_centertime.value;
72 scr_centertime_start = cl.time;
74 // count the number of lines for centering
85 void SCR_DrawCenterString (void)
92 // the finale prints the characters one at a time
94 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
99 start = scr_centerstring;
101 if (scr_center_lines <= 4)
102 y = vid.conheight*0.35;
108 // scan the width of the line
109 for (l=0 ; l<40 ; l++)
110 if (start[l] == '\n' || !start[l])
112 x = (vid.conwidth - l*8)/2;
117 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
125 while (*start && *start != '\n')
130 start++; // skip the \n
134 void SCR_CheckDrawCenterString (void)
136 if (scr_center_lines > scr_erase_lines)
137 scr_erase_lines = scr_center_lines;
139 scr_centertime_off -= host_frametime;
141 // don't draw if this is a normal stats-screen intermission,
142 // only if it is not an intermission, or a finale intermission
143 if (cl.intermission == 1)
145 if (scr_centertime_off <= 0 && !cl.intermission)
147 if (key_dest != key_game)
150 SCR_DrawCenterString ();
158 void SCR_DrawTurtle (void)
162 if (cls.state != ca_connected)
165 if (!scr_showturtle.integer)
168 if (host_frametime < 0.1)
178 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
186 void SCR_DrawNet (void)
188 if (cls.state != ca_connected)
190 if (realtime - cl.last_received_message < 0.3)
192 if (cls.demoplayback)
195 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
203 void SCR_DrawPause (void)
207 if (cls.state != ca_connected)
210 if (!scr_showpause.integer) // turn off for screenshots
216 pic = Draw_CachePic ("gfx/pause.lmp");
217 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
227 void SCR_DrawLoading (void)
231 pic = Draw_CachePic ("gfx/loading.lmp");
232 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
237 //=============================================================================
242 SCR_SetUpToDrawConsole
245 void SCR_SetUpToDrawConsole (void)
249 if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
250 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
252 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
254 // decide on the height of the console
255 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
256 scr_conlines = vid.conheight; // full screen
257 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
258 scr_conlines = vid.conheight/2; // half screen
260 scr_conlines = 0; // none visible
262 if (scr_conspeed.value)
264 if (scr_conlines < scr_con_current)
266 scr_con_current -= scr_conspeed.value*host_realframetime;
267 if (scr_conlines > scr_con_current)
268 scr_con_current = scr_conlines;
271 else if (scr_conlines > scr_con_current)
273 scr_con_current += scr_conspeed.value*host_realframetime;
274 if (scr_conlines < scr_con_current)
275 scr_con_current = scr_conlines;
279 scr_con_current = scr_conlines;
287 void SCR_DrawConsole (void)
291 Con_DrawConsole (scr_con_current);
296 if (key_dest == key_game || key_dest == key_message)
297 Con_DrawNotify (); // only draw notify in game
303 SCR_BeginLoadingPlaque
307 void SCR_BeginLoadingPlaque (void)
312 S_StopAllSounds (true);
314 scr_drawloading = true;
316 scr_drawloading = true;
320 //=============================================================================
322 char r_speeds_string[1024];
323 int speedstringcount, r_timereport_active;
324 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
326 void R_TimeReport(char *desc)
332 if (!r_timereport_active)
335 r_timereport_temp = r_timereport_current;
336 r_timereport_current = Sys_DoubleTime();
337 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
339 sprintf(tempbuf, "%8i %s", t, desc);
340 length = strlen(tempbuf);
342 tempbuf[length++] = ' ';
344 if (speedstringcount + length > (vid.conwidth / 8))
346 strcat(r_speeds_string, "\n");
347 speedstringcount = 0;
349 // skip the space at the beginning if it's the first on the line
350 if (speedstringcount == 0)
352 strcat(r_speeds_string, tempbuf + 1);
353 speedstringcount = length - 1;
357 strcat(r_speeds_string, tempbuf);
358 speedstringcount += length;
362 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
363 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
364 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
365 void R_TimeReport_Start(void)
367 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
368 r_speeds_string[0] = 0;
369 if (r_timereport_active)
371 speedstringcount = 0;
372 sprintf(r_speeds_string,
373 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
374 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
375 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
376 "%6i modeltris%6i meshs%6i meshtris\n",
377 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
378 c_faces, c_nodes, c_leafs, c_light_polys,
379 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
380 c_alias_polys, c_meshs, c_meshelements / 3);
382 sprintf(r_speeds_string + strlen(r_speeds_string),
383 "realtime lighting:%4i lights%4i clears%4i scissored\n"
384 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
385 "precomputed: %6i shadowmeshes%6i shadowtris\n",
386 c_rt_lights, c_rt_clears, c_rt_scissored,
387 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
388 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
402 r_timereport_start = Sys_DoubleTime();
406 void R_TimeReport_End(void)
408 r_timereport_current = r_timereport_start;
409 R_TimeReport("total");
411 if (r_timereport_active)
415 for (i = 0;r_speeds_string[i];i++)
416 if (r_speeds_string[i] == '\n')
418 y = vid.conheight - sb_lines - lines * 8;
420 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
421 while (r_speeds_string[i])
424 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
427 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
428 if (r_speeds_string[i] == '\n')
442 void SCR_SizeUp_f (void)
444 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
455 void SCR_SizeDown_f (void)
457 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
460 void CL_Screen_Init(void)
462 Cvar_RegisterVariable (&scr_fov);
463 Cvar_RegisterVariable (&scr_viewsize);
464 Cvar_RegisterVariable (&scr_conspeed);
465 Cvar_RegisterVariable (&scr_conalpha);
466 Cvar_RegisterVariable (&scr_conbrightness);
467 Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
468 Cvar_RegisterVariable (&scr_showram);
469 Cvar_RegisterVariable (&scr_showturtle);
470 Cvar_RegisterVariable (&scr_showpause);
471 Cvar_RegisterVariable (&scr_centertime);
472 Cvar_RegisterVariable (&scr_printspeed);
473 Cvar_RegisterVariable (&vid_conwidth);
474 Cvar_RegisterVariable (&vid_conheight);
475 Cvar_RegisterVariable (&vid_pixelaspect);
476 Cvar_RegisterVariable (&scr_screenshot_jpeg);
477 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
478 Cvar_RegisterVariable (&cl_avidemo);
480 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
481 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
482 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
483 Cmd_AddCommand ("envmap", R_Envmap_f);
485 scr_initialized = true;
488 void DrawQ_Clear(void)
490 r_refdef.drawqueuesize = 0;
493 static int picelements[6] = {0, 1, 2, 0, 2, 3};
494 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
496 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);
499 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)
504 if (alpha < (1.0f / 255.0f))
507 len = strlen(string);
509 for (len = 0;len < maxlen && string[len];len++);
510 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
511 for (;len > 0 && string[len - 1] == ' ';len--);
514 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
516 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
517 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
519 red = bound(0, red, 1);
520 green = bound(0, green, 1);
521 blue = bound(0, blue, 1);
522 alpha = bound(0, alpha, 1);
523 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
525 dq->command = DRAWQUEUE_STRING;
527 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));
532 out = (char *)(dq + 1);
533 memcpy(out, string, len);
535 r_refdef.drawqueuesize += dq->size;
538 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
540 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);
543 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)
547 drawqueuemesh_t mesh;
548 memset(&mesh, 0, sizeof(mesh));
549 if (picname && picname[0])
551 pic = Draw_CachePic(picname);
555 height = pic->height;
556 mesh.texture = pic->tex;
558 mesh.num_triangles = 2;
559 mesh.num_vertices = 4;
560 mesh.data_element3i = picelements;
561 mesh.data_vertex3f = floats;
562 mesh.data_texcoord2f = floats + 12;
563 mesh.data_color4f = floats + 20;
564 memset(floats, 0, sizeof(floats));
565 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
566 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
567 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
568 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
569 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;
570 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;
571 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;
572 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;
573 DrawQ_Mesh (&mesh, flags);
576 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
583 size += sizeof(drawqueuemesh_t);
584 size += sizeof(int[3]) * mesh->num_triangles;
585 size += sizeof(float[3]) * mesh->num_vertices;
586 size += sizeof(float[2]) * mesh->num_vertices;
587 size += sizeof(float[4]) * mesh->num_vertices;
588 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
590 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
592 dq->command = DRAWQUEUE_MESH;
599 p = (void *)(dq + 1);
600 m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
601 m->num_triangles = mesh->num_triangles;
602 m->num_vertices = mesh->num_vertices;
603 m->texture = mesh->texture;
604 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]);
605 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]);
606 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]);
607 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]);
608 r_refdef.drawqueuesize += dq->size;
611 void DrawQ_SetClipArea(float x, float y, float width, float height)
614 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
616 Con_DPrint("DrawQueue full !\n");
619 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
620 dq->size = sizeof(*dq);
621 dq->command = DRAWQUEUE_SETCLIP;
629 r_refdef.drawqueuesize += dq->size;
632 void DrawQ_ResetClipArea(void)
635 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
637 Con_DPrint("DrawQueue full !\n");
640 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
641 dq->size = sizeof(*dq);
642 dq->command = DRAWQUEUE_RESETCLIP;
650 r_refdef.drawqueuesize += dq->size;
658 void SCR_ScreenShot_f (void)
660 static int shotnumber;
661 static char oldname[MAX_QPATH];
662 char base[MAX_QPATH];
663 char filename[MAX_QPATH];
667 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
669 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
671 if (strcmp (oldname, scr_screenshot_name.string))
673 sprintf(oldname, "%s", scr_screenshot_name.string);
677 // find a file name to save it to
678 for (;shotnumber < 1000000;shotnumber++)
679 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
681 if (shotnumber >= 1000000)
683 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
688 sprintf(filename, "%s%06d.jpg", base, shotnumber);
690 sprintf(filename, "%s%06d.tga", base, shotnumber);
692 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
693 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
694 buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
696 if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
697 Con_Printf("Wrote %s\n", filename);
699 Con_Printf("unable to write %s\n", filename);
708 static int cl_avidemo_frame = 0;
710 void SCR_CaptureAVIDemo(void)
712 static qbyte *avi_buffer1 = NULL;
713 static qbyte *avi_buffer2 = NULL;
714 static qbyte *avi_buffer3 = NULL;
716 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
718 if (cl_avidemo.integer)
720 if (avi_buffer1 == NULL)
722 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
723 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
724 avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
729 if (avi_buffer1 != NULL)
731 Mem_Free (avi_buffer1);
732 Mem_Free (avi_buffer2);
733 Mem_Free (avi_buffer3);
738 cl_avidemo_frame = 0;
743 sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame);
745 sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame);
747 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
751 Cvar_SetValueQuick(&cl_avidemo, 0);
752 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
753 cl_avidemo_frame = 0;
761 Grab six views for environment mapping tests
768 qboolean flipx, flipy, flipdiagonaly;
772 {{ 0, 0, 0}, "rt", true, false, false},
773 {{ 0, 90, 0}, "ft", true, false, false},
774 {{ 0, 180, 0}, "lf", true, false, false},
775 {{ 0, 270, 0}, "bk", true, false, false},
776 {{-90, 180, 0}, "up", false, true, false},
777 {{ 90, 180, 0}, "dn", false, true, false},
779 {{ 0, 0, 0}, "px", true, true, true},
780 {{ 0, 90, 0}, "py", false, true, false},
781 {{ 0, 180, 0}, "nx", false, false, true},
782 {{ 0, 270, 0}, "ny", true, false, false},
783 {{-90, 180, 0}, "pz", false, false, true},
784 {{ 90, 180, 0}, "nz", false, false, true}
787 static void R_Envmap_f (void)
790 char filename[256], basename[256];
797 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");
801 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
802 size = atoi(Cmd_Argv(2));
803 if (size != 128 && size != 256 && size != 512 && size != 1024)
805 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
808 if (size > vid.realwidth || size > vid.realheight)
810 Con_Print("envmap: your resolution is not big enough to render that size\n");
818 r_refdef.width = size;
819 r_refdef.height = size;
824 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
825 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
826 buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
828 for (j = 0;j < 12;j++)
830 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
831 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);
836 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);
846 //=============================================================================
848 // LordHavoc: SHOWLMP stuff
849 #define SHOWLMP_MAXLABELS 256
850 typedef struct showlmp_s
860 showlmp_t showlmp[SHOWLMP_MAXLABELS];
862 void SHOWLMP_decodehide(void)
866 lmplabel = MSG_ReadString();
867 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
868 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
870 showlmp[i].isactive = false;
875 void SHOWLMP_decodeshow(void)
878 qbyte lmplabel[256], picname[256];
880 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
881 strlcpy (picname, MSG_ReadString(), sizeof (picname));
882 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
893 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
894 if (showlmp[i].isactive)
896 if (strcmp(showlmp[i].label, lmplabel) == 0)
899 break; // drop out to replace it
902 else if (k < 0) // find first empty one to replace
905 return; // none found to replace
906 // change existing one
907 showlmp[k].isactive = true;
908 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
909 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
914 void SHOWLMP_drawall(void)
917 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
918 if (showlmp[i].isactive)
919 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
922 void SHOWLMP_clear(void)
925 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
926 showlmp[i].isactive = false;
929 void CL_SetupScreenSize(void)
931 float conwidth, conheight;
933 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
935 VID_UpdateGamma(false);
937 conwidth = bound(320, vid_conwidth.value, 2048);
938 conheight = bound(200, vid_conheight.value, 1536);
939 if (vid_conwidth.value != conwidth)
940 Cvar_SetValue("vid_conwidth", conwidth);
941 if (vid_conheight.value != conheight)
942 Cvar_SetValue("vid_conheight", conheight);
944 vid.conwidth = vid_conwidth.integer;
945 vid.conheight = vid_conheight.integer;
947 /* if (vid.realheight > 240)
949 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
950 vid.conheight = bound(240, vid.conheight, vid.realheight);
953 vid.conheight = 240;*/
955 SCR_SetUpToDrawConsole();
958 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
959 void CL_UpdateScreen(void)
961 if (!scr_initialized || !con_initialized || vid_hidden)
962 return; // not initialized yet
964 SCR_CaptureAVIDemo();
966 if (cls.signon == SIGNONS)
967 R_TimeReport("other");
969 CL_SetupScreenSize();
973 if (cls.signon == SIGNONS)
974 R_TimeReport("setup");
976 //FIXME: force menu if nothing else to look at?
977 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
981 scr_drawloading = false;
986 if (cls.signon == SIGNONS)
993 SCR_CheckDrawCenterString();
999 if (cls.signon == SIGNONS)
1003 R_TimeReport_Start();
1005 R_Shadow_EditLights_DrawSelectedLightProperties();
1012 void CL_Screen_NewMap(void)