gl_vidnt.c
来自「quake1 dos源代码最新版本」· C语言 代码 · 共 1,980 行 · 第 1/4 页
C
1,980 行
nummodes++;
}
}
}
switch (bpp)
{
case 16:
bpp = 32;
break;
case 32:
bpp = 24;
break;
case 24:
done = 1;
break;
}
} while (!done);
if (nummodes == originalnummodes)
Con_SafePrintf ("No fullscreen DIB modes found\n");
}
qboolean VID_Is8bit() {
return is8bit;
}
#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
void VID_Init8bitPalette()
{
// Check for 8bit Extensions and initialize them.
int i;
char thePalette[256*3];
char *oldPalette, *newPalette;
glColorTableEXT = (void *)wglGetProcAddress("glColorTableEXT");
if (!glColorTableEXT || strstr(gl_extensions, "GL_EXT_shared_texture_palette") ||
COM_CheckParm("-no8bit"))
return;
Con_SafePrintf("8-bit GL extensions enabled.\n");
glEnable( GL_SHARED_TEXTURE_PALETTE_EXT );
oldPalette = (char *) d_8to24table; //d_8to24table3dfx;
newPalette = thePalette;
for (i=0;i<256;i++) {
*newPalette++ = *oldPalette++;
*newPalette++ = *oldPalette++;
*newPalette++ = *oldPalette++;
oldPalette++;
}
glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT, GL_RGB, 256, GL_RGB, GL_UNSIGNED_BYTE,
(void *) thePalette);
is8bit = TRUE;
}
static void Check_Gamma (unsigned char *pal)
{
float f, inf;
unsigned char palette[768];
int i;
if ((i = COM_CheckParm("-gamma")) == 0) {
if ((gl_renderer && strstr(gl_renderer, "Voodoo")) ||
(gl_vendor && strstr(gl_vendor, "3Dfx")))
vid_gamma = 1;
else
vid_gamma = 0.7; // default to 0.7 on non-3dfx hardware
} else
vid_gamma = Q_atof(com_argv[i+1]);
for (i=0 ; i<768 ; i++)
{
f = pow ( (pal[i]+1)/256.0 , vid_gamma );
inf = f*255 + 0.5;
if (inf < 0)
inf = 0;
if (inf > 255)
inf = 255;
palette[i] = inf;
}
memcpy (pal, palette, sizeof(palette));
}
// 2001-09-18 New cvar system by Maddes (Init) start
/*
===================
VID_Init_Cvars
===================
*/
void VID_Init_Cvars (void)
{
vid_mode = Cvar_Get ("vid_mode", "0", CVAR_ORIGINAL);
vid_wait = Cvar_Get ("vid_wait", "0", CVAR_ORIGINAL);
vid_nopageflip = Cvar_Get ("vid_nopageflip", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_wait_override = Cvar_Get ("_vid_wait_override", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode = Cvar_Get ("_vid_default_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode_win = Cvar_Get ("_vid_default_mode_win", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_x = Cvar_Get ("vid_config_x", "800", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_y = Cvar_Get ("vid_config_y", "600", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_stretch_by_2 = Cvar_Get ("vid_stretch_by_2", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
_windowed_mouse = Cvar_Get ("_windowed_mouse", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
gl_ztrick = Cvar_Get ("gl_ztrick", "1", CVAR_ORIGINAL);
}
// 2001-09-18 New cvar system by Maddes (Init) end
/*
===================
VID_Init
===================
*/
void VID_Init (unsigned char *palette)
{
int i, existingmode;
int width, height, bpp, findbpp, done; //basenummodes, // 2001-12-10 Reduced compiler warnings by Jeff Ford
byte *ptmp;
char gldir[MAX_OSPATH];
HDC hdc;
DEVMODE devmode;
memset(&devmode, 0, sizeof(devmode));
// 2001-09-18 New cvar system by Maddes (Init) start
/*
vid_mode = Cvar_Get ("vid_mode", "0", CVAR_ORIGINAL);
vid_wait = Cvar_Get ("vid_wait", "0", CVAR_ORIGINAL);
vid_nopageflip = Cvar_Get ("vid_nopageflip", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_wait_override = Cvar_Get ("_vid_wait_override", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode = Cvar_Get ("_vid_default_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode_win = Cvar_Get ("_vid_default_mode_win", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_x = Cvar_Get ("vid_config_x", "800", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_y = Cvar_Get ("vid_config_y", "600", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_stretch_by_2 = Cvar_Get ("vid_stretch_by_2", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
_windowed_mouse = Cvar_Get ("_windowed_mouse", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
gl_ztrick = Cvar_Get ("gl_ztrick", "1", CVAR_ORIGINAL);
*/
// 2001-09-18 New cvar system by Maddes (Init) end
Cmd_AddCommand ("vid_nummodes", VID_NumModes_f);
Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f);
Cmd_AddCommand ("vid_describemode", VID_DescribeMode_f);
Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f);
hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1));
InitCommonControls();
VID_InitDIB (global_hInstance);
nummodes = 1; //basenummodes = // 2001-12-10 Reduced compiler warnings by Jeff Ford
VID_InitFullDIB (global_hInstance);
if (COM_CheckParm("-window"))
{
hdc = GetDC (NULL);
if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
{
Sys_Error ("Can't run in non-RGB mode");
}
ReleaseDC (NULL, hdc);
windowed = true;
vid_default = MODE_WINDOWED;
}
else
{
if (nummodes == 1)
Sys_Error ("No RGB fullscreen modes available");
windowed = false;
if (COM_CheckParm("-mode"))
{
vid_default = Q_atoi(com_argv[COM_CheckParm("-mode")+1]);
}
else
{
if (COM_CheckParm("-current"))
{
modelist[MODE_FULLSCREEN_DEFAULT].width =
GetSystemMetrics (SM_CXSCREEN);
modelist[MODE_FULLSCREEN_DEFAULT].height =
GetSystemMetrics (SM_CYSCREEN);
vid_default = MODE_FULLSCREEN_DEFAULT;
leavecurrentmode = 1;
}
else
{
if (COM_CheckParm("-width"))
{
width = Q_atoi(com_argv[COM_CheckParm("-width")+1]);
}
else
{
width = 640;
}
if (COM_CheckParm("-bpp"))
{
bpp = Q_atoi(com_argv[COM_CheckParm("-bpp")+1]);
findbpp = 0;
}
else
{
bpp = 15;
findbpp = 1;
}
if (COM_CheckParm("-height"))
height = Q_atoi(com_argv[COM_CheckParm("-height")+1]);
// if they want to force it, add the specified mode to the list
if (COM_CheckParm("-force") && (nummodes < MAX_MODE_LIST))
{
modelist[nummodes].type = MS_FULLDIB;
modelist[nummodes].width = width;
modelist[nummodes].height = height;
modelist[nummodes].modenum = 0;
modelist[nummodes].halfscreen = 0;
modelist[nummodes].dib = 1;
modelist[nummodes].fullscreen = 1;
modelist[nummodes].bpp = bpp;
sprintf (modelist[nummodes].modedesc, "%dx%dx%d",
devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode.dmBitsPerPel);
for (i=nummodes, existingmode = 0 ; i<nummodes ; i++)
{
if ((modelist[nummodes].width == modelist[i].width) &&
(modelist[nummodes].height == modelist[i].height) &&
(modelist[nummodes].bpp == modelist[i].bpp))
{
existingmode = 1;
break;
}
}
if (!existingmode)
{
nummodes++;
}
}
done = 0;
do
{
if (COM_CheckParm("-height"))
{
height = Q_atoi(com_argv[COM_CheckParm("-height")+1]);
for (i=1, vid_default=0 ; i<nummodes ; i++)
{
if ((modelist[i].width == width) &&
(modelist[i].height == height) &&
(modelist[i].bpp == bpp))
{
vid_default = i;
done = 1;
break;
}
}
}
else
{
for (i=1, vid_default=0 ; i<nummodes ; i++)
{
if ((modelist[i].width == width) && (modelist[i].bpp == bpp))
{
vid_default = i;
done = 1;
break;
}
}
}
if (!done)
{
if (findbpp)
{
switch (bpp)
{
case 15:
bpp = 16;
break;
case 16:
bpp = 32;
break;
case 32:
bpp = 24;
break;
case 24:
done = 1;
break;
}
}
else
{
done = 1;
}
}
} while (!done);
if (!vid_default)
{
Sys_Error ("Specified video mode not available");
}
}
}
}
vid_initialized = true;
if ((i = COM_CheckParm("-conwidth")) != 0)
vid.conwidth = Q_atoi(com_argv[i+1]);
else
vid.conwidth = 640;
vid.conwidth &= 0xfff8; // make it a multiple of eight
if (vid.conwidth < 320)
vid.conwidth = 320;
// pick a conheight that matches with correct aspect
vid.conheight = vid.conwidth*3 / 4;
if ((i = COM_CheckParm("-conheight")) != 0)
vid.conheight = Q_atoi(com_argv[i+1]);
if (vid.conheight < 200)
vid.conheight = 200;
vid.maxwarpwidth = WARP_WIDTH;
vid.maxwarpheight = WARP_HEIGHT;
vid.colormap = host_colormap;
vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
DestroyWindow (hwnd_dialog);
Check_Gamma(palette);
VID_SetPalette (palette);
VID_SetMode (vid_default, palette);
maindc = GetDC(mainwindow);
bSetupPixelFormat(maindc);
baseRC = wglCreateContext( maindc );
if (!baseRC)
Sys_Error ("Could not initialize GL (wglCreateContext failed).\n\nMake sure you in are 65535 color mode, and try running -window.");
if (!wglMakeCurrent( maindc, baseRC ))
Sys_Error ("wglMakeCurrent failed");
GL_Init ();
sprintf (gldir, "%s/glquake", com_gamedir);
Sys_mkdir (gldir);
vid_realmode = vid_modenum;
// Check for 3DFX Extensions and initialize them.
VID_Init8bitPalette();
vid_menudrawfn = VID_MenuDraw;
vid_menukeyfn = VID_MenuKey;
strcpy (badmode.modedesc, "Bad mode");
vid_canalttab = true;
if (COM_CheckParm("-fullsbar"))
fullsbardraw = true;
}
//========================================================
// Video menu stuff
//========================================================
extern void M_Menu_Options_f (void);
extern void M_Print (int cx, int cy, char *str);
extern void M_PrintWhite (int cx, int cy, char *str);
extern void M_DrawCharacter (int cx, int line, int num);
extern void M_DrawTransPic (int x, int y, qpic_t *pic);
extern void M_DrawPic (int x, int y, qpic_t *pic);
static int vid_wmodes; //vid_line, // 2001-12-10 Reduced compiler warnings by Jeff Ford
typedef struct
{
int modenum;
char *desc;
int iscur;
} modedesc_t;
#define MAX_COLUMN_SIZE 9
#define MODE_AREA_HEIGHT (MAX_COLUMN_SIZE + 2)
#define MAX_MODEDESCS (MAX_COLUMN_SIZE*3)
static modedesc_t modedescs[MAX_MODEDESCS];
/*
================
VID_MenuDraw
================
*/
void VID_MenuDraw (void)
{
qpic_t *p;
char *ptr;
int lnummodes, i, j, k, column, row, dup, dupmode;
char temp[100];
vmode_t *pv;
p = Draw_CachePic ("gfx/vidmodes.lmp");
M_DrawPic ( (320-p->width)/2, 4, p);
vid_wmodes = 0;
lnummodes = VID_NumModes ();
for (i=1 ; (i<lnummodes) && (vid_wmodes < MAX_MODEDESCS) ; i++)
{
ptr = VID_GetModeDescription (i);
pv = VID_GetModePtr (i);
k = vid_wmodes;
modedescs[k].modenum = i;
modedescs[k].desc = ptr;
modedescs[k].iscur = 0;
if (i == vid_modenum)
modedescs[k].iscur = 1;
vid_wmodes++;
}
if (vid_wmodes > 0)
{
M_Print (2*8, 36+0*8, "Fullscreen Modes (WIDTHxHEIGHTxBPP)");
column = 8;
row = 36+2*8;
for (i=0 ; i<vid_wmodes ; i++)
{
if (modedescs[i].iscur)
M_PrintWhite (column, row, modedescs[i].desc);
else
M_Print (column, row, modedescs[i].desc);
column += 13*8;
if ((i % VID_ROW_SIZE) == (VID_ROW_SIZE - 1))
{
column = 8;
row += 8;
}
}
}
M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*2,
"Video modes must be set from the");
M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*3,
"command line with -width <width>");
M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4,
"and -bpp <bits-per-pixel>");
M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6,
"Select windowed mode with -window");
}
/*
================
VID_MenuKey
================
*/
void VID_MenuKey (int key)
{
switch (key)
{
case K_ESCAPE:
S_LocalSound ("misc/menu1.wav");
M_Menu_Options_f ();
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?