📄 gl_rmain.c
字号:
strcpy( vendor_buffer, gl_config.vendor_string );
strlwr( vendor_buffer );
if ( strstr( renderer_buffer, "voodoo" ) )
{
if ( !strstr( renderer_buffer, "rush" ) )
gl_config.renderer = GL_RENDERER_VOODOO;
else
gl_config.renderer = GL_RENDERER_VOODOO_RUSH;
}
else if ( strstr( vendor_buffer, "sgi" ) )
gl_config.renderer = GL_RENDERER_SGI;
else if ( strstr( renderer_buffer, "permedia" ) )
gl_config.renderer = GL_RENDERER_PERMEDIA2;
else if ( strstr( renderer_buffer, "glint" ) )
gl_config.renderer = GL_RENDERER_GLINT_MX;
else if ( strstr( renderer_buffer, "glzicd" ) )
gl_config.renderer = GL_RENDERER_REALIZM;
else if ( strstr( renderer_buffer, "gdi" ) )
gl_config.renderer = GL_RENDERER_MCD;
else if ( strstr( renderer_buffer, "pcx2" ) )
gl_config.renderer = GL_RENDERER_PCX2;
else if ( strstr( renderer_buffer, "verite" ) )
gl_config.renderer = GL_RENDERER_RENDITION;
else
gl_config.renderer = GL_RENDERER_OTHER;
if ( toupper( gl_monolightmap->string[1] ) != 'F' )
{
if ( gl_config.renderer == GL_RENDERER_PERMEDIA2 )
{
ri.Cvar_Set( "gl_monolightmap", "A" );
ri.Con_Printf( PRINT_ALL, "...using gl_monolightmap 'a'\n" );
}
else if ( gl_config.renderer & GL_RENDERER_POWERVR )
{
ri.Cvar_Set( "gl_monolightmap", "0" );
}
else
{
ri.Cvar_Set( "gl_monolightmap", "0" );
}
}
// power vr can't have anything stay in the framebuffer, so
// the screen needs to redraw the tiled background every frame
if ( gl_config.renderer & GL_RENDERER_POWERVR )
{
ri.Cvar_Set( "scr_drawall", "1" );
}
else
{
ri.Cvar_Set( "scr_drawall", "0" );
}
#ifdef __linux__
ri.Cvar_SetValue( "gl_finish", 1 );
#endif
// MCD has buffering issues
if ( gl_config.renderer == GL_RENDERER_MCD )
{
ri.Cvar_SetValue( "gl_finish", 1 );
}
if ( gl_config.renderer & GL_RENDERER_3DLABS )
{
if ( gl_3dlabs_broken->value )
gl_config.allow_cds = false;
else
gl_config.allow_cds = true;
}
else
{
gl_config.allow_cds = true;
}
if ( gl_config.allow_cds )
ri.Con_Printf( PRINT_ALL, "...allowing CDS\n" );
else
ri.Con_Printf( PRINT_ALL, "...disabling CDS\n" );
/*
** grab extensions
*/
if ( strstr( gl_config.extensions_string, "GL_EXT_compiled_vertex_array" ) ||
strstr( gl_config.extensions_string, "GL_SGI_compiled_vertex_array" ) )
{
ri.Con_Printf( PRINT_ALL, "...enabling GL_EXT_compiled_vertex_array\n" );
qglLockArraysEXT = ( void * ) qwglGetProcAddress( "glLockArraysEXT" );
qglUnlockArraysEXT = ( void * ) qwglGetProcAddress( "glUnlockArraysEXT" );
}
else
{
ri.Con_Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" );
}
#ifdef _WIN32
if ( strstr( gl_config.extensions_string, "WGL_EXT_swap_control" ) )
{
qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" );
ri.Con_Printf( PRINT_ALL, "...enabling WGL_EXT_swap_control\n" );
}
else
{
ri.Con_Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" );
}
#endif
if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) )
{
if ( gl_ext_pointparameters->value )
{
qglPointParameterfEXT = ( void (APIENTRY *)( GLenum, GLfloat ) ) qwglGetProcAddress( "glPointParameterfEXT" );
qglPointParameterfvEXT = ( void (APIENTRY *)( GLenum, const GLfloat * ) ) qwglGetProcAddress( "glPointParameterfvEXT" );
ri.Con_Printf( PRINT_ALL, "...using GL_EXT_point_parameters\n" );
}
else
{
ri.Con_Printf( PRINT_ALL, "...ignoring GL_EXT_point_parameters\n" );
}
}
else
{
ri.Con_Printf( PRINT_ALL, "...GL_EXT_point_parameters not found\n" );
}
#ifdef __linux__
if ( strstr( gl_config.extensions_string, "3DFX_set_global_palette" ))
{
if ( gl_ext_palettedtexture->value )
{
ri.Con_Printf( PRINT_ALL, "...using 3DFX_set_global_palette\n" );
qgl3DfxSetPaletteEXT = ( void ( APIENTRY * ) (GLuint *) )qwglGetProcAddress( "gl3DfxSetPaletteEXT" );
qglColorTableEXT = Fake_glColorTableEXT;
}
else
{
ri.Con_Printf( PRINT_ALL, "...ignoring 3DFX_set_global_palette\n" );
}
}
else
{
ri.Con_Printf( PRINT_ALL, "...3DFX_set_global_palette not found\n" );
}
#endif
if ( !qglColorTableEXT &&
strstr( gl_config.extensions_string, "GL_EXT_paletted_texture" ) &&
strstr( gl_config.extensions_string, "GL_EXT_shared_texture_palette" ) )
{
if ( gl_ext_palettedtexture->value )
{
ri.Con_Printf( PRINT_ALL, "...using GL_EXT_shared_texture_palette\n" );
qglColorTableEXT = ( void ( APIENTRY * ) ( int, int, int, int, int, const void * ) ) qwglGetProcAddress( "glColorTableEXT" );
}
else
{
ri.Con_Printf( PRINT_ALL, "...ignoring GL_EXT_shared_texture_palette\n" );
}
}
else
{
ri.Con_Printf( PRINT_ALL, "...GL_EXT_shared_texture_palette not found\n" );
}
if ( strstr( gl_config.extensions_string, "GL_ARB_multitexture" ) )
{
if ( gl_ext_multitexture->value )
{
ri.Con_Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" );
qglMTexCoord2fSGIS = ( void * ) qwglGetProcAddress( "glMultiTexCoord2fARB" );
qglActiveTextureARB = ( void * ) qwglGetProcAddress( "glActiveTextureARB" );
qglClientActiveTextureARB = ( void * ) qwglGetProcAddress( "glClientActiveTextureARB" );
GL_TEXTURE0 = GL_TEXTURE0_ARB;
GL_TEXTURE1 = GL_TEXTURE1_ARB;
}
else
{
ri.Con_Printf( PRINT_ALL, "...ignoring GL_ARB_multitexture\n" );
}
}
else
{
ri.Con_Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" );
}
if ( strstr( gl_config.extensions_string, "GL_SGIS_multitexture" ) )
{
if ( qglActiveTextureARB )
{
ri.Con_Printf( PRINT_ALL, "...GL_SGIS_multitexture deprecated in favor of ARB_multitexture\n" );
}
else if ( gl_ext_multitexture->value )
{
ri.Con_Printf( PRINT_ALL, "...using GL_SGIS_multitexture\n" );
qglMTexCoord2fSGIS = ( void * ) qwglGetProcAddress( "glMTexCoord2fSGIS" );
qglSelectTextureSGIS = ( void * ) qwglGetProcAddress( "glSelectTextureSGIS" );
GL_TEXTURE0 = GL_TEXTURE0_SGIS;
GL_TEXTURE1 = GL_TEXTURE1_SGIS;
}
else
{
ri.Con_Printf( PRINT_ALL, "...ignoring GL_SGIS_multitexture\n" );
}
}
else
{
ri.Con_Printf( PRINT_ALL, "...GL_SGIS_multitexture not found\n" );
}
GL_SetDefaultState();
/*
** draw our stereo patterns
*/
#if 0 // commented out until H3D pays us the money they owe us
GL_DrawStereoPattern();
#endif
GL_InitImages ();
Mod_Init ();
R_InitParticleTexture ();
Draw_InitLocal ();
err = qglGetError();
if ( err != GL_NO_ERROR )
ri.Con_Printf (PRINT_ALL, "glGetError() = 0x%x\n", err);
}
/*
===============
R_Shutdown
===============
*/
void R_Shutdown (void)
{
ri.Cmd_RemoveCommand ("modellist");
ri.Cmd_RemoveCommand ("screenshot");
ri.Cmd_RemoveCommand ("imagelist");
ri.Cmd_RemoveCommand ("gl_strings");
Mod_FreeAll ();
GL_ShutdownImages ();
/*
** shut down OS specific OpenGL stuff like contexts, etc.
*/
GLimp_Shutdown();
/*
** shutdown our QGL subsystem
*/
QGL_Shutdown();
}
/*
@@@@@@@@@@@@@@@@@@@@@
R_BeginFrame
@@@@@@@@@@@@@@@@@@@@@
*/
void R_BeginFrame( float camera_separation )
{
gl_state.camera_separation = camera_separation;
/*
** change modes if necessary
*/
if ( gl_mode->modified || vid_fullscreen->modified )
{ // FIXME: only restart if CDS is required
cvar_t *ref;
ref = ri.Cvar_Get ("vid_ref", "gl", 0);
ref->modified = true;
}
if ( gl_log->modified )
{
GLimp_EnableLogging( gl_log->value );
gl_log->modified = false;
}
if ( gl_log->value )
{
GLimp_LogNewFrame();
}
/*
** update 3Dfx gamma -- it is expected that a user will do a vid_restart
** after tweaking this value
*/
if ( vid_gamma->modified )
{
vid_gamma->modified = false;
if ( gl_config.renderer & ( GL_RENDERER_VOODOO ) )
{
char envbuffer[1024];
float g;
g = 2.00 * ( 0.8 - ( vid_gamma->value - 0.5 ) ) + 1.0F;
Com_sprintf( envbuffer, sizeof(envbuffer), "SSTV2_GAMMA=%f", g );
putenv( envbuffer );
Com_sprintf( envbuffer, sizeof(envbuffer), "SST_GAMMA=%f", g );
putenv( envbuffer );
}
}
GLimp_BeginFrame( camera_separation );
/*
** go into 2D mode
*/
qglViewport (0,0, vid.width, vid.height);
qglMatrixMode(GL_PROJECTION);
qglLoadIdentity ();
qglOrtho (0, vid.width, vid.height, 0, -99999, 99999);
qglMatrixMode(GL_MODELVIEW);
qglLoadIdentity ();
qglDisable (GL_DEPTH_TEST);
qglDisable (GL_CULL_FACE);
qglDisable (GL_BLEND);
qglEnable (GL_ALPHA_TEST);
qglColor4f (1,1,1,1);
/*
** draw buffer stuff
*/
if ( gl_drawbuffer->modified )
{
gl_drawbuffer->modified = false;
if ( gl_state.camera_separation == 0 || !gl_state.stereo_enabled )
{
if ( Q_stricmp( gl_drawbuffer->string, "GL_FRONT" ) == 0 )
qglDrawBuffer( GL_FRONT );
else
qglDrawBuffer( GL_BACK );
}
}
/*
** texturemode stuff
*/
if ( gl_texturemode->modified )
{
GL_TextureMode( gl_texturemode->string );
gl_texturemode->modified = false;
}
if ( gl_texturealphamode->modified )
{
GL_TextureAlphaMode( gl_texturealphamode->string );
gl_texturealphamode->modified = false;
}
if ( gl_texturesolidmode->modified )
{
GL_TextureSolidMode( gl_texturesolidmode->string );
gl_texturesolidmode->modified = false;
}
/*
** swapinterval stuff
*/
GL_UpdateSwapInterval();
//
// clear screen if desired
//
R_Clear ();
}
/*
=============
R_SetPalette
=============
*/
unsigned r_rawpalette[256];
void R_SetPalette ( const unsigned char *palette)
{
int i;
byte *rp = ( byte * ) r_rawpalette;
if ( palette )
{
for ( i = 0; i < 256; i++ )
{
rp[i*4+0] = palette[i*3+0];
rp[i*4+1] = palette[i*3+1];
rp[i*4+2] = palette[i*3+2];
rp[i*4+3] = 0xff;
}
}
else
{
for ( i = 0; i < 256; i++ )
{
rp[i*4+0] = d_8to24table[i] & 0xff;
rp[i*4+1] = ( d_8to24table[i] >> 8 ) & 0xff;
rp[i*4+2] = ( d_8to24table[i] >> 16 ) & 0xff;
rp[i*4+3] = 0xff;
}
}
GL_SetTexturePalette( r_rawpalette );
qglClearColor (0,0,0,0);
qglClear (GL_COLOR_BUFFER_BIT);
qglClearColor (1,0, 0.5 , 0.5);
}
/*
** R_DrawBeam
*/
void R_DrawBeam( entity_t *e )
{
#define NUM_BEAM_SEGS 6
int i;
float r, g, b;
vec3_t perpvec;
vec3_t direction, normalized_direction;
vec3_t start_points[NUM_BEAM_SEGS], end_points[NUM_BEAM_SEGS];
vec3_t oldorigin, origin;
oldorigin[0] = e->oldorigin[0];
oldorigin[1] = e->oldorigin[1];
oldorigin[2] = e->oldorigin[2];
origin[0] = e->origin[0];
origin[1] = e->origin[1];
origin[2] = e->origin[2];
normalized_direction[0] = direction[0] = oldorigin[0] - origin[0];
normalized_direction[1] = direction[1] = oldorigin[1] - origin[1];
normalized_direction[2] = direction[2] = oldorigin[2] - origin[2];
if ( VectorNormalize( normalized_direction ) == 0 )
return;
PerpendicularVector( perpvec, normalized_direction );
VectorScale( perpvec, e->frame / 2, perpvec );
for ( i = 0; i < 6; i++ )
{
RotatePointAroundVector( start_points[i], normalized_direction, perpvec, (360.0/NUM_BEAM_SEGS)*i );
VectorAdd( start_points[i], origin, start_points[i] );
VectorAdd( start_points[i], direction, end_points[i] );
}
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_BLEND );
qglDepthMask( GL_FALSE );
r = ( d_8to24table[e->skinnum & 0xFF] ) & 0xFF;
g = ( d_8to24table[e->skinnum & 0xFF] >> 8 ) & 0xFF;
b = ( d_8to24table[e->skinnum & 0xFF] >> 16 ) & 0xFF;
r *= 1/255.0F;
g *= 1/255.0F;
b *= 1/255.0F;
qglColor4f( r, g, b, e->alpha );
qglBegin( GL_TRIANGLE_STRIP );
for ( i = 0; i < NUM_BEAM_SEGS; i++ )
{
qglVertex3fv( start_points[i] );
qglVertex3fv( end_points[i] );
qglVertex3fv( start_points[(i+1)%NUM_BEAM_SEGS] );
qglVertex3fv( end_points[(i+1)%NUM_BEAM_SEGS] );
}
qglEnd();
qglEnable( GL_TEXTURE_2D );
qglDisable( GL_BLEND );
qglDepthMask( GL_TRUE );
}
//===================================================================
void R_BeginRegistration (char *map);
struct model_s *R_RegisterModel (char *name);
struct image_s *R_RegisterSkin (char *name);
void R_SetSky (char *name, float rotate, vec3_t axis);
void R_EndRegistration (void);
void R_RenderFrame (refdef_t *fd);
struct image_s *Draw_FindPic (char *name);
void Draw_Pic (int x, int y, char *name);
void Draw_Char (int x, int y, int c);
void Draw_TileClear (int x, int y, int w, int h, char *name);
void Draw_Fill (int x, int y, int w, int h, int c);
void Draw_FadeScreen (void);
/*
@@@@@@@@@@@@@@@@@@@@@
GetRefAPI
@@@@@@@@@@@@@@@@@@@@@
*/
refexport_t GetRefAPI (refimport_t rimp )
{
refexport_t re;
ri = rimp;
re.api_version = API_VERSION;
re.BeginRegistration = R_BeginRegistration;
re.RegisterModel = R_RegisterModel;
re.RegisterSkin = R_RegisterSkin;
re.RegisterPic = Draw_FindPic;
re.SetSky = R_SetSky;
re.EndRegistration = R_EndRegistration;
re.RenderFrame = R_RenderFrame;
re.DrawGetPicSize = Draw_GetPicSize;
re.DrawPic = Draw_Pic;
re.DrawStretchPic = Draw_StretchPic;
re.DrawChar = Draw_Char;
re.DrawTileClear = Draw_TileClear;
re.DrawFill = Draw_Fill;
re.DrawFadeScreen= Draw_FadeScreen;
re.DrawStretchRaw = Draw_StretchRaw;
re.Init = R_Init;
re.Shutdown = R_Shutdown;
re.CinematicSetPalette = R_SetPalette;
re.BeginFrame = R_BeginFrame;
re.EndFrame = GLimp_EndFrame;
re.AppActivate = GLimp_AppActivate;
Swap_Init ();
return re;
}
#ifndef REF_HARD_LINKED
// this is only here so the functions in q_shared.c and q_shwin.c can link
void Sys_Error (char *error, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, error);
vsprintf (text, error, argptr);
va_end (argptr);
ri.Sys_Error (ERR_FATAL, "%s", text);
}
void Com_Printf (char *fmt, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, fmt);
vsprintf (text, fmt, argptr);
va_end (argptr);
ri.Con_Printf (PRINT_ALL, "%s", text);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -