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"};
25 cvar_t r_textshadow = {0, "r_textshadow", "0"};
26 cvar_t r_letterbox = {0, "r_letterbox", "0"};
28 int jpeg_supported = false;
30 qboolean scr_initialized; // ready to draw
32 float scr_con_current;
33 float scr_conlines; // lines of console to display
35 extern int con_vislines;
37 qboolean scr_drawloading = false;
39 void DrawCrosshair(int num);
40 static void SCR_ScreenShot_f (void);
41 static void R_Envmap_f (void);
44 void R_ClearScreen(void);
47 ===============================================================================
51 ===============================================================================
54 char scr_centerstring[1024];
55 float scr_centertime_start; // for slow victory printing
56 float scr_centertime_off;
65 Called for important messages that should stay in the center of the screen
69 void SCR_CenterPrint(char *str)
71 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
72 scr_centertime_off = scr_centertime.value;
73 scr_centertime_start = cl.time;
75 // count the number of lines for centering
86 void SCR_DrawCenterString (void)
93 // the finale prints the characters one at a time
95 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
100 start = scr_centerstring;
102 if (scr_center_lines <= 4)
103 y = vid.conheight*0.35;
109 // scan the width of the line
110 for (l=0 ; l<40 ; l++)
111 if (start[l] == '\n' || !start[l])
113 x = (vid.conwidth - l*8)/2;
118 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
126 while (*start && *start != '\n')
131 start++; // skip the \n
135 void SCR_CheckDrawCenterString (void)
137 if (scr_center_lines > scr_erase_lines)
138 scr_erase_lines = scr_center_lines;
140 scr_centertime_off -= host_frametime;
142 // don't draw if this is a normal stats-screen intermission,
143 // only if it is not an intermission, or a finale intermission
144 if (cl.intermission == 1)
146 if (scr_centertime_off <= 0 && !cl.intermission)
148 if (key_dest != key_game)
151 SCR_DrawCenterString ();
159 void SCR_DrawTurtle (void)
163 if (cls.state != ca_connected)
166 if (!scr_showturtle.integer)
169 if (host_frametime < 0.1)
179 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
187 void SCR_DrawNet (void)
189 if (cls.state != ca_connected)
191 if (realtime - cl.last_received_message < 0.3)
193 if (cls.demoplayback)
196 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
204 void SCR_DrawPause (void)
208 if (cls.state != ca_connected)
211 if (!scr_showpause.integer) // turn off for screenshots
217 pic = Draw_CachePic ("gfx/pause.lmp");
218 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
228 void SCR_DrawLoading (void)
232 pic = Draw_CachePic ("gfx/loading.lmp");
233 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
238 //=============================================================================
243 SCR_SetUpToDrawConsole
246 void SCR_SetUpToDrawConsole (void)
250 if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer)
251 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
253 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
255 // decide on the height of the console
256 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
257 scr_conlines = vid.conheight; // full screen
258 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
259 scr_conlines = vid.conheight/2; // half screen
261 scr_conlines = 0; // none visible
263 if (scr_conspeed.value)
265 if (scr_conlines < scr_con_current)
267 scr_con_current -= scr_conspeed.value*host_realframetime;
268 if (scr_conlines > scr_con_current)
269 scr_con_current = scr_conlines;
272 else if (scr_conlines > scr_con_current)
274 scr_con_current += scr_conspeed.value*host_realframetime;
275 if (scr_conlines < scr_con_current)
276 scr_con_current = scr_conlines;
280 scr_con_current = scr_conlines;
288 void SCR_DrawConsole (void)
291 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)
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 (&vid_pixelaspect);
475 Cvar_RegisterVariable (&scr_screenshot_jpeg);
476 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
477 Cvar_RegisterVariable (&cl_avidemo);
478 Cvar_RegisterVariable (&r_textshadow);
479 Cvar_RegisterVariable (&r_letterbox);
481 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
482 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
483 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
484 Cmd_AddCommand ("envmap", R_Envmap_f);
486 scr_initialized = true;
489 void DrawQ_Clear(void)
491 r_refdef.drawqueuesize = 0;
494 static int picelements[6] = {0, 1, 2, 0, 2, 3};
495 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
497 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);
500 void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
505 if (alpha < (1.0f / 255.0f))
508 len = strlen(string);
510 for (len = 0;len < maxlen && string[len];len++);
511 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
512 for (;len > 0 && string[len - 1] == ' ';len--);
515 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
517 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
518 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
520 red = bound(0, red, 1);
521 green = bound(0, green, 1);
522 blue = bound(0, blue, 1);
523 alpha = bound(0, alpha, 1);
524 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
526 dq->command = DRAWQUEUE_STRING;
528 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));
533 out = (char *)(dq + 1);
534 memcpy(out, string, len);
536 r_refdef.drawqueuesize += dq->size;
539 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)
541 if (r_textshadow.integer)
542 DrawQ_String_Real(x+scalex*0.25,y+scaley*0.25,string,maxlen,scalex,scaley,0,0,0,alpha*0.8,flags);
544 DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags);
547 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
549 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);
552 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)
556 drawqueuemesh_t mesh;
557 memset(&mesh, 0, sizeof(mesh));
558 if (picname && picname[0])
560 pic = Draw_CachePic(picname);
564 height = pic->height;
565 mesh.texture = pic->tex;
567 mesh.num_triangles = 2;
568 mesh.num_vertices = 4;
569 mesh.data_element3i = picelements;
570 mesh.data_vertex3f = floats;
571 mesh.data_texcoord2f = floats + 12;
572 mesh.data_color4f = floats + 20;
573 memset(floats, 0, sizeof(floats));
574 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
575 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
576 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
577 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
578 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;
579 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;
580 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;
581 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;
582 DrawQ_Mesh (&mesh, flags);
585 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
592 size += sizeof(drawqueuemesh_t);
593 size += sizeof(int[3]) * mesh->num_triangles;
594 size += sizeof(float[3]) * mesh->num_vertices;
595 size += sizeof(float[2]) * mesh->num_vertices;
596 size += sizeof(float[4]) * mesh->num_vertices;
597 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
599 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
601 dq->command = DRAWQUEUE_MESH;
608 p = (void *)(dq + 1);
609 m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
610 m->num_triangles = mesh->num_triangles;
611 m->num_vertices = mesh->num_vertices;
612 m->texture = mesh->texture;
613 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]);
614 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]);
615 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]);
616 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]);
617 r_refdef.drawqueuesize += dq->size;
620 void DrawQ_SetClipArea(float x, float y, float width, float height)
623 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
625 Con_DPrint("DrawQueue full !\n");
628 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
629 dq->size = sizeof(*dq);
630 dq->command = DRAWQUEUE_SETCLIP;
638 r_refdef.drawqueuesize += dq->size;
641 void DrawQ_ResetClipArea(void)
644 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
646 Con_DPrint("DrawQueue full !\n");
649 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
650 dq->size = sizeof(*dq);
651 dq->command = DRAWQUEUE_RESETCLIP;
659 r_refdef.drawqueuesize += dq->size;
667 void SCR_ScreenShot_f (void)
669 static int shotnumber;
670 static char oldname[MAX_QPATH];
671 char base[MAX_QPATH];
672 char filename[MAX_QPATH];
676 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
678 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
680 if (strcmp (oldname, scr_screenshot_name.string))
682 sprintf(oldname, "%s", scr_screenshot_name.string);
686 // find a file name to save it to
687 for (;shotnumber < 1000000;shotnumber++)
688 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
690 if (shotnumber >= 1000000)
692 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
696 sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
698 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
699 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
700 buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
702 if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
703 Con_Printf("Wrote %s\n", filename);
705 Con_Printf("unable to write %s\n", filename);
714 static int cl_avidemo_frame = 0;
716 void SCR_CaptureAVIDemo(void)
718 static qbyte *avi_buffer1 = NULL;
719 static qbyte *avi_buffer2 = NULL;
720 static qbyte *avi_buffer3 = NULL;
722 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
724 if (!cl_avidemo.integer)
726 if (avi_buffer1 != NULL)
728 Mem_Free (avi_buffer1);
729 Mem_Free (avi_buffer2);
730 Mem_Free (avi_buffer3);
735 cl_avidemo_frame = 0;
739 if (avi_buffer1 == NULL)
741 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
742 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
743 avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
746 sprintf(filename, "video/dp%06d.%s", cl_avidemo_frame, jpeg ? "jpg" : "tga");
748 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
752 Cvar_SetValueQuick(&cl_avidemo, 0);
753 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
754 cl_avidemo_frame = 0;
762 Grab six views for environment mapping tests
769 qboolean flipx, flipy, flipdiagonaly;
773 {{ 0, 0, 0}, "rt", true, false, false},
774 {{ 0, 90, 0}, "ft", true, false, false},
775 {{ 0, 180, 0}, "lf", true, false, false},
776 {{ 0, 270, 0}, "bk", true, false, false},
777 {{-90, 180, 0}, "up", false, true, false},
778 {{ 90, 180, 0}, "dn", false, true, false},
780 {{ 0, 0, 0}, "px", true, true, true},
781 {{ 0, 90, 0}, "py", false, true, false},
782 {{ 0, 180, 0}, "nx", false, false, true},
783 {{ 0, 270, 0}, "ny", true, false, false},
784 {{-90, 180, 0}, "pz", false, false, true},
785 {{ 90, 180, 0}, "nz", false, false, true}
788 static void R_Envmap_f (void)
791 char filename[256], basename[256];
798 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");
802 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
803 size = atoi(Cmd_Argv(2));
804 if (size != 128 && size != 256 && size != 512 && size != 1024)
806 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
809 if (size > vid.realwidth || size > vid.realheight)
811 Con_Print("envmap: your resolution is not big enough to render that size\n");
819 r_refdef.width = size;
820 r_refdef.height = size;
825 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
826 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
827 buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
829 for (j = 0;j < 12;j++)
831 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
832 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);
837 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);
847 //=============================================================================
849 // LordHavoc: SHOWLMP stuff
850 #define SHOWLMP_MAXLABELS 256
851 typedef struct showlmp_s
861 showlmp_t showlmp[SHOWLMP_MAXLABELS];
863 void SHOWLMP_decodehide(void)
867 lmplabel = MSG_ReadString();
868 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
869 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
871 showlmp[i].isactive = false;
876 void SHOWLMP_decodeshow(void)
879 qbyte lmplabel[256], picname[256];
881 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
882 strlcpy (picname, MSG_ReadString(), sizeof (picname));
883 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
894 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
895 if (showlmp[i].isactive)
897 if (strcmp(showlmp[i].label, lmplabel) == 0)
900 break; // drop out to replace it
903 else if (k < 0) // find first empty one to replace
906 return; // none found to replace
907 // change existing one
908 showlmp[k].isactive = true;
909 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
910 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
915 void SHOWLMP_drawall(void)
918 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
919 if (showlmp[i].isactive)
920 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
923 void SHOWLMP_clear(void)
926 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
927 showlmp[i].isactive = false;
930 void CL_SetupScreenSize(void)
932 float conwidth, conheight;
934 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
936 VID_UpdateGamma(false);
938 conwidth = bound(320, vid_conwidth.value, 2048);
939 conheight = bound(200, vid_conheight.value, 1536);
940 if (vid_conwidth.value != conwidth)
941 Cvar_SetValue("vid_conwidth", conwidth);
942 if (vid_conheight.value != conheight)
943 Cvar_SetValue("vid_conheight", conheight);
945 vid.conwidth = vid_conwidth.integer;
946 vid.conheight = vid_conheight.integer;
948 /* if (vid.realheight > 240)
950 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
951 vid.conheight = bound(240, vid.conheight, vid.realheight);
954 vid.conheight = 240;*/
956 SCR_SetUpToDrawConsole();
959 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
960 void CL_UpdateScreen(void)
962 if (!scr_initialized || !con_initialized || vid_hidden)
963 return; // not initialized yet
965 SCR_CaptureAVIDemo();
967 if (cls.signon == SIGNONS)
968 R_TimeReport("other");
970 CL_SetupScreenSize();
974 if (cls.signon == SIGNONS)
975 R_TimeReport("setup");
977 //FIXME: force menu if nothing else to look at?
978 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
982 scr_drawloading = false;
987 if (cls.signon == SIGNONS)
992 if (!r_letterbox.value)
995 SCR_CheckDrawCenterString();
1001 if (cls.signon == SIGNONS)
1005 R_TimeReport_Start();
1007 R_Shadow_EditLights_DrawSelectedLightProperties();
1014 void CL_Screen_NewMap(void)