--- quake2/ref_gl/gl_rmain.c 2018/04/24 17:58:33 1.1 +++ quake2/ref_gl/gl_rmain.c 2018/04/24 18:03:51 1.1.1.3 @@ -1,3 +1,22 @@ +/* +Copyright (C) 1997-2001 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ // r_main.c #include "gl_local.h" @@ -7,6 +26,8 @@ viddef_t vid; refimport_t ri; +int GL_TEXTURE0, GL_TEXTURE1; + model_t *r_worldmodel; float gldepthmin, gldepthmax; @@ -64,6 +85,8 @@ cvar_t *r_lightlevel; // FIXME: This is cvar_t *gl_nosubimage; cvar_t *gl_allow_software; +cvar_t *gl_vertex_arrays; + cvar_t *gl_particle_min_size; cvar_t *gl_particle_max_size; cvar_t *gl_particle_size; @@ -72,10 +95,10 @@ cvar_t *gl_particle_att_b; cvar_t *gl_particle_att_c; cvar_t *gl_ext_swapinterval; -cvar_t *gl_ext_gamma_control; cvar_t *gl_ext_palettedtexture; cvar_t *gl_ext_multitexture; cvar_t *gl_ext_pointparameters; +cvar_t *gl_ext_compiled_vertex_array; cvar_t *gl_log; cvar_t *gl_bitdepth; @@ -102,6 +125,8 @@ cvar_t *gl_playermip; cvar_t *gl_saturatelighting; cvar_t *gl_swapinterval; cvar_t *gl_texturemode; +cvar_t *gl_texturealphamode; +cvar_t *gl_texturesolidmode; cvar_t *gl_lockpvs; cvar_t *gl_3dlabs_broken; @@ -774,41 +799,7 @@ void R_Clear (void) void R_Flash( void ) { -#if 0 - if ( qwglSetDeviceGammaRampEXT != 0 ) - { - static qboolean flashed; - - unsigned char red[256], green[256], blue[256]; - int i; - - if ( ( v_blend[3] == 0.0F ) && flashed ) - { - flashed = false; - - qwglSetDeviceGammaRampEXT( gl_state.originalRedGammaTable, - gl_state.originalGreenGammaTable, - gl_state.originalBlueGammaTable ); - } - else if ( v_blend[3] != 0.0F ) - { - flashed = true; - - for ( i = 0; i < 256; i++ ) - { - red[i] = i; - green[i] = 0; - blue[i] = 0; - } - - qwglSetDeviceGammaRampEXT( red, green, blue ); - } - } - else -#endif - { - R_PolyBlend (); - } + R_PolyBlend (); } /* @@ -1015,7 +1006,7 @@ void R_Register( void ) gl_skymip = ri.Cvar_Get ("gl_skymip", "0", 0); gl_showtris = ri.Cvar_Get ("gl_showtris", "0", 0); gl_ztrick = ri.Cvar_Get ("gl_ztrick", "0", 0); - gl_finish = ri.Cvar_Get ("gl_finish", "0", 0); + gl_finish = ri.Cvar_Get ("gl_finish", "0", CVAR_ARCHIVE); gl_clear = ri.Cvar_Get ("gl_clear", "0", 0); gl_cull = ri.Cvar_Get ("gl_cull", "1", 0); gl_polyblend = ri.Cvar_Get ("gl_polyblend", "1", 0); @@ -1024,13 +1015,17 @@ void R_Register( void ) gl_monolightmap = ri.Cvar_Get( "gl_monolightmap", "0", 0 ); gl_driver = ri.Cvar_Get( "gl_driver", "opengl32", CVAR_ARCHIVE ); gl_texturemode = ri.Cvar_Get( "gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE ); + gl_texturealphamode = ri.Cvar_Get( "gl_texturealphamode", "default", CVAR_ARCHIVE ); + gl_texturesolidmode = ri.Cvar_Get( "gl_texturesolidmode", "default", CVAR_ARCHIVE ); gl_lockpvs = ri.Cvar_Get( "gl_lockpvs", "0", 0 ); + gl_vertex_arrays = ri.Cvar_Get( "gl_vertex_arrays", "0", CVAR_ARCHIVE ); + gl_ext_swapinterval = ri.Cvar_Get( "gl_ext_swapinterval", "1", CVAR_ARCHIVE ); - gl_ext_gamma_control = ri.Cvar_Get( "gl_ext_gamma_control", "1", CVAR_ARCHIVE ); gl_ext_palettedtexture = ri.Cvar_Get( "gl_ext_palettedtexture", "1", CVAR_ARCHIVE ); gl_ext_multitexture = ri.Cvar_Get( "gl_ext_multitexture", "1", CVAR_ARCHIVE ); gl_ext_pointparameters = ri.Cvar_Get( "gl_ext_pointparameters", "1", CVAR_ARCHIVE ); + gl_ext_compiled_vertex_array = ri.Cvar_Get( "gl_ext_compiled_vertex_array", "1", CVAR_ARCHIVE ); gl_drawbuffer = ri.Cvar_Get( "gl_drawbuffer", "GL_BACK", 0 ); gl_swapinterval = ri.Cvar_Get( "gl_swapinterval", "1", CVAR_ARCHIVE ); @@ -1110,6 +1105,7 @@ R_Init int R_Init( void *hinstance, void *hWnd ) { char renderer_buffer[1000]; + char vendor_buffer[1000]; int err; int j; extern float r_turbsin[256]; @@ -1168,6 +1164,9 @@ int R_Init( void *hinstance, void *hWnd strcpy( renderer_buffer, gl_config.renderer_string ); strlwr( renderer_buffer ); + strcpy( vendor_buffer, gl_config.vendor_string ); + strlwr( vendor_buffer ); + if ( strstr( renderer_buffer, "voodoo" ) ) { if ( !strstr( renderer_buffer, "rush" ) ) @@ -1175,7 +1174,8 @@ int R_Init( void *hinstance, void *hWnd 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" ) ) @@ -1219,6 +1219,10 @@ int R_Init( void *hinstance, void *hWnd 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 ) { @@ -1245,7 +1249,19 @@ int R_Init( void *hinstance, void *hWnd /* ** grab extensions */ -#ifdef WIN32 + 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" ); @@ -1255,51 +1271,49 @@ int R_Init( void *hinstance, void *hWnd { ri.Con_Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" ); } +#endif - if ( strstr( gl_config.extensions_string, "WGL_NVIDIA_gamma_control" ) || - strstr( gl_config.extensions_string, "WGL_EXT_gamma_control" ) ) + if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) ) { - if ( gl_ext_gamma_control->value ) + if ( gl_ext_pointparameters->value ) { - qwglGetDeviceGammaRampEXT = ( BOOL (WINAPI *)(unsigned char*, unsigned char*, unsigned char *)) qwglGetProcAddress( "wglGetDeviceGammaRampNVIDIA" ); - qwglSetDeviceGammaRampEXT = ( BOOL (WINAPI *)(const unsigned char *, const unsigned char *, const unsigned char *)) qwglGetProcAddress( "wglSetDeviceGammaRampNVIDIA" ); - - ri.Con_Printf( PRINT_ALL, "...enabling WGL_EXT_gamma_control\n" ); - - qwglGetDeviceGammaRampEXT( gl_state.originalRedGammaTable, - gl_state.originalGreenGammaTable, - gl_state.originalBlueGammaTable ); + 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 WGL_EXT_gamma_control\n" ); + ri.Con_Printf( PRINT_ALL, "...ignoring GL_EXT_point_parameters\n" ); } } else { - ri.Con_Printf( PRINT_ALL, "...WGL_EXT_gamma_control not found\n" ); + ri.Con_Printf( PRINT_ALL, "...GL_EXT_point_parameters not found\n" ); } - if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) ) +#ifdef __linux__ + if ( strstr( gl_config.extensions_string, "3DFX_set_global_palette" )) { - if ( gl_ext_pointparameters->value ) + if ( gl_ext_palettedtexture->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" ); + 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 GL_EXT_point_parameters\n" ); + ri.Con_Printf( PRINT_ALL, "...ignoring 3DFX_set_global_palette\n" ); } } else { - ri.Con_Printf( PRINT_ALL, "...GL_EXT_point_parameters not found\n" ); + ri.Con_Printf( PRINT_ALL, "...3DFX_set_global_palette not found\n" ); } +#endif - if ( strstr( gl_config.extensions_string, "GL_EXT_paletted_texture" ) && - strstr( gl_config.extensions_string, "GL_EXT_shared_texture_palette" ) ) + 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 ) { @@ -1316,13 +1330,40 @@ int R_Init( void *hinstance, void *hWnd ri.Con_Printf( PRINT_ALL, "...GL_EXT_shared_texture_palette not found\n" ); } - if ( strstr( gl_config.extensions_string, "GL_SGIS_multitexture" ) ) + 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 { @@ -1333,7 +1374,6 @@ int R_Init( void *hinstance, void *hWnd { ri.Con_Printf( PRINT_ALL, "...GL_SGIS_multitexture not found\n" ); } -#endif GL_SetDefaultState(); @@ -1423,10 +1463,7 @@ void R_BeginFrame( float camera_separati { vid_gamma->modified = false; - if ( qwglSetDeviceGammaRampEXT != 0 ) - { - } - else if ( gl_config.renderer & ( GL_RENDERER_VOODOO ) ) + if ( gl_config.renderer & ( GL_RENDERER_VOODOO ) ) { char envbuffer[1024]; float g; @@ -1465,7 +1502,7 @@ void R_BeginFrame( float camera_separati if ( gl_state.camera_separation == 0 || !gl_state.stereo_enabled ) { - if ( stricmp( gl_drawbuffer->string, "GL_FRONT" ) == 0 ) + if ( Q_stricmp( gl_drawbuffer->string, "GL_FRONT" ) == 0 ) qglDrawBuffer( GL_FRONT ); else qglDrawBuffer( GL_BACK ); @@ -1481,6 +1518,18 @@ void R_BeginFrame( float camera_separati 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 */