// tr_init.c -- functions that are not called every frame // leave this as first line for PCH reasons... // #include "../server/exe_headers.h" #include "tr_local.h" #include "tr_stl.h" #include "tr_jpeg_interface.h" #include "tr_font.h" #include "tr_WorldEffects.h" glconfig_t glConfig; glstate_t glState; static void GfxInfo_f( void ); void R_TerrainInit(void); void R_TerrainShutdown(void); cvar_t *r_verbose; cvar_t *r_ignore; cvar_t *r_displayRefresh; cvar_t *r_detailTextures; cvar_t *r_znear; cvar_t *r_skipBackEnd; cvar_t *r_ignorehwgamma; cvar_t *r_measureOverdraw; cvar_t *r_fastsky; cvar_t *r_drawSun; cvar_t *r_dynamiclight; cvar_t *r_dlightBacks; cvar_t *r_lodbias; cvar_t *r_lodscale; cvar_t *r_norefresh; cvar_t *r_drawentities; cvar_t *r_drawworld; cvar_t *r_drawfog; cvar_t *r_speeds; cvar_t *r_fullbright; cvar_t *r_novis; cvar_t *r_nocull; cvar_t *r_facePlaneCull; cvar_t *r_showcluster; cvar_t *r_nocurves; cvar_t *r_dlightStyle; cvar_t *r_surfaceSprites; cvar_t *r_surfaceWeather; cvar_t *r_windSpeed; cvar_t *r_windAngle; cvar_t *r_windGust; cvar_t *r_windDampFactor; cvar_t *r_windPointForce; cvar_t *r_windPointX; cvar_t *r_windPointY; cvar_t *r_allowExtensions; cvar_t *r_ext_compressed_textures; cvar_t *r_ext_compressed_lightmaps; cvar_t *r_ext_preferred_tc_method; cvar_t *r_ext_gamma_control; cvar_t *r_ext_multitexture; cvar_t *r_ext_compiled_vertex_array; cvar_t *r_ext_texture_env_add; cvar_t *r_ext_texture_filter_anisotropic; cvar_t *r_DynamicGlow; cvar_t *r_DynamicGlowPasses; cvar_t *r_DynamicGlowDelta; cvar_t *r_DynamicGlowIntensity; cvar_t *r_DynamicGlowSoft; cvar_t *r_DynamicGlowWidth; cvar_t *r_DynamicGlowHeight; // Point sprite support. cvar_t *r_ext_point_parameters; cvar_t *r_ext_nv_point_sprite; cvar_t *r_ignoreGLErrors; cvar_t *r_logFile; cvar_t *r_stencilbits; cvar_t *r_depthbits; cvar_t *r_colorbits; cvar_t *r_stereo; cvar_t *r_primitives; cvar_t *r_texturebits; cvar_t *r_texturebitslm; cvar_t *r_lightmap; cvar_t *r_vertexLight; cvar_t *r_shadows; cvar_t *r_shadowRange; cvar_t *r_flares; cvar_t *r_mode; cvar_t *r_nobind; cvar_t *r_singleShader; cvar_t *r_colorMipLevels; cvar_t *r_picmip; cvar_t *r_showtris; cvar_t *r_showtriscolor; cvar_t *r_showsky; cvar_t *r_shownormals; cvar_t *r_finish; cvar_t *r_clear; cvar_t *r_swapInterval; cvar_t *r_textureMode; cvar_t *r_offsetFactor; cvar_t *r_offsetUnits; cvar_t *r_gamma; cvar_t *r_intensity; cvar_t *r_lockpvs; cvar_t *r_noportals; cvar_t *r_portalOnly; cvar_t *r_subdivisions; cvar_t *r_lodCurveError; cvar_t *r_fullscreen; cvar_t *r_customwidth; cvar_t *r_customheight; cvar_t *r_overBrightBits; cvar_t *r_debugSurface; cvar_t *r_simpleMipMaps; cvar_t *r_showImages; cvar_t *r_ambientScale; cvar_t *r_directedScale; cvar_t *r_debugLight; cvar_t *r_debugSort; cvar_t *r_debugStyle; cvar_t *r_modelpoolmegs; #ifdef _XBOX cvar_t *r_hdreffect; cvar_t *r_sundir_x; cvar_t *r_sundir_y; cvar_t *r_sundir_z; cvar_t *r_hdrbloom; cvar_t *r_hdrcutoff; #endif /* Ghoul2 Insert Start */ cvar_t *r_noGhoul2; cvar_t *r_Ghoul2AnimSmooth; cvar_t *r_Ghoul2UnSqash; cvar_t *r_Ghoul2TimeBase=0; cvar_t *r_Ghoul2NoLerp; cvar_t *r_Ghoul2NoBlend; cvar_t *r_Ghoul2BlendMultiplier=0; cvar_t *r_Ghoul2UnSqashAfterSmooth; cvar_t *broadsword=0; cvar_t *broadsword_kickbones=0; cvar_t *broadsword_kickorigin=0; cvar_t *broadsword_playflop=0; cvar_t *broadsword_dontstopanim=0; cvar_t *broadsword_waitforshot=0; cvar_t *broadsword_smallbbox=0; cvar_t *broadsword_extra1=0; cvar_t *broadsword_extra2=0; cvar_t *broadsword_effcorr=0; cvar_t *broadsword_ragtobase=0; cvar_t *broadsword_dircap=0; /* Ghoul2 Insert End */ void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); void ( APIENTRY * qglLockArraysEXT)( GLint, GLint); void ( APIENTRY * qglUnlockArraysEXT) ( void ); void ( APIENTRY * qglPointParameterfEXT)( GLenum, GLfloat); void ( APIENTRY * qglPointParameterfvEXT)( GLenum, GLfloat *); // Added 10/23/02 by Aurelio Reis. void ( APIENTRY * qglPointParameteriNV)( GLenum, GLint); void ( APIENTRY * qglPointParameterivNV)( GLenum, const GLint *); #ifndef _XBOX // GLOWXXX // Declare Register Combiners function pointers. PFNGLCOMBINERPARAMETERFVNV qglCombinerParameterfvNV = NULL; PFNGLCOMBINERPARAMETERIVNV qglCombinerParameterivNV = NULL; PFNGLCOMBINERPARAMETERFNV qglCombinerParameterfNV = NULL; PFNGLCOMBINERPARAMETERINV qglCombinerParameteriNV = NULL; PFNGLCOMBINERINPUTNV qglCombinerInputNV = NULL; PFNGLCOMBINEROUTPUTNV qglCombinerOutputNV = NULL; PFNGLFINALCOMBINERINPUTNV qglFinalCombinerInputNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERFVNV qglGetCombinerInputParameterfvNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERIVNV qglGetCombinerInputParameterivNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERFVNV qglGetCombinerOutputParameterfvNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERIVNV qglGetCombinerOutputParameterivNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERFVNV qglGetFinalCombinerInputParameterfvNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERIVNV qglGetFinalCombinerInputParameterivNV = NULL; #ifdef _WIN32 // Declare Pixel Format function pointers. PFNWGLGETPIXELFORMATATTRIBIVARBPROC qwglGetPixelFormatAttribivARB = NULL; PFNWGLGETPIXELFORMATATTRIBFVARBPROC qwglGetPixelFormatAttribfvARB = NULL; PFNWGLCHOOSEPIXELFORMATARBPROC qwglChoosePixelFormatARB = NULL; // Declare Pixel Buffer function pointers. PFNWGLCREATEPBUFFERARBPROC qwglCreatePbufferARB = NULL; PFNWGLGETPBUFFERDCARBPROC qwglGetPbufferDCARB = NULL; PFNWGLRELEASEPBUFFERDCARBPROC qwglReleasePbufferDCARB = NULL; PFNWGLDESTROYPBUFFERARBPROC qwglDestroyPbufferARB = NULL; PFNWGLQUERYPBUFFERARBPROC qwglQueryPbufferARB = NULL; // Declare Render-Texture function pointers. PFNWGLBINDTEXIMAGEARBPROC qwglBindTexImageARB = NULL; PFNWGLRELEASETEXIMAGEARBPROC qwglReleaseTexImageARB = NULL; PFNWGLSETPBUFFERATTRIBARBPROC qwglSetPbufferAttribARB = NULL; #endif // Declare Vertex and Fragment Program function pointers. PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB = NULL; PFNGLBINDPROGRAMARBPROC qglBindProgramARB = NULL; PFNGLDELETEPROGRAMSARBPROC qglDeleteProgramsARB = NULL; PFNGLGENPROGRAMSARBPROC qglGenProgramsARB = NULL; PFNGLPROGRAMENVPARAMETER4DARBPROC qglProgramEnvParameter4dARB = NULL; PFNGLPROGRAMENVPARAMETER4DVARBPROC qglProgramEnvParameter4dvARB = NULL; PFNGLPROGRAMENVPARAMETER4FARBPROC qglProgramEnvParameter4fARB = NULL; PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DARBPROC qglProgramLocalParameter4dARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DVARBPROC qglProgramLocalParameter4dvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FARBPROC qglProgramLocalParameter4fARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB = NULL; PFNGLGETPROGRAMENVPARAMETERDVARBPROC qglGetProgramEnvParameterdvARB = NULL; PFNGLGETPROGRAMENVPARAMETERFVARBPROC qglGetProgramEnvParameterfvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC qglGetProgramLocalParameterdvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC qglGetProgramLocalParameterfvARB = NULL; PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB = NULL; PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB = NULL; PFNGLISPROGRAMARBPROC qglIsProgramARB = NULL; #endif void RE_SetLightStyle(int style, int color); static void AssertCvarRange( cvar_t *cv, float minVal, float maxVal, qboolean shouldBeIntegral, qboolean shouldBeMult2) { if ( shouldBeIntegral ) { if ( ( int ) cv->value != cv->integer ) { VID_Printf( PRINT_WARNING, "WARNING: cvar '%s' must be integral (%f)\n", cv->name, cv->value ); Cvar_Set( cv->name, va( "%d", cv->integer ) ); } } if ( cv->value < minVal ) { VID_Printf( PRINT_WARNING, "WARNING: cvar '%s' out of range (%f < %f)\n", cv->name, cv->value, minVal ); Cvar_Set( cv->name, va( "%f", minVal ) ); } else if ( cv->value > maxVal ) { VID_Printf( PRINT_WARNING, "WARNING: cvar '%s' out of range (%f > %f)\n", cv->name, cv->value, maxVal ); Cvar_Set( cv->name, va( "%f", maxVal ) ); } if (shouldBeMult2) { if ( (cv->integer&(cv->integer-1)) ) { int newvalue; for (newvalue = 1 ; newvalue < cv->integer ; newvalue<<=1) ; VID_Printf( PRINT_WARNING, "WARNING: cvar '%s' must be multiple of 2(%f)\n", cv->name, cv->value ); Cvar_Set( cv->name, va( "%d", newvalue ) ); } } } void R_Splash() { #ifndef _XBOX image_t *pImage; /* const char* s = Cvar_VariableString("se_language"); if (Q_stricmp(s,"english")) { pImage = R_FindImageFile( "menu/splash_eur", qfalse, qfalse, qfalse, GL_CLAMP); } else { pImage = R_FindImageFile( "menu/splash", qfalse, qfalse, qfalse, GL_CLAMP); } */ pImage = R_FindImageFile( "menu/splash", qfalse, qfalse, qfalse, GL_CLAMP); extern void RB_SetGL2D (void); RB_SetGL2D(); if (pImage ) {//invalid paths? GL_Bind( pImage ); } GL_State(GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO); const int width = 640; const int height = 480; const float x1 = 320 - width / 2; const float x2 = 320 + width / 2; const float y1 = 240 - height / 2; const float y2 = 240 + height / 2; qglBegin (GL_TRIANGLE_STRIP); qglTexCoord2f( 0, 0 ); qglVertex2f(x1, y1); qglTexCoord2f( 1 , 0 ); qglVertex2f(x2, y1); qglTexCoord2f( 0, 1 ); qglVertex2f(x1, y2); qglTexCoord2f( 1, 1 ); qglVertex2f(x2, y2); qglEnd(); GLimp_EndFrame(); #endif } /* ** InitOpenGL ** ** This function is responsible for initializing a valid OpenGL subsystem. This ** is done by calling GLimp_Init (which gives us a working OGL subsystem) then ** setting variables, checking GL constants, and reporting the gfx system config ** to the user. */ static void InitOpenGL( void ) { // // initialize OS specific portions of the renderer // // GLimp_Init directly or indirectly references the following cvars: // - r_fullscreen // - r_mode // - r_(color|depth|stencil)bits // - r_ignorehwgamma // - r_gamma // if ( glConfig.vidWidth == 0 ) { GLimp_Init(); // print info the first time only // set default state GL_SetDefaultState(); R_Splash(); //get something on screen asap GfxInfo_f(); } else { // set default state GL_SetDefaultState(); } } /* ================== GL_CheckErrors ================== */ void GL_CheckErrors( void ) { int err; char s[64]; err = qglGetError(); if ( err == GL_NO_ERROR ) { return; } if ( r_ignoreGLErrors->integer ) { return; } switch( err ) { case GL_INVALID_ENUM: strcpy( s, "GL_INVALID_ENUM" ); break; case GL_INVALID_VALUE: strcpy( s, "GL_INVALID_VALUE" ); break; case GL_INVALID_OPERATION: strcpy( s, "GL_INVALID_OPERATION" ); break; case GL_STACK_OVERFLOW: strcpy( s, "GL_STACK_OVERFLOW" ); break; case GL_STACK_UNDERFLOW: strcpy( s, "GL_STACK_UNDERFLOW" ); break; case GL_OUT_OF_MEMORY: strcpy( s, "GL_OUT_OF_MEMORY" ); break; default: Com_sprintf( s, sizeof(s), "%i", err); break; } Com_Error( ERR_FATAL, "GL_CheckErrors: %s", s ); } #ifndef _XBOX /* ** R_GetModeInfo */ typedef struct vidmode_s { const char *description; int width, height; } vidmode_t; const vidmode_t r_vidModes[] = { { "Mode 0: 320x240", 320, 240 }, { "Mode 1: 400x300", 400, 300 }, { "Mode 2: 512x384", 512, 384 }, { "Mode 3: 640x480", 640, 480 }, { "Mode 4: 800x600", 800, 600 }, { "Mode 5: 960x720", 960, 720 }, { "Mode 6: 1024x768", 1024, 768 }, { "Mode 7: 1152x864", 1152, 864 }, { "Mode 8: 1280x1024", 1280, 1024 }, { "Mode 9: 1600x1200", 1600, 1200 }, { "Mode 10: 2048x1536", 2048, 1536 }, { "Mode 11: 856x480 (wide)", 856, 480 }, { "Mode 12: 2400x600(surround)",2400,600 } }; static const int s_numVidModes = ( sizeof( r_vidModes ) / sizeof( r_vidModes[0] ) ); qboolean R_GetModeInfo( int *width, int *height, int mode ) { const vidmode_t *vm; if ( mode < -1 ) { return qfalse; } if ( mode >= s_numVidModes ) { return qfalse; } if ( mode == -1 ) { *width = r_customwidth->integer; *height = r_customheight->integer; return qtrue; } vm = &r_vidModes[mode]; *width = vm->width; *height = vm->height; return qtrue; } /* ** R_ModeList_f */ static void R_ModeList_f( void ) { int i; VID_Printf( PRINT_ALL, "\n" ); for ( i = 0; i < s_numVidModes; i++ ) { VID_Printf( PRINT_ALL, "%s\n", r_vidModes[i].description ); } VID_Printf( PRINT_ALL, "\n" ); } #endif // _XBOX /* ============================================================================== SCREEN SHOTS ============================================================================== */ /* ================== R_TakeScreenshot ================== */ // "filename" param is something like "screenshots/shot0000.tga" // note that if the last extension is ".jpg", then it'll save a JPG, else TGA // void R_TakeScreenshot( int x, int y, int width, int height, char *fileName ) { #ifndef _XBOX byte *buffer; int i, c, temp; qboolean bSaveAsJPG = !Q_strnicmp(&fileName[strlen(fileName)-4],".jpg",4); if (bSaveAsJPG) { // JPG saver expects to be fed RGBA data, though it presumably ignores 'A'... // buffer = (unsigned char *) Z_Malloc(glConfig.vidWidth*glConfig.vidHeight*4, TAG_TEMP_WORKSPACE, qfalse); qglReadPixels( x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer ); // gamma correct if ( tr.overbrightBits>0 && glConfig.deviceSupportsGamma ) { R_GammaCorrect( buffer, glConfig.vidWidth * glConfig.vidHeight * 4 ); } SaveJPG(fileName, 95, width, height, buffer); } else { // TGA... // buffer = (unsigned char *) Z_Malloc(glConfig.vidWidth*glConfig.vidHeight*3 + 18, TAG_TEMP_WORKSPACE, qfalse); memset (buffer, 0, 18); buffer[2] = 2; // uncompressed type buffer[12] = width & 255; buffer[13] = width >> 8; buffer[14] = height & 255; buffer[15] = height >> 8; buffer[16] = 24; // pixel size qglReadPixels( x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer+18 ); // swap rgb to bgr c = 18 + width * height * 3; for (i=18 ; i0 && glConfig.deviceSupportsGamma ) { R_GammaCorrect( buffer + 18, glConfig.vidWidth * glConfig.vidHeight * 3 ); } FS_WriteFile( fileName, buffer, c ); } Z_Free( buffer ); #endif } /* ================== R_ScreenshotFilename ================== */ void R_ScreenshotFilename( int lastNumber, char *fileName, const char *psExt ) { int a,b,c,d; if ( lastNumber < 0 || lastNumber > 9999 ) { Com_sprintf( fileName, MAX_OSPATH, "screenshots/shot9999%s",psExt ); return; } a = lastNumber / 1000; lastNumber -= a*1000; b = lastNumber / 100; lastNumber -= b*100; c = lastNumber / 10; lastNumber -= c*10; d = lastNumber; Com_sprintf( fileName, MAX_OSPATH, "screenshots/shot%i%i%i%i%s" , a, b, c, d, psExt ); } /* ==================== R_LevelShot levelshots are specialized 256*256 thumbnails for the menu system, sampled down from full screen distorted images ==================== */ #define LEVELSHOTSIZE 256 void R_LevelShot( void ) { #ifndef _XBOX char checkname[MAX_OSPATH]; byte *buffer; byte *source; byte *src, *dst; int x, y; int r, g, b; float xScale, yScale; int xx, yy; sprintf( checkname, "levelshots/%s.tga", tr.worldDir + strlen("maps/") ); source = (byte*) Z_Malloc( glConfig.vidWidth * glConfig.vidHeight * 3, TAG_TEMP_WORKSPACE, qfalse ); buffer = (byte*) Z_Malloc( LEVELSHOTSIZE * LEVELSHOTSIZE*3 + 18, TAG_TEMP_WORKSPACE, qfalse ); memset (buffer, 0, 18); buffer[2] = 2; // uncompressed type buffer[12] = LEVELSHOTSIZE & 255; buffer[13] = LEVELSHOTSIZE >> 8; buffer[14] = LEVELSHOTSIZE & 255; buffer[15] = LEVELSHOTSIZE >> 8; buffer[16] = 24; // pixel size qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGB, GL_UNSIGNED_BYTE, source ); // resample from source xScale = glConfig.vidWidth / (4.0*LEVELSHOTSIZE); yScale = glConfig.vidHeight / (3.0*LEVELSHOTSIZE); for ( y = 0 ; y < LEVELSHOTSIZE ; y++ ) { for ( x = 0 ; x < LEVELSHOTSIZE ; x++ ) { r = g = b = 0; for ( yy = 0 ; yy < 3 ; yy++ ) { for ( xx = 0 ; xx < 4 ; xx++ ) { src = source + 3 * ( glConfig.vidWidth * (int)( (y*3+yy)*yScale ) + (int)( (x*4+xx)*xScale ) ); r += src[0]; g += src[1]; b += src[2]; } } dst = buffer + 18 + 3 * ( y * LEVELSHOTSIZE + x ); dst[0] = b / 12; dst[1] = g / 12; dst[2] = r / 12; } } // gamma correct if ( glConfig.deviceSupportsGamma ) { R_GammaCorrect( buffer + 18, LEVELSHOTSIZE * LEVELSHOTSIZE * 3 ); } FS_WriteFile( checkname, buffer, LEVELSHOTSIZE * LEVELSHOTSIZE*3 + 18 ); Z_Free( buffer ); Z_Free( source ); VID_Printf( PRINT_ALL, "Wrote %s\n", checkname ); #endif } /* ================== R_ScreenShot_f screenshot screenshot [silent] screenshot [levelshot] screenshot [filename] Doesn't print the pacifier message if there is a second arg ================== */ void R_ScreenShot_f (void) { #ifndef _XBOX char checkname[MAX_OSPATH]; int len; static int lastNumber = -1; qboolean silent; if ( !strcmp( Cmd_Argv(1), "levelshot" ) ) { R_LevelShot(); return; } if ( !strcmp( Cmd_Argv(1), "silent" ) ) { silent = qtrue; } else { silent = qfalse; } if ( Cmd_Argc() == 2 && !silent ) { // explicit filename Com_sprintf( checkname, MAX_OSPATH, "screenshots/%s.jpg", Cmd_Argv( 1 ) ); } else { // scan for a free filename // if we have saved a previous screenshot, don't scan // again, because recording demo avis can involve // thousands of shots if ( lastNumber == -1 ) { // scan for a free number for ( lastNumber = 0 ; lastNumber <= 9999 ; lastNumber++ ) { R_ScreenshotFilename( lastNumber, checkname, ".jpg" ); len = FS_ReadFile( checkname, NULL ); if ( len <= 0 ) { break; // file doesn't exist } } } else { R_ScreenshotFilename( lastNumber, checkname, ".jpg" ); } if ( lastNumber == 10000 ) { VID_Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n"); return; } lastNumber++; } R_TakeScreenshot( 0, 0, glConfig.vidWidth, glConfig.vidHeight, checkname ); if ( !silent ) { VID_Printf (PRINT_ALL, "Wrote %s\n", checkname); } #endif } /* ================== R_ScreenShotTGA_f screenshot screenshot [silent] screenshot [levelshot] screenshot [filename] Doesn't print the pacifier message if there is a second arg ================== */ void R_ScreenShotTGA_f (void) { #ifndef _XBOX char checkname[MAX_OSPATH]; int len; static int lastNumber = -1; qboolean silent; if ( !strcmp( Cmd_Argv(1), "levelshot" ) ) { R_LevelShot(); return; } if ( !strcmp( Cmd_Argv(1), "silent" ) ) { silent = qtrue; } else { silent = qfalse; } if ( Cmd_Argc() == 2 && !silent ) { // explicit filename Com_sprintf( checkname, MAX_OSPATH, "screenshots/%s.tga", Cmd_Argv( 1 ) ); } else { // scan for a free filename // if we have saved a previous screenshot, don't scan // again, because recording demo avis can involve // thousands of shots if ( lastNumber == -1 ) { // scan for a free number for ( lastNumber = 0 ; lastNumber <= 9999 ; lastNumber++ ) { R_ScreenshotFilename( lastNumber, checkname, ".tga" ); len = FS_ReadFile( checkname, NULL ); if ( len <= 0 ) { break; // file doesn't exist } } } else { R_ScreenshotFilename( lastNumber, checkname, ".tga" ); } if ( lastNumber == 10000 ) { VID_Printf (PRINT_ALL, "ScreenShot: Couldn't create a file\n"); return; } lastNumber++; } R_TakeScreenshot( 0, 0, glConfig.vidWidth, glConfig.vidHeight, checkname ); if ( !silent ) { VID_Printf (PRINT_ALL, "Wrote %s\n", checkname); } #endif } //============================================================================ /* ** GL_SetDefaultState */ void GL_SetDefaultState( void ) { qglClearDepth( 1.0f ); qglCullFace(GL_FRONT); qglColor4f (1,1,1,1); // initialize downstream texture unit if we're running // in a multitexture environment if ( qglActiveTextureARB ) { GL_SelectTexture( 1 ); GL_TextureMode( r_textureMode->string ); GL_TexEnv( GL_MODULATE ); qglDisable( GL_TEXTURE_2D ); GL_SelectTexture( 0 ); } qglEnable(GL_TEXTURE_2D); GL_TextureMode( r_textureMode->string ); GL_TexEnv( GL_MODULATE ); qglShadeModel( GL_SMOOTH ); qglDepthFunc( GL_LEQUAL ); // the vertex array is always enabled, but the color and texture // arrays are enabled and disabled around the compiled vertex array call qglEnableClientState (GL_VERTEX_ARRAY); // // make sure our GL state vector is set correctly // glState.glStateBits = GLS_DEPTHTEST_DISABLE | GLS_DEPTHMASK_TRUE; qglPolygonMode (GL_FRONT_AND_BACK, GL_FILL); qglDepthMask( GL_TRUE ); qglDisable( GL_DEPTH_TEST ); qglEnable( GL_SCISSOR_TEST ); qglDisable( GL_CULL_FACE ); qglDisable( GL_BLEND ); qglDisable( GL_ALPHA_TEST ); qglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #ifdef _XBOX qglDisable( GL_LIGHTING ); #endif } /* ================ R_PrintLongString Workaround for VID_Printf's 4096 characters buffer limit. ================ */ void R_PrintLongString(const char *string) { char buffer[4096]; const char *p; int size = strlen(string); p = string; while(size > 0) { Q_strncpyz(buffer, p, sizeof (buffer) ); VID_Printf( PRINT_ALL, "%s", buffer ); p += 4095; size -= 4095; } } /* ================ GfxInfo_f ================ */ extern bool g_bTextureRectangleHack; void GfxInfo_f( void ) { cvar_t *sys_cpustring = Cvar_Get( "sys_cpustring", "", CVAR_ROM ); const char *enablestrings[] = { "disabled", "enabled" }; const char *fsstrings[] = { "windowed", "fullscreen" }; const char *tc_table[] = { "None", "GL_S3_s3tc", "GL_EXT_texture_compression_s3tc", }; VID_Printf( PRINT_ALL, "\nGL_VENDOR: %s\n", glConfig.vendor_string ); VID_Printf( PRINT_ALL, "GL_RENDERER: %s\n", glConfig.renderer_string ); VID_Printf( PRINT_ALL, "GL_VERSION: %s\n", glConfig.version_string ); VID_Printf( PRINT_ALL, "GL_EXTENSIONS: " ); R_PrintLongString( glConfig.extensions_string ); VID_Printf( PRINT_ALL, "\n" ); VID_Printf( PRINT_ALL, "GL_MAX_TEXTURE_SIZE: %d\n", glConfig.maxTextureSize ); VID_Printf( PRINT_ALL, "GL_MAX_ACTIVE_TEXTURES_ARB: %d\n", glConfig.maxActiveTextures ); VID_Printf( PRINT_ALL, "\nPIXELFORMAT: color(%d-bits) Z(%d-bit) stencil(%d-bits)\n", glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); VID_Printf( PRINT_ALL, "MODE: %d, %d x %d %s hz:", r_mode->integer, glConfig.vidWidth, glConfig.vidHeight, fsstrings[r_fullscreen->integer == 1] ); if ( glConfig.displayFrequency ) { VID_Printf( PRINT_ALL, "%d\n", glConfig.displayFrequency ); } else { VID_Printf( PRINT_ALL, "N/A\n" ); } if ( glConfig.deviceSupportsGamma ) { VID_Printf( PRINT_ALL, "GAMMA: hardware w/ %d overbright bits\n", tr.overbrightBits ); } else { VID_Printf( PRINT_ALL, "GAMMA: software w/ %d overbright bits\n", tr.overbrightBits ); } VID_Printf( PRINT_ALL, "CPU: %s\n", sys_cpustring->string ); // rendering primitives { int primitives; // default is to use triangles if compiled vertex arrays are present VID_Printf( PRINT_ALL, "rendering primitives: " ); primitives = r_primitives->integer; if ( primitives == 0 ) { if ( qglLockArraysEXT ) { primitives = 2; } else { primitives = 1; } } if ( primitives == -1 ) { VID_Printf( PRINT_ALL, "none\n" ); } else if ( primitives == 2 ) { VID_Printf( PRINT_ALL, "single glDrawElements\n" ); } else if ( primitives == 1 ) { VID_Printf( PRINT_ALL, "multiple glArrayElement\n" ); } else if ( primitives == 3 ) { VID_Printf( PRINT_ALL, "multiple glColor4ubv + glTexCoord2fv + glVertex3fv\n" ); } } VID_Printf( PRINT_ALL, "texturemode: %s\n", r_textureMode->string ); VID_Printf( PRINT_ALL, "picmip: %d\n", r_picmip->integer ); VID_Printf( PRINT_ALL, "texture bits: %d\n", r_texturebits->integer ); VID_Printf( PRINT_ALL, "lightmap texture bits: %d\n", r_texturebitslm->integer ); VID_Printf( PRINT_ALL, "multitexture: %s\n", enablestrings[qglActiveTextureARB != 0] ); VID_Printf( PRINT_ALL, "compiled vertex arrays: %s\n", enablestrings[qglLockArraysEXT != 0 ] ); VID_Printf( PRINT_ALL, "texenv add: %s\n", enablestrings[glConfig.textureEnvAddAvailable != 0] ); VID_Printf( PRINT_ALL, "compressed textures: %s\n", enablestrings[glConfig.textureCompression != TC_NONE] ); VID_Printf( PRINT_ALL, "compressed lightmaps: %s\n", enablestrings[(r_ext_compressed_lightmaps->integer != 0 && glConfig.textureCompression != TC_NONE)] ); VID_Printf( PRINT_ALL, "texture compression method: %s\n", tc_table[glConfig.textureCompression] ); Com_Printf ("anisotropic filtering: %s ", enablestrings[(r_ext_texture_filter_anisotropic->integer != 0) && glConfig.maxTextureFilterAnisotropy] ); Com_Printf ("(%f of %f)\n", r_ext_texture_filter_anisotropic->value, glConfig.maxTextureFilterAnisotropy ); Com_Printf ("Dynamic Glow: %s\n", enablestrings[r_DynamicGlow->integer] ); if (g_bTextureRectangleHack) Com_Printf ("Dynamic Glow ATI BAD DRIVER HACK %s\n", enablestrings[g_bTextureRectangleHack] ); if ( r_finish->integer ) { VID_Printf( PRINT_ALL, "Forcing glFinish\n" ); } if ( r_displayRefresh ->integer ) { VID_Printf( PRINT_ALL, "Display refresh set to %d\n", r_displayRefresh->integer ); } if (tr.world) { VID_Printf( PRINT_ALL, "Light Grid size set to (%.2f %.2f %.2f)\n", tr.world->lightGridSize[0], tr.world->lightGridSize[1], tr.world->lightGridSize[2] ); } } void R_AtiHackToggle_f(void) { g_bTextureRectangleHack = !g_bTextureRectangleHack; } /************************************************************************************************ * R_FogDistance_f * * Console command to change the global fog opacity distance. If you specify nothing on the * * command line, it will display the current fog opacity distance. Specifying a float * * representing the world units away the fog should be completely opaque will change the * * value. * * * * Input * * none * * * * Output / Return * * none * * * ************************************************************************************************/ void R_FogDistance_f(void) { float distance; if (!tr.world) { VID_Printf(PRINT_ALL, "R_FogDistance_f: World is not initialized\n"); return; } if (tr.world->globalFog == -1) { VID_Printf(PRINT_ALL, "R_FogDistance_f: World does not have a global fog\n"); return; } if (Cmd_Argc() <= 1) { // should not ever be 0.0 // if (tr.world->fogs[tr.world->globalFog].tcScale == 0.0) // { // distance = 0.0; // } // else { distance = 1.0 / (8.0 * tr.world->fogs[tr.world->globalFog].tcScale); } VID_Printf(PRINT_ALL, "R_FogDistance_f: Current Distance: %.0f\n", distance); return; } if (Cmd_Argc() != 2) { VID_Printf(PRINT_ALL, "R_FogDistance_f: Invalid number of arguments to set distance\n"); return; } distance = atof(Cmd_Argv(1)); if (distance < 1.0) { distance = 1.0; } tr.world->fogs[tr.world->globalFog].parms.depthForOpaque = distance; tr.world->fogs[tr.world->globalFog].tcScale = 1.0 / ( distance * 8 ); } /************************************************************************************************ * R_FogColor_f * * Console command to change the global fog color. Specifying nothing on the command will * * display the current global fog color. Specifying a float R G B values between 0.0 and * * 1.0 will change the fog color. * * * * Input * * none * * * * Output / Return * * none * * * ************************************************************************************************/ void R_FogColor_f(void) { if (!tr.world) { VID_Printf(PRINT_ALL, "R_FogColor_f: World is not initialized\n"); return; } if (tr.world->globalFog == -1) { VID_Printf(PRINT_ALL, "R_FogColor_f: World does not have a global fog\n"); return; } if (Cmd_Argc() <= 1) { unsigned i = tr.world->fogs[tr.world->globalFog].colorInt; VID_Printf(PRINT_ALL, "R_FogColor_f: Current Color: %0f %0f %0f\n", ( (byte *)&i )[0] / 255.0, ( (byte *)&i )[1] / 255.0, ( (byte *)&i )[2] / 255.0); return; } if (Cmd_Argc() != 4) { VID_Printf(PRINT_ALL, "R_FogColor_f: Invalid number of arguments to set color\n"); return; } tr.world->fogs[tr.world->globalFog].parms.color[0] = atof(Cmd_Argv(1)); tr.world->fogs[tr.world->globalFog].parms.color[1] = atof(Cmd_Argv(2)); tr.world->fogs[tr.world->globalFog].parms.color[2] = atof(Cmd_Argv(3)); tr.world->fogs[tr.world->globalFog].colorInt = ColorBytes4 ( atof(Cmd_Argv(1)) * tr.identityLight, atof(Cmd_Argv(2)) * tr.identityLight, atof(Cmd_Argv(3)) * tr.identityLight, 1.0 ); } /* =============== R_Register =============== */ void R_Register( void ) { // // latched and archived variables // r_allowExtensions = Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compressed_textures = Cvar_Get( "r_ext_compress_textures", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compressed_lightmaps = Cvar_Get( "r_ext_compress_lightmaps", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_preferred_tc_method = Cvar_Get( "r_ext_preferred_tc_method", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_gamma_control = Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_multitexture = Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compiled_vertex_array = Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE | CVAR_LATCH); r_ext_texture_env_add = Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE | CVAR_LATCH); r_ext_texture_filter_anisotropic = Cvar_Get( "r_ext_texture_filter_anisotropic", "16", CVAR_ARCHIVE ); r_DynamicGlow = Cvar_Get( "r_DynamicGlow", "0", CVAR_ARCHIVE ); r_DynamicGlowPasses = Cvar_Get( "r_DynamicGlowPasses", "5", CVAR_CHEAT ); r_DynamicGlowDelta = Cvar_Get( "r_DynamicGlowDelta", "0.8f", CVAR_CHEAT ); r_DynamicGlowIntensity = Cvar_Get( "r_DynamicGlowIntensity", "1.13f", CVAR_CHEAT ); r_DynamicGlowSoft = Cvar_Get( "r_DynamicGlowSoft", "1", CVAR_CHEAT ); r_DynamicGlowWidth = Cvar_Get( "r_DynamicGlowWidth", "320", CVAR_CHEAT | CVAR_LATCH ); r_DynamicGlowHeight = Cvar_Get( "r_DynamicGlowHeight", "240", CVAR_CHEAT | CVAR_LATCH ); // Register point sprite stuff here. r_ext_point_parameters = Cvar_Get( "r_ext_point_parameters", "1", CVAR_ARCHIVE ); r_ext_nv_point_sprite = Cvar_Get( "r_ext_nv_point_sprite", "1", CVAR_ARCHIVE ); r_picmip = Cvar_Get ("r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_colorMipLevels = Cvar_Get ("r_colorMipLevels", "0", CVAR_LATCH ); AssertCvarRange( r_picmip, 0, 16, qtrue, qfalse ); r_detailTextures = Cvar_Get( "r_detailtextures", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_texturebits = Cvar_Get( "r_texturebits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_texturebitslm = Cvar_Get( "r_texturebitslm", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_colorbits = Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_stereo = Cvar_Get( "r_stereo", "0", CVAR_ARCHIVE | CVAR_LATCH ); #ifdef __linux__ r_stencilbits = Cvar_Get( "r_stencilbits", "0", CVAR_ARCHIVE | CVAR_LATCH ); #else r_stencilbits = Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE | CVAR_LATCH ); #endif r_depthbits = Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_overBrightBits = Cvar_Get ("r_overBrightBits", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_ignorehwgamma = Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE | CVAR_LATCH); r_mode = Cvar_Get( "r_mode", "4", CVAR_ARCHIVE | CVAR_LATCH ); r_fullscreen = Cvar_Get( "r_fullscreen", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_customwidth = Cvar_Get( "r_customwidth", "1600", CVAR_ARCHIVE | CVAR_LATCH ); r_customheight = Cvar_Get( "r_customheight", "1024", CVAR_ARCHIVE | CVAR_LATCH ); r_simpleMipMaps = Cvar_Get( "r_simpleMipMaps", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_vertexLight = Cvar_Get( "r_vertexLight", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_subdivisions = Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH); r_intensity = Cvar_Get ("r_intensity", "1", CVAR_LATCH|CVAR_ARCHIVE ); // // temporary latched variables that can only change over a restart // r_displayRefresh = Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); AssertCvarRange( r_displayRefresh, 0, 200, qtrue, qfalse ); r_fullbright = Cvar_Get ("r_fullbright", "0", CVAR_CHEAT ); r_singleShader = Cvar_Get ("r_singleShader", "0", CVAR_CHEAT | CVAR_LATCH ); // // archived variables that can change at any time // r_lodCurveError = Cvar_Get( "r_lodCurveError", "250", CVAR_ARCHIVE ); r_lodbias = Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE ); r_flares = Cvar_Get ("r_flares", "1", CVAR_ARCHIVE ); r_lodscale = Cvar_Get( "r_lodscale", "10", CVAR_ARCHIVE ); #ifdef _XBOX r_znear = Cvar_Get( "r_znear", "2", CVAR_CHEAT ); //lose a lot of precision in the distance #else r_znear = Cvar_Get( "r_znear", "4", CVAR_CHEAT ); //if set any lower, you lose a lot of precision in the distance #endif AssertCvarRange( r_znear, 0.001f, 200, qfalse, qfalse ); r_ignoreGLErrors = Cvar_Get( "r_ignoreGLErrors", "1", CVAR_ARCHIVE ); r_fastsky = Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); r_drawSun = Cvar_Get( "r_drawSun", "0", CVAR_ARCHIVE ); r_dynamiclight = Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE ); r_dlightBacks = Cvar_Get( "r_dlightBacks", "0", CVAR_ARCHIVE ); r_finish = Cvar_Get ("r_finish", "0", CVAR_ARCHIVE); r_textureMode = Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE ); r_swapInterval = Cvar_Get( "r_swapInterval", "0", CVAR_ARCHIVE ); #ifdef __MACOS__ r_gamma = Cvar_Get( "r_gamma", "1.2", CVAR_ARCHIVE ); #else r_gamma = Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE ); #endif r_facePlaneCull = Cvar_Get ("r_facePlaneCull", "1", CVAR_ARCHIVE ); r_dlightStyle = Cvar_Get ("r_dlightStyle", "1", CVAR_TEMP); r_surfaceSprites = Cvar_Get ("r_surfaceSprites", "1", CVAR_TEMP); r_surfaceWeather = Cvar_Get ("r_surfaceWeather", "0", CVAR_TEMP); r_windSpeed = Cvar_Get ("r_windSpeed", "0", 0); r_windAngle = Cvar_Get ("r_windAngle", "0", 0); r_windGust = Cvar_Get ("r_windGust", "0", 0); r_windDampFactor = Cvar_Get ("r_windDampFactor", "0.1", 0); r_windPointForce = Cvar_Get ("r_windPointForce", "0", 0); r_windPointX = Cvar_Get ("r_windPointX", "0", 0); r_windPointY = Cvar_Get ("r_windPointY", "0", 0); r_primitives = Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE ); r_ambientScale = Cvar_Get( "r_ambientScale", "0.5", CVAR_CHEAT ); r_directedScale = Cvar_Get( "r_directedScale", "1", CVAR_CHEAT ); // // temporary variables that can change at any time // r_showImages = Cvar_Get( "r_showImages", "0", CVAR_CHEAT ); r_debugLight = Cvar_Get( "r_debuglight", "0", CVAR_TEMP ); r_debugStyle = Cvar_Get( "r_debugStyle", "-1", CVAR_CHEAT ); r_debugSort = Cvar_Get( "r_debugSort", "0", CVAR_CHEAT ); r_nocurves = Cvar_Get ("r_nocurves", "0", CVAR_CHEAT ); r_drawworld = Cvar_Get ("r_drawworld", "1", CVAR_CHEAT ); r_drawfog = Cvar_Get ("r_drawfog", "2", CVAR_CHEAT ); r_lightmap = Cvar_Get ("r_lightmap", "0", CVAR_CHEAT ); r_portalOnly = Cvar_Get ("r_portalOnly", "0", CVAR_CHEAT ); r_skipBackEnd = Cvar_Get ("r_skipBackEnd", "0", CVAR_CHEAT); r_measureOverdraw = Cvar_Get( "r_measureOverdraw", "0", CVAR_CHEAT ); r_norefresh = Cvar_Get ("r_norefresh", "0", CVAR_CHEAT); r_drawentities = Cvar_Get ("r_drawentities", "1", CVAR_CHEAT ); r_ignore = Cvar_Get( "r_ignore", "1", CVAR_TEMP ); r_nocull = Cvar_Get ("r_nocull", "0", CVAR_CHEAT); r_novis = Cvar_Get ("r_novis", "0", CVAR_CHEAT); r_showcluster = Cvar_Get ("r_showcluster", "0", CVAR_CHEAT); r_speeds = Cvar_Get ("r_speeds", "0", CVAR_CHEAT); r_verbose = Cvar_Get( "r_verbose", "0", CVAR_CHEAT ); r_logFile = Cvar_Get( "r_logFile", "0", CVAR_CHEAT ); r_debugSurface = Cvar_Get ("r_debugSurface", "0", CVAR_CHEAT); r_nobind = Cvar_Get ("r_nobind", "0", CVAR_CHEAT); r_showtris = Cvar_Get ("r_showtris", "0", CVAR_CHEAT); r_showtriscolor = Cvar_Get ("r_showtriscolor", "0", CVAR_ARCHIVE); r_showsky = Cvar_Get ("r_showsky", "0", CVAR_CHEAT); r_shownormals = Cvar_Get ("r_shownormals", "0", CVAR_CHEAT); r_clear = Cvar_Get ("r_clear", "0", CVAR_CHEAT); r_offsetFactor = Cvar_Get( "r_offsetfactor", "-1", CVAR_CHEAT ); r_offsetUnits = Cvar_Get( "r_offsetunits", "-2", CVAR_CHEAT ); r_lockpvs = Cvar_Get ("r_lockpvs", "0", CVAR_CHEAT); r_noportals = Cvar_Get ("r_noportals", "0", CVAR_CHEAT); r_shadows = Cvar_Get( "cg_shadows", "1", 0 ); r_shadowRange = Cvar_Get( "r_shadowRange", "1000", CVAR_ARCHIVE ); #ifdef _XBOX r_hdreffect = Cvar_Get( "r_hdreffect", "0", 0 ); r_sundir_x = Cvar_Get( "r_sundir_x", "0.45", 0 ); r_sundir_y = Cvar_Get( "r_sundir_y", "0.3", 0 ); r_sundir_z = Cvar_Get( "r_sundir_z", "0.9", 0 ); r_hdrbloom = Cvar_Get( "r_hdrbloom", "1.0", 0 ); r_hdrcutoff = Cvar_Get( "r_hdrcutoff", "0.5", 0 ); #endif /* Ghoul2 Insert Start */ r_noGhoul2 = Cvar_Get( "r_noghoul2", "0", CVAR_CHEAT); r_Ghoul2AnimSmooth = Cvar_Get( "r_ghoul2animsmooth", "0.25", 0); r_Ghoul2UnSqash = Cvar_Get( "r_ghoul2unsquash", "1", 0); r_Ghoul2TimeBase = Cvar_Get( "r_ghoul2timebase", "2", 0); r_Ghoul2NoLerp = Cvar_Get( "r_ghoul2nolerp", "0", 0); r_Ghoul2NoBlend = Cvar_Get( "r_ghoul2noblend", "0", 0); r_Ghoul2BlendMultiplier = Cvar_Get( "r_ghoul2blendmultiplier", "1", 0); r_Ghoul2UnSqashAfterSmooth = Cvar_Get( "r_ghoul2unsquashaftersmooth", "1", 0); broadsword = Cvar_Get( "broadsword", "1", 0); broadsword_kickbones = Cvar_Get( "broadsword_kickbones", "1", 0); broadsword_kickorigin = Cvar_Get( "broadsword_kickorigin", "1", 0); broadsword_dontstopanim = Cvar_Get( "broadsword_dontstopanim", "0", 0); broadsword_waitforshot = Cvar_Get( "broadsword_waitforshot", "0", 0); broadsword_playflop = Cvar_Get( "broadsword_playflop", "1", 0); broadsword_smallbbox = Cvar_Get( "broadsword_smallbbox", "0", 0); broadsword_extra1 = Cvar_Get( "broadsword_extra1", "0", 0); broadsword_extra2 = Cvar_Get( "broadsword_extra2", "0", 0); broadsword_effcorr = Cvar_Get( "broadsword_effcorr", "1", 0); broadsword_ragtobase = Cvar_Get( "broadsword_ragtobase", "2", 0); broadsword_dircap = Cvar_Get( "broadsword_dircap", "64", 0); /* Ghoul2 Insert End */ extern qboolean Sys_LowPhysicalMemory(); r_modelpoolmegs = Cvar_Get("r_modelpoolmegs", "20", CVAR_ARCHIVE); if (Sys_LowPhysicalMemory() ) { Cvar_Set("r_modelpoolmegs", "0"); } // make sure all the commands added here are also // removed in R_Shutdown Cmd_AddCommand( "imagelist", R_ImageList_f ); Cmd_AddCommand( "shaderlist", R_ShaderList_f ); Cmd_AddCommand( "skinlist", R_SkinList_f ); Cmd_AddCommand( "modellist", R_Modellist_f ); #ifndef _XBOX Cmd_AddCommand( "modelist", R_ModeList_f ); Cmd_AddCommand( "r_atihack", R_AtiHackToggle_f ); #endif Cmd_AddCommand( "screenshot", R_ScreenShot_f ); Cmd_AddCommand( "screenshot_tga", R_ScreenShotTGA_f ); Cmd_AddCommand( "gfxinfo", GfxInfo_f ); Cmd_AddCommand( "r_fogDistance", R_FogDistance_f); Cmd_AddCommand( "r_fogColor", R_FogColor_f); Cmd_AddCommand( "modelcacheinfo", RE_RegisterModels_Info_f); Cmd_AddCommand( "imagecacheinfo", RE_RegisterImages_Info_f); extern void R_WorldEffect_f(void); //TR_WORLDEFFECTS.CPP Cmd_AddCommand( "r_we", R_WorldEffect_f ); extern void R_ReloadFonts_f(void); Cmd_AddCommand( "r_reloadfonts", R_ReloadFonts_f ); // make sure all the commands added above are also // removed in R_Shutdown } // need to do this hackery so ghoul2 doesn't crash the game because of ITS hackery... // void R_ClearStuffToStopGhoul2CrashingThings(void) { memset( &tr, 0, sizeof( tr ) ); } /* =============== R_Init =============== */ extern void R_InitWorldEffects(); void R_Init( void ) { int err; int i; //VID_Printf( PRINT_ALL, "----- R_Init -----\n" ); #ifdef _XBOX extern qboolean vidRestartReloadMap; if (!vidRestartReloadMap) { Hunk_Clear(); extern void CM_Free(void); CM_Free(); void CM_CleanLeafCache(void); CM_CleanLeafCache(); } #endif ShaderEntryPtrs_Clear(); #ifdef _XBOX //Save visibility info as it has already been set. SPARC *vis = tr.externalVisData; #endif // clear all our internal state memset( &tr, 0, sizeof( tr ) ); memset( &backEnd, 0, sizeof( backEnd ) ); memset( &tess, 0, sizeof( tess ) ); #ifdef _XBOX //Restore visibility info. tr.externalVisData = vis; #endif Swap_Init(); #ifndef FINAL_BUILD if ( (intptr_t)tess.xyz & 15 ) { Com_Printf( "WARNING: tess.xyz not 16 byte aligned (%x)\n",(intptr_t)tess.xyz & 15 ); } #endif // // init function tables // for ( i = 0; i < FUNCTABLE_SIZE; i++ ) { tr.sinTable[i] = sin( DEG2RAD( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ); tr.squareTable[i] = ( i < FUNCTABLE_SIZE/2 ) ? 1.0f : -1.0f; tr.sawToothTable[i] = (float)i / FUNCTABLE_SIZE; tr.inverseSawToothTable[i] = 1.0 - tr.sawToothTable[i]; if ( i < FUNCTABLE_SIZE / 2 ) { if ( i < FUNCTABLE_SIZE / 4 ) { tr.triangleTable[i] = ( float ) i / ( FUNCTABLE_SIZE / 4 ); } else { tr.triangleTable[i] = 1.0f - tr.triangleTable[i-FUNCTABLE_SIZE / 4]; } } else { tr.triangleTable[i] = -tr.triangleTable[i-FUNCTABLE_SIZE/2]; } } R_InitFogTable(); R_NoiseInit(); R_Register(); backEndData = (backEndData_t *) Hunk_Alloc( sizeof( backEndData_t ), qtrue ); R_ToggleSmpFrame(); //r_smp const color4ub_t color = {0xff, 0xff, 0xff, 0xff}; for(i=0;iinteger ) { // Release the Glow Vertex Shader. if ( tr.glowVShader ) { qglDeleteProgramsARB( 1, &tr.glowVShader ); } // Release Pixel Shader. if ( tr.glowPShader ) { if ( qglCombinerParameteriNV ) { // Release the Glow Regcom call list. qglDeleteLists( tr.glowPShader, 1 ); } else if ( qglGenProgramsARB ) { // Release the Glow Fragment Shader. qglDeleteProgramsARB( 1, &tr.glowPShader ); } } // Release the scene glow texture. qglDeleteTextures( 1, &tr.screenGlow ); // Release the scene texture. qglDeleteTextures( 1, &tr.sceneImage ); // Release the blur texture. qglDeleteTextures( 1, &tr.blurImage ); } #endif // R_SyncRenderThread(); R_ShutdownCommandBuffers(); //#ifndef _XBOX if (destroyWindow) //#endif { R_DeleteTextures(); // only do this for vid_restart now, not during things like map load } } // shut down platform specific OpenGL stuff if ( destroyWindow ) { GLimp_Shutdown(); } tr.registered = qfalse; } /* ============= RE_EndRegistration Touch all images to make sure they are resident ============= */ extern qboolean Sys_LowPhysicalMemory(); void RE_EndRegistration( void ) { R_SyncRenderThread(); if (!Sys_LowPhysicalMemory()) { #ifndef _XBOX // RB_ShowImages(); #endif } } void RE_GetLightStyle(int style, color4ub_t color) { if (style >= MAX_LIGHT_STYLES) { Com_Error( ERR_FATAL, "RE_GetLightStyle: %d is out of range", (int)style ); return; } *(int *)color = *(int *)styleColors[style]; } void RE_SetLightStyle(int style, int color) { if (style >= MAX_LIGHT_STYLES) { Com_Error( ERR_FATAL, "RE_SetLightStyle: %d is out of range", (int)style ); return; } if (*(int*)styleColors[style] != color) { *(int *)styleColors[style] = color; styleUpdated[style] = true; } } /* @@@@@@@@@@@@@@@@@@@@@ GetRefAPI @@@@@@@@@@@@@@@@@@@@@ */ extern void R_WorldEffectCommand(const char *command); refexport_t *GetRefAPI ( int apiVersion ) { static refexport_t re; memset( &re, 0, sizeof( re ) ); if ( apiVersion != REF_API_VERSION ) { VID_Printf(PRINT_ALL, "Mismatched REF_API_VERSION: expected %i, got %i\n", REF_API_VERSION, apiVersion ); return NULL; } // the RE_ functions are Renderer Entry points re.Shutdown = RE_Shutdown; re.BeginRegistration = RE_BeginRegistration; re.RegisterModel = RE_RegisterModel; re.RegisterSkin = RE_RegisterSkin; re.GetAnimationCFG = RE_GetAnimationCFG; re.RegisterShader = RE_RegisterShader; re.RegisterShaderNoMip = RE_RegisterShaderNoMip; re.LoadWorld = RE_LoadWorldMap; re.SetWorldVisData = RE_SetWorldVisData; re.EndRegistration = RE_EndRegistration; re.RegisterMedia_LevelLoadBegin = RE_RegisterMedia_LevelLoadBegin; re.RegisterMedia_LevelLoadEnd = RE_RegisterMedia_LevelLoadEnd; re.BeginFrame = RE_BeginFrame; re.EndFrame = RE_EndFrame; re.ProcessDissolve = RE_ProcessDissolve; re.InitDissolve = RE_InitDissolve; re.MarkFragments = R_MarkFragments; re.LerpTag = R_LerpTag; re.ModelBounds = R_ModelBounds; re.ClearScene = RE_ClearScene; re.AddRefEntityToScene = RE_AddRefEntityToScene; re.GetLighting = RE_GetLighting; re.AddPolyToScene = RE_AddPolyToScene; re.AddLightToScene = RE_AddLightToScene; re.RenderScene = RE_RenderScene; re.SetColor = RE_SetColor; re.DrawStretchPic = RE_StretchPic; re.DrawStretchRaw = RE_StretchRaw; re.UploadCinematic = RE_UploadCinematic; re.DrawRotatePic = RE_RotatePic; re.DrawRotatePic2 = RE_RotatePic2; re.LAGoggles = RE_LAGoggles; re.Scissor = RE_Scissor; re.GetScreenShot = RE_GetScreenShot; #ifndef _XBOX re.TempRawImage_ReadFromFile = RE_TempRawImage_ReadFromFile; #endif re.TempRawImage_CleanUp = RE_TempRawImage_CleanUp; re.GetLightStyle = RE_GetLightStyle; re.SetLightStyle = RE_SetLightStyle; re.WorldEffectCommand = R_WorldEffectCommand; re.GetBModelVerts = RE_GetBModelVerts; re.RegisterFont = RE_RegisterFont; #if defined(_XBOX) || defined(__GNUC__) re._Font_StrLenPixels = RE_Font_StrLenPixels; re._Font_HeightPixels = RE_Font_HeightPixels; re._Font_DrawString = RE_Font_DrawString; #else re.Font_StrLenPixels = RE_Font_StrLenPixels; re.Font_HeightPixels = RE_Font_HeightPixels; re.Font_DrawString = RE_Font_DrawString; #endif re.Font_StrLenChars = RE_Font_StrLenChars; re.Language_IsAsian = Language_IsAsian; re.Language_UsesSpaces = Language_UsesSpaces; re.AnyLanguage_ReadCharFromString = AnyLanguage_ReadCharFromString; return &re; }