/* ================== SCR_TileClear johnfitz -- modified to use glwidth/glheight instead of vid.width/vid.height also fixed the dimentions of right and top panels also added scr_tileclear_updates ================== */ void SCR_TileClear (void) { //ericw -- added check for glsl gamma. TODO: remove this ugly optimization? if (scr_tileclear_updates >= vid.numpages && !gl_clear.value && !(gl_glsl_gamma_able && vid_gamma.value != 1)) return; scr_tileclear_updates++; if (r_refdef.vrect.x > 0) { // left Draw_TileClear (0, 0, r_refdef.vrect.x, glheight - sb_lines); // right Draw_TileClear (r_refdef.vrect.x + r_refdef.vrect.width, 0, glwidth - r_refdef.vrect.x - r_refdef.vrect.width, glheight - sb_lines); } if (r_refdef.vrect.y > 0) { // top Draw_TileClear (r_refdef.vrect.x, 0, r_refdef.vrect.width, r_refdef.vrect.y); // bottom Draw_TileClear (r_refdef.vrect.x, r_refdef.vrect.y + r_refdef.vrect.height, r_refdef.vrect.width, glheight - r_refdef.vrect.y - r_refdef.vrect.height - sb_lines); } }
/* ================== SCR_TileClear -- johnfitz -- modified to use glwidth/glheight instead of vid.width/vid.height also fixed the dimentions of right and top panels also added scr_tileclear_updates ================== */ void SCR_TileClear (void) { if (scr_tileclear_updates >= vid.numpages && !gl_clear.value) return; scr_tileclear_updates++; if (r_refdef.vrect.x > 0) { // left Draw_TileClear (0, 0, r_refdef.vrect.x, glheight - sb_lines); // right Draw_TileClear (r_refdef.vrect.x + r_refdef.vrect.width, 0, glwidth - r_refdef.vrect.x - r_refdef.vrect.width, glheight - sb_lines); } if (r_refdef.vrect.y > 0) { // top Draw_TileClear (r_refdef.vrect.x, 0, r_refdef.vrect.width, r_refdef.vrect.y); // bottom Draw_TileClear (r_refdef.vrect.x, r_refdef.vrect.y + r_refdef.vrect.height, r_refdef.vrect.width, glheight - r_refdef.vrect.y - r_refdef.vrect.height - sb_lines); } }
void SCR_TileClear (void) { if (r_refdef.vrect.x > 0) { // left Draw_TileClear (0, 0, r_refdef.vrect.x, glheight - sb_lines); // right Draw_TileClear (r_refdef.vrect.x + r_refdef.vrect.width, 0, glwidth - r_refdef.vrect.x - r_refdef.vrect.width, glheight - sb_lines); } if (r_refdef.vrect.y > 0) { // top Draw_TileClear (r_refdef.vrect.x, 0, r_refdef.vrect.width, r_refdef.vrect.y); // bottom Draw_TileClear (r_refdef.vrect.x, r_refdef.vrect.y + r_refdef.vrect.height, r_refdef.vrect.width, glheight - r_refdef.vrect.y - r_refdef.vrect.height - sb_lines); } }
/* ================== SCR_SetUpToDrawConsole ================== */ void SCR_SetUpToDrawConsole (void) { Con_CheckResize (); if (scr_drawloading) return; // never a console with loading plaque // decide on the height of the console #ifdef USEFPM con_forcedup = !clFPM.worldmodel || cls.signon != SIGNONS; #else con_forcedup = !cl.worldmodel || cls.signon != SIGNONS; #endif if (con_forcedup) { scr_conlines = (float)vid.height; // full screen scr_con_current = scr_conlines; } else if (key_dest == key_console) scr_conlines = (float)(vid.height/2); // half screen else scr_conlines = 0; // none visible if (scr_conlines < scr_con_current) { scr_con_current -= (float)(scr_conspeed.value*host_frametime); if (scr_conlines > scr_con_current) scr_con_current = scr_conlines; } else if (scr_conlines > scr_con_current) { scr_con_current += (float)(scr_conspeed.value*host_frametime); if (scr_conlines < scr_con_current) scr_con_current = scr_conlines; } if (clearconsole++ < vid.numpages) { scr_copytop = 1; Draw_TileClear (0,(int)scr_con_current,vid.width, vid.height - (int)scr_con_current); Sbar_Changed (); } else if (clearnotify++ < vid.numpages) { scr_copytop = 1; Draw_TileClear (0,0,vid.width, con_notifylines); } else con_notifylines = 0; }
/* ================== SCR_SetUpToDrawConsole ================== */ void SCR_SetUpToDrawConsole (void) { Con_CheckResize (); // decide on the height of the console if (cls.state != ca_active) { scr_conlines = vid.height; // full screen scr_con_current = scr_conlines; } else if (key_dest == key_console) scr_conlines = vid.height/2; // half screen else scr_conlines = 0; // none visible if (scr_conlines < scr_con_current) { scr_con_current -= scr_conspeed.value*host_frametime; if (scr_conlines > scr_con_current) scr_con_current = scr_conlines; } else if (scr_conlines > scr_con_current) { scr_con_current += scr_conspeed.value*host_frametime; if (scr_conlines < scr_con_current) scr_con_current = scr_conlines; } if (clearconsole++ < vid.numpages) { scr_copytop = 1; Draw_TileClear (0,(int)scr_con_current,vid.width, vid.height - (int)scr_con_current); Sbar_Changed (); } else if (clearnotify++ < vid.numpages) { scr_copytop = 1; Draw_TileClear (0,0,vid.width, con_notifylines); } else con_notifylines = 0; }
static void SCR_TileClear (void) { if (r_refdef.vrect.x > 0) { // left Draw_TileClear (0, 0, r_refdef.vrect.x, vid.height - vr_data.lineadj); // right Draw_TileClear (r_refdef.vrect.x + r_refdef.vrect.width, 0, vid.width - r_refdef.vrect.x + r_refdef.vrect.width, vid.height - vr_data.lineadj); } if (r_refdef.vrect.y > 0) { // top Draw_TileClear (r_refdef.vrect.x, 0, r_refdef.vrect.x + r_refdef.vrect.width, r_refdef.vrect.y); // bottom Draw_TileClear (r_refdef.vrect.x, r_refdef.vrect.y + r_refdef.vrect.height, r_refdef.vrect.width, vid.height - vr_data.lineadj - (r_refdef.vrect.height + r_refdef.vrect.y)); } }
void SCR_EraseCenterString (void) { int y; if (scr_erase_center++ > vid.numpages) { scr_erase_lines = 0; return; } if (scr_center_lines <= 4) y = vid.height*0.35; else y = 48; scr_copytop = 1; Draw_TileClear (0, y,vid.width, 8*scr_erase_lines); }
void SCR_EraseCenterString(void) { int y, height; if (scr_erase_center++ > vid.numpages) { scr_erase_lines = 0; return; } if (scr_center_lines <= 4) y = vid.height * 0.35; else y = 48; /* Make sure we don't draw off the bottom of the screen*/ height = qmin(8 * scr_erase_lines, ((int)vid.height) - y - 1); scr_copytop = 1; Draw_TileClear(0, y, vid.width, height); }
/* * Clear any parts of the tiled background that were drawn on last frame */ void SCR_TileClear(void) { int i; int top, bottom, left, right; dirty_t clear; if (scr_con_current == 1.0) { return; /* full screen console */ } if (scr_viewsize->value == 100) { return; /* full screen rendering */ } if (cl.cinematictime > 0) { return; /* full screen cinematic */ } /* erase rect will be the union of the past three frames so tripple buffering works properly */ clear = scr_dirty; for (i = 0; i < 2; i++) { if (scr_old_dirty[i].x1 < clear.x1) { clear.x1 = scr_old_dirty[i].x1; } if (scr_old_dirty[i].x2 > clear.x2) { clear.x2 = scr_old_dirty[i].x2; } if (scr_old_dirty[i].y1 < clear.y1) { clear.y1 = scr_old_dirty[i].y1; } if (scr_old_dirty[i].y2 > clear.y2) { clear.y2 = scr_old_dirty[i].y2; } } scr_old_dirty[1] = scr_old_dirty[0]; scr_old_dirty[0] = scr_dirty; scr_dirty.x1 = 9999; scr_dirty.x2 = -9999; scr_dirty.y1 = 9999; scr_dirty.y2 = -9999; /* don't bother with anything convered by the console */ top = (int)(scr_con_current * viddef.height); if (top >= clear.y1) { clear.y1 = top; } if (clear.y2 <= clear.y1) { return; /* nothing disturbed */ } top = scr_vrect.y; bottom = top + scr_vrect.height - 1; left = scr_vrect.x; right = left + scr_vrect.width - 1; if (clear.y1 < top) { /* clear above view screen */ i = clear.y2 < top - 1 ? clear.y2 : top - 1; Draw_TileClear(clear.x1, clear.y1, clear.x2 - clear.x1 + 1, i - clear.y1 + 1, "backtile"); clear.y1 = top; } if (clear.y2 > bottom) { /* clear below view screen */ i = clear.y1 > bottom + 1 ? clear.y1 : bottom + 1; Draw_TileClear(clear.x1, i, clear.x2 - clear.x1 + 1, clear.y2 - i + 1, "backtile"); clear.y2 = bottom; } if (clear.x1 < left) { /* clear left of view screen */ i = clear.x2 < left - 1 ? clear.x2 : left - 1; Draw_TileClear(clear.x1, clear.y1, i - clear.x1 + 1, clear.y2 - clear.y1 + 1, "backtile"); clear.x1 = left; } if (clear.x2 > right) { /* clear left of view screen */ i = clear.x1 > right + 1 ? clear.x1 : right + 1; Draw_TileClear(i, clear.y1, clear.x2 - i + 1, clear.y2 - clear.y1 + 1, "backtile"); clear.x2 = right; } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen (void) { static float oldscr_viewsize; vrect_t vrect; if (scr_skipupdate || block_drawing) return; if (scr_disabled_for_loading) return; #ifdef _WIN32 { // don't suck up any cpu if minimized extern int Minimized; if (Minimized) return; } #endif scr_copytop = 0; scr_copyeverything = 0; if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (oldsbar != cl_sbar.value) { oldsbar = cl_sbar.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef (); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,vid.height); Sbar_Changed (); } pconupdate = NULL; SCR_SetUpToDrawConsole (); SCR_EraseCenterString (); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time VID_LockBuffer (); V_RenderView (); VID_UnlockBuffer (); D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_drawdialog) { Sbar_Draw (); Draw_FadeScreen (); SCR_DrawNotifyString (); scr_copyeverything = true; } else if (cl.intermission == 1 && key_dest == key_game) { Sbar_IntermissionOverlay (); } else if (cl.intermission == 2 && key_dest == key_game) { Sbar_FinaleOverlay (); SCR_CheckDrawCenterString (); } else { SCR_DrawRam (); SCR_DrawNet (); SCR_DrawTurtle (); SCR_DrawPause (); SCR_DrawFPS (); SCR_CheckDrawCenterString (); Sbar_Draw (); SCR_DrawConsole (); M_Draw (); } D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects (pconupdate); } V_UpdatePalette (); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update (&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update (&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update (&vrect); } }
/* =============== Sbar_Draw =============== */ void Sbar_Draw(void) { qboolean headsup; char st[512]; headsup = !(cl_sbar.value || scr_viewsize.value < 100); if ((sb_updates >= vid.numpages) && !headsup) return; if (scr_con_current == vid.height) return; // console is full screen scr_copyeverything = 1; // scr_fullupdate = 0; sb_updates++; // top line if (sb_lines > 24) { if (!cl.spectator || autocam == CAM_TRACK) Sbar_DrawInventory(); if (!headsup || vid.width < 512) Sbar_DrawFrags(); } // main area if (sb_lines > 0) { if (cl.spectator) { if (autocam != CAM_TRACK) { Sbar_DrawPic(0, 0, sb_scorebar); Sbar_DrawString(160 - 7 * 8, 4, "SPECTATOR MODE"); Sbar_DrawString(160 - 14 * 8 + 4, 12, "Press [ATTACK] for AutoCamera"); } else { if (sb_showscores || cl.stats[STAT_HEALTH] <= 0) Sbar_SoloScoreboard(); else Sbar_DrawNormal(); // Sbar_DrawString (160-14*8+4,4, "SPECTATOR MODE - TRACK CAMERA"); sprintf(st, "Tracking %-.13s, [JUMP] for next", cl.players[spec_track].name); Sbar_DrawString(0, -8, st); } } else if (sb_showscores || cl.stats[STAT_HEALTH] <= 0) Sbar_SoloScoreboard(); else Sbar_DrawNormal(); } // main screen deathmatch rankings // if we're dead show team scores in team games if (cl.stats[STAT_HEALTH] <= 0 && !cl.spectator) if (atoi(Info_ValueForKey(cl.serverinfo, "teamplay")) > 0 && !sb_showscores) Sbar_TeamOverlay(); else Sbar_DeathmatchOverlay(0); else if (sb_showscores) Sbar_DeathmatchOverlay(0); else if (sb_showteamscores) Sbar_TeamOverlay(); #ifdef GLQUAKE if (sb_showscores || sb_showteamscores || cl.stats[STAT_HEALTH] <= 0) sb_updates = 0; // clear unused areas in gl #if 0 { int x = (vid.width - 320) >> 1; // left if (x > 0) { Draw_TileClear(0, vid.height - sb_lines, x, sb_lines); Draw_TileClear(x + 320, vid.height - sb_lines, vid.width - x + 320, sb_lines); } } #endif if (vid.width > 320 && !headsup) Draw_TileClear(320, vid.height - sb_lines, vid.width - 320, sb_lines); #endif if (sb_lines > 0) Sbar_MiniDeathmatchOverlay(); }
/* ================== SCR_SetUpToDrawConsole ================== */ void SCR_SetUpToDrawConsole (void) { //johnfitz -- let's hack away the problem of slow console when host_timescale is <0 extern cvar_t host_timescale; float timescale; //johnfitz Con_CheckResize (); if (scr_drawloading) return; // never a console with loading plaque // decide on the height of the console con_forcedup = !cl.worldmodel || cls.signon != SIGNONS; if (con_forcedup) { scr_conlines = vid.height; // full screen scr_con_current = scr_conlines; } else if (key_dest == key_console) scr_conlines = vid.height/2; // half screen else scr_conlines = 0; // none visible timescale = (host_timescale.value > 0) ? host_timescale.value : 1; //johnfitz -- timescale if (scr_conlines < scr_con_current) { scr_con_current -= scr_conspeed.value*host_frametime/timescale; //johnfitz -- timescale if (scr_conlines > scr_con_current) scr_con_current = scr_conlines; } else if (scr_conlines > scr_con_current) { scr_con_current += scr_conspeed.value*host_frametime/timescale; //johnfitz -- timescale if (scr_conlines < scr_con_current) scr_con_current = scr_conlines; } if (clearconsole++ < vid.numpages) { #ifndef GLQUAKE scr_copytop = 1; Draw_TileClear (0,(int)scr_con_current,vid.width, vid.height - (int)scr_con_current); #endif Sbar_Changed (); } else if (clearnotify++ < vid.numpages) { #ifndef GLQUAKE scr_copytop = 1; Draw_TileClear (0,0,vid.width, con_notifylines); #endif } else { con_notifylines = 0; } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen (void) { static float oldscr_viewsize; static float oldlcd_x; vrect_t vrect; if (scr_skipupdate) return; scr_copytop = 0; scr_copyeverything = 0; if (scr_disabled_for_loading) { if (realtime - scr_disabled_time > 60) { scr_disabled_for_loading = false; total_loading_size = 0; loading_stage = 0; Con_Printf ("load failed.\n"); } else return; } if (cls.state == ca_dedicated) return; // stdout only if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldlcd_x != lcd_x.value) { oldlcd_x = lcd_x.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef (); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_needfull && (!plaquemessage || plaquemessage[0] == 0 || !SCR_CheckDrawCenterString2())) scr_fullupdate = 0; if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,vid.height); SB_Changed(); } else if (scr_topupdate++ < vid.numpages) { scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,100); SB_Changed(); } pconupdate = NULL; SCR_SetUpToDrawConsole (); //SCR_EraseCenterString (); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (cl.intermission < 1 || cl.intermission > 12) { VID_LockBuffer (); V_RenderView (); VID_UnlockBuffer (); } D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_drawdialog) { SB_Draw(); Draw_FadeScreen (); SCR_DrawNotifyString (); scr_copyeverything = true; } else if (scr_drawloading) { SB_Draw(); Draw_FadeScreen (); SCR_DrawLoading (); } else if (cl.intermission >= 1 && cl.intermission <= 12) { SB_IntermissionOverlay(); if (cl.intermission < 12) { SCR_DrawConsole(); M_Draw(); } } /* else if (cl.intermission == 2 && key_dest == key_game) { SB_FinaleOverlay(); SCR_CheckDrawCenterString(); } else if (cl.intermission == 3 && key_dest == key_game) { SCR_CheckDrawCenterString (); }*/ else { SCR_DrawRam(); SCR_DrawNet(); SCR_DrawTurtle(); SCR_DrawPause(); SCR_CheckDrawCenterString(); SB_Draw(); Plaque_Draw(plaquemessage,0); SCR_DrawConsole(); M_Draw(); if (errormessage) Plaque_Draw(errormessage,1); if (info_up) { UpdateInfoMessage(); Info_Plaque_Draw(infomessage); } } if (loading_stage) SCR_DrawLoading(); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects (pconupdate); } V_UpdatePalette (); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update (&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update (&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update (&vrect); } }
/* ============== SCR_TileClear Clear any parts of the tiled background that were drawn on last frame ============== */ void SCR_TileClear (void) { int i; int top, bottom, left, right; dirty_t clear; if (scr_drawall->value) SCR_DirtyScreen (); // for power vr or broken page flippers... if (scr_con_current == 1.0) return; // full screen console if (scr_viewsize->value == 100) return; // full screen rendering if (cl.cinematictime > 0) return; // full screen cinematic // erase rect will be the union of the past three frames // so tripple buffering works properly clear = scr_dirty; for (i=0 ; i<2 ; i++) { if (scr_old_dirty[i].x1 < clear.x1) clear.x1 = scr_old_dirty[i].x1; if (scr_old_dirty[i].x2 > clear.x2) clear.x2 = scr_old_dirty[i].x2; if (scr_old_dirty[i].y1 < clear.y1) clear.y1 = scr_old_dirty[i].y1; if (scr_old_dirty[i].y2 > clear.y2) clear.y2 = scr_old_dirty[i].y2; } scr_old_dirty[1] = scr_old_dirty[0]; scr_old_dirty[0] = scr_dirty; scr_dirty.x1 = 9999; scr_dirty.x2 = -9999; scr_dirty.y1 = 9999; scr_dirty.y2 = -9999; // don't bother with anything convered by the console) top = scr_con_current*viddef.height; if (top >= clear.y1) clear.y1 = top; if (clear.y2 <= clear.y1) return; // nothing disturbed top = scr_vrect.y; bottom = top + scr_vrect.height-1; left = scr_vrect.x; right = left + scr_vrect.width-1; if (clear.y1 < top) { // clear above view screen i = clear.y2 < top-1 ? clear.y2 : top-1; Draw_TileClear (clear.x1 , clear.y1, clear.x2 - clear.x1 + 1, i - clear.y1+1, "backtile"); clear.y1 = top; } if (clear.y2 > bottom) { // clear below view screen i = clear.y1 > bottom+1 ? clear.y1 : bottom+1; Draw_TileClear (clear.x1, i, clear.x2-clear.x1+1, clear.y2-i+1, "backtile"); clear.y2 = bottom; } if (clear.x1 < left) { // clear left of view screen i = clear.x2 < left-1 ? clear.x2 : left-1; Draw_TileClear (clear.x1, clear.y1, i-clear.x1+1, clear.y2 - clear.y1 + 1, "backtile"); clear.x1 = left; } if (clear.x2 > right) { // clear left of view screen i = clear.x1 > right+1 ? clear.x1 : right+1; Draw_TileClear (i, clear.y1, clear.x2-i+1, clear.y2 - clear.y1 + 1, "backtile"); clear.x2 = right; } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen(void) { static float oldscr_viewsize; vrect_t vrect; if (scr_skipupdate || block_drawing) return; scr_copytop = 0; scr_copyeverything = 0; if (scr_disabled_for_loading) { /* * FIXME - this really needs to be fixed properly. * Simply starting a new game and typing "changelevel foo" will hang * the engine for 15s (was 60s!) if foo.bsp does not exist. */ if (realtime - scr_disabled_time > 15) { scr_disabled_for_loading = false; Con_Printf("load failed.\n"); } else return; } if (cls.state == ca_dedicated) return; // stdout only if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef(); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess(); // of all overlay stuff if drawing directly if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear(0, 0, vid.width, vid.height); Sbar_Changed(); } pconupdate = NULL; SCR_SetUpToDrawConsole(); SCR_EraseCenterString(); D_DisableBackBufferAccess(); // for adapters that can't stay mapped in // for linear writes all the time VID_LockBuffer(); V_RenderView(); VID_UnlockBuffer(); D_EnableBackBufferAccess(); // of all overlay stuff if drawing directly if (scr_drawdialog) { Sbar_Draw(); Draw_FadeScreen(); SCR_DrawNotifyString(); scr_copyeverything = true; } else if (scr_drawloading) { SCR_DrawLoading(); Sbar_Draw(); } else if (cl.intermission == 1 && key_dest == key_game) { Sbar_IntermissionOverlay(); } else if (cl.intermission == 2 && key_dest == key_game) { Sbar_FinaleOverlay(); SCR_CheckDrawCenterString(); } else if (cl.intermission == 3 && key_dest == key_game) { SCR_CheckDrawCenterString(); } else { SCR_DrawRam(); SCR_DrawNet(); SCR_DrawTurtle(); SCR_DrawPause(); SCR_CheckDrawCenterString(); Sbar_Draw(); SCR_DrawConsole(); M_Draw(); } D_DisableBackBufferAccess(); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects(pconupdate); } V_UpdatePalette(); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update(&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update(&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update(&vrect); } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen (void) { static float oldscr_viewsize; static float oldlcd_x; vrect_t vrect; if (scr_skipupdate || block_drawing) return; scr_copytop = 0; scr_copyeverything = 0; if (scr_disabled_for_loading) { if (realtime - scr_disabled_time > 60) { scr_disabled_for_loading = false; Con_Printf ("load failed.\n"); } else return; } if (cls.state == ca_dedicated) return; // stdout only if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldlcd_x != lcd_x.value) { oldlcd_x = lcd_x.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef (); } // // do 3D refresh drawing, and then update the screen if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,vid.height); Sbar_Changed (); } SCR_SetUpToDrawConsole (); SCR_EraseCenterString (); V_RenderView (); SCR_DrawScreen(); if(separation_distance){ VID_SetBuffer(1); SCR_DrawScreen(); VID_SetBuffer(0); } V_UpdatePalette (); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update (&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update (&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update (&vrect); } }
/* =============== Sbar_Draw =============== */ void Sbar_Draw (void) { if (scr_con_current == vid.height) return; // console is full screen // mankrip - svc_letterbox - start if (cl.letterbox) { if (cl.letterbox == 1) // hack to ensure the whole screen will be black Draw_Fill(0, vid.height/2, vid.width, 1, 0); return; } // mankrip - svc_letterbox - end // Manoel Kasimier - crosshair - start if (crosshair.value) { if (crosshair.value < 0 || crosshair.value > 5) crosshair.value = 0; Crosshair_Start(cl_crossx.value + scr_vrect.x + scr_vrect.width/2 - 6*(vid.width/MIN_VID_WIDTH), cl_crossy.value + scr_vrect.y + scr_vrect.height/2 - 6*(vid.width/MIN_VID_WIDTH)); // Manoel Kasimier - crosshair } // Manoel Kasimier - crosshair - end scr_copyeverything = 1; // mankrip - begin Sbar_SizeScreen (); if ( (sb_showscores || sbar.value > 0) && sbar.value < 4) { if (sbar_show_bg.value) Draw_TileClear (scr_vrect.x, vid.height - sb_lines, scr_vrect.width, sb_lines); #if 0 else { Draw_Fill (0, vid.height - sb_lines - screen_bottom, scr_vrect.x, sb_lines, 0); // left Draw_Fill (scr_vrect.x+scr_vrect.width, vid.height - sb_lines - screen_bottom, vid.width-(scr_vrect.x+scr_vrect.width), sb_lines, 0); // right Draw_Fill (scr_vrect.x, scr_vrect.y+scr_vrect.height, scr_vrect.width, vid.height-(scr_vrect.y+scr_vrect.height)-screen_bottom, 0); // bottom } #endif if (sbar.value > 1 || sb_showscores) // inventory bar { if (sbar.value > 2 || sb_showscores) // score bar { if (sbar_show_bg.value) Sbar_DrawTransPic (0, -48, sb_scorebar); Sbar_SoloScoreboard (0, -48, 0); } if (sbar_show_bg.value) { if (rogue) { if ( cl.stats[STAT_ACTIVEWEAPON] >= RIT_LAVA_NAILGUN ) Sbar_DrawTransPic (0, -24, rsb_invbar[0]); else Sbar_DrawTransPic (0, -24, rsb_invbar[1]); } else Sbar_DrawTransPic (0, -24, sb_ibar); } Sbar_DrawAmmoList (0, -24, 0); // 0, -24, 0 Sbar_DrawWeaponList (0, -16, 0); // 0, -16, 0 if (rogue) Sbar_DrawKeys (192, -16); // 192, -16 else Sbar_DrawKeys (192, -16); // 192, -16 if (rogue || hipnotic) Sbar_DrawPowerUps (224, -16); // 224, -16 else Sbar_DrawPowerUps (224, -16); // 224, -16 if (rogue) Sbar_DrawPowerups_Rogue (288, -16); // 288, -16 else if (hipnotic) Sbar_DrawPowerups_Hipnotic (288, -16); // 288, -16 else Sbar_DrawRunes (288, -16); // sigils 288, -16 Sbar_DrawFrags (); } // status bar if (sbar_show_bg.value) Sbar_DrawTransPic (0, 0, sb_sbar); Sbar_DrawArmor (0, 24, 0); // 0, 24, 0 Sbar_DrawHealth (112, 136, 0); // 112, 136, 0 Sbar_DrawHipKeys (209, 3); // keys (hipnotic only) 209, 3 Sbar_DrawAmmo (224, 248, 0); // 224, 248, 0 } else if (sbar.value == 4) { #define SBAR_PADDING 4 if (rogue || hipnotic) Sbar_SoloScoreboard (SBAR_PADDING, -49, 1); else Sbar_SoloScoreboard (SBAR_PADDING, -33, 1); Sbar_DrawAmmoList (320 - SBAR_PADDING - 28, -9, 1); Sbar_DrawWeaponList (320 - SBAR_PADDING - 24, -48, 1); if (rogue) Sbar_DrawKeys (320 - SBAR_PADDING - 56, -16); else Sbar_DrawKeys (320 - SBAR_PADDING - 88, -16); if (rogue || hipnotic) { Sbar_DrawPowerUps (SBAR_PADDING, -40); Sbar_DrawPowerups_Rogue (64 + SBAR_PADDING, -40); Sbar_DrawPowerups_Hipnotic (64 + SBAR_PADDING, -40); } else Sbar_DrawPowerUps (320 - SBAR_PADDING - 88, -32); Sbar_DrawRunes (320 - SBAR_PADDING - 56, -16); // sigils // Sbar_DrawFrags (); // TO DO Sbar_DrawArmor (SBAR_PADDING, 24 + SBAR_PADDING, -24); Sbar_DrawHealth (SBAR_PADDING, 24 + SBAR_PADDING, 0); Sbar_DrawHipKeys (320 - SBAR_PADDING - 40, -18); // keys (hipnotic only) Sbar_DrawAmmo (320 - SBAR_PADDING - 24, 320 - SBAR_PADDING - 96, 0); } if (cl.gametype == GAME_DEATHMATCH) if (sb_showscores || cl.stats[STAT_HEALTH] <= 0) Sbar_DeathmatchOverlay (); // mankrip - end }