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");
687 sprintf(filename, "%s%06d.%s", base, shotnumber, jpeg ? "jpg" : "tga");
689 buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
690 buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
691 buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
693 if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
694 Con_Printf("Wrote %s\n", filename);
696 Con_Printf("unable to write %s\n", filename);
705 static int cl_avidemo_frame = 0;
707 void SCR_CaptureAVIDemo(void)
709 static qbyte *avi_buffer1 = NULL;
710 static qbyte *avi_buffer2 = NULL;
711 static qbyte *avi_buffer3 = NULL;
713 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
715 if (!cl_avidemo.integer)
717 if (avi_buffer1 != NULL)
719 Mem_Free (avi_buffer1);
720 Mem_Free (avi_buffer2);
721 Mem_Free (avi_buffer3);
726 cl_avidemo_frame = 0;
730 if (avi_buffer1 == NULL)
732 avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
733 avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3);
734 avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18);
737 sprintf(filename, "video/dp%06d.%s", cl_avidemo_frame, jpeg ? "jpg" : "tga");
739 if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg))
743 Cvar_SetValueQuick(&cl_avidemo, 0);
744 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo capture.\n", cl_avidemo_frame);
745 cl_avidemo_frame = 0;
753 Grab six views for environment mapping tests
760 qboolean flipx, flipy, flipdiagonaly;
764 {{ 0, 0, 0}, "rt", true, false, false},
765 {{ 0, 90, 0}, "ft", true, false, false},
766 {{ 0, 180, 0}, "lf", true, false, false},
767 {{ 0, 270, 0}, "bk", true, false, false},
768 {{-90, 180, 0}, "up", false, true, false},
769 {{ 90, 180, 0}, "dn", false, true, false},
771 {{ 0, 0, 0}, "px", true, true, true},
772 {{ 0, 90, 0}, "py", false, true, false},
773 {{ 0, 180, 0}, "nx", false, false, true},
774 {{ 0, 270, 0}, "ny", true, false, false},
775 {{-90, 180, 0}, "pz", false, false, true},
776 {{ 90, 180, 0}, "nz", false, false, true}
779 static void R_Envmap_f (void)
782 char filename[256], basename[256];
789 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");
793 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
794 size = atoi(Cmd_Argv(2));
795 if (size != 128 && size != 256 && size != 512 && size != 1024)
797 Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n");
800 if (size > vid.realwidth || size > vid.realheight)
802 Con_Print("envmap: your resolution is not big enough to render that size\n");
810 r_refdef.width = size;
811 r_refdef.height = size;
816 buffer1 = Mem_Alloc(tempmempool, size * size * 3);
817 buffer2 = Mem_Alloc(tempmempool, size * size * 3);
818 buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18);
820 for (j = 0;j < 12;j++)
822 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
823 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);
828 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);
838 //=============================================================================
840 // LordHavoc: SHOWLMP stuff
841 #define SHOWLMP_MAXLABELS 256
842 typedef struct showlmp_s
852 showlmp_t showlmp[SHOWLMP_MAXLABELS];
854 void SHOWLMP_decodehide(void)
858 lmplabel = MSG_ReadString();
859 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
860 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
862 showlmp[i].isactive = false;
867 void SHOWLMP_decodeshow(void)
870 qbyte lmplabel[256], picname[256];
872 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
873 strlcpy (picname, MSG_ReadString(), sizeof (picname));
874 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
885 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
886 if (showlmp[i].isactive)
888 if (strcmp(showlmp[i].label, lmplabel) == 0)
891 break; // drop out to replace it
894 else if (k < 0) // find first empty one to replace
897 return; // none found to replace
898 // change existing one
899 showlmp[k].isactive = true;
900 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
901 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
906 void SHOWLMP_drawall(void)
909 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
910 if (showlmp[i].isactive)
911 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
914 void SHOWLMP_clear(void)
917 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
918 showlmp[i].isactive = false;
921 void CL_SetupScreenSize(void)
923 float conwidth, conheight;
925 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
927 VID_UpdateGamma(false);
929 conwidth = bound(320, vid_conwidth.value, 2048);
930 conheight = bound(200, vid_conheight.value, 1536);
931 if (vid_conwidth.value != conwidth)
932 Cvar_SetValue("vid_conwidth", conwidth);
933 if (vid_conheight.value != conheight)
934 Cvar_SetValue("vid_conheight", conheight);
936 vid.conwidth = vid_conwidth.integer;
937 vid.conheight = vid_conheight.integer;
939 /* if (vid.realheight > 240)
941 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
942 vid.conheight = bound(240, vid.conheight, vid.realheight);
945 vid.conheight = 240;*/
947 SCR_SetUpToDrawConsole();
950 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
951 void CL_UpdateScreen(void)
953 if (!scr_initialized || !con_initialized || vid_hidden)
954 return; // not initialized yet
956 SCR_CaptureAVIDemo();
958 if (cls.signon == SIGNONS)
959 R_TimeReport("other");
961 CL_SetupScreenSize();
965 if (cls.signon == SIGNONS)
966 R_TimeReport("setup");
968 //FIXME: force menu if nothing else to look at?
969 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
973 scr_drawloading = false;
978 if (cls.signon == SIGNONS)
985 SCR_CheckDrawCenterString();
991 if (cls.signon == SIGNONS)
995 R_TimeReport_Start();
997 R_Shadow_EditLights_DrawSelectedLightProperties();
1004 void CL_Screen_NewMap(void)