5 #include "cl_collision.h"
7 cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
8 cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 10 - 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_centertime = {0, "scr_centertime","2"};
13 cvar_t scr_showram = {CVAR_SAVE, "showram","1"};
14 cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"};
15 cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
16 cvar_t scr_printspeed = {0, "scr_printspeed","8"};
17 cvar_t vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"};
18 cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"};
19 cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"};
20 cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
22 qboolean scr_initialized; // ready to draw
24 float scr_con_current;
25 float scr_conlines; // lines of console to display
30 qboolean scr_drawloading = false;
32 void DrawCrosshair(int num);
33 static void SCR_ScreenShot_f (void);
34 static void R_Envmap_f (void);
37 void R_ClearScreen(void);
40 ===============================================================================
44 ===============================================================================
47 char scr_centerstring[1024];
48 float scr_centertime_start; // for slow victory printing
49 float scr_centertime_off;
58 Called for important messages that should stay in the center of the screen
62 void SCR_CenterPrint (char *str)
64 strlcpy (scr_centerstring, str, sizeof (scr_centerstring));
65 scr_centertime_off = scr_centertime.value;
66 scr_centertime_start = cl.time;
68 // count the number of lines for centering
79 void SCR_DrawCenterString (void)
86 // the finale prints the characters one at a time
88 remaining = scr_printspeed.value * (cl.time - scr_centertime_start);
93 start = scr_centerstring;
95 if (scr_center_lines <= 4)
96 y = vid.conheight*0.35;
102 // scan the width of the line
103 for (l=0 ; l<40 ; l++)
104 if (start[l] == '\n' || !start[l])
106 x = (vid.conwidth - l*8)/2;
111 DrawQ_String(x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
119 while (*start && *start != '\n')
124 start++; // skip the \n
128 void SCR_CheckDrawCenterString (void)
130 if (scr_center_lines > scr_erase_lines)
131 scr_erase_lines = scr_center_lines;
133 scr_centertime_off -= host_frametime;
135 // don't draw if this is a normal stats-screen intermission,
136 // only if it is not an intermission, or a finale intermission
137 if (cl.intermission == 1)
139 if (scr_centertime_off <= 0 && !cl.intermission)
141 if (key_dest != key_game)
144 SCR_DrawCenterString ();
152 void SCR_DrawTurtle (void)
156 if (cls.state != ca_connected)
159 if (!scr_showturtle.integer)
162 if (host_frametime < 0.1)
172 DrawQ_Pic (0, 0, "gfx/turtle.lmp", 0, 0, 1, 1, 1, 1, 0);
180 void SCR_DrawNet (void)
182 if (cls.state != ca_connected)
184 if (realtime - cl.last_received_message < 0.3)
186 if (cls.demoplayback)
189 DrawQ_Pic (64, 0, "gfx/net.lmp", 0, 0, 1, 1, 1, 1, 0);
197 void SCR_DrawPause (void)
201 if (cls.state != ca_connected)
204 if (!scr_showpause.integer) // turn off for screenshots
210 pic = Draw_CachePic ("gfx/pause.lmp");
211 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/pause.lmp", 0, 0, 1, 1, 1, 1, 0);
221 void SCR_DrawLoading (void)
225 pic = Draw_CachePic ("gfx/loading.lmp");
226 DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
231 //=============================================================================
236 SCR_SetUpToDrawConsole
239 void SCR_SetUpToDrawConsole (void)
243 if (key_dest == key_game && cls.signon != SIGNONS)
244 key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
246 key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
248 // decide on the height of the console
249 if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
250 scr_conlines = vid.conheight; // full screen
251 else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
252 scr_conlines = vid.conheight/2; // half screen
254 scr_conlines = 0; // none visible
256 if (scr_conspeed.value)
258 if (scr_conlines < scr_con_current)
260 scr_con_current -= scr_conspeed.value*host_realframetime;
261 if (scr_conlines > scr_con_current)
262 scr_con_current = scr_conlines;
265 else 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;
273 scr_con_current = scr_conlines;
281 void SCR_DrawConsole (void)
285 Con_DrawConsole (scr_con_current);
290 if (key_dest == key_game || key_dest == key_message)
291 Con_DrawNotify (); // only draw notify in game
297 SCR_BeginLoadingPlaque
301 void SCR_BeginLoadingPlaque (void)
306 S_StopAllSounds (true);
308 scr_drawloading = true;
310 scr_drawloading = true;
314 //=============================================================================
316 char r_speeds_string[1024];
317 int speedstringcount, r_timereport_active;
318 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
320 void R_TimeReport(char *desc)
326 if (!r_timereport_active)
329 r_timereport_temp = r_timereport_current;
330 r_timereport_current = Sys_DoubleTime();
331 t = (int) ((r_timereport_current - r_timereport_temp) * 1000000.0);
333 sprintf(tempbuf, "%8i %s", t, desc);
334 length = strlen(tempbuf);
336 tempbuf[length++] = ' ';
338 if (speedstringcount + length > (vid.conwidth / 8))
340 strcat(r_speeds_string, "\n");
341 speedstringcount = 0;
343 // skip the space at the beginning if it's the first on the line
344 if (speedstringcount == 0)
346 strcat(r_speeds_string, tempbuf + 1);
347 speedstringcount = length - 1;
351 strcat(r_speeds_string, tempbuf);
352 speedstringcount += length;
356 extern int c_rt_lights, c_rt_clears, c_rt_scissored;
357 extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
358 extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
359 void R_TimeReport_Start(void)
361 r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
362 r_speeds_string[0] = 0;
363 if (r_timereport_active)
365 speedstringcount = 0;
366 sprintf(r_speeds_string,
367 "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\n"
368 "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
369 "%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
370 "%6i modeltris%6i meshs%6i meshtris\n",
371 r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2],
372 c_faces, c_nodes, c_leafs, c_light_polys,
373 c_models, c_bmodels, c_sprites, c_particles, c_dlights,
374 c_alias_polys, c_meshs, c_meshelements / 3);
376 sprintf(r_speeds_string + strlen(r_speeds_string),
377 "realtime lighting:%4i lights%4i clears%4i scissored\n"
378 "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
379 "precomputed: %6i shadowmeshes%6i shadowtris\n",
380 c_rt_lights, c_rt_clears, c_rt_scissored,
381 c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
382 c_rtcached_shadowmeshes, c_rtcached_shadowtris);
396 r_timereport_start = Sys_DoubleTime();
400 void R_TimeReport_End(void)
402 r_timereport_current = r_timereport_start;
403 R_TimeReport("total");
405 if (r_timereport_active)
409 for (i = 0;r_speeds_string[i];i++)
410 if (r_speeds_string[i] == '\n')
412 y = vid.conheight - sb_lines - lines * 8;
414 DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
415 while (r_speeds_string[i])
418 while (r_speeds_string[i] && r_speeds_string[i] != '\n')
421 DrawQ_String(0, y, r_speeds_string + j, i - j, 8, 8, 1, 1, 1, 1, 0);
422 if (r_speeds_string[i] == '\n')
436 void SCR_SizeUp_f (void)
438 Cvar_SetValue ("viewsize",scr_viewsize.value+10);
449 void SCR_SizeDown_f (void)
451 Cvar_SetValue ("viewsize",scr_viewsize.value-10);
454 void CL_Screen_Init(void)
456 Cvar_RegisterVariable (&scr_fov);
457 Cvar_RegisterVariable (&scr_viewsize);
458 Cvar_RegisterVariable (&scr_conspeed);
459 Cvar_RegisterVariable (&scr_conalpha);
460 Cvar_RegisterVariable (&scr_conbrightness);
461 Cvar_RegisterVariable (&scr_showram);
462 Cvar_RegisterVariable (&scr_showturtle);
463 Cvar_RegisterVariable (&scr_showpause);
464 Cvar_RegisterVariable (&scr_centertime);
465 Cvar_RegisterVariable (&scr_printspeed);
466 Cvar_RegisterVariable (&vid_conwidth);
467 Cvar_RegisterVariable (&vid_conheight);
468 Cvar_RegisterVariable (&scr_screenshot_jpeg);
469 Cvar_RegisterVariable (&cl_avidemo);
471 Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
472 Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
473 Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);
474 Cmd_AddCommand ("envmap", R_Envmap_f);
476 scr_initialized = true;
479 void DrawQ_Clear(void)
481 r_refdef.drawqueuesize = 0;
484 static int picelements[6] = {0, 1, 2, 0, 2, 3};
485 void DrawQ_Pic(float x, float y, char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
487 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);
490 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)
495 if (alpha < (1.0f / 255.0f))
498 len = strlen(string);
500 for (len = 0;len < maxlen && string[len];len++);
501 for (;len > 0 && string[0] == ' ';string++, x += scalex, len--);
502 for (;len > 0 && string[len - 1] == ' ';len--);
505 if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
507 size = sizeof(*dq) + ((len + 1 + 3) & ~3);
508 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
510 red = bound(0, red, 1);
511 green = bound(0, green, 1);
512 blue = bound(0, blue, 1);
513 alpha = bound(0, alpha, 1);
514 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
516 dq->command = DRAWQUEUE_STRING;
518 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));
523 out = (char *)(dq + 1);
524 memcpy(out, string, len);
526 r_refdef.drawqueuesize += dq->size;
529 void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
531 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);
534 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)
538 drawqueuemesh_t mesh;
539 memset(&mesh, 0, sizeof(mesh));
540 if (picname && picname[0])
542 pic = Draw_CachePic(picname);
546 height = pic->height;
547 mesh.texture = pic->tex;
549 mesh.num_triangles = 2;
550 mesh.num_vertices = 4;
551 mesh.data_element3i = picelements;
552 mesh.data_vertex3f = floats;
553 mesh.data_texcoord2f = floats + 12;
554 mesh.data_color4f = floats + 20;
555 memset(floats, 0, sizeof(floats));
556 mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x;
557 mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y;
558 mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width;
559 mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height;
560 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;
561 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;
562 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;
563 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;
564 DrawQ_Mesh (&mesh, flags);
567 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
574 size += sizeof(drawqueuemesh_t);
575 size += sizeof(int[3]) * mesh->num_triangles;
576 size += sizeof(float[3]) * mesh->num_vertices;
577 size += sizeof(float[2]) * mesh->num_vertices;
578 size += sizeof(float[4]) * mesh->num_vertices;
579 if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
581 dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
583 dq->command = DRAWQUEUE_MESH;
590 p = (void *)(dq + 1);
591 m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
592 m->num_triangles = mesh->num_triangles;
593 m->num_vertices = mesh->num_vertices;
594 m->texture = mesh->texture;
595 m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));(qbyte *)p += m->num_triangles * sizeof(int[3]);
596 m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));(qbyte *)p += m->num_vertices * sizeof(float[3]);
597 m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));(qbyte *)p += m->num_vertices * sizeof(float[2]);
598 m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));(qbyte *)p += m->num_vertices * sizeof(float[4]);
599 r_refdef.drawqueuesize += dq->size;
602 void DrawQ_SetClipArea(float x, float y, float width, float height)
605 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
607 Con_DPrintf("DrawQueue full !\n");
610 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
611 dq->size = sizeof(*dq);
612 dq->command = DRAWQUEUE_SETCLIP;
620 r_refdef.drawqueuesize += dq->size;
623 void DrawQ_ResetClipArea(void)
626 if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize)
628 Con_DPrintf("DrawQueue full !\n");
631 dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize);
632 dq->size = sizeof(*dq);
633 dq->command = DRAWQUEUE_RESETCLIP;
641 r_refdef.drawqueuesize += dq->size;
649 float CalcFov (float fov_x, float width, float height)
651 // calculate vision size and alter by aspect, then convert back to angle
652 return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI;
659 Must be called whenever vid changes
663 static void SCR_CalcRefdef (void)
668 //========================================
671 if (scr_viewsize.value < 30)
672 Cvar_Set ("viewsize","30");
673 if (scr_viewsize.value > 120)
674 Cvar_Set ("viewsize","120");
676 // bound field of view
677 if (scr_fov.value < 10)
678 Cvar_Set ("fov","10");
679 if (scr_fov.value > 170)
680 Cvar_Set ("fov","170");
682 // intermission is always full screen
690 if (scr_viewsize.value >= 120)
691 sb_lines = 0; // no status bar at all
692 else if (scr_viewsize.value >= 110)
693 sb_lines = 24; // no inventory
696 size = scr_viewsize.value * (1.0 / 100.0);
701 r_refdef.width = vid.realwidth;
702 r_refdef.height = vid.realheight;
708 r_refdef.width = vid.realwidth * size;
709 r_refdef.height = vid.realheight * size;
710 r_refdef.x = (vid.realwidth - r_refdef.width)/2;
711 r_refdef.y = (vid.realheight - r_refdef.height)/2;
714 r_refdef.width = bound(0, r_refdef.width, vid.realwidth);
715 r_refdef.height = bound(0, r_refdef.height, vid.realheight);
716 r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx;
717 r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy;
719 // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
720 r_refdef.fov_x = scr_fov.value * cl.viewzoom;
721 r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height);
725 Mod_CheckLoaded(cl.worldmodel);
726 contents = CL_PointSuperContents(r_vieworigin);
727 if (contents & SUPERCONTENTS_LIQUIDSMASK)
729 r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
730 r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985);
740 void SCR_ScreenShot_f (void)
744 char checkname[MAX_OSPATH];
746 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
753 // find a file name to save it to
754 for (; i<=9999 ; i++)
756 sprintf (filename, "dp%04i.%s", i, extens);
757 sprintf (checkname, "%s/%s", fs_gamedir, filename);
758 if (!FS_SysFileExists(checkname))
763 Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n");
767 if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
768 Con_Printf ("Wrote %s\n", filename);
770 Con_Printf ("unable to write %s\n", filename);
773 static int cl_avidemo_frame = 0;
775 void SCR_CaptureAVIDemo(void)
778 qboolean jpeg = (scr_screenshot_jpeg.integer != 0);
781 sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame);
783 sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
785 if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg))
789 Cvar_SetValueQuick(&cl_avidemo, 0);
790 Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
791 cl_avidemo_frame = 0;
799 Grab six views for environment mapping tests
811 {{ 0, 180, 0}, "bk"},
812 {{ 0, 270, 0}, "lf"},
813 {{-90, 90, 0}, "up"},
817 static void R_Envmap_f (void)
820 char filename[256], basename[256];
824 Con_Printf ("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");
828 strlcpy (basename, Cmd_Argv(1), sizeof (basename));
829 size = atoi(Cmd_Argv(2));
830 if (size != 128 && size != 256 && size != 512 && size != 1024)
832 Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
835 if (size > vid.realwidth || size > vid.realheight)
837 Con_Printf("envmap: your resolution is not big enough to render that size\n");
845 r_refdef.width = size;
846 r_refdef.height = size;
851 for (j = 0;j < 6;j++)
853 sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name);
854 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);
857 SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false);
863 //=============================================================================
865 // LordHavoc: SHOWLMP stuff
866 #define SHOWLMP_MAXLABELS 256
867 typedef struct showlmp_s
877 showlmp_t showlmp[SHOWLMP_MAXLABELS];
879 void SHOWLMP_decodehide(void)
883 lmplabel = MSG_ReadString();
884 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
885 if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0)
887 showlmp[i].isactive = false;
892 void SHOWLMP_decodeshow(void)
895 qbyte lmplabel[256], picname[256];
897 strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel));
898 strlcpy (picname, MSG_ReadString(), sizeof (picname));
899 if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
910 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
911 if (showlmp[i].isactive)
913 if (strcmp(showlmp[i].label, lmplabel) == 0)
916 break; // drop out to replace it
919 else if (k < 0) // find first empty one to replace
922 return; // none found to replace
923 // change existing one
924 showlmp[k].isactive = true;
925 strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label));
926 strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic));
931 void SHOWLMP_drawall(void)
934 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
935 if (showlmp[i].isactive)
936 DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
939 void SHOWLMP_clear(void)
942 for (i = 0;i < SHOWLMP_MAXLABELS;i++)
943 showlmp[i].isactive = false;
946 void CL_SetupScreenSize(void)
948 float conwidth, conheight;
950 VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
952 VID_UpdateGamma(false);
954 conwidth = bound(320, vid_conwidth.value, 2048);
955 conheight = bound(200, vid_conheight.value, 1536);
956 if (vid_conwidth.value != conwidth)
957 Cvar_SetValue("vid_conwidth", conwidth);
958 if (vid_conheight.value != conheight)
959 Cvar_SetValue("vid_conheight", conheight);
961 vid.conwidth = vid_conwidth.integer;
962 vid.conheight = vid_conheight.integer;
964 /* if (vid.realheight > 240)
966 vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240;
967 vid.conheight = bound(240, vid.conheight, vid.realheight);
970 vid.conheight = 240;*/
972 SCR_SetUpToDrawConsole();
974 // determine size of refresh window
978 extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
979 void CL_UpdateScreen(void)
981 if (!scr_initialized || !con_initialized || vid_hidden)
982 return; // not initialized yet
984 if (cl_avidemo.integer)
985 SCR_CaptureAVIDemo();
987 cl_avidemo_frame = 0;
989 if (cls.signon == SIGNONS)
990 R_TimeReport("other");
992 CL_SetupScreenSize();
996 if (cls.signon == SIGNONS)
997 R_TimeReport("setup");
999 //FIXME: force menu if nothing else to look at?
1000 //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
1002 if (scr_drawloading)
1004 scr_drawloading = false;
1009 if (cls.signon == SIGNONS)
1016 SCR_CheckDrawCenterString();
1021 if (cls.signon == SIGNONS)
1025 R_TimeReport_Start();
1027 R_Shadow_EditLights_DrawSelectedLightProperties();
1034 void CL_Screen_NewMap(void)