930 lines · 17.0 KB · C
RawDownload
// screen.c -- master for refresh, status bar, console, chat, notify, etc #include <math.h>#include "quakedef.h"#include "r_shared.h"#include "r_local.h" // only the refresh window will be updated unless these variables are flaggedint scr_copytop;int scr_copyeverything; float scr_con_current;float scr_conlines; // lines of console to display float oldscreensize, oldfov;cvar_t scr_viewsize = {"viewsize","100", true};cvar_t scr_fov = {"fov","90"}; // 10 - 170cvar_t scr_conspeed = {"scr_conspeed","300"};cvar_t scr_centertime = {"scr_centertime","2"};cvar_t scr_showram = {"showram","1"};cvar_t scr_showturtle = {"showturtle","0"};cvar_t scr_showpause = {"showpause","1"};cvar_t scr_printspeed = {"scr_printspeed","8"}; bool scr_initialized; // ready to draw qpic_t *scr_ram;qpic_t *scr_net;qpic_t *scr_turtle; int scr_fullupdate; int clearconsole;int clearnotify; viddef_t vid; // global video state vrect_t *pconupdate;vrect_t scr_vrect; bool scr_disabled_for_loading;bool scr_drawloading;float scr_disabled_time;bool scr_skipupdate; bool block_drawing; void SCR_ScreenShot_f (void); /*=============================================================================== CENTER PRINTING ===============================================================================*/ char scr_centerstring[1024];float scr_centertime_start; // for slow victory printingfloat scr_centertime_off;int scr_center_lines;int scr_erase_lines;int scr_erase_center; /*==============SCR_CenterPrint Called for important messages that should stay in the center of the screenfor a few moments==============*/void SCR_CenterPrint (char *str){	strncpy (scr_centerstring, str, sizeof(scr_centerstring)-1);	scr_centertime_off = scr_centertime.value;	scr_centertime_start = cl.time; // count the number of lines for centering	scr_center_lines = 1;	while (*str)	{		if (*str == '\n')			scr_center_lines++;		str++;	}} 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_DrawCenterString (void){	char *start;	int l;	int j;	int x, y;	int remaining; // the finale prints the characters one at a time	if (cl.intermission)		remaining = scr_printspeed.value * (cl.time - scr_centertime_start);	else		remaining = 9999; 	scr_erase_center = 0;	start = scr_centerstring; 	if (scr_center_lines <= 4)		y = vid.height*0.35;	else		y = 48; 	do	{	// scan the width of the line		for (l=0 ; l<40 ; l++)			if (start[l] == '\n' || !start[l])				break;		x = (vid.width - l*8)/2;		for (j=0 ; j<l ; j++, x+=8)		{			Draw_Character (x, y, start[j]);			if (!remaining--)				return;		} 		y += 8; 		while (*start && *start != '\n')			start++; 		if (!*start)			break;		start++; // skip the \n	} while (1);} void SCR_CheckDrawCenterString (void){	scr_copytop = 1;	if (scr_center_lines > scr_erase_lines)		scr_erase_lines = scr_center_lines; 	scr_centertime_off -= host_frametime; 	if (scr_centertime_off <= 0 && !cl.intermission)		return;	if (key_dest != key_game)		return; 	SCR_DrawCenterString ();} //============================================================================= /*====================CalcFov====================*/float CalcFov (float fov_x, float width, float height){        float a;        float x;         if (fov_x < 1 || fov_x > 179)                Sys_Error ("Bad fov: %f", fov_x);         x = width/tan(fov_x/360*M_PI);         a = atan (height/x);         a = a*360/M_PI;         return a;} /*=================SCR_CalcRefdef Must be called whenever vid changesInternal use only=================*/static void SCR_CalcRefdef (void){	vrect_t vrect;	float size; 	scr_fullupdate = 0; // force a background redraw	vid.recalc_refdef = 0; // force the status bar to redraw	Sbar_Changed (); //======================================== // bound viewsize	if (scr_viewsize.value < 30)		Cvar_Set ("viewsize","30");	if (scr_viewsize.value > 120)		Cvar_Set ("viewsize","120"); // bound field of view	if (scr_fov.value < 10)		Cvar_Set ("fov","10");	if (scr_fov.value > 170)		Cvar_Set ("fov","170"); 	r_refdef.fov_x = scr_fov.value;	r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.vrect.width, r_refdef.vrect.height); // intermission is always full screen	if (cl.intermission)		size = 120;	else		size = scr_viewsize.value; 	if (size >= 120)		sb_lines = 0; // no status bar at all	else if (size >= 110)		sb_lines = 24; // no inventory	else		sb_lines = 24+16+8; // these calculations mirror those in R_Init() for r_refdef, but take no// account of water warping	vrect.x = 0;	vrect.y = 0;	vrect.width = vid.width;	vrect.height = vid.height; 	R_SetVrect (&vrect, &scr_vrect, sb_lines); // guard against going from one mode to another that's less than half the// vertical resolution	if (scr_con_current > vid.height)		scr_con_current = vid.height; // notify the refresh of the change	R_ViewChanged (&vrect, sb_lines, vid.aspect);} /*=================SCR_SizeUp_f Keybinding command=================*/void SCR_SizeUp_f (void){	Cvar_SetValue ("viewsize",scr_viewsize.value+10);	vid.recalc_refdef = 1;} /*=================SCR_SizeDown_f Keybinding command=================*/void SCR_SizeDown_f (void){	Cvar_SetValue ("viewsize",scr_viewsize.value-10);	vid.recalc_refdef = 1;} //============================================================================ /*==================SCR_Init==================*/void SCR_Init (void){	Cvar_RegisterVariable (&scr_fov);	Cvar_RegisterVariable (&scr_viewsize);	Cvar_RegisterVariable (&scr_conspeed);	Cvar_RegisterVariable (&scr_showram);	Cvar_RegisterVariable (&scr_showturtle);	Cvar_RegisterVariable (&scr_showpause);	Cvar_RegisterVariable (&scr_centertime);	Cvar_RegisterVariable (&scr_printspeed); //// register our commands//	Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);	Cmd_AddCommand ("sizeup",SCR_SizeUp_f);	Cmd_AddCommand ("sizedown",SCR_SizeDown_f); 	scr_ram = Draw_PicFromWad ("ram");	scr_net = Draw_PicFromWad ("net");	scr_turtle = Draw_PicFromWad ("turtle"); 	scr_initialized = true;} /*==============SCR_DrawRam==============*/void SCR_DrawRam (void){	if (!scr_showram.value)		return; 	if (!r_cache_thrash)		return; 	Draw_Pic (scr_vrect.x+32, scr_vrect.y, scr_ram);} /*==============SCR_DrawTurtle==============*/void SCR_DrawTurtle (void){	static int count; 	if (!scr_showturtle.value)		return; 	if (host_frametime < 0.1)	{		count = 0;		return;	} 	count++;	if (count < 3)		return; 	Draw_Pic (scr_vrect.x, scr_vrect.y, scr_turtle);} /*==============SCR_DrawNet==============*/void SCR_DrawNet (void){	if (realtime - cl.last_received_message < 0.3)		return;	if (cls.demoplayback)		return; 	Draw_Pic (scr_vrect.x+64, scr_vrect.y, scr_net);} /*==============DrawPause==============*/void SCR_DrawPause (void){	qpic_t *pic; 	if (!scr_showpause.value) // turn off for screenshots		return; 	if (!cl.paused)		return; 	pic = Draw_CachePic ("gfx/pause.lmp");	Draw_Pic ( (vid.width - pic->width)/2,		(vid.height - 48 - pic->height)/2, pic);} /*==============SCR_DrawLoading==============*/void SCR_DrawLoading (void){	qpic_t *pic; 	if (!scr_drawloading)		return; 	pic = Draw_CachePic ("gfx/loading.lmp");	Draw_Pic ( (vid.width - pic->width)/2,		(vid.height - 48 - pic->height)/2, pic);} //============================================================================= /*==================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	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 	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;} /*==================SCR_DrawConsole==================*/void SCR_DrawConsole (void){	if (scr_con_current)	{		scr_copyeverything = 1;		Con_DrawConsole (scr_con_current, true);		clearconsole = 0;	}	else	{		if (key_dest == key_game || key_dest == key_message)			Con_DrawNotify (); // only draw notify in game	}} /*============================================================================== 						SCREEN SHOTS ==============================================================================*/ typedef struct{    char manufacturer;    char version;

Lines 1–500 of 930.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t