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"};
27 int jpeg_supported = false;
29 qboolean scr_initialized; // ready to draw
31 float scr_con_current;
32 float scr_conlines; // lines of console to display
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)
292 Con_DrawConsole (scr_con_current);
297 if (key_dest == key_game || key_dest == key_message)
298 Con_DrawNotify (); // only draw notify in game
304 SCR_BeginLoadingPlaque
308 void SCR_BeginLoadingPlaque (void)
313 S_StopAllSounds (true);
315 scr_drawloading = true;
317 scr_drawloading = true;
321 //=============================================================================
323 char r_speeds_string[1024];
324 int speedstringcount, r_timereport_active;
325 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
327 void R_TimeReport(char *desc)
333 if (!r_timereport_active)
336 r_timereport_temp = r_timereport_current;
337 r_timereport_current = Sys_DoubleTime();
338 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
340 sprintf(tempbuf, "%8i %s", t, desc);
341 length = strlen(tempbuf);
343 tempbuf[length++] = ' ';
345 if (speedstringcount + length > (vid.conwidth / 8))
347 strcat(r_speeds_string, "\n");
348 speedstringcount = 0;
350 // skip the space at the beginning if it's the first on the line
351 if (speedstringcount == 0)
353 strcat(r_speeds_string, tempbuf + 1);
354 speedstringcount = length - 1;
358 strcat(r_speeds_string, tempbuf);
359 speedstringcount += length;
363 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
364 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
365 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
366 void R_TimeReport_Start(void)
368 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
369 r_speeds_string[0] = 0;
370 if (r_timereport_active)
372 speedstringcount = 0;
373 sprintf(r_speeds_string,
374 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
375 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
376 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
377 "%6i modeltris%6i meshs%6i meshtris\n",
378 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
379 c_faces, c_nodes, c_leafs, c_light_polys,
380 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
381 c_alias_polys, c_meshs, c_meshelements / 3);
383 sprintf(r_speeds_string + strlen(r_speeds_string),
384 "realtime lighting:%4i lights%4i clears%4i scissored\n"
385 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
386 "precomputed: %6i shadowmeshes%6i shadowtris\n",
387 c_rt_lights, c_rt_clears, c_rt_scissored,
388 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
389 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
403 r_timereport_start = Sys_DoubleTime();
407 void R_TimeReport_End(void)
409 r_timereport_current = r_timereport_start;
410 R_TimeReport("total");
412 if (r_timereport_active)
416 for (i = 0;r_speeds_string[i];i++)
417 if (r_speeds_string[i] == '\n')
419 y = vid.conheight - sb_lines - lines * 8;
421 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
422 while (r_speeds_string[i])
425 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
428 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
429 if (r_speeds_string[i] == '\n')
443 void SCR_SizeUp_f (void)
445 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
456 void SCR_SizeDown_f (void)
458 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
461 void CL_Screen_Init(void)
463 Cvar_RegisterVariable (&scr_fov);
464 Cvar_RegisterVariable (&scr_viewsize);
465 Cvar_RegisterVariable (&scr_conspeed);
466 Cvar_RegisterVariable (&scr_conalpha);
467 Cvar_RegisterVariable (&scr_conbrightness);
468 Cvar_RegisterVariable (&scr_conforcewhiledisconnected);
469 Cvar_RegisterVariable (&scr_showram);
470 Cvar_RegisterVariable (&scr_showturtle);
471 Cvar_RegisterVariable (&scr_showpause);
472 Cvar_RegisterVariable (&scr_centertime);
473 Cvar_RegisterVariable (&scr_printspeed);
474 Cvar_RegisterVariable (&vid_conwidth);
475 Cvar_RegisterVariable (&vid_conheight);
476 Cvar_RegisterVariable (&vid_pixelaspect);
477 Cvar_RegisterVariable (&scr_screenshot_jpeg);
478 Cvar_RegisterVariable (&scr_screenshot_jpeg_quality);
479 Cvar_RegisterVariable (&cl_avidemo);
480 Cvar_RegisterVariable (&r_textshadow);
482 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
483 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
484 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
485 Cmd_AddCommand ("envmap", R_Envmap_f);
487 scr_initialized = true;
490 void DrawQ_Clear(void)
492 r_refdef.drawqueuesize = 0;
495 static int picelements[6] = {0, 1, 2, 0, 2, 3};
496 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
498 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);
501 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)
506 if (alpha < (1.0f / 255.0f))
509 len = strlen(string);
511 for (len = 0;len < maxlen && string[len];len++);
512 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
513 for (;len > 0 && string[len - 1] == ' ';len--);
516 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
518 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
519 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
521 red = bound(0, red, 1);
522 green = bound(0, green, 1);
523 blue = bound(0, blue, 1);
524 alpha = bound(0, alpha, 1);
525 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
527 dq->command = DRAWQUEUE_STRING;
529 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));
534 out = (char *)(dq + 1);
535 memcpy(out, string, len);
537 r_refdef.drawqueuesize += dq->size;
540 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)
542 if (r_textshadow.integer)
543 DrawQ_String_Real(x+scalex*0.25,y+scaley*0.25,string,maxlen,scalex,scaley,0,0,0,alpha*0.8,flags);
545 DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags);
548 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
550 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);
553 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)
557 drawqueuemesh_t mesh;
558 memset(&mesh, 0, sizeof(mesh));
559 if (picname && picname[0])
561 pic = Draw_CachePic(picname);
565 height = pic->height;
566 mesh.texture = pic->tex;
568 mesh.num_triangles = 2;
569 mesh.num_vertices = 4;
570 mesh.data_element3i = picelements;
571 mesh.data_vertex3f = floats;
572 mesh.data_texcoord2f = floats + 12;
573 mesh.data_color4f = floats + 20;
574 memset(floats, 0, sizeof(floats));
575 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
576 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
577 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
578 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
579 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;
580 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;
581 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;
582 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;
583 DrawQ_Mesh (&mesh, flags);
586 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
593 size += sizeof(drawqueuemesh_t);
594 size += sizeof(int[3]) * mesh->num_triangles;
595 size += sizeof(float[3]) * mesh->num_vertices;
596 size += sizeof(float[2]) * mesh->num_vertices;
597 size += sizeof(float[4]) * mesh->num_vertices;
598 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
600 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
602 dq->command = DRAWQUEUE_MESH;
609 p = (void *)(dq + 1);
610 m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t);
611 m->num_triangles = mesh->num_triangles;
612 m->num_vertices = mesh->num_vertices;
613 m->texture = mesh->texture;
614 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]);
615 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]);
616 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]);
617 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]);
618 r_refdef.drawqueuesize += dq->size;
621 void DrawQ_SetClipArea(float x, float y, float width, float height)
624 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
626 Con_DPrint("DrawQueue full !\n");
629 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
630 dq->size = sizeof(*dq);
631 dq->command = DRAWQUEUE_SETCLIP;
639 r_refdef.drawqueuesize += dq->size;
642 void DrawQ_ResetClipArea(void)
645 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
647 Con_DPrint("DrawQueue full !\n");
650 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
651 dq->size = sizeof(*dq);
652 dq->command = DRAWQUEUE_RESETCLIP;
660 r_refdef.drawqueuesize += dq->size;
668 void SCR_ScreenShot_f (void)
670 static int shotnumber;
671 static char oldname[MAX_QPATH];
672 char base[MAX_QPATH];
673 char filename[MAX_QPATH];
677 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
679 sprintf (base, "screenshots/%s", scr_screenshot_name.string);
681 if (strcmp (oldname, scr_screenshot_name.string))
683 sprintf(oldname, "%s", scr_screenshot_name.string);
687 // find a file name to save it to
688 for (;shotnumber < 1000000;shotnumber++)
689 if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber)))
691 if (shotnumber >= 1000000)
693 Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n");
697 sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
699 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
700 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
701 buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
703 if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
704 Con_Printf("Wrote %s\n", filename);
706 Con_Printf("unable to write %s\n", filename);
715 static int cl_avidemo_frame = 0;
717 void SCR_CaptureAVIDemo(void)
719 static qbyte *avi_buffer1 = NULL;
720 static qbyte *avi_buffer2 = NULL;
721 static qbyte *avi_buffer3 = NULL;
723 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
725 if (!cl_avidemo.integer)
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;
740 if (avi_buffer1 == NULL)
742 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
743 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
744 avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
747 sprintf(filename, "video/dp%06d.%s", cl_avidemo_frame, jpeg ? "jpg" : "tga");
749 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
753 Cvar_SetValueQuick(&cl_avidemo, 0);
754 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
755 cl_avidemo_frame = 0;
763 Grab six views for environment mapping tests
770 qboolean flipx, flipy, flipdiagonaly;
774 {{ 0, 0, 0}, "rt", true, false, false},
775 {{ 0, 90, 0}, "ft", true, false, false},
776 {{ 0, 180, 0}, "lf", true, false, false},
777 {{ 0, 270, 0}, "bk", true, false, false},
778 {{-90, 180, 0}, "up", false, true, false},
779 {{ 90, 180, 0}, "dn", false, true, false},
781 {{ 0, 0, 0}, "px", true, true, true},
782 {{ 0, 90, 0}, "py", false, true, false},
783 {{ 0, 180, 0}, "nx", false, false, true},
784 {{ 0, 270, 0}, "ny", true, false, false},
785 {{-90, 180, 0}, "pz", false, false, true},
786 {{ 90, 180, 0}, "nz", false, false, true}
789 static void R_Envmap_f (void)
792 char filename[256], basename[256];
799 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");
803 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
804 size = atoi(Cmd_Argv(2));
805 if (size != 128 && size != 256 && size != 512 && size != 1024)
807 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
810 if (size > vid.realwidth || size > vid.realheight)
812 Con_Print("envmap: your resolution is not big enough to render that size\n");
820 r_refdef.width = size;
821 r_refdef.height = size;
826 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
827 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
828 buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
830 for (j = 0;j < 12;j++)
832 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
833 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);
838 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);
848 //=============================================================================
850 // LordHavoc: SHOWLMP stuff
851 #define SHOWLMP_MAXLABELS 256
852 typedef struct showlmp_s
862 showlmp_t showlmp[SHOWLMP_MAXLABELS];
864 void SHOWLMP_decodehide(void)
868 lmplabel = MSG_ReadString();
869 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
870 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
872 showlmp[i].isactive = false;
877 void SHOWLMP_decodeshow(void)
880 qbyte lmplabel[256], picname[256];
882 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
883 strlcpy (picname, MSG_ReadString(), sizeof (picname));
884 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
895 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
896 if (showlmp[i].isactive)
898 if (strcmp(showlmp[i].label, lmplabel) == 0)
901 break; // drop out to replace it
904 else if (k < 0) // find first empty one to replace
907 return; // none found to replace
908 // change existing one
909 showlmp[k].isactive = true;
910 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
911 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
916 void SHOWLMP_drawall(void)
919 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
920 if (showlmp[i].isactive)
921 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
924 void SHOWLMP_clear(void)
927 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
928 showlmp[i].isactive = false;
931 void CL_SetupScreenSize(void)
933 float conwidth, conheight;
935 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
937 VID_UpdateGamma(false);
939 conwidth = bound(320, vid_conwidth.value, 2048);
940 conheight = bound(200, vid_conheight.value, 1536);
941 if (vid_conwidth.value != conwidth)
942 Cvar_SetValue("vid_conwidth", conwidth);
943 if (vid_conheight.value != conheight)
944 Cvar_SetValue("vid_conheight", conheight);
946 vid.conwidth = vid_conwidth.integer;
947 vid.conheight = vid_conheight.integer;
949 /* if (vid.realheight > 240)
951 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
952 vid.conheight = bound(240, vid.conheight, vid.realheight);
955 vid.conheight = 240;*/
957 SCR_SetUpToDrawConsole();
960 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
961 void CL_UpdateScreen(void)
963 if (!scr_initialized || !con_initialized || vid_hidden)
964 return; // not initialized yet
966 SCR_CaptureAVIDemo();
968 if (cls.signon == SIGNONS)
969 R_TimeReport("other");
971 CL_SetupScreenSize();
975 if (cls.signon == SIGNONS)
976 R_TimeReport("setup");
978 //FIXME: force menu if nothing else to look at?
979 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
983 scr_drawloading = false;
988 if (cls.signon == SIGNONS)
995 SCR_CheckDrawCenterString();
1001 if (cls.signon == SIGNONS)
1005 R_TimeReport_Start();
1007 R_Shadow_EditLights_DrawSelectedLightProperties();
1014 void CL_Screen_NewMap(void)