From 6bf20c78f5b69d40bcc4931df93d29198435ab67 Mon Sep 17 00:00:00 2001 From: zakk Date: Fri, 26 Aug 2005 17:39:27 +0000 Subject: newlines fixed git-svn-id: svn://svn.icculus.org/quake3/trunk@6 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/win32/glw_win.h | 102 +- code/win32/mod-sdk-setup/GameSource.VCT | Bin 628735 -> 628569 bytes .../mod-sdk-setup/QIIIA Game Source License.doc | Bin 34304 -> 34266 bytes code/win32/resource.h | 88 +- code/win32/win_gamma.c | 428 +- code/win32/win_glimp.c | 3316 ++++---- code/win32/win_input.c | 2298 ++--- code/win32/win_local.h | 190 +- code/win32/win_main.c | 2506 +++--- code/win32/win_net.c | 2062 ++--- code/win32/win_qgl.c | 8748 ++++++++++---------- code/win32/win_shared.c | 612 +- code/win32/win_snd.c | 776 +- code/win32/win_syscon.c | 1192 +-- code/win32/win_wndproc.c | 912 +- code/win32/winquake.rc | 142 +- 16 files changed, 11686 insertions(+), 11686 deletions(-) (limited to 'code/win32') diff --git a/code/win32/glw_win.h b/code/win32/glw_win.h index 9367650..e90377b 100755 --- a/code/win32/glw_win.h +++ b/code/win32/glw_win.h @@ -1,51 +1,51 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -#ifndef _WIN32 -# error You should not be including this file on this platform -#endif - -#ifndef __GLW_WIN_H__ -#define __GLW_WIN_H__ - -typedef struct -{ - WNDPROC wndproc; - - HDC hDC; // handle to device context - HGLRC hGLRC; // handle to GL rendering context - - HINSTANCE hinstOpenGL; // HINSTANCE for the OpenGL library - - qboolean allowdisplaydepthchange; - qboolean pixelFormatSet; - - int desktopBitsPixel; - int desktopWidth, desktopHeight; - - qboolean cdsFullscreen; - - FILE *log_fp; -} glwstate_t; - -extern glwstate_t glw_state; - -#endif +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +#ifndef _WIN32 +# error You should not be including this file on this platform +#endif + +#ifndef __GLW_WIN_H__ +#define __GLW_WIN_H__ + +typedef struct +{ + WNDPROC wndproc; + + HDC hDC; // handle to device context + HGLRC hGLRC; // handle to GL rendering context + + HINSTANCE hinstOpenGL; // HINSTANCE for the OpenGL library + + qboolean allowdisplaydepthchange; + qboolean pixelFormatSet; + + int desktopBitsPixel; + int desktopWidth, desktopHeight; + + qboolean cdsFullscreen; + + FILE *log_fp; +} glwstate_t; + +extern glwstate_t glw_state; + +#endif diff --git a/code/win32/mod-sdk-setup/GameSource.VCT b/code/win32/mod-sdk-setup/GameSource.VCT index b9dda61..a76689f 100755 Binary files a/code/win32/mod-sdk-setup/GameSource.VCT and b/code/win32/mod-sdk-setup/GameSource.VCT differ diff --git a/code/win32/mod-sdk-setup/QIIIA Game Source License.doc b/code/win32/mod-sdk-setup/QIIIA Game Source License.doc index 790e7fe..e51f047 100755 Binary files a/code/win32/mod-sdk-setup/QIIIA Game Source License.doc and b/code/win32/mod-sdk-setup/QIIIA Game Source License.doc differ diff --git a/code/win32/resource.h b/code/win32/resource.h index 65260b9..21899ca 100755 --- a/code/win32/resource.h +++ b/code/win32/resource.h @@ -1,44 +1,44 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by winquake.rc -// -#define IDS_STRING1 1 -#define IDI_ICON1 1 -#define IDB_BITMAP1 1 -#define IDB_BITMAP2 128 -#define IDC_CURSOR1 129 -#define IDC_CURSOR2 130 -#define IDC_CURSOR3 131 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 132 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1005 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by winquake.rc +// +#define IDS_STRING1 1 +#define IDI_ICON1 1 +#define IDB_BITMAP1 1 +#define IDB_BITMAP2 128 +#define IDC_CURSOR1 129 +#define IDC_CURSOR2 130 +#define IDC_CURSOR3 131 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 132 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1005 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/code/win32/win_gamma.c b/code/win32/win_gamma.c index 9b51209..1473dff 100755 --- a/code/win32/win_gamma.c +++ b/code/win32/win_gamma.c @@ -1,214 +1,214 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -/* -** WIN_GAMMA.C -*/ -#include -#include "../renderer/tr_local.h" -#include "../qcommon/qcommon.h" -#include "glw_win.h" -#include "win_local.h" - -static unsigned short s_oldHardwareGamma[3][256]; - -/* -** WG_CheckHardwareGamma -** -** Determines if the underlying hardware supports the Win32 gamma correction API. -*/ -void WG_CheckHardwareGamma( void ) -{ - HDC hDC; - - glConfig.deviceSupportsGamma = qfalse; - - if ( qwglSetDeviceGammaRamp3DFX ) - { - glConfig.deviceSupportsGamma = qtrue; - - hDC = GetDC( GetDesktopWindow() ); - glConfig.deviceSupportsGamma = qwglGetDeviceGammaRamp3DFX( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - - return; - } - - // non-3Dfx standalone drivers don't support gamma changes, period - if ( glConfig.driverType == GLDRV_STANDALONE ) - { - return; - } - - if ( !r_ignorehwgamma->integer ) - { - hDC = GetDC( GetDesktopWindow() ); - glConfig.deviceSupportsGamma = GetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - - if ( glConfig.deviceSupportsGamma ) - { - // - // do a sanity check on the gamma values - // - if ( ( HIBYTE( s_oldHardwareGamma[0][255] ) <= HIBYTE( s_oldHardwareGamma[0][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[1][255] ) <= HIBYTE( s_oldHardwareGamma[1][0] ) ) || - ( HIBYTE( s_oldHardwareGamma[2][255] ) <= HIBYTE( s_oldHardwareGamma[2][0] ) ) ) - { - glConfig.deviceSupportsGamma = qfalse; - ri.Printf( PRINT_WARNING, "WARNING: device has broken gamma support, generated gamma.dat\n" ); - } - - // - // make sure that we didn't have a prior crash in the game, and if so we need to - // restore the gamma values to at least a linear value - // - if ( ( HIBYTE( s_oldHardwareGamma[0][181] ) == 255 ) ) - { - int g; - - ri.Printf( PRINT_WARNING, "WARNING: suspicious gamma tables, using linear ramp for restoration\n" ); - - for ( g = 0; g < 255; g++ ) - { - s_oldHardwareGamma[0][g] = g << 8; - s_oldHardwareGamma[1][g] = g << 8; - s_oldHardwareGamma[2][g] = g << 8; - } - } - } - } -} - -/* -void mapGammaMax( void ) { - int i, j; - unsigned short table[3][256]; - - // try to figure out what win2k will let us get away with setting - for ( i = 0 ; i < 256 ; i++ ) { - if ( i >= 128 ) { - table[0][i] = table[1][i] = table[2][i] = 0xffff; - } else { - table[0][i] = table[1][i] = table[2][i] = i<<9; - } - } - - for ( i = 0 ; i < 128 ; i++ ) { - for ( j = i*2 ; j < 255 ; j++ ) { - table[0][i] = table[1][i] = table[2][i] = j<<8; - if ( !SetDeviceGammaRamp( glw_state.hDC, table ) ) { - break; - } - } - table[0][i] = table[1][i] = table[2][i] = i<<9; - Com_Printf( "index %i max: %i\n", i, j-1 ); - } -} -*/ - -/* -** GLimp_SetGamma -** -** This routine should only be called if glConfig.deviceSupportsGamma is TRUE -*/ -void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { - unsigned short table[3][256]; - int i, j; - int ret; - OSVERSIONINFO vinfo; - - if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) { - return; - } - -//mapGammaMax(); - - for ( i = 0; i < 256; i++ ) { - table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i]; - table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i]; - table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i]; - } - - // Win2K puts this odd restriction on gamma ramps... - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - GetVersionEx( &vinfo ); - if ( vinfo.dwMajorVersion == 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { - Com_DPrintf( "performing W2K gamma clamp.\n" ); - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 0 ; i < 128 ; i++ ) { - if ( table[j][i] > ( (128+i) << 8 ) ) { - table[j][i] = (128+i) << 8; - } - } - if ( table[j][127] > 254<<8 ) { - table[j][127] = 254<<8; - } - } - } else { - Com_DPrintf( "skipping W2K gamma clamp.\n" ); - } - - // enforce constantly increasing - for ( j = 0 ; j < 3 ; j++ ) { - for ( i = 1 ; i < 256 ; i++ ) { - if ( table[j][i] < table[j][i-1] ) { - table[j][i] = table[j][i-1]; - } - } - } - - - if ( qwglSetDeviceGammaRamp3DFX ) - { - qwglSetDeviceGammaRamp3DFX( glw_state.hDC, table ); - } - else - { - ret = SetDeviceGammaRamp( glw_state.hDC, table ); - if ( !ret ) { - Com_Printf( "SetDeviceGammaRamp failed.\n" ); - } - } -} - -/* -** WG_RestoreGamma -*/ -void WG_RestoreGamma( void ) -{ - if ( glConfig.deviceSupportsGamma ) - { - if ( qwglSetDeviceGammaRamp3DFX ) - { - qwglSetDeviceGammaRamp3DFX( glw_state.hDC, s_oldHardwareGamma ); - } - else - { - HDC hDC; - - hDC = GetDC( GetDesktopWindow() ); - SetDeviceGammaRamp( hDC, s_oldHardwareGamma ); - ReleaseDC( GetDesktopWindow(), hDC ); - } - } -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +/* +** WIN_GAMMA.C +*/ +#include +#include "../renderer/tr_local.h" +#include "../qcommon/qcommon.h" +#include "glw_win.h" +#include "win_local.h" + +static unsigned short s_oldHardwareGamma[3][256]; + +/* +** WG_CheckHardwareGamma +** +** Determines if the underlying hardware supports the Win32 gamma correction API. +*/ +void WG_CheckHardwareGamma( void ) +{ + HDC hDC; + + glConfig.deviceSupportsGamma = qfalse; + + if ( qwglSetDeviceGammaRamp3DFX ) + { + glConfig.deviceSupportsGamma = qtrue; + + hDC = GetDC( GetDesktopWindow() ); + glConfig.deviceSupportsGamma = qwglGetDeviceGammaRamp3DFX( hDC, s_oldHardwareGamma ); + ReleaseDC( GetDesktopWindow(), hDC ); + + return; + } + + // non-3Dfx standalone drivers don't support gamma changes, period + if ( glConfig.driverType == GLDRV_STANDALONE ) + { + return; + } + + if ( !r_ignorehwgamma->integer ) + { + hDC = GetDC( GetDesktopWindow() ); + glConfig.deviceSupportsGamma = GetDeviceGammaRamp( hDC, s_oldHardwareGamma ); + ReleaseDC( GetDesktopWindow(), hDC ); + + if ( glConfig.deviceSupportsGamma ) + { + // + // do a sanity check on the gamma values + // + if ( ( HIBYTE( s_oldHardwareGamma[0][255] ) <= HIBYTE( s_oldHardwareGamma[0][0] ) ) || + ( HIBYTE( s_oldHardwareGamma[1][255] ) <= HIBYTE( s_oldHardwareGamma[1][0] ) ) || + ( HIBYTE( s_oldHardwareGamma[2][255] ) <= HIBYTE( s_oldHardwareGamma[2][0] ) ) ) + { + glConfig.deviceSupportsGamma = qfalse; + ri.Printf( PRINT_WARNING, "WARNING: device has broken gamma support, generated gamma.dat\n" ); + } + + // + // make sure that we didn't have a prior crash in the game, and if so we need to + // restore the gamma values to at least a linear value + // + if ( ( HIBYTE( s_oldHardwareGamma[0][181] ) == 255 ) ) + { + int g; + + ri.Printf( PRINT_WARNING, "WARNING: suspicious gamma tables, using linear ramp for restoration\n" ); + + for ( g = 0; g < 255; g++ ) + { + s_oldHardwareGamma[0][g] = g << 8; + s_oldHardwareGamma[1][g] = g << 8; + s_oldHardwareGamma[2][g] = g << 8; + } + } + } + } +} + +/* +void mapGammaMax( void ) { + int i, j; + unsigned short table[3][256]; + + // try to figure out what win2k will let us get away with setting + for ( i = 0 ; i < 256 ; i++ ) { + if ( i >= 128 ) { + table[0][i] = table[1][i] = table[2][i] = 0xffff; + } else { + table[0][i] = table[1][i] = table[2][i] = i<<9; + } + } + + for ( i = 0 ; i < 128 ; i++ ) { + for ( j = i*2 ; j < 255 ; j++ ) { + table[0][i] = table[1][i] = table[2][i] = j<<8; + if ( !SetDeviceGammaRamp( glw_state.hDC, table ) ) { + break; + } + } + table[0][i] = table[1][i] = table[2][i] = i<<9; + Com_Printf( "index %i max: %i\n", i, j-1 ); + } +} +*/ + +/* +** GLimp_SetGamma +** +** This routine should only be called if glConfig.deviceSupportsGamma is TRUE +*/ +void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { + unsigned short table[3][256]; + int i, j; + int ret; + OSVERSIONINFO vinfo; + + if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) { + return; + } + +//mapGammaMax(); + + for ( i = 0; i < 256; i++ ) { + table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i]; + table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i]; + table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i]; + } + + // Win2K puts this odd restriction on gamma ramps... + vinfo.dwOSVersionInfoSize = sizeof(vinfo); + GetVersionEx( &vinfo ); + if ( vinfo.dwMajorVersion == 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { + Com_DPrintf( "performing W2K gamma clamp.\n" ); + for ( j = 0 ; j < 3 ; j++ ) { + for ( i = 0 ; i < 128 ; i++ ) { + if ( table[j][i] > ( (128+i) << 8 ) ) { + table[j][i] = (128+i) << 8; + } + } + if ( table[j][127] > 254<<8 ) { + table[j][127] = 254<<8; + } + } + } else { + Com_DPrintf( "skipping W2K gamma clamp.\n" ); + } + + // enforce constantly increasing + for ( j = 0 ; j < 3 ; j++ ) { + for ( i = 1 ; i < 256 ; i++ ) { + if ( table[j][i] < table[j][i-1] ) { + table[j][i] = table[j][i-1]; + } + } + } + + + if ( qwglSetDeviceGammaRamp3DFX ) + { + qwglSetDeviceGammaRamp3DFX( glw_state.hDC, table ); + } + else + { + ret = SetDeviceGammaRamp( glw_state.hDC, table ); + if ( !ret ) { + Com_Printf( "SetDeviceGammaRamp failed.\n" ); + } + } +} + +/* +** WG_RestoreGamma +*/ +void WG_RestoreGamma( void ) +{ + if ( glConfig.deviceSupportsGamma ) + { + if ( qwglSetDeviceGammaRamp3DFX ) + { + qwglSetDeviceGammaRamp3DFX( glw_state.hDC, s_oldHardwareGamma ); + } + else + { + HDC hDC; + + hDC = GetDC( GetDesktopWindow() ); + SetDeviceGammaRamp( hDC, s_oldHardwareGamma ); + ReleaseDC( GetDesktopWindow(), hDC ); + } + } +} + diff --git a/code/win32/win_glimp.c b/code/win32/win_glimp.c index 88fe180..acb14ad 100755 --- a/code/win32/win_glimp.c +++ b/code/win32/win_glimp.c @@ -1,1658 +1,1658 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -/* -** WIN_GLIMP.C -** -** This file contains ALL Win32 specific stuff having to do with the -** OpenGL refresh. When a port is being made the following functions -** must be implemented by the port: -** -** GLimp_EndFrame -** GLimp_Init -** GLimp_LogComment -** GLimp_Shutdown -** -** Note that the GLW_xxx functions are Windows specific GL-subsystem -** related functions that are relevant ONLY to win_glimp.c -*/ -#include -#include "../renderer/tr_local.h" -#include "../qcommon/qcommon.h" -#include "resource.h" -#include "glw_win.h" -#include "win_local.h" - -extern void WG_CheckHardwareGamma( void ); -extern void WG_RestoreGamma( void ); - -typedef enum { - RSERR_OK, - - RSERR_INVALID_FULLSCREEN, - RSERR_INVALID_MODE, - - RSERR_UNKNOWN -} rserr_t; - -#define TRY_PFD_SUCCESS 0 -#define TRY_PFD_FAIL_SOFT 1 -#define TRY_PFD_FAIL_HARD 2 - -#define WINDOW_CLASS_NAME "Quake 3: Arena" - -static void GLW_InitExtensions( void ); -static rserr_t GLW_SetMode( const char *drivername, - int mode, - int colorbits, - qboolean cdsFullscreen ); - -static qboolean s_classRegistered = qfalse; - -// -// function declaration -// -void QGL_EnableLogging( qboolean enable ); -qboolean QGL_Init( const char *dllname ); -void QGL_Shutdown( void ); - -// -// variable declarations -// -glwstate_t glw_state; - -cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software -cvar_t *r_maskMinidriver; // allow a different dll name to be treated as if it were opengl32.dll - - - -/* -** GLW_StartDriverAndSetMode -*/ -static qboolean GLW_StartDriverAndSetMode( const char *drivername, - int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - rserr_t err; - - err = GLW_SetMode( drivername, r_mode->integer, colorbits, cdsFullscreen ); - - switch ( err ) - { - case RSERR_INVALID_FULLSCREEN: - ri.Printf( PRINT_ALL, "...WARNING: fullscreen unavailable in this mode\n" ); - return qfalse; - case RSERR_INVALID_MODE: - ri.Printf( PRINT_ALL, "...WARNING: could not set the given mode (%d)\n", mode ); - return qfalse; - default: - break; - } - return qtrue; -} - -/* -** ChoosePFD -** -** Helper function that replaces ChoosePixelFormat. -*/ -#define MAX_PFDS 256 - -static int GLW_ChoosePFD( HDC hDC, PIXELFORMATDESCRIPTOR *pPFD ) -{ - PIXELFORMATDESCRIPTOR pfds[MAX_PFDS+1]; - int maxPFD = 0; - int i; - int bestMatch = 0; - - ri.Printf( PRINT_ALL, "...GLW_ChoosePFD( %d, %d, %d )\n", ( int ) pPFD->cColorBits, ( int ) pPFD->cDepthBits, ( int ) pPFD->cStencilBits ); - - // count number of PFDs - if ( glConfig.driverType > GLDRV_ICD ) - { - maxPFD = qwglDescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); - } - else - { - maxPFD = DescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); - } - if ( maxPFD > MAX_PFDS ) - { - ri.Printf( PRINT_WARNING, "...numPFDs > MAX_PFDS (%d > %d)\n", maxPFD, MAX_PFDS ); - maxPFD = MAX_PFDS; - } - - ri.Printf( PRINT_ALL, "...%d PFDs found\n", maxPFD - 1 ); - - // grab information - for ( i = 1; i <= maxPFD; i++ ) - { - if ( glConfig.driverType > GLDRV_ICD ) - { - qwglDescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); - } - else - { - DescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); - } - } - - // look for a best match - for ( i = 1; i <= maxPFD; i++ ) - { - // - // make sure this has hardware acceleration - // - if ( ( pfds[i].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, software acceleration\n", i ); - } - continue; - } - } - - // verify pixel type - if ( pfds[i].iPixelType != PFD_TYPE_RGBA ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, not RGBA\n", i ); - } - continue; - } - - // verify proper flags - if ( ( ( pfds[i].dwFlags & pPFD->dwFlags ) & pPFD->dwFlags ) != pPFD->dwFlags ) - { - if ( r_verbose->integer ) - { - ri.Printf( PRINT_ALL, "...PFD %d rejected, improper flags (%x instead of %x)\n", i, pfds[i].dwFlags, pPFD->dwFlags ); - } - continue; - } - - // verify enough bits - if ( pfds[i].cDepthBits < 15 ) - { - continue; - } - if ( ( pfds[i].cStencilBits < 4 ) && ( pPFD->cStencilBits > 0 ) ) - { - continue; - } - - // - // selection criteria (in order of priority): - // - // PFD_STEREO - // colorBits - // depthBits - // stencilBits - // - if ( bestMatch ) - { - // check stereo - if ( ( pfds[i].dwFlags & PFD_STEREO ) && ( !( pfds[bestMatch].dwFlags & PFD_STEREO ) ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - if ( !( pfds[i].dwFlags & PFD_STEREO ) && ( pfds[bestMatch].dwFlags & PFD_STEREO ) && ( pPFD->dwFlags & PFD_STEREO ) ) - { - bestMatch = i; - continue; - } - - // check color - if ( pfds[bestMatch].cColorBits != pPFD->cColorBits ) - { - // prefer perfect match - if ( pfds[i].cColorBits == pPFD->cColorBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cColorBits > pfds[bestMatch].cColorBits ) - { - bestMatch = i; - continue; - } - } - - // check depth - if ( pfds[bestMatch].cDepthBits != pPFD->cDepthBits ) - { - // prefer perfect match - if ( pfds[i].cDepthBits == pPFD->cDepthBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( pfds[i].cDepthBits > pfds[bestMatch].cDepthBits ) - { - bestMatch = i; - continue; - } - } - - // check stencil - if ( pfds[bestMatch].cStencilBits != pPFD->cStencilBits ) - { - // prefer perfect match - if ( pfds[i].cStencilBits == pPFD->cStencilBits ) - { - bestMatch = i; - continue; - } - // otherwise if this PFD has more bits than our best, use it - else if ( ( pfds[i].cStencilBits > pfds[bestMatch].cStencilBits ) && - ( pPFD->cStencilBits > 0 ) ) - { - bestMatch = i; - continue; - } - } - } - else - { - bestMatch = i; - } - } - - if ( !bestMatch ) - return 0; - - if ( ( pfds[bestMatch].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) - { - if ( !r_allowSoftwareGL->integer ) - { - ri.Printf( PRINT_ALL, "...no hardware acceleration found\n" ); - return 0; - } - else - { - ri.Printf( PRINT_ALL, "...using software emulation\n" ); - } - } - else if ( pfds[bestMatch].dwFlags & PFD_GENERIC_ACCELERATED ) - { - ri.Printf( PRINT_ALL, "...MCD acceleration found\n" ); - } - else - { - ri.Printf( PRINT_ALL, "...hardware acceleration found\n" ); - } - - *pPFD = pfds[bestMatch]; - - return bestMatch; -} - -/* -** void GLW_CreatePFD -** -** Helper function zeros out then fills in a PFD -*/ -static void GLW_CreatePFD( PIXELFORMATDESCRIPTOR *pPFD, int colorbits, int depthbits, int stencilbits, qboolean stereo ) -{ - PIXELFORMATDESCRIPTOR src = - { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 24, // 24-bit z-buffer - 8, // 8-bit stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - - src.cColorBits = colorbits; - src.cDepthBits = depthbits; - src.cStencilBits = stencilbits; - - if ( stereo ) - { - ri.Printf( PRINT_ALL, "...attempting to use stereo\n" ); - src.dwFlags |= PFD_STEREO; - glConfig.stereoEnabled = qtrue; - } - else - { - glConfig.stereoEnabled = qfalse; - } - - *pPFD = src; -} - -/* -** GLW_MakeContext -*/ -static int GLW_MakeContext( PIXELFORMATDESCRIPTOR *pPFD ) -{ - int pixelformat; - - // - // don't putz around with pixelformat if it's already set (e.g. this is a soft - // reset of the graphics system) - // - if ( !glw_state.pixelFormatSet ) - { - // - // choose, set, and describe our desired pixel format. If we're - // using a minidriver then we need to bypass the GDI functions, - // otherwise use the GDI functions. - // - if ( ( pixelformat = GLW_ChoosePFD( glw_state.hDC, pPFD ) ) == 0 ) - { - ri.Printf( PRINT_ALL, "...GLW_ChoosePFD failed\n"); - return TRY_PFD_FAIL_SOFT; - } - ri.Printf( PRINT_ALL, "...PIXELFORMAT %d selected\n", pixelformat ); - - if ( glConfig.driverType > GLDRV_ICD ) - { - qwglDescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); - if ( qwglSetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) - { - ri.Printf ( PRINT_ALL, "...qwglSetPixelFormat failed\n"); - return TRY_PFD_FAIL_SOFT; - } - } - else - { - DescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); - - if ( SetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) - { - ri.Printf (PRINT_ALL, "...SetPixelFormat failed\n", glw_state.hDC ); - return TRY_PFD_FAIL_SOFT; - } - } - - glw_state.pixelFormatSet = qtrue; - } - - // - // startup the OpenGL subsystem by creating a context and making it current - // - if ( !glw_state.hGLRC ) - { - ri.Printf( PRINT_ALL, "...creating GL context: " ); - if ( ( glw_state.hGLRC = qwglCreateContext( glw_state.hDC ) ) == 0 ) - { - ri.Printf (PRINT_ALL, "failed\n"); - - return TRY_PFD_FAIL_HARD; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - - ri.Printf( PRINT_ALL, "...making context current: " ); - if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) - { - qwglDeleteContext( glw_state.hGLRC ); - glw_state.hGLRC = NULL; - ri.Printf (PRINT_ALL, "failed\n"); - return TRY_PFD_FAIL_HARD; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - } - - return TRY_PFD_SUCCESS; -} - - -/* -** GLW_InitDriver -** -** - get a DC if one doesn't exist -** - create an HGLRC if one doesn't exist -*/ -static qboolean GLW_InitDriver( const char *drivername, int colorbits ) -{ - int tpfd; - int depthbits, stencilbits; - static PIXELFORMATDESCRIPTOR pfd; // save between frames since 'tr' gets cleared - - ri.Printf( PRINT_ALL, "Initializing OpenGL driver\n" ); - - // - // get a DC for our window if we don't already have one allocated - // - if ( glw_state.hDC == NULL ) - { - ri.Printf( PRINT_ALL, "...getting DC: " ); - - if ( ( glw_state.hDC = GetDC( g_wv.hWnd ) ) == NULL ) - { - ri.Printf( PRINT_ALL, "failed\n" ); - return qfalse; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - } - - if ( colorbits == 0 ) - { - colorbits = glw_state.desktopBitsPixel; - } - - // - // implicitly assume Z-buffer depth == desktop color depth - // - if ( r_depthbits->integer == 0 ) { - if ( colorbits > 16 ) { - depthbits = 24; - } else { - depthbits = 16; - } - } else { - depthbits = r_depthbits->integer; - } - - // - // do not allow stencil if Z-buffer depth likely won't contain it - // - stencilbits = r_stencilbits->integer; - if ( depthbits < 24 ) - { - stencilbits = 0; - } - - // - // make two attempts to set the PIXELFORMAT - // - - // - // first attempt: r_colorbits, depthbits, and r_stencilbits - // - if ( !glw_state.pixelFormatSet ) - { - GLW_CreatePFD( &pfd, colorbits, depthbits, stencilbits, r_stereo->integer ); - if ( ( tpfd = GLW_MakeContext( &pfd ) ) != TRY_PFD_SUCCESS ) - { - if ( tpfd == TRY_PFD_FAIL_HARD ) - { - ri.Printf( PRINT_WARNING, "...failed hard\n" ); - return qfalse; - } - - // - // punt if we've already tried the desktop bit depth and no stencil bits - // - if ( ( r_colorbits->integer == glw_state.desktopBitsPixel ) && - ( stencilbits == 0 ) ) - { - ReleaseDC( g_wv.hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - - ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - - // - // second attempt: desktop's color bits and no stencil - // - if ( colorbits > glw_state.desktopBitsPixel ) - { - colorbits = glw_state.desktopBitsPixel; - } - GLW_CreatePFD( &pfd, colorbits, depthbits, 0, r_stereo->integer ); - if ( GLW_MakeContext( &pfd ) != TRY_PFD_SUCCESS ) - { - if ( glw_state.hDC ) - { - ReleaseDC( g_wv.hWnd, glw_state.hDC ); - glw_state.hDC = NULL; - } - - ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); - - return qfalse; - } - } - - /* - ** report if stereo is desired but unavailable - */ - if ( !( pfd.dwFlags & PFD_STEREO ) && ( r_stereo->integer != 0 ) ) - { - ri.Printf( PRINT_ALL, "...failed to select stereo pixel format\n" ); - glConfig.stereoEnabled = qfalse; - } - } - - /* - ** store PFD specifics - */ - glConfig.colorBits = ( int ) pfd.cColorBits; - glConfig.depthBits = ( int ) pfd.cDepthBits; - glConfig.stencilBits = ( int ) pfd.cStencilBits; - - return qtrue; -} - -/* -** GLW_CreateWindow -** -** Responsible for creating the Win32 window and initializing the OpenGL driver. -*/ -#define WINDOW_STYLE (WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_VISIBLE) -static qboolean GLW_CreateWindow( const char *drivername, int width, int height, int colorbits, qboolean cdsFullscreen ) -{ - RECT r; - cvar_t *vid_xpos, *vid_ypos; - int stylebits; - int x, y, w, h; - int exstyle; - - // - // register the window class if necessary - // - if ( !s_classRegistered ) - { - WNDCLASS wc; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) glw_state.wndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = g_wv.hInstance; - wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = (void *)COLOR_GRAYTEXT; - wc.lpszMenuName = 0; - wc.lpszClassName = WINDOW_CLASS_NAME; - - if ( !RegisterClass( &wc ) ) - { - ri.Error( ERR_FATAL, "GLW_CreateWindow: could not register window class" ); - } - s_classRegistered = qtrue; - ri.Printf( PRINT_ALL, "...registered window class\n" ); - } - - // - // create the HWND if one does not already exist - // - if ( !g_wv.hWnd ) - { - // - // compute width and height - // - r.left = 0; - r.top = 0; - r.right = width; - r.bottom = height; - - if ( cdsFullscreen || !Q_stricmp( _3DFX_DRIVER_NAME, drivername ) ) - { - exstyle = WS_EX_TOPMOST; - stylebits = WS_POPUP|WS_VISIBLE|WS_SYSMENU; - } - else - { - exstyle = 0; - stylebits = WINDOW_STYLE|WS_SYSMENU; - AdjustWindowRect (&r, stylebits, FALSE); - } - - w = r.right - r.left; - h = r.bottom - r.top; - - if ( cdsFullscreen || !Q_stricmp( _3DFX_DRIVER_NAME, drivername ) ) - { - x = 0; - y = 0; - } - else - { - vid_xpos = ri.Cvar_Get ("vid_xpos", "", 0); - vid_ypos = ri.Cvar_Get ("vid_ypos", "", 0); - x = vid_xpos->integer; - y = vid_ypos->integer; - - // adjust window coordinates if necessary - // so that the window is completely on screen - if ( x < 0 ) - x = 0; - if ( y < 0 ) - y = 0; - - if ( w < glw_state.desktopWidth && - h < glw_state.desktopHeight ) - { - if ( x + w > glw_state.desktopWidth ) - x = ( glw_state.desktopWidth - w ); - if ( y + h > glw_state.desktopHeight ) - y = ( glw_state.desktopHeight - h ); - } - } - - g_wv.hWnd = CreateWindowEx ( - exstyle, - WINDOW_CLASS_NAME, - "Quake 3: Arena", - stylebits, - x, y, w, h, - NULL, - NULL, - g_wv.hInstance, - NULL); - - if ( !g_wv.hWnd ) - { - ri.Error (ERR_FATAL, "GLW_CreateWindow() - Couldn't create window"); - } - - ShowWindow( g_wv.hWnd, SW_SHOW ); - UpdateWindow( g_wv.hWnd ); - ri.Printf( PRINT_ALL, "...created window@%d,%d (%dx%d)\n", x, y, w, h ); - } - else - { - ri.Printf( PRINT_ALL, "...window already present, CreateWindowEx skipped\n" ); - } - - if ( !GLW_InitDriver( drivername, colorbits ) ) - { - ShowWindow( g_wv.hWnd, SW_HIDE ); - DestroyWindow( g_wv.hWnd ); - g_wv.hWnd = NULL; - - return qfalse; - } - - SetForegroundWindow( g_wv.hWnd ); - SetFocus( g_wv.hWnd ); - - return qtrue; -} - -static void PrintCDSError( int value ) -{ - switch ( value ) - { - case DISP_CHANGE_RESTART: - ri.Printf( PRINT_ALL, "restart required\n" ); - break; - case DISP_CHANGE_BADPARAM: - ri.Printf( PRINT_ALL, "bad param\n" ); - break; - case DISP_CHANGE_BADFLAGS: - ri.Printf( PRINT_ALL, "bad flags\n" ); - break; - case DISP_CHANGE_FAILED: - ri.Printf( PRINT_ALL, "DISP_CHANGE_FAILED\n" ); - break; - case DISP_CHANGE_BADMODE: - ri.Printf( PRINT_ALL, "bad mode\n" ); - break; - case DISP_CHANGE_NOTUPDATED: - ri.Printf( PRINT_ALL, "not updated\n" ); - break; - default: - ri.Printf( PRINT_ALL, "unknown error %d\n", value ); - break; - } -} - -/* -** GLW_SetMode -*/ -static rserr_t GLW_SetMode( const char *drivername, - int mode, - int colorbits, - qboolean cdsFullscreen ) -{ - HDC hDC; - const char *win_fs[] = { "W", "FS" }; - int cdsRet; - DEVMODE dm; - - // - // print out informational messages - // - ri.Printf( PRINT_ALL, "...setting mode %d:", mode ); - if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, &glConfig.windowAspect, mode ) ) - { - ri.Printf( PRINT_ALL, " invalid mode\n" ); - return RSERR_INVALID_MODE; - } - ri.Printf( PRINT_ALL, " %d %d %s\n", glConfig.vidWidth, glConfig.vidHeight, win_fs[cdsFullscreen] ); - - // - // check our desktop attributes - // - hDC = GetDC( GetDesktopWindow() ); - glw_state.desktopBitsPixel = GetDeviceCaps( hDC, BITSPIXEL ); - glw_state.desktopWidth = GetDeviceCaps( hDC, HORZRES ); - glw_state.desktopHeight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - // - // verify desktop bit depth - // - if ( glConfig.driverType != GLDRV_VOODOO ) - { - if ( glw_state.desktopBitsPixel < 15 || glw_state.desktopBitsPixel == 24 ) - { - if ( colorbits == 0 || ( !cdsFullscreen && colorbits >= 15 ) ) - { - if ( MessageBox( NULL, - "It is highly unlikely that a correct\n" - "windowed display can be initialized with\n" - "the current desktop display depth. Select\n" - "'OK' to try anyway. Press 'Cancel' if you\n" - "have a 3Dfx Voodoo, Voodoo-2, or Voodoo Rush\n" - "3D accelerator installed, or if you otherwise\n" - "wish to quit.", - "Low Desktop Color Depth", - MB_OKCANCEL | MB_ICONEXCLAMATION ) != IDOK ) - { - return RSERR_INVALID_MODE; - } - } - } - } - - // do a CDS if needed - if ( cdsFullscreen ) - { - memset( &dm, 0, sizeof( dm ) ); - - dm.dmSize = sizeof( dm ); - - dm.dmPelsWidth = glConfig.vidWidth; - dm.dmPelsHeight = glConfig.vidHeight; - dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - - if ( r_displayRefresh->integer != 0 ) - { - dm.dmDisplayFrequency = r_displayRefresh->integer; - dm.dmFields |= DM_DISPLAYFREQUENCY; - } - - // try to change color depth if possible - if ( colorbits != 0 ) - { - if ( glw_state.allowdisplaydepthchange ) - { - dm.dmBitsPerPel = colorbits; - dm.dmFields |= DM_BITSPERPEL; - ri.Printf( PRINT_ALL, "...using colorsbits of %d\n", colorbits ); - } - else - { - ri.Printf( PRINT_ALL, "WARNING:...changing depth not supported on Win95 < pre-OSR 2.x\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...using desktop display depth of %d\n", glw_state.desktopBitsPixel ); - } - - // - // if we're already in fullscreen then just create the window - // - if ( glw_state.cdsFullscreen ) - { - ri.Printf( PRINT_ALL, "...already fullscreen, avoiding redundant CDS\n" ); - - if ( !GLW_CreateWindow ( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue ) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - } - // - // need to call CDS - // - else - { - ri.Printf( PRINT_ALL, "...calling CDS: " ); - - // try setting the exact mode requested, because some drivers don't report - // the low res modes in EnumDisplaySettings, but still work - if ( ( cdsRet = ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - ri.Printf( PRINT_ALL, "ok\n" ); - - if ( !GLW_CreateWindow ( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - // - // the exact mode failed, so scan EnumDisplaySettings for the next largest mode - // - DEVMODE devmode; - int modeNum; - - ri.Printf( PRINT_ALL, "failed, " ); - - PrintCDSError( cdsRet ); - - ri.Printf( PRINT_ALL, "...trying next higher resolution:" ); - - // we could do a better matching job here... - for ( modeNum = 0 ; ; modeNum++ ) { - if ( !EnumDisplaySettings( NULL, modeNum, &devmode ) ) { - modeNum = -1; - break; - } - if ( devmode.dmPelsWidth >= glConfig.vidWidth - && devmode.dmPelsHeight >= glConfig.vidHeight - && devmode.dmBitsPerPel >= 15 ) { - break; - } - } - - if ( modeNum != -1 && ( cdsRet = ChangeDisplaySettings( &devmode, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) - { - ri.Printf( PRINT_ALL, " ok\n" ); - if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) - { - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - return RSERR_INVALID_MODE; - } - - glw_state.cdsFullscreen = qtrue; - } - else - { - ri.Printf( PRINT_ALL, " failed, " ); - - PrintCDSError( cdsRet ); - - ri.Printf( PRINT_ALL, "...restoring display settings\n" ); - ChangeDisplaySettings( 0, 0 ); - - glw_state.cdsFullscreen = qfalse; - glConfig.isFullscreen = qfalse; - if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse) ) - { - return RSERR_INVALID_MODE; - } - return RSERR_INVALID_FULLSCREEN; - } - } - } - } - else - { - if ( glw_state.cdsFullscreen ) - { - ChangeDisplaySettings( 0, 0 ); - } - - glw_state.cdsFullscreen = qfalse; - if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse ) ) - { - return RSERR_INVALID_MODE; - } - } - - // - // success, now check display frequency, although this won't be valid on Voodoo(2) - // - memset( &dm, 0, sizeof( dm ) ); - dm.dmSize = sizeof( dm ); - if ( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm ) ) - { - glConfig.displayFrequency = dm.dmDisplayFrequency; - } - - // NOTE: this is overridden later on standalone 3Dfx drivers - glConfig.isFullscreen = cdsFullscreen; - - return RSERR_OK; -} - -/* -** GLW_InitExtensions -*/ -static void GLW_InitExtensions( void ) -{ - if ( !r_allowExtensions->integer ) - { - ri.Printf( PRINT_ALL, "*** IGNORING OPENGL EXTENSIONS ***\n" ); - return; - } - - ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" ); - - // GL_S3_s3tc - glConfig.textureCompression = TC_NONE; - if ( strstr( glConfig.extensions_string, "GL_S3_s3tc" ) ) - { - if ( r_ext_compressed_textures->integer ) - { - glConfig.textureCompression = TC_S3TC; - ri.Printf( PRINT_ALL, "...using GL_S3_s3tc\n" ); - } - else - { - glConfig.textureCompression = TC_NONE; - ri.Printf( PRINT_ALL, "...ignoring GL_S3_s3tc\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_S3_s3tc not found\n" ); - } - - // GL_EXT_texture_env_add - glConfig.textureEnvAddAvailable = qfalse; - if ( strstr( glConfig.extensions_string, "EXT_texture_env_add" ) ) - { - if ( r_ext_texture_env_add->integer ) - { - glConfig.textureEnvAddAvailable = qtrue; - ri.Printf( PRINT_ALL, "...using GL_EXT_texture_env_add\n" ); - } - else - { - glConfig.textureEnvAddAvailable = qfalse; - ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_env_add\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_EXT_texture_env_add not found\n" ); - } - - // WGL_EXT_swap_control - qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" ); - if ( qwglSwapIntervalEXT ) - { - ri.Printf( PRINT_ALL, "...using WGL_EXT_swap_control\n" ); - r_swapInterval->modified = qtrue; // force a set next frame - } - else - { - ri.Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" ); - } - - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( strstr( glConfig.extensions_string, "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) qwglGetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glClientActiveTextureARB" ); - - if ( qglActiveTextureARB ) - { - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); - - if ( glConfig.maxActiveTextures > 1 ) - { - ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" ); - } - - // GL_EXT_compiled_vertex_array - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - if ( strstr( glConfig.extensions_string, "GL_EXT_compiled_vertex_array" ) && ( glConfig.hardwareType != GLHW_RIVA128 ) ) - { - if ( r_ext_compiled_vertex_array->integer ) - { - ri.Printf( PRINT_ALL, "...using GL_EXT_compiled_vertex_array\n" ); - qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) qwglGetProcAddress( "glLockArraysEXT" ); - qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) qwglGetProcAddress( "glUnlockArraysEXT" ); - if (!qglLockArraysEXT || !qglUnlockArraysEXT) { - ri.Error (ERR_FATAL, "bad getprocaddress"); - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring GL_EXT_compiled_vertex_array\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" ); - } - - // WGL_3DFX_gamma_control - qwglGetDeviceGammaRamp3DFX = NULL; - qwglSetDeviceGammaRamp3DFX = NULL; - - if ( strstr( glConfig.extensions_string, "WGL_3DFX_gamma_control" ) ) - { - if ( !r_ignorehwgamma->integer && r_ext_gamma_control->integer ) - { - qwglGetDeviceGammaRamp3DFX = ( BOOL ( WINAPI * )( HDC, LPVOID ) ) qwglGetProcAddress( "wglGetDeviceGammaRamp3DFX" ); - qwglSetDeviceGammaRamp3DFX = ( BOOL ( WINAPI * )( HDC, LPVOID ) ) qwglGetProcAddress( "wglSetDeviceGammaRamp3DFX" ); - - if ( qwglGetDeviceGammaRamp3DFX && qwglSetDeviceGammaRamp3DFX ) - { - ri.Printf( PRINT_ALL, "...using WGL_3DFX_gamma_control\n" ); - } - else - { - qwglGetDeviceGammaRamp3DFX = NULL; - qwglSetDeviceGammaRamp3DFX = NULL; - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring WGL_3DFX_gamma_control\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...WGL_3DFX_gamma_control not found\n" ); - } -} - -/* -** GLW_CheckOSVersion -*/ -static qboolean GLW_CheckOSVersion( void ) -{ -#define OSR2_BUILD_NUMBER 1111 - - OSVERSIONINFO vinfo; - - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - - glw_state.allowdisplaydepthchange = qfalse; - - if ( GetVersionEx( &vinfo) ) - { - if ( vinfo.dwMajorVersion > 4 ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwMajorVersion == 4 ) - { - if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - else if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) - { - if ( LOWORD( vinfo.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) - { - glw_state.allowdisplaydepthchange = qtrue; - } - } - } - } - else - { - ri.Printf( PRINT_ALL, "GLW_CheckOSVersion() - GetVersionEx failed\n" ); - return qfalse; - } - - return qtrue; -} - -/* -** GLW_LoadOpenGL -** -** GLimp_win.c internal function that attempts to load and use -** a specific OpenGL DLL. -*/ -static qboolean GLW_LoadOpenGL( const char *drivername ) -{ - char buffer[1024]; - qboolean cdsFullscreen; - - Q_strncpyz( buffer, drivername, sizeof(buffer) ); - Q_strlwr(buffer); - - // - // determine if we're on a standalone driver - // - if ( strstr( buffer, "opengl32" ) != 0 || r_maskMinidriver->integer ) - { - glConfig.driverType = GLDRV_ICD; - } - else - { - glConfig.driverType = GLDRV_STANDALONE; - - ri.Printf( PRINT_ALL, "...assuming '%s' is a standalone driver\n", drivername ); - - if ( strstr( buffer, _3DFX_DRIVER_NAME ) ) - { - glConfig.driverType = GLDRV_VOODOO; - } - } - - // disable the 3Dfx splash screen - _putenv("FX_GLIDE_NO_SPLASH=0"); - - // - // load the driver and bind our function pointers to it - // - if ( QGL_Init( buffer ) ) - { - cdsFullscreen = r_fullscreen->integer; - - // create the window and set up the context - if ( !GLW_StartDriverAndSetMode( drivername, r_mode->integer, r_colorbits->integer, cdsFullscreen ) ) - { - // if we're on a 24/32-bit desktop and we're going fullscreen on an ICD, - // try it again but with a 16-bit desktop - if ( glConfig.driverType == GLDRV_ICD ) - { - if ( r_colorbits->integer != 16 || - cdsFullscreen != qtrue || - r_mode->integer != 3 ) - { - if ( !GLW_StartDriverAndSetMode( drivername, 3, 16, qtrue ) ) - { - goto fail; - } - } - } - else - { - goto fail; - } - } - - if ( glConfig.driverType == GLDRV_VOODOO ) - { - glConfig.isFullscreen = qtrue; - } - - return qtrue; - } -fail: - - QGL_Shutdown(); - - return qfalse; -} - -/* -** GLimp_EndFrame -*/ -void GLimp_EndFrame (void) -{ - // - // swapinterval stuff - // - if ( r_swapInterval->modified ) { - r_swapInterval->modified = qfalse; - - if ( !glConfig.stereoEnabled ) { // why? - if ( qwglSwapIntervalEXT ) { - qwglSwapIntervalEXT( r_swapInterval->integer ); - } - } - } - - - // don't flip if drawing to front buffer - if ( Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) != 0 ) - { - if ( glConfig.driverType > GLDRV_ICD ) - { - if ( !qwglSwapBuffers( glw_state.hDC ) ) - { - ri.Error( ERR_FATAL, "GLimp_EndFrame() - SwapBuffers() failed!\n" ); - } - } - else - { - SwapBuffers( glw_state.hDC ); - } - } - - // check logging - QGL_EnableLogging( r_logFile->integer ); -} - -static void GLW_StartOpenGL( void ) -{ - qboolean attemptedOpenGL32 = qfalse; - qboolean attempted3Dfx = qfalse; - - // - // load and initialize the specific OpenGL driver - // - if ( !GLW_LoadOpenGL( r_glDriver->string ) ) - { - if ( !Q_stricmp( r_glDriver->string, OPENGL_DRIVER_NAME ) ) - { - attemptedOpenGL32 = qtrue; - } - else if ( !Q_stricmp( r_glDriver->string, _3DFX_DRIVER_NAME ) ) - { - attempted3Dfx = qtrue; - } - - if ( !attempted3Dfx ) - { - attempted3Dfx = qtrue; - if ( GLW_LoadOpenGL( _3DFX_DRIVER_NAME ) ) - { - ri.Cvar_Set( "r_glDriver", _3DFX_DRIVER_NAME ); - r_glDriver->modified = qfalse; - } - else - { - if ( !attemptedOpenGL32 ) - { - if ( !GLW_LoadOpenGL( OPENGL_DRIVER_NAME ) ) - { - ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); - } - ri.Cvar_Set( "r_glDriver", OPENGL_DRIVER_NAME ); - r_glDriver->modified = qfalse; - } - else - { - ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); - } - } - } - else if ( !attemptedOpenGL32 ) - { - attemptedOpenGL32 = qtrue; - if ( GLW_LoadOpenGL( OPENGL_DRIVER_NAME ) ) - { - ri.Cvar_Set( "r_glDriver", OPENGL_DRIVER_NAME ); - r_glDriver->modified = qfalse; - } - else - { - ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); - } - } - } -} - -/* -** GLimp_Init -** -** This is the platform specific OpenGL initialization function. It -** is responsible for loading OpenGL, initializing it, setting -** extensions, creating a window of the appropriate size, doing -** fullscreen manipulations, etc. Its overall responsibility is -** to make sure that a functional OpenGL subsystem is operating -** when it returns to the ref. -*/ -void GLimp_Init( void ) -{ - char buf[1024]; - cvar_t *lastValidRenderer = ri.Cvar_Get( "r_lastValidRenderer", "(uninitialized)", CVAR_ARCHIVE ); - cvar_t *cv; - - ri.Printf( PRINT_ALL, "Initializing OpenGL subsystem\n" ); - - // - // check OS version to see if we can do fullscreen display changes - // - if ( !GLW_CheckOSVersion() ) - { - ri.Error( ERR_FATAL, "GLimp_Init() - incorrect operating system\n" ); - } - - // save off hInstance and wndproc - cv = ri.Cvar_Get( "win_hinstance", "", 0 ); - sscanf( cv->string, "%i", (int *)&g_wv.hInstance ); - - cv = ri.Cvar_Get( "win_wndproc", "", 0 ); - sscanf( cv->string, "%i", (int *)&glw_state.wndproc ); - - r_allowSoftwareGL = ri.Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - r_maskMinidriver = ri.Cvar_Get( "r_maskMinidriver", "0", CVAR_LATCH ); - - // load appropriate DLL and initialize subsystem - GLW_StartOpenGL(); - - // get our config strings - Q_strncpyz( glConfig.vendor_string, qglGetString (GL_VENDOR), sizeof( glConfig.vendor_string ) ); - Q_strncpyz( glConfig.renderer_string, qglGetString (GL_RENDERER), sizeof( glConfig.renderer_string ) ); - Q_strncpyz( glConfig.version_string, qglGetString (GL_VERSION), sizeof( glConfig.version_string ) ); - Q_strncpyz( glConfig.extensions_string, qglGetString (GL_EXTENSIONS), sizeof( glConfig.extensions_string ) ); - - // - // chipset specific configuration - // - Q_strncpyz( buf, glConfig.renderer_string, sizeof(buf) ); - Q_strlwr( buf ); - - // - // NOTE: if changing cvars, do it within this block. This allows them - // to be overridden when testing driver fixes, etc. but only sets - // them to their default state when the hardware is first installed/run. - // - if ( Q_stricmp( lastValidRenderer->string, glConfig.renderer_string ) ) - { - glConfig.hardwareType = GLHW_GENERIC; - - ri.Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); - - // VOODOO GRAPHICS w/ 2MB - if ( strstr( buf, "voodoo graphics/1 tmu/2 mb" ) ) - { - ri.Cvar_Set( "r_picmip", "2" ); - ri.Cvar_Get( "r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH ); - } - else - { - ri.Cvar_Set( "r_picmip", "1" ); - - if ( strstr( buf, "rage 128" ) || strstr( buf, "rage128" ) ) - { - ri.Cvar_Set( "r_finish", "0" ); - } - // Savage3D and Savage4 should always have trilinear enabled - else if ( strstr( buf, "savage3d" ) || strstr( buf, "s3 savage4" ) ) - { - ri.Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); - } - } - } - - // - // this is where hardware specific workarounds that should be - // detected/initialized every startup should go. - // - if ( strstr( buf, "banshee" ) || strstr( buf, "voodoo3" ) ) - { - glConfig.hardwareType = GLHW_3DFX_2D3D; - } - // VOODOO GRAPHICS w/ 2MB - else if ( strstr( buf, "voodoo graphics/1 tmu/2 mb" ) ) - { - } - else if ( strstr( buf, "glzicd" ) ) - { - } - else if ( strstr( buf, "rage pro" ) || strstr( buf, "Rage Pro" ) || strstr( buf, "ragepro" ) ) - { - glConfig.hardwareType = GLHW_RAGEPRO; - } - else if ( strstr( buf, "rage 128" ) ) - { - } - else if ( strstr( buf, "permedia2" ) ) - { - glConfig.hardwareType = GLHW_PERMEDIA2; - } - else if ( strstr( buf, "riva 128" ) ) - { - glConfig.hardwareType = GLHW_RIVA128; - } - else if ( strstr( buf, "riva tnt " ) ) - { - } - - ri.Cvar_Set( "r_lastValidRenderer", glConfig.renderer_string ); - - GLW_InitExtensions(); - WG_CheckHardwareGamma(); -} - -/* -** GLimp_Shutdown -** -** This routine does all OS specific shutdown procedures for the OpenGL -** subsystem. -*/ -void GLimp_Shutdown( void ) -{ -// const char *strings[] = { "soft", "hard" }; - const char *success[] = { "failed", "success" }; - int retVal; - - // FIXME: Brian, we need better fallbacks from partially initialized failures - if ( !qwglMakeCurrent ) { - return; - } - - ri.Printf( PRINT_ALL, "Shutting down OpenGL subsystem\n" ); - - // restore gamma. We do this first because 3Dfx's extension needs a valid OGL subsystem - WG_RestoreGamma(); - - // set current context to NULL - if ( qwglMakeCurrent ) - { - retVal = qwglMakeCurrent( NULL, NULL ) != 0; - - ri.Printf( PRINT_ALL, "...wglMakeCurrent( NULL, NULL ): %s\n", success[retVal] ); - } - - // delete HGLRC - if ( glw_state.hGLRC ) - { - retVal = qwglDeleteContext( glw_state.hGLRC ) != 0; - ri.Printf( PRINT_ALL, "...deleting GL context: %s\n", success[retVal] ); - glw_state.hGLRC = NULL; - } - - // release DC - if ( glw_state.hDC ) - { - retVal = ReleaseDC( g_wv.hWnd, glw_state.hDC ) != 0; - ri.Printf( PRINT_ALL, "...releasing DC: %s\n", success[retVal] ); - glw_state.hDC = NULL; - } - - // destroy window - if ( g_wv.hWnd ) - { - ri.Printf( PRINT_ALL, "...destroying window\n" ); - ShowWindow( g_wv.hWnd, SW_HIDE ); - DestroyWindow( g_wv.hWnd ); - g_wv.hWnd = NULL; - glw_state.pixelFormatSet = qfalse; - } - - // close the r_logFile - if ( glw_state.log_fp ) - { - fclose( glw_state.log_fp ); - glw_state.log_fp = 0; - } - - // reset display settings - if ( glw_state.cdsFullscreen ) - { - ri.Printf( PRINT_ALL, "...resetting display\n" ); - ChangeDisplaySettings( 0, 0 ); - glw_state.cdsFullscreen = qfalse; - } - - // shutdown QGL subsystem - QGL_Shutdown(); - - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); -} - -/* -** GLimp_LogComment -*/ -void GLimp_LogComment( char *comment ) -{ - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "%s", comment ); - } -} - - -/* -=========================================================== - -SMP acceleration - -=========================================================== -*/ - -HANDLE renderCommandsEvent; -HANDLE renderCompletedEvent; -HANDLE renderActiveEvent; - -void (*glimpRenderThread)( void ); - -void GLimp_RenderThreadWrapper( void ) { - glimpRenderThread(); - - // unbind the context before we die - qwglMakeCurrent( glw_state.hDC, NULL ); -} - -/* -======================= -GLimp_SpawnRenderThread -======================= -*/ -HANDLE renderThreadHandle; -int renderThreadId; -qboolean GLimp_SpawnRenderThread( void (*function)( void ) ) { - - renderCommandsEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - renderCompletedEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - renderActiveEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - - glimpRenderThread = function; - - renderThreadHandle = CreateThread( - NULL, // LPSECURITY_ATTRIBUTES lpsa, - 0, // DWORD cbStack, - (LPTHREAD_START_ROUTINE)GLimp_RenderThreadWrapper, // LPTHREAD_START_ROUTINE lpStartAddr, - 0, // LPVOID lpvThreadParm, - 0, // DWORD fdwCreate, - &renderThreadId ); - - if ( !renderThreadHandle ) { - return qfalse; - } - - return qtrue; -} - -static void *smpData; -static int wglErrors; - -void *GLimp_RendererSleep( void ) { - void *data; - - if ( !qwglMakeCurrent( glw_state.hDC, NULL ) ) { - wglErrors++; - } - - ResetEvent( renderActiveEvent ); - - // after this, the front end can exit GLimp_FrontEndSleep - SetEvent( renderCompletedEvent ); - - WaitForSingleObject( renderCommandsEvent, INFINITE ); - - if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) { - wglErrors++; - } - - ResetEvent( renderCompletedEvent ); - ResetEvent( renderCommandsEvent ); - - data = smpData; - - // after this, the main thread can exit GLimp_WakeRenderer - SetEvent( renderActiveEvent ); - - return data; -} - - -void GLimp_FrontEndSleep( void ) { - WaitForSingleObject( renderCompletedEvent, INFINITE ); - - if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) { - wglErrors++; - } -} - - -void GLimp_WakeRenderer( void *data ) { - smpData = data; - - if ( !qwglMakeCurrent( glw_state.hDC, NULL ) ) { - wglErrors++; - } - - // after this, the renderer can continue through GLimp_RendererSleep - SetEvent( renderCommandsEvent ); - - WaitForSingleObject( renderActiveEvent, INFINITE ); -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +/* +** WIN_GLIMP.C +** +** This file contains ALL Win32 specific stuff having to do with the +** OpenGL refresh. When a port is being made the following functions +** must be implemented by the port: +** +** GLimp_EndFrame +** GLimp_Init +** GLimp_LogComment +** GLimp_Shutdown +** +** Note that the GLW_xxx functions are Windows specific GL-subsystem +** related functions that are relevant ONLY to win_glimp.c +*/ +#include +#include "../renderer/tr_local.h" +#include "../qcommon/qcommon.h" +#include "resource.h" +#include "glw_win.h" +#include "win_local.h" + +extern void WG_CheckHardwareGamma( void ); +extern void WG_RestoreGamma( void ); + +typedef enum { + RSERR_OK, + + RSERR_INVALID_FULLSCREEN, + RSERR_INVALID_MODE, + + RSERR_UNKNOWN +} rserr_t; + +#define TRY_PFD_SUCCESS 0 +#define TRY_PFD_FAIL_SOFT 1 +#define TRY_PFD_FAIL_HARD 2 + +#define WINDOW_CLASS_NAME "Quake 3: Arena" + +static void GLW_InitExtensions( void ); +static rserr_t GLW_SetMode( const char *drivername, + int mode, + int colorbits, + qboolean cdsFullscreen ); + +static qboolean s_classRegistered = qfalse; + +// +// function declaration +// +void QGL_EnableLogging( qboolean enable ); +qboolean QGL_Init( const char *dllname ); +void QGL_Shutdown( void ); + +// +// variable declarations +// +glwstate_t glw_state; + +cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software +cvar_t *r_maskMinidriver; // allow a different dll name to be treated as if it were opengl32.dll + + + +/* +** GLW_StartDriverAndSetMode +*/ +static qboolean GLW_StartDriverAndSetMode( const char *drivername, + int mode, + int colorbits, + qboolean cdsFullscreen ) +{ + rserr_t err; + + err = GLW_SetMode( drivername, r_mode->integer, colorbits, cdsFullscreen ); + + switch ( err ) + { + case RSERR_INVALID_FULLSCREEN: + ri.Printf( PRINT_ALL, "...WARNING: fullscreen unavailable in this mode\n" ); + return qfalse; + case RSERR_INVALID_MODE: + ri.Printf( PRINT_ALL, "...WARNING: could not set the given mode (%d)\n", mode ); + return qfalse; + default: + break; + } + return qtrue; +} + +/* +** ChoosePFD +** +** Helper function that replaces ChoosePixelFormat. +*/ +#define MAX_PFDS 256 + +static int GLW_ChoosePFD( HDC hDC, PIXELFORMATDESCRIPTOR *pPFD ) +{ + PIXELFORMATDESCRIPTOR pfds[MAX_PFDS+1]; + int maxPFD = 0; + int i; + int bestMatch = 0; + + ri.Printf( PRINT_ALL, "...GLW_ChoosePFD( %d, %d, %d )\n", ( int ) pPFD->cColorBits, ( int ) pPFD->cDepthBits, ( int ) pPFD->cStencilBits ); + + // count number of PFDs + if ( glConfig.driverType > GLDRV_ICD ) + { + maxPFD = qwglDescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); + } + else + { + maxPFD = DescribePixelFormat( hDC, 1, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[0] ); + } + if ( maxPFD > MAX_PFDS ) + { + ri.Printf( PRINT_WARNING, "...numPFDs > MAX_PFDS (%d > %d)\n", maxPFD, MAX_PFDS ); + maxPFD = MAX_PFDS; + } + + ri.Printf( PRINT_ALL, "...%d PFDs found\n", maxPFD - 1 ); + + // grab information + for ( i = 1; i <= maxPFD; i++ ) + { + if ( glConfig.driverType > GLDRV_ICD ) + { + qwglDescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); + } + else + { + DescribePixelFormat( hDC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfds[i] ); + } + } + + // look for a best match + for ( i = 1; i <= maxPFD; i++ ) + { + // + // make sure this has hardware acceleration + // + if ( ( pfds[i].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) + { + if ( !r_allowSoftwareGL->integer ) + { + if ( r_verbose->integer ) + { + ri.Printf( PRINT_ALL, "...PFD %d rejected, software acceleration\n", i ); + } + continue; + } + } + + // verify pixel type + if ( pfds[i].iPixelType != PFD_TYPE_RGBA ) + { + if ( r_verbose->integer ) + { + ri.Printf( PRINT_ALL, "...PFD %d rejected, not RGBA\n", i ); + } + continue; + } + + // verify proper flags + if ( ( ( pfds[i].dwFlags & pPFD->dwFlags ) & pPFD->dwFlags ) != pPFD->dwFlags ) + { + if ( r_verbose->integer ) + { + ri.Printf( PRINT_ALL, "...PFD %d rejected, improper flags (%x instead of %x)\n", i, pfds[i].dwFlags, pPFD->dwFlags ); + } + continue; + } + + // verify enough bits + if ( pfds[i].cDepthBits < 15 ) + { + continue; + } + if ( ( pfds[i].cStencilBits < 4 ) && ( pPFD->cStencilBits > 0 ) ) + { + continue; + } + + // + // selection criteria (in order of priority): + // + // PFD_STEREO + // colorBits + // depthBits + // stencilBits + // + if ( bestMatch ) + { + // check stereo + if ( ( pfds[i].dwFlags & PFD_STEREO ) && ( !( pfds[bestMatch].dwFlags & PFD_STEREO ) ) && ( pPFD->dwFlags & PFD_STEREO ) ) + { + bestMatch = i; + continue; + } + + if ( !( pfds[i].dwFlags & PFD_STEREO ) && ( pfds[bestMatch].dwFlags & PFD_STEREO ) && ( pPFD->dwFlags & PFD_STEREO ) ) + { + bestMatch = i; + continue; + } + + // check color + if ( pfds[bestMatch].cColorBits != pPFD->cColorBits ) + { + // prefer perfect match + if ( pfds[i].cColorBits == pPFD->cColorBits ) + { + bestMatch = i; + continue; + } + // otherwise if this PFD has more bits than our best, use it + else if ( pfds[i].cColorBits > pfds[bestMatch].cColorBits ) + { + bestMatch = i; + continue; + } + } + + // check depth + if ( pfds[bestMatch].cDepthBits != pPFD->cDepthBits ) + { + // prefer perfect match + if ( pfds[i].cDepthBits == pPFD->cDepthBits ) + { + bestMatch = i; + continue; + } + // otherwise if this PFD has more bits than our best, use it + else if ( pfds[i].cDepthBits > pfds[bestMatch].cDepthBits ) + { + bestMatch = i; + continue; + } + } + + // check stencil + if ( pfds[bestMatch].cStencilBits != pPFD->cStencilBits ) + { + // prefer perfect match + if ( pfds[i].cStencilBits == pPFD->cStencilBits ) + { + bestMatch = i; + continue; + } + // otherwise if this PFD has more bits than our best, use it + else if ( ( pfds[i].cStencilBits > pfds[bestMatch].cStencilBits ) && + ( pPFD->cStencilBits > 0 ) ) + { + bestMatch = i; + continue; + } + } + } + else + { + bestMatch = i; + } + } + + if ( !bestMatch ) + return 0; + + if ( ( pfds[bestMatch].dwFlags & PFD_GENERIC_FORMAT ) != 0 ) + { + if ( !r_allowSoftwareGL->integer ) + { + ri.Printf( PRINT_ALL, "...no hardware acceleration found\n" ); + return 0; + } + else + { + ri.Printf( PRINT_ALL, "...using software emulation\n" ); + } + } + else if ( pfds[bestMatch].dwFlags & PFD_GENERIC_ACCELERATED ) + { + ri.Printf( PRINT_ALL, "...MCD acceleration found\n" ); + } + else + { + ri.Printf( PRINT_ALL, "...hardware acceleration found\n" ); + } + + *pPFD = pfds[bestMatch]; + + return bestMatch; +} + +/* +** void GLW_CreatePFD +** +** Helper function zeros out then fills in a PFD +*/ +static void GLW_CreatePFD( PIXELFORMATDESCRIPTOR *pPFD, int colorbits, int depthbits, int stencilbits, qboolean stereo ) +{ + PIXELFORMATDESCRIPTOR src = + { + sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd + 1, // version number + PFD_DRAW_TO_WINDOW | // support window + PFD_SUPPORT_OPENGL | // support OpenGL + PFD_DOUBLEBUFFER, // double buffered + PFD_TYPE_RGBA, // RGBA type + 24, // 24-bit color depth + 0, 0, 0, 0, 0, 0, // color bits ignored + 0, // no alpha buffer + 0, // shift bit ignored + 0, // no accumulation buffer + 0, 0, 0, 0, // accum bits ignored + 24, // 24-bit z-buffer + 8, // 8-bit stencil buffer + 0, // no auxiliary buffer + PFD_MAIN_PLANE, // main layer + 0, // reserved + 0, 0, 0 // layer masks ignored + }; + + src.cColorBits = colorbits; + src.cDepthBits = depthbits; + src.cStencilBits = stencilbits; + + if ( stereo ) + { + ri.Printf( PRINT_ALL, "...attempting to use stereo\n" ); + src.dwFlags |= PFD_STEREO; + glConfig.stereoEnabled = qtrue; + } + else + { + glConfig.stereoEnabled = qfalse; + } + + *pPFD = src; +} + +/* +** GLW_MakeContext +*/ +static int GLW_MakeContext( PIXELFORMATDESCRIPTOR *pPFD ) +{ + int pixelformat; + + // + // don't putz around with pixelformat if it's already set (e.g. this is a soft + // reset of the graphics system) + // + if ( !glw_state.pixelFormatSet ) + { + // + // choose, set, and describe our desired pixel format. If we're + // using a minidriver then we need to bypass the GDI functions, + // otherwise use the GDI functions. + // + if ( ( pixelformat = GLW_ChoosePFD( glw_state.hDC, pPFD ) ) == 0 ) + { + ri.Printf( PRINT_ALL, "...GLW_ChoosePFD failed\n"); + return TRY_PFD_FAIL_SOFT; + } + ri.Printf( PRINT_ALL, "...PIXELFORMAT %d selected\n", pixelformat ); + + if ( glConfig.driverType > GLDRV_ICD ) + { + qwglDescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); + if ( qwglSetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) + { + ri.Printf ( PRINT_ALL, "...qwglSetPixelFormat failed\n"); + return TRY_PFD_FAIL_SOFT; + } + } + else + { + DescribePixelFormat( glw_state.hDC, pixelformat, sizeof( *pPFD ), pPFD ); + + if ( SetPixelFormat( glw_state.hDC, pixelformat, pPFD ) == FALSE ) + { + ri.Printf (PRINT_ALL, "...SetPixelFormat failed\n", glw_state.hDC ); + return TRY_PFD_FAIL_SOFT; + } + } + + glw_state.pixelFormatSet = qtrue; + } + + // + // startup the OpenGL subsystem by creating a context and making it current + // + if ( !glw_state.hGLRC ) + { + ri.Printf( PRINT_ALL, "...creating GL context: " ); + if ( ( glw_state.hGLRC = qwglCreateContext( glw_state.hDC ) ) == 0 ) + { + ri.Printf (PRINT_ALL, "failed\n"); + + return TRY_PFD_FAIL_HARD; + } + ri.Printf( PRINT_ALL, "succeeded\n" ); + + ri.Printf( PRINT_ALL, "...making context current: " ); + if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) + { + qwglDeleteContext( glw_state.hGLRC ); + glw_state.hGLRC = NULL; + ri.Printf (PRINT_ALL, "failed\n"); + return TRY_PFD_FAIL_HARD; + } + ri.Printf( PRINT_ALL, "succeeded\n" ); + } + + return TRY_PFD_SUCCESS; +} + + +/* +** GLW_InitDriver +** +** - get a DC if one doesn't exist +** - create an HGLRC if one doesn't exist +*/ +static qboolean GLW_InitDriver( const char *drivername, int colorbits ) +{ + int tpfd; + int depthbits, stencilbits; + static PIXELFORMATDESCRIPTOR pfd; // save between frames since 'tr' gets cleared + + ri.Printf( PRINT_ALL, "Initializing OpenGL driver\n" ); + + // + // get a DC for our window if we don't already have one allocated + // + if ( glw_state.hDC == NULL ) + { + ri.Printf( PRINT_ALL, "...getting DC: " ); + + if ( ( glw_state.hDC = GetDC( g_wv.hWnd ) ) == NULL ) + { + ri.Printf( PRINT_ALL, "failed\n" ); + return qfalse; + } + ri.Printf( PRINT_ALL, "succeeded\n" ); + } + + if ( colorbits == 0 ) + { + colorbits = glw_state.desktopBitsPixel; + } + + // + // implicitly assume Z-buffer depth == desktop color depth + // + if ( r_depthbits->integer == 0 ) { + if ( colorbits > 16 ) { + depthbits = 24; + } else { + depthbits = 16; + } + } else { + depthbits = r_depthbits->integer; + } + + // + // do not allow stencil if Z-buffer depth likely won't contain it + // + stencilbits = r_stencilbits->integer; + if ( depthbits < 24 ) + { + stencilbits = 0; + } + + // + // make two attempts to set the PIXELFORMAT + // + + // + // first attempt: r_colorbits, depthbits, and r_stencilbits + // + if ( !glw_state.pixelFormatSet ) + { + GLW_CreatePFD( &pfd, colorbits, depthbits, stencilbits, r_stereo->integer ); + if ( ( tpfd = GLW_MakeContext( &pfd ) ) != TRY_PFD_SUCCESS ) + { + if ( tpfd == TRY_PFD_FAIL_HARD ) + { + ri.Printf( PRINT_WARNING, "...failed hard\n" ); + return qfalse; + } + + // + // punt if we've already tried the desktop bit depth and no stencil bits + // + if ( ( r_colorbits->integer == glw_state.desktopBitsPixel ) && + ( stencilbits == 0 ) ) + { + ReleaseDC( g_wv.hWnd, glw_state.hDC ); + glw_state.hDC = NULL; + + ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); + + return qfalse; + } + + // + // second attempt: desktop's color bits and no stencil + // + if ( colorbits > glw_state.desktopBitsPixel ) + { + colorbits = glw_state.desktopBitsPixel; + } + GLW_CreatePFD( &pfd, colorbits, depthbits, 0, r_stereo->integer ); + if ( GLW_MakeContext( &pfd ) != TRY_PFD_SUCCESS ) + { + if ( glw_state.hDC ) + { + ReleaseDC( g_wv.hWnd, glw_state.hDC ); + glw_state.hDC = NULL; + } + + ri.Printf( PRINT_ALL, "...failed to find an appropriate PIXELFORMAT\n" ); + + return qfalse; + } + } + + /* + ** report if stereo is desired but unavailable + */ + if ( !( pfd.dwFlags & PFD_STEREO ) && ( r_stereo->integer != 0 ) ) + { + ri.Printf( PRINT_ALL, "...failed to select stereo pixel format\n" ); + glConfig.stereoEnabled = qfalse; + } + } + + /* + ** store PFD specifics + */ + glConfig.colorBits = ( int ) pfd.cColorBits; + glConfig.depthBits = ( int ) pfd.cDepthBits; + glConfig.stencilBits = ( int ) pfd.cStencilBits; + + return qtrue; +} + +/* +** GLW_CreateWindow +** +** Responsible for creating the Win32 window and initializing the OpenGL driver. +*/ +#define WINDOW_STYLE (WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_VISIBLE) +static qboolean GLW_CreateWindow( const char *drivername, int width, int height, int colorbits, qboolean cdsFullscreen ) +{ + RECT r; + cvar_t *vid_xpos, *vid_ypos; + int stylebits; + int x, y, w, h; + int exstyle; + + // + // register the window class if necessary + // + if ( !s_classRegistered ) + { + WNDCLASS wc; + + memset( &wc, 0, sizeof( wc ) ); + + wc.style = 0; + wc.lpfnWndProc = (WNDPROC) glw_state.wndproc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = g_wv.hInstance; + wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); + wc.hCursor = LoadCursor (NULL,IDC_ARROW); + wc.hbrBackground = (void *)COLOR_GRAYTEXT; + wc.lpszMenuName = 0; + wc.lpszClassName = WINDOW_CLASS_NAME; + + if ( !RegisterClass( &wc ) ) + { + ri.Error( ERR_FATAL, "GLW_CreateWindow: could not register window class" ); + } + s_classRegistered = qtrue; + ri.Printf( PRINT_ALL, "...registered window class\n" ); + } + + // + // create the HWND if one does not already exist + // + if ( !g_wv.hWnd ) + { + // + // compute width and height + // + r.left = 0; + r.top = 0; + r.right = width; + r.bottom = height; + + if ( cdsFullscreen || !Q_stricmp( _3DFX_DRIVER_NAME, drivername ) ) + { + exstyle = WS_EX_TOPMOST; + stylebits = WS_POPUP|WS_VISIBLE|WS_SYSMENU; + } + else + { + exstyle = 0; + stylebits = WINDOW_STYLE|WS_SYSMENU; + AdjustWindowRect (&r, stylebits, FALSE); + } + + w = r.right - r.left; + h = r.bottom - r.top; + + if ( cdsFullscreen || !Q_stricmp( _3DFX_DRIVER_NAME, drivername ) ) + { + x = 0; + y = 0; + } + else + { + vid_xpos = ri.Cvar_Get ("vid_xpos", "", 0); + vid_ypos = ri.Cvar_Get ("vid_ypos", "", 0); + x = vid_xpos->integer; + y = vid_ypos->integer; + + // adjust window coordinates if necessary + // so that the window is completely on screen + if ( x < 0 ) + x = 0; + if ( y < 0 ) + y = 0; + + if ( w < glw_state.desktopWidth && + h < glw_state.desktopHeight ) + { + if ( x + w > glw_state.desktopWidth ) + x = ( glw_state.desktopWidth - w ); + if ( y + h > glw_state.desktopHeight ) + y = ( glw_state.desktopHeight - h ); + } + } + + g_wv.hWnd = CreateWindowEx ( + exstyle, + WINDOW_CLASS_NAME, + "Quake 3: Arena", + stylebits, + x, y, w, h, + NULL, + NULL, + g_wv.hInstance, + NULL); + + if ( !g_wv.hWnd ) + { + ri.Error (ERR_FATAL, "GLW_CreateWindow() - Couldn't create window"); + } + + ShowWindow( g_wv.hWnd, SW_SHOW ); + UpdateWindow( g_wv.hWnd ); + ri.Printf( PRINT_ALL, "...created window@%d,%d (%dx%d)\n", x, y, w, h ); + } + else + { + ri.Printf( PRINT_ALL, "...window already present, CreateWindowEx skipped\n" ); + } + + if ( !GLW_InitDriver( drivername, colorbits ) ) + { + ShowWindow( g_wv.hWnd, SW_HIDE ); + DestroyWindow( g_wv.hWnd ); + g_wv.hWnd = NULL; + + return qfalse; + } + + SetForegroundWindow( g_wv.hWnd ); + SetFocus( g_wv.hWnd ); + + return qtrue; +} + +static void PrintCDSError( int value ) +{ + switch ( value ) + { + case DISP_CHANGE_RESTART: + ri.Printf( PRINT_ALL, "restart required\n" ); + break; + case DISP_CHANGE_BADPARAM: + ri.Printf( PRINT_ALL, "bad param\n" ); + break; + case DISP_CHANGE_BADFLAGS: + ri.Printf( PRINT_ALL, "bad flags\n" ); + break; + case DISP_CHANGE_FAILED: + ri.Printf( PRINT_ALL, "DISP_CHANGE_FAILED\n" ); + break; + case DISP_CHANGE_BADMODE: + ri.Printf( PRINT_ALL, "bad mode\n" ); + break; + case DISP_CHANGE_NOTUPDATED: + ri.Printf( PRINT_ALL, "not updated\n" ); + break; + default: + ri.Printf( PRINT_ALL, "unknown error %d\n", value ); + break; + } +} + +/* +** GLW_SetMode +*/ +static rserr_t GLW_SetMode( const char *drivername, + int mode, + int colorbits, + qboolean cdsFullscreen ) +{ + HDC hDC; + const char *win_fs[] = { "W", "FS" }; + int cdsRet; + DEVMODE dm; + + // + // print out informational messages + // + ri.Printf( PRINT_ALL, "...setting mode %d:", mode ); + if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, &glConfig.windowAspect, mode ) ) + { + ri.Printf( PRINT_ALL, " invalid mode\n" ); + return RSERR_INVALID_MODE; + } + ri.Printf( PRINT_ALL, " %d %d %s\n", glConfig.vidWidth, glConfig.vidHeight, win_fs[cdsFullscreen] ); + + // + // check our desktop attributes + // + hDC = GetDC( GetDesktopWindow() ); + glw_state.desktopBitsPixel = GetDeviceCaps( hDC, BITSPIXEL ); + glw_state.desktopWidth = GetDeviceCaps( hDC, HORZRES ); + glw_state.desktopHeight = GetDeviceCaps( hDC, VERTRES ); + ReleaseDC( GetDesktopWindow(), hDC ); + + // + // verify desktop bit depth + // + if ( glConfig.driverType != GLDRV_VOODOO ) + { + if ( glw_state.desktopBitsPixel < 15 || glw_state.desktopBitsPixel == 24 ) + { + if ( colorbits == 0 || ( !cdsFullscreen && colorbits >= 15 ) ) + { + if ( MessageBox( NULL, + "It is highly unlikely that a correct\n" + "windowed display can be initialized with\n" + "the current desktop display depth. Select\n" + "'OK' to try anyway. Press 'Cancel' if you\n" + "have a 3Dfx Voodoo, Voodoo-2, or Voodoo Rush\n" + "3D accelerator installed, or if you otherwise\n" + "wish to quit.", + "Low Desktop Color Depth", + MB_OKCANCEL | MB_ICONEXCLAMATION ) != IDOK ) + { + return RSERR_INVALID_MODE; + } + } + } + } + + // do a CDS if needed + if ( cdsFullscreen ) + { + memset( &dm, 0, sizeof( dm ) ); + + dm.dmSize = sizeof( dm ); + + dm.dmPelsWidth = glConfig.vidWidth; + dm.dmPelsHeight = glConfig.vidHeight; + dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + + if ( r_displayRefresh->integer != 0 ) + { + dm.dmDisplayFrequency = r_displayRefresh->integer; + dm.dmFields |= DM_DISPLAYFREQUENCY; + } + + // try to change color depth if possible + if ( colorbits != 0 ) + { + if ( glw_state.allowdisplaydepthchange ) + { + dm.dmBitsPerPel = colorbits; + dm.dmFields |= DM_BITSPERPEL; + ri.Printf( PRINT_ALL, "...using colorsbits of %d\n", colorbits ); + } + else + { + ri.Printf( PRINT_ALL, "WARNING:...changing depth not supported on Win95 < pre-OSR 2.x\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...using desktop display depth of %d\n", glw_state.desktopBitsPixel ); + } + + // + // if we're already in fullscreen then just create the window + // + if ( glw_state.cdsFullscreen ) + { + ri.Printf( PRINT_ALL, "...already fullscreen, avoiding redundant CDS\n" ); + + if ( !GLW_CreateWindow ( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue ) ) + { + ri.Printf( PRINT_ALL, "...restoring display settings\n" ); + ChangeDisplaySettings( 0, 0 ); + return RSERR_INVALID_MODE; + } + } + // + // need to call CDS + // + else + { + ri.Printf( PRINT_ALL, "...calling CDS: " ); + + // try setting the exact mode requested, because some drivers don't report + // the low res modes in EnumDisplaySettings, but still work + if ( ( cdsRet = ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) + { + ri.Printf( PRINT_ALL, "ok\n" ); + + if ( !GLW_CreateWindow ( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) + { + ri.Printf( PRINT_ALL, "...restoring display settings\n" ); + ChangeDisplaySettings( 0, 0 ); + return RSERR_INVALID_MODE; + } + + glw_state.cdsFullscreen = qtrue; + } + else + { + // + // the exact mode failed, so scan EnumDisplaySettings for the next largest mode + // + DEVMODE devmode; + int modeNum; + + ri.Printf( PRINT_ALL, "failed, " ); + + PrintCDSError( cdsRet ); + + ri.Printf( PRINT_ALL, "...trying next higher resolution:" ); + + // we could do a better matching job here... + for ( modeNum = 0 ; ; modeNum++ ) { + if ( !EnumDisplaySettings( NULL, modeNum, &devmode ) ) { + modeNum = -1; + break; + } + if ( devmode.dmPelsWidth >= glConfig.vidWidth + && devmode.dmPelsHeight >= glConfig.vidHeight + && devmode.dmBitsPerPel >= 15 ) { + break; + } + } + + if ( modeNum != -1 && ( cdsRet = ChangeDisplaySettings( &devmode, CDS_FULLSCREEN ) ) == DISP_CHANGE_SUCCESSFUL ) + { + ri.Printf( PRINT_ALL, " ok\n" ); + if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qtrue) ) + { + ri.Printf( PRINT_ALL, "...restoring display settings\n" ); + ChangeDisplaySettings( 0, 0 ); + return RSERR_INVALID_MODE; + } + + glw_state.cdsFullscreen = qtrue; + } + else + { + ri.Printf( PRINT_ALL, " failed, " ); + + PrintCDSError( cdsRet ); + + ri.Printf( PRINT_ALL, "...restoring display settings\n" ); + ChangeDisplaySettings( 0, 0 ); + + glw_state.cdsFullscreen = qfalse; + glConfig.isFullscreen = qfalse; + if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse) ) + { + return RSERR_INVALID_MODE; + } + return RSERR_INVALID_FULLSCREEN; + } + } + } + } + else + { + if ( glw_state.cdsFullscreen ) + { + ChangeDisplaySettings( 0, 0 ); + } + + glw_state.cdsFullscreen = qfalse; + if ( !GLW_CreateWindow( drivername, glConfig.vidWidth, glConfig.vidHeight, colorbits, qfalse ) ) + { + return RSERR_INVALID_MODE; + } + } + + // + // success, now check display frequency, although this won't be valid on Voodoo(2) + // + memset( &dm, 0, sizeof( dm ) ); + dm.dmSize = sizeof( dm ); + if ( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm ) ) + { + glConfig.displayFrequency = dm.dmDisplayFrequency; + } + + // NOTE: this is overridden later on standalone 3Dfx drivers + glConfig.isFullscreen = cdsFullscreen; + + return RSERR_OK; +} + +/* +** GLW_InitExtensions +*/ +static void GLW_InitExtensions( void ) +{ + if ( !r_allowExtensions->integer ) + { + ri.Printf( PRINT_ALL, "*** IGNORING OPENGL EXTENSIONS ***\n" ); + return; + } + + ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" ); + + // GL_S3_s3tc + glConfig.textureCompression = TC_NONE; + if ( strstr( glConfig.extensions_string, "GL_S3_s3tc" ) ) + { + if ( r_ext_compressed_textures->integer ) + { + glConfig.textureCompression = TC_S3TC; + ri.Printf( PRINT_ALL, "...using GL_S3_s3tc\n" ); + } + else + { + glConfig.textureCompression = TC_NONE; + ri.Printf( PRINT_ALL, "...ignoring GL_S3_s3tc\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...GL_S3_s3tc not found\n" ); + } + + // GL_EXT_texture_env_add + glConfig.textureEnvAddAvailable = qfalse; + if ( strstr( glConfig.extensions_string, "EXT_texture_env_add" ) ) + { + if ( r_ext_texture_env_add->integer ) + { + glConfig.textureEnvAddAvailable = qtrue; + ri.Printf( PRINT_ALL, "...using GL_EXT_texture_env_add\n" ); + } + else + { + glConfig.textureEnvAddAvailable = qfalse; + ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_env_add\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...GL_EXT_texture_env_add not found\n" ); + } + + // WGL_EXT_swap_control + qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" ); + if ( qwglSwapIntervalEXT ) + { + ri.Printf( PRINT_ALL, "...using WGL_EXT_swap_control\n" ); + r_swapInterval->modified = qtrue; // force a set next frame + } + else + { + ri.Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" ); + } + + // GL_ARB_multitexture + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + if ( strstr( glConfig.extensions_string, "GL_ARB_multitexture" ) ) + { + if ( r_ext_multitexture->integer ) + { + qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) qwglGetProcAddress( "glMultiTexCoord2fARB" ); + qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glActiveTextureARB" ); + qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glClientActiveTextureARB" ); + + if ( qglActiveTextureARB ) + { + qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); + + if ( glConfig.maxActiveTextures > 1 ) + { + ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" ); + } + else + { + qglMultiTexCoord2fARB = NULL; + qglActiveTextureARB = NULL; + qglClientActiveTextureARB = NULL; + ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, < 2 texture units\n" ); + } + } + } + else + { + ri.Printf( PRINT_ALL, "...ignoring GL_ARB_multitexture\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" ); + } + + // GL_EXT_compiled_vertex_array + qglLockArraysEXT = NULL; + qglUnlockArraysEXT = NULL; + if ( strstr( glConfig.extensions_string, "GL_EXT_compiled_vertex_array" ) && ( glConfig.hardwareType != GLHW_RIVA128 ) ) + { + if ( r_ext_compiled_vertex_array->integer ) + { + ri.Printf( PRINT_ALL, "...using GL_EXT_compiled_vertex_array\n" ); + qglLockArraysEXT = ( void ( APIENTRY * )( int, int ) ) qwglGetProcAddress( "glLockArraysEXT" ); + qglUnlockArraysEXT = ( void ( APIENTRY * )( void ) ) qwglGetProcAddress( "glUnlockArraysEXT" ); + if (!qglLockArraysEXT || !qglUnlockArraysEXT) { + ri.Error (ERR_FATAL, "bad getprocaddress"); + } + } + else + { + ri.Printf( PRINT_ALL, "...ignoring GL_EXT_compiled_vertex_array\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...GL_EXT_compiled_vertex_array not found\n" ); + } + + // WGL_3DFX_gamma_control + qwglGetDeviceGammaRamp3DFX = NULL; + qwglSetDeviceGammaRamp3DFX = NULL; + + if ( strstr( glConfig.extensions_string, "WGL_3DFX_gamma_control" ) ) + { + if ( !r_ignorehwgamma->integer && r_ext_gamma_control->integer ) + { + qwglGetDeviceGammaRamp3DFX = ( BOOL ( WINAPI * )( HDC, LPVOID ) ) qwglGetProcAddress( "wglGetDeviceGammaRamp3DFX" ); + qwglSetDeviceGammaRamp3DFX = ( BOOL ( WINAPI * )( HDC, LPVOID ) ) qwglGetProcAddress( "wglSetDeviceGammaRamp3DFX" ); + + if ( qwglGetDeviceGammaRamp3DFX && qwglSetDeviceGammaRamp3DFX ) + { + ri.Printf( PRINT_ALL, "...using WGL_3DFX_gamma_control\n" ); + } + else + { + qwglGetDeviceGammaRamp3DFX = NULL; + qwglSetDeviceGammaRamp3DFX = NULL; + } + } + else + { + ri.Printf( PRINT_ALL, "...ignoring WGL_3DFX_gamma_control\n" ); + } + } + else + { + ri.Printf( PRINT_ALL, "...WGL_3DFX_gamma_control not found\n" ); + } +} + +/* +** GLW_CheckOSVersion +*/ +static qboolean GLW_CheckOSVersion( void ) +{ +#define OSR2_BUILD_NUMBER 1111 + + OSVERSIONINFO vinfo; + + vinfo.dwOSVersionInfoSize = sizeof(vinfo); + + glw_state.allowdisplaydepthchange = qfalse; + + if ( GetVersionEx( &vinfo) ) + { + if ( vinfo.dwMajorVersion > 4 ) + { + glw_state.allowdisplaydepthchange = qtrue; + } + else if ( vinfo.dwMajorVersion == 4 ) + { + if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) + { + glw_state.allowdisplaydepthchange = qtrue; + } + else if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) + { + if ( LOWORD( vinfo.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) + { + glw_state.allowdisplaydepthchange = qtrue; + } + } + } + } + else + { + ri.Printf( PRINT_ALL, "GLW_CheckOSVersion() - GetVersionEx failed\n" ); + return qfalse; + } + + return qtrue; +} + +/* +** GLW_LoadOpenGL +** +** GLimp_win.c internal function that attempts to load and use +** a specific OpenGL DLL. +*/ +static qboolean GLW_LoadOpenGL( const char *drivername ) +{ + char buffer[1024]; + qboolean cdsFullscreen; + + Q_strncpyz( buffer, drivername, sizeof(buffer) ); + Q_strlwr(buffer); + + // + // determine if we're on a standalone driver + // + if ( strstr( buffer, "opengl32" ) != 0 || r_maskMinidriver->integer ) + { + glConfig.driverType = GLDRV_ICD; + } + else + { + glConfig.driverType = GLDRV_STANDALONE; + + ri.Printf( PRINT_ALL, "...assuming '%s' is a standalone driver\n", drivername ); + + if ( strstr( buffer, _3DFX_DRIVER_NAME ) ) + { + glConfig.driverType = GLDRV_VOODOO; + } + } + + // disable the 3Dfx splash screen + _putenv("FX_GLIDE_NO_SPLASH=0"); + + // + // load the driver and bind our function pointers to it + // + if ( QGL_Init( buffer ) ) + { + cdsFullscreen = r_fullscreen->integer; + + // create the window and set up the context + if ( !GLW_StartDriverAndSetMode( drivername, r_mode->integer, r_colorbits->integer, cdsFullscreen ) ) + { + // if we're on a 24/32-bit desktop and we're going fullscreen on an ICD, + // try it again but with a 16-bit desktop + if ( glConfig.driverType == GLDRV_ICD ) + { + if ( r_colorbits->integer != 16 || + cdsFullscreen != qtrue || + r_mode->integer != 3 ) + { + if ( !GLW_StartDriverAndSetMode( drivername, 3, 16, qtrue ) ) + { + goto fail; + } + } + } + else + { + goto fail; + } + } + + if ( glConfig.driverType == GLDRV_VOODOO ) + { + glConfig.isFullscreen = qtrue; + } + + return qtrue; + } +fail: + + QGL_Shutdown(); + + return qfalse; +} + +/* +** GLimp_EndFrame +*/ +void GLimp_EndFrame (void) +{ + // + // swapinterval stuff + // + if ( r_swapInterval->modified ) { + r_swapInterval->modified = qfalse; + + if ( !glConfig.stereoEnabled ) { // why? + if ( qwglSwapIntervalEXT ) { + qwglSwapIntervalEXT( r_swapInterval->integer ); + } + } + } + + + // don't flip if drawing to front buffer + if ( Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) != 0 ) + { + if ( glConfig.driverType > GLDRV_ICD ) + { + if ( !qwglSwapBuffers( glw_state.hDC ) ) + { + ri.Error( ERR_FATAL, "GLimp_EndFrame() - SwapBuffers() failed!\n" ); + } + } + else + { + SwapBuffers( glw_state.hDC ); + } + } + + // check logging + QGL_EnableLogging( r_logFile->integer ); +} + +static void GLW_StartOpenGL( void ) +{ + qboolean attemptedOpenGL32 = qfalse; + qboolean attempted3Dfx = qfalse; + + // + // load and initialize the specific OpenGL driver + // + if ( !GLW_LoadOpenGL( r_glDriver->string ) ) + { + if ( !Q_stricmp( r_glDriver->string, OPENGL_DRIVER_NAME ) ) + { + attemptedOpenGL32 = qtrue; + } + else if ( !Q_stricmp( r_glDriver->string, _3DFX_DRIVER_NAME ) ) + { + attempted3Dfx = qtrue; + } + + if ( !attempted3Dfx ) + { + attempted3Dfx = qtrue; + if ( GLW_LoadOpenGL( _3DFX_DRIVER_NAME ) ) + { + ri.Cvar_Set( "r_glDriver", _3DFX_DRIVER_NAME ); + r_glDriver->modified = qfalse; + } + else + { + if ( !attemptedOpenGL32 ) + { + if ( !GLW_LoadOpenGL( OPENGL_DRIVER_NAME ) ) + { + ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); + } + ri.Cvar_Set( "r_glDriver", OPENGL_DRIVER_NAME ); + r_glDriver->modified = qfalse; + } + else + { + ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); + } + } + } + else if ( !attemptedOpenGL32 ) + { + attemptedOpenGL32 = qtrue; + if ( GLW_LoadOpenGL( OPENGL_DRIVER_NAME ) ) + { + ri.Cvar_Set( "r_glDriver", OPENGL_DRIVER_NAME ); + r_glDriver->modified = qfalse; + } + else + { + ri.Error( ERR_FATAL, "GLW_StartOpenGL() - could not load OpenGL subsystem\n" ); + } + } + } +} + +/* +** GLimp_Init +** +** This is the platform specific OpenGL initialization function. It +** is responsible for loading OpenGL, initializing it, setting +** extensions, creating a window of the appropriate size, doing +** fullscreen manipulations, etc. Its overall responsibility is +** to make sure that a functional OpenGL subsystem is operating +** when it returns to the ref. +*/ +void GLimp_Init( void ) +{ + char buf[1024]; + cvar_t *lastValidRenderer = ri.Cvar_Get( "r_lastValidRenderer", "(uninitialized)", CVAR_ARCHIVE ); + cvar_t *cv; + + ri.Printf( PRINT_ALL, "Initializing OpenGL subsystem\n" ); + + // + // check OS version to see if we can do fullscreen display changes + // + if ( !GLW_CheckOSVersion() ) + { + ri.Error( ERR_FATAL, "GLimp_Init() - incorrect operating system\n" ); + } + + // save off hInstance and wndproc + cv = ri.Cvar_Get( "win_hinstance", "", 0 ); + sscanf( cv->string, "%i", (int *)&g_wv.hInstance ); + + cv = ri.Cvar_Get( "win_wndproc", "", 0 ); + sscanf( cv->string, "%i", (int *)&glw_state.wndproc ); + + r_allowSoftwareGL = ri.Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); + r_maskMinidriver = ri.Cvar_Get( "r_maskMinidriver", "0", CVAR_LATCH ); + + // load appropriate DLL and initialize subsystem + GLW_StartOpenGL(); + + // get our config strings + Q_strncpyz( glConfig.vendor_string, qglGetString (GL_VENDOR), sizeof( glConfig.vendor_string ) ); + Q_strncpyz( glConfig.renderer_string, qglGetString (GL_RENDERER), sizeof( glConfig.renderer_string ) ); + Q_strncpyz( glConfig.version_string, qglGetString (GL_VERSION), sizeof( glConfig.version_string ) ); + Q_strncpyz( glConfig.extensions_string, qglGetString (GL_EXTENSIONS), sizeof( glConfig.extensions_string ) ); + + // + // chipset specific configuration + // + Q_strncpyz( buf, glConfig.renderer_string, sizeof(buf) ); + Q_strlwr( buf ); + + // + // NOTE: if changing cvars, do it within this block. This allows them + // to be overridden when testing driver fixes, etc. but only sets + // them to their default state when the hardware is first installed/run. + // + if ( Q_stricmp( lastValidRenderer->string, glConfig.renderer_string ) ) + { + glConfig.hardwareType = GLHW_GENERIC; + + ri.Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" ); + + // VOODOO GRAPHICS w/ 2MB + if ( strstr( buf, "voodoo graphics/1 tmu/2 mb" ) ) + { + ri.Cvar_Set( "r_picmip", "2" ); + ri.Cvar_Get( "r_picmip", "1", CVAR_ARCHIVE | CVAR_LATCH ); + } + else + { + ri.Cvar_Set( "r_picmip", "1" ); + + if ( strstr( buf, "rage 128" ) || strstr( buf, "rage128" ) ) + { + ri.Cvar_Set( "r_finish", "0" ); + } + // Savage3D and Savage4 should always have trilinear enabled + else if ( strstr( buf, "savage3d" ) || strstr( buf, "s3 savage4" ) ) + { + ri.Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); + } + } + } + + // + // this is where hardware specific workarounds that should be + // detected/initialized every startup should go. + // + if ( strstr( buf, "banshee" ) || strstr( buf, "voodoo3" ) ) + { + glConfig.hardwareType = GLHW_3DFX_2D3D; + } + // VOODOO GRAPHICS w/ 2MB + else if ( strstr( buf, "voodoo graphics/1 tmu/2 mb" ) ) + { + } + else if ( strstr( buf, "glzicd" ) ) + { + } + else if ( strstr( buf, "rage pro" ) || strstr( buf, "Rage Pro" ) || strstr( buf, "ragepro" ) ) + { + glConfig.hardwareType = GLHW_RAGEPRO; + } + else if ( strstr( buf, "rage 128" ) ) + { + } + else if ( strstr( buf, "permedia2" ) ) + { + glConfig.hardwareType = GLHW_PERMEDIA2; + } + else if ( strstr( buf, "riva 128" ) ) + { + glConfig.hardwareType = GLHW_RIVA128; + } + else if ( strstr( buf, "riva tnt " ) ) + { + } + + ri.Cvar_Set( "r_lastValidRenderer", glConfig.renderer_string ); + + GLW_InitExtensions(); + WG_CheckHardwareGamma(); +} + +/* +** GLimp_Shutdown +** +** This routine does all OS specific shutdown procedures for the OpenGL +** subsystem. +*/ +void GLimp_Shutdown( void ) +{ +// const char *strings[] = { "soft", "hard" }; + const char *success[] = { "failed", "success" }; + int retVal; + + // FIXME: Brian, we need better fallbacks from partially initialized failures + if ( !qwglMakeCurrent ) { + return; + } + + ri.Printf( PRINT_ALL, "Shutting down OpenGL subsystem\n" ); + + // restore gamma. We do this first because 3Dfx's extension needs a valid OGL subsystem + WG_RestoreGamma(); + + // set current context to NULL + if ( qwglMakeCurrent ) + { + retVal = qwglMakeCurrent( NULL, NULL ) != 0; + + ri.Printf( PRINT_ALL, "...wglMakeCurrent( NULL, NULL ): %s\n", success[retVal] ); + } + + // delete HGLRC + if ( glw_state.hGLRC ) + { + retVal = qwglDeleteContext( glw_state.hGLRC ) != 0; + ri.Printf( PRINT_ALL, "...deleting GL context: %s\n", success[retVal] ); + glw_state.hGLRC = NULL; + } + + // release DC + if ( glw_state.hDC ) + { + retVal = ReleaseDC( g_wv.hWnd, glw_state.hDC ) != 0; + ri.Printf( PRINT_ALL, "...releasing DC: %s\n", success[retVal] ); + glw_state.hDC = NULL; + } + + // destroy window + if ( g_wv.hWnd ) + { + ri.Printf( PRINT_ALL, "...destroying window\n" ); + ShowWindow( g_wv.hWnd, SW_HIDE ); + DestroyWindow( g_wv.hWnd ); + g_wv.hWnd = NULL; + glw_state.pixelFormatSet = qfalse; + } + + // close the r_logFile + if ( glw_state.log_fp ) + { + fclose( glw_state.log_fp ); + glw_state.log_fp = 0; + } + + // reset display settings + if ( glw_state.cdsFullscreen ) + { + ri.Printf( PRINT_ALL, "...resetting display\n" ); + ChangeDisplaySettings( 0, 0 ); + glw_state.cdsFullscreen = qfalse; + } + + // shutdown QGL subsystem + QGL_Shutdown(); + + memset( &glConfig, 0, sizeof( glConfig ) ); + memset( &glState, 0, sizeof( glState ) ); +} + +/* +** GLimp_LogComment +*/ +void GLimp_LogComment( char *comment ) +{ + if ( glw_state.log_fp ) { + fprintf( glw_state.log_fp, "%s", comment ); + } +} + + +/* +=========================================================== + +SMP acceleration + +=========================================================== +*/ + +HANDLE renderCommandsEvent; +HANDLE renderCompletedEvent; +HANDLE renderActiveEvent; + +void (*glimpRenderThread)( void ); + +void GLimp_RenderThreadWrapper( void ) { + glimpRenderThread(); + + // unbind the context before we die + qwglMakeCurrent( glw_state.hDC, NULL ); +} + +/* +======================= +GLimp_SpawnRenderThread +======================= +*/ +HANDLE renderThreadHandle; +int renderThreadId; +qboolean GLimp_SpawnRenderThread( void (*function)( void ) ) { + + renderCommandsEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); + renderCompletedEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); + renderActiveEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); + + glimpRenderThread = function; + + renderThreadHandle = CreateThread( + NULL, // LPSECURITY_ATTRIBUTES lpsa, + 0, // DWORD cbStack, + (LPTHREAD_START_ROUTINE)GLimp_RenderThreadWrapper, // LPTHREAD_START_ROUTINE lpStartAddr, + 0, // LPVOID lpvThreadParm, + 0, // DWORD fdwCreate, + &renderThreadId ); + + if ( !renderThreadHandle ) { + return qfalse; + } + + return qtrue; +} + +static void *smpData; +static int wglErrors; + +void *GLimp_RendererSleep( void ) { + void *data; + + if ( !qwglMakeCurrent( glw_state.hDC, NULL ) ) { + wglErrors++; + } + + ResetEvent( renderActiveEvent ); + + // after this, the front end can exit GLimp_FrontEndSleep + SetEvent( renderCompletedEvent ); + + WaitForSingleObject( renderCommandsEvent, INFINITE ); + + if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) { + wglErrors++; + } + + ResetEvent( renderCompletedEvent ); + ResetEvent( renderCommandsEvent ); + + data = smpData; + + // after this, the main thread can exit GLimp_WakeRenderer + SetEvent( renderActiveEvent ); + + return data; +} + + +void GLimp_FrontEndSleep( void ) { + WaitForSingleObject( renderCompletedEvent, INFINITE ); + + if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) ) { + wglErrors++; + } +} + + +void GLimp_WakeRenderer( void *data ) { + smpData = data; + + if ( !qwglMakeCurrent( glw_state.hDC, NULL ) ) { + wglErrors++; + } + + // after this, the renderer can continue through GLimp_RendererSleep + SetEvent( renderCommandsEvent ); + + WaitForSingleObject( renderActiveEvent, INFINITE ); +} + diff --git a/code/win32/win_input.c b/code/win32/win_input.c index 7012558..a5ec47a 100755 --- a/code/win32/win_input.c +++ b/code/win32/win_input.c @@ -1,1149 +1,1149 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -// win_input.c -- win32 mouse and joystick code -// 02/21/97 JCB Added extended DirectInput code to support external controllers. - -#include "../client/client.h" -#include "win_local.h" - - -typedef struct { - int oldButtonState; - - qboolean mouseActive; - qboolean mouseInitialized; - qboolean mouseStartupDelayed; // delay mouse init to try DI again when we have a window -} WinMouseVars_t; - -static WinMouseVars_t s_wmv; - -static int window_center_x, window_center_y; - -// -// MIDI definitions -// -static void IN_StartupMIDI( void ); -static void IN_ShutdownMIDI( void ); - -#define MAX_MIDIIN_DEVICES 8 - -typedef struct { - int numDevices; - MIDIINCAPS caps[MAX_MIDIIN_DEVICES]; - - HMIDIIN hMidiIn; -} MidiInfo_t; - -static MidiInfo_t s_midiInfo; - -// -// Joystick definitions -// -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V - -typedef struct { - qboolean avail; - int id; // joystick number - JOYCAPS jc; - - int oldbuttonstate; - int oldpovstate; - - JOYINFOEX ji; -} joystickInfo_t; - -static joystickInfo_t joy; - - - -cvar_t *in_midi; -cvar_t *in_midiport; -cvar_t *in_midichannel; -cvar_t *in_mididevice; - -cvar_t *in_mouse; -cvar_t *in_logitechbug; -cvar_t *in_joystick; -cvar_t *in_joyBallScale; -cvar_t *in_debugJoystick; -cvar_t *joy_threshold; - -qboolean in_appactive; - -// forward-referenced functions -void IN_StartupJoystick (void); -void IN_JoyMove(void); - -static void MidiInfo_f( void ); - -/* -============================================================ - -WIN32 MOUSE CONTROL - -============================================================ -*/ - -/* -================ -IN_InitWin32Mouse -================ -*/ -void IN_InitWin32Mouse( void ) -{ -} - -/* -================ -IN_ShutdownWin32Mouse -================ -*/ -void IN_ShutdownWin32Mouse( void ) { -} - -/* -================ -IN_ActivateWin32Mouse -================ -*/ -void IN_ActivateWin32Mouse( void ) { - int width, height; - RECT window_rect; - - width = GetSystemMetrics (SM_CXSCREEN); - height = GetSystemMetrics (SM_CYSCREEN); - - GetWindowRect ( g_wv.hWnd, &window_rect); - if (window_rect.left < 0) - window_rect.left = 0; - if (window_rect.top < 0) - window_rect.top = 0; - if (window_rect.right >= width) - window_rect.right = width-1; - if (window_rect.bottom >= height-1) - window_rect.bottom = height-1; - window_center_x = (window_rect.right + window_rect.left)/2; - window_center_y = (window_rect.top + window_rect.bottom)/2; - - SetCursorPos (window_center_x, window_center_y); - - SetCapture ( g_wv.hWnd ); - ClipCursor (&window_rect); - while (ShowCursor (FALSE) >= 0) - ; -} - -/* -================ -IN_DeactivateWin32Mouse -================ -*/ -void IN_DeactivateWin32Mouse( void ) -{ - ClipCursor (NULL); - ReleaseCapture (); - while (ShowCursor (TRUE) < 0) - ; -} - -/* -================ -IN_Win32Mouse -================ -*/ -void IN_Win32Mouse( int *mx, int *my ) { - POINT current_pos; - - // find mouse movement - GetCursorPos (¤t_pos); - - // force the mouse to the center, so there's room to move - SetCursorPos (window_center_x, window_center_y); - - *mx = current_pos.x - window_center_x; - *my = current_pos.y - window_center_y; -} - - -/* -============================================================ - -DIRECT INPUT MOUSE CONTROL - -============================================================ -*/ - -#undef DEFINE_GUID - -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -DEFINE_GUID(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); -DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); - - -#define DINPUT_BUFFERSIZE 16 -#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) - -HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); - -static HINSTANCE hInstDI; - -typedef struct MYDATA { - LONG lX; // X axis goes here - LONG lY; // Y axis goes here - LONG lZ; // Z axis goes here - BYTE bButtonA; // One button goes here - BYTE bButtonB; // Another button goes here - BYTE bButtonC; // Another button goes here - BYTE bButtonD; // Another button goes here -} MYDATA; - -static DIOBJECTDATAFORMAT rgodf[] = { - { &GUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { &GUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, - { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, -}; - -#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) - -// NOTE TTimo: would be easier using c_dfDIMouse or c_dfDIMouse2 -static DIDATAFORMAT df = { - sizeof(DIDATAFORMAT), // this structure - sizeof(DIOBJECTDATAFORMAT), // size of object data format - DIDF_RELAXIS, // absolute axis coordinates - sizeof(MYDATA), // device data size - NUM_OBJECTS, // number of objects - rgodf, // and here they are -}; - -static LPDIRECTINPUT g_pdi; -static LPDIRECTINPUTDEVICE g_pMouse; - -void IN_DIMouse( int *mx, int *my ); - -/* -======================== -IN_InitDIMouse -======================== -*/ -qboolean IN_InitDIMouse( void ) { - HRESULT hr; - int x, y; - DIPROPDWORD dipdw = { - { - sizeof(DIPROPDWORD), // diph.dwSize - sizeof(DIPROPHEADER), // diph.dwHeaderSize - 0, // diph.dwObj - DIPH_DEVICE, // diph.dwHow - }, - DINPUT_BUFFERSIZE, // dwData - }; - - Com_Printf( "Initializing DirectInput...\n"); - - if (!hInstDI) { - hInstDI = LoadLibrary("dinput.dll"); - - if (hInstDI == NULL) { - Com_Printf ("Couldn't load dinput.dll\n"); - return qfalse; - } - } - - if (!pDirectInputCreate) { - pDirectInputCreate = (long (__stdcall *)(void *,unsigned long ,struct IDirectInputA ** ,struct IUnknown *)) - GetProcAddress(hInstDI,"DirectInputCreateA"); - - if (!pDirectInputCreate) { - Com_Printf ("Couldn't get DI proc addr\n"); - return qfalse; - } - } - - // register with DirectInput and get an IDirectInput to play with. - hr = iDirectInputCreate( g_wv.hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); - - if (FAILED(hr)) { - Com_Printf ("iDirectInputCreate failed\n"); - return qfalse; - } - - // obtain an interface to the system mouse device. - hr = IDirectInput_CreateDevice(g_pdi, &GUID_SysMouse, &g_pMouse, NULL); - - if (FAILED(hr)) { - Com_Printf ("Couldn't open DI mouse device\n"); - return qfalse; - } - - // set the data format to "mouse format". - hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI mouse format\n"); - return qfalse; - } - - // set the cooperativity level. - hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, g_wv.hWnd, - DISCL_EXCLUSIVE | DISCL_FOREGROUND); - - // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=50 - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI coop level\n"); - return qfalse; - } - - - // set the buffer size to DINPUT_BUFFERSIZE elements. - // the buffer size is a DWORD property associated with the device - hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); - - if (FAILED(hr)) { - Com_Printf ("Couldn't set DI buffersize\n"); - return qfalse; - } - - // clear any pending samples - IN_DIMouse( &x, &y ); - IN_DIMouse( &x, &y ); - - Com_Printf( "DirectInput initialized.\n"); - return qtrue; -} - -/* -========================== -IN_ShutdownDIMouse -========================== -*/ -void IN_ShutdownDIMouse( void ) { - if (g_pMouse) { - IDirectInputDevice_Release(g_pMouse); - g_pMouse = NULL; - } - - if (g_pdi) { - IDirectInput_Release(g_pdi); - g_pdi = NULL; - } -} - -/* -========================== -IN_ActivateDIMouse -========================== -*/ -void IN_ActivateDIMouse( void ) { - HRESULT hr; - - if (!g_pMouse) { - return; - } - - // we may fail to reacquire if the window has been recreated - hr = IDirectInputDevice_Acquire( g_pMouse ); - if (FAILED(hr)) { - if ( !IN_InitDIMouse() ) { - Com_Printf ("Falling back to Win32 mouse support...\n"); - Cvar_Set( "in_mouse", "-1" ); - } - } -} - -/* -========================== -IN_DeactivateDIMouse -========================== -*/ -void IN_DeactivateDIMouse( void ) { - if (!g_pMouse) { - return; - } - IDirectInputDevice_Unacquire( g_pMouse ); -} - - -/* -=================== -IN_DIMouse -=================== -*/ -void IN_DIMouse( int *mx, int *my ) { - DIDEVICEOBJECTDATA od; - DIMOUSESTATE state; - DWORD dwElements; - HRESULT hr; - int value; - static float oldSysTime; - - if ( !g_pMouse ) { - return; - } - - // fetch new events - for (;;) - { - dwElements = 1; - - hr = IDirectInputDevice_GetDeviceData(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &od, &dwElements, 0); - if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) { - IDirectInputDevice_Acquire(g_pMouse); - return; - } - - /* Unable to read data or no data available */ - if ( FAILED(hr) ) { - break; - } - - if ( dwElements == 0 ) { - break; - } - - switch (od.dwOfs) { - case DIMOFS_BUTTON0: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE1, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE1, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON1: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE2, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE2, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON2: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE3, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE3, qfalse, 0, NULL ); - break; - - case DIMOFS_BUTTON3: - if (od.dwData & 0x80) - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE4, qtrue, 0, NULL ); - else - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE4, qfalse, 0, NULL ); - break; - // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=50 - case DIMOFS_Z: - value = od.dwData; - if (value == 0) { - - } else if (value < 0) { - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); - } else { - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); - } - break; - } - } - - // read the raw delta counter and ignore - // the individual sample time / values - hr = IDirectInputDevice_GetDeviceState(g_pMouse, - sizeof(DIDEVICEOBJECTDATA), &state); - if ( FAILED(hr) ) { - *mx = *my = 0; - return; - } - *mx = state.lX; - *my = state.lY; -} - -/* -============================================================ - - MOUSE CONTROL - -============================================================ -*/ - -/* -=========== -IN_ActivateMouse - -Called when the window gains focus or changes in some way -=========== -*/ -void IN_ActivateMouse( void ) -{ - if (!s_wmv.mouseInitialized ) { - return; - } - if ( !in_mouse->integer ) - { - s_wmv.mouseActive = qfalse; - return; - } - if ( s_wmv.mouseActive ) - { - return; - } - - s_wmv.mouseActive = qtrue; - - if ( in_mouse->integer != -1 ) { - IN_ActivateDIMouse(); - } - IN_ActivateWin32Mouse(); -} - - -/* -=========== -IN_DeactivateMouse - -Called when the window loses focus -=========== -*/ -void IN_DeactivateMouse( void ) { - if (!s_wmv.mouseInitialized ) { - return; - } - if (!s_wmv.mouseActive ) { - return; - } - s_wmv.mouseActive = qfalse; - - IN_DeactivateDIMouse(); - IN_DeactivateWin32Mouse(); -} - - - -/* -=========== -IN_StartupMouse -=========== -*/ -void IN_StartupMouse( void ) -{ - s_wmv.mouseInitialized = qfalse; - s_wmv.mouseStartupDelayed = qfalse; - - if ( in_mouse->integer == 0 ) { - Com_Printf ("Mouse control not active.\n"); - return; - } - - // nt4.0 direct input is screwed up - if ( ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) && - ( g_wv.osversion.dwMajorVersion == 4 ) ) - { - Com_Printf ("Disallowing DirectInput on NT 4.0\n"); - Cvar_Set( "in_mouse", "-1" ); - } - - if ( in_mouse->integer == -1 ) { - Com_Printf ("Skipping check for DirectInput\n"); - } else { - if (!g_wv.hWnd) - { - Com_Printf ("No window for DirectInput mouse init, delaying\n"); - s_wmv.mouseStartupDelayed = qtrue; - return; - } - if ( IN_InitDIMouse() ) { - s_wmv.mouseInitialized = qtrue; - return; - } - Com_Printf ("Falling back to Win32 mouse support...\n"); - } - s_wmv.mouseInitialized = qtrue; - IN_InitWin32Mouse(); -} - -/* -=========== -IN_MouseEvent -=========== -*/ -void IN_MouseEvent (int mstate) -{ - int i; - - if ( !s_wmv.mouseInitialized ) - return; - -// perform button actions - for (i = 0 ; i < 3 ; i++ ) - { - if ( (mstate & (1<modified = qfalse; - in_joystick->modified = qfalse; -} - -/* -=========== -IN_Shutdown -=========== -*/ -void IN_Shutdown( void ) { - IN_DeactivateMouse(); - IN_ShutdownDIMouse(); - IN_ShutdownMIDI(); - Cmd_RemoveCommand("midiinfo" ); -} - - -/* -=========== -IN_Init -=========== -*/ -void IN_Init( void ) { - // MIDI input controler variables - in_midi = Cvar_Get ("in_midi", "0", CVAR_ARCHIVE); - in_midiport = Cvar_Get ("in_midiport", "1", CVAR_ARCHIVE); - in_midichannel = Cvar_Get ("in_midichannel", "1", CVAR_ARCHIVE); - in_mididevice = Cvar_Get ("in_mididevice", "0", CVAR_ARCHIVE); - - Cmd_AddCommand( "midiinfo", MidiInfo_f ); - - // mouse variables - in_mouse = Cvar_Get ("in_mouse", "1", CVAR_ARCHIVE|CVAR_LATCH); - in_logitechbug = Cvar_Get ("in_logitechbug", "0", CVAR_ARCHIVE); - - // joystick variables - in_joystick = Cvar_Get ("in_joystick", "0", CVAR_ARCHIVE|CVAR_LATCH); - in_joyBallScale = Cvar_Get ("in_joyBallScale", "0.02", CVAR_ARCHIVE); - in_debugJoystick = Cvar_Get ("in_debugjoystick", "0", CVAR_TEMP); - - joy_threshold = Cvar_Get ("joy_threshold", "0.15", CVAR_ARCHIVE); - - IN_Startup(); -} - - -/* -=========== -IN_Activate - -Called when the main window gains or loses focus. -The window may have been destroyed and recreated -between a deactivate and an activate. -=========== -*/ -void IN_Activate (qboolean active) { - in_appactive = active; - - if ( !active ) - { - IN_DeactivateMouse(); - } -} - - -/* -================== -IN_Frame - -Called every frame, even if not generating commands -================== -*/ -void IN_Frame (void) { - // post joystick events - IN_JoyMove(); - - if ( !s_wmv.mouseInitialized ) { - if (s_wmv.mouseStartupDelayed && g_wv.hWnd) - { - Com_Printf("Proceeding with delayed mouse init\n"); - IN_StartupMouse(); - s_wmv.mouseStartupDelayed = qfalse; - } - return; - } - - if ( cls.keyCatchers & KEYCATCH_CONSOLE ) { - // temporarily deactivate if not in the game and - // running on the desktop - // voodoo always counts as full screen - if (Cvar_VariableValue ("r_fullscreen") == 0 - && strcmp( Cvar_VariableString("r_glDriver"), _3DFX_DRIVER_NAME) ) { - IN_DeactivateMouse (); - return; - } - } - - if ( !in_appactive ) { - IN_DeactivateMouse (); - return; - } - - IN_ActivateMouse(); - - // post events to the system que - IN_MouseMove(); - -} - - -/* -=================== -IN_ClearStates -=================== -*/ -void IN_ClearStates (void) -{ - s_wmv.oldButtonState = 0; -} - - -/* -========================================================================= - -JOYSTICK - -========================================================================= -*/ - -/* -=============== -IN_StartupJoystick -=============== -*/ -void IN_StartupJoystick (void) { - int numdevs; - MMRESULT mmr; - - // assume no joystick - joy.avail = qfalse; - - if (! in_joystick->integer ) { - Com_Printf ("Joystick is not active.\n"); - return; - } - - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) - { - Com_Printf ("joystick not found -- driver not present\n"); - return; - } - - // cycle through the joystick ids for the first valid one - mmr = 0; - for (joy.id=0 ; joy.id 1 ) { - fValue = 1; - } - return fValue; -} - -int JoyToI( int value ) { - // move centerpoint to zero - value -= 32768; - - return value; -} - -int joyDirectionKeys[16] = { - K_LEFTARROW, K_RIGHTARROW, - K_UPARROW, K_DOWNARROW, - K_JOY16, K_JOY17, - K_JOY18, K_JOY19, - K_JOY20, K_JOY21, - K_JOY22, K_JOY23, - - K_JOY24, K_JOY25, - K_JOY26, K_JOY27 -}; - -/* -=========== -IN_JoyMove -=========== -*/ -void IN_JoyMove( void ) { - float fAxisValue; - int i; - DWORD buttonstate, povstate; - int x, y; - - // verify joystick is available and that the user wants to use it - if ( !joy.avail ) { - return; - } - - // collect the joystick data, if possible - Com_Memset (&joy.ji, 0, sizeof(joy.ji)); - joy.ji.dwSize = sizeof(joy.ji); - joy.ji.dwFlags = JOY_RETURNALL; - - if ( joyGetPosEx (joy.id, &joy.ji) != JOYERR_NOERROR ) { - // read error occurred - // turning off the joystick seems too harsh for 1 read error,\ - // but what should be done? - // Com_Printf ("IN_ReadJoystick: no response\n"); - // joy.avail = false; - return; - } - - if ( in_debugJoystick->integer ) { - Com_Printf( "%8x %5i %5.2f %5.2f %5.2f %5.2f %6i %6i\n", - joy.ji.dwButtons, - joy.ji.dwPOV, - JoyToF( joy.ji.dwXpos ), JoyToF( joy.ji.dwYpos ), - JoyToF( joy.ji.dwZpos ), JoyToF( joy.ji.dwRpos ), - JoyToI( joy.ji.dwUpos ), JoyToI( joy.ji.dwVpos ) ); - } - - // loop through the joystick buttons - // key a joystick event or auxillary event for higher number buttons for each state change - buttonstate = joy.ji.dwButtons; - for ( i=0 ; i < joy.jc.wNumButtons ; i++ ) { - if ( (buttonstate & (1<value ) { - povstate |= (1<<(i*2)); - } else if ( fAxisValue > joy_threshold->value ) { - povstate |= (1<<(i*2+1)); - } - } - - // convert POV information from a direction into 4 button bits - if ( joy.jc.wCaps & JOYCAPS_HASPOV ) { - if ( joy.ji.dwPOV != JOY_POVCENTERED ) { - if (joy.ji.dwPOV == JOY_POVFORWARD) - povstate |= 1<<12; - if (joy.ji.dwPOV == JOY_POVBACKWARD) - povstate |= 1<<13; - if (joy.ji.dwPOV == JOY_POVRIGHT) - povstate |= 1<<14; - if (joy.ji.dwPOV == JOY_POVLEFT) - povstate |= 1<<15; - } - } - - // determine which bits have changed and key an auxillary event for each change - for (i=0 ; i < 16 ; i++) { - if ( (povstate & (1<= 6 ) { - x = JoyToI( joy.ji.dwUpos ) * in_joyBallScale->value; - y = JoyToI( joy.ji.dwVpos ) * in_joyBallScale->value; - if ( x || y ) { - Sys_QueEvent( g_wv.sysMsgTime, SE_MOUSE, x, y, 0, NULL ); - } - } -} - -/* -========================================================================= - -MIDI - -========================================================================= -*/ - -static void MIDI_NoteOff( int note ) -{ - int qkey; - - qkey = note - 60 + K_AUX1; - - if ( qkey > 255 || qkey < K_AUX1 ) - return; - - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qfalse, 0, NULL ); -} - -static void MIDI_NoteOn( int note, int velocity ) -{ - int qkey; - - if ( velocity == 0 ) - MIDI_NoteOff( note ); - - qkey = note - 60 + K_AUX1; - - if ( qkey > 255 || qkey < K_AUX1 ) - return; - - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qtrue, 0, NULL ); -} - -static void CALLBACK MidiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, - DWORD dwParam1, DWORD dwParam2 ) -{ - int message; - - switch ( uMsg ) - { - case MIM_OPEN: - break; - case MIM_CLOSE: - break; - case MIM_DATA: - message = dwParam1 & 0xff; - - // note on - if ( ( message & 0xf0 ) == 0x90 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOn( ( dwParam1 & 0xff00 ) >> 8, ( dwParam1 & 0xff0000 ) >> 16 ); - } - else if ( ( message & 0xf0 ) == 0x80 ) - { - if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) - MIDI_NoteOff( ( dwParam1 & 0xff00 ) >> 8 ); - } - break; - case MIM_LONGDATA: - break; - case MIM_ERROR: - break; - case MIM_LONGERROR: - break; - } - -// Sys_QueEvent( sys_msg_time, SE_KEY, wMsg, qtrue, 0, NULL ); -} - -static void MidiInfo_f( void ) -{ - int i; - - const char *enableStrings[] = { "disabled", "enabled" }; - - Com_Printf( "\nMIDI control: %s\n", enableStrings[in_midi->integer != 0] ); - Com_Printf( "port: %d\n", in_midiport->integer ); - Com_Printf( "channel: %d\n", in_midichannel->integer ); - Com_Printf( "current device: %d\n", in_mididevice->integer ); - Com_Printf( "number of devices: %d\n", s_midiInfo.numDevices ); - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - if ( i == Cvar_VariableValue( "in_mididevice" ) ) - Com_Printf( "***" ); - else - Com_Printf( "..." ); - Com_Printf( "device %2d: %s\n", i, s_midiInfo.caps[i].szPname ); - Com_Printf( "...manufacturer ID: 0x%hx\n", s_midiInfo.caps[i].wMid ); - Com_Printf( "...product ID: 0x%hx\n", s_midiInfo.caps[i].wPid ); - - Com_Printf( "\n" ); - } -} - -static void IN_StartupMIDI( void ) -{ - int i; - - if ( !Cvar_VariableValue( "in_midi" ) ) - return; - - // - // enumerate MIDI IN devices - // - s_midiInfo.numDevices = midiInGetNumDevs(); - - for ( i = 0; i < s_midiInfo.numDevices; i++ ) - { - midiInGetDevCaps( i, &s_midiInfo.caps[i], sizeof( s_midiInfo.caps[i] ) ); - } - - // - // open the MIDI IN port - // - if ( midiInOpen( &s_midiInfo.hMidiIn, - in_mididevice->integer, - ( unsigned long ) MidiInProc, - ( unsigned long ) NULL, - CALLBACK_FUNCTION ) != MMSYSERR_NOERROR ) - { - Com_Printf( "WARNING: could not open MIDI device %d: '%s'\n", in_mididevice->integer , s_midiInfo.caps[( int ) in_mididevice->value] ); - return; - } - - midiInStart( s_midiInfo.hMidiIn ); -} - -static void IN_ShutdownMIDI( void ) -{ - if ( s_midiInfo.hMidiIn ) - { - midiInClose( s_midiInfo.hMidiIn ); - } - Com_Memset( &s_midiInfo, 0, sizeof( s_midiInfo ) ); -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// win_input.c -- win32 mouse and joystick code +// 02/21/97 JCB Added extended DirectInput code to support external controllers. + +#include "../client/client.h" +#include "win_local.h" + + +typedef struct { + int oldButtonState; + + qboolean mouseActive; + qboolean mouseInitialized; + qboolean mouseStartupDelayed; // delay mouse init to try DI again when we have a window +} WinMouseVars_t; + +static WinMouseVars_t s_wmv; + +static int window_center_x, window_center_y; + +// +// MIDI definitions +// +static void IN_StartupMIDI( void ); +static void IN_ShutdownMIDI( void ); + +#define MAX_MIDIIN_DEVICES 8 + +typedef struct { + int numDevices; + MIDIINCAPS caps[MAX_MIDIIN_DEVICES]; + + HMIDIIN hMidiIn; +} MidiInfo_t; + +static MidiInfo_t s_midiInfo; + +// +// Joystick definitions +// +#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V + +typedef struct { + qboolean avail; + int id; // joystick number + JOYCAPS jc; + + int oldbuttonstate; + int oldpovstate; + + JOYINFOEX ji; +} joystickInfo_t; + +static joystickInfo_t joy; + + + +cvar_t *in_midi; +cvar_t *in_midiport; +cvar_t *in_midichannel; +cvar_t *in_mididevice; + +cvar_t *in_mouse; +cvar_t *in_logitechbug; +cvar_t *in_joystick; +cvar_t *in_joyBallScale; +cvar_t *in_debugJoystick; +cvar_t *joy_threshold; + +qboolean in_appactive; + +// forward-referenced functions +void IN_StartupJoystick (void); +void IN_JoyMove(void); + +static void MidiInfo_f( void ); + +/* +============================================================ + +WIN32 MOUSE CONTROL + +============================================================ +*/ + +/* +================ +IN_InitWin32Mouse +================ +*/ +void IN_InitWin32Mouse( void ) +{ +} + +/* +================ +IN_ShutdownWin32Mouse +================ +*/ +void IN_ShutdownWin32Mouse( void ) { +} + +/* +================ +IN_ActivateWin32Mouse +================ +*/ +void IN_ActivateWin32Mouse( void ) { + int width, height; + RECT window_rect; + + width = GetSystemMetrics (SM_CXSCREEN); + height = GetSystemMetrics (SM_CYSCREEN); + + GetWindowRect ( g_wv.hWnd, &window_rect); + if (window_rect.left < 0) + window_rect.left = 0; + if (window_rect.top < 0) + window_rect.top = 0; + if (window_rect.right >= width) + window_rect.right = width-1; + if (window_rect.bottom >= height-1) + window_rect.bottom = height-1; + window_center_x = (window_rect.right + window_rect.left)/2; + window_center_y = (window_rect.top + window_rect.bottom)/2; + + SetCursorPos (window_center_x, window_center_y); + + SetCapture ( g_wv.hWnd ); + ClipCursor (&window_rect); + while (ShowCursor (FALSE) >= 0) + ; +} + +/* +================ +IN_DeactivateWin32Mouse +================ +*/ +void IN_DeactivateWin32Mouse( void ) +{ + ClipCursor (NULL); + ReleaseCapture (); + while (ShowCursor (TRUE) < 0) + ; +} + +/* +================ +IN_Win32Mouse +================ +*/ +void IN_Win32Mouse( int *mx, int *my ) { + POINT current_pos; + + // find mouse movement + GetCursorPos (¤t_pos); + + // force the mouse to the center, so there's room to move + SetCursorPos (window_center_x, window_center_y); + + *mx = current_pos.x - window_center_x; + *my = current_pos.y - window_center_y; +} + + +/* +============================================================ + +DIRECT INPUT MOUSE CONTROL + +============================================================ +*/ + +#undef DEFINE_GUID + +#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + EXTERN_C const GUID name \ + = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } + +DEFINE_GUID(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + + +#define DINPUT_BUFFERSIZE 16 +#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) + +HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, + LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); + +static HINSTANCE hInstDI; + +typedef struct MYDATA { + LONG lX; // X axis goes here + LONG lY; // Y axis goes here + LONG lZ; // Z axis goes here + BYTE bButtonA; // One button goes here + BYTE bButtonB; // Another button goes here + BYTE bButtonC; // Another button goes here + BYTE bButtonD; // Another button goes here +} MYDATA; + +static DIOBJECTDATAFORMAT rgodf[] = { + { &GUID_XAxis, FIELD_OFFSET(MYDATA, lX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { &GUID_YAxis, FIELD_OFFSET(MYDATA, lY), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { &GUID_ZAxis, FIELD_OFFSET(MYDATA, lZ), 0x80000000 | DIDFT_AXIS | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonA), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonB), DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonC), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, + { 0, FIELD_OFFSET(MYDATA, bButtonD), 0x80000000 | DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0,}, +}; + +#define NUM_OBJECTS (sizeof(rgodf) / sizeof(rgodf[0])) + +// NOTE TTimo: would be easier using c_dfDIMouse or c_dfDIMouse2 +static DIDATAFORMAT df = { + sizeof(DIDATAFORMAT), // this structure + sizeof(DIOBJECTDATAFORMAT), // size of object data format + DIDF_RELAXIS, // absolute axis coordinates + sizeof(MYDATA), // device data size + NUM_OBJECTS, // number of objects + rgodf, // and here they are +}; + +static LPDIRECTINPUT g_pdi; +static LPDIRECTINPUTDEVICE g_pMouse; + +void IN_DIMouse( int *mx, int *my ); + +/* +======================== +IN_InitDIMouse +======================== +*/ +qboolean IN_InitDIMouse( void ) { + HRESULT hr; + int x, y; + DIPROPDWORD dipdw = { + { + sizeof(DIPROPDWORD), // diph.dwSize + sizeof(DIPROPHEADER), // diph.dwHeaderSize + 0, // diph.dwObj + DIPH_DEVICE, // diph.dwHow + }, + DINPUT_BUFFERSIZE, // dwData + }; + + Com_Printf( "Initializing DirectInput...\n"); + + if (!hInstDI) { + hInstDI = LoadLibrary("dinput.dll"); + + if (hInstDI == NULL) { + Com_Printf ("Couldn't load dinput.dll\n"); + return qfalse; + } + } + + if (!pDirectInputCreate) { + pDirectInputCreate = (long (__stdcall *)(void *,unsigned long ,struct IDirectInputA ** ,struct IUnknown *)) + GetProcAddress(hInstDI,"DirectInputCreateA"); + + if (!pDirectInputCreate) { + Com_Printf ("Couldn't get DI proc addr\n"); + return qfalse; + } + } + + // register with DirectInput and get an IDirectInput to play with. + hr = iDirectInputCreate( g_wv.hInstance, DIRECTINPUT_VERSION, &g_pdi, NULL); + + if (FAILED(hr)) { + Com_Printf ("iDirectInputCreate failed\n"); + return qfalse; + } + + // obtain an interface to the system mouse device. + hr = IDirectInput_CreateDevice(g_pdi, &GUID_SysMouse, &g_pMouse, NULL); + + if (FAILED(hr)) { + Com_Printf ("Couldn't open DI mouse device\n"); + return qfalse; + } + + // set the data format to "mouse format". + hr = IDirectInputDevice_SetDataFormat(g_pMouse, &df); + + if (FAILED(hr)) { + Com_Printf ("Couldn't set DI mouse format\n"); + return qfalse; + } + + // set the cooperativity level. + hr = IDirectInputDevice_SetCooperativeLevel(g_pMouse, g_wv.hWnd, + DISCL_EXCLUSIVE | DISCL_FOREGROUND); + + // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=50 + if (FAILED(hr)) { + Com_Printf ("Couldn't set DI coop level\n"); + return qfalse; + } + + + // set the buffer size to DINPUT_BUFFERSIZE elements. + // the buffer size is a DWORD property associated with the device + hr = IDirectInputDevice_SetProperty(g_pMouse, DIPROP_BUFFERSIZE, &dipdw.diph); + + if (FAILED(hr)) { + Com_Printf ("Couldn't set DI buffersize\n"); + return qfalse; + } + + // clear any pending samples + IN_DIMouse( &x, &y ); + IN_DIMouse( &x, &y ); + + Com_Printf( "DirectInput initialized.\n"); + return qtrue; +} + +/* +========================== +IN_ShutdownDIMouse +========================== +*/ +void IN_ShutdownDIMouse( void ) { + if (g_pMouse) { + IDirectInputDevice_Release(g_pMouse); + g_pMouse = NULL; + } + + if (g_pdi) { + IDirectInput_Release(g_pdi); + g_pdi = NULL; + } +} + +/* +========================== +IN_ActivateDIMouse +========================== +*/ +void IN_ActivateDIMouse( void ) { + HRESULT hr; + + if (!g_pMouse) { + return; + } + + // we may fail to reacquire if the window has been recreated + hr = IDirectInputDevice_Acquire( g_pMouse ); + if (FAILED(hr)) { + if ( !IN_InitDIMouse() ) { + Com_Printf ("Falling back to Win32 mouse support...\n"); + Cvar_Set( "in_mouse", "-1" ); + } + } +} + +/* +========================== +IN_DeactivateDIMouse +========================== +*/ +void IN_DeactivateDIMouse( void ) { + if (!g_pMouse) { + return; + } + IDirectInputDevice_Unacquire( g_pMouse ); +} + + +/* +=================== +IN_DIMouse +=================== +*/ +void IN_DIMouse( int *mx, int *my ) { + DIDEVICEOBJECTDATA od; + DIMOUSESTATE state; + DWORD dwElements; + HRESULT hr; + int value; + static float oldSysTime; + + if ( !g_pMouse ) { + return; + } + + // fetch new events + for (;;) + { + dwElements = 1; + + hr = IDirectInputDevice_GetDeviceData(g_pMouse, + sizeof(DIDEVICEOBJECTDATA), &od, &dwElements, 0); + if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED)) { + IDirectInputDevice_Acquire(g_pMouse); + return; + } + + /* Unable to read data or no data available */ + if ( FAILED(hr) ) { + break; + } + + if ( dwElements == 0 ) { + break; + } + + switch (od.dwOfs) { + case DIMOFS_BUTTON0: + if (od.dwData & 0x80) + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE1, qtrue, 0, NULL ); + else + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE1, qfalse, 0, NULL ); + break; + + case DIMOFS_BUTTON1: + if (od.dwData & 0x80) + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE2, qtrue, 0, NULL ); + else + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE2, qfalse, 0, NULL ); + break; + + case DIMOFS_BUTTON2: + if (od.dwData & 0x80) + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE3, qtrue, 0, NULL ); + else + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE3, qfalse, 0, NULL ); + break; + + case DIMOFS_BUTTON3: + if (od.dwData & 0x80) + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE4, qtrue, 0, NULL ); + else + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MOUSE4, qfalse, 0, NULL ); + break; + // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=50 + case DIMOFS_Z: + value = od.dwData; + if (value == 0) { + + } else if (value < 0) { + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); + } else { + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); + Sys_QueEvent( od.dwTimeStamp, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); + } + break; + } + } + + // read the raw delta counter and ignore + // the individual sample time / values + hr = IDirectInputDevice_GetDeviceState(g_pMouse, + sizeof(DIDEVICEOBJECTDATA), &state); + if ( FAILED(hr) ) { + *mx = *my = 0; + return; + } + *mx = state.lX; + *my = state.lY; +} + +/* +============================================================ + + MOUSE CONTROL + +============================================================ +*/ + +/* +=========== +IN_ActivateMouse + +Called when the window gains focus or changes in some way +=========== +*/ +void IN_ActivateMouse( void ) +{ + if (!s_wmv.mouseInitialized ) { + return; + } + if ( !in_mouse->integer ) + { + s_wmv.mouseActive = qfalse; + return; + } + if ( s_wmv.mouseActive ) + { + return; + } + + s_wmv.mouseActive = qtrue; + + if ( in_mouse->integer != -1 ) { + IN_ActivateDIMouse(); + } + IN_ActivateWin32Mouse(); +} + + +/* +=========== +IN_DeactivateMouse + +Called when the window loses focus +=========== +*/ +void IN_DeactivateMouse( void ) { + if (!s_wmv.mouseInitialized ) { + return; + } + if (!s_wmv.mouseActive ) { + return; + } + s_wmv.mouseActive = qfalse; + + IN_DeactivateDIMouse(); + IN_DeactivateWin32Mouse(); +} + + + +/* +=========== +IN_StartupMouse +=========== +*/ +void IN_StartupMouse( void ) +{ + s_wmv.mouseInitialized = qfalse; + s_wmv.mouseStartupDelayed = qfalse; + + if ( in_mouse->integer == 0 ) { + Com_Printf ("Mouse control not active.\n"); + return; + } + + // nt4.0 direct input is screwed up + if ( ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) && + ( g_wv.osversion.dwMajorVersion == 4 ) ) + { + Com_Printf ("Disallowing DirectInput on NT 4.0\n"); + Cvar_Set( "in_mouse", "-1" ); + } + + if ( in_mouse->integer == -1 ) { + Com_Printf ("Skipping check for DirectInput\n"); + } else { + if (!g_wv.hWnd) + { + Com_Printf ("No window for DirectInput mouse init, delaying\n"); + s_wmv.mouseStartupDelayed = qtrue; + return; + } + if ( IN_InitDIMouse() ) { + s_wmv.mouseInitialized = qtrue; + return; + } + Com_Printf ("Falling back to Win32 mouse support...\n"); + } + s_wmv.mouseInitialized = qtrue; + IN_InitWin32Mouse(); +} + +/* +=========== +IN_MouseEvent +=========== +*/ +void IN_MouseEvent (int mstate) +{ + int i; + + if ( !s_wmv.mouseInitialized ) + return; + +// perform button actions + for (i = 0 ; i < 3 ; i++ ) + { + if ( (mstate & (1<modified = qfalse; + in_joystick->modified = qfalse; +} + +/* +=========== +IN_Shutdown +=========== +*/ +void IN_Shutdown( void ) { + IN_DeactivateMouse(); + IN_ShutdownDIMouse(); + IN_ShutdownMIDI(); + Cmd_RemoveCommand("midiinfo" ); +} + + +/* +=========== +IN_Init +=========== +*/ +void IN_Init( void ) { + // MIDI input controler variables + in_midi = Cvar_Get ("in_midi", "0", CVAR_ARCHIVE); + in_midiport = Cvar_Get ("in_midiport", "1", CVAR_ARCHIVE); + in_midichannel = Cvar_Get ("in_midichannel", "1", CVAR_ARCHIVE); + in_mididevice = Cvar_Get ("in_mididevice", "0", CVAR_ARCHIVE); + + Cmd_AddCommand( "midiinfo", MidiInfo_f ); + + // mouse variables + in_mouse = Cvar_Get ("in_mouse", "1", CVAR_ARCHIVE|CVAR_LATCH); + in_logitechbug = Cvar_Get ("in_logitechbug", "0", CVAR_ARCHIVE); + + // joystick variables + in_joystick = Cvar_Get ("in_joystick", "0", CVAR_ARCHIVE|CVAR_LATCH); + in_joyBallScale = Cvar_Get ("in_joyBallScale", "0.02", CVAR_ARCHIVE); + in_debugJoystick = Cvar_Get ("in_debugjoystick", "0", CVAR_TEMP); + + joy_threshold = Cvar_Get ("joy_threshold", "0.15", CVAR_ARCHIVE); + + IN_Startup(); +} + + +/* +=========== +IN_Activate + +Called when the main window gains or loses focus. +The window may have been destroyed and recreated +between a deactivate and an activate. +=========== +*/ +void IN_Activate (qboolean active) { + in_appactive = active; + + if ( !active ) + { + IN_DeactivateMouse(); + } +} + + +/* +================== +IN_Frame + +Called every frame, even if not generating commands +================== +*/ +void IN_Frame (void) { + // post joystick events + IN_JoyMove(); + + if ( !s_wmv.mouseInitialized ) { + if (s_wmv.mouseStartupDelayed && g_wv.hWnd) + { + Com_Printf("Proceeding with delayed mouse init\n"); + IN_StartupMouse(); + s_wmv.mouseStartupDelayed = qfalse; + } + return; + } + + if ( cls.keyCatchers & KEYCATCH_CONSOLE ) { + // temporarily deactivate if not in the game and + // running on the desktop + // voodoo always counts as full screen + if (Cvar_VariableValue ("r_fullscreen") == 0 + && strcmp( Cvar_VariableString("r_glDriver"), _3DFX_DRIVER_NAME) ) { + IN_DeactivateMouse (); + return; + } + } + + if ( !in_appactive ) { + IN_DeactivateMouse (); + return; + } + + IN_ActivateMouse(); + + // post events to the system que + IN_MouseMove(); + +} + + +/* +=================== +IN_ClearStates +=================== +*/ +void IN_ClearStates (void) +{ + s_wmv.oldButtonState = 0; +} + + +/* +========================================================================= + +JOYSTICK + +========================================================================= +*/ + +/* +=============== +IN_StartupJoystick +=============== +*/ +void IN_StartupJoystick (void) { + int numdevs; + MMRESULT mmr; + + // assume no joystick + joy.avail = qfalse; + + if (! in_joystick->integer ) { + Com_Printf ("Joystick is not active.\n"); + return; + } + + // verify joystick driver is present + if ((numdevs = joyGetNumDevs ()) == 0) + { + Com_Printf ("joystick not found -- driver not present\n"); + return; + } + + // cycle through the joystick ids for the first valid one + mmr = 0; + for (joy.id=0 ; joy.id 1 ) { + fValue = 1; + } + return fValue; +} + +int JoyToI( int value ) { + // move centerpoint to zero + value -= 32768; + + return value; +} + +int joyDirectionKeys[16] = { + K_LEFTARROW, K_RIGHTARROW, + K_UPARROW, K_DOWNARROW, + K_JOY16, K_JOY17, + K_JOY18, K_JOY19, + K_JOY20, K_JOY21, + K_JOY22, K_JOY23, + + K_JOY24, K_JOY25, + K_JOY26, K_JOY27 +}; + +/* +=========== +IN_JoyMove +=========== +*/ +void IN_JoyMove( void ) { + float fAxisValue; + int i; + DWORD buttonstate, povstate; + int x, y; + + // verify joystick is available and that the user wants to use it + if ( !joy.avail ) { + return; + } + + // collect the joystick data, if possible + Com_Memset (&joy.ji, 0, sizeof(joy.ji)); + joy.ji.dwSize = sizeof(joy.ji); + joy.ji.dwFlags = JOY_RETURNALL; + + if ( joyGetPosEx (joy.id, &joy.ji) != JOYERR_NOERROR ) { + // read error occurred + // turning off the joystick seems too harsh for 1 read error,\ + // but what should be done? + // Com_Printf ("IN_ReadJoystick: no response\n"); + // joy.avail = false; + return; + } + + if ( in_debugJoystick->integer ) { + Com_Printf( "%8x %5i %5.2f %5.2f %5.2f %5.2f %6i %6i\n", + joy.ji.dwButtons, + joy.ji.dwPOV, + JoyToF( joy.ji.dwXpos ), JoyToF( joy.ji.dwYpos ), + JoyToF( joy.ji.dwZpos ), JoyToF( joy.ji.dwRpos ), + JoyToI( joy.ji.dwUpos ), JoyToI( joy.ji.dwVpos ) ); + } + + // loop through the joystick buttons + // key a joystick event or auxillary event for higher number buttons for each state change + buttonstate = joy.ji.dwButtons; + for ( i=0 ; i < joy.jc.wNumButtons ; i++ ) { + if ( (buttonstate & (1<value ) { + povstate |= (1<<(i*2)); + } else if ( fAxisValue > joy_threshold->value ) { + povstate |= (1<<(i*2+1)); + } + } + + // convert POV information from a direction into 4 button bits + if ( joy.jc.wCaps & JOYCAPS_HASPOV ) { + if ( joy.ji.dwPOV != JOY_POVCENTERED ) { + if (joy.ji.dwPOV == JOY_POVFORWARD) + povstate |= 1<<12; + if (joy.ji.dwPOV == JOY_POVBACKWARD) + povstate |= 1<<13; + if (joy.ji.dwPOV == JOY_POVRIGHT) + povstate |= 1<<14; + if (joy.ji.dwPOV == JOY_POVLEFT) + povstate |= 1<<15; + } + } + + // determine which bits have changed and key an auxillary event for each change + for (i=0 ; i < 16 ; i++) { + if ( (povstate & (1<= 6 ) { + x = JoyToI( joy.ji.dwUpos ) * in_joyBallScale->value; + y = JoyToI( joy.ji.dwVpos ) * in_joyBallScale->value; + if ( x || y ) { + Sys_QueEvent( g_wv.sysMsgTime, SE_MOUSE, x, y, 0, NULL ); + } + } +} + +/* +========================================================================= + +MIDI + +========================================================================= +*/ + +static void MIDI_NoteOff( int note ) +{ + int qkey; + + qkey = note - 60 + K_AUX1; + + if ( qkey > 255 || qkey < K_AUX1 ) + return; + + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qfalse, 0, NULL ); +} + +static void MIDI_NoteOn( int note, int velocity ) +{ + int qkey; + + if ( velocity == 0 ) + MIDI_NoteOff( note ); + + qkey = note - 60 + K_AUX1; + + if ( qkey > 255 || qkey < K_AUX1 ) + return; + + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, qkey, qtrue, 0, NULL ); +} + +static void CALLBACK MidiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, + DWORD dwParam1, DWORD dwParam2 ) +{ + int message; + + switch ( uMsg ) + { + case MIM_OPEN: + break; + case MIM_CLOSE: + break; + case MIM_DATA: + message = dwParam1 & 0xff; + + // note on + if ( ( message & 0xf0 ) == 0x90 ) + { + if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) + MIDI_NoteOn( ( dwParam1 & 0xff00 ) >> 8, ( dwParam1 & 0xff0000 ) >> 16 ); + } + else if ( ( message & 0xf0 ) == 0x80 ) + { + if ( ( ( message & 0x0f ) + 1 ) == in_midichannel->integer ) + MIDI_NoteOff( ( dwParam1 & 0xff00 ) >> 8 ); + } + break; + case MIM_LONGDATA: + break; + case MIM_ERROR: + break; + case MIM_LONGERROR: + break; + } + +// Sys_QueEvent( sys_msg_time, SE_KEY, wMsg, qtrue, 0, NULL ); +} + +static void MidiInfo_f( void ) +{ + int i; + + const char *enableStrings[] = { "disabled", "enabled" }; + + Com_Printf( "\nMIDI control: %s\n", enableStrings[in_midi->integer != 0] ); + Com_Printf( "port: %d\n", in_midiport->integer ); + Com_Printf( "channel: %d\n", in_midichannel->integer ); + Com_Printf( "current device: %d\n", in_mididevice->integer ); + Com_Printf( "number of devices: %d\n", s_midiInfo.numDevices ); + for ( i = 0; i < s_midiInfo.numDevices; i++ ) + { + if ( i == Cvar_VariableValue( "in_mididevice" ) ) + Com_Printf( "***" ); + else + Com_Printf( "..." ); + Com_Printf( "device %2d: %s\n", i, s_midiInfo.caps[i].szPname ); + Com_Printf( "...manufacturer ID: 0x%hx\n", s_midiInfo.caps[i].wMid ); + Com_Printf( "...product ID: 0x%hx\n", s_midiInfo.caps[i].wPid ); + + Com_Printf( "\n" ); + } +} + +static void IN_StartupMIDI( void ) +{ + int i; + + if ( !Cvar_VariableValue( "in_midi" ) ) + return; + + // + // enumerate MIDI IN devices + // + s_midiInfo.numDevices = midiInGetNumDevs(); + + for ( i = 0; i < s_midiInfo.numDevices; i++ ) + { + midiInGetDevCaps( i, &s_midiInfo.caps[i], sizeof( s_midiInfo.caps[i] ) ); + } + + // + // open the MIDI IN port + // + if ( midiInOpen( &s_midiInfo.hMidiIn, + in_mididevice->integer, + ( unsigned long ) MidiInProc, + ( unsigned long ) NULL, + CALLBACK_FUNCTION ) != MMSYSERR_NOERROR ) + { + Com_Printf( "WARNING: could not open MIDI device %d: '%s'\n", in_mididevice->integer , s_midiInfo.caps[( int ) in_mididevice->value] ); + return; + } + + midiInStart( s_midiInfo.hMidiIn ); +} + +static void IN_ShutdownMIDI( void ) +{ + if ( s_midiInfo.hMidiIn ) + { + midiInClose( s_midiInfo.hMidiIn ); + } + Com_Memset( &s_midiInfo, 0, sizeof( s_midiInfo ) ); +} + diff --git a/code/win32/win_local.h b/code/win32/win_local.h index 0ac78cf..86d512b 100755 --- a/code/win32/win_local.h +++ b/code/win32/win_local.h @@ -1,95 +1,95 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -// win_local.h: Win32-specific Quake3 header file - -#if defined (_MSC_VER) && (_MSC_VER >= 1200) -#pragma warning(disable : 4201) -#pragma warning( push ) -#endif -#include -#if defined (_MSC_VER) && (_MSC_VER >= 1200) -#pragma warning( pop ) -#endif - -#define DIRECTSOUND_VERSION 0x0300 -#define DIRECTINPUT_VERSION 0x0300 - -#include -#include -#include -#include - -void IN_MouseEvent (int mstate); - -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); - -void Sys_CreateConsole( void ); -void Sys_DestroyConsole( void ); - -char *Sys_ConsoleInput (void); - -qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ); - -// Input subsystem - -void IN_Init (void); -void IN_Shutdown (void); -void IN_JoystickCommands (void); - -void IN_Move (usercmd_t *cmd); -// add additional non keyboard / non mouse movement on top of the keyboard move cmd - -void IN_DeactivateWin32Mouse( void); - -void IN_Activate (qboolean active); -void IN_Frame (void); - -// window procedure -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -void Conbuf_AppendText( const char *msg ); - -void SNDDMA_Activate( void ); -int SNDDMA_InitDS (); - -typedef struct -{ - - HINSTANCE reflib_library; // Handle to refresh DLL - qboolean reflib_active; - - HWND hWnd; - HINSTANCE hInstance; - qboolean activeApp; - qboolean isMinimized; - OSVERSIONINFO osversion; - - // when we get a windows message, we store the time off so keyboard processing - // can know the exact time of an event - unsigned sysMsgTime; -} WinVars_t; - -extern WinVars_t g_wv; +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// win_local.h: Win32-specific Quake3 header file + +#if defined (_MSC_VER) && (_MSC_VER >= 1200) +#pragma warning(disable : 4201) +#pragma warning( push ) +#endif +#include +#if defined (_MSC_VER) && (_MSC_VER >= 1200) +#pragma warning( pop ) +#endif + +#define DIRECTSOUND_VERSION 0x0300 +#define DIRECTINPUT_VERSION 0x0300 + +#include +#include +#include +#include + +void IN_MouseEvent (int mstate); + +void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ); + +void Sys_CreateConsole( void ); +void Sys_DestroyConsole( void ); + +char *Sys_ConsoleInput (void); + +qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ); + +// Input subsystem + +void IN_Init (void); +void IN_Shutdown (void); +void IN_JoystickCommands (void); + +void IN_Move (usercmd_t *cmd); +// add additional non keyboard / non mouse movement on top of the keyboard move cmd + +void IN_DeactivateWin32Mouse( void); + +void IN_Activate (qboolean active); +void IN_Frame (void); + +// window procedure +LONG WINAPI MainWndProc ( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +void Conbuf_AppendText( const char *msg ); + +void SNDDMA_Activate( void ); +int SNDDMA_InitDS (); + +typedef struct +{ + + HINSTANCE reflib_library; // Handle to refresh DLL + qboolean reflib_active; + + HWND hWnd; + HINSTANCE hInstance; + qboolean activeApp; + qboolean isMinimized; + OSVERSIONINFO osversion; + + // when we get a windows message, we store the time off so keyboard processing + // can know the exact time of an event + unsigned sysMsgTime; +} WinVars_t; + +extern WinVars_t g_wv; diff --git a/code/win32/win_main.c b/code/win32/win_main.c index 55c0cea..9131e31 100755 --- a/code/win32/win_main.c +++ b/code/win32/win_main.c @@ -1,1253 +1,1253 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -// win_main.c - -#include "../client/client.h" -#include "../qcommon/qcommon.h" -#include "win_local.h" -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include - -#define CD_BASEDIR "quake3" -#define CD_EXE "quake3.exe" -#define CD_BASEDIR_LINUX "bin\\x86\\glibc-2.1" -#define CD_EXE_LINUX "quake3" -#define MEM_THRESHOLD 96*1024*1024 - -static char sys_cmdline[MAX_STRING_CHARS]; - -// define this to use alternate spanking method -// I found out that the regular way doesn't work on my box for some reason -// see the associated spank.sh script -#define ALT_SPANK -#ifdef ALT_SPANK -#include -#include - -int fh = 0; - -void Spk_Open(char *name) -{ - fh = open( name, O_TRUNC | O_CREAT | O_WRONLY, S_IREAD | S_IWRITE ); -}; - -void Spk_Close() -{ - if (!fh) - return; - - close( fh ); - fh = 0; -} - -void Spk_Printf (const char *text, ...) -{ - va_list argptr; - char buf[32768]; - - if (!fh) - return; - - va_start (argptr,text); - vsprintf (buf, text, argptr); - write(fh, buf, strlen(buf)); - _commit(fh); - va_end (argptr); - -}; -#endif - -/* -================== -Sys_LowPhysicalMemory() -================== -*/ - -qboolean Sys_LowPhysicalMemory() { - MEMORYSTATUS stat; - GlobalMemoryStatus (&stat); - return (stat.dwTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; -} - -/* -================== -Sys_BeginProfiling -================== -*/ -void Sys_BeginProfiling( void ) { - // this is just used on the mac build -} - -/* -============= -Sys_Error - -Show the early console as an error dialog -============= -*/ -void QDECL Sys_Error( const char *error, ... ) { - va_list argptr; - char text[4096]; - MSG msg; - - va_start (argptr, error); - vsprintf (text, error, argptr); - va_end (argptr); - - Conbuf_AppendText( text ); - Conbuf_AppendText( "\n" ); - - Sys_SetErrorText( text ); - Sys_ShowConsole( 1, qtrue ); - - timeEndPeriod( 1 ); - - IN_Shutdown(); - - // wait for the user to quit - while ( 1 ) { - if (!GetMessage (&msg, NULL, 0, 0)) - Com_Quit_f (); - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sys_DestroyConsole(); - - exit (1); -} - -/* -============== -Sys_Quit -============== -*/ -void Sys_Quit( void ) { - timeEndPeriod( 1 ); - IN_Shutdown(); - Sys_DestroyConsole(); - - exit (0); -} - -/* -============== -Sys_Print -============== -*/ -void Sys_Print( const char *msg ) { - Conbuf_AppendText( msg ); -} - - -/* -============== -Sys_Mkdir -============== -*/ -void Sys_Mkdir( const char *path ) { - _mkdir (path); -} - -/* -============== -Sys_Cwd -============== -*/ -char *Sys_Cwd( void ) { - static char cwd[MAX_OSPATH]; - - _getcwd( cwd, sizeof( cwd ) - 1 ); - cwd[MAX_OSPATH-1] = 0; - - return cwd; -} - -/* -============== -Sys_DefaultCDPath -============== -*/ -char *Sys_DefaultCDPath( void ) { - return ""; -} - -/* -============== -Sys_DefaultBasePath -============== -*/ -char *Sys_DefaultBasePath( void ) { - return Sys_Cwd(); -} - -/* -============================================================== - -DIRECTORY SCANNING - -============================================================== -*/ - -#define MAX_FOUND_FILES 0x1000 - -void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **list, int *numfiles ) { - char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; - char filename[MAX_OSPATH]; - int findhandle; - struct _finddata_t findinfo; - - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - return; - } - - if (strlen(subdirs)) { - Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); - } - else { - Com_sprintf( search, sizeof(search), "%s\\*", basedir ); - } - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - return; - } - - do { - if (findinfo.attrib & _A_SUBDIR) { - if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { - if (strlen(subdirs)) { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); - } - else { - Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); - } - Sys_ListFilteredFiles( basedir, newsubdirs, filter, list, numfiles ); - } - } - if ( *numfiles >= MAX_FOUND_FILES - 1 ) { - break; - } - Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); - if (!Com_FilterPath( filter, filename, qfalse )) - continue; - list[ *numfiles ] = CopyString( filename ); - (*numfiles)++; - } while ( _findnext (findhandle, &findinfo) != -1 ); - - _findclose (findhandle); -} - -static qboolean strgtr(const char *s0, const char *s1) { - int l0, l1, i; - - l0 = strlen(s0); - l1 = strlen(s1); - - if (l1 s0[i]) { - return qtrue; - } - if (s1[i] < s0[i]) { - return qfalse; - } - } - return qfalse; -} - -char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { - char search[MAX_OSPATH]; - int nfiles; - char **listCopy; - char *list[MAX_FOUND_FILES]; - struct _finddata_t findinfo; - int findhandle; - int flag; - int i; - - if (filter) { - - nfiles = 0; - Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); - - list[ nfiles ] = 0; - *numfiles = nfiles; - - if (!nfiles) - return NULL; - - listCopy = Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ) ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - return listCopy; - } - - if ( !extension) { - extension = ""; - } - - // passing a slash as extension will find directories - if ( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; - flag = 0; - } else { - flag = _A_SUBDIR; - } - - Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); - - // search - nfiles = 0; - - findhandle = _findfirst (search, &findinfo); - if (findhandle == -1) { - *numfiles = 0; - return NULL; - } - - do { - if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { - if ( nfiles == MAX_FOUND_FILES - 1 ) { - break; - } - list[ nfiles ] = CopyString( findinfo.name ); - nfiles++; - } - } while ( _findnext (findhandle, &findinfo) != -1 ); - - list[ nfiles ] = 0; - - _findclose (findhandle); - - // return a copy of the list - *numfiles = nfiles; - - if ( !nfiles ) { - return NULL; - } - - listCopy = Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ) ); - for ( i = 0 ; i < nfiles ; i++ ) { - listCopy[i] = list[i]; - } - listCopy[i] = NULL; - - do { - flag = 0; - for(i=1; i (5 * 60000)) && !Cvar_VariableIntegerValue( "dedicated" ) - && !Cvar_VariableIntegerValue( "com_blindlyLoadDLLs" ) ) { - if (FS_FileExists(filename)) { - lastWarning = timestamp; - ret = MessageBoxEx( NULL, "You are about to load a .DLL executable that\n" - "has not been verified for use with Quake III Arena.\n" - "This type of file can compromise the security of\n" - "your computer.\n\n" - "Select 'OK' if you choose to load it anyway.", - "Security Warning", MB_OKCANCEL | MB_ICONEXCLAMATION | MB_DEFBUTTON2 | MB_TOPMOST | MB_SETFOREGROUND, - MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ) ); - if( ret != IDOK ) { - return NULL; - } - } - } -#endif - -#ifndef NDEBUG - libHandle = LoadLibrary( filename ); - if (libHandle) - Com_Printf("LoadLibrary '%s' ok\n", filename); - else - Com_Printf("LoadLibrary '%s' failed\n", filename); - if ( !libHandle ) { -#endif - basepath = Cvar_VariableString( "fs_basepath" ); - cdpath = Cvar_VariableString( "fs_cdpath" ); - gamedir = Cvar_VariableString( "fs_game" ); - - fn = FS_BuildOSPath( basepath, gamedir, filename ); - libHandle = LoadLibrary( fn ); -#ifndef NDEBUG - if (libHandle) - Com_Printf("LoadLibrary '%s' ok\n", fn); - else - Com_Printf("LoadLibrary '%s' failed\n", fn); -#endif - - if ( !libHandle ) { - if( cdpath[0] ) { - fn = FS_BuildOSPath( cdpath, gamedir, filename ); - libHandle = LoadLibrary( fn ); -#ifndef NDEBUG - if (libHandle) - Com_Printf("LoadLibrary '%s' ok\n", fn); - else - Com_Printf("LoadLibrary '%s' failed\n", fn); -#endif - } - - if ( !libHandle ) { - return NULL; - } - } -#ifndef NDEBUG - } -#endif - - dllEntry = ( void (QDECL *)( int (QDECL *)( int, ... ) ) )GetProcAddress( libHandle, "dllEntry" ); - *entryPoint = (int (QDECL *)(int,...))GetProcAddress( libHandle, "vmMain" ); - if ( !*entryPoint || !dllEntry ) { - FreeLibrary( libHandle ); - return NULL; - } - dllEntry( systemcalls ); - - if ( libHandle ) Q_strncpyz ( fqpath , filename , MAX_QPATH ) ; // added 7/20/02 by T.Ray - return libHandle; -} - - -/* -======================================================================== - -BACKGROUND FILE STREAMING - -======================================================================== -*/ - -#if 1 - -void Sys_InitStreamThread( void ) { -} - -void Sys_ShutdownStreamThread( void ) { -} - -void Sys_BeginStreamedFile( fileHandle_t f, int readAhead ) { -} - -void Sys_EndStreamedFile( fileHandle_t f ) { -} - -int Sys_StreamedRead( void *buffer, int size, int count, fileHandle_t f ) { - return FS_Read( buffer, size * count, f ); -} - -void Sys_StreamSeek( fileHandle_t f, int offset, int origin ) { - FS_Seek( f, offset, origin ); -} - - -#else - -typedef struct { - fileHandle_t file; - byte *buffer; - qboolean eof; - qboolean active; - int bufferSize; - int streamPosition; // next byte to be returned by Sys_StreamRead - int threadPosition; // next byte to be read from file -} streamsIO_t; - -typedef struct { - HANDLE threadHandle; - int threadId; - CRITICAL_SECTION crit; - streamsIO_t sIO[MAX_FILE_HANDLES]; -} streamState_t; - -streamState_t stream; - -/* -=============== -Sys_StreamThread - -A thread will be sitting in this loop forever -================ -*/ -void Sys_StreamThread( void ) { - int buffer; - int count; - int readCount; - int bufferPoint; - int r, i; - - while (1) { - Sleep( 10 ); -// EnterCriticalSection (&stream.crit); - - for (i=1;i 0 ) { - available = stream.sIO[f].threadPosition - stream.sIO[f].streamPosition; - if ( !available ) { - if ( stream.sIO[f].eof ) { - break; - } - if ( sleepCount == 1 ) { - Com_DPrintf( "Sys_StreamedRead: waiting\n" ); - } - if ( ++sleepCount > 100 ) { - Com_Error( ERR_FATAL, "Sys_StreamedRead: thread has died"); - } - Sleep( 10 ); - continue; - } - - EnterCriticalSection( &stream.crit ); - - bufferPoint = stream.sIO[f].streamPosition % stream.sIO[f].bufferSize; - bufferCount = stream.sIO[f].bufferSize - bufferPoint; - - copy = available < bufferCount ? available : bufferCount; - if ( copy > remaining ) { - copy = remaining; - } - memcpy( dest, stream.sIO[f].buffer + bufferPoint, copy ); - stream.sIO[f].streamPosition += copy; - dest += copy; - remaining -= copy; - - LeaveCriticalSection( &stream.crit ); - } - - return (count * size - remaining) / size; -} - -/* -=============== -Sys_StreamSeek - -================ -*/ -void Sys_StreamSeek( fileHandle_t f, int offset, int origin ) { - - // halt the thread - EnterCriticalSection( &stream.crit ); - - // clear to that point - FS_Seek( f, offset, origin ); - stream.sIO[f].streamPosition = 0; - stream.sIO[f].threadPosition = 0; - stream.sIO[f].eof = qfalse; - - // let the thread start running at the new position - LeaveCriticalSection( &stream.crit ); -} - -#endif - -/* -======================================================================== - -EVENT LOOP - -======================================================================== -*/ - -#define MAX_QUED_EVENTS 256 -#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) - -sysEvent_t eventQue[MAX_QUED_EVENTS]; -int eventHead, eventTail; -byte sys_packetReceived[MAX_MSGLEN]; - -/* -================ -Sys_QueEvent - -A time of 0 will get the current time -Ptr should either be null, or point to a block of data that can -be freed by the game later. -================ -*/ -void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { - sysEvent_t *ev; - - ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; - if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { - Com_Printf("Sys_QueEvent: overflow\n"); - // we are discarding an event, but don't leak memory - if ( ev->evPtr ) { - Z_Free( ev->evPtr ); - } - eventTail++; - } - - eventHead++; - - if ( time == 0 ) { - time = Sys_Milliseconds(); - } - - ev->evTime = time; - ev->evType = type; - ev->evValue = value; - ev->evValue2 = value2; - ev->evPtrLength = ptrLength; - ev->evPtr = ptr; -} - -/* -================ -Sys_GetEvent - -================ -*/ -sysEvent_t Sys_GetEvent( void ) { - MSG msg; - sysEvent_t ev; - char *s; - msg_t netmsg; - netadr_t adr; - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // pump the message loop - while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { - if ( !GetMessage (&msg, NULL, 0, 0) ) { - Com_Quit_f(); - } - - // save the msg time, because wndprocs don't have access to the timestamp - g_wv.sysMsgTime = msg.time; - - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - // check for console commands - s = Sys_ConsoleInput(); - if ( s ) { - char *b; - int len; - - len = strlen( s ) + 1; - b = Z_Malloc( len ); - Q_strncpyz( b, s, len-1 ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); - } - - // check for network packets - MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); - if ( Sys_GetPacket ( &adr, &netmsg ) ) { - netadr_t *buf; - int len; - - // copy out to a seperate buffer for qeueing - // the readcount stepahead is for SOCKS support - len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount; - buf = Z_Malloc( len ); - *buf = adr; - memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount ); - Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); - } - - // return if we have data - if ( eventHead > eventTail ) { - eventTail++; - return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; - } - - // create an empty event to return - - memset( &ev, 0, sizeof( ev ) ); - ev.evTime = timeGetTime(); - - return ev; -} - -//================================================================ - -/* -================= -Sys_In_Restart_f - -Restart the input subsystem -================= -*/ -void Sys_In_Restart_f( void ) { - IN_Shutdown(); - IN_Init(); -} - - -/* -================= -Sys_Net_Restart_f - -Restart the network subsystem -================= -*/ -void Sys_Net_Restart_f( void ) { - NET_Restart(); -} - - -/* -================ -Sys_Init - -Called after the common systems (cvars, files, etc) -are initialized -================ -*/ -#define OSR2_BUILD_NUMBER 1111 -#define WIN98_BUILD_NUMBER 1998 - -void Sys_Init( void ) { - int cpuid; - - // make sure the timer is high precision, otherwise - // NT gets 18ms resolution - timeBeginPeriod( 1 ); - - Cmd_AddCommand ("in_restart", Sys_In_Restart_f); - Cmd_AddCommand ("net_restart", Sys_Net_Restart_f); - - g_wv.osversion.dwOSVersionInfoSize = sizeof( g_wv.osversion ); - - if (!GetVersionEx (&g_wv.osversion)) - Sys_Error ("Couldn't get OS info"); - - if (g_wv.osversion.dwMajorVersion < 4) - Sys_Error ("Quake3 requires Windows version 4 or greater"); - if (g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32s) - Sys_Error ("Quake3 doesn't run on Win32s"); - - if ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) - { - Cvar_Set( "arch", "winnt" ); - } - else if ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) - { - if ( LOWORD( g_wv.osversion.dwBuildNumber ) >= WIN98_BUILD_NUMBER ) - { - Cvar_Set( "arch", "win98" ); - } - else if ( LOWORD( g_wv.osversion.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) - { - Cvar_Set( "arch", "win95 osr2.x" ); - } - else - { - Cvar_Set( "arch", "win95" ); - } - } - else - { - Cvar_Set( "arch", "unknown Windows variant" ); - } - - // save out a couple things in rom cvars for the renderer to access - Cvar_Get( "win_hinstance", va("%i", (int)g_wv.hInstance), CVAR_ROM ); - Cvar_Get( "win_wndproc", va("%i", (int)MainWndProc), CVAR_ROM ); - - // - // figure out our CPU - // - Cvar_Get( "sys_cpustring", "detect", 0 ); - if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring"), "detect" ) ) - { - Com_Printf( "...detecting CPU, found " ); - - cpuid = Sys_GetProcessorId(); - - switch ( cpuid ) - { - case CPUID_GENERIC: - Cvar_Set( "sys_cpustring", "generic" ); - break; - case CPUID_INTEL_UNSUPPORTED: - Cvar_Set( "sys_cpustring", "x86 (pre-Pentium)" ); - break; - case CPUID_INTEL_PENTIUM: - Cvar_Set( "sys_cpustring", "x86 (P5/PPro, non-MMX)" ); - break; - case CPUID_INTEL_MMX: - Cvar_Set( "sys_cpustring", "x86 (P5/Pentium2, MMX)" ); - break; - case CPUID_INTEL_KATMAI: - Cvar_Set( "sys_cpustring", "Intel Pentium III" ); - break; - case CPUID_AMD_3DNOW: - Cvar_Set( "sys_cpustring", "AMD w/ 3DNow!" ); - break; - case CPUID_AXP: - Cvar_Set( "sys_cpustring", "Alpha AXP" ); - break; - default: - Com_Error( ERR_FATAL, "Unknown cpu type %d\n", cpuid ); - break; - } - } - else - { - Com_Printf( "...forcing CPU type to " ); - if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "generic" ) ) - { - cpuid = CPUID_GENERIC; - } - else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "x87" ) ) - { - cpuid = CPUID_INTEL_PENTIUM; - } - else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "mmx" ) ) - { - cpuid = CPUID_INTEL_MMX; - } - else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "3dnow" ) ) - { - cpuid = CPUID_AMD_3DNOW; - } - else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "PentiumIII" ) ) - { - cpuid = CPUID_INTEL_KATMAI; - } - else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "axp" ) ) - { - cpuid = CPUID_AXP; - } - else - { - Com_Printf( "WARNING: unknown sys_cpustring '%s'\n", Cvar_VariableString( "sys_cpustring" ) ); - cpuid = CPUID_GENERIC; - } - } - Cvar_SetValue( "sys_cpuid", cpuid ); - Com_Printf( "%s\n", Cvar_VariableString( "sys_cpustring" ) ); - - Cvar_Set( "username", Sys_GetCurrentUser() ); - - IN_Init(); // FIXME: not in dedicated? -} - - -//======================================================================= - -int totalMsec, countMsec; - -/* -================== -WinMain - -================== -*/ -int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - char cwd[MAX_OSPATH]; - int startTime, endTime; - - // should never get a previous instance in Win32 - if ( hPrevInstance ) { - return 0; - } - - g_wv.hInstance = hInstance; - Q_strncpyz( sys_cmdline, lpCmdLine, sizeof( sys_cmdline ) ); - - // done before Com/Sys_Init since we need this for error output - Sys_CreateConsole(); - - // no abort/retry/fail errors - SetErrorMode( SEM_FAILCRITICALERRORS ); - - // get the initial time base - Sys_Milliseconds(); -#if 0 - // if we find the CD, add a +set cddir xxx command line - Sys_ScanForCD(); -#endif - - Sys_InitStreamThread(); - - Com_Init( sys_cmdline ); - NET_Init(); - - _getcwd (cwd, sizeof(cwd)); - Com_Printf("Working directory: %s\n", cwd); - - // hide the early console since we've reached the point where we - // have a working graphics subsystems - if ( !com_dedicated->integer && !com_viewlog->integer ) { - Sys_ShowConsole( 0, qfalse ); - } - - // main game loop - while( 1 ) { - // if not running as a game client, sleep a bit - if ( g_wv.isMinimized || ( com_dedicated && com_dedicated->integer ) ) { - Sleep( 5 ); - } - - // set low precision every frame, because some system calls - // reset it arbitrarily -// _controlfp( _PC_24, _MCW_PC ); -// _controlfp( -1, _MCW_EM ); // no exceptions, even if some crappy - // syscall turns them back on! - - startTime = Sys_Milliseconds(); - - // make sure mouse and joystick are only called once a frame - IN_Frame(); - - // run the game - Com_Frame(); - - endTime = Sys_Milliseconds(); - totalMsec += endTime - startTime; - countMsec++; - } - - // never gets here -} - - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// win_main.c + +#include "../client/client.h" +#include "../qcommon/qcommon.h" +#include "win_local.h" +#include "resource.h" +#include +#include +#include +#include +#include +#include +#include + +#define CD_BASEDIR "quake3" +#define CD_EXE "quake3.exe" +#define CD_BASEDIR_LINUX "bin\\x86\\glibc-2.1" +#define CD_EXE_LINUX "quake3" +#define MEM_THRESHOLD 96*1024*1024 + +static char sys_cmdline[MAX_STRING_CHARS]; + +// define this to use alternate spanking method +// I found out that the regular way doesn't work on my box for some reason +// see the associated spank.sh script +#define ALT_SPANK +#ifdef ALT_SPANK +#include +#include + +int fh = 0; + +void Spk_Open(char *name) +{ + fh = open( name, O_TRUNC | O_CREAT | O_WRONLY, S_IREAD | S_IWRITE ); +}; + +void Spk_Close() +{ + if (!fh) + return; + + close( fh ); + fh = 0; +} + +void Spk_Printf (const char *text, ...) +{ + va_list argptr; + char buf[32768]; + + if (!fh) + return; + + va_start (argptr,text); + vsprintf (buf, text, argptr); + write(fh, buf, strlen(buf)); + _commit(fh); + va_end (argptr); + +}; +#endif + +/* +================== +Sys_LowPhysicalMemory() +================== +*/ + +qboolean Sys_LowPhysicalMemory() { + MEMORYSTATUS stat; + GlobalMemoryStatus (&stat); + return (stat.dwTotalPhys <= MEM_THRESHOLD) ? qtrue : qfalse; +} + +/* +================== +Sys_BeginProfiling +================== +*/ +void Sys_BeginProfiling( void ) { + // this is just used on the mac build +} + +/* +============= +Sys_Error + +Show the early console as an error dialog +============= +*/ +void QDECL Sys_Error( const char *error, ... ) { + va_list argptr; + char text[4096]; + MSG msg; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + Conbuf_AppendText( text ); + Conbuf_AppendText( "\n" ); + + Sys_SetErrorText( text ); + Sys_ShowConsole( 1, qtrue ); + + timeEndPeriod( 1 ); + + IN_Shutdown(); + + // wait for the user to quit + while ( 1 ) { + if (!GetMessage (&msg, NULL, 0, 0)) + Com_Quit_f (); + TranslateMessage (&msg); + DispatchMessage (&msg); + } + + Sys_DestroyConsole(); + + exit (1); +} + +/* +============== +Sys_Quit +============== +*/ +void Sys_Quit( void ) { + timeEndPeriod( 1 ); + IN_Shutdown(); + Sys_DestroyConsole(); + + exit (0); +} + +/* +============== +Sys_Print +============== +*/ +void Sys_Print( const char *msg ) { + Conbuf_AppendText( msg ); +} + + +/* +============== +Sys_Mkdir +============== +*/ +void Sys_Mkdir( const char *path ) { + _mkdir (path); +} + +/* +============== +Sys_Cwd +============== +*/ +char *Sys_Cwd( void ) { + static char cwd[MAX_OSPATH]; + + _getcwd( cwd, sizeof( cwd ) - 1 ); + cwd[MAX_OSPATH-1] = 0; + + return cwd; +} + +/* +============== +Sys_DefaultCDPath +============== +*/ +char *Sys_DefaultCDPath( void ) { + return ""; +} + +/* +============== +Sys_DefaultBasePath +============== +*/ +char *Sys_DefaultBasePath( void ) { + return Sys_Cwd(); +} + +/* +============================================================== + +DIRECTORY SCANNING + +============================================================== +*/ + +#define MAX_FOUND_FILES 0x1000 + +void Sys_ListFilteredFiles( const char *basedir, char *subdirs, char *filter, char **list, int *numfiles ) { + char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; + char filename[MAX_OSPATH]; + int findhandle; + struct _finddata_t findinfo; + + if ( *numfiles >= MAX_FOUND_FILES - 1 ) { + return; + } + + if (strlen(subdirs)) { + Com_sprintf( search, sizeof(search), "%s\\%s\\*", basedir, subdirs ); + } + else { + Com_sprintf( search, sizeof(search), "%s\\*", basedir ); + } + + findhandle = _findfirst (search, &findinfo); + if (findhandle == -1) { + return; + } + + do { + if (findinfo.attrib & _A_SUBDIR) { + if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { + if (strlen(subdirs)) { + Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); + } + else { + Com_sprintf( newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); + } + Sys_ListFilteredFiles( basedir, newsubdirs, filter, list, numfiles ); + } + } + if ( *numfiles >= MAX_FOUND_FILES - 1 ) { + break; + } + Com_sprintf( filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name ); + if (!Com_FilterPath( filter, filename, qfalse )) + continue; + list[ *numfiles ] = CopyString( filename ); + (*numfiles)++; + } while ( _findnext (findhandle, &findinfo) != -1 ); + + _findclose (findhandle); +} + +static qboolean strgtr(const char *s0, const char *s1) { + int l0, l1, i; + + l0 = strlen(s0); + l1 = strlen(s1); + + if (l1 s0[i]) { + return qtrue; + } + if (s1[i] < s0[i]) { + return qfalse; + } + } + return qfalse; +} + +char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs ) { + char search[MAX_OSPATH]; + int nfiles; + char **listCopy; + char *list[MAX_FOUND_FILES]; + struct _finddata_t findinfo; + int findhandle; + int flag; + int i; + + if (filter) { + + nfiles = 0; + Sys_ListFilteredFiles( directory, "", filter, list, &nfiles ); + + list[ nfiles ] = 0; + *numfiles = nfiles; + + if (!nfiles) + return NULL; + + listCopy = Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ) ); + for ( i = 0 ; i < nfiles ; i++ ) { + listCopy[i] = list[i]; + } + listCopy[i] = NULL; + + return listCopy; + } + + if ( !extension) { + extension = ""; + } + + // passing a slash as extension will find directories + if ( extension[0] == '/' && extension[1] == 0 ) { + extension = ""; + flag = 0; + } else { + flag = _A_SUBDIR; + } + + Com_sprintf( search, sizeof(search), "%s\\*%s", directory, extension ); + + // search + nfiles = 0; + + findhandle = _findfirst (search, &findinfo); + if (findhandle == -1) { + *numfiles = 0; + return NULL; + } + + do { + if ( (!wantsubs && flag ^ ( findinfo.attrib & _A_SUBDIR )) || (wantsubs && findinfo.attrib & _A_SUBDIR) ) { + if ( nfiles == MAX_FOUND_FILES - 1 ) { + break; + } + list[ nfiles ] = CopyString( findinfo.name ); + nfiles++; + } + } while ( _findnext (findhandle, &findinfo) != -1 ); + + list[ nfiles ] = 0; + + _findclose (findhandle); + + // return a copy of the list + *numfiles = nfiles; + + if ( !nfiles ) { + return NULL; + } + + listCopy = Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ) ); + for ( i = 0 ; i < nfiles ; i++ ) { + listCopy[i] = list[i]; + } + listCopy[i] = NULL; + + do { + flag = 0; + for(i=1; i (5 * 60000)) && !Cvar_VariableIntegerValue( "dedicated" ) + && !Cvar_VariableIntegerValue( "com_blindlyLoadDLLs" ) ) { + if (FS_FileExists(filename)) { + lastWarning = timestamp; + ret = MessageBoxEx( NULL, "You are about to load a .DLL executable that\n" + "has not been verified for use with Quake III Arena.\n" + "This type of file can compromise the security of\n" + "your computer.\n\n" + "Select 'OK' if you choose to load it anyway.", + "Security Warning", MB_OKCANCEL | MB_ICONEXCLAMATION | MB_DEFBUTTON2 | MB_TOPMOST | MB_SETFOREGROUND, + MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ) ); + if( ret != IDOK ) { + return NULL; + } + } + } +#endif + +#ifndef NDEBUG + libHandle = LoadLibrary( filename ); + if (libHandle) + Com_Printf("LoadLibrary '%s' ok\n", filename); + else + Com_Printf("LoadLibrary '%s' failed\n", filename); + if ( !libHandle ) { +#endif + basepath = Cvar_VariableString( "fs_basepath" ); + cdpath = Cvar_VariableString( "fs_cdpath" ); + gamedir = Cvar_VariableString( "fs_game" ); + + fn = FS_BuildOSPath( basepath, gamedir, filename ); + libHandle = LoadLibrary( fn ); +#ifndef NDEBUG + if (libHandle) + Com_Printf("LoadLibrary '%s' ok\n", fn); + else + Com_Printf("LoadLibrary '%s' failed\n", fn); +#endif + + if ( !libHandle ) { + if( cdpath[0] ) { + fn = FS_BuildOSPath( cdpath, gamedir, filename ); + libHandle = LoadLibrary( fn ); +#ifndef NDEBUG + if (libHandle) + Com_Printf("LoadLibrary '%s' ok\n", fn); + else + Com_Printf("LoadLibrary '%s' failed\n", fn); +#endif + } + + if ( !libHandle ) { + return NULL; + } + } +#ifndef NDEBUG + } +#endif + + dllEntry = ( void (QDECL *)( int (QDECL *)( int, ... ) ) )GetProcAddress( libHandle, "dllEntry" ); + *entryPoint = (int (QDECL *)(int,...))GetProcAddress( libHandle, "vmMain" ); + if ( !*entryPoint || !dllEntry ) { + FreeLibrary( libHandle ); + return NULL; + } + dllEntry( systemcalls ); + + if ( libHandle ) Q_strncpyz ( fqpath , filename , MAX_QPATH ) ; // added 7/20/02 by T.Ray + return libHandle; +} + + +/* +======================================================================== + +BACKGROUND FILE STREAMING + +======================================================================== +*/ + +#if 1 + +void Sys_InitStreamThread( void ) { +} + +void Sys_ShutdownStreamThread( void ) { +} + +void Sys_BeginStreamedFile( fileHandle_t f, int readAhead ) { +} + +void Sys_EndStreamedFile( fileHandle_t f ) { +} + +int Sys_StreamedRead( void *buffer, int size, int count, fileHandle_t f ) { + return FS_Read( buffer, size * count, f ); +} + +void Sys_StreamSeek( fileHandle_t f, int offset, int origin ) { + FS_Seek( f, offset, origin ); +} + + +#else + +typedef struct { + fileHandle_t file; + byte *buffer; + qboolean eof; + qboolean active; + int bufferSize; + int streamPosition; // next byte to be returned by Sys_StreamRead + int threadPosition; // next byte to be read from file +} streamsIO_t; + +typedef struct { + HANDLE threadHandle; + int threadId; + CRITICAL_SECTION crit; + streamsIO_t sIO[MAX_FILE_HANDLES]; +} streamState_t; + +streamState_t stream; + +/* +=============== +Sys_StreamThread + +A thread will be sitting in this loop forever +================ +*/ +void Sys_StreamThread( void ) { + int buffer; + int count; + int readCount; + int bufferPoint; + int r, i; + + while (1) { + Sleep( 10 ); +// EnterCriticalSection (&stream.crit); + + for (i=1;i 0 ) { + available = stream.sIO[f].threadPosition - stream.sIO[f].streamPosition; + if ( !available ) { + if ( stream.sIO[f].eof ) { + break; + } + if ( sleepCount == 1 ) { + Com_DPrintf( "Sys_StreamedRead: waiting\n" ); + } + if ( ++sleepCount > 100 ) { + Com_Error( ERR_FATAL, "Sys_StreamedRead: thread has died"); + } + Sleep( 10 ); + continue; + } + + EnterCriticalSection( &stream.crit ); + + bufferPoint = stream.sIO[f].streamPosition % stream.sIO[f].bufferSize; + bufferCount = stream.sIO[f].bufferSize - bufferPoint; + + copy = available < bufferCount ? available : bufferCount; + if ( copy > remaining ) { + copy = remaining; + } + memcpy( dest, stream.sIO[f].buffer + bufferPoint, copy ); + stream.sIO[f].streamPosition += copy; + dest += copy; + remaining -= copy; + + LeaveCriticalSection( &stream.crit ); + } + + return (count * size - remaining) / size; +} + +/* +=============== +Sys_StreamSeek + +================ +*/ +void Sys_StreamSeek( fileHandle_t f, int offset, int origin ) { + + // halt the thread + EnterCriticalSection( &stream.crit ); + + // clear to that point + FS_Seek( f, offset, origin ); + stream.sIO[f].streamPosition = 0; + stream.sIO[f].threadPosition = 0; + stream.sIO[f].eof = qfalse; + + // let the thread start running at the new position + LeaveCriticalSection( &stream.crit ); +} + +#endif + +/* +======================================================================== + +EVENT LOOP + +======================================================================== +*/ + +#define MAX_QUED_EVENTS 256 +#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 ) + +sysEvent_t eventQue[MAX_QUED_EVENTS]; +int eventHead, eventTail; +byte sys_packetReceived[MAX_MSGLEN]; + +/* +================ +Sys_QueEvent + +A time of 0 will get the current time +Ptr should either be null, or point to a block of data that can +be freed by the game later. +================ +*/ +void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) { + sysEvent_t *ev; + + ev = &eventQue[ eventHead & MASK_QUED_EVENTS ]; + if ( eventHead - eventTail >= MAX_QUED_EVENTS ) { + Com_Printf("Sys_QueEvent: overflow\n"); + // we are discarding an event, but don't leak memory + if ( ev->evPtr ) { + Z_Free( ev->evPtr ); + } + eventTail++; + } + + eventHead++; + + if ( time == 0 ) { + time = Sys_Milliseconds(); + } + + ev->evTime = time; + ev->evType = type; + ev->evValue = value; + ev->evValue2 = value2; + ev->evPtrLength = ptrLength; + ev->evPtr = ptr; +} + +/* +================ +Sys_GetEvent + +================ +*/ +sysEvent_t Sys_GetEvent( void ) { + MSG msg; + sysEvent_t ev; + char *s; + msg_t netmsg; + netadr_t adr; + + // return if we have data + if ( eventHead > eventTail ) { + eventTail++; + return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; + } + + // pump the message loop + while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { + if ( !GetMessage (&msg, NULL, 0, 0) ) { + Com_Quit_f(); + } + + // save the msg time, because wndprocs don't have access to the timestamp + g_wv.sysMsgTime = msg.time; + + TranslateMessage (&msg); + DispatchMessage (&msg); + } + + // check for console commands + s = Sys_ConsoleInput(); + if ( s ) { + char *b; + int len; + + len = strlen( s ) + 1; + b = Z_Malloc( len ); + Q_strncpyz( b, s, len-1 ); + Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b ); + } + + // check for network packets + MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) ); + if ( Sys_GetPacket ( &adr, &netmsg ) ) { + netadr_t *buf; + int len; + + // copy out to a seperate buffer for qeueing + // the readcount stepahead is for SOCKS support + len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount; + buf = Z_Malloc( len ); + *buf = adr; + memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount ); + Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf ); + } + + // return if we have data + if ( eventHead > eventTail ) { + eventTail++; + return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ]; + } + + // create an empty event to return + + memset( &ev, 0, sizeof( ev ) ); + ev.evTime = timeGetTime(); + + return ev; +} + +//================================================================ + +/* +================= +Sys_In_Restart_f + +Restart the input subsystem +================= +*/ +void Sys_In_Restart_f( void ) { + IN_Shutdown(); + IN_Init(); +} + + +/* +================= +Sys_Net_Restart_f + +Restart the network subsystem +================= +*/ +void Sys_Net_Restart_f( void ) { + NET_Restart(); +} + + +/* +================ +Sys_Init + +Called after the common systems (cvars, files, etc) +are initialized +================ +*/ +#define OSR2_BUILD_NUMBER 1111 +#define WIN98_BUILD_NUMBER 1998 + +void Sys_Init( void ) { + int cpuid; + + // make sure the timer is high precision, otherwise + // NT gets 18ms resolution + timeBeginPeriod( 1 ); + + Cmd_AddCommand ("in_restart", Sys_In_Restart_f); + Cmd_AddCommand ("net_restart", Sys_Net_Restart_f); + + g_wv.osversion.dwOSVersionInfoSize = sizeof( g_wv.osversion ); + + if (!GetVersionEx (&g_wv.osversion)) + Sys_Error ("Couldn't get OS info"); + + if (g_wv.osversion.dwMajorVersion < 4) + Sys_Error ("Quake3 requires Windows version 4 or greater"); + if (g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32s) + Sys_Error ("Quake3 doesn't run on Win32s"); + + if ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) + { + Cvar_Set( "arch", "winnt" ); + } + else if ( g_wv.osversion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) + { + if ( LOWORD( g_wv.osversion.dwBuildNumber ) >= WIN98_BUILD_NUMBER ) + { + Cvar_Set( "arch", "win98" ); + } + else if ( LOWORD( g_wv.osversion.dwBuildNumber ) >= OSR2_BUILD_NUMBER ) + { + Cvar_Set( "arch", "win95 osr2.x" ); + } + else + { + Cvar_Set( "arch", "win95" ); + } + } + else + { + Cvar_Set( "arch", "unknown Windows variant" ); + } + + // save out a couple things in rom cvars for the renderer to access + Cvar_Get( "win_hinstance", va("%i", (int)g_wv.hInstance), CVAR_ROM ); + Cvar_Get( "win_wndproc", va("%i", (int)MainWndProc), CVAR_ROM ); + + // + // figure out our CPU + // + Cvar_Get( "sys_cpustring", "detect", 0 ); + if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring"), "detect" ) ) + { + Com_Printf( "...detecting CPU, found " ); + + cpuid = Sys_GetProcessorId(); + + switch ( cpuid ) + { + case CPUID_GENERIC: + Cvar_Set( "sys_cpustring", "generic" ); + break; + case CPUID_INTEL_UNSUPPORTED: + Cvar_Set( "sys_cpustring", "x86 (pre-Pentium)" ); + break; + case CPUID_INTEL_PENTIUM: + Cvar_Set( "sys_cpustring", "x86 (P5/PPro, non-MMX)" ); + break; + case CPUID_INTEL_MMX: + Cvar_Set( "sys_cpustring", "x86 (P5/Pentium2, MMX)" ); + break; + case CPUID_INTEL_KATMAI: + Cvar_Set( "sys_cpustring", "Intel Pentium III" ); + break; + case CPUID_AMD_3DNOW: + Cvar_Set( "sys_cpustring", "AMD w/ 3DNow!" ); + break; + case CPUID_AXP: + Cvar_Set( "sys_cpustring", "Alpha AXP" ); + break; + default: + Com_Error( ERR_FATAL, "Unknown cpu type %d\n", cpuid ); + break; + } + } + else + { + Com_Printf( "...forcing CPU type to " ); + if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "generic" ) ) + { + cpuid = CPUID_GENERIC; + } + else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "x87" ) ) + { + cpuid = CPUID_INTEL_PENTIUM; + } + else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "mmx" ) ) + { + cpuid = CPUID_INTEL_MMX; + } + else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "3dnow" ) ) + { + cpuid = CPUID_AMD_3DNOW; + } + else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "PentiumIII" ) ) + { + cpuid = CPUID_INTEL_KATMAI; + } + else if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring" ), "axp" ) ) + { + cpuid = CPUID_AXP; + } + else + { + Com_Printf( "WARNING: unknown sys_cpustring '%s'\n", Cvar_VariableString( "sys_cpustring" ) ); + cpuid = CPUID_GENERIC; + } + } + Cvar_SetValue( "sys_cpuid", cpuid ); + Com_Printf( "%s\n", Cvar_VariableString( "sys_cpustring" ) ); + + Cvar_Set( "username", Sys_GetCurrentUser() ); + + IN_Init(); // FIXME: not in dedicated? +} + + +//======================================================================= + +int totalMsec, countMsec; + +/* +================== +WinMain + +================== +*/ +int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + char cwd[MAX_OSPATH]; + int startTime, endTime; + + // should never get a previous instance in Win32 + if ( hPrevInstance ) { + return 0; + } + + g_wv.hInstance = hInstance; + Q_strncpyz( sys_cmdline, lpCmdLine, sizeof( sys_cmdline ) ); + + // done before Com/Sys_Init since we need this for error output + Sys_CreateConsole(); + + // no abort/retry/fail errors + SetErrorMode( SEM_FAILCRITICALERRORS ); + + // get the initial time base + Sys_Milliseconds(); +#if 0 + // if we find the CD, add a +set cddir xxx command line + Sys_ScanForCD(); +#endif + + Sys_InitStreamThread(); + + Com_Init( sys_cmdline ); + NET_Init(); + + _getcwd (cwd, sizeof(cwd)); + Com_Printf("Working directory: %s\n", cwd); + + // hide the early console since we've reached the point where we + // have a working graphics subsystems + if ( !com_dedicated->integer && !com_viewlog->integer ) { + Sys_ShowConsole( 0, qfalse ); + } + + // main game loop + while( 1 ) { + // if not running as a game client, sleep a bit + if ( g_wv.isMinimized || ( com_dedicated && com_dedicated->integer ) ) { + Sleep( 5 ); + } + + // set low precision every frame, because some system calls + // reset it arbitrarily +// _controlfp( _PC_24, _MCW_PC ); +// _controlfp( -1, _MCW_EM ); // no exceptions, even if some crappy + // syscall turns them back on! + + startTime = Sys_Milliseconds(); + + // make sure mouse and joystick are only called once a frame + IN_Frame(); + + // run the game + Com_Frame(); + + endTime = Sys_Milliseconds(); + totalMsec += endTime - startTime; + countMsec++; + } + + // never gets here +} + + diff --git a/code/win32/win_net.c b/code/win32/win_net.c index c58ea21..42c08ee 100755 --- a/code/win32/win_net.c +++ b/code/win32/win_net.c @@ -1,1031 +1,1031 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -// net_wins.c - -#include "../game/q_shared.h" -#include "../qcommon/qcommon.h" -#include "win_local.h" - -static WSADATA winsockdata; -static qboolean winsockInitialized = qfalse; -static qboolean usingSocks = qfalse; -static qboolean networkingEnabled = qfalse; - -static cvar_t *net_noudp; -static cvar_t *net_noipx; - -static cvar_t *net_socksEnabled; -static cvar_t *net_socksServer; -static cvar_t *net_socksPort; -static cvar_t *net_socksUsername; -static cvar_t *net_socksPassword; -static struct sockaddr socksRelayAddr; - -static SOCKET ip_socket; -static SOCKET socks_socket; -static SOCKET ipx_socket; - -#define MAX_IPS 16 -static int numIP; -static byte localIP[MAX_IPS][4]; - -//============================================================================= - - -/* -==================== -NET_ErrorString -==================== -*/ -char *NET_ErrorString( void ) { - int code; - - code = WSAGetLastError(); - switch( code ) { - case WSAEINTR: return "WSAEINTR"; - case WSAEBADF: return "WSAEBADF"; - case WSAEACCES: return "WSAEACCES"; - case WSAEDISCON: return "WSAEDISCON"; - case WSAEFAULT: return "WSAEFAULT"; - case WSAEINVAL: return "WSAEINVAL"; - case WSAEMFILE: return "WSAEMFILE"; - case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK"; - case WSAEINPROGRESS: return "WSAEINPROGRESS"; - case WSAEALREADY: return "WSAEALREADY"; - case WSAENOTSOCK: return "WSAENOTSOCK"; - case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ"; - case WSAEMSGSIZE: return "WSAEMSGSIZE"; - case WSAEPROTOTYPE: return "WSAEPROTOTYPE"; - case WSAENOPROTOOPT: return "WSAENOPROTOOPT"; - case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT"; - case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT"; - case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP"; - case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT"; - case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT"; - case WSAEADDRINUSE: return "WSAEADDRINUSE"; - case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL"; - case WSAENETDOWN: return "WSAENETDOWN"; - case WSAENETUNREACH: return "WSAENETUNREACH"; - case WSAENETRESET: return "WSAENETRESET"; - case WSAECONNABORTED: return "WSWSAECONNABORTEDAEINTR"; - case WSAECONNRESET: return "WSAECONNRESET"; - case WSAENOBUFS: return "WSAENOBUFS"; - case WSAEISCONN: return "WSAEISCONN"; - case WSAENOTCONN: return "WSAENOTCONN"; - case WSAESHUTDOWN: return "WSAESHUTDOWN"; - case WSAETOOMANYREFS: return "WSAETOOMANYREFS"; - case WSAETIMEDOUT: return "WSAETIMEDOUT"; - case WSAECONNREFUSED: return "WSAECONNREFUSED"; - case WSAELOOP: return "WSAELOOP"; - case WSAENAMETOOLONG: return "WSAENAMETOOLONG"; - case WSAEHOSTDOWN: return "WSAEHOSTDOWN"; - case WSASYSNOTREADY: return "WSASYSNOTREADY"; - case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED"; - case WSANOTINITIALISED: return "WSANOTINITIALISED"; - case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND"; - case WSATRY_AGAIN: return "WSATRY_AGAIN"; - case WSANO_RECOVERY: return "WSANO_RECOVERY"; - case WSANO_DATA: return "WSANO_DATA"; - default: return "NO ERROR"; - } -} - -void NetadrToSockadr( netadr_t *a, struct sockaddr *s ) { - memset( s, 0, sizeof(*s) ); - - if( a->type == NA_BROADCAST ) { - ((struct sockaddr_in *)s)->sin_family = AF_INET; - ((struct sockaddr_in *)s)->sin_port = a->port; - ((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST; - } - else if( a->type == NA_IP ) { - ((struct sockaddr_in *)s)->sin_family = AF_INET; - ((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip; - ((struct sockaddr_in *)s)->sin_port = a->port; - } - else if( a->type == NA_IPX ) { - ((struct sockaddr_ipx *)s)->sa_family = AF_IPX; - memcpy( ((struct sockaddr_ipx *)s)->sa_netnum, &a->ipx[0], 4 ); - memcpy( ((struct sockaddr_ipx *)s)->sa_nodenum, &a->ipx[4], 6 ); - ((struct sockaddr_ipx *)s)->sa_socket = a->port; - } - else if( a->type == NA_BROADCAST_IPX ) { - ((struct sockaddr_ipx *)s)->sa_family = AF_IPX; - memset( ((struct sockaddr_ipx *)s)->sa_netnum, 0, 4 ); - memset( ((struct sockaddr_ipx *)s)->sa_nodenum, 0xff, 6 ); - ((struct sockaddr_ipx *)s)->sa_socket = a->port; - } -} - - -void SockadrToNetadr( struct sockaddr *s, netadr_t *a ) { - if (s->sa_family == AF_INET) { - a->type = NA_IP; - *(int *)&a->ip = ((struct sockaddr_in *)s)->sin_addr.s_addr; - a->port = ((struct sockaddr_in *)s)->sin_port; - } - else if( s->sa_family == AF_IPX ) { - a->type = NA_IPX; - memcpy( &a->ipx[0], ((struct sockaddr_ipx *)s)->sa_netnum, 4 ); - memcpy( &a->ipx[4], ((struct sockaddr_ipx *)s)->sa_nodenum, 6 ); - a->port = ((struct sockaddr_ipx *)s)->sa_socket; - } -} - - -/* -============= -Sys_StringToAdr - -idnewt -192.246.40.70 -12121212.121212121212 -============= -*/ -#define DO(src,dest) \ - copy[0] = s[src]; \ - copy[1] = s[src + 1]; \ - sscanf (copy, "%x", &val); \ - ((struct sockaddr_ipx *)sadr)->dest = val - -qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) { - struct hostent *h; - int val; - char copy[MAX_STRING_CHARS]; - - memset( sadr, 0, sizeof( *sadr ) ); - - // check for an IPX address - if( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { - ((struct sockaddr_ipx *)sadr)->sa_family = AF_IPX; - ((struct sockaddr_ipx *)sadr)->sa_socket = 0; - copy[2] = 0; - DO(0, sa_netnum[0]); - DO(2, sa_netnum[1]); - DO(4, sa_netnum[2]); - DO(6, sa_netnum[3]); - DO(9, sa_nodenum[0]); - DO(11, sa_nodenum[1]); - DO(13, sa_nodenum[2]); - DO(15, sa_nodenum[3]); - DO(17, sa_nodenum[4]); - DO(19, sa_nodenum[5]); - } - else { - ((struct sockaddr_in *)sadr)->sin_family = AF_INET; - ((struct sockaddr_in *)sadr)->sin_port = 0; - - if( s[0] >= '0' && s[0] <= '9' ) { - *(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s); - } else { - if( ( h = gethostbyname( s ) ) == 0 ) { - return 0; - } - *(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0]; - } - } - - return qtrue; -} - -#undef DO - -/* -============= -Sys_StringToAdr - -idnewt -192.246.40.70 -============= -*/ -qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { - struct sockaddr sadr; - - if ( !Sys_StringToSockaddr( s, &sadr ) ) { - return qfalse; - } - - SockadrToNetadr( &sadr, a ); - return qtrue; -} - -//============================================================================= - -/* -================== -Sys_GetPacket - -Never called by the game logic, just the system event queing -================== -*/ -int recvfromCount; - -qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) { - int ret; - struct sockaddr from; - int fromlen; - int net_socket; - int protocol; - int err; - - for( protocol = 0 ; protocol < 2 ; protocol++ ) { - if( protocol == 0 ) { - net_socket = ip_socket; - } - else { - net_socket = ipx_socket; - } - - if( !net_socket ) { - continue; - } - - fromlen = sizeof(from); - recvfromCount++; // performance check - ret = recvfrom( net_socket, net_message->data, net_message->maxsize, 0, (struct sockaddr *)&from, &fromlen ); - if (ret == SOCKET_ERROR) - { - err = WSAGetLastError(); - - if( err == WSAEWOULDBLOCK || err == WSAECONNRESET ) { - continue; - } - Com_Printf( "NET_GetPacket: %s\n", NET_ErrorString() ); - continue; - } - - if ( net_socket == ip_socket ) { - memset( ((struct sockaddr_in *)&from)->sin_zero, 0, 8 ); - } - - if ( usingSocks && net_socket == ip_socket && memcmp( &from, &socksRelayAddr, fromlen ) == 0 ) { - if ( ret < 10 || net_message->data[0] != 0 || net_message->data[1] != 0 || net_message->data[2] != 0 || net_message->data[3] != 1 ) { - continue; - } - net_from->type = NA_IP; - net_from->ip[0] = net_message->data[4]; - net_from->ip[1] = net_message->data[5]; - net_from->ip[2] = net_message->data[6]; - net_from->ip[3] = net_message->data[7]; - net_from->port = *(short *)&net_message->data[8]; - net_message->readcount = 10; - } - else { - SockadrToNetadr( &from, net_from ); - net_message->readcount = 0; - } - - if( ret == net_message->maxsize ) { - Com_Printf( "Oversize packet from %s\n", NET_AdrToString (*net_from) ); - continue; - } - - net_message->cursize = ret; - return qtrue; - } - - return qfalse; -} - -//============================================================================= - -static char socksBuf[4096]; - -/* -================== -Sys_SendPacket -================== -*/ -void Sys_SendPacket( int length, const void *data, netadr_t to ) { - int ret; - struct sockaddr addr; - SOCKET net_socket; - - if( to.type == NA_BROADCAST ) { - net_socket = ip_socket; - } - else if( to.type == NA_IP ) { - net_socket = ip_socket; - } - else if( to.type == NA_IPX ) { - net_socket = ipx_socket; - } - else if( to.type == NA_BROADCAST_IPX ) { - net_socket = ipx_socket; - } - else { - Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" ); - return; - } - - if( !net_socket ) { - return; - } - - NetadrToSockadr( &to, &addr ); - - if( usingSocks && to.type == NA_IP ) { - socksBuf[0] = 0; // reserved - socksBuf[1] = 0; - socksBuf[2] = 0; // fragment (not fragmented) - socksBuf[3] = 1; // address type: IPV4 - *(int *)&socksBuf[4] = ((struct sockaddr_in *)&addr)->sin_addr.s_addr; - *(short *)&socksBuf[8] = ((struct sockaddr_in *)&addr)->sin_port; - memcpy( &socksBuf[10], data, length ); - ret = sendto( net_socket, socksBuf, length+10, 0, &socksRelayAddr, sizeof(socksRelayAddr) ); - } - else { - ret = sendto( net_socket, data, length, 0, &addr, sizeof(addr) ); - } - if( ret == SOCKET_ERROR ) { - int err = WSAGetLastError(); - - // wouldblock is silent - if( err == WSAEWOULDBLOCK ) { - return; - } - - // some PPP links do not allow broadcasts and return an error - if( ( err == WSAEADDRNOTAVAIL ) && ( ( to.type == NA_BROADCAST ) || ( to.type == NA_BROADCAST_IPX ) ) ) { - return; - } - - Com_Printf( "NET_SendPacket: %s\n", NET_ErrorString() ); - } -} - - -//============================================================================= - -/* -================== -Sys_IsLANAddress - -LAN clients will have their rate var ignored -================== -*/ -qboolean Sys_IsLANAddress( netadr_t adr ) { - int i; - - if( adr.type == NA_LOOPBACK ) { - return qtrue; - } - - if( adr.type == NA_IPX ) { - return qtrue; - } - - if( adr.type != NA_IP ) { - return qfalse; - } - - // choose which comparison to use based on the class of the address being tested - // any local adresses of a different class than the address being tested will fail based on the first byte - - if( adr.ip[0] == 127 && adr.ip[1] == 0 && adr.ip[2] == 0 && adr.ip[3] == 1 ) { - return qtrue; - } - - // Class A - if( (adr.ip[0] & 0x80) == 0x00 ) { - for ( i = 0 ; i < numIP ; i++ ) { - if( adr.ip[0] == localIP[i][0] ) { - return qtrue; - } - } - // the RFC1918 class a block will pass the above test - return qfalse; - } - - // Class B - if( (adr.ip[0] & 0xc0) == 0x80 ) { - for ( i = 0 ; i < numIP ; i++ ) { - if( adr.ip[0] == localIP[i][0] && adr.ip[1] == localIP[i][1] ) { - return qtrue; - } - // also check against the RFC1918 class b blocks - if( adr.ip[0] == 172 && localIP[i][0] == 172 && (adr.ip[1] & 0xf0) == 16 && (localIP[i][1] & 0xf0) == 16 ) { - return qtrue; - } - } - return qfalse; - } - - // Class C - for ( i = 0 ; i < numIP ; i++ ) { - if( adr.ip[0] == localIP[i][0] && adr.ip[1] == localIP[i][1] && adr.ip[2] == localIP[i][2] ) { - return qtrue; - } - // also check against the RFC1918 class c blocks - if( adr.ip[0] == 192 && localIP[i][0] == 192 && adr.ip[1] == 168 && localIP[i][1] == 168 ) { - return qtrue; - } - } - return qfalse; -} - -/* -================== -Sys_ShowIP -================== -*/ -void Sys_ShowIP(void) { - int i; - - for (i = 0; i < numIP; i++) { - Com_Printf( "IP: %i.%i.%i.%i\n", localIP[i][0], localIP[i][1], localIP[i][2], localIP[i][3] ); - } -} - - -//============================================================================= - - -/* -==================== -NET_IPSocket -==================== -*/ -int NET_IPSocket( char *net_interface, int port ) { - SOCKET newsocket; - struct sockaddr_in address; - qboolean _true = qtrue; - int i = 1; - int err; - - if( net_interface ) { - Com_Printf( "Opening IP socket: %s:%i\n", net_interface, port ); - } - else { - Com_Printf( "Opening IP socket: localhost:%i\n", port ); - } - - if( ( newsocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == INVALID_SOCKET ) { - err = WSAGetLastError(); - if( err != WSAEAFNOSUPPORT ) { - Com_Printf( "WARNING: UDP_OpenSocket: socket: %s\n", NET_ErrorString() ); - } - return 0; - } - - // make it non-blocking - if( ioctlsocket( newsocket, FIONBIO, &_true ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: UDP_OpenSocket: ioctl FIONBIO: %s\n", NET_ErrorString() ); - return 0; - } - - // make it broadcast capable - if( setsockopt( newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i) ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: UDP_OpenSocket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString() ); - return 0; - } - - if( !net_interface || !net_interface[0] || !Q_stricmp(net_interface, "localhost") ) { - address.sin_addr.s_addr = INADDR_ANY; - } - else { - Sys_StringToSockaddr( net_interface, (struct sockaddr *)&address ); - } - - if( port == PORT_ANY ) { - address.sin_port = 0; - } - else { - address.sin_port = htons( (short)port ); - } - - address.sin_family = AF_INET; - - if( bind( newsocket, (void *)&address, sizeof(address) ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: UDP_OpenSocket: bind: %s\n", NET_ErrorString() ); - closesocket( newsocket ); - return 0; - } - - return newsocket; -} - - -/* -==================== -NET_OpenSocks -==================== -*/ -void NET_OpenSocks( int port ) { - struct sockaddr_in address; - int err; - struct hostent *h; - int len; - qboolean rfc1929; - unsigned char buf[64]; - - usingSocks = qfalse; - - Com_Printf( "Opening connection to SOCKS server.\n" ); - - if ( ( socks_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET ) { - err = WSAGetLastError(); - Com_Printf( "WARNING: NET_OpenSocks: socket: %s\n", NET_ErrorString() ); - return; - } - - h = gethostbyname( net_socksServer->string ); - if ( h == NULL ) { - err = WSAGetLastError(); - Com_Printf( "WARNING: NET_OpenSocks: gethostbyname: %s\n", NET_ErrorString() ); - return; - } - if ( h->h_addrtype != AF_INET ) { - Com_Printf( "WARNING: NET_OpenSocks: gethostbyname: address type was not AF_INET\n" ); - return; - } - address.sin_family = AF_INET; - address.sin_addr.s_addr = *(int *)h->h_addr_list[0]; - address.sin_port = htons( (short)net_socksPort->integer ); - - if ( connect( socks_socket, (struct sockaddr *)&address, sizeof( address ) ) == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: connect: %s\n", NET_ErrorString() ); - return; - } - - // send socks authentication handshake - if ( *net_socksUsername->string || *net_socksPassword->string ) { - rfc1929 = qtrue; - } - else { - rfc1929 = qfalse; - } - - buf[0] = 5; // SOCKS version - // method count - if ( rfc1929 ) { - buf[1] = 2; - len = 4; - } - else { - buf[1] = 1; - len = 3; - } - buf[2] = 0; // method #1 - method id #00: no authentication - if ( rfc1929 ) { - buf[2] = 2; // method #2 - method id #02: username/password - } - if ( send( socks_socket, buf, len, 0 ) == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); - return; - } - - // get the response - len = recv( socks_socket, buf, 64, 0 ); - if ( len == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); - return; - } - if ( len != 2 || buf[0] != 5 ) { - Com_Printf( "NET_OpenSocks: bad response\n" ); - return; - } - switch( buf[1] ) { - case 0: // no authentication - break; - case 2: // username/password authentication - break; - default: - Com_Printf( "NET_OpenSocks: request denied\n" ); - return; - } - - // do username/password authentication if needed - if ( buf[1] == 2 ) { - int ulen; - int plen; - - // build the request - ulen = strlen( net_socksUsername->string ); - plen = strlen( net_socksPassword->string ); - - buf[0] = 1; // username/password authentication version - buf[1] = ulen; - if ( ulen ) { - memcpy( &buf[2], net_socksUsername->string, ulen ); - } - buf[2 + ulen] = plen; - if ( plen ) { - memcpy( &buf[3 + ulen], net_socksPassword->string, plen ); - } - - // send it - if ( send( socks_socket, buf, 3 + ulen + plen, 0 ) == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); - return; - } - - // get the response - len = recv( socks_socket, buf, 64, 0 ); - if ( len == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); - return; - } - if ( len != 2 || buf[0] != 1 ) { - Com_Printf( "NET_OpenSocks: bad response\n" ); - return; - } - if ( buf[1] != 0 ) { - Com_Printf( "NET_OpenSocks: authentication failed\n" ); - return; - } - } - - // send the UDP associate request - buf[0] = 5; // SOCKS version - buf[1] = 3; // command: UDP associate - buf[2] = 0; // reserved - buf[3] = 1; // address type: IPV4 - *(int *)&buf[4] = INADDR_ANY; - *(short *)&buf[8] = htons( (short)port ); // port - if ( send( socks_socket, buf, 10, 0 ) == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); - return; - } - - // get the response - len = recv( socks_socket, buf, 64, 0 ); - if( len == SOCKET_ERROR ) { - err = WSAGetLastError(); - Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); - return; - } - if( len < 2 || buf[0] != 5 ) { - Com_Printf( "NET_OpenSocks: bad response\n" ); - return; - } - // check completion code - if( buf[1] != 0 ) { - Com_Printf( "NET_OpenSocks: request denied: %i\n", buf[1] ); - return; - } - if( buf[3] != 1 ) { - Com_Printf( "NET_OpenSocks: relay address is not IPV4: %i\n", buf[3] ); - return; - } - ((struct sockaddr_in *)&socksRelayAddr)->sin_family = AF_INET; - ((struct sockaddr_in *)&socksRelayAddr)->sin_addr.s_addr = *(int *)&buf[4]; - ((struct sockaddr_in *)&socksRelayAddr)->sin_port = *(short *)&buf[8]; - memset( ((struct sockaddr_in *)&socksRelayAddr)->sin_zero, 0, 8 ); - - usingSocks = qtrue; -} - - -/* -===================== -NET_GetLocalAddress -===================== -*/ -void NET_GetLocalAddress( void ) { - char hostname[256]; - struct hostent *hostInfo; - int error; - char *p; - int ip; - int n; - - if( gethostname( hostname, 256 ) == SOCKET_ERROR ) { - error = WSAGetLastError(); - return; - } - - hostInfo = gethostbyname( hostname ); - if( !hostInfo ) { - error = WSAGetLastError(); - return; - } - - Com_Printf( "Hostname: %s\n", hostInfo->h_name ); - n = 0; - while( ( p = hostInfo->h_aliases[n++] ) != NULL ) { - Com_Printf( "Alias: %s\n", p ); - } - - if ( hostInfo->h_addrtype != AF_INET ) { - return; - } - - numIP = 0; - while( ( p = hostInfo->h_addr_list[numIP] ) != NULL && numIP < MAX_IPS ) { - ip = ntohl( *(int *)p ); - localIP[ numIP ][0] = p[0]; - localIP[ numIP ][1] = p[1]; - localIP[ numIP ][2] = p[2]; - localIP[ numIP ][3] = p[3]; - Com_Printf( "IP: %i.%i.%i.%i\n", ( ip >> 24 ) & 0xff, ( ip >> 16 ) & 0xff, ( ip >> 8 ) & 0xff, ip & 0xff ); - numIP++; - } -} - -/* -==================== -NET_OpenIP -==================== -*/ -void NET_OpenIP( void ) { - cvar_t *ip; - int port; - int i; - - ip = Cvar_Get( "net_ip", "localhost", CVAR_LATCH ); - port = Cvar_Get( "net_port", va( "%i", PORT_SERVER ), CVAR_LATCH )->integer; - - // automatically scan for a valid port, so multiple - // dedicated servers can be started without requiring - // a different net_port for each one - for( i = 0 ; i < 10 ; i++ ) { - ip_socket = NET_IPSocket( ip->string, port + i ); - if ( ip_socket ) { - Cvar_SetValue( "net_port", port + i ); - if ( net_socksEnabled->integer ) { - NET_OpenSocks( port + i ); - } - NET_GetLocalAddress(); - return; - } - } - Com_Printf( "WARNING: Couldn't allocate IP port\n"); -} - - -/* -==================== -NET_IPXSocket -==================== -*/ -int NET_IPXSocket( int port ) { - SOCKET newsocket; - struct sockaddr_ipx address; - int _true = 1; - int err; - - if( ( newsocket = socket( AF_IPX, SOCK_DGRAM, NSPROTO_IPX ) ) == INVALID_SOCKET ) { - err = WSAGetLastError(); - if (err != WSAEAFNOSUPPORT) { - Com_Printf( "WARNING: IPX_Socket: socket: %s\n", NET_ErrorString() ); - } - return 0; - } - - // make it non-blocking - if( ioctlsocket( newsocket, FIONBIO, &_true ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: IPX_Socket: ioctl FIONBIO: %s\n", NET_ErrorString() ); - return 0; - } - - // make it broadcast capable - if( setsockopt( newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof( _true ) ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: IPX_Socket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString() ); - return 0; - } - - address.sa_family = AF_IPX; - memset( address.sa_netnum, 0, 4 ); - memset( address.sa_nodenum, 0, 6 ); - if( port == PORT_ANY ) { - address.sa_socket = 0; - } - else { - address.sa_socket = htons( (short)port ); - } - - if( bind( newsocket, (void *)&address, sizeof(address) ) == SOCKET_ERROR ) { - Com_Printf( "WARNING: IPX_Socket: bind: %s\n", NET_ErrorString() ); - closesocket( newsocket ); - return 0; - } - - return newsocket; -} - - -/* -==================== -NET_OpenIPX -==================== -*/ -void NET_OpenIPX( void ) { - int port; - - port = Cvar_Get( "net_port", va( "%i", PORT_SERVER ), CVAR_LATCH )->integer; - ipx_socket = NET_IPXSocket( port ); -} - - - -//=================================================================== - - -/* -==================== -NET_GetCvars -==================== -*/ -static qboolean NET_GetCvars( void ) { - qboolean modified; - - modified = qfalse; - - if( net_noudp && net_noudp->modified ) { - modified = qtrue; - } - net_noudp = Cvar_Get( "net_noudp", "0", CVAR_LATCH | CVAR_ARCHIVE ); - - if( net_noipx && net_noipx->modified ) { - modified = qtrue; - } - net_noipx = Cvar_Get( "net_noipx", "0", CVAR_LATCH | CVAR_ARCHIVE ); - - - if( net_socksEnabled && net_socksEnabled->modified ) { - modified = qtrue; - } - net_socksEnabled = Cvar_Get( "net_socksEnabled", "0", CVAR_LATCH | CVAR_ARCHIVE ); - - if( net_socksServer && net_socksServer->modified ) { - modified = qtrue; - } - net_socksServer = Cvar_Get( "net_socksServer", "", CVAR_LATCH | CVAR_ARCHIVE ); - - if( net_socksPort && net_socksPort->modified ) { - modified = qtrue; - } - net_socksPort = Cvar_Get( "net_socksPort", "1080", CVAR_LATCH | CVAR_ARCHIVE ); - - if( net_socksUsername && net_socksUsername->modified ) { - modified = qtrue; - } - net_socksUsername = Cvar_Get( "net_socksUsername", "", CVAR_LATCH | CVAR_ARCHIVE ); - - if( net_socksPassword && net_socksPassword->modified ) { - modified = qtrue; - } - net_socksPassword = Cvar_Get( "net_socksPassword", "", CVAR_LATCH | CVAR_ARCHIVE ); - - - return modified; -} - - -/* -==================== -NET_Config -==================== -*/ -void NET_Config( qboolean enableNetworking ) { - qboolean modified; - qboolean stop; - qboolean start; - - // get any latched changes to cvars - modified = NET_GetCvars(); - - if( net_noudp->integer && net_noipx->integer ) { - enableNetworking = qfalse; - } - - // if enable state is the same and no cvars were modified, we have nothing to do - if( enableNetworking == networkingEnabled && !modified ) { - return; - } - - if( enableNetworking == networkingEnabled ) { - if( enableNetworking ) { - stop = qtrue; - start = qtrue; - } - else { - stop = qfalse; - start = qfalse; - } - } - else { - if( enableNetworking ) { - stop = qfalse; - start = qtrue; - } - else { - stop = qtrue; - start = qfalse; - } - networkingEnabled = enableNetworking; - } - - if( stop ) { - if ( ip_socket && ip_socket != INVALID_SOCKET ) { - closesocket( ip_socket ); - ip_socket = 0; - } - - if ( socks_socket && socks_socket != INVALID_SOCKET ) { - closesocket( socks_socket ); - socks_socket = 0; - } - - if ( ipx_socket && ipx_socket != INVALID_SOCKET ) { - closesocket( ipx_socket ); - ipx_socket = 0; - } - } - - if( start ) { - if (! net_noudp->integer ) { - NET_OpenIP(); - } - if (! net_noipx->integer ) { - NET_OpenIPX(); - } - } -} - - -/* -==================== -NET_Init -==================== -*/ -void NET_Init( void ) { - int r; - - r = WSAStartup( MAKEWORD( 1, 1 ), &winsockdata ); - if( r ) { - Com_Printf( "WARNING: Winsock initialization failed, returned %d\n", r ); - return; - } - - winsockInitialized = qtrue; - Com_Printf( "Winsock Initialized\n" ); - - // this is really just to get the cvars registered - NET_GetCvars(); - - //FIXME testing! - NET_Config( qtrue ); -} - - -/* -==================== -NET_Shutdown -==================== -*/ -void NET_Shutdown( void ) { - if ( !winsockInitialized ) { - return; - } - NET_Config( qfalse ); - WSACleanup(); - winsockInitialized = qfalse; -} - - -/* -==================== -NET_Sleep - -sleeps msec or until net socket is ready -==================== -*/ -void NET_Sleep( int msec ) { -} - - -/* -==================== -NET_Restart_f -==================== -*/ -void NET_Restart( void ) { - NET_Config( networkingEnabled ); -} +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// net_wins.c + +#include "../game/q_shared.h" +#include "../qcommon/qcommon.h" +#include "win_local.h" + +static WSADATA winsockdata; +static qboolean winsockInitialized = qfalse; +static qboolean usingSocks = qfalse; +static qboolean networkingEnabled = qfalse; + +static cvar_t *net_noudp; +static cvar_t *net_noipx; + +static cvar_t *net_socksEnabled; +static cvar_t *net_socksServer; +static cvar_t *net_socksPort; +static cvar_t *net_socksUsername; +static cvar_t *net_socksPassword; +static struct sockaddr socksRelayAddr; + +static SOCKET ip_socket; +static SOCKET socks_socket; +static SOCKET ipx_socket; + +#define MAX_IPS 16 +static int numIP; +static byte localIP[MAX_IPS][4]; + +//============================================================================= + + +/* +==================== +NET_ErrorString +==================== +*/ +char *NET_ErrorString( void ) { + int code; + + code = WSAGetLastError(); + switch( code ) { + case WSAEINTR: return "WSAEINTR"; + case WSAEBADF: return "WSAEBADF"; + case WSAEACCES: return "WSAEACCES"; + case WSAEDISCON: return "WSAEDISCON"; + case WSAEFAULT: return "WSAEFAULT"; + case WSAEINVAL: return "WSAEINVAL"; + case WSAEMFILE: return "WSAEMFILE"; + case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK"; + case WSAEINPROGRESS: return "WSAEINPROGRESS"; + case WSAEALREADY: return "WSAEALREADY"; + case WSAENOTSOCK: return "WSAENOTSOCK"; + case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ"; + case WSAEMSGSIZE: return "WSAEMSGSIZE"; + case WSAEPROTOTYPE: return "WSAEPROTOTYPE"; + case WSAENOPROTOOPT: return "WSAENOPROTOOPT"; + case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT"; + case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT"; + case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP"; + case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT"; + case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT"; + case WSAEADDRINUSE: return "WSAEADDRINUSE"; + case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL"; + case WSAENETDOWN: return "WSAENETDOWN"; + case WSAENETUNREACH: return "WSAENETUNREACH"; + case WSAENETRESET: return "WSAENETRESET"; + case WSAECONNABORTED: return "WSWSAECONNABORTEDAEINTR"; + case WSAECONNRESET: return "WSAECONNRESET"; + case WSAENOBUFS: return "WSAENOBUFS"; + case WSAEISCONN: return "WSAEISCONN"; + case WSAENOTCONN: return "WSAENOTCONN"; + case WSAESHUTDOWN: return "WSAESHUTDOWN"; + case WSAETOOMANYREFS: return "WSAETOOMANYREFS"; + case WSAETIMEDOUT: return "WSAETIMEDOUT"; + case WSAECONNREFUSED: return "WSAECONNREFUSED"; + case WSAELOOP: return "WSAELOOP"; + case WSAENAMETOOLONG: return "WSAENAMETOOLONG"; + case WSAEHOSTDOWN: return "WSAEHOSTDOWN"; + case WSASYSNOTREADY: return "WSASYSNOTREADY"; + case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED"; + case WSANOTINITIALISED: return "WSANOTINITIALISED"; + case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND"; + case WSATRY_AGAIN: return "WSATRY_AGAIN"; + case WSANO_RECOVERY: return "WSANO_RECOVERY"; + case WSANO_DATA: return "WSANO_DATA"; + default: return "NO ERROR"; + } +} + +void NetadrToSockadr( netadr_t *a, struct sockaddr *s ) { + memset( s, 0, sizeof(*s) ); + + if( a->type == NA_BROADCAST ) { + ((struct sockaddr_in *)s)->sin_family = AF_INET; + ((struct sockaddr_in *)s)->sin_port = a->port; + ((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST; + } + else if( a->type == NA_IP ) { + ((struct sockaddr_in *)s)->sin_family = AF_INET; + ((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip; + ((struct sockaddr_in *)s)->sin_port = a->port; + } + else if( a->type == NA_IPX ) { + ((struct sockaddr_ipx *)s)->sa_family = AF_IPX; + memcpy( ((struct sockaddr_ipx *)s)->sa_netnum, &a->ipx[0], 4 ); + memcpy( ((struct sockaddr_ipx *)s)->sa_nodenum, &a->ipx[4], 6 ); + ((struct sockaddr_ipx *)s)->sa_socket = a->port; + } + else if( a->type == NA_BROADCAST_IPX ) { + ((struct sockaddr_ipx *)s)->sa_family = AF_IPX; + memset( ((struct sockaddr_ipx *)s)->sa_netnum, 0, 4 ); + memset( ((struct sockaddr_ipx *)s)->sa_nodenum, 0xff, 6 ); + ((struct sockaddr_ipx *)s)->sa_socket = a->port; + } +} + + +void SockadrToNetadr( struct sockaddr *s, netadr_t *a ) { + if (s->sa_family == AF_INET) { + a->type = NA_IP; + *(int *)&a->ip = ((struct sockaddr_in *)s)->sin_addr.s_addr; + a->port = ((struct sockaddr_in *)s)->sin_port; + } + else if( s->sa_family == AF_IPX ) { + a->type = NA_IPX; + memcpy( &a->ipx[0], ((struct sockaddr_ipx *)s)->sa_netnum, 4 ); + memcpy( &a->ipx[4], ((struct sockaddr_ipx *)s)->sa_nodenum, 6 ); + a->port = ((struct sockaddr_ipx *)s)->sa_socket; + } +} + + +/* +============= +Sys_StringToAdr + +idnewt +192.246.40.70 +12121212.121212121212 +============= +*/ +#define DO(src,dest) \ + copy[0] = s[src]; \ + copy[1] = s[src + 1]; \ + sscanf (copy, "%x", &val); \ + ((struct sockaddr_ipx *)sadr)->dest = val + +qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) { + struct hostent *h; + int val; + char copy[MAX_STRING_CHARS]; + + memset( sadr, 0, sizeof( *sadr ) ); + + // check for an IPX address + if( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { + ((struct sockaddr_ipx *)sadr)->sa_family = AF_IPX; + ((struct sockaddr_ipx *)sadr)->sa_socket = 0; + copy[2] = 0; + DO(0, sa_netnum[0]); + DO(2, sa_netnum[1]); + DO(4, sa_netnum[2]); + DO(6, sa_netnum[3]); + DO(9, sa_nodenum[0]); + DO(11, sa_nodenum[1]); + DO(13, sa_nodenum[2]); + DO(15, sa_nodenum[3]); + DO(17, sa_nodenum[4]); + DO(19, sa_nodenum[5]); + } + else { + ((struct sockaddr_in *)sadr)->sin_family = AF_INET; + ((struct sockaddr_in *)sadr)->sin_port = 0; + + if( s[0] >= '0' && s[0] <= '9' ) { + *(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s); + } else { + if( ( h = gethostbyname( s ) ) == 0 ) { + return 0; + } + *(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0]; + } + } + + return qtrue; +} + +#undef DO + +/* +============= +Sys_StringToAdr + +idnewt +192.246.40.70 +============= +*/ +qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { + struct sockaddr sadr; + + if ( !Sys_StringToSockaddr( s, &sadr ) ) { + return qfalse; + } + + SockadrToNetadr( &sadr, a ); + return qtrue; +} + +//============================================================================= + +/* +================== +Sys_GetPacket + +Never called by the game logic, just the system event queing +================== +*/ +int recvfromCount; + +qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) { + int ret; + struct sockaddr from; + int fromlen; + int net_socket; + int protocol; + int err; + + for( protocol = 0 ; protocol < 2 ; protocol++ ) { + if( protocol == 0 ) { + net_socket = ip_socket; + } + else { + net_socket = ipx_socket; + } + + if( !net_socket ) { + continue; + } + + fromlen = sizeof(from); + recvfromCount++; // performance check + ret = recvfrom( net_socket, net_message->data, net_message->maxsize, 0, (struct sockaddr *)&from, &fromlen ); + if (ret == SOCKET_ERROR) + { + err = WSAGetLastError(); + + if( err == WSAEWOULDBLOCK || err == WSAECONNRESET ) { + continue; + } + Com_Printf( "NET_GetPacket: %s\n", NET_ErrorString() ); + continue; + } + + if ( net_socket == ip_socket ) { + memset( ((struct sockaddr_in *)&from)->sin_zero, 0, 8 ); + } + + if ( usingSocks && net_socket == ip_socket && memcmp( &from, &socksRelayAddr, fromlen ) == 0 ) { + if ( ret < 10 || net_message->data[0] != 0 || net_message->data[1] != 0 || net_message->data[2] != 0 || net_message->data[3] != 1 ) { + continue; + } + net_from->type = NA_IP; + net_from->ip[0] = net_message->data[4]; + net_from->ip[1] = net_message->data[5]; + net_from->ip[2] = net_message->data[6]; + net_from->ip[3] = net_message->data[7]; + net_from->port = *(short *)&net_message->data[8]; + net_message->readcount = 10; + } + else { + SockadrToNetadr( &from, net_from ); + net_message->readcount = 0; + } + + if( ret == net_message->maxsize ) { + Com_Printf( "Oversize packet from %s\n", NET_AdrToString (*net_from) ); + continue; + } + + net_message->cursize = ret; + return qtrue; + } + + return qfalse; +} + +//============================================================================= + +static char socksBuf[4096]; + +/* +================== +Sys_SendPacket +================== +*/ +void Sys_SendPacket( int length, const void *data, netadr_t to ) { + int ret; + struct sockaddr addr; + SOCKET net_socket; + + if( to.type == NA_BROADCAST ) { + net_socket = ip_socket; + } + else if( to.type == NA_IP ) { + net_socket = ip_socket; + } + else if( to.type == NA_IPX ) { + net_socket = ipx_socket; + } + else if( to.type == NA_BROADCAST_IPX ) { + net_socket = ipx_socket; + } + else { + Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" ); + return; + } + + if( !net_socket ) { + return; + } + + NetadrToSockadr( &to, &addr ); + + if( usingSocks && to.type == NA_IP ) { + socksBuf[0] = 0; // reserved + socksBuf[1] = 0; + socksBuf[2] = 0; // fragment (not fragmented) + socksBuf[3] = 1; // address type: IPV4 + *(int *)&socksBuf[4] = ((struct sockaddr_in *)&addr)->sin_addr.s_addr; + *(short *)&socksBuf[8] = ((struct sockaddr_in *)&addr)->sin_port; + memcpy( &socksBuf[10], data, length ); + ret = sendto( net_socket, socksBuf, length+10, 0, &socksRelayAddr, sizeof(socksRelayAddr) ); + } + else { + ret = sendto( net_socket, data, length, 0, &addr, sizeof(addr) ); + } + if( ret == SOCKET_ERROR ) { + int err = WSAGetLastError(); + + // wouldblock is silent + if( err == WSAEWOULDBLOCK ) { + return; + } + + // some PPP links do not allow broadcasts and return an error + if( ( err == WSAEADDRNOTAVAIL ) && ( ( to.type == NA_BROADCAST ) || ( to.type == NA_BROADCAST_IPX ) ) ) { + return; + } + + Com_Printf( "NET_SendPacket: %s\n", NET_ErrorString() ); + } +} + + +//============================================================================= + +/* +================== +Sys_IsLANAddress + +LAN clients will have their rate var ignored +================== +*/ +qboolean Sys_IsLANAddress( netadr_t adr ) { + int i; + + if( adr.type == NA_LOOPBACK ) { + return qtrue; + } + + if( adr.type == NA_IPX ) { + return qtrue; + } + + if( adr.type != NA_IP ) { + return qfalse; + } + + // choose which comparison to use based on the class of the address being tested + // any local adresses of a different class than the address being tested will fail based on the first byte + + if( adr.ip[0] == 127 && adr.ip[1] == 0 && adr.ip[2] == 0 && adr.ip[3] == 1 ) { + return qtrue; + } + + // Class A + if( (adr.ip[0] & 0x80) == 0x00 ) { + for ( i = 0 ; i < numIP ; i++ ) { + if( adr.ip[0] == localIP[i][0] ) { + return qtrue; + } + } + // the RFC1918 class a block will pass the above test + return qfalse; + } + + // Class B + if( (adr.ip[0] & 0xc0) == 0x80 ) { + for ( i = 0 ; i < numIP ; i++ ) { + if( adr.ip[0] == localIP[i][0] && adr.ip[1] == localIP[i][1] ) { + return qtrue; + } + // also check against the RFC1918 class b blocks + if( adr.ip[0] == 172 && localIP[i][0] == 172 && (adr.ip[1] & 0xf0) == 16 && (localIP[i][1] & 0xf0) == 16 ) { + return qtrue; + } + } + return qfalse; + } + + // Class C + for ( i = 0 ; i < numIP ; i++ ) { + if( adr.ip[0] == localIP[i][0] && adr.ip[1] == localIP[i][1] && adr.ip[2] == localIP[i][2] ) { + return qtrue; + } + // also check against the RFC1918 class c blocks + if( adr.ip[0] == 192 && localIP[i][0] == 192 && adr.ip[1] == 168 && localIP[i][1] == 168 ) { + return qtrue; + } + } + return qfalse; +} + +/* +================== +Sys_ShowIP +================== +*/ +void Sys_ShowIP(void) { + int i; + + for (i = 0; i < numIP; i++) { + Com_Printf( "IP: %i.%i.%i.%i\n", localIP[i][0], localIP[i][1], localIP[i][2], localIP[i][3] ); + } +} + + +//============================================================================= + + +/* +==================== +NET_IPSocket +==================== +*/ +int NET_IPSocket( char *net_interface, int port ) { + SOCKET newsocket; + struct sockaddr_in address; + qboolean _true = qtrue; + int i = 1; + int err; + + if( net_interface ) { + Com_Printf( "Opening IP socket: %s:%i\n", net_interface, port ); + } + else { + Com_Printf( "Opening IP socket: localhost:%i\n", port ); + } + + if( ( newsocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == INVALID_SOCKET ) { + err = WSAGetLastError(); + if( err != WSAEAFNOSUPPORT ) { + Com_Printf( "WARNING: UDP_OpenSocket: socket: %s\n", NET_ErrorString() ); + } + return 0; + } + + // make it non-blocking + if( ioctlsocket( newsocket, FIONBIO, &_true ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: UDP_OpenSocket: ioctl FIONBIO: %s\n", NET_ErrorString() ); + return 0; + } + + // make it broadcast capable + if( setsockopt( newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i) ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: UDP_OpenSocket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString() ); + return 0; + } + + if( !net_interface || !net_interface[0] || !Q_stricmp(net_interface, "localhost") ) { + address.sin_addr.s_addr = INADDR_ANY; + } + else { + Sys_StringToSockaddr( net_interface, (struct sockaddr *)&address ); + } + + if( port == PORT_ANY ) { + address.sin_port = 0; + } + else { + address.sin_port = htons( (short)port ); + } + + address.sin_family = AF_INET; + + if( bind( newsocket, (void *)&address, sizeof(address) ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: UDP_OpenSocket: bind: %s\n", NET_ErrorString() ); + closesocket( newsocket ); + return 0; + } + + return newsocket; +} + + +/* +==================== +NET_OpenSocks +==================== +*/ +void NET_OpenSocks( int port ) { + struct sockaddr_in address; + int err; + struct hostent *h; + int len; + qboolean rfc1929; + unsigned char buf[64]; + + usingSocks = qfalse; + + Com_Printf( "Opening connection to SOCKS server.\n" ); + + if ( ( socks_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET ) { + err = WSAGetLastError(); + Com_Printf( "WARNING: NET_OpenSocks: socket: %s\n", NET_ErrorString() ); + return; + } + + h = gethostbyname( net_socksServer->string ); + if ( h == NULL ) { + err = WSAGetLastError(); + Com_Printf( "WARNING: NET_OpenSocks: gethostbyname: %s\n", NET_ErrorString() ); + return; + } + if ( h->h_addrtype != AF_INET ) { + Com_Printf( "WARNING: NET_OpenSocks: gethostbyname: address type was not AF_INET\n" ); + return; + } + address.sin_family = AF_INET; + address.sin_addr.s_addr = *(int *)h->h_addr_list[0]; + address.sin_port = htons( (short)net_socksPort->integer ); + + if ( connect( socks_socket, (struct sockaddr *)&address, sizeof( address ) ) == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: connect: %s\n", NET_ErrorString() ); + return; + } + + // send socks authentication handshake + if ( *net_socksUsername->string || *net_socksPassword->string ) { + rfc1929 = qtrue; + } + else { + rfc1929 = qfalse; + } + + buf[0] = 5; // SOCKS version + // method count + if ( rfc1929 ) { + buf[1] = 2; + len = 4; + } + else { + buf[1] = 1; + len = 3; + } + buf[2] = 0; // method #1 - method id #00: no authentication + if ( rfc1929 ) { + buf[2] = 2; // method #2 - method id #02: username/password + } + if ( send( socks_socket, buf, len, 0 ) == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); + return; + } + + // get the response + len = recv( socks_socket, buf, 64, 0 ); + if ( len == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); + return; + } + if ( len != 2 || buf[0] != 5 ) { + Com_Printf( "NET_OpenSocks: bad response\n" ); + return; + } + switch( buf[1] ) { + case 0: // no authentication + break; + case 2: // username/password authentication + break; + default: + Com_Printf( "NET_OpenSocks: request denied\n" ); + return; + } + + // do username/password authentication if needed + if ( buf[1] == 2 ) { + int ulen; + int plen; + + // build the request + ulen = strlen( net_socksUsername->string ); + plen = strlen( net_socksPassword->string ); + + buf[0] = 1; // username/password authentication version + buf[1] = ulen; + if ( ulen ) { + memcpy( &buf[2], net_socksUsername->string, ulen ); + } + buf[2 + ulen] = plen; + if ( plen ) { + memcpy( &buf[3 + ulen], net_socksPassword->string, plen ); + } + + // send it + if ( send( socks_socket, buf, 3 + ulen + plen, 0 ) == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); + return; + } + + // get the response + len = recv( socks_socket, buf, 64, 0 ); + if ( len == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); + return; + } + if ( len != 2 || buf[0] != 1 ) { + Com_Printf( "NET_OpenSocks: bad response\n" ); + return; + } + if ( buf[1] != 0 ) { + Com_Printf( "NET_OpenSocks: authentication failed\n" ); + return; + } + } + + // send the UDP associate request + buf[0] = 5; // SOCKS version + buf[1] = 3; // command: UDP associate + buf[2] = 0; // reserved + buf[3] = 1; // address type: IPV4 + *(int *)&buf[4] = INADDR_ANY; + *(short *)&buf[8] = htons( (short)port ); // port + if ( send( socks_socket, buf, 10, 0 ) == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: send: %s\n", NET_ErrorString() ); + return; + } + + // get the response + len = recv( socks_socket, buf, 64, 0 ); + if( len == SOCKET_ERROR ) { + err = WSAGetLastError(); + Com_Printf( "NET_OpenSocks: recv: %s\n", NET_ErrorString() ); + return; + } + if( len < 2 || buf[0] != 5 ) { + Com_Printf( "NET_OpenSocks: bad response\n" ); + return; + } + // check completion code + if( buf[1] != 0 ) { + Com_Printf( "NET_OpenSocks: request denied: %i\n", buf[1] ); + return; + } + if( buf[3] != 1 ) { + Com_Printf( "NET_OpenSocks: relay address is not IPV4: %i\n", buf[3] ); + return; + } + ((struct sockaddr_in *)&socksRelayAddr)->sin_family = AF_INET; + ((struct sockaddr_in *)&socksRelayAddr)->sin_addr.s_addr = *(int *)&buf[4]; + ((struct sockaddr_in *)&socksRelayAddr)->sin_port = *(short *)&buf[8]; + memset( ((struct sockaddr_in *)&socksRelayAddr)->sin_zero, 0, 8 ); + + usingSocks = qtrue; +} + + +/* +===================== +NET_GetLocalAddress +===================== +*/ +void NET_GetLocalAddress( void ) { + char hostname[256]; + struct hostent *hostInfo; + int error; + char *p; + int ip; + int n; + + if( gethostname( hostname, 256 ) == SOCKET_ERROR ) { + error = WSAGetLastError(); + return; + } + + hostInfo = gethostbyname( hostname ); + if( !hostInfo ) { + error = WSAGetLastError(); + return; + } + + Com_Printf( "Hostname: %s\n", hostInfo->h_name ); + n = 0; + while( ( p = hostInfo->h_aliases[n++] ) != NULL ) { + Com_Printf( "Alias: %s\n", p ); + } + + if ( hostInfo->h_addrtype != AF_INET ) { + return; + } + + numIP = 0; + while( ( p = hostInfo->h_addr_list[numIP] ) != NULL && numIP < MAX_IPS ) { + ip = ntohl( *(int *)p ); + localIP[ numIP ][0] = p[0]; + localIP[ numIP ][1] = p[1]; + localIP[ numIP ][2] = p[2]; + localIP[ numIP ][3] = p[3]; + Com_Printf( "IP: %i.%i.%i.%i\n", ( ip >> 24 ) & 0xff, ( ip >> 16 ) & 0xff, ( ip >> 8 ) & 0xff, ip & 0xff ); + numIP++; + } +} + +/* +==================== +NET_OpenIP +==================== +*/ +void NET_OpenIP( void ) { + cvar_t *ip; + int port; + int i; + + ip = Cvar_Get( "net_ip", "localhost", CVAR_LATCH ); + port = Cvar_Get( "net_port", va( "%i", PORT_SERVER ), CVAR_LATCH )->integer; + + // automatically scan for a valid port, so multiple + // dedicated servers can be started without requiring + // a different net_port for each one + for( i = 0 ; i < 10 ; i++ ) { + ip_socket = NET_IPSocket( ip->string, port + i ); + if ( ip_socket ) { + Cvar_SetValue( "net_port", port + i ); + if ( net_socksEnabled->integer ) { + NET_OpenSocks( port + i ); + } + NET_GetLocalAddress(); + return; + } + } + Com_Printf( "WARNING: Couldn't allocate IP port\n"); +} + + +/* +==================== +NET_IPXSocket +==================== +*/ +int NET_IPXSocket( int port ) { + SOCKET newsocket; + struct sockaddr_ipx address; + int _true = 1; + int err; + + if( ( newsocket = socket( AF_IPX, SOCK_DGRAM, NSPROTO_IPX ) ) == INVALID_SOCKET ) { + err = WSAGetLastError(); + if (err != WSAEAFNOSUPPORT) { + Com_Printf( "WARNING: IPX_Socket: socket: %s\n", NET_ErrorString() ); + } + return 0; + } + + // make it non-blocking + if( ioctlsocket( newsocket, FIONBIO, &_true ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: IPX_Socket: ioctl FIONBIO: %s\n", NET_ErrorString() ); + return 0; + } + + // make it broadcast capable + if( setsockopt( newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof( _true ) ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: IPX_Socket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString() ); + return 0; + } + + address.sa_family = AF_IPX; + memset( address.sa_netnum, 0, 4 ); + memset( address.sa_nodenum, 0, 6 ); + if( port == PORT_ANY ) { + address.sa_socket = 0; + } + else { + address.sa_socket = htons( (short)port ); + } + + if( bind( newsocket, (void *)&address, sizeof(address) ) == SOCKET_ERROR ) { + Com_Printf( "WARNING: IPX_Socket: bind: %s\n", NET_ErrorString() ); + closesocket( newsocket ); + return 0; + } + + return newsocket; +} + + +/* +==================== +NET_OpenIPX +==================== +*/ +void NET_OpenIPX( void ) { + int port; + + port = Cvar_Get( "net_port", va( "%i", PORT_SERVER ), CVAR_LATCH )->integer; + ipx_socket = NET_IPXSocket( port ); +} + + + +//=================================================================== + + +/* +==================== +NET_GetCvars +==================== +*/ +static qboolean NET_GetCvars( void ) { + qboolean modified; + + modified = qfalse; + + if( net_noudp && net_noudp->modified ) { + modified = qtrue; + } + net_noudp = Cvar_Get( "net_noudp", "0", CVAR_LATCH | CVAR_ARCHIVE ); + + if( net_noipx && net_noipx->modified ) { + modified = qtrue; + } + net_noipx = Cvar_Get( "net_noipx", "0", CVAR_LATCH | CVAR_ARCHIVE ); + + + if( net_socksEnabled && net_socksEnabled->modified ) { + modified = qtrue; + } + net_socksEnabled = Cvar_Get( "net_socksEnabled", "0", CVAR_LATCH | CVAR_ARCHIVE ); + + if( net_socksServer && net_socksServer->modified ) { + modified = qtrue; + } + net_socksServer = Cvar_Get( "net_socksServer", "", CVAR_LATCH | CVAR_ARCHIVE ); + + if( net_socksPort && net_socksPort->modified ) { + modified = qtrue; + } + net_socksPort = Cvar_Get( "net_socksPort", "1080", CVAR_LATCH | CVAR_ARCHIVE ); + + if( net_socksUsername && net_socksUsername->modified ) { + modified = qtrue; + } + net_socksUsername = Cvar_Get( "net_socksUsername", "", CVAR_LATCH | CVAR_ARCHIVE ); + + if( net_socksPassword && net_socksPassword->modified ) { + modified = qtrue; + } + net_socksPassword = Cvar_Get( "net_socksPassword", "", CVAR_LATCH | CVAR_ARCHIVE ); + + + return modified; +} + + +/* +==================== +NET_Config +==================== +*/ +void NET_Config( qboolean enableNetworking ) { + qboolean modified; + qboolean stop; + qboolean start; + + // get any latched changes to cvars + modified = NET_GetCvars(); + + if( net_noudp->integer && net_noipx->integer ) { + enableNetworking = qfalse; + } + + // if enable state is the same and no cvars were modified, we have nothing to do + if( enableNetworking == networkingEnabled && !modified ) { + return; + } + + if( enableNetworking == networkingEnabled ) { + if( enableNetworking ) { + stop = qtrue; + start = qtrue; + } + else { + stop = qfalse; + start = qfalse; + } + } + else { + if( enableNetworking ) { + stop = qfalse; + start = qtrue; + } + else { + stop = qtrue; + start = qfalse; + } + networkingEnabled = enableNetworking; + } + + if( stop ) { + if ( ip_socket && ip_socket != INVALID_SOCKET ) { + closesocket( ip_socket ); + ip_socket = 0; + } + + if ( socks_socket && socks_socket != INVALID_SOCKET ) { + closesocket( socks_socket ); + socks_socket = 0; + } + + if ( ipx_socket && ipx_socket != INVALID_SOCKET ) { + closesocket( ipx_socket ); + ipx_socket = 0; + } + } + + if( start ) { + if (! net_noudp->integer ) { + NET_OpenIP(); + } + if (! net_noipx->integer ) { + NET_OpenIPX(); + } + } +} + + +/* +==================== +NET_Init +==================== +*/ +void NET_Init( void ) { + int r; + + r = WSAStartup( MAKEWORD( 1, 1 ), &winsockdata ); + if( r ) { + Com_Printf( "WARNING: Winsock initialization failed, returned %d\n", r ); + return; + } + + winsockInitialized = qtrue; + Com_Printf( "Winsock Initialized\n" ); + + // this is really just to get the cvars registered + NET_GetCvars(); + + //FIXME testing! + NET_Config( qtrue ); +} + + +/* +==================== +NET_Shutdown +==================== +*/ +void NET_Shutdown( void ) { + if ( !winsockInitialized ) { + return; + } + NET_Config( qfalse ); + WSACleanup(); + winsockInitialized = qfalse; +} + + +/* +==================== +NET_Sleep + +sleeps msec or until net socket is ready +==================== +*/ +void NET_Sleep( int msec ) { +} + + +/* +==================== +NET_Restart_f +==================== +*/ +void NET_Restart( void ) { + NET_Config( networkingEnabled ); +} diff --git a/code/win32/win_qgl.c b/code/win32/win_qgl.c index 65d0c25..57277a4 100755 --- a/code/win32/win_qgl.c +++ b/code/win32/win_qgl.c @@ -1,4374 +1,4374 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -/* -** QGL_WIN.C -** -** This file implements the operating system binding of GL to QGL function -** pointers. When doing a port of Quake3 you must implement the following -** two functions: -** -** QGL_Init() - loads libraries, assigns function pointers, etc. -** QGL_Shutdown() - unloads libraries, NULLs function pointers -*/ -#include -#include "../renderer/tr_local.h" -#include "glw_win.h" - -void QGL_EnableLogging( qboolean enable ); - -int ( WINAPI * qwglSwapIntervalEXT)( int interval ); -BOOL ( WINAPI * qwglGetDeviceGammaRamp3DFX)( HDC, LPVOID ); -BOOL ( WINAPI * qwglSetDeviceGammaRamp3DFX)( HDC, LPVOID ); - -int ( WINAPI * qwglChoosePixelFormat )(HDC, CONST PIXELFORMATDESCRIPTOR *); -int ( WINAPI * qwglDescribePixelFormat) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); -int ( WINAPI * qwglGetPixelFormat)(HDC); -BOOL ( WINAPI * qwglSetPixelFormat)(HDC, int, CONST PIXELFORMATDESCRIPTOR *); -BOOL ( WINAPI * qwglSwapBuffers)(HDC); - -BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); -HGLRC ( WINAPI * qwglCreateContext)(HDC); -HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); -BOOL ( WINAPI * qwglDeleteContext)(HGLRC); -HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); -HDC ( WINAPI * qwglGetCurrentDC)(VOID); -PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); -BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); -BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); - -BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, - FLOAT, int, LPGLYPHMETRICSFLOAT); - -BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, - LPLAYERPLANEDESCRIPTOR); -int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, - CONST COLORREF *); -int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, - COLORREF *); -BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); -BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); - -void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -void ( APIENTRY * qglArrayElement )(GLint i); -void ( APIENTRY * qglBegin )(GLenum mode); -void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -void ( APIENTRY * qglCallList )(GLuint list); -void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -void ( APIENTRY * qglClear )(GLbitfield mask); -void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void ( APIENTRY * qglClearDepth )(GLclampd depth); -void ( APIENTRY * qglClearIndex )(GLfloat c); -void ( APIENTRY * qglClearStencil )(GLint s); -void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -void ( APIENTRY * qglColor3bv )(const GLbyte *v); -void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -void ( APIENTRY * qglColor3dv )(const GLdouble *v); -void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -void ( APIENTRY * qglColor3fv )(const GLfloat *v); -void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -void ( APIENTRY * qglColor3iv )(const GLint *v); -void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -void ( APIENTRY * qglColor3sv )(const GLshort *v); -void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -void ( APIENTRY * qglColor3uiv )(const GLuint *v); -void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -void ( APIENTRY * qglColor3usv )(const GLushort *v); -void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -void ( APIENTRY * qglColor4bv )(const GLbyte *v); -void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -void ( APIENTRY * qglColor4dv )(const GLdouble *v); -void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglColor4fv )(const GLfloat *v); -void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -void ( APIENTRY * qglColor4iv )(const GLint *v); -void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -void ( APIENTRY * qglColor4sv )(const GLshort *v); -void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -void ( APIENTRY * qglColor4uiv )(const GLuint *v); -void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -void ( APIENTRY * qglColor4usv )(const GLushort *v); -void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglCullFace )(GLenum mode); -void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -void ( APIENTRY * qglDepthFunc )(GLenum func); -void ( APIENTRY * qglDepthMask )(GLboolean flag); -void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -void ( APIENTRY * qglDisable )(GLenum cap); -void ( APIENTRY * qglDisableClientState )(GLenum array); -void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -void ( APIENTRY * qglDrawBuffer )(GLenum mode); -void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -void ( APIENTRY * qglEnable )(GLenum cap); -void ( APIENTRY * qglEnableClientState )(GLenum array); -void ( APIENTRY * qglEnd )(void); -void ( APIENTRY * qglEndList )(void); -void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -void ( APIENTRY * qglEvalPoint1 )(GLint i); -void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -void ( APIENTRY * qglFinish )(void); -void ( APIENTRY * qglFlush )(void); -void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglFrontFace )(GLenum mode); -void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * qglGenLists )(GLsizei range); -void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * qglGetError )(void); -void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values); -void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values); -void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values); -void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -void ( APIENTRY * qglIndexMask )(GLuint mask); -void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglIndexd )(GLdouble c); -void ( APIENTRY * qglIndexdv )(const GLdouble *c); -void ( APIENTRY * qglIndexf )(GLfloat c); -void ( APIENTRY * qglIndexfv )(const GLfloat *c); -void ( APIENTRY * qglIndexi )(GLint c); -void ( APIENTRY * qglIndexiv )(const GLint *c); -void ( APIENTRY * qglIndexs )(GLshort c); -void ( APIENTRY * qglIndexsv )(const GLshort *c); -void ( APIENTRY * qglIndexub )(GLubyte c); -void ( APIENTRY * qglIndexubv )(const GLubyte *c); -void ( APIENTRY * qglInitNames )(void); -void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * qglIsList )(GLuint list); -GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -void ( APIENTRY * qglLineWidth )(GLfloat width); -void ( APIENTRY * qglListBase )(GLuint base); -void ( APIENTRY * qglLoadIdentity )(void); -void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -void ( APIENTRY * qglLoadName )(GLuint name); -void ( APIENTRY * qglLogicOp )(GLenum opcode); -void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -void ( APIENTRY * qglMatrixMode )(GLenum mode); -void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -void ( APIENTRY * qglNormal3iv )(const GLint *v); -void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -void ( APIENTRY * qglNormal3sv )(const GLshort *v); -void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -void ( APIENTRY * qglPassThrough )(GLfloat token); -void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -void ( APIENTRY * qglPointSize )(GLfloat size); -void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -void ( APIENTRY * qglPopAttrib )(void); -void ( APIENTRY * qglPopClientAttrib )(void); -void ( APIENTRY * qglPopMatrix )(void); -void ( APIENTRY * qglPopName )(void); -void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushMatrix )(void); -void ( APIENTRY * qglPushName )(GLuint name); -void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -void ( APIENTRY * qglReadBuffer )(GLenum mode); -void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * qglRenderMode )(GLenum mode); -void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -void ( APIENTRY * qglShadeModel )(GLenum mode); -void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -void ( APIENTRY * qglStencilMask )(GLuint mask); -void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -void ( APIENTRY * qglTexCoord1d )(GLdouble s); -void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord1f )(GLfloat s); -void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord1i )(GLint s); -void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -void ( APIENTRY * qglTexCoord1s )(GLshort s); -void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -void ( APIENTRY * qglVertex2iv )(const GLint *v); -void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -void ( APIENTRY * qglVertex2sv )(const GLshort *v); -void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglVertex3iv )(const GLint *v); -void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglVertex3sv )(const GLshort *v); -void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglVertex4iv )(const GLint *v); -void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglVertex4sv )(const GLshort *v); -void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - - - -static void ( APIENTRY * dllAccum )(GLenum op, GLfloat value); -static void ( APIENTRY * dllAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * dllAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -static void ( APIENTRY * dllArrayElement )(GLint i); -static void ( APIENTRY * dllBegin )(GLenum mode); -static void ( APIENTRY * dllBindTexture )(GLenum target, GLuint texture); -static void ( APIENTRY * dllBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -static void ( APIENTRY * dllBlendFunc )(GLenum sfactor, GLenum dfactor); -static void ( APIENTRY * dllCallList )(GLuint list); -static void ( APIENTRY * dllCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -static void ( APIENTRY * dllClear )(GLbitfield mask); -static void ( APIENTRY * dllClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static void ( APIENTRY * dllClearDepth )(GLclampd depth); -static void ( APIENTRY * dllClearIndex )(GLfloat c); -static void ( APIENTRY * dllClearStencil )(GLint s); -static void ( APIENTRY * dllClipPlane )(GLenum plane, const GLdouble *equation); -static void ( APIENTRY * dllColor3b )(GLbyte red, GLbyte green, GLbyte blue); -static void ( APIENTRY * dllColor3bv )(const GLbyte *v); -static void ( APIENTRY * dllColor3d )(GLdouble red, GLdouble green, GLdouble blue); -static void ( APIENTRY * dllColor3dv )(const GLdouble *v); -static void ( APIENTRY * dllColor3f )(GLfloat red, GLfloat green, GLfloat blue); -static void ( APIENTRY * dllColor3fv )(const GLfloat *v); -static void ( APIENTRY * dllColor3i )(GLint red, GLint green, GLint blue); -static void ( APIENTRY * dllColor3iv )(const GLint *v); -static void ( APIENTRY * dllColor3s )(GLshort red, GLshort green, GLshort blue); -static void ( APIENTRY * dllColor3sv )(const GLshort *v); -static void ( APIENTRY * dllColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -static void ( APIENTRY * dllColor3ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor3ui )(GLuint red, GLuint green, GLuint blue); -static void ( APIENTRY * dllColor3uiv )(const GLuint *v); -static void ( APIENTRY * dllColor3us )(GLushort red, GLushort green, GLushort blue); -static void ( APIENTRY * dllColor3usv )(const GLushort *v); -static void ( APIENTRY * dllColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -static void ( APIENTRY * dllColor4bv )(const GLbyte *v); -static void ( APIENTRY * dllColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -static void ( APIENTRY * dllColor4dv )(const GLdouble *v); -static void ( APIENTRY * dllColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllColor4fv )(const GLfloat *v); -static void ( APIENTRY * dllColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -static void ( APIENTRY * dllColor4iv )(const GLint *v); -static void ( APIENTRY * dllColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -static void ( APIENTRY * dllColor4sv )(const GLshort *v); -static void ( APIENTRY * dllColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static void ( APIENTRY * dllColor4ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -static void ( APIENTRY * dllColor4uiv )(const GLuint *v); -static void ( APIENTRY * dllColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -static void ( APIENTRY * dllColor4usv )(const GLushort *v); -static void ( APIENTRY * dllColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static void ( APIENTRY * dllColorMaterial )(GLenum face, GLenum mode); -static void ( APIENTRY * dllColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static void ( APIENTRY * dllCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -static void ( APIENTRY * dllCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static void ( APIENTRY * dllCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -static void ( APIENTRY * dllCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllCullFace )(GLenum mode); -static void ( APIENTRY * dllDeleteLists )(GLuint list, GLsizei range); -static void ( APIENTRY * dllDeleteTextures )(GLsizei n, const GLuint *textures); -static void ( APIENTRY * dllDepthFunc )(GLenum func); -static void ( APIENTRY * dllDepthMask )(GLboolean flag); -static void ( APIENTRY * dllDepthRange )(GLclampd zNear, GLclampd zFar); -static void ( APIENTRY * dllDisable )(GLenum cap); -static void ( APIENTRY * dllDisableClientState )(GLenum array); -static void ( APIENTRY * dllDrawArrays )(GLenum mode, GLint first, GLsizei count); -static void ( APIENTRY * dllDrawBuffer )(GLenum mode); -static void ( APIENTRY * dllDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static void ( APIENTRY * dllDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllEdgeFlag )(GLboolean flag); -static void ( APIENTRY * dllEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllEdgeFlagv )(const GLboolean *flag); -static void ( APIENTRY * dllEnable )(GLenum cap); -static void ( APIENTRY * dllEnableClientState )(GLenum array); -static void ( APIENTRY * dllEnd )(void); -static void ( APIENTRY * dllEndList )(void); -static void ( APIENTRY * dllEvalCoord1d )(GLdouble u); -static void ( APIENTRY * dllEvalCoord1dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord1f )(GLfloat u); -static void ( APIENTRY * dllEvalCoord1fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalCoord2d )(GLdouble u, GLdouble v); -static void ( APIENTRY * dllEvalCoord2dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord2f )(GLfloat u, GLfloat v); -static void ( APIENTRY * dllEvalCoord2fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -static void ( APIENTRY * dllEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -static void ( APIENTRY * dllEvalPoint1 )(GLint i); -static void ( APIENTRY * dllEvalPoint2 )(GLint i, GLint j); -static void ( APIENTRY * dllFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -static void ( APIENTRY * dllFinish )(void); -static void ( APIENTRY * dllFlush )(void); -static void ( APIENTRY * dllFogf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllFogfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllFogi )(GLenum pname, GLint param); -static void ( APIENTRY * dllFogiv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllFrontFace )(GLenum mode); -static void ( APIENTRY * dllFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * dllGenLists )(GLsizei range); -static void ( APIENTRY * dllGenTextures )(GLsizei n, GLuint *textures); -static void ( APIENTRY * dllGetBooleanv )(GLenum pname, GLboolean *params); -static void ( APIENTRY * dllGetClipPlane )(GLenum plane, GLdouble *equation); -static void ( APIENTRY * dllGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * dllGetError )(void); -static void ( APIENTRY * dllGetFloatv )(GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetIntegerv )(GLenum pname, GLint *params); -static void ( APIENTRY * dllGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetLightiv )(GLenum light, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetMapdv )(GLenum target, GLenum query, GLdouble *v); -static void ( APIENTRY * dllGetMapfv )(GLenum target, GLenum query, GLfloat *v); -static void ( APIENTRY * dllGetMapiv )(GLenum target, GLenum query, GLint *v); -static void ( APIENTRY * dllGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetPixelMapfv )(GLenum map, GLfloat *values); -static void ( APIENTRY * dllGetPixelMapuiv )(GLenum map, GLuint *values); -static void ( APIENTRY * dllGetPixelMapusv )(GLenum map, GLushort *values); -static void ( APIENTRY * dllGetPointerv )(GLenum pname, GLvoid* *params); -static void ( APIENTRY * dllGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * dllGetString )(GLenum name); -static void ( APIENTRY * dllGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -static void ( APIENTRY * dllGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllHint )(GLenum target, GLenum mode); -static void ( APIENTRY * dllIndexMask )(GLuint mask); -static void ( APIENTRY * dllIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllIndexd )(GLdouble c); -static void ( APIENTRY * dllIndexdv )(const GLdouble *c); -static void ( APIENTRY * dllIndexf )(GLfloat c); -static void ( APIENTRY * dllIndexfv )(const GLfloat *c); -static void ( APIENTRY * dllIndexi )(GLint c); -static void ( APIENTRY * dllIndexiv )(const GLint *c); -static void ( APIENTRY * dllIndexs )(GLshort c); -static void ( APIENTRY * dllIndexsv )(const GLshort *c); -static void ( APIENTRY * dllIndexub )(GLubyte c); -static void ( APIENTRY * dllIndexubv )(const GLubyte *c); -static void ( APIENTRY * dllInitNames )(void); -static void ( APIENTRY * dllInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * dllIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * dllIsList )(GLuint list); -GLboolean ( APIENTRY * dllIsTexture )(GLuint texture); -static void ( APIENTRY * dllLightModelf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightModelfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLightModeli )(GLenum pname, GLint param); -static void ( APIENTRY * dllLightModeliv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllLightf )(GLenum light, GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightfv )(GLenum light, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLighti )(GLenum light, GLenum pname, GLint param); -static void ( APIENTRY * dllLightiv )(GLenum light, GLenum pname, const GLint *params); -static void ( APIENTRY * dllLineStipple )(GLint factor, GLushort pattern); -static void ( APIENTRY * dllLineWidth )(GLfloat width); -static void ( APIENTRY * dllListBase )(GLuint base); -static void ( APIENTRY * dllLoadIdentity )(void); -static void ( APIENTRY * dllLoadMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllLoadMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllLoadName )(GLuint name); -static void ( APIENTRY * dllLogicOp )(GLenum opcode); -static void ( APIENTRY * dllMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -static void ( APIENTRY * dllMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -static void ( APIENTRY * dllMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -static void ( APIENTRY * dllMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -static void ( APIENTRY * dllMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -static void ( APIENTRY * dllMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -static void ( APIENTRY * dllMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -static void ( APIENTRY * dllMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -static void ( APIENTRY * dllMaterialf )(GLenum face, GLenum pname, GLfloat param); -static void ( APIENTRY * dllMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllMateriali )(GLenum face, GLenum pname, GLint param); -static void ( APIENTRY * dllMaterialiv )(GLenum face, GLenum pname, const GLint *params); -static void ( APIENTRY * dllMatrixMode )(GLenum mode); -static void ( APIENTRY * dllMultMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllMultMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllNewList )(GLuint list, GLenum mode); -static void ( APIENTRY * dllNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -static void ( APIENTRY * dllNormal3bv )(const GLbyte *v); -static void ( APIENTRY * dllNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -static void ( APIENTRY * dllNormal3dv )(const GLdouble *v); -static void ( APIENTRY * dllNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -static void ( APIENTRY * dllNormal3fv )(const GLfloat *v); -static void ( APIENTRY * dllNormal3i )(GLint nx, GLint ny, GLint nz); -static void ( APIENTRY * dllNormal3iv )(const GLint *v); -static void ( APIENTRY * dllNormal3s )(GLshort nx, GLshort ny, GLshort nz); -static void ( APIENTRY * dllNormal3sv )(const GLshort *v); -static void ( APIENTRY * dllNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static void ( APIENTRY * dllPassThrough )(GLfloat token); -static void ( APIENTRY * dllPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -static void ( APIENTRY * dllPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -static void ( APIENTRY * dllPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -static void ( APIENTRY * dllPixelStoref )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelStorei )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelTransferf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelTransferi )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelZoom )(GLfloat xfactor, GLfloat yfactor); -static void ( APIENTRY * dllPointSize )(GLfloat size); -static void ( APIENTRY * dllPolygonMode )(GLenum face, GLenum mode); -static void ( APIENTRY * dllPolygonOffset )(GLfloat factor, GLfloat units); -static void ( APIENTRY * dllPolygonStipple )(const GLubyte *mask); -static void ( APIENTRY * dllPopAttrib )(void); -static void ( APIENTRY * dllPopClientAttrib )(void); -static void ( APIENTRY * dllPopMatrix )(void); -static void ( APIENTRY * dllPopName )(void); -static void ( APIENTRY * dllPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -static void ( APIENTRY * dllPushAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushClientAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushMatrix )(void); -static void ( APIENTRY * dllPushName )(GLuint name); -static void ( APIENTRY * dllRasterPos2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllRasterPos2dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllRasterPos2fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos2i )(GLint x, GLint y); -static void ( APIENTRY * dllRasterPos2iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllRasterPos2sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRasterPos3dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllRasterPos3fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllRasterPos3iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllRasterPos3sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllRasterPos4dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllRasterPos4fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllRasterPos4iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllRasterPos4sv )(const GLshort *v); -static void ( APIENTRY * dllReadBuffer )(GLenum mode); -static void ( APIENTRY * dllReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -static void ( APIENTRY * dllRectdv )(const GLdouble *v1, const GLdouble *v2); -static void ( APIENTRY * dllRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -static void ( APIENTRY * dllRectfv )(const GLfloat *v1, const GLfloat *v2); -static void ( APIENTRY * dllRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -static void ( APIENTRY * dllRectiv )(const GLint *v1, const GLint *v2); -static void ( APIENTRY * dllRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -static void ( APIENTRY * dllRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * dllRenderMode )(GLenum mode); -static void ( APIENTRY * dllRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScaled )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllScalef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllSelectBuffer )(GLsizei size, GLuint *buffer); -static void ( APIENTRY * dllShadeModel )(GLenum mode); -static void ( APIENTRY * dllStencilFunc )(GLenum func, GLint ref, GLuint mask); -static void ( APIENTRY * dllStencilMask )(GLuint mask); -static void ( APIENTRY * dllStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -static void ( APIENTRY * dllTexCoord1d )(GLdouble s); -static void ( APIENTRY * dllTexCoord1dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord1f )(GLfloat s); -static void ( APIENTRY * dllTexCoord1fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord1i )(GLint s); -static void ( APIENTRY * dllTexCoord1iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord1s )(GLshort s); -static void ( APIENTRY * dllTexCoord1sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord2d )(GLdouble s, GLdouble t); -static void ( APIENTRY * dllTexCoord2dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord2f )(GLfloat s, GLfloat t); -static void ( APIENTRY * dllTexCoord2fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord2i )(GLint s, GLint t); -static void ( APIENTRY * dllTexCoord2iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord2s )(GLshort s, GLshort t); -static void ( APIENTRY * dllTexCoord2sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -static void ( APIENTRY * dllTexCoord3dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -static void ( APIENTRY * dllTexCoord3fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord3i )(GLint s, GLint t, GLint r); -static void ( APIENTRY * dllTexCoord3iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord3s )(GLshort s, GLshort t, GLshort r); -static void ( APIENTRY * dllTexCoord3sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -static void ( APIENTRY * dllTexCoord4dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static void ( APIENTRY * dllTexCoord4fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -static void ( APIENTRY * dllTexCoord4iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -static void ( APIENTRY * dllTexCoord4sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllTexEnvf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexEnvi )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexEnviv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexGend )(GLenum coord, GLenum pname, GLdouble param); -static void ( APIENTRY * dllTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -static void ( APIENTRY * dllTexGenf )(GLenum coord, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexGeni )(GLenum coord, GLenum pname, GLint param); -static void ( APIENTRY * dllTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexParameteri )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTranslated )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllVertex2dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllVertex2fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex2i )(GLint x, GLint y); -static void ( APIENTRY * dllVertex2iv )(const GLint *v); -static void ( APIENTRY * dllVertex2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllVertex2sv )(const GLshort *v); -static void ( APIENTRY * dllVertex3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllVertex3dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex3fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllVertex3iv )(const GLint *v); -static void ( APIENTRY * dllVertex3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllVertex3sv )(const GLshort *v); -static void ( APIENTRY * dllVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllVertex4dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllVertex4fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllVertex4iv )(const GLint *v); -static void ( APIENTRY * dllVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllVertex4sv )(const GLshort *v); -static void ( APIENTRY * dllVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -static const char * BooleanToString( GLboolean b ) -{ - if ( b == GL_FALSE ) - return "GL_FALSE"; - else if ( b == GL_TRUE ) - return "GL_TRUE"; - else - return "OUT OF RANGE FOR BOOLEAN"; -} - -static const char * FuncToString( GLenum f ) -{ - switch ( f ) - { - case GL_ALWAYS: - return "GL_ALWAYS"; - case GL_NEVER: - return "GL_NEVER"; - case GL_LEQUAL: - return "GL_LEQUAL"; - case GL_LESS: - return "GL_LESS"; - case GL_EQUAL: - return "GL_EQUAL"; - case GL_GREATER: - return "GL_GREATER"; - case GL_GEQUAL: - return "GL_GEQUAL"; - case GL_NOTEQUAL: - return "GL_NOTEQUAL"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static const char * PrimToString( GLenum mode ) -{ - static char prim[1024]; - - if ( mode == GL_TRIANGLES ) - strcpy( prim, "GL_TRIANGLES" ); - else if ( mode == GL_TRIANGLE_STRIP ) - strcpy( prim, "GL_TRIANGLE_STRIP" ); - else if ( mode == GL_TRIANGLE_FAN ) - strcpy( prim, "GL_TRIANGLE_FAN" ); - else if ( mode == GL_QUADS ) - strcpy( prim, "GL_QUADS" ); - else if ( mode == GL_QUAD_STRIP ) - strcpy( prim, "GL_QUAD_STRIP" ); - else if ( mode == GL_POLYGON ) - strcpy( prim, "GL_POLYGON" ); - else if ( mode == GL_POINTS ) - strcpy( prim, "GL_POINTS" ); - else if ( mode == GL_LINES ) - strcpy( prim, "GL_LINES" ); - else if ( mode == GL_LINE_STRIP ) - strcpy( prim, "GL_LINE_STRIP" ); - else if ( mode == GL_LINE_LOOP ) - strcpy( prim, "GL_LINE_LOOP" ); - else - sprintf( prim, "0x%x", mode ); - - return prim; -} - -static const char * CapToString( GLenum cap ) -{ - static char buffer[1024]; - - switch ( cap ) - { - case GL_TEXTURE_2D: - return "GL_TEXTURE_2D"; - case GL_BLEND: - return "GL_BLEND"; - case GL_DEPTH_TEST: - return "GL_DEPTH_TEST"; - case GL_CULL_FACE: - return "GL_CULL_FACE"; - case GL_CLIP_PLANE0: - return "GL_CLIP_PLANE0"; - case GL_COLOR_ARRAY: - return "GL_COLOR_ARRAY"; - case GL_TEXTURE_COORD_ARRAY: - return "GL_TEXTURE_COORD_ARRAY"; - case GL_VERTEX_ARRAY: - return "GL_VERTEX_ARRAY"; - case GL_ALPHA_TEST: - return "GL_ALPHA_TEST"; - case GL_STENCIL_TEST: - return "GL_STENCIL_TEST"; - default: - sprintf( buffer, "0x%x", cap ); - } - - return buffer; -} - -static const char * TypeToString( GLenum t ) -{ - switch ( t ) - { - case GL_BYTE: - return "GL_BYTE"; - case GL_UNSIGNED_BYTE: - return "GL_UNSIGNED_BYTE"; - case GL_SHORT: - return "GL_SHORT"; - case GL_UNSIGNED_SHORT: - return "GL_UNSIGNED_SHORT"; - case GL_INT: - return "GL_INT"; - case GL_UNSIGNED_INT: - return "GL_UNSIGNED_INT"; - case GL_FLOAT: - return "GL_FLOAT"; - case GL_DOUBLE: - return "GL_DOUBLE"; - default: - return "!!! UNKNOWN !!!"; - } -} - -static void APIENTRY logAccum(GLenum op, GLfloat value) -{ - fprintf( glw_state.log_fp, "glAccum\n" ); - dllAccum( op, value ); -} - -static void APIENTRY logAlphaFunc(GLenum func, GLclampf ref) -{ - fprintf( glw_state.log_fp, "glAlphaFunc( 0x%x, %f )\n", func, ref ); - dllAlphaFunc( func, ref ); -} - -static GLboolean APIENTRY logAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) -{ - fprintf( glw_state.log_fp, "glAreTexturesResident\n" ); - return dllAreTexturesResident( n, textures, residences ); -} - -static void APIENTRY logArrayElement(GLint i) -{ - fprintf( glw_state.log_fp, "glArrayElement\n" ); - dllArrayElement( i ); -} - -static void APIENTRY logBegin(GLenum mode) -{ - fprintf( glw_state.log_fp, "glBegin( %s )\n", PrimToString( mode )); - dllBegin( mode ); -} - -static void APIENTRY logBindTexture(GLenum target, GLuint texture) -{ - fprintf( glw_state.log_fp, "glBindTexture( 0x%x, %u )\n", target, texture ); - dllBindTexture( target, texture ); -} - -static void APIENTRY logBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) -{ - fprintf( glw_state.log_fp, "glBitmap\n" ); - dllBitmap( width, height, xorig, yorig, xmove, ymove, bitmap ); -} - -static void BlendToName( char *n, GLenum f ) -{ - switch ( f ) - { - case GL_ONE: - strcpy( n, "GL_ONE" ); - break; - case GL_ZERO: - strcpy( n, "GL_ZERO" ); - break; - case GL_SRC_ALPHA: - strcpy( n, "GL_SRC_ALPHA" ); - break; - case GL_ONE_MINUS_SRC_ALPHA: - strcpy( n, "GL_ONE_MINUS_SRC_ALPHA" ); - break; - case GL_DST_COLOR: - strcpy( n, "GL_DST_COLOR" ); - break; - case GL_ONE_MINUS_DST_COLOR: - strcpy( n, "GL_ONE_MINUS_DST_COLOR" ); - break; - case GL_DST_ALPHA: - strcpy( n, "GL_DST_ALPHA" ); - break; - default: - sprintf( n, "0x%x", f ); - } -} -static void APIENTRY logBlendFunc(GLenum sfactor, GLenum dfactor) -{ - char sf[128], df[128]; - - BlendToName( sf, sfactor ); - BlendToName( df, dfactor ); - - fprintf( glw_state.log_fp, "glBlendFunc( %s, %s )\n", sf, df ); - dllBlendFunc( sfactor, dfactor ); -} - -static void APIENTRY logCallList(GLuint list) -{ - fprintf( glw_state.log_fp, "glCallList( %u )\n", list ); - dllCallList( list ); -} - -static void APIENTRY logCallLists(GLsizei n, GLenum type, const void *lists) -{ - fprintf( glw_state.log_fp, "glCallLists\n" ); - dllCallLists( n, type, lists ); -} - -static void APIENTRY logClear(GLbitfield mask) -{ - fprintf( glw_state.log_fp, "glClear( 0x%x = ", mask ); - - if ( mask & GL_COLOR_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_COLOR_BUFFER_BIT " ); - if ( mask & GL_DEPTH_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_DEPTH_BUFFER_BIT " ); - if ( mask & GL_STENCIL_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_STENCIL_BUFFER_BIT " ); - if ( mask & GL_ACCUM_BUFFER_BIT ) - fprintf( glw_state.log_fp, "GL_ACCUM_BUFFER_BIT " ); - - fprintf( glw_state.log_fp, ")\n" ); - dllClear( mask ); -} - -static void APIENTRY logClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glClearAccum\n" ); - dllClearAccum( red, green, blue, alpha ); -} - -static void APIENTRY logClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) -{ - fprintf( glw_state.log_fp, "glClearColor\n" ); - dllClearColor( red, green, blue, alpha ); -} - -static void APIENTRY logClearDepth(GLclampd depth) -{ - fprintf( glw_state.log_fp, "glClearDepth( %f )\n", ( float ) depth ); - dllClearDepth( depth ); -} - -static void APIENTRY logClearIndex(GLfloat c) -{ - fprintf( glw_state.log_fp, "glClearIndex\n" ); - dllClearIndex( c ); -} - -static void APIENTRY logClearStencil(GLint s) -{ - fprintf( glw_state.log_fp, "glClearStencil( %d )\n", s ); - dllClearStencil( s ); -} - -static void APIENTRY logClipPlane(GLenum plane, const GLdouble *equation) -{ - fprintf( glw_state.log_fp, "glClipPlane\n" ); - dllClipPlane( plane, equation ); -} - -static void APIENTRY logColor3b(GLbyte red, GLbyte green, GLbyte blue) -{ - fprintf( glw_state.log_fp, "glColor3b\n" ); - dllColor3b( red, green, blue ); -} - -static void APIENTRY logColor3bv(const GLbyte *v) -{ - fprintf( glw_state.log_fp, "glColor3bv\n" ); - dllColor3bv( v ); -} - -static void APIENTRY logColor3d(GLdouble red, GLdouble green, GLdouble blue) -{ - fprintf( glw_state.log_fp, "glColor3d\n" ); - dllColor3d( red, green, blue ); -} - -static void APIENTRY logColor3dv(const GLdouble *v) -{ - fprintf( glw_state.log_fp, "glColor3dv\n" ); - dllColor3dv( v ); -} - -static void APIENTRY logColor3f(GLfloat red, GLfloat green, GLfloat blue) -{ - fprintf( glw_state.log_fp, "glColor3f\n" ); - dllColor3f( red, green, blue ); -} - -static void APIENTRY logColor3fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor3fv\n" ); - dllColor3fv( v ); -} - -static void APIENTRY logColor3i(GLint red, GLint green, GLint blue) -{ - fprintf( glw_state.log_fp, "glColor3i\n" ); - dllColor3i( red, green, blue ); -} - -static void APIENTRY logColor3iv(const GLint *v) -{ - fprintf( glw_state.log_fp, "glColor3iv\n" ); - dllColor3iv( v ); -} - -static void APIENTRY logColor3s(GLshort red, GLshort green, GLshort blue) -{ - fprintf( glw_state.log_fp, "glColor3s\n" ); - dllColor3s( red, green, blue ); -} - -static void APIENTRY logColor3sv(const GLshort *v) -{ - fprintf( glw_state.log_fp, "glColor3sv\n" ); - dllColor3sv( v ); -} - -static void APIENTRY logColor3ub(GLubyte red, GLubyte green, GLubyte blue) -{ - fprintf( glw_state.log_fp, "glColor3ub\n" ); - dllColor3ub( red, green, blue ); -} - -static void APIENTRY logColor3ubv(const GLubyte *v) -{ - fprintf( glw_state.log_fp, "glColor3ubv\n" ); - dllColor3ubv( v ); -} - -#define SIG( x ) fprintf( glw_state.log_fp, x "\n" ) - -static void APIENTRY logColor3ui(GLuint red, GLuint green, GLuint blue) -{ - SIG( "glColor3ui" ); - dllColor3ui( red, green, blue ); -} - -static void APIENTRY logColor3uiv(const GLuint *v) -{ - SIG( "glColor3uiv" ); - dllColor3uiv( v ); -} - -static void APIENTRY logColor3us(GLushort red, GLushort green, GLushort blue) -{ - SIG( "glColor3us" ); - dllColor3us( red, green, blue ); -} - -static void APIENTRY logColor3usv(const GLushort *v) -{ - SIG( "glColor3usv" ); - dllColor3usv( v ); -} - -static void APIENTRY logColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} - -static void APIENTRY logColor4bv(const GLbyte *v) -{ - SIG( "glColor4bv" ); - dllColor4bv( v ); -} - -static void APIENTRY logColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) -{ - SIG( "glColor4d" ); - dllColor4d( red, green, blue, alpha ); -} -static void APIENTRY logColor4dv(const GLdouble *v) -{ - SIG( "glColor4dv" ); - dllColor4dv( v ); -} -static void APIENTRY logColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -{ - fprintf( glw_state.log_fp, "glColor4f( %f,%f,%f,%f )\n", red, green, blue, alpha ); - dllColor4f( red, green, blue, alpha ); -} -static void APIENTRY logColor4fv(const GLfloat *v) -{ - fprintf( glw_state.log_fp, "glColor4fv( %f,%f,%f,%f )\n", v[0], v[1], v[2], v[3] ); - dllColor4fv( v ); -} -static void APIENTRY logColor4i(GLint red, GLint green, GLint blue, GLint alpha) -{ - SIG( "glColor4i" ); - dllColor4i( red, green, blue, alpha ); -} -static void APIENTRY logColor4iv(const GLint *v) -{ - SIG( "glColor4iv" ); - dllColor4iv( v ); -} -static void APIENTRY logColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) -{ - SIG( "glColor4s" ); - dllColor4s( red, green, blue, alpha ); -} -static void APIENTRY logColor4sv(const GLshort *v) -{ - SIG( "glColor4sv" ); - dllColor4sv( v ); -} -static void APIENTRY logColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) -{ - SIG( "glColor4b" ); - dllColor4b( red, green, blue, alpha ); -} -static void APIENTRY logColor4ubv(const GLubyte *v) -{ - SIG( "glColor4ubv" ); - dllColor4ubv( v ); -} -static void APIENTRY logColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) -{ - SIG( "glColor4ui" ); - dllColor4ui( red, green, blue, alpha ); -} -static void APIENTRY logColor4uiv(const GLuint *v) -{ - SIG( "glColor4uiv" ); - dllColor4uiv( v ); -} -static void APIENTRY logColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) -{ - SIG( "glColor4us" ); - dllColor4us( red, green, blue, alpha ); -} -static void APIENTRY logColor4usv(const GLushort *v) -{ - SIG( "glColor4usv" ); - dllColor4usv( v ); -} -static void APIENTRY logColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) -{ - SIG( "glColorMask" ); - dllColorMask( red, green, blue, alpha ); -} -static void APIENTRY logColorMaterial(GLenum face, GLenum mode) -{ - SIG( "glColorMaterial" ); - dllColorMaterial( face, mode ); -} - -static void APIENTRY logColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glColorPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllColorPointer( size, type, stride, pointer ); -} - -static void APIENTRY logCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) -{ - SIG( "glCopyPixels" ); - dllCopyPixels( x, y, width, height, type ); -} - -static void APIENTRY logCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) -{ - SIG( "glCopyTexImage1D" ); - dllCopyTexImage1D( target, level, internalFormat, x, y, width, border ); -} - -static void APIENTRY logCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) -{ - SIG( "glCopyTexImage2D" ); - dllCopyTexImage2D( target, level, internalFormat, x, y, width, height, border ); -} - -static void APIENTRY logCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) -{ - SIG( "glCopyTexSubImage1D" ); - dllCopyTexSubImage1D( target, level, xoffset, x, y, width ); -} - -static void APIENTRY logCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) -{ - SIG( "glCopyTexSubImage2D" ); - dllCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height ); -} - -static void APIENTRY logCullFace(GLenum mode) -{ - fprintf( glw_state.log_fp, "glCullFace( %s )\n", ( mode == GL_FRONT ) ? "GL_FRONT" : "GL_BACK" ); - dllCullFace( mode ); -} - -static void APIENTRY logDeleteLists(GLuint list, GLsizei range) -{ - SIG( "glDeleteLists" ); - dllDeleteLists( list, range ); -} - -static void APIENTRY logDeleteTextures(GLsizei n, const GLuint *textures) -{ - SIG( "glDeleteTextures" ); - dllDeleteTextures( n, textures ); -} - -static void APIENTRY logDepthFunc(GLenum func) -{ - fprintf( glw_state.log_fp, "glDepthFunc( %s )\n", FuncToString( func ) ); - dllDepthFunc( func ); -} - -static void APIENTRY logDepthMask(GLboolean flag) -{ - fprintf( glw_state.log_fp, "glDepthMask( %s )\n", BooleanToString( flag ) ); - dllDepthMask( flag ); -} - -static void APIENTRY logDepthRange(GLclampd zNear, GLclampd zFar) -{ - fprintf( glw_state.log_fp, "glDepthRange( %f, %f )\n", ( float ) zNear, ( float ) zFar ); - dllDepthRange( zNear, zFar ); -} - -static void APIENTRY logDisable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glDisable( %s )\n", CapToString( cap ) ); - dllDisable( cap ); -} - -static void APIENTRY logDisableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glDisableClientState( %s )\n", CapToString( array ) ); - dllDisableClientState( array ); -} - -static void APIENTRY logDrawArrays(GLenum mode, GLint first, GLsizei count) -{ - SIG( "glDrawArrays" ); - dllDrawArrays( mode, first, count ); -} - -static void APIENTRY logDrawBuffer(GLenum mode) -{ - SIG( "glDrawBuffer" ); - dllDrawBuffer( mode ); -} - -static void APIENTRY logDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) -{ - fprintf( glw_state.log_fp, "glDrawElements( %s, %d, %s, MEM )\n", PrimToString( mode ), count, TypeToString( type ) ); - dllDrawElements( mode, count, type, indices ); -} - -static void APIENTRY logDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glDrawPixels" ); - dllDrawPixels( width, height, format, type, pixels ); -} - -static void APIENTRY logEdgeFlag(GLboolean flag) -{ - SIG( "glEdgeFlag" ); - dllEdgeFlag( flag ); -} - -static void APIENTRY logEdgeFlagPointer(GLsizei stride, const void *pointer) -{ - SIG( "glEdgeFlagPointer" ); - dllEdgeFlagPointer( stride, pointer ); -} - -static void APIENTRY logEdgeFlagv(const GLboolean *flag) -{ - SIG( "glEdgeFlagv" ); - dllEdgeFlagv( flag ); -} - -static void APIENTRY logEnable(GLenum cap) -{ - fprintf( glw_state.log_fp, "glEnable( %s )\n", CapToString( cap ) ); - dllEnable( cap ); -} - -static void APIENTRY logEnableClientState(GLenum array) -{ - fprintf( glw_state.log_fp, "glEnableClientState( %s )\n", CapToString( array ) ); - dllEnableClientState( array ); -} - -static void APIENTRY logEnd(void) -{ - SIG( "glEnd" ); - dllEnd(); -} - -static void APIENTRY logEndList(void) -{ - SIG( "glEndList" ); - dllEndList(); -} - -static void APIENTRY logEvalCoord1d(GLdouble u) -{ - SIG( "glEvalCoord1d" ); - dllEvalCoord1d( u ); -} - -static void APIENTRY logEvalCoord1dv(const GLdouble *u) -{ - SIG( "glEvalCoord1dv" ); - dllEvalCoord1dv( u ); -} - -static void APIENTRY logEvalCoord1f(GLfloat u) -{ - SIG( "glEvalCoord1f" ); - dllEvalCoord1f( u ); -} - -static void APIENTRY logEvalCoord1fv(const GLfloat *u) -{ - SIG( "glEvalCoord1fv" ); - dllEvalCoord1fv( u ); -} -static void APIENTRY logEvalCoord2d(GLdouble u, GLdouble v) -{ - SIG( "glEvalCoord2d" ); - dllEvalCoord2d( u, v ); -} -static void APIENTRY logEvalCoord2dv(const GLdouble *u) -{ - SIG( "glEvalCoord2dv" ); - dllEvalCoord2dv( u ); -} -static void APIENTRY logEvalCoord2f(GLfloat u, GLfloat v) -{ - SIG( "glEvalCoord2f" ); - dllEvalCoord2f( u, v ); -} -static void APIENTRY logEvalCoord2fv(const GLfloat *u) -{ - SIG( "glEvalCoord2fv" ); - dllEvalCoord2fv( u ); -} - -static void APIENTRY logEvalMesh1(GLenum mode, GLint i1, GLint i2) -{ - SIG( "glEvalMesh1" ); - dllEvalMesh1( mode, i1, i2 ); -} -static void APIENTRY logEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) -{ - SIG( "glEvalMesh2" ); - dllEvalMesh2( mode, i1, i2, j1, j2 ); -} -static void APIENTRY logEvalPoint1(GLint i) -{ - SIG( "glEvalPoint1" ); - dllEvalPoint1( i ); -} -static void APIENTRY logEvalPoint2(GLint i, GLint j) -{ - SIG( "glEvalPoint2" ); - dllEvalPoint2( i, j ); -} - -static void APIENTRY logFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer) -{ - SIG( "glFeedbackBuffer" ); - dllFeedbackBuffer( size, type, buffer ); -} - -static void APIENTRY logFinish(void) -{ - SIG( "glFinish" ); - dllFinish(); -} - -static void APIENTRY logFlush(void) -{ - SIG( "glFlush" ); - dllFlush(); -} - -static void APIENTRY logFogf(GLenum pname, GLfloat param) -{ - SIG( "glFogf" ); - dllFogf( pname, param ); -} - -static void APIENTRY logFogfv(GLenum pname, const GLfloat *params) -{ - SIG( "glFogfv" ); - dllFogfv( pname, params ); -} - -static void APIENTRY logFogi(GLenum pname, GLint param) -{ - SIG( "glFogi" ); - dllFogi( pname, param ); -} - -static void APIENTRY logFogiv(GLenum pname, const GLint *params) -{ - SIG( "glFogiv" ); - dllFogiv( pname, params ); -} - -static void APIENTRY logFrontFace(GLenum mode) -{ - SIG( "glFrontFace" ); - dllFrontFace( mode ); -} - -static void APIENTRY logFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glFrustum" ); - dllFrustum( left, right, bottom, top, zNear, zFar ); -} - -static GLuint APIENTRY logGenLists(GLsizei range) -{ - SIG( "glGenLists" ); - return dllGenLists( range ); -} - -static void APIENTRY logGenTextures(GLsizei n, GLuint *textures) -{ - SIG( "glGenTextures" ); - dllGenTextures( n, textures ); -} - -static void APIENTRY logGetBooleanv(GLenum pname, GLboolean *params) -{ - SIG( "glGetBooleanv" ); - dllGetBooleanv( pname, params ); -} - -static void APIENTRY logGetClipPlane(GLenum plane, GLdouble *equation) -{ - SIG( "glGetClipPlane" ); - dllGetClipPlane( plane, equation ); -} - -static void APIENTRY logGetDoublev(GLenum pname, GLdouble *params) -{ - SIG( "glGetDoublev" ); - dllGetDoublev( pname, params ); -} - -static GLenum APIENTRY logGetError(void) -{ - SIG( "glGetError" ); - return dllGetError(); -} - -static void APIENTRY logGetFloatv(GLenum pname, GLfloat *params) -{ - SIG( "glGetFloatv" ); - dllGetFloatv( pname, params ); -} - -static void APIENTRY logGetIntegerv(GLenum pname, GLint *params) -{ - SIG( "glGetIntegerv" ); - dllGetIntegerv( pname, params ); -} - -static void APIENTRY logGetLightfv(GLenum light, GLenum pname, GLfloat *params) -{ - SIG( "glGetLightfv" ); - dllGetLightfv( light, pname, params ); -} - -static void APIENTRY logGetLightiv(GLenum light, GLenum pname, GLint *params) -{ - SIG( "glGetLightiv" ); - dllGetLightiv( light, pname, params ); -} - -static void APIENTRY logGetMapdv(GLenum target, GLenum query, GLdouble *v) -{ - SIG( "glGetMapdv" ); - dllGetMapdv( target, query, v ); -} - -static void APIENTRY logGetMapfv(GLenum target, GLenum query, GLfloat *v) -{ - SIG( "glGetMapfv" ); - dllGetMapfv( target, query, v ); -} - -static void APIENTRY logGetMapiv(GLenum target, GLenum query, GLint *v) -{ - SIG( "glGetMapiv" ); - dllGetMapiv( target, query, v ); -} - -static void APIENTRY logGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) -{ - SIG( "glGetMaterialfv" ); - dllGetMaterialfv( face, pname, params ); -} - -static void APIENTRY logGetMaterialiv(GLenum face, GLenum pname, GLint *params) -{ - SIG( "glGetMaterialiv" ); - dllGetMaterialiv( face, pname, params ); -} - -static void APIENTRY logGetPixelMapfv(GLenum map, GLfloat *values) -{ - SIG( "glGetPixelMapfv" ); - dllGetPixelMapfv( map, values ); -} - -static void APIENTRY logGetPixelMapuiv(GLenum map, GLuint *values) -{ - SIG( "glGetPixelMapuiv" ); - dllGetPixelMapuiv( map, values ); -} - -static void APIENTRY logGetPixelMapusv(GLenum map, GLushort *values) -{ - SIG( "glGetPixelMapusv" ); - dllGetPixelMapusv( map, values ); -} - -static void APIENTRY logGetPointerv(GLenum pname, GLvoid* *params) -{ - SIG( "glGetPointerv" ); - dllGetPointerv( pname, params ); -} - -static void APIENTRY logGetPolygonStipple(GLubyte *mask) -{ - SIG( "glGetPolygonStipple" ); - dllGetPolygonStipple( mask ); -} - -static const GLubyte * APIENTRY logGetString(GLenum name) -{ - SIG( "glGetString" ); - return dllGetString( name ); -} - -static void APIENTRY logGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexEnvfv" ); - dllGetTexEnvfv( target, pname, params ); -} - -static void APIENTRY logGetTexEnviv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexEnviv" ); - dllGetTexEnviv( target, pname, params ); -} - -static void APIENTRY logGetTexGendv(GLenum coord, GLenum pname, GLdouble *params) -{ - SIG( "glGetTexGendv" ); - dllGetTexGendv( coord, pname, params ); -} - -static void APIENTRY logGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexGenfv" ); - dllGetTexGenfv( coord, pname, params ); -} - -static void APIENTRY logGetTexGeniv(GLenum coord, GLenum pname, GLint *params) -{ - SIG( "glGetTexGeniv" ); - dllGetTexGeniv( coord, pname, params ); -} - -static void APIENTRY logGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels) -{ - SIG( "glGetTexImage" ); - dllGetTexImage( target, level, format, type, pixels ); -} -static void APIENTRY logGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params ) -{ - SIG( "glGetTexLevelParameterfv" ); - dllGetTexLevelParameterfv( target, level, pname, params ); -} - -static void APIENTRY logGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) -{ - SIG( "glGetTexLevelParameteriv" ); - dllGetTexLevelParameteriv( target, level, pname, params ); -} - -static void APIENTRY logGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) -{ - SIG( "glGetTexParameterfv" ); - dllGetTexParameterfv( target, pname, params ); -} - -static void APIENTRY logGetTexParameteriv(GLenum target, GLenum pname, GLint *params) -{ - SIG( "glGetTexParameteriv" ); - dllGetTexParameteriv( target, pname, params ); -} - -static void APIENTRY logHint(GLenum target, GLenum mode) -{ - fprintf( glw_state.log_fp, "glHint( 0x%x, 0x%x )\n", target, mode ); - dllHint( target, mode ); -} - -static void APIENTRY logIndexMask(GLuint mask) -{ - SIG( "glIndexMask" ); - dllIndexMask( mask ); -} - -static void APIENTRY logIndexPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glIndexPointer" ); - dllIndexPointer( type, stride, pointer ); -} - -static void APIENTRY logIndexd(GLdouble c) -{ - SIG( "glIndexd" ); - dllIndexd( c ); -} - -static void APIENTRY logIndexdv(const GLdouble *c) -{ - SIG( "glIndexdv" ); - dllIndexdv( c ); -} - -static void APIENTRY logIndexf(GLfloat c) -{ - SIG( "glIndexf" ); - dllIndexf( c ); -} - -static void APIENTRY logIndexfv(const GLfloat *c) -{ - SIG( "glIndexfv" ); - dllIndexfv( c ); -} - -static void APIENTRY logIndexi(GLint c) -{ - SIG( "glIndexi" ); - dllIndexi( c ); -} - -static void APIENTRY logIndexiv(const GLint *c) -{ - SIG( "glIndexiv" ); - dllIndexiv( c ); -} - -static void APIENTRY logIndexs(GLshort c) -{ - SIG( "glIndexs" ); - dllIndexs( c ); -} - -static void APIENTRY logIndexsv(const GLshort *c) -{ - SIG( "glIndexsv" ); - dllIndexsv( c ); -} - -static void APIENTRY logIndexub(GLubyte c) -{ - SIG( "glIndexub" ); - dllIndexub( c ); -} - -static void APIENTRY logIndexubv(const GLubyte *c) -{ - SIG( "glIndexubv" ); - dllIndexubv( c ); -} - -static void APIENTRY logInitNames(void) -{ - SIG( "glInitNames" ); - dllInitNames(); -} - -static void APIENTRY logInterleavedArrays(GLenum format, GLsizei stride, const void *pointer) -{ - SIG( "glInterleavedArrays" ); - dllInterleavedArrays( format, stride, pointer ); -} - -static GLboolean APIENTRY logIsEnabled(GLenum cap) -{ - SIG( "glIsEnabled" ); - return dllIsEnabled( cap ); -} -static GLboolean APIENTRY logIsList(GLuint list) -{ - SIG( "glIsList" ); - return dllIsList( list ); -} -static GLboolean APIENTRY logIsTexture(GLuint texture) -{ - SIG( "glIsTexture" ); - return dllIsTexture( texture ); -} - -static void APIENTRY logLightModelf(GLenum pname, GLfloat param) -{ - SIG( "glLightModelf" ); - dllLightModelf( pname, param ); -} - -static void APIENTRY logLightModelfv(GLenum pname, const GLfloat *params) -{ - SIG( "glLightModelfv" ); - dllLightModelfv( pname, params ); -} - -static void APIENTRY logLightModeli(GLenum pname, GLint param) -{ - SIG( "glLightModeli" ); - dllLightModeli( pname, param ); - -} - -static void APIENTRY logLightModeliv(GLenum pname, const GLint *params) -{ - SIG( "glLightModeliv" ); - dllLightModeliv( pname, params ); -} - -static void APIENTRY logLightf(GLenum light, GLenum pname, GLfloat param) -{ - SIG( "glLightf" ); - dllLightf( light, pname, param ); -} - -static void APIENTRY logLightfv(GLenum light, GLenum pname, const GLfloat *params) -{ - SIG( "glLightfv" ); - dllLightfv( light, pname, params ); -} - -static void APIENTRY logLighti(GLenum light, GLenum pname, GLint param) -{ - SIG( "glLighti" ); - dllLighti( light, pname, param ); -} - -static void APIENTRY logLightiv(GLenum light, GLenum pname, const GLint *params) -{ - SIG( "glLightiv" ); - dllLightiv( light, pname, params ); -} - -static void APIENTRY logLineStipple(GLint factor, GLushort pattern) -{ - SIG( "glLineStipple" ); - dllLineStipple( factor, pattern ); -} - -static void APIENTRY logLineWidth(GLfloat width) -{ - SIG( "glLineWidth" ); - dllLineWidth( width ); -} - -static void APIENTRY logListBase(GLuint base) -{ - SIG( "glListBase" ); - dllListBase( base ); -} - -static void APIENTRY logLoadIdentity(void) -{ - SIG( "glLoadIdentity" ); - dllLoadIdentity(); -} - -static void APIENTRY logLoadMatrixd(const GLdouble *m) -{ - SIG( "glLoadMatrixd" ); - dllLoadMatrixd( m ); -} - -static void APIENTRY logLoadMatrixf(const GLfloat *m) -{ - SIG( "glLoadMatrixf" ); - dllLoadMatrixf( m ); -} - -static void APIENTRY logLoadName(GLuint name) -{ - SIG( "glLoadName" ); - dllLoadName( name ); -} - -static void APIENTRY logLogicOp(GLenum opcode) -{ - SIG( "glLogicOp" ); - dllLogicOp( opcode ); -} - -static void APIENTRY logMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) -{ - SIG( "glMap1d" ); - dllMap1d( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) -{ - SIG( "glMap1f" ); - dllMap1f( target, u1, u2, stride, order, points ); -} - -static void APIENTRY logMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) -{ - SIG( "glMap2d" ); - dllMap2d( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) -{ - SIG( "glMap2f" ); - dllMap2f( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); -} - -static void APIENTRY logMapGrid1d(GLint un, GLdouble u1, GLdouble u2) -{ - SIG( "glMapGrid1d" ); - dllMapGrid1d( un, u1, u2 ); -} - -static void APIENTRY logMapGrid1f(GLint un, GLfloat u1, GLfloat u2) -{ - SIG( "glMapGrid1f" ); - dllMapGrid1f( un, u1, u2 ); -} - -static void APIENTRY logMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) -{ - SIG( "glMapGrid2d" ); - dllMapGrid2d( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) -{ - SIG( "glMapGrid2f" ); - dllMapGrid2f( un, u1, u2, vn, v1, v2 ); -} -static void APIENTRY logMaterialf(GLenum face, GLenum pname, GLfloat param) -{ - SIG( "glMaterialf" ); - dllMaterialf( face, pname, param ); -} -static void APIENTRY logMaterialfv(GLenum face, GLenum pname, const GLfloat *params) -{ - SIG( "glMaterialfv" ); - dllMaterialfv( face, pname, params ); -} - -static void APIENTRY logMateriali(GLenum face, GLenum pname, GLint param) -{ - SIG( "glMateriali" ); - dllMateriali( face, pname, param ); -} - -static void APIENTRY logMaterialiv(GLenum face, GLenum pname, const GLint *params) -{ - SIG( "glMaterialiv" ); - dllMaterialiv( face, pname, params ); -} - -static void APIENTRY logMatrixMode(GLenum mode) -{ - SIG( "glMatrixMode" ); - dllMatrixMode( mode ); -} - -static void APIENTRY logMultMatrixd(const GLdouble *m) -{ - SIG( "glMultMatrixd" ); - dllMultMatrixd( m ); -} - -static void APIENTRY logMultMatrixf(const GLfloat *m) -{ - SIG( "glMultMatrixf" ); - dllMultMatrixf( m ); -} - -static void APIENTRY logNewList(GLuint list, GLenum mode) -{ - SIG( "glNewList" ); - dllNewList( list, mode ); -} - -static void APIENTRY logNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) -{ - SIG ("glNormal3b" ); - dllNormal3b( nx, ny, nz ); -} - -static void APIENTRY logNormal3bv(const GLbyte *v) -{ - SIG( "glNormal3bv" ); - dllNormal3bv( v ); -} - -static void APIENTRY logNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) -{ - SIG( "glNormal3d" ); - dllNormal3d( nx, ny, nz ); -} - -static void APIENTRY logNormal3dv(const GLdouble *v) -{ - SIG( "glNormal3dv" ); - dllNormal3dv( v ); -} - -static void APIENTRY logNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) -{ - SIG( "glNormal3f" ); - dllNormal3f( nx, ny, nz ); -} - -static void APIENTRY logNormal3fv(const GLfloat *v) -{ - SIG( "glNormal3fv" ); - dllNormal3fv( v ); -} -static void APIENTRY logNormal3i(GLint nx, GLint ny, GLint nz) -{ - SIG( "glNormal3i" ); - dllNormal3i( nx, ny, nz ); -} -static void APIENTRY logNormal3iv(const GLint *v) -{ - SIG( "glNormal3iv" ); - dllNormal3iv( v ); -} -static void APIENTRY logNormal3s(GLshort nx, GLshort ny, GLshort nz) -{ - SIG( "glNormal3s" ); - dllNormal3s( nx, ny, nz ); -} -static void APIENTRY logNormal3sv(const GLshort *v) -{ - SIG( "glNormal3sv" ); - dllNormal3sv( v ); -} -static void APIENTRY logNormalPointer(GLenum type, GLsizei stride, const void *pointer) -{ - SIG( "glNormalPointer" ); - dllNormalPointer( type, stride, pointer ); -} -static void APIENTRY logOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) -{ - SIG( "glOrtho" ); - dllOrtho( left, right, bottom, top, zNear, zFar ); -} - -static void APIENTRY logPassThrough(GLfloat token) -{ - SIG( "glPassThrough" ); - dllPassThrough( token ); -} - -static void APIENTRY logPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values) -{ - SIG( "glPixelMapfv" ); - dllPixelMapfv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values) -{ - SIG( "glPixelMapuiv" ); - dllPixelMapuiv( map, mapsize, values ); -} - -static void APIENTRY logPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values) -{ - SIG( "glPixelMapusv" ); - dllPixelMapusv( map, mapsize, values ); -} -static void APIENTRY logPixelStoref(GLenum pname, GLfloat param) -{ - SIG( "glPixelStoref" ); - dllPixelStoref( pname, param ); -} -static void APIENTRY logPixelStorei(GLenum pname, GLint param) -{ - SIG( "glPixelStorei" ); - dllPixelStorei( pname, param ); -} -static void APIENTRY logPixelTransferf(GLenum pname, GLfloat param) -{ - SIG( "glPixelTransferf" ); - dllPixelTransferf( pname, param ); -} - -static void APIENTRY logPixelTransferi(GLenum pname, GLint param) -{ - SIG( "glPixelTransferi" ); - dllPixelTransferi( pname, param ); -} - -static void APIENTRY logPixelZoom(GLfloat xfactor, GLfloat yfactor) -{ - SIG( "glPixelZoom" ); - dllPixelZoom( xfactor, yfactor ); -} - -static void APIENTRY logPointSize(GLfloat size) -{ - SIG( "glPointSize" ); - dllPointSize( size ); -} - -static void APIENTRY logPolygonMode(GLenum face, GLenum mode) -{ - fprintf( glw_state.log_fp, "glPolygonMode( 0x%x, 0x%x )\n", face, mode ); - dllPolygonMode( face, mode ); -} - -static void APIENTRY logPolygonOffset(GLfloat factor, GLfloat units) -{ - SIG( "glPolygonOffset" ); - dllPolygonOffset( factor, units ); -} -static void APIENTRY logPolygonStipple(const GLubyte *mask ) -{ - SIG( "glPolygonStipple" ); - dllPolygonStipple( mask ); -} -static void APIENTRY logPopAttrib(void) -{ - SIG( "glPopAttrib" ); - dllPopAttrib(); -} - -static void APIENTRY logPopClientAttrib(void) -{ - SIG( "glPopClientAttrib" ); - dllPopClientAttrib(); -} - -static void APIENTRY logPopMatrix(void) -{ - SIG( "glPopMatrix" ); - dllPopMatrix(); -} - -static void APIENTRY logPopName(void) -{ - SIG( "glPopName" ); - dllPopName(); -} - -static void APIENTRY logPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) -{ - SIG( "glPrioritizeTextures" ); - dllPrioritizeTextures( n, textures, priorities ); -} - -static void APIENTRY logPushAttrib(GLbitfield mask) -{ - SIG( "glPushAttrib" ); - dllPushAttrib( mask ); -} - -static void APIENTRY logPushClientAttrib(GLbitfield mask) -{ - SIG( "glPushClientAttrib" ); - dllPushClientAttrib( mask ); -} - -static void APIENTRY logPushMatrix(void) -{ - SIG( "glPushMatrix" ); - dllPushMatrix(); -} - -static void APIENTRY logPushName(GLuint name) -{ - SIG( "glPushName" ); - dllPushName( name ); -} - -static void APIENTRY logRasterPos2d(GLdouble x, GLdouble y) -{ - SIG ("glRasterPot2d" ); - dllRasterPos2d( x, y ); -} - -static void APIENTRY logRasterPos2dv(const GLdouble *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2dv( v ); -} - -static void APIENTRY logRasterPos2f(GLfloat x, GLfloat y) -{ - SIG( "glRasterPos2f" ); - dllRasterPos2f( x, y ); -} -static void APIENTRY logRasterPos2fv(const GLfloat *v) -{ - SIG( "glRasterPos2dv" ); - dllRasterPos2fv( v ); -} -static void APIENTRY logRasterPos2i(GLint x, GLint y) -{ - SIG( "glRasterPos2if" ); - dllRasterPos2i( x, y ); -} -static void APIENTRY logRasterPos2iv(const GLint *v) -{ - SIG( "glRasterPos2iv" ); - dllRasterPos2iv( v ); -} -static void APIENTRY logRasterPos2s(GLshort x, GLshort y) -{ - SIG( "glRasterPos2s" ); - dllRasterPos2s( x, y ); -} -static void APIENTRY logRasterPos2sv(const GLshort *v) -{ - SIG( "glRasterPos2sv" ); - dllRasterPos2sv( v ); -} -static void APIENTRY logRasterPos3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRasterPos3d" ); - dllRasterPos3d( x, y, z ); -} -static void APIENTRY logRasterPos3dv(const GLdouble *v) -{ - SIG( "glRasterPos3dv" ); - dllRasterPos3dv( v ); -} -static void APIENTRY logRasterPos3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRasterPos3f" ); - dllRasterPos3f( x, y, z ); -} -static void APIENTRY logRasterPos3fv(const GLfloat *v) -{ - SIG( "glRasterPos3fv" ); - dllRasterPos3fv( v ); -} -static void APIENTRY logRasterPos3i(GLint x, GLint y, GLint z) -{ - SIG( "glRasterPos3i" ); - dllRasterPos3i( x, y, z ); -} -static void APIENTRY logRasterPos3iv(const GLint *v) -{ - SIG( "glRasterPos3iv" ); - dllRasterPos3iv( v ); -} -static void APIENTRY logRasterPos3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glRasterPos3s" ); - dllRasterPos3s( x, y, z ); -} -static void APIENTRY logRasterPos3sv(const GLshort *v) -{ - SIG( "glRasterPos3sv" ); - dllRasterPos3sv( v ); -} -static void APIENTRY logRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glRasterPos4d" ); - dllRasterPos4d( x, y, z, w ); -} -static void APIENTRY logRasterPos4dv(const GLdouble *v) -{ - SIG( "glRasterPos4dv" ); - dllRasterPos4dv( v ); -} -static void APIENTRY logRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glRasterPos4f" ); - dllRasterPos4f( x, y, z, w ); -} -static void APIENTRY logRasterPos4fv(const GLfloat *v) -{ - SIG( "glRasterPos4fv" ); - dllRasterPos4fv( v ); -} -static void APIENTRY logRasterPos4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glRasterPos4i" ); - dllRasterPos4i( x, y, z, w ); -} -static void APIENTRY logRasterPos4iv(const GLint *v) -{ - SIG( "glRasterPos4iv" ); - dllRasterPos4iv( v ); -} -static void APIENTRY logRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glRasterPos4s" ); - dllRasterPos4s( x, y, z, w ); -} -static void APIENTRY logRasterPos4sv(const GLshort *v) -{ - SIG( "glRasterPos4sv" ); - dllRasterPos4sv( v ); -} -static void APIENTRY logReadBuffer(GLenum mode) -{ - SIG( "glReadBuffer" ); - dllReadBuffer( mode ); -} -static void APIENTRY logReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) -{ - SIG( "glReadPixels" ); - dllReadPixels( x, y, width, height, format, type, pixels ); -} - -static void APIENTRY logRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) -{ - SIG( "glRectd" ); - dllRectd( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectdv(const GLdouble *v1, const GLdouble *v2) -{ - SIG( "glRectdv" ); - dllRectdv( v1, v2 ); -} - -static void APIENTRY logRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) -{ - SIG( "glRectf" ); - dllRectf( x1, y1, x2, y2 ); -} - -static void APIENTRY logRectfv(const GLfloat *v1, const GLfloat *v2) -{ - SIG( "glRectfv" ); - dllRectfv( v1, v2 ); -} -static void APIENTRY logRecti(GLint x1, GLint y1, GLint x2, GLint y2) -{ - SIG( "glRecti" ); - dllRecti( x1, y1, x2, y2 ); -} -static void APIENTRY logRectiv(const GLint *v1, const GLint *v2) -{ - SIG( "glRectiv" ); - dllRectiv( v1, v2 ); -} -static void APIENTRY logRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) -{ - SIG( "glRects" ); - dllRects( x1, y1, x2, y2 ); -} -static void APIENTRY logRectsv(const GLshort *v1, const GLshort *v2) -{ - SIG( "glRectsv" ); - dllRectsv( v1, v2 ); -} -static GLint APIENTRY logRenderMode(GLenum mode) -{ - SIG( "glRenderMode" ); - return dllRenderMode( mode ); -} -static void APIENTRY logRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glRotated" ); - dllRotated( angle, x, y, z ); -} - -static void APIENTRY logRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glRotatef" ); - dllRotatef( angle, x, y, z ); -} - -static void APIENTRY logScaled(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glScaled" ); - dllScaled( x, y, z ); -} - -static void APIENTRY logScalef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glScalef" ); - dllScalef( x, y, z ); -} - -static void APIENTRY logScissor(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glScissor( %d, %d, %d, %d )\n", x, y, width, height ); - dllScissor( x, y, width, height ); -} - -static void APIENTRY logSelectBuffer(GLsizei size, GLuint *buffer) -{ - SIG( "glSelectBuffer" ); - dllSelectBuffer( size, buffer ); -} - -static void APIENTRY logShadeModel(GLenum mode) -{ - SIG( "glShadeModel" ); - dllShadeModel( mode ); -} - -static void APIENTRY logStencilFunc(GLenum func, GLint ref, GLuint mask) -{ - SIG( "glStencilFunc" ); - dllStencilFunc( func, ref, mask ); -} - -static void APIENTRY logStencilMask(GLuint mask) -{ - SIG( "glStencilMask" ); - dllStencilMask( mask ); -} - -static void APIENTRY logStencilOp(GLenum fail, GLenum zfail, GLenum zpass) -{ - SIG( "glStencilOp" ); - dllStencilOp( fail, zfail, zpass ); -} - -static void APIENTRY logTexCoord1d(GLdouble s) -{ - SIG( "glTexCoord1d" ); - dllTexCoord1d( s ); -} - -static void APIENTRY logTexCoord1dv(const GLdouble *v) -{ - SIG( "glTexCoord1dv" ); - dllTexCoord1dv( v ); -} - -static void APIENTRY logTexCoord1f(GLfloat s) -{ - SIG( "glTexCoord1f" ); - dllTexCoord1f( s ); -} -static void APIENTRY logTexCoord1fv(const GLfloat *v) -{ - SIG( "glTexCoord1fv" ); - dllTexCoord1fv( v ); -} -static void APIENTRY logTexCoord1i(GLint s) -{ - SIG( "glTexCoord1i" ); - dllTexCoord1i( s ); -} -static void APIENTRY logTexCoord1iv(const GLint *v) -{ - SIG( "glTexCoord1iv" ); - dllTexCoord1iv( v ); -} -static void APIENTRY logTexCoord1s(GLshort s) -{ - SIG( "glTexCoord1s" ); - dllTexCoord1s( s ); -} -static void APIENTRY logTexCoord1sv(const GLshort *v) -{ - SIG( "glTexCoord1sv" ); - dllTexCoord1sv( v ); -} -static void APIENTRY logTexCoord2d(GLdouble s, GLdouble t) -{ - SIG( "glTexCoord2d" ); - dllTexCoord2d( s, t ); -} - -static void APIENTRY logTexCoord2dv(const GLdouble *v) -{ - SIG( "glTexCoord2dv" ); - dllTexCoord2dv( v ); -} -static void APIENTRY logTexCoord2f(GLfloat s, GLfloat t) -{ - SIG( "glTexCoord2f" ); - dllTexCoord2f( s, t ); -} -static void APIENTRY logTexCoord2fv(const GLfloat *v) -{ - SIG( "glTexCoord2fv" ); - dllTexCoord2fv( v ); -} -static void APIENTRY logTexCoord2i(GLint s, GLint t) -{ - SIG( "glTexCoord2i" ); - dllTexCoord2i( s, t ); -} -static void APIENTRY logTexCoord2iv(const GLint *v) -{ - SIG( "glTexCoord2iv" ); - dllTexCoord2iv( v ); -} -static void APIENTRY logTexCoord2s(GLshort s, GLshort t) -{ - SIG( "glTexCoord2s" ); - dllTexCoord2s( s, t ); -} -static void APIENTRY logTexCoord2sv(const GLshort *v) -{ - SIG( "glTexCoord2sv" ); - dllTexCoord2sv( v ); -} -static void APIENTRY logTexCoord3d(GLdouble s, GLdouble t, GLdouble r) -{ - SIG( "glTexCoord3d" ); - dllTexCoord3d( s, t, r ); -} -static void APIENTRY logTexCoord3dv(const GLdouble *v) -{ - SIG( "glTexCoord3dv" ); - dllTexCoord3dv( v ); -} -static void APIENTRY logTexCoord3f(GLfloat s, GLfloat t, GLfloat r) -{ - SIG( "glTexCoord3f" ); - dllTexCoord3f( s, t, r ); -} -static void APIENTRY logTexCoord3fv(const GLfloat *v) -{ - SIG( "glTexCoord3fv" ); - dllTexCoord3fv( v ); -} -static void APIENTRY logTexCoord3i(GLint s, GLint t, GLint r) -{ - SIG( "glTexCoord3i" ); - dllTexCoord3i( s, t, r ); -} -static void APIENTRY logTexCoord3iv(const GLint *v) -{ - SIG( "glTexCoord3iv" ); - dllTexCoord3iv( v ); -} -static void APIENTRY logTexCoord3s(GLshort s, GLshort t, GLshort r) -{ - SIG( "glTexCoord3s" ); - dllTexCoord3s( s, t, r ); -} -static void APIENTRY logTexCoord3sv(const GLshort *v) -{ - SIG( "glTexCoord3sv" ); - dllTexCoord3sv( v ); -} -static void APIENTRY logTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) -{ - SIG( "glTexCoord4d" ); - dllTexCoord4d( s, t, r, q ); -} -static void APIENTRY logTexCoord4dv(const GLdouble *v) -{ - SIG( "glTexCoord4dv" ); - dllTexCoord4dv( v ); -} -static void APIENTRY logTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) -{ - SIG( "glTexCoord4f" ); - dllTexCoord4f( s, t, r, q ); -} -static void APIENTRY logTexCoord4fv(const GLfloat *v) -{ - SIG( "glTexCoord4fv" ); - dllTexCoord4fv( v ); -} -static void APIENTRY logTexCoord4i(GLint s, GLint t, GLint r, GLint q) -{ - SIG( "glTexCoord4i" ); - dllTexCoord4i( s, t, r, q ); -} -static void APIENTRY logTexCoord4iv(const GLint *v) -{ - SIG( "glTexCoord4iv" ); - dllTexCoord4iv( v ); -} -static void APIENTRY logTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) -{ - SIG( "glTexCoord4s" ); - dllTexCoord4s( s, t, r, q ); -} -static void APIENTRY logTexCoord4sv(const GLshort *v) -{ - SIG( "glTexCoord4sv" ); - dllTexCoord4sv( v ); -} -static void APIENTRY logTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glTexCoordPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllTexCoordPointer( size, type, stride, pointer ); -} - -static void APIENTRY logTexEnvf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexEnvf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexEnvf( target, pname, param ); -} - -static void APIENTRY logTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexEnvfv" ); - dllTexEnvfv( target, pname, params ); -} - -static void APIENTRY logTexEnvi(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexEnvi( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexEnvi( target, pname, param ); -} -static void APIENTRY logTexEnviv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexEnviv" ); - dllTexEnviv( target, pname, params ); -} - -static void APIENTRY logTexGend(GLenum coord, GLenum pname, GLdouble param) -{ - SIG( "glTexGend" ); - dllTexGend( coord, pname, param ); -} - -static void APIENTRY logTexGendv(GLenum coord, GLenum pname, const GLdouble *params) -{ - SIG( "glTexGendv" ); - dllTexGendv( coord, pname, params ); -} - -static void APIENTRY logTexGenf(GLenum coord, GLenum pname, GLfloat param) -{ - SIG( "glTexGenf" ); - dllTexGenf( coord, pname, param ); -} -static void APIENTRY logTexGenfv(GLenum coord, GLenum pname, const GLfloat *params) -{ - SIG( "glTexGenfv" ); - dllTexGenfv( coord, pname, params ); -} -static void APIENTRY logTexGeni(GLenum coord, GLenum pname, GLint param) -{ - SIG( "glTexGeni" ); - dllTexGeni( coord, pname, param ); -} -static void APIENTRY logTexGeniv(GLenum coord, GLenum pname, const GLint *params) -{ - SIG( "glTexGeniv" ); - dllTexGeniv( coord, pname, params ); -} -static void APIENTRY logTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage1D" ); - dllTexImage1D( target, level, internalformat, width, border, format, type, pixels ); -} -static void APIENTRY logTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexImage2D" ); - dllTexImage2D( target, level, internalformat, width, height, border, format, type, pixels ); -} - -static void APIENTRY logTexParameterf(GLenum target, GLenum pname, GLfloat param) -{ - fprintf( glw_state.log_fp, "glTexParameterf( 0x%x, 0x%x, %f )\n", target, pname, param ); - dllTexParameterf( target, pname, param ); -} - -static void APIENTRY logTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) -{ - SIG( "glTexParameterfv" ); - dllTexParameterfv( target, pname, params ); -} -static void APIENTRY logTexParameteri(GLenum target, GLenum pname, GLint param) -{ - fprintf( glw_state.log_fp, "glTexParameteri( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); - dllTexParameteri( target, pname, param ); -} -static void APIENTRY logTexParameteriv(GLenum target, GLenum pname, const GLint *params) -{ - SIG( "glTexParameteriv" ); - dllTexParameteriv( target, pname, params ); -} -static void APIENTRY logTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage1D" ); - dllTexSubImage1D( target, level, xoffset, width, format, type, pixels ); -} -static void APIENTRY logTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) -{ - SIG( "glTexSubImage2D" ); - dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels ); -} -static void APIENTRY logTranslated(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glTranslated" ); - dllTranslated( x, y, z ); -} - -static void APIENTRY logTranslatef(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glTranslatef" ); - dllTranslatef( x, y, z ); -} - -static void APIENTRY logVertex2d(GLdouble x, GLdouble y) -{ - SIG( "glVertex2d" ); - dllVertex2d( x, y ); -} - -static void APIENTRY logVertex2dv(const GLdouble *v) -{ - SIG( "glVertex2dv" ); - dllVertex2dv( v ); -} -static void APIENTRY logVertex2f(GLfloat x, GLfloat y) -{ - SIG( "glVertex2f" ); - dllVertex2f( x, y ); -} -static void APIENTRY logVertex2fv(const GLfloat *v) -{ - SIG( "glVertex2fv" ); - dllVertex2fv( v ); -} -static void APIENTRY logVertex2i(GLint x, GLint y) -{ - SIG( "glVertex2i" ); - dllVertex2i( x, y ); -} -static void APIENTRY logVertex2iv(const GLint *v) -{ - SIG( "glVertex2iv" ); - dllVertex2iv( v ); -} -static void APIENTRY logVertex2s(GLshort x, GLshort y) -{ - SIG( "glVertex2s" ); - dllVertex2s( x, y ); -} -static void APIENTRY logVertex2sv(const GLshort *v) -{ - SIG( "glVertex2sv" ); - dllVertex2sv( v ); -} -static void APIENTRY logVertex3d(GLdouble x, GLdouble y, GLdouble z) -{ - SIG( "glVertex3d" ); - dllVertex3d( x, y, z ); -} -static void APIENTRY logVertex3dv(const GLdouble *v) -{ - SIG( "glVertex3dv" ); - dllVertex3dv( v ); -} -static void APIENTRY logVertex3f(GLfloat x, GLfloat y, GLfloat z) -{ - SIG( "glVertex3f" ); - dllVertex3f( x, y, z ); -} -static void APIENTRY logVertex3fv(const GLfloat *v) -{ - SIG( "glVertex3fv" ); - dllVertex3fv( v ); -} -static void APIENTRY logVertex3i(GLint x, GLint y, GLint z) -{ - SIG( "glVertex3i" ); - dllVertex3i( x, y, z ); -} -static void APIENTRY logVertex3iv(const GLint *v) -{ - SIG( "glVertex3iv" ); - dllVertex3iv( v ); -} -static void APIENTRY logVertex3s(GLshort x, GLshort y, GLshort z) -{ - SIG( "glVertex3s" ); - dllVertex3s( x, y, z ); -} -static void APIENTRY logVertex3sv(const GLshort *v) -{ - SIG( "glVertex3sv" ); - dllVertex3sv( v ); -} -static void APIENTRY logVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ - SIG( "glVertex4d" ); - dllVertex4d( x, y, z, w ); -} -static void APIENTRY logVertex4dv(const GLdouble *v) -{ - SIG( "glVertex4dv" ); - dllVertex4dv( v ); -} -static void APIENTRY logVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - SIG( "glVertex4f" ); - dllVertex4f( x, y, z, w ); -} -static void APIENTRY logVertex4fv(const GLfloat *v) -{ - SIG( "glVertex4fv" ); - dllVertex4fv( v ); -} -static void APIENTRY logVertex4i(GLint x, GLint y, GLint z, GLint w) -{ - SIG( "glVertex4i" ); - dllVertex4i( x, y, z, w ); -} -static void APIENTRY logVertex4iv(const GLint *v) -{ - SIG( "glVertex4iv" ); - dllVertex4iv( v ); -} -static void APIENTRY logVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) -{ - SIG( "glVertex4s" ); - dllVertex4s( x, y, z, w ); -} -static void APIENTRY logVertex4sv(const GLshort *v) -{ - SIG( "glVertex4sv" ); - dllVertex4sv( v ); -} -static void APIENTRY logVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) -{ - fprintf( glw_state.log_fp, "glVertexPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); - dllVertexPointer( size, type, stride, pointer ); -} -static void APIENTRY logViewport(GLint x, GLint y, GLsizei width, GLsizei height) -{ - fprintf( glw_state.log_fp, "glViewport( %d, %d, %d, %d )\n", x, y, width, height ); - dllViewport( x, y, width, height ); -} - -/* -** QGL_Shutdown -** -** Unloads the specified DLL then nulls out all the proc pointers. This -** is only called during a hard shutdown of the OGL subsystem (e.g. vid_restart). -*/ -void QGL_Shutdown( void ) -{ - ri.Printf( PRINT_ALL, "...shutting down QGL\n" ); - - if ( glw_state.hinstOpenGL ) - { - ri.Printf( PRINT_ALL, "...unloading OpenGL DLL\n" ); - FreeLibrary( glw_state.hinstOpenGL ); - } - - glw_state.hinstOpenGL = NULL; - - qglAccum = NULL; - qglAlphaFunc = NULL; - qglAreTexturesResident = NULL; - qglArrayElement = NULL; - qglBegin = NULL; - qglBindTexture = NULL; - qglBitmap = NULL; - qglBlendFunc = NULL; - qglCallList = NULL; - qglCallLists = NULL; - qglClear = NULL; - qglClearAccum = NULL; - qglClearColor = NULL; - qglClearDepth = NULL; - qglClearIndex = NULL; - qglClearStencil = NULL; - qglClipPlane = NULL; - qglColor3b = NULL; - qglColor3bv = NULL; - qglColor3d = NULL; - qglColor3dv = NULL; - qglColor3f = NULL; - qglColor3fv = NULL; - qglColor3i = NULL; - qglColor3iv = NULL; - qglColor3s = NULL; - qglColor3sv = NULL; - qglColor3ub = NULL; - qglColor3ubv = NULL; - qglColor3ui = NULL; - qglColor3uiv = NULL; - qglColor3us = NULL; - qglColor3usv = NULL; - qglColor4b = NULL; - qglColor4bv = NULL; - qglColor4d = NULL; - qglColor4dv = NULL; - qglColor4f = NULL; - qglColor4fv = NULL; - qglColor4i = NULL; - qglColor4iv = NULL; - qglColor4s = NULL; - qglColor4sv = NULL; - qglColor4ub = NULL; - qglColor4ubv = NULL; - qglColor4ui = NULL; - qglColor4uiv = NULL; - qglColor4us = NULL; - qglColor4usv = NULL; - qglColorMask = NULL; - qglColorMaterial = NULL; - qglColorPointer = NULL; - qglCopyPixels = NULL; - qglCopyTexImage1D = NULL; - qglCopyTexImage2D = NULL; - qglCopyTexSubImage1D = NULL; - qglCopyTexSubImage2D = NULL; - qglCullFace = NULL; - qglDeleteLists = NULL; - qglDeleteTextures = NULL; - qglDepthFunc = NULL; - qglDepthMask = NULL; - qglDepthRange = NULL; - qglDisable = NULL; - qglDisableClientState = NULL; - qglDrawArrays = NULL; - qglDrawBuffer = NULL; - qglDrawElements = NULL; - qglDrawPixels = NULL; - qglEdgeFlag = NULL; - qglEdgeFlagPointer = NULL; - qglEdgeFlagv = NULL; - qglEnable = NULL; - qglEnableClientState = NULL; - qglEnd = NULL; - qglEndList = NULL; - qglEvalCoord1d = NULL; - qglEvalCoord1dv = NULL; - qglEvalCoord1f = NULL; - qglEvalCoord1fv = NULL; - qglEvalCoord2d = NULL; - qglEvalCoord2dv = NULL; - qglEvalCoord2f = NULL; - qglEvalCoord2fv = NULL; - qglEvalMesh1 = NULL; - qglEvalMesh2 = NULL; - qglEvalPoint1 = NULL; - qglEvalPoint2 = NULL; - qglFeedbackBuffer = NULL; - qglFinish = NULL; - qglFlush = NULL; - qglFogf = NULL; - qglFogfv = NULL; - qglFogi = NULL; - qglFogiv = NULL; - qglFrontFace = NULL; - qglFrustum = NULL; - qglGenLists = NULL; - qglGenTextures = NULL; - qglGetBooleanv = NULL; - qglGetClipPlane = NULL; - qglGetDoublev = NULL; - qglGetError = NULL; - qglGetFloatv = NULL; - qglGetIntegerv = NULL; - qglGetLightfv = NULL; - qglGetLightiv = NULL; - qglGetMapdv = NULL; - qglGetMapfv = NULL; - qglGetMapiv = NULL; - qglGetMaterialfv = NULL; - qglGetMaterialiv = NULL; - qglGetPixelMapfv = NULL; - qglGetPixelMapuiv = NULL; - qglGetPixelMapusv = NULL; - qglGetPointerv = NULL; - qglGetPolygonStipple = NULL; - qglGetString = NULL; - qglGetTexEnvfv = NULL; - qglGetTexEnviv = NULL; - qglGetTexGendv = NULL; - qglGetTexGenfv = NULL; - qglGetTexGeniv = NULL; - qglGetTexImage = NULL; - qglGetTexLevelParameterfv = NULL; - qglGetTexLevelParameteriv = NULL; - qglGetTexParameterfv = NULL; - qglGetTexParameteriv = NULL; - qglHint = NULL; - qglIndexMask = NULL; - qglIndexPointer = NULL; - qglIndexd = NULL; - qglIndexdv = NULL; - qglIndexf = NULL; - qglIndexfv = NULL; - qglIndexi = NULL; - qglIndexiv = NULL; - qglIndexs = NULL; - qglIndexsv = NULL; - qglIndexub = NULL; - qglIndexubv = NULL; - qglInitNames = NULL; - qglInterleavedArrays = NULL; - qglIsEnabled = NULL; - qglIsList = NULL; - qglIsTexture = NULL; - qglLightModelf = NULL; - qglLightModelfv = NULL; - qglLightModeli = NULL; - qglLightModeliv = NULL; - qglLightf = NULL; - qglLightfv = NULL; - qglLighti = NULL; - qglLightiv = NULL; - qglLineStipple = NULL; - qglLineWidth = NULL; - qglListBase = NULL; - qglLoadIdentity = NULL; - qglLoadMatrixd = NULL; - qglLoadMatrixf = NULL; - qglLoadName = NULL; - qglLogicOp = NULL; - qglMap1d = NULL; - qglMap1f = NULL; - qglMap2d = NULL; - qglMap2f = NULL; - qglMapGrid1d = NULL; - qglMapGrid1f = NULL; - qglMapGrid2d = NULL; - qglMapGrid2f = NULL; - qglMaterialf = NULL; - qglMaterialfv = NULL; - qglMateriali = NULL; - qglMaterialiv = NULL; - qglMatrixMode = NULL; - qglMultMatrixd = NULL; - qglMultMatrixf = NULL; - qglNewList = NULL; - qglNormal3b = NULL; - qglNormal3bv = NULL; - qglNormal3d = NULL; - qglNormal3dv = NULL; - qglNormal3f = NULL; - qglNormal3fv = NULL; - qglNormal3i = NULL; - qglNormal3iv = NULL; - qglNormal3s = NULL; - qglNormal3sv = NULL; - qglNormalPointer = NULL; - qglOrtho = NULL; - qglPassThrough = NULL; - qglPixelMapfv = NULL; - qglPixelMapuiv = NULL; - qglPixelMapusv = NULL; - qglPixelStoref = NULL; - qglPixelStorei = NULL; - qglPixelTransferf = NULL; - qglPixelTransferi = NULL; - qglPixelZoom = NULL; - qglPointSize = NULL; - qglPolygonMode = NULL; - qglPolygonOffset = NULL; - qglPolygonStipple = NULL; - qglPopAttrib = NULL; - qglPopClientAttrib = NULL; - qglPopMatrix = NULL; - qglPopName = NULL; - qglPrioritizeTextures = NULL; - qglPushAttrib = NULL; - qglPushClientAttrib = NULL; - qglPushMatrix = NULL; - qglPushName = NULL; - qglRasterPos2d = NULL; - qglRasterPos2dv = NULL; - qglRasterPos2f = NULL; - qglRasterPos2fv = NULL; - qglRasterPos2i = NULL; - qglRasterPos2iv = NULL; - qglRasterPos2s = NULL; - qglRasterPos2sv = NULL; - qglRasterPos3d = NULL; - qglRasterPos3dv = NULL; - qglRasterPos3f = NULL; - qglRasterPos3fv = NULL; - qglRasterPos3i = NULL; - qglRasterPos3iv = NULL; - qglRasterPos3s = NULL; - qglRasterPos3sv = NULL; - qglRasterPos4d = NULL; - qglRasterPos4dv = NULL; - qglRasterPos4f = NULL; - qglRasterPos4fv = NULL; - qglRasterPos4i = NULL; - qglRasterPos4iv = NULL; - qglRasterPos4s = NULL; - qglRasterPos4sv = NULL; - qglReadBuffer = NULL; - qglReadPixels = NULL; - qglRectd = NULL; - qglRectdv = NULL; - qglRectf = NULL; - qglRectfv = NULL; - qglRecti = NULL; - qglRectiv = NULL; - qglRects = NULL; - qglRectsv = NULL; - qglRenderMode = NULL; - qglRotated = NULL; - qglRotatef = NULL; - qglScaled = NULL; - qglScalef = NULL; - qglScissor = NULL; - qglSelectBuffer = NULL; - qglShadeModel = NULL; - qglStencilFunc = NULL; - qglStencilMask = NULL; - qglStencilOp = NULL; - qglTexCoord1d = NULL; - qglTexCoord1dv = NULL; - qglTexCoord1f = NULL; - qglTexCoord1fv = NULL; - qglTexCoord1i = NULL; - qglTexCoord1iv = NULL; - qglTexCoord1s = NULL; - qglTexCoord1sv = NULL; - qglTexCoord2d = NULL; - qglTexCoord2dv = NULL; - qglTexCoord2f = NULL; - qglTexCoord2fv = NULL; - qglTexCoord2i = NULL; - qglTexCoord2iv = NULL; - qglTexCoord2s = NULL; - qglTexCoord2sv = NULL; - qglTexCoord3d = NULL; - qglTexCoord3dv = NULL; - qglTexCoord3f = NULL; - qglTexCoord3fv = NULL; - qglTexCoord3i = NULL; - qglTexCoord3iv = NULL; - qglTexCoord3s = NULL; - qglTexCoord3sv = NULL; - qglTexCoord4d = NULL; - qglTexCoord4dv = NULL; - qglTexCoord4f = NULL; - qglTexCoord4fv = NULL; - qglTexCoord4i = NULL; - qglTexCoord4iv = NULL; - qglTexCoord4s = NULL; - qglTexCoord4sv = NULL; - qglTexCoordPointer = NULL; - qglTexEnvf = NULL; - qglTexEnvfv = NULL; - qglTexEnvi = NULL; - qglTexEnviv = NULL; - qglTexGend = NULL; - qglTexGendv = NULL; - qglTexGenf = NULL; - qglTexGenfv = NULL; - qglTexGeni = NULL; - qglTexGeniv = NULL; - qglTexImage1D = NULL; - qglTexImage2D = NULL; - qglTexParameterf = NULL; - qglTexParameterfv = NULL; - qglTexParameteri = NULL; - qglTexParameteriv = NULL; - qglTexSubImage1D = NULL; - qglTexSubImage2D = NULL; - qglTranslated = NULL; - qglTranslatef = NULL; - qglVertex2d = NULL; - qglVertex2dv = NULL; - qglVertex2f = NULL; - qglVertex2fv = NULL; - qglVertex2i = NULL; - qglVertex2iv = NULL; - qglVertex2s = NULL; - qglVertex2sv = NULL; - qglVertex3d = NULL; - qglVertex3dv = NULL; - qglVertex3f = NULL; - qglVertex3fv = NULL; - qglVertex3i = NULL; - qglVertex3iv = NULL; - qglVertex3s = NULL; - qglVertex3sv = NULL; - qglVertex4d = NULL; - qglVertex4dv = NULL; - qglVertex4f = NULL; - qglVertex4fv = NULL; - qglVertex4i = NULL; - qglVertex4iv = NULL; - qglVertex4s = NULL; - qglVertex4sv = NULL; - qglVertexPointer = NULL; - qglViewport = NULL; - - qwglCopyContext = NULL; - qwglCreateContext = NULL; - qwglCreateLayerContext = NULL; - qwglDeleteContext = NULL; - qwglDescribeLayerPlane = NULL; - qwglGetCurrentContext = NULL; - qwglGetCurrentDC = NULL; - qwglGetLayerPaletteEntries = NULL; - qwglGetProcAddress = NULL; - qwglMakeCurrent = NULL; - qwglRealizeLayerPalette = NULL; - qwglSetLayerPaletteEntries = NULL; - qwglShareLists = NULL; - qwglSwapLayerBuffers = NULL; - qwglUseFontBitmaps = NULL; - qwglUseFontOutlines = NULL; - - qwglChoosePixelFormat = NULL; - qwglDescribePixelFormat = NULL; - qwglGetPixelFormat = NULL; - qwglSetPixelFormat = NULL; - qwglSwapBuffers = NULL; -} - -#define GR_NUM_BOARDS 0x0f - -static qboolean GlideIsValid( void ) -{ - HMODULE hGlide; -// int numBoards; -// void (__stdcall *grGet)(unsigned int, unsigned int, int*); - - if ( ( hGlide = LoadLibrary("Glide3X") ) != 0 ) - { - // FIXME: 3Dfx needs to fix this shit - return qtrue; - -#if 0 - grGet = (void *)GetProcAddress( hGlide, "_grGet@12"); - - if ( grGet ) - { - grGet( GR_NUM_BOARDS, sizeof(int), &numBoards); - } - else - { - // if we've reached this point, something is seriously wrong - ri.Printf( PRINT_WARNING, "WARNING: could not find grGet in GLIDE3X.DLL\n" ); - numBoards = 0; - } - - FreeLibrary( hGlide ); - hGlide = NULL; - - if ( numBoards > 0 ) - { - return qtrue; - } - - ri.Printf( PRINT_WARNING, "WARNING: invalid Glide installation!\n" ); -#endif - } - - return qfalse; -} - -# pragma warning (disable : 4113 4133 4047 ) -# define GPA( a ) GetProcAddress( glw_state.hinstOpenGL, a ) - -/* -** QGL_Init -** -** This is responsible for binding our qgl function pointers to -** the appropriate GL stuff. In Windows this means doing a -** LoadLibrary and a bunch of calls to GetProcAddress. On other -** operating systems we need to do the right thing, whatever that -** might be. -*/ -qboolean QGL_Init( const char *dllname ) -{ - char systemDir[1024]; - char libName[1024]; - - GetSystemDirectory( systemDir, sizeof( systemDir ) ); - - assert( glw_state.hinstOpenGL == 0 ); - - ri.Printf( PRINT_ALL, "...initializing QGL\n" ); - - // NOTE: this assumes that 'dllname' is lower case (and it should be)! - if ( strstr( dllname, _3DFX_DRIVER_NAME ) ) - { - if ( !GlideIsValid() ) - { - ri.Printf( PRINT_ALL, "...WARNING: missing Glide installation, assuming no 3Dfx available\n" ); - return qfalse; - } - } - - if ( dllname[0] != '!' ) - { - Com_sprintf( libName, sizeof( libName ), "%s\\%s", systemDir, dllname ); - } - else - { - Q_strncpyz( libName, dllname, sizeof( libName ) ); - } - - ri.Printf( PRINT_ALL, "...calling LoadLibrary( '%s.dll' ): ", libName ); - - if ( ( glw_state.hinstOpenGL = LoadLibrary( dllname ) ) == 0 ) - { - ri.Printf( PRINT_ALL, "failed\n" ); - return qfalse; - } - ri.Printf( PRINT_ALL, "succeeded\n" ); - - qglAccum = dllAccum = GPA( "glAccum" ); - qglAlphaFunc = dllAlphaFunc = GPA( "glAlphaFunc" ); - qglAreTexturesResident = dllAreTexturesResident = GPA( "glAreTexturesResident" ); - qglArrayElement = dllArrayElement = GPA( "glArrayElement" ); - qglBegin = dllBegin = GPA( "glBegin" ); - qglBindTexture = dllBindTexture = GPA( "glBindTexture" ); - qglBitmap = dllBitmap = GPA( "glBitmap" ); - qglBlendFunc = dllBlendFunc = GPA( "glBlendFunc" ); - qglCallList = dllCallList = GPA( "glCallList" ); - qglCallLists = dllCallLists = GPA( "glCallLists" ); - qglClear = dllClear = GPA( "glClear" ); - qglClearAccum = dllClearAccum = GPA( "glClearAccum" ); - qglClearColor = dllClearColor = GPA( "glClearColor" ); - qglClearDepth = dllClearDepth = GPA( "glClearDepth" ); - qglClearIndex = dllClearIndex = GPA( "glClearIndex" ); - qglClearStencil = dllClearStencil = GPA( "glClearStencil" ); - qglClipPlane = dllClipPlane = GPA( "glClipPlane" ); - qglColor3b = dllColor3b = GPA( "glColor3b" ); - qglColor3bv = dllColor3bv = GPA( "glColor3bv" ); - qglColor3d = dllColor3d = GPA( "glColor3d" ); - qglColor3dv = dllColor3dv = GPA( "glColor3dv" ); - qglColor3f = dllColor3f = GPA( "glColor3f" ); - qglColor3fv = dllColor3fv = GPA( "glColor3fv" ); - qglColor3i = dllColor3i = GPA( "glColor3i" ); - qglColor3iv = dllColor3iv = GPA( "glColor3iv" ); - qglColor3s = dllColor3s = GPA( "glColor3s" ); - qglColor3sv = dllColor3sv = GPA( "glColor3sv" ); - qglColor3ub = dllColor3ub = GPA( "glColor3ub" ); - qglColor3ubv = dllColor3ubv = GPA( "glColor3ubv" ); - qglColor3ui = dllColor3ui = GPA( "glColor3ui" ); - qglColor3uiv = dllColor3uiv = GPA( "glColor3uiv" ); - qglColor3us = dllColor3us = GPA( "glColor3us" ); - qglColor3usv = dllColor3usv = GPA( "glColor3usv" ); - qglColor4b = dllColor4b = GPA( "glColor4b" ); - qglColor4bv = dllColor4bv = GPA( "glColor4bv" ); - qglColor4d = dllColor4d = GPA( "glColor4d" ); - qglColor4dv = dllColor4dv = GPA( "glColor4dv" ); - qglColor4f = dllColor4f = GPA( "glColor4f" ); - qglColor4fv = dllColor4fv = GPA( "glColor4fv" ); - qglColor4i = dllColor4i = GPA( "glColor4i" ); - qglColor4iv = dllColor4iv = GPA( "glColor4iv" ); - qglColor4s = dllColor4s = GPA( "glColor4s" ); - qglColor4sv = dllColor4sv = GPA( "glColor4sv" ); - qglColor4ub = dllColor4ub = GPA( "glColor4ub" ); - qglColor4ubv = dllColor4ubv = GPA( "glColor4ubv" ); - qglColor4ui = dllColor4ui = GPA( "glColor4ui" ); - qglColor4uiv = dllColor4uiv = GPA( "glColor4uiv" ); - qglColor4us = dllColor4us = GPA( "glColor4us" ); - qglColor4usv = dllColor4usv = GPA( "glColor4usv" ); - qglColorMask = dllColorMask = GPA( "glColorMask" ); - qglColorMaterial = dllColorMaterial = GPA( "glColorMaterial" ); - qglColorPointer = dllColorPointer = GPA( "glColorPointer" ); - qglCopyPixels = dllCopyPixels = GPA( "glCopyPixels" ); - qglCopyTexImage1D = dllCopyTexImage1D = GPA( "glCopyTexImage1D" ); - qglCopyTexImage2D = dllCopyTexImage2D = GPA( "glCopyTexImage2D" ); - qglCopyTexSubImage1D = dllCopyTexSubImage1D = GPA( "glCopyTexSubImage1D" ); - qglCopyTexSubImage2D = dllCopyTexSubImage2D = GPA( "glCopyTexSubImage2D" ); - qglCullFace = dllCullFace = GPA( "glCullFace" ); - qglDeleteLists = dllDeleteLists = GPA( "glDeleteLists" ); - qglDeleteTextures = dllDeleteTextures = GPA( "glDeleteTextures" ); - qglDepthFunc = dllDepthFunc = GPA( "glDepthFunc" ); - qglDepthMask = dllDepthMask = GPA( "glDepthMask" ); - qglDepthRange = dllDepthRange = GPA( "glDepthRange" ); - qglDisable = dllDisable = GPA( "glDisable" ); - qglDisableClientState = dllDisableClientState = GPA( "glDisableClientState" ); - qglDrawArrays = dllDrawArrays = GPA( "glDrawArrays" ); - qglDrawBuffer = dllDrawBuffer = GPA( "glDrawBuffer" ); - qglDrawElements = dllDrawElements = GPA( "glDrawElements" ); - qglDrawPixels = dllDrawPixels = GPA( "glDrawPixels" ); - qglEdgeFlag = dllEdgeFlag = GPA( "glEdgeFlag" ); - qglEdgeFlagPointer = dllEdgeFlagPointer = GPA( "glEdgeFlagPointer" ); - qglEdgeFlagv = dllEdgeFlagv = GPA( "glEdgeFlagv" ); - qglEnable = dllEnable = GPA( "glEnable" ); - qglEnableClientState = dllEnableClientState = GPA( "glEnableClientState" ); - qglEnd = dllEnd = GPA( "glEnd" ); - qglEndList = dllEndList = GPA( "glEndList" ); - qglEvalCoord1d = dllEvalCoord1d = GPA( "glEvalCoord1d" ); - qglEvalCoord1dv = dllEvalCoord1dv = GPA( "glEvalCoord1dv" ); - qglEvalCoord1f = dllEvalCoord1f = GPA( "glEvalCoord1f" ); - qglEvalCoord1fv = dllEvalCoord1fv = GPA( "glEvalCoord1fv" ); - qglEvalCoord2d = dllEvalCoord2d = GPA( "glEvalCoord2d" ); - qglEvalCoord2dv = dllEvalCoord2dv = GPA( "glEvalCoord2dv" ); - qglEvalCoord2f = dllEvalCoord2f = GPA( "glEvalCoord2f" ); - qglEvalCoord2fv = dllEvalCoord2fv = GPA( "glEvalCoord2fv" ); - qglEvalMesh1 = dllEvalMesh1 = GPA( "glEvalMesh1" ); - qglEvalMesh2 = dllEvalMesh2 = GPA( "glEvalMesh2" ); - qglEvalPoint1 = dllEvalPoint1 = GPA( "glEvalPoint1" ); - qglEvalPoint2 = dllEvalPoint2 = GPA( "glEvalPoint2" ); - qglFeedbackBuffer = dllFeedbackBuffer = GPA( "glFeedbackBuffer" ); - qglFinish = dllFinish = GPA( "glFinish" ); - qglFlush = dllFlush = GPA( "glFlush" ); - qglFogf = dllFogf = GPA( "glFogf" ); - qglFogfv = dllFogfv = GPA( "glFogfv" ); - qglFogi = dllFogi = GPA( "glFogi" ); - qglFogiv = dllFogiv = GPA( "glFogiv" ); - qglFrontFace = dllFrontFace = GPA( "glFrontFace" ); - qglFrustum = dllFrustum = GPA( "glFrustum" ); - qglGenLists = dllGenLists = ( GLuint (__stdcall * )(int) ) GPA( "glGenLists" ); - qglGenTextures = dllGenTextures = GPA( "glGenTextures" ); - qglGetBooleanv = dllGetBooleanv = GPA( "glGetBooleanv" ); - qglGetClipPlane = dllGetClipPlane = GPA( "glGetClipPlane" ); - qglGetDoublev = dllGetDoublev = GPA( "glGetDoublev" ); - qglGetError = dllGetError = ( GLenum (__stdcall * )(void) ) GPA( "glGetError" ); - qglGetFloatv = dllGetFloatv = GPA( "glGetFloatv" ); - qglGetIntegerv = dllGetIntegerv = GPA( "glGetIntegerv" ); - qglGetLightfv = dllGetLightfv = GPA( "glGetLightfv" ); - qglGetLightiv = dllGetLightiv = GPA( "glGetLightiv" ); - qglGetMapdv = dllGetMapdv = GPA( "glGetMapdv" ); - qglGetMapfv = dllGetMapfv = GPA( "glGetMapfv" ); - qglGetMapiv = dllGetMapiv = GPA( "glGetMapiv" ); - qglGetMaterialfv = dllGetMaterialfv = GPA( "glGetMaterialfv" ); - qglGetMaterialiv = dllGetMaterialiv = GPA( "glGetMaterialiv" ); - qglGetPixelMapfv = dllGetPixelMapfv = GPA( "glGetPixelMapfv" ); - qglGetPixelMapuiv = dllGetPixelMapuiv = GPA( "glGetPixelMapuiv" ); - qglGetPixelMapusv = dllGetPixelMapusv = GPA( "glGetPixelMapusv" ); - qglGetPointerv = dllGetPointerv = GPA( "glGetPointerv" ); - qglGetPolygonStipple = dllGetPolygonStipple = GPA( "glGetPolygonStipple" ); - qglGetString = dllGetString = GPA( "glGetString" ); - qglGetTexEnvfv = dllGetTexEnvfv = GPA( "glGetTexEnvfv" ); - qglGetTexEnviv = dllGetTexEnviv = GPA( "glGetTexEnviv" ); - qglGetTexGendv = dllGetTexGendv = GPA( "glGetTexGendv" ); - qglGetTexGenfv = dllGetTexGenfv = GPA( "glGetTexGenfv" ); - qglGetTexGeniv = dllGetTexGeniv = GPA( "glGetTexGeniv" ); - qglGetTexImage = dllGetTexImage = GPA( "glGetTexImage" ); - qglGetTexParameterfv = dllGetTexParameterfv = GPA( "glGetTexParameterfv" ); - qglGetTexParameteriv = dllGetTexParameteriv = GPA( "glGetTexParameteriv" ); - qglHint = dllHint = GPA( "glHint" ); - qglIndexMask = dllIndexMask = GPA( "glIndexMask" ); - qglIndexPointer = dllIndexPointer = GPA( "glIndexPointer" ); - qglIndexd = dllIndexd = GPA( "glIndexd" ); - qglIndexdv = dllIndexdv = GPA( "glIndexdv" ); - qglIndexf = dllIndexf = GPA( "glIndexf" ); - qglIndexfv = dllIndexfv = GPA( "glIndexfv" ); - qglIndexi = dllIndexi = GPA( "glIndexi" ); - qglIndexiv = dllIndexiv = GPA( "glIndexiv" ); - qglIndexs = dllIndexs = GPA( "glIndexs" ); - qglIndexsv = dllIndexsv = GPA( "glIndexsv" ); - qglIndexub = dllIndexub = GPA( "glIndexub" ); - qglIndexubv = dllIndexubv = GPA( "glIndexubv" ); - qglInitNames = dllInitNames = GPA( "glInitNames" ); - qglInterleavedArrays = dllInterleavedArrays = GPA( "glInterleavedArrays" ); - qglIsEnabled = dllIsEnabled = GPA( "glIsEnabled" ); - qglIsList = dllIsList = GPA( "glIsList" ); - qglIsTexture = dllIsTexture = GPA( "glIsTexture" ); - qglLightModelf = dllLightModelf = GPA( "glLightModelf" ); - qglLightModelfv = dllLightModelfv = GPA( "glLightModelfv" ); - qglLightModeli = dllLightModeli = GPA( "glLightModeli" ); - qglLightModeliv = dllLightModeliv = GPA( "glLightModeliv" ); - qglLightf = dllLightf = GPA( "glLightf" ); - qglLightfv = dllLightfv = GPA( "glLightfv" ); - qglLighti = dllLighti = GPA( "glLighti" ); - qglLightiv = dllLightiv = GPA( "glLightiv" ); - qglLineStipple = dllLineStipple = GPA( "glLineStipple" ); - qglLineWidth = dllLineWidth = GPA( "glLineWidth" ); - qglListBase = dllListBase = GPA( "glListBase" ); - qglLoadIdentity = dllLoadIdentity = GPA( "glLoadIdentity" ); - qglLoadMatrixd = dllLoadMatrixd = GPA( "glLoadMatrixd" ); - qglLoadMatrixf = dllLoadMatrixf = GPA( "glLoadMatrixf" ); - qglLoadName = dllLoadName = GPA( "glLoadName" ); - qglLogicOp = dllLogicOp = GPA( "glLogicOp" ); - qglMap1d = dllMap1d = GPA( "glMap1d" ); - qglMap1f = dllMap1f = GPA( "glMap1f" ); - qglMap2d = dllMap2d = GPA( "glMap2d" ); - qglMap2f = dllMap2f = GPA( "glMap2f" ); - qglMapGrid1d = dllMapGrid1d = GPA( "glMapGrid1d" ); - qglMapGrid1f = dllMapGrid1f = GPA( "glMapGrid1f" ); - qglMapGrid2d = dllMapGrid2d = GPA( "glMapGrid2d" ); - qglMapGrid2f = dllMapGrid2f = GPA( "glMapGrid2f" ); - qglMaterialf = dllMaterialf = GPA( "glMaterialf" ); - qglMaterialfv = dllMaterialfv = GPA( "glMaterialfv" ); - qglMateriali = dllMateriali = GPA( "glMateriali" ); - qglMaterialiv = dllMaterialiv = GPA( "glMaterialiv" ); - qglMatrixMode = dllMatrixMode = GPA( "glMatrixMode" ); - qglMultMatrixd = dllMultMatrixd = GPA( "glMultMatrixd" ); - qglMultMatrixf = dllMultMatrixf = GPA( "glMultMatrixf" ); - qglNewList = dllNewList = GPA( "glNewList" ); - qglNormal3b = dllNormal3b = GPA( "glNormal3b" ); - qglNormal3bv = dllNormal3bv = GPA( "glNormal3bv" ); - qglNormal3d = dllNormal3d = GPA( "glNormal3d" ); - qglNormal3dv = dllNormal3dv = GPA( "glNormal3dv" ); - qglNormal3f = dllNormal3f = GPA( "glNormal3f" ); - qglNormal3fv = dllNormal3fv = GPA( "glNormal3fv" ); - qglNormal3i = dllNormal3i = GPA( "glNormal3i" ); - qglNormal3iv = dllNormal3iv = GPA( "glNormal3iv" ); - qglNormal3s = dllNormal3s = GPA( "glNormal3s" ); - qglNormal3sv = dllNormal3sv = GPA( "glNormal3sv" ); - qglNormalPointer = dllNormalPointer = GPA( "glNormalPointer" ); - qglOrtho = dllOrtho = GPA( "glOrtho" ); - qglPassThrough = dllPassThrough = GPA( "glPassThrough" ); - qglPixelMapfv = dllPixelMapfv = GPA( "glPixelMapfv" ); - qglPixelMapuiv = dllPixelMapuiv = GPA( "glPixelMapuiv" ); - qglPixelMapusv = dllPixelMapusv = GPA( "glPixelMapusv" ); - qglPixelStoref = dllPixelStoref = GPA( "glPixelStoref" ); - qglPixelStorei = dllPixelStorei = GPA( "glPixelStorei" ); - qglPixelTransferf = dllPixelTransferf = GPA( "glPixelTransferf" ); - qglPixelTransferi = dllPixelTransferi = GPA( "glPixelTransferi" ); - qglPixelZoom = dllPixelZoom = GPA( "glPixelZoom" ); - qglPointSize = dllPointSize = GPA( "glPointSize" ); - qglPolygonMode = dllPolygonMode = GPA( "glPolygonMode" ); - qglPolygonOffset = dllPolygonOffset = GPA( "glPolygonOffset" ); - qglPolygonStipple = dllPolygonStipple = GPA( "glPolygonStipple" ); - qglPopAttrib = dllPopAttrib = GPA( "glPopAttrib" ); - qglPopClientAttrib = dllPopClientAttrib = GPA( "glPopClientAttrib" ); - qglPopMatrix = dllPopMatrix = GPA( "glPopMatrix" ); - qglPopName = dllPopName = GPA( "glPopName" ); - qglPrioritizeTextures = dllPrioritizeTextures = GPA( "glPrioritizeTextures" ); - qglPushAttrib = dllPushAttrib = GPA( "glPushAttrib" ); - qglPushClientAttrib = dllPushClientAttrib = GPA( "glPushClientAttrib" ); - qglPushMatrix = dllPushMatrix = GPA( "glPushMatrix" ); - qglPushName = dllPushName = GPA( "glPushName" ); - qglRasterPos2d = dllRasterPos2d = GPA( "glRasterPos2d" ); - qglRasterPos2dv = dllRasterPos2dv = GPA( "glRasterPos2dv" ); - qglRasterPos2f = dllRasterPos2f = GPA( "glRasterPos2f" ); - qglRasterPos2fv = dllRasterPos2fv = GPA( "glRasterPos2fv" ); - qglRasterPos2i = dllRasterPos2i = GPA( "glRasterPos2i" ); - qglRasterPos2iv = dllRasterPos2iv = GPA( "glRasterPos2iv" ); - qglRasterPos2s = dllRasterPos2s = GPA( "glRasterPos2s" ); - qglRasterPos2sv = dllRasterPos2sv = GPA( "glRasterPos2sv" ); - qglRasterPos3d = dllRasterPos3d = GPA( "glRasterPos3d" ); - qglRasterPos3dv = dllRasterPos3dv = GPA( "glRasterPos3dv" ); - qglRasterPos3f = dllRasterPos3f = GPA( "glRasterPos3f" ); - qglRasterPos3fv = dllRasterPos3fv = GPA( "glRasterPos3fv" ); - qglRasterPos3i = dllRasterPos3i = GPA( "glRasterPos3i" ); - qglRasterPos3iv = dllRasterPos3iv = GPA( "glRasterPos3iv" ); - qglRasterPos3s = dllRasterPos3s = GPA( "glRasterPos3s" ); - qglRasterPos3sv = dllRasterPos3sv = GPA( "glRasterPos3sv" ); - qglRasterPos4d = dllRasterPos4d = GPA( "glRasterPos4d" ); - qglRasterPos4dv = dllRasterPos4dv = GPA( "glRasterPos4dv" ); - qglRasterPos4f = dllRasterPos4f = GPA( "glRasterPos4f" ); - qglRasterPos4fv = dllRasterPos4fv = GPA( "glRasterPos4fv" ); - qglRasterPos4i = dllRasterPos4i = GPA( "glRasterPos4i" ); - qglRasterPos4iv = dllRasterPos4iv = GPA( "glRasterPos4iv" ); - qglRasterPos4s = dllRasterPos4s = GPA( "glRasterPos4s" ); - qglRasterPos4sv = dllRasterPos4sv = GPA( "glRasterPos4sv" ); - qglReadBuffer = dllReadBuffer = GPA( "glReadBuffer" ); - qglReadPixels = dllReadPixels = GPA( "glReadPixels" ); - qglRectd = dllRectd = GPA( "glRectd" ); - qglRectdv = dllRectdv = GPA( "glRectdv" ); - qglRectf = dllRectf = GPA( "glRectf" ); - qglRectfv = dllRectfv = GPA( "glRectfv" ); - qglRecti = dllRecti = GPA( "glRecti" ); - qglRectiv = dllRectiv = GPA( "glRectiv" ); - qglRects = dllRects = GPA( "glRects" ); - qglRectsv = dllRectsv = GPA( "glRectsv" ); - qglRenderMode = dllRenderMode = GPA( "glRenderMode" ); - qglRotated = dllRotated = GPA( "glRotated" ); - qglRotatef = dllRotatef = GPA( "glRotatef" ); - qglScaled = dllScaled = GPA( "glScaled" ); - qglScalef = dllScalef = GPA( "glScalef" ); - qglScissor = dllScissor = GPA( "glScissor" ); - qglSelectBuffer = dllSelectBuffer = GPA( "glSelectBuffer" ); - qglShadeModel = dllShadeModel = GPA( "glShadeModel" ); - qglStencilFunc = dllStencilFunc = GPA( "glStencilFunc" ); - qglStencilMask = dllStencilMask = GPA( "glStencilMask" ); - qglStencilOp = dllStencilOp = GPA( "glStencilOp" ); - qglTexCoord1d = dllTexCoord1d = GPA( "glTexCoord1d" ); - qglTexCoord1dv = dllTexCoord1dv = GPA( "glTexCoord1dv" ); - qglTexCoord1f = dllTexCoord1f = GPA( "glTexCoord1f" ); - qglTexCoord1fv = dllTexCoord1fv = GPA( "glTexCoord1fv" ); - qglTexCoord1i = dllTexCoord1i = GPA( "glTexCoord1i" ); - qglTexCoord1iv = dllTexCoord1iv = GPA( "glTexCoord1iv" ); - qglTexCoord1s = dllTexCoord1s = GPA( "glTexCoord1s" ); - qglTexCoord1sv = dllTexCoord1sv = GPA( "glTexCoord1sv" ); - qglTexCoord2d = dllTexCoord2d = GPA( "glTexCoord2d" ); - qglTexCoord2dv = dllTexCoord2dv = GPA( "glTexCoord2dv" ); - qglTexCoord2f = dllTexCoord2f = GPA( "glTexCoord2f" ); - qglTexCoord2fv = dllTexCoord2fv = GPA( "glTexCoord2fv" ); - qglTexCoord2i = dllTexCoord2i = GPA( "glTexCoord2i" ); - qglTexCoord2iv = dllTexCoord2iv = GPA( "glTexCoord2iv" ); - qglTexCoord2s = dllTexCoord2s = GPA( "glTexCoord2s" ); - qglTexCoord2sv = dllTexCoord2sv = GPA( "glTexCoord2sv" ); - qglTexCoord3d = dllTexCoord3d = GPA( "glTexCoord3d" ); - qglTexCoord3dv = dllTexCoord3dv = GPA( "glTexCoord3dv" ); - qglTexCoord3f = dllTexCoord3f = GPA( "glTexCoord3f" ); - qglTexCoord3fv = dllTexCoord3fv = GPA( "glTexCoord3fv" ); - qglTexCoord3i = dllTexCoord3i = GPA( "glTexCoord3i" ); - qglTexCoord3iv = dllTexCoord3iv = GPA( "glTexCoord3iv" ); - qglTexCoord3s = dllTexCoord3s = GPA( "glTexCoord3s" ); - qglTexCoord3sv = dllTexCoord3sv = GPA( "glTexCoord3sv" ); - qglTexCoord4d = dllTexCoord4d = GPA( "glTexCoord4d" ); - qglTexCoord4dv = dllTexCoord4dv = GPA( "glTexCoord4dv" ); - qglTexCoord4f = dllTexCoord4f = GPA( "glTexCoord4f" ); - qglTexCoord4fv = dllTexCoord4fv = GPA( "glTexCoord4fv" ); - qglTexCoord4i = dllTexCoord4i = GPA( "glTexCoord4i" ); - qglTexCoord4iv = dllTexCoord4iv = GPA( "glTexCoord4iv" ); - qglTexCoord4s = dllTexCoord4s = GPA( "glTexCoord4s" ); - qglTexCoord4sv = dllTexCoord4sv = GPA( "glTexCoord4sv" ); - qglTexCoordPointer = dllTexCoordPointer = GPA( "glTexCoordPointer" ); - qglTexEnvf = dllTexEnvf = GPA( "glTexEnvf" ); - qglTexEnvfv = dllTexEnvfv = GPA( "glTexEnvfv" ); - qglTexEnvi = dllTexEnvi = GPA( "glTexEnvi" ); - qglTexEnviv = dllTexEnviv = GPA( "glTexEnviv" ); - qglTexGend = dllTexGend = GPA( "glTexGend" ); - qglTexGendv = dllTexGendv = GPA( "glTexGendv" ); - qglTexGenf = dllTexGenf = GPA( "glTexGenf" ); - qglTexGenfv = dllTexGenfv = GPA( "glTexGenfv" ); - qglTexGeni = dllTexGeni = GPA( "glTexGeni" ); - qglTexGeniv = dllTexGeniv = GPA( "glTexGeniv" ); - qglTexImage1D = dllTexImage1D = GPA( "glTexImage1D" ); - qglTexImage2D = dllTexImage2D = GPA( "glTexImage2D" ); - qglTexParameterf = dllTexParameterf = GPA( "glTexParameterf" ); - qglTexParameterfv = dllTexParameterfv = GPA( "glTexParameterfv" ); - qglTexParameteri = dllTexParameteri = GPA( "glTexParameteri" ); - qglTexParameteriv = dllTexParameteriv = GPA( "glTexParameteriv" ); - qglTexSubImage1D = dllTexSubImage1D = GPA( "glTexSubImage1D" ); - qglTexSubImage2D = dllTexSubImage2D = GPA( "glTexSubImage2D" ); - qglTranslated = dllTranslated = GPA( "glTranslated" ); - qglTranslatef = dllTranslatef = GPA( "glTranslatef" ); - qglVertex2d = dllVertex2d = GPA( "glVertex2d" ); - qglVertex2dv = dllVertex2dv = GPA( "glVertex2dv" ); - qglVertex2f = dllVertex2f = GPA( "glVertex2f" ); - qglVertex2fv = dllVertex2fv = GPA( "glVertex2fv" ); - qglVertex2i = dllVertex2i = GPA( "glVertex2i" ); - qglVertex2iv = dllVertex2iv = GPA( "glVertex2iv" ); - qglVertex2s = dllVertex2s = GPA( "glVertex2s" ); - qglVertex2sv = dllVertex2sv = GPA( "glVertex2sv" ); - qglVertex3d = dllVertex3d = GPA( "glVertex3d" ); - qglVertex3dv = dllVertex3dv = GPA( "glVertex3dv" ); - qglVertex3f = dllVertex3f = GPA( "glVertex3f" ); - qglVertex3fv = dllVertex3fv = GPA( "glVertex3fv" ); - qglVertex3i = dllVertex3i = GPA( "glVertex3i" ); - qglVertex3iv = dllVertex3iv = GPA( "glVertex3iv" ); - qglVertex3s = dllVertex3s = GPA( "glVertex3s" ); - qglVertex3sv = dllVertex3sv = GPA( "glVertex3sv" ); - qglVertex4d = dllVertex4d = GPA( "glVertex4d" ); - qglVertex4dv = dllVertex4dv = GPA( "glVertex4dv" ); - qglVertex4f = dllVertex4f = GPA( "glVertex4f" ); - qglVertex4fv = dllVertex4fv = GPA( "glVertex4fv" ); - qglVertex4i = dllVertex4i = GPA( "glVertex4i" ); - qglVertex4iv = dllVertex4iv = GPA( "glVertex4iv" ); - qglVertex4s = dllVertex4s = GPA( "glVertex4s" ); - qglVertex4sv = dllVertex4sv = GPA( "glVertex4sv" ); - qglVertexPointer = dllVertexPointer = GPA( "glVertexPointer" ); - qglViewport = dllViewport = GPA( "glViewport" ); - - qwglCopyContext = GPA( "wglCopyContext" ); - qwglCreateContext = GPA( "wglCreateContext" ); - qwglCreateLayerContext = GPA( "wglCreateLayerContext" ); - qwglDeleteContext = GPA( "wglDeleteContext" ); - qwglDescribeLayerPlane = GPA( "wglDescribeLayerPlane" ); - qwglGetCurrentContext = GPA( "wglGetCurrentContext" ); - qwglGetCurrentDC = GPA( "wglGetCurrentDC" ); - qwglGetLayerPaletteEntries = GPA( "wglGetLayerPaletteEntries" ); - qwglGetProcAddress = GPA( "wglGetProcAddress" ); - qwglMakeCurrent = GPA( "wglMakeCurrent" ); - qwglRealizeLayerPalette = GPA( "wglRealizeLayerPalette" ); - qwglSetLayerPaletteEntries = GPA( "wglSetLayerPaletteEntries" ); - qwglShareLists = GPA( "wglShareLists" ); - qwglSwapLayerBuffers = GPA( "wglSwapLayerBuffers" ); - qwglUseFontBitmaps = GPA( "wglUseFontBitmapsA" ); - qwglUseFontOutlines = GPA( "wglUseFontOutlinesA" ); - - qwglChoosePixelFormat = GPA( "wglChoosePixelFormat" ); - qwglDescribePixelFormat = GPA( "wglDescribePixelFormat" ); - qwglGetPixelFormat = GPA( "wglGetPixelFormat" ); - qwglSetPixelFormat = GPA( "wglSetPixelFormat" ); - qwglSwapBuffers = GPA( "wglSwapBuffers" ); - - qwglSwapIntervalEXT = 0; - qglActiveTextureARB = 0; - qglClientActiveTextureARB = 0; - qglMultiTexCoord2fARB = 0; - qglLockArraysEXT = 0; - qglUnlockArraysEXT = 0; - qwglGetDeviceGammaRamp3DFX = NULL; - qwglSetDeviceGammaRamp3DFX = NULL; - - // check logging - QGL_EnableLogging( r_logFile->integer ); - - return qtrue; -} - -void QGL_EnableLogging( qboolean enable ) -{ - static qboolean isEnabled; - - // return if we're already active - if ( isEnabled && enable ) { - // decrement log counter and stop if it has reached 0 - ri.Cvar_Set( "r_logFile", va("%d", r_logFile->integer - 1 ) ); - if ( r_logFile->integer ) { - return; - } - enable = qfalse; - } - - // return if we're already disabled - if ( !enable && !isEnabled ) - return; - - isEnabled = enable; - - if ( enable ) - { - if ( !glw_state.log_fp ) - { - struct tm *newtime; - time_t aclock; - char buffer[1024]; - cvar_t *basedir; - - time( &aclock ); - newtime = localtime( &aclock ); - - asctime( newtime ); - - basedir = ri.Cvar_Get( "fs_basepath", "", 0 ); - Com_sprintf( buffer, sizeof(buffer), "%s/gl.log", basedir->string ); - glw_state.log_fp = fopen( buffer, "wt" ); - - fprintf( glw_state.log_fp, "%s\n", asctime( newtime ) ); - } - - qglAccum = logAccum; - qglAlphaFunc = logAlphaFunc; - qglAreTexturesResident = logAreTexturesResident; - qglArrayElement = logArrayElement; - qglBegin = logBegin; - qglBindTexture = logBindTexture; - qglBitmap = logBitmap; - qglBlendFunc = logBlendFunc; - qglCallList = logCallList; - qglCallLists = logCallLists; - qglClear = logClear; - qglClearAccum = logClearAccum; - qglClearColor = logClearColor; - qglClearDepth = logClearDepth; - qglClearIndex = logClearIndex; - qglClearStencil = logClearStencil; - qglClipPlane = logClipPlane; - qglColor3b = logColor3b; - qglColor3bv = logColor3bv; - qglColor3d = logColor3d; - qglColor3dv = logColor3dv; - qglColor3f = logColor3f; - qglColor3fv = logColor3fv; - qglColor3i = logColor3i; - qglColor3iv = logColor3iv; - qglColor3s = logColor3s; - qglColor3sv = logColor3sv; - qglColor3ub = logColor3ub; - qglColor3ubv = logColor3ubv; - qglColor3ui = logColor3ui; - qglColor3uiv = logColor3uiv; - qglColor3us = logColor3us; - qglColor3usv = logColor3usv; - qglColor4b = logColor4b; - qglColor4bv = logColor4bv; - qglColor4d = logColor4d; - qglColor4dv = logColor4dv; - qglColor4f = logColor4f; - qglColor4fv = logColor4fv; - qglColor4i = logColor4i; - qglColor4iv = logColor4iv; - qglColor4s = logColor4s; - qglColor4sv = logColor4sv; - qglColor4ub = logColor4ub; - qglColor4ubv = logColor4ubv; - qglColor4ui = logColor4ui; - qglColor4uiv = logColor4uiv; - qglColor4us = logColor4us; - qglColor4usv = logColor4usv; - qglColorMask = logColorMask; - qglColorMaterial = logColorMaterial; - qglColorPointer = logColorPointer; - qglCopyPixels = logCopyPixels; - qglCopyTexImage1D = logCopyTexImage1D; - qglCopyTexImage2D = logCopyTexImage2D; - qglCopyTexSubImage1D = logCopyTexSubImage1D; - qglCopyTexSubImage2D = logCopyTexSubImage2D; - qglCullFace = logCullFace; - qglDeleteLists = logDeleteLists ; - qglDeleteTextures = logDeleteTextures ; - qglDepthFunc = logDepthFunc ; - qglDepthMask = logDepthMask ; - qglDepthRange = logDepthRange ; - qglDisable = logDisable ; - qglDisableClientState = logDisableClientState ; - qglDrawArrays = logDrawArrays ; - qglDrawBuffer = logDrawBuffer ; - qglDrawElements = logDrawElements ; - qglDrawPixels = logDrawPixels ; - qglEdgeFlag = logEdgeFlag ; - qglEdgeFlagPointer = logEdgeFlagPointer ; - qglEdgeFlagv = logEdgeFlagv ; - qglEnable = logEnable ; - qglEnableClientState = logEnableClientState ; - qglEnd = logEnd ; - qglEndList = logEndList ; - qglEvalCoord1d = logEvalCoord1d ; - qglEvalCoord1dv = logEvalCoord1dv ; - qglEvalCoord1f = logEvalCoord1f ; - qglEvalCoord1fv = logEvalCoord1fv ; - qglEvalCoord2d = logEvalCoord2d ; - qglEvalCoord2dv = logEvalCoord2dv ; - qglEvalCoord2f = logEvalCoord2f ; - qglEvalCoord2fv = logEvalCoord2fv ; - qglEvalMesh1 = logEvalMesh1 ; - qglEvalMesh2 = logEvalMesh2 ; - qglEvalPoint1 = logEvalPoint1 ; - qglEvalPoint2 = logEvalPoint2 ; - qglFeedbackBuffer = logFeedbackBuffer ; - qglFinish = logFinish ; - qglFlush = logFlush ; - qglFogf = logFogf ; - qglFogfv = logFogfv ; - qglFogi = logFogi ; - qglFogiv = logFogiv ; - qglFrontFace = logFrontFace ; - qglFrustum = logFrustum ; - qglGenLists = logGenLists ; - qglGenTextures = logGenTextures ; - qglGetBooleanv = logGetBooleanv ; - qglGetClipPlane = logGetClipPlane ; - qglGetDoublev = logGetDoublev ; - qglGetError = logGetError ; - qglGetFloatv = logGetFloatv ; - qglGetIntegerv = logGetIntegerv ; - qglGetLightfv = logGetLightfv ; - qglGetLightiv = logGetLightiv ; - qglGetMapdv = logGetMapdv ; - qglGetMapfv = logGetMapfv ; - qglGetMapiv = logGetMapiv ; - qglGetMaterialfv = logGetMaterialfv ; - qglGetMaterialiv = logGetMaterialiv ; - qglGetPixelMapfv = logGetPixelMapfv ; - qglGetPixelMapuiv = logGetPixelMapuiv ; - qglGetPixelMapusv = logGetPixelMapusv ; - qglGetPointerv = logGetPointerv ; - qglGetPolygonStipple = logGetPolygonStipple ; - qglGetString = logGetString ; - qglGetTexEnvfv = logGetTexEnvfv ; - qglGetTexEnviv = logGetTexEnviv ; - qglGetTexGendv = logGetTexGendv ; - qglGetTexGenfv = logGetTexGenfv ; - qglGetTexGeniv = logGetTexGeniv ; - qglGetTexImage = logGetTexImage ; - qglGetTexLevelParameterfv = logGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = logGetTexLevelParameteriv ; - qglGetTexParameterfv = logGetTexParameterfv ; - qglGetTexParameteriv = logGetTexParameteriv ; - qglHint = logHint ; - qglIndexMask = logIndexMask ; - qglIndexPointer = logIndexPointer ; - qglIndexd = logIndexd ; - qglIndexdv = logIndexdv ; - qglIndexf = logIndexf ; - qglIndexfv = logIndexfv ; - qglIndexi = logIndexi ; - qglIndexiv = logIndexiv ; - qglIndexs = logIndexs ; - qglIndexsv = logIndexsv ; - qglIndexub = logIndexub ; - qglIndexubv = logIndexubv ; - qglInitNames = logInitNames ; - qglInterleavedArrays = logInterleavedArrays ; - qglIsEnabled = logIsEnabled ; - qglIsList = logIsList ; - qglIsTexture = logIsTexture ; - qglLightModelf = logLightModelf ; - qglLightModelfv = logLightModelfv ; - qglLightModeli = logLightModeli ; - qglLightModeliv = logLightModeliv ; - qglLightf = logLightf ; - qglLightfv = logLightfv ; - qglLighti = logLighti ; - qglLightiv = logLightiv ; - qglLineStipple = logLineStipple ; - qglLineWidth = logLineWidth ; - qglListBase = logListBase ; - qglLoadIdentity = logLoadIdentity ; - qglLoadMatrixd = logLoadMatrixd ; - qglLoadMatrixf = logLoadMatrixf ; - qglLoadName = logLoadName ; - qglLogicOp = logLogicOp ; - qglMap1d = logMap1d ; - qglMap1f = logMap1f ; - qglMap2d = logMap2d ; - qglMap2f = logMap2f ; - qglMapGrid1d = logMapGrid1d ; - qglMapGrid1f = logMapGrid1f ; - qglMapGrid2d = logMapGrid2d ; - qglMapGrid2f = logMapGrid2f ; - qglMaterialf = logMaterialf ; - qglMaterialfv = logMaterialfv ; - qglMateriali = logMateriali ; - qglMaterialiv = logMaterialiv ; - qglMatrixMode = logMatrixMode ; - qglMultMatrixd = logMultMatrixd ; - qglMultMatrixf = logMultMatrixf ; - qglNewList = logNewList ; - qglNormal3b = logNormal3b ; - qglNormal3bv = logNormal3bv ; - qglNormal3d = logNormal3d ; - qglNormal3dv = logNormal3dv ; - qglNormal3f = logNormal3f ; - qglNormal3fv = logNormal3fv ; - qglNormal3i = logNormal3i ; - qglNormal3iv = logNormal3iv ; - qglNormal3s = logNormal3s ; - qglNormal3sv = logNormal3sv ; - qglNormalPointer = logNormalPointer ; - qglOrtho = logOrtho ; - qglPassThrough = logPassThrough ; - qglPixelMapfv = logPixelMapfv ; - qglPixelMapuiv = logPixelMapuiv ; - qglPixelMapusv = logPixelMapusv ; - qglPixelStoref = logPixelStoref ; - qglPixelStorei = logPixelStorei ; - qglPixelTransferf = logPixelTransferf ; - qglPixelTransferi = logPixelTransferi ; - qglPixelZoom = logPixelZoom ; - qglPointSize = logPointSize ; - qglPolygonMode = logPolygonMode ; - qglPolygonOffset = logPolygonOffset ; - qglPolygonStipple = logPolygonStipple ; - qglPopAttrib = logPopAttrib ; - qglPopClientAttrib = logPopClientAttrib ; - qglPopMatrix = logPopMatrix ; - qglPopName = logPopName ; - qglPrioritizeTextures = logPrioritizeTextures ; - qglPushAttrib = logPushAttrib ; - qglPushClientAttrib = logPushClientAttrib ; - qglPushMatrix = logPushMatrix ; - qglPushName = logPushName ; - qglRasterPos2d = logRasterPos2d ; - qglRasterPos2dv = logRasterPos2dv ; - qglRasterPos2f = logRasterPos2f ; - qglRasterPos2fv = logRasterPos2fv ; - qglRasterPos2i = logRasterPos2i ; - qglRasterPos2iv = logRasterPos2iv ; - qglRasterPos2s = logRasterPos2s ; - qglRasterPos2sv = logRasterPos2sv ; - qglRasterPos3d = logRasterPos3d ; - qglRasterPos3dv = logRasterPos3dv ; - qglRasterPos3f = logRasterPos3f ; - qglRasterPos3fv = logRasterPos3fv ; - qglRasterPos3i = logRasterPos3i ; - qglRasterPos3iv = logRasterPos3iv ; - qglRasterPos3s = logRasterPos3s ; - qglRasterPos3sv = logRasterPos3sv ; - qglRasterPos4d = logRasterPos4d ; - qglRasterPos4dv = logRasterPos4dv ; - qglRasterPos4f = logRasterPos4f ; - qglRasterPos4fv = logRasterPos4fv ; - qglRasterPos4i = logRasterPos4i ; - qglRasterPos4iv = logRasterPos4iv ; - qglRasterPos4s = logRasterPos4s ; - qglRasterPos4sv = logRasterPos4sv ; - qglReadBuffer = logReadBuffer ; - qglReadPixels = logReadPixels ; - qglRectd = logRectd ; - qglRectdv = logRectdv ; - qglRectf = logRectf ; - qglRectfv = logRectfv ; - qglRecti = logRecti ; - qglRectiv = logRectiv ; - qglRects = logRects ; - qglRectsv = logRectsv ; - qglRenderMode = logRenderMode ; - qglRotated = logRotated ; - qglRotatef = logRotatef ; - qglScaled = logScaled ; - qglScalef = logScalef ; - qglScissor = logScissor ; - qglSelectBuffer = logSelectBuffer ; - qglShadeModel = logShadeModel ; - qglStencilFunc = logStencilFunc ; - qglStencilMask = logStencilMask ; - qglStencilOp = logStencilOp ; - qglTexCoord1d = logTexCoord1d ; - qglTexCoord1dv = logTexCoord1dv ; - qglTexCoord1f = logTexCoord1f ; - qglTexCoord1fv = logTexCoord1fv ; - qglTexCoord1i = logTexCoord1i ; - qglTexCoord1iv = logTexCoord1iv ; - qglTexCoord1s = logTexCoord1s ; - qglTexCoord1sv = logTexCoord1sv ; - qglTexCoord2d = logTexCoord2d ; - qglTexCoord2dv = logTexCoord2dv ; - qglTexCoord2f = logTexCoord2f ; - qglTexCoord2fv = logTexCoord2fv ; - qglTexCoord2i = logTexCoord2i ; - qglTexCoord2iv = logTexCoord2iv ; - qglTexCoord2s = logTexCoord2s ; - qglTexCoord2sv = logTexCoord2sv ; - qglTexCoord3d = logTexCoord3d ; - qglTexCoord3dv = logTexCoord3dv ; - qglTexCoord3f = logTexCoord3f ; - qglTexCoord3fv = logTexCoord3fv ; - qglTexCoord3i = logTexCoord3i ; - qglTexCoord3iv = logTexCoord3iv ; - qglTexCoord3s = logTexCoord3s ; - qglTexCoord3sv = logTexCoord3sv ; - qglTexCoord4d = logTexCoord4d ; - qglTexCoord4dv = logTexCoord4dv ; - qglTexCoord4f = logTexCoord4f ; - qglTexCoord4fv = logTexCoord4fv ; - qglTexCoord4i = logTexCoord4i ; - qglTexCoord4iv = logTexCoord4iv ; - qglTexCoord4s = logTexCoord4s ; - qglTexCoord4sv = logTexCoord4sv ; - qglTexCoordPointer = logTexCoordPointer ; - qglTexEnvf = logTexEnvf ; - qglTexEnvfv = logTexEnvfv ; - qglTexEnvi = logTexEnvi ; - qglTexEnviv = logTexEnviv ; - qglTexGend = logTexGend ; - qglTexGendv = logTexGendv ; - qglTexGenf = logTexGenf ; - qglTexGenfv = logTexGenfv ; - qglTexGeni = logTexGeni ; - qglTexGeniv = logTexGeniv ; - qglTexImage1D = logTexImage1D ; - qglTexImage2D = logTexImage2D ; - qglTexParameterf = logTexParameterf ; - qglTexParameterfv = logTexParameterfv ; - qglTexParameteri = logTexParameteri ; - qglTexParameteriv = logTexParameteriv ; - qglTexSubImage1D = logTexSubImage1D ; - qglTexSubImage2D = logTexSubImage2D ; - qglTranslated = logTranslated ; - qglTranslatef = logTranslatef ; - qglVertex2d = logVertex2d ; - qglVertex2dv = logVertex2dv ; - qglVertex2f = logVertex2f ; - qglVertex2fv = logVertex2fv ; - qglVertex2i = logVertex2i ; - qglVertex2iv = logVertex2iv ; - qglVertex2s = logVertex2s ; - qglVertex2sv = logVertex2sv ; - qglVertex3d = logVertex3d ; - qglVertex3dv = logVertex3dv ; - qglVertex3f = logVertex3f ; - qglVertex3fv = logVertex3fv ; - qglVertex3i = logVertex3i ; - qglVertex3iv = logVertex3iv ; - qglVertex3s = logVertex3s ; - qglVertex3sv = logVertex3sv ; - qglVertex4d = logVertex4d ; - qglVertex4dv = logVertex4dv ; - qglVertex4f = logVertex4f ; - qglVertex4fv = logVertex4fv ; - qglVertex4i = logVertex4i ; - qglVertex4iv = logVertex4iv ; - qglVertex4s = logVertex4s ; - qglVertex4sv = logVertex4sv ; - qglVertexPointer = logVertexPointer ; - qglViewport = logViewport ; - } - else - { - if ( glw_state.log_fp ) { - fprintf( glw_state.log_fp, "*** CLOSING LOG ***\n" ); - fclose( glw_state.log_fp ); - glw_state.log_fp = NULL; - } - qglAccum = dllAccum; - qglAlphaFunc = dllAlphaFunc; - qglAreTexturesResident = dllAreTexturesResident; - qglArrayElement = dllArrayElement; - qglBegin = dllBegin; - qglBindTexture = dllBindTexture; - qglBitmap = dllBitmap; - qglBlendFunc = dllBlendFunc; - qglCallList = dllCallList; - qglCallLists = dllCallLists; - qglClear = dllClear; - qglClearAccum = dllClearAccum; - qglClearColor = dllClearColor; - qglClearDepth = dllClearDepth; - qglClearIndex = dllClearIndex; - qglClearStencil = dllClearStencil; - qglClipPlane = dllClipPlane; - qglColor3b = dllColor3b; - qglColor3bv = dllColor3bv; - qglColor3d = dllColor3d; - qglColor3dv = dllColor3dv; - qglColor3f = dllColor3f; - qglColor3fv = dllColor3fv; - qglColor3i = dllColor3i; - qglColor3iv = dllColor3iv; - qglColor3s = dllColor3s; - qglColor3sv = dllColor3sv; - qglColor3ub = dllColor3ub; - qglColor3ubv = dllColor3ubv; - qglColor3ui = dllColor3ui; - qglColor3uiv = dllColor3uiv; - qglColor3us = dllColor3us; - qglColor3usv = dllColor3usv; - qglColor4b = dllColor4b; - qglColor4bv = dllColor4bv; - qglColor4d = dllColor4d; - qglColor4dv = dllColor4dv; - qglColor4f = dllColor4f; - qglColor4fv = dllColor4fv; - qglColor4i = dllColor4i; - qglColor4iv = dllColor4iv; - qglColor4s = dllColor4s; - qglColor4sv = dllColor4sv; - qglColor4ub = dllColor4ub; - qglColor4ubv = dllColor4ubv; - qglColor4ui = dllColor4ui; - qglColor4uiv = dllColor4uiv; - qglColor4us = dllColor4us; - qglColor4usv = dllColor4usv; - qglColorMask = dllColorMask; - qglColorMaterial = dllColorMaterial; - qglColorPointer = dllColorPointer; - qglCopyPixels = dllCopyPixels; - qglCopyTexImage1D = dllCopyTexImage1D; - qglCopyTexImage2D = dllCopyTexImage2D; - qglCopyTexSubImage1D = dllCopyTexSubImage1D; - qglCopyTexSubImage2D = dllCopyTexSubImage2D; - qglCullFace = dllCullFace; - qglDeleteLists = dllDeleteLists ; - qglDeleteTextures = dllDeleteTextures ; - qglDepthFunc = dllDepthFunc ; - qglDepthMask = dllDepthMask ; - qglDepthRange = dllDepthRange ; - qglDisable = dllDisable ; - qglDisableClientState = dllDisableClientState ; - qglDrawArrays = dllDrawArrays ; - qglDrawBuffer = dllDrawBuffer ; - qglDrawElements = dllDrawElements ; - qglDrawPixels = dllDrawPixels ; - qglEdgeFlag = dllEdgeFlag ; - qglEdgeFlagPointer = dllEdgeFlagPointer ; - qglEdgeFlagv = dllEdgeFlagv ; - qglEnable = dllEnable ; - qglEnableClientState = dllEnableClientState ; - qglEnd = dllEnd ; - qglEndList = dllEndList ; - qglEvalCoord1d = dllEvalCoord1d ; - qglEvalCoord1dv = dllEvalCoord1dv ; - qglEvalCoord1f = dllEvalCoord1f ; - qglEvalCoord1fv = dllEvalCoord1fv ; - qglEvalCoord2d = dllEvalCoord2d ; - qglEvalCoord2dv = dllEvalCoord2dv ; - qglEvalCoord2f = dllEvalCoord2f ; - qglEvalCoord2fv = dllEvalCoord2fv ; - qglEvalMesh1 = dllEvalMesh1 ; - qglEvalMesh2 = dllEvalMesh2 ; - qglEvalPoint1 = dllEvalPoint1 ; - qglEvalPoint2 = dllEvalPoint2 ; - qglFeedbackBuffer = dllFeedbackBuffer ; - qglFinish = dllFinish ; - qglFlush = dllFlush ; - qglFogf = dllFogf ; - qglFogfv = dllFogfv ; - qglFogi = dllFogi ; - qglFogiv = dllFogiv ; - qglFrontFace = dllFrontFace ; - qglFrustum = dllFrustum ; - qglGenLists = dllGenLists ; - qglGenTextures = dllGenTextures ; - qglGetBooleanv = dllGetBooleanv ; - qglGetClipPlane = dllGetClipPlane ; - qglGetDoublev = dllGetDoublev ; - qglGetError = dllGetError ; - qglGetFloatv = dllGetFloatv ; - qglGetIntegerv = dllGetIntegerv ; - qglGetLightfv = dllGetLightfv ; - qglGetLightiv = dllGetLightiv ; - qglGetMapdv = dllGetMapdv ; - qglGetMapfv = dllGetMapfv ; - qglGetMapiv = dllGetMapiv ; - qglGetMaterialfv = dllGetMaterialfv ; - qglGetMaterialiv = dllGetMaterialiv ; - qglGetPixelMapfv = dllGetPixelMapfv ; - qglGetPixelMapuiv = dllGetPixelMapuiv ; - qglGetPixelMapusv = dllGetPixelMapusv ; - qglGetPointerv = dllGetPointerv ; - qglGetPolygonStipple = dllGetPolygonStipple ; - qglGetString = dllGetString ; - qglGetTexEnvfv = dllGetTexEnvfv ; - qglGetTexEnviv = dllGetTexEnviv ; - qglGetTexGendv = dllGetTexGendv ; - qglGetTexGenfv = dllGetTexGenfv ; - qglGetTexGeniv = dllGetTexGeniv ; - qglGetTexImage = dllGetTexImage ; - qglGetTexLevelParameterfv = dllGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = dllGetTexLevelParameteriv ; - qglGetTexParameterfv = dllGetTexParameterfv ; - qglGetTexParameteriv = dllGetTexParameteriv ; - qglHint = dllHint ; - qglIndexMask = dllIndexMask ; - qglIndexPointer = dllIndexPointer ; - qglIndexd = dllIndexd ; - qglIndexdv = dllIndexdv ; - qglIndexf = dllIndexf ; - qglIndexfv = dllIndexfv ; - qglIndexi = dllIndexi ; - qglIndexiv = dllIndexiv ; - qglIndexs = dllIndexs ; - qglIndexsv = dllIndexsv ; - qglIndexub = dllIndexub ; - qglIndexubv = dllIndexubv ; - qglInitNames = dllInitNames ; - qglInterleavedArrays = dllInterleavedArrays ; - qglIsEnabled = dllIsEnabled ; - qglIsList = dllIsList ; - qglIsTexture = dllIsTexture ; - qglLightModelf = dllLightModelf ; - qglLightModelfv = dllLightModelfv ; - qglLightModeli = dllLightModeli ; - qglLightModeliv = dllLightModeliv ; - qglLightf = dllLightf ; - qglLightfv = dllLightfv ; - qglLighti = dllLighti ; - qglLightiv = dllLightiv ; - qglLineStipple = dllLineStipple ; - qglLineWidth = dllLineWidth ; - qglListBase = dllListBase ; - qglLoadIdentity = dllLoadIdentity ; - qglLoadMatrixd = dllLoadMatrixd ; - qglLoadMatrixf = dllLoadMatrixf ; - qglLoadName = dllLoadName ; - qglLogicOp = dllLogicOp ; - qglMap1d = dllMap1d ; - qglMap1f = dllMap1f ; - qglMap2d = dllMap2d ; - qglMap2f = dllMap2f ; - qglMapGrid1d = dllMapGrid1d ; - qglMapGrid1f = dllMapGrid1f ; - qglMapGrid2d = dllMapGrid2d ; - qglMapGrid2f = dllMapGrid2f ; - qglMaterialf = dllMaterialf ; - qglMaterialfv = dllMaterialfv ; - qglMateriali = dllMateriali ; - qglMaterialiv = dllMaterialiv ; - qglMatrixMode = dllMatrixMode ; - qglMultMatrixd = dllMultMatrixd ; - qglMultMatrixf = dllMultMatrixf ; - qglNewList = dllNewList ; - qglNormal3b = dllNormal3b ; - qglNormal3bv = dllNormal3bv ; - qglNormal3d = dllNormal3d ; - qglNormal3dv = dllNormal3dv ; - qglNormal3f = dllNormal3f ; - qglNormal3fv = dllNormal3fv ; - qglNormal3i = dllNormal3i ; - qglNormal3iv = dllNormal3iv ; - qglNormal3s = dllNormal3s ; - qglNormal3sv = dllNormal3sv ; - qglNormalPointer = dllNormalPointer ; - qglOrtho = dllOrtho ; - qglPassThrough = dllPassThrough ; - qglPixelMapfv = dllPixelMapfv ; - qglPixelMapuiv = dllPixelMapuiv ; - qglPixelMapusv = dllPixelMapusv ; - qglPixelStoref = dllPixelStoref ; - qglPixelStorei = dllPixelStorei ; - qglPixelTransferf = dllPixelTransferf ; - qglPixelTransferi = dllPixelTransferi ; - qglPixelZoom = dllPixelZoom ; - qglPointSize = dllPointSize ; - qglPolygonMode = dllPolygonMode ; - qglPolygonOffset = dllPolygonOffset ; - qglPolygonStipple = dllPolygonStipple ; - qglPopAttrib = dllPopAttrib ; - qglPopClientAttrib = dllPopClientAttrib ; - qglPopMatrix = dllPopMatrix ; - qglPopName = dllPopName ; - qglPrioritizeTextures = dllPrioritizeTextures ; - qglPushAttrib = dllPushAttrib ; - qglPushClientAttrib = dllPushClientAttrib ; - qglPushMatrix = dllPushMatrix ; - qglPushName = dllPushName ; - qglRasterPos2d = dllRasterPos2d ; - qglRasterPos2dv = dllRasterPos2dv ; - qglRasterPos2f = dllRasterPos2f ; - qglRasterPos2fv = dllRasterPos2fv ; - qglRasterPos2i = dllRasterPos2i ; - qglRasterPos2iv = dllRasterPos2iv ; - qglRasterPos2s = dllRasterPos2s ; - qglRasterPos2sv = dllRasterPos2sv ; - qglRasterPos3d = dllRasterPos3d ; - qglRasterPos3dv = dllRasterPos3dv ; - qglRasterPos3f = dllRasterPos3f ; - qglRasterPos3fv = dllRasterPos3fv ; - qglRasterPos3i = dllRasterPos3i ; - qglRasterPos3iv = dllRasterPos3iv ; - qglRasterPos3s = dllRasterPos3s ; - qglRasterPos3sv = dllRasterPos3sv ; - qglRasterPos4d = dllRasterPos4d ; - qglRasterPos4dv = dllRasterPos4dv ; - qglRasterPos4f = dllRasterPos4f ; - qglRasterPos4fv = dllRasterPos4fv ; - qglRasterPos4i = dllRasterPos4i ; - qglRasterPos4iv = dllRasterPos4iv ; - qglRasterPos4s = dllRasterPos4s ; - qglRasterPos4sv = dllRasterPos4sv ; - qglReadBuffer = dllReadBuffer ; - qglReadPixels = dllReadPixels ; - qglRectd = dllRectd ; - qglRectdv = dllRectdv ; - qglRectf = dllRectf ; - qglRectfv = dllRectfv ; - qglRecti = dllRecti ; - qglRectiv = dllRectiv ; - qglRects = dllRects ; - qglRectsv = dllRectsv ; - qglRenderMode = dllRenderMode ; - qglRotated = dllRotated ; - qglRotatef = dllRotatef ; - qglScaled = dllScaled ; - qglScalef = dllScalef ; - qglScissor = dllScissor ; - qglSelectBuffer = dllSelectBuffer ; - qglShadeModel = dllShadeModel ; - qglStencilFunc = dllStencilFunc ; - qglStencilMask = dllStencilMask ; - qglStencilOp = dllStencilOp ; - qglTexCoord1d = dllTexCoord1d ; - qglTexCoord1dv = dllTexCoord1dv ; - qglTexCoord1f = dllTexCoord1f ; - qglTexCoord1fv = dllTexCoord1fv ; - qglTexCoord1i = dllTexCoord1i ; - qglTexCoord1iv = dllTexCoord1iv ; - qglTexCoord1s = dllTexCoord1s ; - qglTexCoord1sv = dllTexCoord1sv ; - qglTexCoord2d = dllTexCoord2d ; - qglTexCoord2dv = dllTexCoord2dv ; - qglTexCoord2f = dllTexCoord2f ; - qglTexCoord2fv = dllTexCoord2fv ; - qglTexCoord2i = dllTexCoord2i ; - qglTexCoord2iv = dllTexCoord2iv ; - qglTexCoord2s = dllTexCoord2s ; - qglTexCoord2sv = dllTexCoord2sv ; - qglTexCoord3d = dllTexCoord3d ; - qglTexCoord3dv = dllTexCoord3dv ; - qglTexCoord3f = dllTexCoord3f ; - qglTexCoord3fv = dllTexCoord3fv ; - qglTexCoord3i = dllTexCoord3i ; - qglTexCoord3iv = dllTexCoord3iv ; - qglTexCoord3s = dllTexCoord3s ; - qglTexCoord3sv = dllTexCoord3sv ; - qglTexCoord4d = dllTexCoord4d ; - qglTexCoord4dv = dllTexCoord4dv ; - qglTexCoord4f = dllTexCoord4f ; - qglTexCoord4fv = dllTexCoord4fv ; - qglTexCoord4i = dllTexCoord4i ; - qglTexCoord4iv = dllTexCoord4iv ; - qglTexCoord4s = dllTexCoord4s ; - qglTexCoord4sv = dllTexCoord4sv ; - qglTexCoordPointer = dllTexCoordPointer ; - qglTexEnvf = dllTexEnvf ; - qglTexEnvfv = dllTexEnvfv ; - qglTexEnvi = dllTexEnvi ; - qglTexEnviv = dllTexEnviv ; - qglTexGend = dllTexGend ; - qglTexGendv = dllTexGendv ; - qglTexGenf = dllTexGenf ; - qglTexGenfv = dllTexGenfv ; - qglTexGeni = dllTexGeni ; - qglTexGeniv = dllTexGeniv ; - qglTexImage1D = dllTexImage1D ; - qglTexImage2D = dllTexImage2D ; - qglTexParameterf = dllTexParameterf ; - qglTexParameterfv = dllTexParameterfv ; - qglTexParameteri = dllTexParameteri ; - qglTexParameteriv = dllTexParameteriv ; - qglTexSubImage1D = dllTexSubImage1D ; - qglTexSubImage2D = dllTexSubImage2D ; - qglTranslated = dllTranslated ; - qglTranslatef = dllTranslatef ; - qglVertex2d = dllVertex2d ; - qglVertex2dv = dllVertex2dv ; - qglVertex2f = dllVertex2f ; - qglVertex2fv = dllVertex2fv ; - qglVertex2i = dllVertex2i ; - qglVertex2iv = dllVertex2iv ; - qglVertex2s = dllVertex2s ; - qglVertex2sv = dllVertex2sv ; - qglVertex3d = dllVertex3d ; - qglVertex3dv = dllVertex3dv ; - qglVertex3f = dllVertex3f ; - qglVertex3fv = dllVertex3fv ; - qglVertex3i = dllVertex3i ; - qglVertex3iv = dllVertex3iv ; - qglVertex3s = dllVertex3s ; - qglVertex3sv = dllVertex3sv ; - qglVertex4d = dllVertex4d ; - qglVertex4dv = dllVertex4dv ; - qglVertex4f = dllVertex4f ; - qglVertex4fv = dllVertex4fv ; - qglVertex4i = dllVertex4i ; - qglVertex4iv = dllVertex4iv ; - qglVertex4s = dllVertex4s ; - qglVertex4sv = dllVertex4sv ; - qglVertexPointer = dllVertexPointer ; - qglViewport = dllViewport ; - } -} - -#pragma warning (default : 4113 4133 4047 ) - - - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +/* +** QGL_WIN.C +** +** This file implements the operating system binding of GL to QGL function +** pointers. When doing a port of Quake3 you must implement the following +** two functions: +** +** QGL_Init() - loads libraries, assigns function pointers, etc. +** QGL_Shutdown() - unloads libraries, NULLs function pointers +*/ +#include +#include "../renderer/tr_local.h" +#include "glw_win.h" + +void QGL_EnableLogging( qboolean enable ); + +int ( WINAPI * qwglSwapIntervalEXT)( int interval ); +BOOL ( WINAPI * qwglGetDeviceGammaRamp3DFX)( HDC, LPVOID ); +BOOL ( WINAPI * qwglSetDeviceGammaRamp3DFX)( HDC, LPVOID ); + +int ( WINAPI * qwglChoosePixelFormat )(HDC, CONST PIXELFORMATDESCRIPTOR *); +int ( WINAPI * qwglDescribePixelFormat) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); +int ( WINAPI * qwglGetPixelFormat)(HDC); +BOOL ( WINAPI * qwglSetPixelFormat)(HDC, int, CONST PIXELFORMATDESCRIPTOR *); +BOOL ( WINAPI * qwglSwapBuffers)(HDC); + +BOOL ( WINAPI * qwglCopyContext)(HGLRC, HGLRC, UINT); +HGLRC ( WINAPI * qwglCreateContext)(HDC); +HGLRC ( WINAPI * qwglCreateLayerContext)(HDC, int); +BOOL ( WINAPI * qwglDeleteContext)(HGLRC); +HGLRC ( WINAPI * qwglGetCurrentContext)(VOID); +HDC ( WINAPI * qwglGetCurrentDC)(VOID); +PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); +BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); +BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); +BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); + +BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, + FLOAT, int, LPGLYPHMETRICSFLOAT); + +BOOL ( WINAPI * qwglDescribeLayerPlane)(HDC, int, int, UINT, + LPLAYERPLANEDESCRIPTOR); +int ( WINAPI * qwglSetLayerPaletteEntries)(HDC, int, int, int, + CONST COLORREF *); +int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, + COLORREF *); +BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); +BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); + +void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); +void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); +GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); +void ( APIENTRY * qglArrayElement )(GLint i); +void ( APIENTRY * qglBegin )(GLenum mode); +void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); +void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); +void ( APIENTRY * qglCallList )(GLuint list); +void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); +void ( APIENTRY * qglClear )(GLbitfield mask); +void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +void ( APIENTRY * qglClearDepth )(GLclampd depth); +void ( APIENTRY * qglClearIndex )(GLfloat c); +void ( APIENTRY * qglClearStencil )(GLint s); +void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); +void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); +void ( APIENTRY * qglColor3bv )(const GLbyte *v); +void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); +void ( APIENTRY * qglColor3dv )(const GLdouble *v); +void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); +void ( APIENTRY * qglColor3fv )(const GLfloat *v); +void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); +void ( APIENTRY * qglColor3iv )(const GLint *v); +void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); +void ( APIENTRY * qglColor3sv )(const GLshort *v); +void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); +void ( APIENTRY * qglColor3ubv )(const GLubyte *v); +void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); +void ( APIENTRY * qglColor3uiv )(const GLuint *v); +void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); +void ( APIENTRY * qglColor3usv )(const GLushort *v); +void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +void ( APIENTRY * qglColor4bv )(const GLbyte *v); +void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +void ( APIENTRY * qglColor4dv )(const GLdouble *v); +void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +void ( APIENTRY * qglColor4fv )(const GLfloat *v); +void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); +void ( APIENTRY * qglColor4iv )(const GLint *v); +void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); +void ( APIENTRY * qglColor4sv )(const GLshort *v); +void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +void ( APIENTRY * qglColor4ubv )(const GLubyte *v); +void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); +void ( APIENTRY * qglColor4uiv )(const GLuint *v); +void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); +void ( APIENTRY * qglColor4usv )(const GLushort *v); +void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); +void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +void ( APIENTRY * qglCullFace )(GLenum mode); +void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); +void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); +void ( APIENTRY * qglDepthFunc )(GLenum func); +void ( APIENTRY * qglDepthMask )(GLboolean flag); +void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); +void ( APIENTRY * qglDisable )(GLenum cap); +void ( APIENTRY * qglDisableClientState )(GLenum array); +void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); +void ( APIENTRY * qglDrawBuffer )(GLenum mode); +void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +void ( APIENTRY * qglEdgeFlag )(GLboolean flag); +void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); +void ( APIENTRY * qglEnable )(GLenum cap); +void ( APIENTRY * qglEnableClientState )(GLenum array); +void ( APIENTRY * qglEnd )(void); +void ( APIENTRY * qglEndList )(void); +void ( APIENTRY * qglEvalCoord1d )(GLdouble u); +void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); +void ( APIENTRY * qglEvalCoord1f )(GLfloat u); +void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); +void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); +void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); +void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); +void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); +void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); +void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +void ( APIENTRY * qglEvalPoint1 )(GLint i); +void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); +void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); +void ( APIENTRY * qglFinish )(void); +void ( APIENTRY * qglFlush )(void); +void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); +void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); +void ( APIENTRY * qglFogi )(GLenum pname, GLint param); +void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); +void ( APIENTRY * qglFrontFace )(GLenum mode); +void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLuint ( APIENTRY * qglGenLists )(GLsizei range); +void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); +void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); +void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); +void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); +GLenum ( APIENTRY * qglGetError )(void); +void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); +void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); +void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); +void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); +void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); +void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); +void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values); +void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values); +void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values); +void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); +void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); +const GLubyte * ( APIENTRY * qglGetString )(GLenum name); +void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); +void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); +void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); +void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); +void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); +void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); +void ( APIENTRY * qglHint )(GLenum target, GLenum mode); +void ( APIENTRY * qglIndexMask )(GLuint mask); +void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglIndexd )(GLdouble c); +void ( APIENTRY * qglIndexdv )(const GLdouble *c); +void ( APIENTRY * qglIndexf )(GLfloat c); +void ( APIENTRY * qglIndexfv )(const GLfloat *c); +void ( APIENTRY * qglIndexi )(GLint c); +void ( APIENTRY * qglIndexiv )(const GLint *c); +void ( APIENTRY * qglIndexs )(GLshort c); +void ( APIENTRY * qglIndexsv )(const GLshort *c); +void ( APIENTRY * qglIndexub )(GLubyte c); +void ( APIENTRY * qglIndexubv )(const GLubyte *c); +void ( APIENTRY * qglInitNames )(void); +void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); +GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); +GLboolean ( APIENTRY * qglIsList )(GLuint list); +GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); +void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); +void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); +void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); +void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); +void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); +void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); +void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); +void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); +void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); +void ( APIENTRY * qglLineWidth )(GLfloat width); +void ( APIENTRY * qglListBase )(GLuint base); +void ( APIENTRY * qglLoadIdentity )(void); +void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); +void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); +void ( APIENTRY * qglLoadName )(GLuint name); +void ( APIENTRY * qglLogicOp )(GLenum opcode); +void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); +void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); +void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); +void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); +void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); +void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); +void ( APIENTRY * qglMatrixMode )(GLenum mode); +void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); +void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); +void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); +void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); +void ( APIENTRY * qglNormal3bv )(const GLbyte *v); +void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); +void ( APIENTRY * qglNormal3dv )(const GLdouble *v); +void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); +void ( APIENTRY * qglNormal3fv )(const GLfloat *v); +void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); +void ( APIENTRY * qglNormal3iv )(const GLint *v); +void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); +void ( APIENTRY * qglNormal3sv )(const GLshort *v); +void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +void ( APIENTRY * qglPassThrough )(GLfloat token); +void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); +void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); +void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); +void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); +void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); +void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); +void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); +void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); +void ( APIENTRY * qglPointSize )(GLfloat size); +void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); +void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); +void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); +void ( APIENTRY * qglPopAttrib )(void); +void ( APIENTRY * qglPopClientAttrib )(void); +void ( APIENTRY * qglPopMatrix )(void); +void ( APIENTRY * qglPopName )(void); +void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); +void ( APIENTRY * qglPushAttrib )(GLbitfield mask); +void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); +void ( APIENTRY * qglPushMatrix )(void); +void ( APIENTRY * qglPushName )(GLuint name); +void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); +void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); +void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); +void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); +void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); +void ( APIENTRY * qglRasterPos2iv )(const GLint *v); +void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); +void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); +void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); +void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); +void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); +void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); +void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); +void ( APIENTRY * qglRasterPos3iv )(const GLint *v); +void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); +void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); +void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); +void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); +void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); +void ( APIENTRY * qglRasterPos4iv )(const GLint *v); +void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); +void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); +void ( APIENTRY * qglReadBuffer )(GLenum mode); +void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); +void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); +void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); +void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); +void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); +void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); +GLint ( APIENTRY * qglRenderMode )(GLenum mode); +void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); +void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); +void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); +void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); +void ( APIENTRY * qglShadeModel )(GLenum mode); +void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); +void ( APIENTRY * qglStencilMask )(GLuint mask); +void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); +void ( APIENTRY * qglTexCoord1d )(GLdouble s); +void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); +void ( APIENTRY * qglTexCoord1f )(GLfloat s); +void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); +void ( APIENTRY * qglTexCoord1i )(GLint s); +void ( APIENTRY * qglTexCoord1iv )(const GLint *v); +void ( APIENTRY * qglTexCoord1s )(GLshort s); +void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); +void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); +void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); +void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); +void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); +void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); +void ( APIENTRY * qglTexCoord2iv )(const GLint *v); +void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); +void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); +void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); +void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); +void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); +void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); +void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); +void ( APIENTRY * qglTexCoord3iv )(const GLint *v); +void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); +void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); +void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); +void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); +void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); +void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); +void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); +void ( APIENTRY * qglTexCoord4iv )(const GLint *v); +void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); +void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); +void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); +void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); +void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); +void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); +void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); +void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); +void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); +void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); +void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); +void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); +void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); +void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); +void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); +void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); +void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); +void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); +void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); +void ( APIENTRY * qglVertex2dv )(const GLdouble *v); +void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); +void ( APIENTRY * qglVertex2fv )(const GLfloat *v); +void ( APIENTRY * qglVertex2i )(GLint x, GLint y); +void ( APIENTRY * qglVertex2iv )(const GLint *v); +void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); +void ( APIENTRY * qglVertex2sv )(const GLshort *v); +void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); +void ( APIENTRY * qglVertex3dv )(const GLdouble *v); +void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); +void ( APIENTRY * qglVertex3fv )(const GLfloat *v); +void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); +void ( APIENTRY * qglVertex3iv )(const GLint *v); +void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); +void ( APIENTRY * qglVertex3sv )(const GLshort *v); +void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +void ( APIENTRY * qglVertex4dv )(const GLdouble *v); +void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +void ( APIENTRY * qglVertex4fv )(const GLfloat *v); +void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); +void ( APIENTRY * qglVertex4iv )(const GLint *v); +void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); +void ( APIENTRY * qglVertex4sv )(const GLshort *v); +void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); + + + +static void ( APIENTRY * dllAccum )(GLenum op, GLfloat value); +static void ( APIENTRY * dllAlphaFunc )(GLenum func, GLclampf ref); +GLboolean ( APIENTRY * dllAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); +static void ( APIENTRY * dllArrayElement )(GLint i); +static void ( APIENTRY * dllBegin )(GLenum mode); +static void ( APIENTRY * dllBindTexture )(GLenum target, GLuint texture); +static void ( APIENTRY * dllBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +static void ( APIENTRY * dllBlendFunc )(GLenum sfactor, GLenum dfactor); +static void ( APIENTRY * dllCallList )(GLuint list); +static void ( APIENTRY * dllCallLists )(GLsizei n, GLenum type, const GLvoid *lists); +static void ( APIENTRY * dllClear )(GLbitfield mask); +static void ( APIENTRY * dllClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +static void ( APIENTRY * dllClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +static void ( APIENTRY * dllClearDepth )(GLclampd depth); +static void ( APIENTRY * dllClearIndex )(GLfloat c); +static void ( APIENTRY * dllClearStencil )(GLint s); +static void ( APIENTRY * dllClipPlane )(GLenum plane, const GLdouble *equation); +static void ( APIENTRY * dllColor3b )(GLbyte red, GLbyte green, GLbyte blue); +static void ( APIENTRY * dllColor3bv )(const GLbyte *v); +static void ( APIENTRY * dllColor3d )(GLdouble red, GLdouble green, GLdouble blue); +static void ( APIENTRY * dllColor3dv )(const GLdouble *v); +static void ( APIENTRY * dllColor3f )(GLfloat red, GLfloat green, GLfloat blue); +static void ( APIENTRY * dllColor3fv )(const GLfloat *v); +static void ( APIENTRY * dllColor3i )(GLint red, GLint green, GLint blue); +static void ( APIENTRY * dllColor3iv )(const GLint *v); +static void ( APIENTRY * dllColor3s )(GLshort red, GLshort green, GLshort blue); +static void ( APIENTRY * dllColor3sv )(const GLshort *v); +static void ( APIENTRY * dllColor3ub )(GLubyte red, GLubyte green, GLubyte blue); +static void ( APIENTRY * dllColor3ubv )(const GLubyte *v); +static void ( APIENTRY * dllColor3ui )(GLuint red, GLuint green, GLuint blue); +static void ( APIENTRY * dllColor3uiv )(const GLuint *v); +static void ( APIENTRY * dllColor3us )(GLushort red, GLushort green, GLushort blue); +static void ( APIENTRY * dllColor3usv )(const GLushort *v); +static void ( APIENTRY * dllColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +static void ( APIENTRY * dllColor4bv )(const GLbyte *v); +static void ( APIENTRY * dllColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +static void ( APIENTRY * dllColor4dv )(const GLdouble *v); +static void ( APIENTRY * dllColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +static void ( APIENTRY * dllColor4fv )(const GLfloat *v); +static void ( APIENTRY * dllColor4i )(GLint red, GLint green, GLint blue, GLint alpha); +static void ( APIENTRY * dllColor4iv )(const GLint *v); +static void ( APIENTRY * dllColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); +static void ( APIENTRY * dllColor4sv )(const GLshort *v); +static void ( APIENTRY * dllColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +static void ( APIENTRY * dllColor4ubv )(const GLubyte *v); +static void ( APIENTRY * dllColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); +static void ( APIENTRY * dllColor4uiv )(const GLuint *v); +static void ( APIENTRY * dllColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); +static void ( APIENTRY * dllColor4usv )(const GLushort *v); +static void ( APIENTRY * dllColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +static void ( APIENTRY * dllColorMaterial )(GLenum face, GLenum mode); +static void ( APIENTRY * dllColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +static void ( APIENTRY * dllCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +static void ( APIENTRY * dllCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +static void ( APIENTRY * dllCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +static void ( APIENTRY * dllCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +static void ( APIENTRY * dllCullFace )(GLenum mode); +static void ( APIENTRY * dllDeleteLists )(GLuint list, GLsizei range); +static void ( APIENTRY * dllDeleteTextures )(GLsizei n, const GLuint *textures); +static void ( APIENTRY * dllDepthFunc )(GLenum func); +static void ( APIENTRY * dllDepthMask )(GLboolean flag); +static void ( APIENTRY * dllDepthRange )(GLclampd zNear, GLclampd zFar); +static void ( APIENTRY * dllDisable )(GLenum cap); +static void ( APIENTRY * dllDisableClientState )(GLenum array); +static void ( APIENTRY * dllDrawArrays )(GLenum mode, GLint first, GLsizei count); +static void ( APIENTRY * dllDrawBuffer )(GLenum mode); +static void ( APIENTRY * dllDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +static void ( APIENTRY * dllDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +static void ( APIENTRY * dllEdgeFlag )(GLboolean flag); +static void ( APIENTRY * dllEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllEdgeFlagv )(const GLboolean *flag); +static void ( APIENTRY * dllEnable )(GLenum cap); +static void ( APIENTRY * dllEnableClientState )(GLenum array); +static void ( APIENTRY * dllEnd )(void); +static void ( APIENTRY * dllEndList )(void); +static void ( APIENTRY * dllEvalCoord1d )(GLdouble u); +static void ( APIENTRY * dllEvalCoord1dv )(const GLdouble *u); +static void ( APIENTRY * dllEvalCoord1f )(GLfloat u); +static void ( APIENTRY * dllEvalCoord1fv )(const GLfloat *u); +static void ( APIENTRY * dllEvalCoord2d )(GLdouble u, GLdouble v); +static void ( APIENTRY * dllEvalCoord2dv )(const GLdouble *u); +static void ( APIENTRY * dllEvalCoord2f )(GLfloat u, GLfloat v); +static void ( APIENTRY * dllEvalCoord2fv )(const GLfloat *u); +static void ( APIENTRY * dllEvalMesh1 )(GLenum mode, GLint i1, GLint i2); +static void ( APIENTRY * dllEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +static void ( APIENTRY * dllEvalPoint1 )(GLint i); +static void ( APIENTRY * dllEvalPoint2 )(GLint i, GLint j); +static void ( APIENTRY * dllFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); +static void ( APIENTRY * dllFinish )(void); +static void ( APIENTRY * dllFlush )(void); +static void ( APIENTRY * dllFogf )(GLenum pname, GLfloat param); +static void ( APIENTRY * dllFogfv )(GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllFogi )(GLenum pname, GLint param); +static void ( APIENTRY * dllFogiv )(GLenum pname, const GLint *params); +static void ( APIENTRY * dllFrontFace )(GLenum mode); +static void ( APIENTRY * dllFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLuint ( APIENTRY * dllGenLists )(GLsizei range); +static void ( APIENTRY * dllGenTextures )(GLsizei n, GLuint *textures); +static void ( APIENTRY * dllGetBooleanv )(GLenum pname, GLboolean *params); +static void ( APIENTRY * dllGetClipPlane )(GLenum plane, GLdouble *equation); +static void ( APIENTRY * dllGetDoublev )(GLenum pname, GLdouble *params); +GLenum ( APIENTRY * dllGetError )(void); +static void ( APIENTRY * dllGetFloatv )(GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetIntegerv )(GLenum pname, GLint *params); +static void ( APIENTRY * dllGetLightfv )(GLenum light, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetLightiv )(GLenum light, GLenum pname, GLint *params); +static void ( APIENTRY * dllGetMapdv )(GLenum target, GLenum query, GLdouble *v); +static void ( APIENTRY * dllGetMapfv )(GLenum target, GLenum query, GLfloat *v); +static void ( APIENTRY * dllGetMapiv )(GLenum target, GLenum query, GLint *v); +static void ( APIENTRY * dllGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetMaterialiv )(GLenum face, GLenum pname, GLint *params); +static void ( APIENTRY * dllGetPixelMapfv )(GLenum map, GLfloat *values); +static void ( APIENTRY * dllGetPixelMapuiv )(GLenum map, GLuint *values); +static void ( APIENTRY * dllGetPixelMapusv )(GLenum map, GLushort *values); +static void ( APIENTRY * dllGetPointerv )(GLenum pname, GLvoid* *params); +static void ( APIENTRY * dllGetPolygonStipple )(GLubyte *mask); +const GLubyte * ( APIENTRY * dllGetString )(GLenum name); +static void ( APIENTRY * dllGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetTexEnviv )(GLenum target, GLenum pname, GLint *params); +static void ( APIENTRY * dllGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); +static void ( APIENTRY * dllGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); +static void ( APIENTRY * dllGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +static void ( APIENTRY * dllGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); +static void ( APIENTRY * dllGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); +static void ( APIENTRY * dllGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); +static void ( APIENTRY * dllHint )(GLenum target, GLenum mode); +static void ( APIENTRY * dllIndexMask )(GLuint mask); +static void ( APIENTRY * dllIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllIndexd )(GLdouble c); +static void ( APIENTRY * dllIndexdv )(const GLdouble *c); +static void ( APIENTRY * dllIndexf )(GLfloat c); +static void ( APIENTRY * dllIndexfv )(const GLfloat *c); +static void ( APIENTRY * dllIndexi )(GLint c); +static void ( APIENTRY * dllIndexiv )(const GLint *c); +static void ( APIENTRY * dllIndexs )(GLshort c); +static void ( APIENTRY * dllIndexsv )(const GLshort *c); +static void ( APIENTRY * dllIndexub )(GLubyte c); +static void ( APIENTRY * dllIndexubv )(const GLubyte *c); +static void ( APIENTRY * dllInitNames )(void); +static void ( APIENTRY * dllInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); +GLboolean ( APIENTRY * dllIsEnabled )(GLenum cap); +GLboolean ( APIENTRY * dllIsList )(GLuint list); +GLboolean ( APIENTRY * dllIsTexture )(GLuint texture); +static void ( APIENTRY * dllLightModelf )(GLenum pname, GLfloat param); +static void ( APIENTRY * dllLightModelfv )(GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllLightModeli )(GLenum pname, GLint param); +static void ( APIENTRY * dllLightModeliv )(GLenum pname, const GLint *params); +static void ( APIENTRY * dllLightf )(GLenum light, GLenum pname, GLfloat param); +static void ( APIENTRY * dllLightfv )(GLenum light, GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllLighti )(GLenum light, GLenum pname, GLint param); +static void ( APIENTRY * dllLightiv )(GLenum light, GLenum pname, const GLint *params); +static void ( APIENTRY * dllLineStipple )(GLint factor, GLushort pattern); +static void ( APIENTRY * dllLineWidth )(GLfloat width); +static void ( APIENTRY * dllListBase )(GLuint base); +static void ( APIENTRY * dllLoadIdentity )(void); +static void ( APIENTRY * dllLoadMatrixd )(const GLdouble *m); +static void ( APIENTRY * dllLoadMatrixf )(const GLfloat *m); +static void ( APIENTRY * dllLoadName )(GLuint name); +static void ( APIENTRY * dllLogicOp )(GLenum opcode); +static void ( APIENTRY * dllMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +static void ( APIENTRY * dllMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +static void ( APIENTRY * dllMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +static void ( APIENTRY * dllMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +static void ( APIENTRY * dllMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); +static void ( APIENTRY * dllMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); +static void ( APIENTRY * dllMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +static void ( APIENTRY * dllMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +static void ( APIENTRY * dllMaterialf )(GLenum face, GLenum pname, GLfloat param); +static void ( APIENTRY * dllMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllMateriali )(GLenum face, GLenum pname, GLint param); +static void ( APIENTRY * dllMaterialiv )(GLenum face, GLenum pname, const GLint *params); +static void ( APIENTRY * dllMatrixMode )(GLenum mode); +static void ( APIENTRY * dllMultMatrixd )(const GLdouble *m); +static void ( APIENTRY * dllMultMatrixf )(const GLfloat *m); +static void ( APIENTRY * dllNewList )(GLuint list, GLenum mode); +static void ( APIENTRY * dllNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); +static void ( APIENTRY * dllNormal3bv )(const GLbyte *v); +static void ( APIENTRY * dllNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); +static void ( APIENTRY * dllNormal3dv )(const GLdouble *v); +static void ( APIENTRY * dllNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); +static void ( APIENTRY * dllNormal3fv )(const GLfloat *v); +static void ( APIENTRY * dllNormal3i )(GLint nx, GLint ny, GLint nz); +static void ( APIENTRY * dllNormal3iv )(const GLint *v); +static void ( APIENTRY * dllNormal3s )(GLshort nx, GLshort ny, GLshort nz); +static void ( APIENTRY * dllNormal3sv )(const GLshort *v); +static void ( APIENTRY * dllNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +static void ( APIENTRY * dllPassThrough )(GLfloat token); +static void ( APIENTRY * dllPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); +static void ( APIENTRY * dllPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); +static void ( APIENTRY * dllPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); +static void ( APIENTRY * dllPixelStoref )(GLenum pname, GLfloat param); +static void ( APIENTRY * dllPixelStorei )(GLenum pname, GLint param); +static void ( APIENTRY * dllPixelTransferf )(GLenum pname, GLfloat param); +static void ( APIENTRY * dllPixelTransferi )(GLenum pname, GLint param); +static void ( APIENTRY * dllPixelZoom )(GLfloat xfactor, GLfloat yfactor); +static void ( APIENTRY * dllPointSize )(GLfloat size); +static void ( APIENTRY * dllPolygonMode )(GLenum face, GLenum mode); +static void ( APIENTRY * dllPolygonOffset )(GLfloat factor, GLfloat units); +static void ( APIENTRY * dllPolygonStipple )(const GLubyte *mask); +static void ( APIENTRY * dllPopAttrib )(void); +static void ( APIENTRY * dllPopClientAttrib )(void); +static void ( APIENTRY * dllPopMatrix )(void); +static void ( APIENTRY * dllPopName )(void); +static void ( APIENTRY * dllPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); +static void ( APIENTRY * dllPushAttrib )(GLbitfield mask); +static void ( APIENTRY * dllPushClientAttrib )(GLbitfield mask); +static void ( APIENTRY * dllPushMatrix )(void); +static void ( APIENTRY * dllPushName )(GLuint name); +static void ( APIENTRY * dllRasterPos2d )(GLdouble x, GLdouble y); +static void ( APIENTRY * dllRasterPos2dv )(const GLdouble *v); +static void ( APIENTRY * dllRasterPos2f )(GLfloat x, GLfloat y); +static void ( APIENTRY * dllRasterPos2fv )(const GLfloat *v); +static void ( APIENTRY * dllRasterPos2i )(GLint x, GLint y); +static void ( APIENTRY * dllRasterPos2iv )(const GLint *v); +static void ( APIENTRY * dllRasterPos2s )(GLshort x, GLshort y); +static void ( APIENTRY * dllRasterPos2sv )(const GLshort *v); +static void ( APIENTRY * dllRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); +static void ( APIENTRY * dllRasterPos3dv )(const GLdouble *v); +static void ( APIENTRY * dllRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); +static void ( APIENTRY * dllRasterPos3fv )(const GLfloat *v); +static void ( APIENTRY * dllRasterPos3i )(GLint x, GLint y, GLint z); +static void ( APIENTRY * dllRasterPos3iv )(const GLint *v); +static void ( APIENTRY * dllRasterPos3s )(GLshort x, GLshort y, GLshort z); +static void ( APIENTRY * dllRasterPos3sv )(const GLshort *v); +static void ( APIENTRY * dllRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +static void ( APIENTRY * dllRasterPos4dv )(const GLdouble *v); +static void ( APIENTRY * dllRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +static void ( APIENTRY * dllRasterPos4fv )(const GLfloat *v); +static void ( APIENTRY * dllRasterPos4i )(GLint x, GLint y, GLint z, GLint w); +static void ( APIENTRY * dllRasterPos4iv )(const GLint *v); +static void ( APIENTRY * dllRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); +static void ( APIENTRY * dllRasterPos4sv )(const GLshort *v); +static void ( APIENTRY * dllReadBuffer )(GLenum mode); +static void ( APIENTRY * dllReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +static void ( APIENTRY * dllRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +static void ( APIENTRY * dllRectdv )(const GLdouble *v1, const GLdouble *v2); +static void ( APIENTRY * dllRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +static void ( APIENTRY * dllRectfv )(const GLfloat *v1, const GLfloat *v2); +static void ( APIENTRY * dllRecti )(GLint x1, GLint y1, GLint x2, GLint y2); +static void ( APIENTRY * dllRectiv )(const GLint *v1, const GLint *v2); +static void ( APIENTRY * dllRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); +static void ( APIENTRY * dllRectsv )(const GLshort *v1, const GLshort *v2); +GLint ( APIENTRY * dllRenderMode )(GLenum mode); +static void ( APIENTRY * dllRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +static void ( APIENTRY * dllRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +static void ( APIENTRY * dllScaled )(GLdouble x, GLdouble y, GLdouble z); +static void ( APIENTRY * dllScalef )(GLfloat x, GLfloat y, GLfloat z); +static void ( APIENTRY * dllScissor )(GLint x, GLint y, GLsizei width, GLsizei height); +static void ( APIENTRY * dllSelectBuffer )(GLsizei size, GLuint *buffer); +static void ( APIENTRY * dllShadeModel )(GLenum mode); +static void ( APIENTRY * dllStencilFunc )(GLenum func, GLint ref, GLuint mask); +static void ( APIENTRY * dllStencilMask )(GLuint mask); +static void ( APIENTRY * dllStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); +static void ( APIENTRY * dllTexCoord1d )(GLdouble s); +static void ( APIENTRY * dllTexCoord1dv )(const GLdouble *v); +static void ( APIENTRY * dllTexCoord1f )(GLfloat s); +static void ( APIENTRY * dllTexCoord1fv )(const GLfloat *v); +static void ( APIENTRY * dllTexCoord1i )(GLint s); +static void ( APIENTRY * dllTexCoord1iv )(const GLint *v); +static void ( APIENTRY * dllTexCoord1s )(GLshort s); +static void ( APIENTRY * dllTexCoord1sv )(const GLshort *v); +static void ( APIENTRY * dllTexCoord2d )(GLdouble s, GLdouble t); +static void ( APIENTRY * dllTexCoord2dv )(const GLdouble *v); +static void ( APIENTRY * dllTexCoord2f )(GLfloat s, GLfloat t); +static void ( APIENTRY * dllTexCoord2fv )(const GLfloat *v); +static void ( APIENTRY * dllTexCoord2i )(GLint s, GLint t); +static void ( APIENTRY * dllTexCoord2iv )(const GLint *v); +static void ( APIENTRY * dllTexCoord2s )(GLshort s, GLshort t); +static void ( APIENTRY * dllTexCoord2sv )(const GLshort *v); +static void ( APIENTRY * dllTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); +static void ( APIENTRY * dllTexCoord3dv )(const GLdouble *v); +static void ( APIENTRY * dllTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); +static void ( APIENTRY * dllTexCoord3fv )(const GLfloat *v); +static void ( APIENTRY * dllTexCoord3i )(GLint s, GLint t, GLint r); +static void ( APIENTRY * dllTexCoord3iv )(const GLint *v); +static void ( APIENTRY * dllTexCoord3s )(GLshort s, GLshort t, GLshort r); +static void ( APIENTRY * dllTexCoord3sv )(const GLshort *v); +static void ( APIENTRY * dllTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); +static void ( APIENTRY * dllTexCoord4dv )(const GLdouble *v); +static void ( APIENTRY * dllTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); +static void ( APIENTRY * dllTexCoord4fv )(const GLfloat *v); +static void ( APIENTRY * dllTexCoord4i )(GLint s, GLint t, GLint r, GLint q); +static void ( APIENTRY * dllTexCoord4iv )(const GLint *v); +static void ( APIENTRY * dllTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); +static void ( APIENTRY * dllTexCoord4sv )(const GLshort *v); +static void ( APIENTRY * dllTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllTexEnvf )(GLenum target, GLenum pname, GLfloat param); +static void ( APIENTRY * dllTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllTexEnvi )(GLenum target, GLenum pname, GLint param); +static void ( APIENTRY * dllTexEnviv )(GLenum target, GLenum pname, const GLint *params); +static void ( APIENTRY * dllTexGend )(GLenum coord, GLenum pname, GLdouble param); +static void ( APIENTRY * dllTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); +static void ( APIENTRY * dllTexGenf )(GLenum coord, GLenum pname, GLfloat param); +static void ( APIENTRY * dllTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllTexGeni )(GLenum coord, GLenum pname, GLint param); +static void ( APIENTRY * dllTexGeniv )(GLenum coord, GLenum pname, const GLint *params); +static void ( APIENTRY * dllTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param); +static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); +static void ( APIENTRY * dllTexParameteri )(GLenum target, GLenum pname, GLint param); +static void ( APIENTRY * dllTexParameteriv )(GLenum target, GLenum pname, const GLint *params); +static void ( APIENTRY * dllTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +static void ( APIENTRY * dllTranslated )(GLdouble x, GLdouble y, GLdouble z); +static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z); +static void ( APIENTRY * dllVertex2d )(GLdouble x, GLdouble y); +static void ( APIENTRY * dllVertex2dv )(const GLdouble *v); +static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y); +static void ( APIENTRY * dllVertex2fv )(const GLfloat *v); +static void ( APIENTRY * dllVertex2i )(GLint x, GLint y); +static void ( APIENTRY * dllVertex2iv )(const GLint *v); +static void ( APIENTRY * dllVertex2s )(GLshort x, GLshort y); +static void ( APIENTRY * dllVertex2sv )(const GLshort *v); +static void ( APIENTRY * dllVertex3d )(GLdouble x, GLdouble y, GLdouble z); +static void ( APIENTRY * dllVertex3dv )(const GLdouble *v); +static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z); +static void ( APIENTRY * dllVertex3fv )(const GLfloat *v); +static void ( APIENTRY * dllVertex3i )(GLint x, GLint y, GLint z); +static void ( APIENTRY * dllVertex3iv )(const GLint *v); +static void ( APIENTRY * dllVertex3s )(GLshort x, GLshort y, GLshort z); +static void ( APIENTRY * dllVertex3sv )(const GLshort *v); +static void ( APIENTRY * dllVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +static void ( APIENTRY * dllVertex4dv )(const GLdouble *v); +static void ( APIENTRY * dllVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +static void ( APIENTRY * dllVertex4fv )(const GLfloat *v); +static void ( APIENTRY * dllVertex4i )(GLint x, GLint y, GLint z, GLint w); +static void ( APIENTRY * dllVertex4iv )(const GLint *v); +static void ( APIENTRY * dllVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); +static void ( APIENTRY * dllVertex4sv )(const GLshort *v); +static void ( APIENTRY * dllVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +static void ( APIENTRY * dllViewport )(GLint x, GLint y, GLsizei width, GLsizei height); + +static const char * BooleanToString( GLboolean b ) +{ + if ( b == GL_FALSE ) + return "GL_FALSE"; + else if ( b == GL_TRUE ) + return "GL_TRUE"; + else + return "OUT OF RANGE FOR BOOLEAN"; +} + +static const char * FuncToString( GLenum f ) +{ + switch ( f ) + { + case GL_ALWAYS: + return "GL_ALWAYS"; + case GL_NEVER: + return "GL_NEVER"; + case GL_LEQUAL: + return "GL_LEQUAL"; + case GL_LESS: + return "GL_LESS"; + case GL_EQUAL: + return "GL_EQUAL"; + case GL_GREATER: + return "GL_GREATER"; + case GL_GEQUAL: + return "GL_GEQUAL"; + case GL_NOTEQUAL: + return "GL_NOTEQUAL"; + default: + return "!!! UNKNOWN !!!"; + } +} + +static const char * PrimToString( GLenum mode ) +{ + static char prim[1024]; + + if ( mode == GL_TRIANGLES ) + strcpy( prim, "GL_TRIANGLES" ); + else if ( mode == GL_TRIANGLE_STRIP ) + strcpy( prim, "GL_TRIANGLE_STRIP" ); + else if ( mode == GL_TRIANGLE_FAN ) + strcpy( prim, "GL_TRIANGLE_FAN" ); + else if ( mode == GL_QUADS ) + strcpy( prim, "GL_QUADS" ); + else if ( mode == GL_QUAD_STRIP ) + strcpy( prim, "GL_QUAD_STRIP" ); + else if ( mode == GL_POLYGON ) + strcpy( prim, "GL_POLYGON" ); + else if ( mode == GL_POINTS ) + strcpy( prim, "GL_POINTS" ); + else if ( mode == GL_LINES ) + strcpy( prim, "GL_LINES" ); + else if ( mode == GL_LINE_STRIP ) + strcpy( prim, "GL_LINE_STRIP" ); + else if ( mode == GL_LINE_LOOP ) + strcpy( prim, "GL_LINE_LOOP" ); + else + sprintf( prim, "0x%x", mode ); + + return prim; +} + +static const char * CapToString( GLenum cap ) +{ + static char buffer[1024]; + + switch ( cap ) + { + case GL_TEXTURE_2D: + return "GL_TEXTURE_2D"; + case GL_BLEND: + return "GL_BLEND"; + case GL_DEPTH_TEST: + return "GL_DEPTH_TEST"; + case GL_CULL_FACE: + return "GL_CULL_FACE"; + case GL_CLIP_PLANE0: + return "GL_CLIP_PLANE0"; + case GL_COLOR_ARRAY: + return "GL_COLOR_ARRAY"; + case GL_TEXTURE_COORD_ARRAY: + return "GL_TEXTURE_COORD_ARRAY"; + case GL_VERTEX_ARRAY: + return "GL_VERTEX_ARRAY"; + case GL_ALPHA_TEST: + return "GL_ALPHA_TEST"; + case GL_STENCIL_TEST: + return "GL_STENCIL_TEST"; + default: + sprintf( buffer, "0x%x", cap ); + } + + return buffer; +} + +static const char * TypeToString( GLenum t ) +{ + switch ( t ) + { + case GL_BYTE: + return "GL_BYTE"; + case GL_UNSIGNED_BYTE: + return "GL_UNSIGNED_BYTE"; + case GL_SHORT: + return "GL_SHORT"; + case GL_UNSIGNED_SHORT: + return "GL_UNSIGNED_SHORT"; + case GL_INT: + return "GL_INT"; + case GL_UNSIGNED_INT: + return "GL_UNSIGNED_INT"; + case GL_FLOAT: + return "GL_FLOAT"; + case GL_DOUBLE: + return "GL_DOUBLE"; + default: + return "!!! UNKNOWN !!!"; + } +} + +static void APIENTRY logAccum(GLenum op, GLfloat value) +{ + fprintf( glw_state.log_fp, "glAccum\n" ); + dllAccum( op, value ); +} + +static void APIENTRY logAlphaFunc(GLenum func, GLclampf ref) +{ + fprintf( glw_state.log_fp, "glAlphaFunc( 0x%x, %f )\n", func, ref ); + dllAlphaFunc( func, ref ); +} + +static GLboolean APIENTRY logAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) +{ + fprintf( glw_state.log_fp, "glAreTexturesResident\n" ); + return dllAreTexturesResident( n, textures, residences ); +} + +static void APIENTRY logArrayElement(GLint i) +{ + fprintf( glw_state.log_fp, "glArrayElement\n" ); + dllArrayElement( i ); +} + +static void APIENTRY logBegin(GLenum mode) +{ + fprintf( glw_state.log_fp, "glBegin( %s )\n", PrimToString( mode )); + dllBegin( mode ); +} + +static void APIENTRY logBindTexture(GLenum target, GLuint texture) +{ + fprintf( glw_state.log_fp, "glBindTexture( 0x%x, %u )\n", target, texture ); + dllBindTexture( target, texture ); +} + +static void APIENTRY logBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) +{ + fprintf( glw_state.log_fp, "glBitmap\n" ); + dllBitmap( width, height, xorig, yorig, xmove, ymove, bitmap ); +} + +static void BlendToName( char *n, GLenum f ) +{ + switch ( f ) + { + case GL_ONE: + strcpy( n, "GL_ONE" ); + break; + case GL_ZERO: + strcpy( n, "GL_ZERO" ); + break; + case GL_SRC_ALPHA: + strcpy( n, "GL_SRC_ALPHA" ); + break; + case GL_ONE_MINUS_SRC_ALPHA: + strcpy( n, "GL_ONE_MINUS_SRC_ALPHA" ); + break; + case GL_DST_COLOR: + strcpy( n, "GL_DST_COLOR" ); + break; + case GL_ONE_MINUS_DST_COLOR: + strcpy( n, "GL_ONE_MINUS_DST_COLOR" ); + break; + case GL_DST_ALPHA: + strcpy( n, "GL_DST_ALPHA" ); + break; + default: + sprintf( n, "0x%x", f ); + } +} +static void APIENTRY logBlendFunc(GLenum sfactor, GLenum dfactor) +{ + char sf[128], df[128]; + + BlendToName( sf, sfactor ); + BlendToName( df, dfactor ); + + fprintf( glw_state.log_fp, "glBlendFunc( %s, %s )\n", sf, df ); + dllBlendFunc( sfactor, dfactor ); +} + +static void APIENTRY logCallList(GLuint list) +{ + fprintf( glw_state.log_fp, "glCallList( %u )\n", list ); + dllCallList( list ); +} + +static void APIENTRY logCallLists(GLsizei n, GLenum type, const void *lists) +{ + fprintf( glw_state.log_fp, "glCallLists\n" ); + dllCallLists( n, type, lists ); +} + +static void APIENTRY logClear(GLbitfield mask) +{ + fprintf( glw_state.log_fp, "glClear( 0x%x = ", mask ); + + if ( mask & GL_COLOR_BUFFER_BIT ) + fprintf( glw_state.log_fp, "GL_COLOR_BUFFER_BIT " ); + if ( mask & GL_DEPTH_BUFFER_BIT ) + fprintf( glw_state.log_fp, "GL_DEPTH_BUFFER_BIT " ); + if ( mask & GL_STENCIL_BUFFER_BIT ) + fprintf( glw_state.log_fp, "GL_STENCIL_BUFFER_BIT " ); + if ( mask & GL_ACCUM_BUFFER_BIT ) + fprintf( glw_state.log_fp, "GL_ACCUM_BUFFER_BIT " ); + + fprintf( glw_state.log_fp, ")\n" ); + dllClear( mask ); +} + +static void APIENTRY logClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) +{ + fprintf( glw_state.log_fp, "glClearAccum\n" ); + dllClearAccum( red, green, blue, alpha ); +} + +static void APIENTRY logClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) +{ + fprintf( glw_state.log_fp, "glClearColor\n" ); + dllClearColor( red, green, blue, alpha ); +} + +static void APIENTRY logClearDepth(GLclampd depth) +{ + fprintf( glw_state.log_fp, "glClearDepth( %f )\n", ( float ) depth ); + dllClearDepth( depth ); +} + +static void APIENTRY logClearIndex(GLfloat c) +{ + fprintf( glw_state.log_fp, "glClearIndex\n" ); + dllClearIndex( c ); +} + +static void APIENTRY logClearStencil(GLint s) +{ + fprintf( glw_state.log_fp, "glClearStencil( %d )\n", s ); + dllClearStencil( s ); +} + +static void APIENTRY logClipPlane(GLenum plane, const GLdouble *equation) +{ + fprintf( glw_state.log_fp, "glClipPlane\n" ); + dllClipPlane( plane, equation ); +} + +static void APIENTRY logColor3b(GLbyte red, GLbyte green, GLbyte blue) +{ + fprintf( glw_state.log_fp, "glColor3b\n" ); + dllColor3b( red, green, blue ); +} + +static void APIENTRY logColor3bv(const GLbyte *v) +{ + fprintf( glw_state.log_fp, "glColor3bv\n" ); + dllColor3bv( v ); +} + +static void APIENTRY logColor3d(GLdouble red, GLdouble green, GLdouble blue) +{ + fprintf( glw_state.log_fp, "glColor3d\n" ); + dllColor3d( red, green, blue ); +} + +static void APIENTRY logColor3dv(const GLdouble *v) +{ + fprintf( glw_state.log_fp, "glColor3dv\n" ); + dllColor3dv( v ); +} + +static void APIENTRY logColor3f(GLfloat red, GLfloat green, GLfloat blue) +{ + fprintf( glw_state.log_fp, "glColor3f\n" ); + dllColor3f( red, green, blue ); +} + +static void APIENTRY logColor3fv(const GLfloat *v) +{ + fprintf( glw_state.log_fp, "glColor3fv\n" ); + dllColor3fv( v ); +} + +static void APIENTRY logColor3i(GLint red, GLint green, GLint blue) +{ + fprintf( glw_state.log_fp, "glColor3i\n" ); + dllColor3i( red, green, blue ); +} + +static void APIENTRY logColor3iv(const GLint *v) +{ + fprintf( glw_state.log_fp, "glColor3iv\n" ); + dllColor3iv( v ); +} + +static void APIENTRY logColor3s(GLshort red, GLshort green, GLshort blue) +{ + fprintf( glw_state.log_fp, "glColor3s\n" ); + dllColor3s( red, green, blue ); +} + +static void APIENTRY logColor3sv(const GLshort *v) +{ + fprintf( glw_state.log_fp, "glColor3sv\n" ); + dllColor3sv( v ); +} + +static void APIENTRY logColor3ub(GLubyte red, GLubyte green, GLubyte blue) +{ + fprintf( glw_state.log_fp, "glColor3ub\n" ); + dllColor3ub( red, green, blue ); +} + +static void APIENTRY logColor3ubv(const GLubyte *v) +{ + fprintf( glw_state.log_fp, "glColor3ubv\n" ); + dllColor3ubv( v ); +} + +#define SIG( x ) fprintf( glw_state.log_fp, x "\n" ) + +static void APIENTRY logColor3ui(GLuint red, GLuint green, GLuint blue) +{ + SIG( "glColor3ui" ); + dllColor3ui( red, green, blue ); +} + +static void APIENTRY logColor3uiv(const GLuint *v) +{ + SIG( "glColor3uiv" ); + dllColor3uiv( v ); +} + +static void APIENTRY logColor3us(GLushort red, GLushort green, GLushort blue) +{ + SIG( "glColor3us" ); + dllColor3us( red, green, blue ); +} + +static void APIENTRY logColor3usv(const GLushort *v) +{ + SIG( "glColor3usv" ); + dllColor3usv( v ); +} + +static void APIENTRY logColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) +{ + SIG( "glColor4b" ); + dllColor4b( red, green, blue, alpha ); +} + +static void APIENTRY logColor4bv(const GLbyte *v) +{ + SIG( "glColor4bv" ); + dllColor4bv( v ); +} + +static void APIENTRY logColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) +{ + SIG( "glColor4d" ); + dllColor4d( red, green, blue, alpha ); +} +static void APIENTRY logColor4dv(const GLdouble *v) +{ + SIG( "glColor4dv" ); + dllColor4dv( v ); +} +static void APIENTRY logColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) +{ + fprintf( glw_state.log_fp, "glColor4f( %f,%f,%f,%f )\n", red, green, blue, alpha ); + dllColor4f( red, green, blue, alpha ); +} +static void APIENTRY logColor4fv(const GLfloat *v) +{ + fprintf( glw_state.log_fp, "glColor4fv( %f,%f,%f,%f )\n", v[0], v[1], v[2], v[3] ); + dllColor4fv( v ); +} +static void APIENTRY logColor4i(GLint red, GLint green, GLint blue, GLint alpha) +{ + SIG( "glColor4i" ); + dllColor4i( red, green, blue, alpha ); +} +static void APIENTRY logColor4iv(const GLint *v) +{ + SIG( "glColor4iv" ); + dllColor4iv( v ); +} +static void APIENTRY logColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) +{ + SIG( "glColor4s" ); + dllColor4s( red, green, blue, alpha ); +} +static void APIENTRY logColor4sv(const GLshort *v) +{ + SIG( "glColor4sv" ); + dllColor4sv( v ); +} +static void APIENTRY logColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) +{ + SIG( "glColor4b" ); + dllColor4b( red, green, blue, alpha ); +} +static void APIENTRY logColor4ubv(const GLubyte *v) +{ + SIG( "glColor4ubv" ); + dllColor4ubv( v ); +} +static void APIENTRY logColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) +{ + SIG( "glColor4ui" ); + dllColor4ui( red, green, blue, alpha ); +} +static void APIENTRY logColor4uiv(const GLuint *v) +{ + SIG( "glColor4uiv" ); + dllColor4uiv( v ); +} +static void APIENTRY logColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) +{ + SIG( "glColor4us" ); + dllColor4us( red, green, blue, alpha ); +} +static void APIENTRY logColor4usv(const GLushort *v) +{ + SIG( "glColor4usv" ); + dllColor4usv( v ); +} +static void APIENTRY logColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) +{ + SIG( "glColorMask" ); + dllColorMask( red, green, blue, alpha ); +} +static void APIENTRY logColorMaterial(GLenum face, GLenum mode) +{ + SIG( "glColorMaterial" ); + dllColorMaterial( face, mode ); +} + +static void APIENTRY logColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) +{ + fprintf( glw_state.log_fp, "glColorPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); + dllColorPointer( size, type, stride, pointer ); +} + +static void APIENTRY logCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) +{ + SIG( "glCopyPixels" ); + dllCopyPixels( x, y, width, height, type ); +} + +static void APIENTRY logCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) +{ + SIG( "glCopyTexImage1D" ); + dllCopyTexImage1D( target, level, internalFormat, x, y, width, border ); +} + +static void APIENTRY logCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) +{ + SIG( "glCopyTexImage2D" ); + dllCopyTexImage2D( target, level, internalFormat, x, y, width, height, border ); +} + +static void APIENTRY logCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) +{ + SIG( "glCopyTexSubImage1D" ); + dllCopyTexSubImage1D( target, level, xoffset, x, y, width ); +} + +static void APIENTRY logCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + SIG( "glCopyTexSubImage2D" ); + dllCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height ); +} + +static void APIENTRY logCullFace(GLenum mode) +{ + fprintf( glw_state.log_fp, "glCullFace( %s )\n", ( mode == GL_FRONT ) ? "GL_FRONT" : "GL_BACK" ); + dllCullFace( mode ); +} + +static void APIENTRY logDeleteLists(GLuint list, GLsizei range) +{ + SIG( "glDeleteLists" ); + dllDeleteLists( list, range ); +} + +static void APIENTRY logDeleteTextures(GLsizei n, const GLuint *textures) +{ + SIG( "glDeleteTextures" ); + dllDeleteTextures( n, textures ); +} + +static void APIENTRY logDepthFunc(GLenum func) +{ + fprintf( glw_state.log_fp, "glDepthFunc( %s )\n", FuncToString( func ) ); + dllDepthFunc( func ); +} + +static void APIENTRY logDepthMask(GLboolean flag) +{ + fprintf( glw_state.log_fp, "glDepthMask( %s )\n", BooleanToString( flag ) ); + dllDepthMask( flag ); +} + +static void APIENTRY logDepthRange(GLclampd zNear, GLclampd zFar) +{ + fprintf( glw_state.log_fp, "glDepthRange( %f, %f )\n", ( float ) zNear, ( float ) zFar ); + dllDepthRange( zNear, zFar ); +} + +static void APIENTRY logDisable(GLenum cap) +{ + fprintf( glw_state.log_fp, "glDisable( %s )\n", CapToString( cap ) ); + dllDisable( cap ); +} + +static void APIENTRY logDisableClientState(GLenum array) +{ + fprintf( glw_state.log_fp, "glDisableClientState( %s )\n", CapToString( array ) ); + dllDisableClientState( array ); +} + +static void APIENTRY logDrawArrays(GLenum mode, GLint first, GLsizei count) +{ + SIG( "glDrawArrays" ); + dllDrawArrays( mode, first, count ); +} + +static void APIENTRY logDrawBuffer(GLenum mode) +{ + SIG( "glDrawBuffer" ); + dllDrawBuffer( mode ); +} + +static void APIENTRY logDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) +{ + fprintf( glw_state.log_fp, "glDrawElements( %s, %d, %s, MEM )\n", PrimToString( mode ), count, TypeToString( type ) ); + dllDrawElements( mode, count, type, indices ); +} + +static void APIENTRY logDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) +{ + SIG( "glDrawPixels" ); + dllDrawPixels( width, height, format, type, pixels ); +} + +static void APIENTRY logEdgeFlag(GLboolean flag) +{ + SIG( "glEdgeFlag" ); + dllEdgeFlag( flag ); +} + +static void APIENTRY logEdgeFlagPointer(GLsizei stride, const void *pointer) +{ + SIG( "glEdgeFlagPointer" ); + dllEdgeFlagPointer( stride, pointer ); +} + +static void APIENTRY logEdgeFlagv(const GLboolean *flag) +{ + SIG( "glEdgeFlagv" ); + dllEdgeFlagv( flag ); +} + +static void APIENTRY logEnable(GLenum cap) +{ + fprintf( glw_state.log_fp, "glEnable( %s )\n", CapToString( cap ) ); + dllEnable( cap ); +} + +static void APIENTRY logEnableClientState(GLenum array) +{ + fprintf( glw_state.log_fp, "glEnableClientState( %s )\n", CapToString( array ) ); + dllEnableClientState( array ); +} + +static void APIENTRY logEnd(void) +{ + SIG( "glEnd" ); + dllEnd(); +} + +static void APIENTRY logEndList(void) +{ + SIG( "glEndList" ); + dllEndList(); +} + +static void APIENTRY logEvalCoord1d(GLdouble u) +{ + SIG( "glEvalCoord1d" ); + dllEvalCoord1d( u ); +} + +static void APIENTRY logEvalCoord1dv(const GLdouble *u) +{ + SIG( "glEvalCoord1dv" ); + dllEvalCoord1dv( u ); +} + +static void APIENTRY logEvalCoord1f(GLfloat u) +{ + SIG( "glEvalCoord1f" ); + dllEvalCoord1f( u ); +} + +static void APIENTRY logEvalCoord1fv(const GLfloat *u) +{ + SIG( "glEvalCoord1fv" ); + dllEvalCoord1fv( u ); +} +static void APIENTRY logEvalCoord2d(GLdouble u, GLdouble v) +{ + SIG( "glEvalCoord2d" ); + dllEvalCoord2d( u, v ); +} +static void APIENTRY logEvalCoord2dv(const GLdouble *u) +{ + SIG( "glEvalCoord2dv" ); + dllEvalCoord2dv( u ); +} +static void APIENTRY logEvalCoord2f(GLfloat u, GLfloat v) +{ + SIG( "glEvalCoord2f" ); + dllEvalCoord2f( u, v ); +} +static void APIENTRY logEvalCoord2fv(const GLfloat *u) +{ + SIG( "glEvalCoord2fv" ); + dllEvalCoord2fv( u ); +} + +static void APIENTRY logEvalMesh1(GLenum mode, GLint i1, GLint i2) +{ + SIG( "glEvalMesh1" ); + dllEvalMesh1( mode, i1, i2 ); +} +static void APIENTRY logEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) +{ + SIG( "glEvalMesh2" ); + dllEvalMesh2( mode, i1, i2, j1, j2 ); +} +static void APIENTRY logEvalPoint1(GLint i) +{ + SIG( "glEvalPoint1" ); + dllEvalPoint1( i ); +} +static void APIENTRY logEvalPoint2(GLint i, GLint j) +{ + SIG( "glEvalPoint2" ); + dllEvalPoint2( i, j ); +} + +static void APIENTRY logFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer) +{ + SIG( "glFeedbackBuffer" ); + dllFeedbackBuffer( size, type, buffer ); +} + +static void APIENTRY logFinish(void) +{ + SIG( "glFinish" ); + dllFinish(); +} + +static void APIENTRY logFlush(void) +{ + SIG( "glFlush" ); + dllFlush(); +} + +static void APIENTRY logFogf(GLenum pname, GLfloat param) +{ + SIG( "glFogf" ); + dllFogf( pname, param ); +} + +static void APIENTRY logFogfv(GLenum pname, const GLfloat *params) +{ + SIG( "glFogfv" ); + dllFogfv( pname, params ); +} + +static void APIENTRY logFogi(GLenum pname, GLint param) +{ + SIG( "glFogi" ); + dllFogi( pname, param ); +} + +static void APIENTRY logFogiv(GLenum pname, const GLint *params) +{ + SIG( "glFogiv" ); + dllFogiv( pname, params ); +} + +static void APIENTRY logFrontFace(GLenum mode) +{ + SIG( "glFrontFace" ); + dllFrontFace( mode ); +} + +static void APIENTRY logFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) +{ + SIG( "glFrustum" ); + dllFrustum( left, right, bottom, top, zNear, zFar ); +} + +static GLuint APIENTRY logGenLists(GLsizei range) +{ + SIG( "glGenLists" ); + return dllGenLists( range ); +} + +static void APIENTRY logGenTextures(GLsizei n, GLuint *textures) +{ + SIG( "glGenTextures" ); + dllGenTextures( n, textures ); +} + +static void APIENTRY logGetBooleanv(GLenum pname, GLboolean *params) +{ + SIG( "glGetBooleanv" ); + dllGetBooleanv( pname, params ); +} + +static void APIENTRY logGetClipPlane(GLenum plane, GLdouble *equation) +{ + SIG( "glGetClipPlane" ); + dllGetClipPlane( plane, equation ); +} + +static void APIENTRY logGetDoublev(GLenum pname, GLdouble *params) +{ + SIG( "glGetDoublev" ); + dllGetDoublev( pname, params ); +} + +static GLenum APIENTRY logGetError(void) +{ + SIG( "glGetError" ); + return dllGetError(); +} + +static void APIENTRY logGetFloatv(GLenum pname, GLfloat *params) +{ + SIG( "glGetFloatv" ); + dllGetFloatv( pname, params ); +} + +static void APIENTRY logGetIntegerv(GLenum pname, GLint *params) +{ + SIG( "glGetIntegerv" ); + dllGetIntegerv( pname, params ); +} + +static void APIENTRY logGetLightfv(GLenum light, GLenum pname, GLfloat *params) +{ + SIG( "glGetLightfv" ); + dllGetLightfv( light, pname, params ); +} + +static void APIENTRY logGetLightiv(GLenum light, GLenum pname, GLint *params) +{ + SIG( "glGetLightiv" ); + dllGetLightiv( light, pname, params ); +} + +static void APIENTRY logGetMapdv(GLenum target, GLenum query, GLdouble *v) +{ + SIG( "glGetMapdv" ); + dllGetMapdv( target, query, v ); +} + +static void APIENTRY logGetMapfv(GLenum target, GLenum query, GLfloat *v) +{ + SIG( "glGetMapfv" ); + dllGetMapfv( target, query, v ); +} + +static void APIENTRY logGetMapiv(GLenum target, GLenum query, GLint *v) +{ + SIG( "glGetMapiv" ); + dllGetMapiv( target, query, v ); +} + +static void APIENTRY logGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) +{ + SIG( "glGetMaterialfv" ); + dllGetMaterialfv( face, pname, params ); +} + +static void APIENTRY logGetMaterialiv(GLenum face, GLenum pname, GLint *params) +{ + SIG( "glGetMaterialiv" ); + dllGetMaterialiv( face, pname, params ); +} + +static void APIENTRY logGetPixelMapfv(GLenum map, GLfloat *values) +{ + SIG( "glGetPixelMapfv" ); + dllGetPixelMapfv( map, values ); +} + +static void APIENTRY logGetPixelMapuiv(GLenum map, GLuint *values) +{ + SIG( "glGetPixelMapuiv" ); + dllGetPixelMapuiv( map, values ); +} + +static void APIENTRY logGetPixelMapusv(GLenum map, GLushort *values) +{ + SIG( "glGetPixelMapusv" ); + dllGetPixelMapusv( map, values ); +} + +static void APIENTRY logGetPointerv(GLenum pname, GLvoid* *params) +{ + SIG( "glGetPointerv" ); + dllGetPointerv( pname, params ); +} + +static void APIENTRY logGetPolygonStipple(GLubyte *mask) +{ + SIG( "glGetPolygonStipple" ); + dllGetPolygonStipple( mask ); +} + +static const GLubyte * APIENTRY logGetString(GLenum name) +{ + SIG( "glGetString" ); + return dllGetString( name ); +} + +static void APIENTRY logGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) +{ + SIG( "glGetTexEnvfv" ); + dllGetTexEnvfv( target, pname, params ); +} + +static void APIENTRY logGetTexEnviv(GLenum target, GLenum pname, GLint *params) +{ + SIG( "glGetTexEnviv" ); + dllGetTexEnviv( target, pname, params ); +} + +static void APIENTRY logGetTexGendv(GLenum coord, GLenum pname, GLdouble *params) +{ + SIG( "glGetTexGendv" ); + dllGetTexGendv( coord, pname, params ); +} + +static void APIENTRY logGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) +{ + SIG( "glGetTexGenfv" ); + dllGetTexGenfv( coord, pname, params ); +} + +static void APIENTRY logGetTexGeniv(GLenum coord, GLenum pname, GLint *params) +{ + SIG( "glGetTexGeniv" ); + dllGetTexGeniv( coord, pname, params ); +} + +static void APIENTRY logGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels) +{ + SIG( "glGetTexImage" ); + dllGetTexImage( target, level, format, type, pixels ); +} +static void APIENTRY logGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params ) +{ + SIG( "glGetTexLevelParameterfv" ); + dllGetTexLevelParameterfv( target, level, pname, params ); +} + +static void APIENTRY logGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) +{ + SIG( "glGetTexLevelParameteriv" ); + dllGetTexLevelParameteriv( target, level, pname, params ); +} + +static void APIENTRY logGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) +{ + SIG( "glGetTexParameterfv" ); + dllGetTexParameterfv( target, pname, params ); +} + +static void APIENTRY logGetTexParameteriv(GLenum target, GLenum pname, GLint *params) +{ + SIG( "glGetTexParameteriv" ); + dllGetTexParameteriv( target, pname, params ); +} + +static void APIENTRY logHint(GLenum target, GLenum mode) +{ + fprintf( glw_state.log_fp, "glHint( 0x%x, 0x%x )\n", target, mode ); + dllHint( target, mode ); +} + +static void APIENTRY logIndexMask(GLuint mask) +{ + SIG( "glIndexMask" ); + dllIndexMask( mask ); +} + +static void APIENTRY logIndexPointer(GLenum type, GLsizei stride, const void *pointer) +{ + SIG( "glIndexPointer" ); + dllIndexPointer( type, stride, pointer ); +} + +static void APIENTRY logIndexd(GLdouble c) +{ + SIG( "glIndexd" ); + dllIndexd( c ); +} + +static void APIENTRY logIndexdv(const GLdouble *c) +{ + SIG( "glIndexdv" ); + dllIndexdv( c ); +} + +static void APIENTRY logIndexf(GLfloat c) +{ + SIG( "glIndexf" ); + dllIndexf( c ); +} + +static void APIENTRY logIndexfv(const GLfloat *c) +{ + SIG( "glIndexfv" ); + dllIndexfv( c ); +} + +static void APIENTRY logIndexi(GLint c) +{ + SIG( "glIndexi" ); + dllIndexi( c ); +} + +static void APIENTRY logIndexiv(const GLint *c) +{ + SIG( "glIndexiv" ); + dllIndexiv( c ); +} + +static void APIENTRY logIndexs(GLshort c) +{ + SIG( "glIndexs" ); + dllIndexs( c ); +} + +static void APIENTRY logIndexsv(const GLshort *c) +{ + SIG( "glIndexsv" ); + dllIndexsv( c ); +} + +static void APIENTRY logIndexub(GLubyte c) +{ + SIG( "glIndexub" ); + dllIndexub( c ); +} + +static void APIENTRY logIndexubv(const GLubyte *c) +{ + SIG( "glIndexubv" ); + dllIndexubv( c ); +} + +static void APIENTRY logInitNames(void) +{ + SIG( "glInitNames" ); + dllInitNames(); +} + +static void APIENTRY logInterleavedArrays(GLenum format, GLsizei stride, const void *pointer) +{ + SIG( "glInterleavedArrays" ); + dllInterleavedArrays( format, stride, pointer ); +} + +static GLboolean APIENTRY logIsEnabled(GLenum cap) +{ + SIG( "glIsEnabled" ); + return dllIsEnabled( cap ); +} +static GLboolean APIENTRY logIsList(GLuint list) +{ + SIG( "glIsList" ); + return dllIsList( list ); +} +static GLboolean APIENTRY logIsTexture(GLuint texture) +{ + SIG( "glIsTexture" ); + return dllIsTexture( texture ); +} + +static void APIENTRY logLightModelf(GLenum pname, GLfloat param) +{ + SIG( "glLightModelf" ); + dllLightModelf( pname, param ); +} + +static void APIENTRY logLightModelfv(GLenum pname, const GLfloat *params) +{ + SIG( "glLightModelfv" ); + dllLightModelfv( pname, params ); +} + +static void APIENTRY logLightModeli(GLenum pname, GLint param) +{ + SIG( "glLightModeli" ); + dllLightModeli( pname, param ); + +} + +static void APIENTRY logLightModeliv(GLenum pname, const GLint *params) +{ + SIG( "glLightModeliv" ); + dllLightModeliv( pname, params ); +} + +static void APIENTRY logLightf(GLenum light, GLenum pname, GLfloat param) +{ + SIG( "glLightf" ); + dllLightf( light, pname, param ); +} + +static void APIENTRY logLightfv(GLenum light, GLenum pname, const GLfloat *params) +{ + SIG( "glLightfv" ); + dllLightfv( light, pname, params ); +} + +static void APIENTRY logLighti(GLenum light, GLenum pname, GLint param) +{ + SIG( "glLighti" ); + dllLighti( light, pname, param ); +} + +static void APIENTRY logLightiv(GLenum light, GLenum pname, const GLint *params) +{ + SIG( "glLightiv" ); + dllLightiv( light, pname, params ); +} + +static void APIENTRY logLineStipple(GLint factor, GLushort pattern) +{ + SIG( "glLineStipple" ); + dllLineStipple( factor, pattern ); +} + +static void APIENTRY logLineWidth(GLfloat width) +{ + SIG( "glLineWidth" ); + dllLineWidth( width ); +} + +static void APIENTRY logListBase(GLuint base) +{ + SIG( "glListBase" ); + dllListBase( base ); +} + +static void APIENTRY logLoadIdentity(void) +{ + SIG( "glLoadIdentity" ); + dllLoadIdentity(); +} + +static void APIENTRY logLoadMatrixd(const GLdouble *m) +{ + SIG( "glLoadMatrixd" ); + dllLoadMatrixd( m ); +} + +static void APIENTRY logLoadMatrixf(const GLfloat *m) +{ + SIG( "glLoadMatrixf" ); + dllLoadMatrixf( m ); +} + +static void APIENTRY logLoadName(GLuint name) +{ + SIG( "glLoadName" ); + dllLoadName( name ); +} + +static void APIENTRY logLogicOp(GLenum opcode) +{ + SIG( "glLogicOp" ); + dllLogicOp( opcode ); +} + +static void APIENTRY logMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) +{ + SIG( "glMap1d" ); + dllMap1d( target, u1, u2, stride, order, points ); +} + +static void APIENTRY logMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) +{ + SIG( "glMap1f" ); + dllMap1f( target, u1, u2, stride, order, points ); +} + +static void APIENTRY logMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) +{ + SIG( "glMap2d" ); + dllMap2d( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); +} + +static void APIENTRY logMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) +{ + SIG( "glMap2f" ); + dllMap2f( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points ); +} + +static void APIENTRY logMapGrid1d(GLint un, GLdouble u1, GLdouble u2) +{ + SIG( "glMapGrid1d" ); + dllMapGrid1d( un, u1, u2 ); +} + +static void APIENTRY logMapGrid1f(GLint un, GLfloat u1, GLfloat u2) +{ + SIG( "glMapGrid1f" ); + dllMapGrid1f( un, u1, u2 ); +} + +static void APIENTRY logMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) +{ + SIG( "glMapGrid2d" ); + dllMapGrid2d( un, u1, u2, vn, v1, v2 ); +} +static void APIENTRY logMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) +{ + SIG( "glMapGrid2f" ); + dllMapGrid2f( un, u1, u2, vn, v1, v2 ); +} +static void APIENTRY logMaterialf(GLenum face, GLenum pname, GLfloat param) +{ + SIG( "glMaterialf" ); + dllMaterialf( face, pname, param ); +} +static void APIENTRY logMaterialfv(GLenum face, GLenum pname, const GLfloat *params) +{ + SIG( "glMaterialfv" ); + dllMaterialfv( face, pname, params ); +} + +static void APIENTRY logMateriali(GLenum face, GLenum pname, GLint param) +{ + SIG( "glMateriali" ); + dllMateriali( face, pname, param ); +} + +static void APIENTRY logMaterialiv(GLenum face, GLenum pname, const GLint *params) +{ + SIG( "glMaterialiv" ); + dllMaterialiv( face, pname, params ); +} + +static void APIENTRY logMatrixMode(GLenum mode) +{ + SIG( "glMatrixMode" ); + dllMatrixMode( mode ); +} + +static void APIENTRY logMultMatrixd(const GLdouble *m) +{ + SIG( "glMultMatrixd" ); + dllMultMatrixd( m ); +} + +static void APIENTRY logMultMatrixf(const GLfloat *m) +{ + SIG( "glMultMatrixf" ); + dllMultMatrixf( m ); +} + +static void APIENTRY logNewList(GLuint list, GLenum mode) +{ + SIG( "glNewList" ); + dllNewList( list, mode ); +} + +static void APIENTRY logNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) +{ + SIG ("glNormal3b" ); + dllNormal3b( nx, ny, nz ); +} + +static void APIENTRY logNormal3bv(const GLbyte *v) +{ + SIG( "glNormal3bv" ); + dllNormal3bv( v ); +} + +static void APIENTRY logNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) +{ + SIG( "glNormal3d" ); + dllNormal3d( nx, ny, nz ); +} + +static void APIENTRY logNormal3dv(const GLdouble *v) +{ + SIG( "glNormal3dv" ); + dllNormal3dv( v ); +} + +static void APIENTRY logNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) +{ + SIG( "glNormal3f" ); + dllNormal3f( nx, ny, nz ); +} + +static void APIENTRY logNormal3fv(const GLfloat *v) +{ + SIG( "glNormal3fv" ); + dllNormal3fv( v ); +} +static void APIENTRY logNormal3i(GLint nx, GLint ny, GLint nz) +{ + SIG( "glNormal3i" ); + dllNormal3i( nx, ny, nz ); +} +static void APIENTRY logNormal3iv(const GLint *v) +{ + SIG( "glNormal3iv" ); + dllNormal3iv( v ); +} +static void APIENTRY logNormal3s(GLshort nx, GLshort ny, GLshort nz) +{ + SIG( "glNormal3s" ); + dllNormal3s( nx, ny, nz ); +} +static void APIENTRY logNormal3sv(const GLshort *v) +{ + SIG( "glNormal3sv" ); + dllNormal3sv( v ); +} +static void APIENTRY logNormalPointer(GLenum type, GLsizei stride, const void *pointer) +{ + SIG( "glNormalPointer" ); + dllNormalPointer( type, stride, pointer ); +} +static void APIENTRY logOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) +{ + SIG( "glOrtho" ); + dllOrtho( left, right, bottom, top, zNear, zFar ); +} + +static void APIENTRY logPassThrough(GLfloat token) +{ + SIG( "glPassThrough" ); + dllPassThrough( token ); +} + +static void APIENTRY logPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values) +{ + SIG( "glPixelMapfv" ); + dllPixelMapfv( map, mapsize, values ); +} + +static void APIENTRY logPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values) +{ + SIG( "glPixelMapuiv" ); + dllPixelMapuiv( map, mapsize, values ); +} + +static void APIENTRY logPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values) +{ + SIG( "glPixelMapusv" ); + dllPixelMapusv( map, mapsize, values ); +} +static void APIENTRY logPixelStoref(GLenum pname, GLfloat param) +{ + SIG( "glPixelStoref" ); + dllPixelStoref( pname, param ); +} +static void APIENTRY logPixelStorei(GLenum pname, GLint param) +{ + SIG( "glPixelStorei" ); + dllPixelStorei( pname, param ); +} +static void APIENTRY logPixelTransferf(GLenum pname, GLfloat param) +{ + SIG( "glPixelTransferf" ); + dllPixelTransferf( pname, param ); +} + +static void APIENTRY logPixelTransferi(GLenum pname, GLint param) +{ + SIG( "glPixelTransferi" ); + dllPixelTransferi( pname, param ); +} + +static void APIENTRY logPixelZoom(GLfloat xfactor, GLfloat yfactor) +{ + SIG( "glPixelZoom" ); + dllPixelZoom( xfactor, yfactor ); +} + +static void APIENTRY logPointSize(GLfloat size) +{ + SIG( "glPointSize" ); + dllPointSize( size ); +} + +static void APIENTRY logPolygonMode(GLenum face, GLenum mode) +{ + fprintf( glw_state.log_fp, "glPolygonMode( 0x%x, 0x%x )\n", face, mode ); + dllPolygonMode( face, mode ); +} + +static void APIENTRY logPolygonOffset(GLfloat factor, GLfloat units) +{ + SIG( "glPolygonOffset" ); + dllPolygonOffset( factor, units ); +} +static void APIENTRY logPolygonStipple(const GLubyte *mask ) +{ + SIG( "glPolygonStipple" ); + dllPolygonStipple( mask ); +} +static void APIENTRY logPopAttrib(void) +{ + SIG( "glPopAttrib" ); + dllPopAttrib(); +} + +static void APIENTRY logPopClientAttrib(void) +{ + SIG( "glPopClientAttrib" ); + dllPopClientAttrib(); +} + +static void APIENTRY logPopMatrix(void) +{ + SIG( "glPopMatrix" ); + dllPopMatrix(); +} + +static void APIENTRY logPopName(void) +{ + SIG( "glPopName" ); + dllPopName(); +} + +static void APIENTRY logPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) +{ + SIG( "glPrioritizeTextures" ); + dllPrioritizeTextures( n, textures, priorities ); +} + +static void APIENTRY logPushAttrib(GLbitfield mask) +{ + SIG( "glPushAttrib" ); + dllPushAttrib( mask ); +} + +static void APIENTRY logPushClientAttrib(GLbitfield mask) +{ + SIG( "glPushClientAttrib" ); + dllPushClientAttrib( mask ); +} + +static void APIENTRY logPushMatrix(void) +{ + SIG( "glPushMatrix" ); + dllPushMatrix(); +} + +static void APIENTRY logPushName(GLuint name) +{ + SIG( "glPushName" ); + dllPushName( name ); +} + +static void APIENTRY logRasterPos2d(GLdouble x, GLdouble y) +{ + SIG ("glRasterPot2d" ); + dllRasterPos2d( x, y ); +} + +static void APIENTRY logRasterPos2dv(const GLdouble *v) +{ + SIG( "glRasterPos2dv" ); + dllRasterPos2dv( v ); +} + +static void APIENTRY logRasterPos2f(GLfloat x, GLfloat y) +{ + SIG( "glRasterPos2f" ); + dllRasterPos2f( x, y ); +} +static void APIENTRY logRasterPos2fv(const GLfloat *v) +{ + SIG( "glRasterPos2dv" ); + dllRasterPos2fv( v ); +} +static void APIENTRY logRasterPos2i(GLint x, GLint y) +{ + SIG( "glRasterPos2if" ); + dllRasterPos2i( x, y ); +} +static void APIENTRY logRasterPos2iv(const GLint *v) +{ + SIG( "glRasterPos2iv" ); + dllRasterPos2iv( v ); +} +static void APIENTRY logRasterPos2s(GLshort x, GLshort y) +{ + SIG( "glRasterPos2s" ); + dllRasterPos2s( x, y ); +} +static void APIENTRY logRasterPos2sv(const GLshort *v) +{ + SIG( "glRasterPos2sv" ); + dllRasterPos2sv( v ); +} +static void APIENTRY logRasterPos3d(GLdouble x, GLdouble y, GLdouble z) +{ + SIG( "glRasterPos3d" ); + dllRasterPos3d( x, y, z ); +} +static void APIENTRY logRasterPos3dv(const GLdouble *v) +{ + SIG( "glRasterPos3dv" ); + dllRasterPos3dv( v ); +} +static void APIENTRY logRasterPos3f(GLfloat x, GLfloat y, GLfloat z) +{ + SIG( "glRasterPos3f" ); + dllRasterPos3f( x, y, z ); +} +static void APIENTRY logRasterPos3fv(const GLfloat *v) +{ + SIG( "glRasterPos3fv" ); + dllRasterPos3fv( v ); +} +static void APIENTRY logRasterPos3i(GLint x, GLint y, GLint z) +{ + SIG( "glRasterPos3i" ); + dllRasterPos3i( x, y, z ); +} +static void APIENTRY logRasterPos3iv(const GLint *v) +{ + SIG( "glRasterPos3iv" ); + dllRasterPos3iv( v ); +} +static void APIENTRY logRasterPos3s(GLshort x, GLshort y, GLshort z) +{ + SIG( "glRasterPos3s" ); + dllRasterPos3s( x, y, z ); +} +static void APIENTRY logRasterPos3sv(const GLshort *v) +{ + SIG( "glRasterPos3sv" ); + dllRasterPos3sv( v ); +} +static void APIENTRY logRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +{ + SIG( "glRasterPos4d" ); + dllRasterPos4d( x, y, z, w ); +} +static void APIENTRY logRasterPos4dv(const GLdouble *v) +{ + SIG( "glRasterPos4dv" ); + dllRasterPos4dv( v ); +} +static void APIENTRY logRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + SIG( "glRasterPos4f" ); + dllRasterPos4f( x, y, z, w ); +} +static void APIENTRY logRasterPos4fv(const GLfloat *v) +{ + SIG( "glRasterPos4fv" ); + dllRasterPos4fv( v ); +} +static void APIENTRY logRasterPos4i(GLint x, GLint y, GLint z, GLint w) +{ + SIG( "glRasterPos4i" ); + dllRasterPos4i( x, y, z, w ); +} +static void APIENTRY logRasterPos4iv(const GLint *v) +{ + SIG( "glRasterPos4iv" ); + dllRasterPos4iv( v ); +} +static void APIENTRY logRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) +{ + SIG( "glRasterPos4s" ); + dllRasterPos4s( x, y, z, w ); +} +static void APIENTRY logRasterPos4sv(const GLshort *v) +{ + SIG( "glRasterPos4sv" ); + dllRasterPos4sv( v ); +} +static void APIENTRY logReadBuffer(GLenum mode) +{ + SIG( "glReadBuffer" ); + dllReadBuffer( mode ); +} +static void APIENTRY logReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) +{ + SIG( "glReadPixels" ); + dllReadPixels( x, y, width, height, format, type, pixels ); +} + +static void APIENTRY logRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) +{ + SIG( "glRectd" ); + dllRectd( x1, y1, x2, y2 ); +} + +static void APIENTRY logRectdv(const GLdouble *v1, const GLdouble *v2) +{ + SIG( "glRectdv" ); + dllRectdv( v1, v2 ); +} + +static void APIENTRY logRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) +{ + SIG( "glRectf" ); + dllRectf( x1, y1, x2, y2 ); +} + +static void APIENTRY logRectfv(const GLfloat *v1, const GLfloat *v2) +{ + SIG( "glRectfv" ); + dllRectfv( v1, v2 ); +} +static void APIENTRY logRecti(GLint x1, GLint y1, GLint x2, GLint y2) +{ + SIG( "glRecti" ); + dllRecti( x1, y1, x2, y2 ); +} +static void APIENTRY logRectiv(const GLint *v1, const GLint *v2) +{ + SIG( "glRectiv" ); + dllRectiv( v1, v2 ); +} +static void APIENTRY logRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) +{ + SIG( "glRects" ); + dllRects( x1, y1, x2, y2 ); +} +static void APIENTRY logRectsv(const GLshort *v1, const GLshort *v2) +{ + SIG( "glRectsv" ); + dllRectsv( v1, v2 ); +} +static GLint APIENTRY logRenderMode(GLenum mode) +{ + SIG( "glRenderMode" ); + return dllRenderMode( mode ); +} +static void APIENTRY logRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) +{ + SIG( "glRotated" ); + dllRotated( angle, x, y, z ); +} + +static void APIENTRY logRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + SIG( "glRotatef" ); + dllRotatef( angle, x, y, z ); +} + +static void APIENTRY logScaled(GLdouble x, GLdouble y, GLdouble z) +{ + SIG( "glScaled" ); + dllScaled( x, y, z ); +} + +static void APIENTRY logScalef(GLfloat x, GLfloat y, GLfloat z) +{ + SIG( "glScalef" ); + dllScalef( x, y, z ); +} + +static void APIENTRY logScissor(GLint x, GLint y, GLsizei width, GLsizei height) +{ + fprintf( glw_state.log_fp, "glScissor( %d, %d, %d, %d )\n", x, y, width, height ); + dllScissor( x, y, width, height ); +} + +static void APIENTRY logSelectBuffer(GLsizei size, GLuint *buffer) +{ + SIG( "glSelectBuffer" ); + dllSelectBuffer( size, buffer ); +} + +static void APIENTRY logShadeModel(GLenum mode) +{ + SIG( "glShadeModel" ); + dllShadeModel( mode ); +} + +static void APIENTRY logStencilFunc(GLenum func, GLint ref, GLuint mask) +{ + SIG( "glStencilFunc" ); + dllStencilFunc( func, ref, mask ); +} + +static void APIENTRY logStencilMask(GLuint mask) +{ + SIG( "glStencilMask" ); + dllStencilMask( mask ); +} + +static void APIENTRY logStencilOp(GLenum fail, GLenum zfail, GLenum zpass) +{ + SIG( "glStencilOp" ); + dllStencilOp( fail, zfail, zpass ); +} + +static void APIENTRY logTexCoord1d(GLdouble s) +{ + SIG( "glTexCoord1d" ); + dllTexCoord1d( s ); +} + +static void APIENTRY logTexCoord1dv(const GLdouble *v) +{ + SIG( "glTexCoord1dv" ); + dllTexCoord1dv( v ); +} + +static void APIENTRY logTexCoord1f(GLfloat s) +{ + SIG( "glTexCoord1f" ); + dllTexCoord1f( s ); +} +static void APIENTRY logTexCoord1fv(const GLfloat *v) +{ + SIG( "glTexCoord1fv" ); + dllTexCoord1fv( v ); +} +static void APIENTRY logTexCoord1i(GLint s) +{ + SIG( "glTexCoord1i" ); + dllTexCoord1i( s ); +} +static void APIENTRY logTexCoord1iv(const GLint *v) +{ + SIG( "glTexCoord1iv" ); + dllTexCoord1iv( v ); +} +static void APIENTRY logTexCoord1s(GLshort s) +{ + SIG( "glTexCoord1s" ); + dllTexCoord1s( s ); +} +static void APIENTRY logTexCoord1sv(const GLshort *v) +{ + SIG( "glTexCoord1sv" ); + dllTexCoord1sv( v ); +} +static void APIENTRY logTexCoord2d(GLdouble s, GLdouble t) +{ + SIG( "glTexCoord2d" ); + dllTexCoord2d( s, t ); +} + +static void APIENTRY logTexCoord2dv(const GLdouble *v) +{ + SIG( "glTexCoord2dv" ); + dllTexCoord2dv( v ); +} +static void APIENTRY logTexCoord2f(GLfloat s, GLfloat t) +{ + SIG( "glTexCoord2f" ); + dllTexCoord2f( s, t ); +} +static void APIENTRY logTexCoord2fv(const GLfloat *v) +{ + SIG( "glTexCoord2fv" ); + dllTexCoord2fv( v ); +} +static void APIENTRY logTexCoord2i(GLint s, GLint t) +{ + SIG( "glTexCoord2i" ); + dllTexCoord2i( s, t ); +} +static void APIENTRY logTexCoord2iv(const GLint *v) +{ + SIG( "glTexCoord2iv" ); + dllTexCoord2iv( v ); +} +static void APIENTRY logTexCoord2s(GLshort s, GLshort t) +{ + SIG( "glTexCoord2s" ); + dllTexCoord2s( s, t ); +} +static void APIENTRY logTexCoord2sv(const GLshort *v) +{ + SIG( "glTexCoord2sv" ); + dllTexCoord2sv( v ); +} +static void APIENTRY logTexCoord3d(GLdouble s, GLdouble t, GLdouble r) +{ + SIG( "glTexCoord3d" ); + dllTexCoord3d( s, t, r ); +} +static void APIENTRY logTexCoord3dv(const GLdouble *v) +{ + SIG( "glTexCoord3dv" ); + dllTexCoord3dv( v ); +} +static void APIENTRY logTexCoord3f(GLfloat s, GLfloat t, GLfloat r) +{ + SIG( "glTexCoord3f" ); + dllTexCoord3f( s, t, r ); +} +static void APIENTRY logTexCoord3fv(const GLfloat *v) +{ + SIG( "glTexCoord3fv" ); + dllTexCoord3fv( v ); +} +static void APIENTRY logTexCoord3i(GLint s, GLint t, GLint r) +{ + SIG( "glTexCoord3i" ); + dllTexCoord3i( s, t, r ); +} +static void APIENTRY logTexCoord3iv(const GLint *v) +{ + SIG( "glTexCoord3iv" ); + dllTexCoord3iv( v ); +} +static void APIENTRY logTexCoord3s(GLshort s, GLshort t, GLshort r) +{ + SIG( "glTexCoord3s" ); + dllTexCoord3s( s, t, r ); +} +static void APIENTRY logTexCoord3sv(const GLshort *v) +{ + SIG( "glTexCoord3sv" ); + dllTexCoord3sv( v ); +} +static void APIENTRY logTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) +{ + SIG( "glTexCoord4d" ); + dllTexCoord4d( s, t, r, q ); +} +static void APIENTRY logTexCoord4dv(const GLdouble *v) +{ + SIG( "glTexCoord4dv" ); + dllTexCoord4dv( v ); +} +static void APIENTRY logTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) +{ + SIG( "glTexCoord4f" ); + dllTexCoord4f( s, t, r, q ); +} +static void APIENTRY logTexCoord4fv(const GLfloat *v) +{ + SIG( "glTexCoord4fv" ); + dllTexCoord4fv( v ); +} +static void APIENTRY logTexCoord4i(GLint s, GLint t, GLint r, GLint q) +{ + SIG( "glTexCoord4i" ); + dllTexCoord4i( s, t, r, q ); +} +static void APIENTRY logTexCoord4iv(const GLint *v) +{ + SIG( "glTexCoord4iv" ); + dllTexCoord4iv( v ); +} +static void APIENTRY logTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) +{ + SIG( "glTexCoord4s" ); + dllTexCoord4s( s, t, r, q ); +} +static void APIENTRY logTexCoord4sv(const GLshort *v) +{ + SIG( "glTexCoord4sv" ); + dllTexCoord4sv( v ); +} +static void APIENTRY logTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) +{ + fprintf( glw_state.log_fp, "glTexCoordPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); + dllTexCoordPointer( size, type, stride, pointer ); +} + +static void APIENTRY logTexEnvf(GLenum target, GLenum pname, GLfloat param) +{ + fprintf( glw_state.log_fp, "glTexEnvf( 0x%x, 0x%x, %f )\n", target, pname, param ); + dllTexEnvf( target, pname, param ); +} + +static void APIENTRY logTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) +{ + SIG( "glTexEnvfv" ); + dllTexEnvfv( target, pname, params ); +} + +static void APIENTRY logTexEnvi(GLenum target, GLenum pname, GLint param) +{ + fprintf( glw_state.log_fp, "glTexEnvi( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); + dllTexEnvi( target, pname, param ); +} +static void APIENTRY logTexEnviv(GLenum target, GLenum pname, const GLint *params) +{ + SIG( "glTexEnviv" ); + dllTexEnviv( target, pname, params ); +} + +static void APIENTRY logTexGend(GLenum coord, GLenum pname, GLdouble param) +{ + SIG( "glTexGend" ); + dllTexGend( coord, pname, param ); +} + +static void APIENTRY logTexGendv(GLenum coord, GLenum pname, const GLdouble *params) +{ + SIG( "glTexGendv" ); + dllTexGendv( coord, pname, params ); +} + +static void APIENTRY logTexGenf(GLenum coord, GLenum pname, GLfloat param) +{ + SIG( "glTexGenf" ); + dllTexGenf( coord, pname, param ); +} +static void APIENTRY logTexGenfv(GLenum coord, GLenum pname, const GLfloat *params) +{ + SIG( "glTexGenfv" ); + dllTexGenfv( coord, pname, params ); +} +static void APIENTRY logTexGeni(GLenum coord, GLenum pname, GLint param) +{ + SIG( "glTexGeni" ); + dllTexGeni( coord, pname, param ); +} +static void APIENTRY logTexGeniv(GLenum coord, GLenum pname, const GLint *params) +{ + SIG( "glTexGeniv" ); + dllTexGeniv( coord, pname, params ); +} +static void APIENTRY logTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) +{ + SIG( "glTexImage1D" ); + dllTexImage1D( target, level, internalformat, width, border, format, type, pixels ); +} +static void APIENTRY logTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) +{ + SIG( "glTexImage2D" ); + dllTexImage2D( target, level, internalformat, width, height, border, format, type, pixels ); +} + +static void APIENTRY logTexParameterf(GLenum target, GLenum pname, GLfloat param) +{ + fprintf( glw_state.log_fp, "glTexParameterf( 0x%x, 0x%x, %f )\n", target, pname, param ); + dllTexParameterf( target, pname, param ); +} + +static void APIENTRY logTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) +{ + SIG( "glTexParameterfv" ); + dllTexParameterfv( target, pname, params ); +} +static void APIENTRY logTexParameteri(GLenum target, GLenum pname, GLint param) +{ + fprintf( glw_state.log_fp, "glTexParameteri( 0x%x, 0x%x, 0x%x )\n", target, pname, param ); + dllTexParameteri( target, pname, param ); +} +static void APIENTRY logTexParameteriv(GLenum target, GLenum pname, const GLint *params) +{ + SIG( "glTexParameteriv" ); + dllTexParameteriv( target, pname, params ); +} +static void APIENTRY logTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) +{ + SIG( "glTexSubImage1D" ); + dllTexSubImage1D( target, level, xoffset, width, format, type, pixels ); +} +static void APIENTRY logTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) +{ + SIG( "glTexSubImage2D" ); + dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels ); +} +static void APIENTRY logTranslated(GLdouble x, GLdouble y, GLdouble z) +{ + SIG( "glTranslated" ); + dllTranslated( x, y, z ); +} + +static void APIENTRY logTranslatef(GLfloat x, GLfloat y, GLfloat z) +{ + SIG( "glTranslatef" ); + dllTranslatef( x, y, z ); +} + +static void APIENTRY logVertex2d(GLdouble x, GLdouble y) +{ + SIG( "glVertex2d" ); + dllVertex2d( x, y ); +} + +static void APIENTRY logVertex2dv(const GLdouble *v) +{ + SIG( "glVertex2dv" ); + dllVertex2dv( v ); +} +static void APIENTRY logVertex2f(GLfloat x, GLfloat y) +{ + SIG( "glVertex2f" ); + dllVertex2f( x, y ); +} +static void APIENTRY logVertex2fv(const GLfloat *v) +{ + SIG( "glVertex2fv" ); + dllVertex2fv( v ); +} +static void APIENTRY logVertex2i(GLint x, GLint y) +{ + SIG( "glVertex2i" ); + dllVertex2i( x, y ); +} +static void APIENTRY logVertex2iv(const GLint *v) +{ + SIG( "glVertex2iv" ); + dllVertex2iv( v ); +} +static void APIENTRY logVertex2s(GLshort x, GLshort y) +{ + SIG( "glVertex2s" ); + dllVertex2s( x, y ); +} +static void APIENTRY logVertex2sv(const GLshort *v) +{ + SIG( "glVertex2sv" ); + dllVertex2sv( v ); +} +static void APIENTRY logVertex3d(GLdouble x, GLdouble y, GLdouble z) +{ + SIG( "glVertex3d" ); + dllVertex3d( x, y, z ); +} +static void APIENTRY logVertex3dv(const GLdouble *v) +{ + SIG( "glVertex3dv" ); + dllVertex3dv( v ); +} +static void APIENTRY logVertex3f(GLfloat x, GLfloat y, GLfloat z) +{ + SIG( "glVertex3f" ); + dllVertex3f( x, y, z ); +} +static void APIENTRY logVertex3fv(const GLfloat *v) +{ + SIG( "glVertex3fv" ); + dllVertex3fv( v ); +} +static void APIENTRY logVertex3i(GLint x, GLint y, GLint z) +{ + SIG( "glVertex3i" ); + dllVertex3i( x, y, z ); +} +static void APIENTRY logVertex3iv(const GLint *v) +{ + SIG( "glVertex3iv" ); + dllVertex3iv( v ); +} +static void APIENTRY logVertex3s(GLshort x, GLshort y, GLshort z) +{ + SIG( "glVertex3s" ); + dllVertex3s( x, y, z ); +} +static void APIENTRY logVertex3sv(const GLshort *v) +{ + SIG( "glVertex3sv" ); + dllVertex3sv( v ); +} +static void APIENTRY logVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +{ + SIG( "glVertex4d" ); + dllVertex4d( x, y, z, w ); +} +static void APIENTRY logVertex4dv(const GLdouble *v) +{ + SIG( "glVertex4dv" ); + dllVertex4dv( v ); +} +static void APIENTRY logVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + SIG( "glVertex4f" ); + dllVertex4f( x, y, z, w ); +} +static void APIENTRY logVertex4fv(const GLfloat *v) +{ + SIG( "glVertex4fv" ); + dllVertex4fv( v ); +} +static void APIENTRY logVertex4i(GLint x, GLint y, GLint z, GLint w) +{ + SIG( "glVertex4i" ); + dllVertex4i( x, y, z, w ); +} +static void APIENTRY logVertex4iv(const GLint *v) +{ + SIG( "glVertex4iv" ); + dllVertex4iv( v ); +} +static void APIENTRY logVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) +{ + SIG( "glVertex4s" ); + dllVertex4s( x, y, z, w ); +} +static void APIENTRY logVertex4sv(const GLshort *v) +{ + SIG( "glVertex4sv" ); + dllVertex4sv( v ); +} +static void APIENTRY logVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer) +{ + fprintf( glw_state.log_fp, "glVertexPointer( %d, %s, %d, MEM )\n", size, TypeToString( type ), stride ); + dllVertexPointer( size, type, stride, pointer ); +} +static void APIENTRY logViewport(GLint x, GLint y, GLsizei width, GLsizei height) +{ + fprintf( glw_state.log_fp, "glViewport( %d, %d, %d, %d )\n", x, y, width, height ); + dllViewport( x, y, width, height ); +} + +/* +** QGL_Shutdown +** +** Unloads the specified DLL then nulls out all the proc pointers. This +** is only called during a hard shutdown of the OGL subsystem (e.g. vid_restart). +*/ +void QGL_Shutdown( void ) +{ + ri.Printf( PRINT_ALL, "...shutting down QGL\n" ); + + if ( glw_state.hinstOpenGL ) + { + ri.Printf( PRINT_ALL, "...unloading OpenGL DLL\n" ); + FreeLibrary( glw_state.hinstOpenGL ); + } + + glw_state.hinstOpenGL = NULL; + + qglAccum = NULL; + qglAlphaFunc = NULL; + qglAreTexturesResident = NULL; + qglArrayElement = NULL; + qglBegin = NULL; + qglBindTexture = NULL; + qglBitmap = NULL; + qglBlendFunc = NULL; + qglCallList = NULL; + qglCallLists = NULL; + qglClear = NULL; + qglClearAccum = NULL; + qglClearColor = NULL; + qglClearDepth = NULL; + qglClearIndex = NULL; + qglClearStencil = NULL; + qglClipPlane = NULL; + qglColor3b = NULL; + qglColor3bv = NULL; + qglColor3d = NULL; + qglColor3dv = NULL; + qglColor3f = NULL; + qglColor3fv = NULL; + qglColor3i = NULL; + qglColor3iv = NULL; + qglColor3s = NULL; + qglColor3sv = NULL; + qglColor3ub = NULL; + qglColor3ubv = NULL; + qglColor3ui = NULL; + qglColor3uiv = NULL; + qglColor3us = NULL; + qglColor3usv = NULL; + qglColor4b = NULL; + qglColor4bv = NULL; + qglColor4d = NULL; + qglColor4dv = NULL; + qglColor4f = NULL; + qglColor4fv = NULL; + qglColor4i = NULL; + qglColor4iv = NULL; + qglColor4s = NULL; + qglColor4sv = NULL; + qglColor4ub = NULL; + qglColor4ubv = NULL; + qglColor4ui = NULL; + qglColor4uiv = NULL; + qglColor4us = NULL; + qglColor4usv = NULL; + qglColorMask = NULL; + qglColorMaterial = NULL; + qglColorPointer = NULL; + qglCopyPixels = NULL; + qglCopyTexImage1D = NULL; + qglCopyTexImage2D = NULL; + qglCopyTexSubImage1D = NULL; + qglCopyTexSubImage2D = NULL; + qglCullFace = NULL; + qglDeleteLists = NULL; + qglDeleteTextures = NULL; + qglDepthFunc = NULL; + qglDepthMask = NULL; + qglDepthRange = NULL; + qglDisable = NULL; + qglDisableClientState = NULL; + qglDrawArrays = NULL; + qglDrawBuffer = NULL; + qglDrawElements = NULL; + qglDrawPixels = NULL; + qglEdgeFlag = NULL; + qglEdgeFlagPointer = NULL; + qglEdgeFlagv = NULL; + qglEnable = NULL; + qglEnableClientState = NULL; + qglEnd = NULL; + qglEndList = NULL; + qglEvalCoord1d = NULL; + qglEvalCoord1dv = NULL; + qglEvalCoord1f = NULL; + qglEvalCoord1fv = NULL; + qglEvalCoord2d = NULL; + qglEvalCoord2dv = NULL; + qglEvalCoord2f = NULL; + qglEvalCoord2fv = NULL; + qglEvalMesh1 = NULL; + qglEvalMesh2 = NULL; + qglEvalPoint1 = NULL; + qglEvalPoint2 = NULL; + qglFeedbackBuffer = NULL; + qglFinish = NULL; + qglFlush = NULL; + qglFogf = NULL; + qglFogfv = NULL; + qglFogi = NULL; + qglFogiv = NULL; + qglFrontFace = NULL; + qglFrustum = NULL; + qglGenLists = NULL; + qglGenTextures = NULL; + qglGetBooleanv = NULL; + qglGetClipPlane = NULL; + qglGetDoublev = NULL; + qglGetError = NULL; + qglGetFloatv = NULL; + qglGetIntegerv = NULL; + qglGetLightfv = NULL; + qglGetLightiv = NULL; + qglGetMapdv = NULL; + qglGetMapfv = NULL; + qglGetMapiv = NULL; + qglGetMaterialfv = NULL; + qglGetMaterialiv = NULL; + qglGetPixelMapfv = NULL; + qglGetPixelMapuiv = NULL; + qglGetPixelMapusv = NULL; + qglGetPointerv = NULL; + qglGetPolygonStipple = NULL; + qglGetString = NULL; + qglGetTexEnvfv = NULL; + qglGetTexEnviv = NULL; + qglGetTexGendv = NULL; + qglGetTexGenfv = NULL; + qglGetTexGeniv = NULL; + qglGetTexImage = NULL; + qglGetTexLevelParameterfv = NULL; + qglGetTexLevelParameteriv = NULL; + qglGetTexParameterfv = NULL; + qglGetTexParameteriv = NULL; + qglHint = NULL; + qglIndexMask = NULL; + qglIndexPointer = NULL; + qglIndexd = NULL; + qglIndexdv = NULL; + qglIndexf = NULL; + qglIndexfv = NULL; + qglIndexi = NULL; + qglIndexiv = NULL; + qglIndexs = NULL; + qglIndexsv = NULL; + qglIndexub = NULL; + qglIndexubv = NULL; + qglInitNames = NULL; + qglInterleavedArrays = NULL; + qglIsEnabled = NULL; + qglIsList = NULL; + qglIsTexture = NULL; + qglLightModelf = NULL; + qglLightModelfv = NULL; + qglLightModeli = NULL; + qglLightModeliv = NULL; + qglLightf = NULL; + qglLightfv = NULL; + qglLighti = NULL; + qglLightiv = NULL; + qglLineStipple = NULL; + qglLineWidth = NULL; + qglListBase = NULL; + qglLoadIdentity = NULL; + qglLoadMatrixd = NULL; + qglLoadMatrixf = NULL; + qglLoadName = NULL; + qglLogicOp = NULL; + qglMap1d = NULL; + qglMap1f = NULL; + qglMap2d = NULL; + qglMap2f = NULL; + qglMapGrid1d = NULL; + qglMapGrid1f = NULL; + qglMapGrid2d = NULL; + qglMapGrid2f = NULL; + qglMaterialf = NULL; + qglMaterialfv = NULL; + qglMateriali = NULL; + qglMaterialiv = NULL; + qglMatrixMode = NULL; + qglMultMatrixd = NULL; + qglMultMatrixf = NULL; + qglNewList = NULL; + qglNormal3b = NULL; + qglNormal3bv = NULL; + qglNormal3d = NULL; + qglNormal3dv = NULL; + qglNormal3f = NULL; + qglNormal3fv = NULL; + qglNormal3i = NULL; + qglNormal3iv = NULL; + qglNormal3s = NULL; + qglNormal3sv = NULL; + qglNormalPointer = NULL; + qglOrtho = NULL; + qglPassThrough = NULL; + qglPixelMapfv = NULL; + qglPixelMapuiv = NULL; + qglPixelMapusv = NULL; + qglPixelStoref = NULL; + qglPixelStorei = NULL; + qglPixelTransferf = NULL; + qglPixelTransferi = NULL; + qglPixelZoom = NULL; + qglPointSize = NULL; + qglPolygonMode = NULL; + qglPolygonOffset = NULL; + qglPolygonStipple = NULL; + qglPopAttrib = NULL; + qglPopClientAttrib = NULL; + qglPopMatrix = NULL; + qglPopName = NULL; + qglPrioritizeTextures = NULL; + qglPushAttrib = NULL; + qglPushClientAttrib = NULL; + qglPushMatrix = NULL; + qglPushName = NULL; + qglRasterPos2d = NULL; + qglRasterPos2dv = NULL; + qglRasterPos2f = NULL; + qglRasterPos2fv = NULL; + qglRasterPos2i = NULL; + qglRasterPos2iv = NULL; + qglRasterPos2s = NULL; + qglRasterPos2sv = NULL; + qglRasterPos3d = NULL; + qglRasterPos3dv = NULL; + qglRasterPos3f = NULL; + qglRasterPos3fv = NULL; + qglRasterPos3i = NULL; + qglRasterPos3iv = NULL; + qglRasterPos3s = NULL; + qglRasterPos3sv = NULL; + qglRasterPos4d = NULL; + qglRasterPos4dv = NULL; + qglRasterPos4f = NULL; + qglRasterPos4fv = NULL; + qglRasterPos4i = NULL; + qglRasterPos4iv = NULL; + qglRasterPos4s = NULL; + qglRasterPos4sv = NULL; + qglReadBuffer = NULL; + qglReadPixels = NULL; + qglRectd = NULL; + qglRectdv = NULL; + qglRectf = NULL; + qglRectfv = NULL; + qglRecti = NULL; + qglRectiv = NULL; + qglRects = NULL; + qglRectsv = NULL; + qglRenderMode = NULL; + qglRotated = NULL; + qglRotatef = NULL; + qglScaled = NULL; + qglScalef = NULL; + qglScissor = NULL; + qglSelectBuffer = NULL; + qglShadeModel = NULL; + qglStencilFunc = NULL; + qglStencilMask = NULL; + qglStencilOp = NULL; + qglTexCoord1d = NULL; + qglTexCoord1dv = NULL; + qglTexCoord1f = NULL; + qglTexCoord1fv = NULL; + qglTexCoord1i = NULL; + qglTexCoord1iv = NULL; + qglTexCoord1s = NULL; + qglTexCoord1sv = NULL; + qglTexCoord2d = NULL; + qglTexCoord2dv = NULL; + qglTexCoord2f = NULL; + qglTexCoord2fv = NULL; + qglTexCoord2i = NULL; + qglTexCoord2iv = NULL; + qglTexCoord2s = NULL; + qglTexCoord2sv = NULL; + qglTexCoord3d = NULL; + qglTexCoord3dv = NULL; + qglTexCoord3f = NULL; + qglTexCoord3fv = NULL; + qglTexCoord3i = NULL; + qglTexCoord3iv = NULL; + qglTexCoord3s = NULL; + qglTexCoord3sv = NULL; + qglTexCoord4d = NULL; + qglTexCoord4dv = NULL; + qglTexCoord4f = NULL; + qglTexCoord4fv = NULL; + qglTexCoord4i = NULL; + qglTexCoord4iv = NULL; + qglTexCoord4s = NULL; + qglTexCoord4sv = NULL; + qglTexCoordPointer = NULL; + qglTexEnvf = NULL; + qglTexEnvfv = NULL; + qglTexEnvi = NULL; + qglTexEnviv = NULL; + qglTexGend = NULL; + qglTexGendv = NULL; + qglTexGenf = NULL; + qglTexGenfv = NULL; + qglTexGeni = NULL; + qglTexGeniv = NULL; + qglTexImage1D = NULL; + qglTexImage2D = NULL; + qglTexParameterf = NULL; + qglTexParameterfv = NULL; + qglTexParameteri = NULL; + qglTexParameteriv = NULL; + qglTexSubImage1D = NULL; + qglTexSubImage2D = NULL; + qglTranslated = NULL; + qglTranslatef = NULL; + qglVertex2d = NULL; + qglVertex2dv = NULL; + qglVertex2f = NULL; + qglVertex2fv = NULL; + qglVertex2i = NULL; + qglVertex2iv = NULL; + qglVertex2s = NULL; + qglVertex2sv = NULL; + qglVertex3d = NULL; + qglVertex3dv = NULL; + qglVertex3f = NULL; + qglVertex3fv = NULL; + qglVertex3i = NULL; + qglVertex3iv = NULL; + qglVertex3s = NULL; + qglVertex3sv = NULL; + qglVertex4d = NULL; + qglVertex4dv = NULL; + qglVertex4f = NULL; + qglVertex4fv = NULL; + qglVertex4i = NULL; + qglVertex4iv = NULL; + qglVertex4s = NULL; + qglVertex4sv = NULL; + qglVertexPointer = NULL; + qglViewport = NULL; + + qwglCopyContext = NULL; + qwglCreateContext = NULL; + qwglCreateLayerContext = NULL; + qwglDeleteContext = NULL; + qwglDescribeLayerPlane = NULL; + qwglGetCurrentContext = NULL; + qwglGetCurrentDC = NULL; + qwglGetLayerPaletteEntries = NULL; + qwglGetProcAddress = NULL; + qwglMakeCurrent = NULL; + qwglRealizeLayerPalette = NULL; + qwglSetLayerPaletteEntries = NULL; + qwglShareLists = NULL; + qwglSwapLayerBuffers = NULL; + qwglUseFontBitmaps = NULL; + qwglUseFontOutlines = NULL; + + qwglChoosePixelFormat = NULL; + qwglDescribePixelFormat = NULL; + qwglGetPixelFormat = NULL; + qwglSetPixelFormat = NULL; + qwglSwapBuffers = NULL; +} + +#define GR_NUM_BOARDS 0x0f + +static qboolean GlideIsValid( void ) +{ + HMODULE hGlide; +// int numBoards; +// void (__stdcall *grGet)(unsigned int, unsigned int, int*); + + if ( ( hGlide = LoadLibrary("Glide3X") ) != 0 ) + { + // FIXME: 3Dfx needs to fix this shit + return qtrue; + +#if 0 + grGet = (void *)GetProcAddress( hGlide, "_grGet@12"); + + if ( grGet ) + { + grGet( GR_NUM_BOARDS, sizeof(int), &numBoards); + } + else + { + // if we've reached this point, something is seriously wrong + ri.Printf( PRINT_WARNING, "WARNING: could not find grGet in GLIDE3X.DLL\n" ); + numBoards = 0; + } + + FreeLibrary( hGlide ); + hGlide = NULL; + + if ( numBoards > 0 ) + { + return qtrue; + } + + ri.Printf( PRINT_WARNING, "WARNING: invalid Glide installation!\n" ); +#endif + } + + return qfalse; +} + +# pragma warning (disable : 4113 4133 4047 ) +# define GPA( a ) GetProcAddress( glw_state.hinstOpenGL, a ) + +/* +** QGL_Init +** +** This is responsible for binding our qgl function pointers to +** the appropriate GL stuff. In Windows this means doing a +** LoadLibrary and a bunch of calls to GetProcAddress. On other +** operating systems we need to do the right thing, whatever that +** might be. +*/ +qboolean QGL_Init( const char *dllname ) +{ + char systemDir[1024]; + char libName[1024]; + + GetSystemDirectory( systemDir, sizeof( systemDir ) ); + + assert( glw_state.hinstOpenGL == 0 ); + + ri.Printf( PRINT_ALL, "...initializing QGL\n" ); + + // NOTE: this assumes that 'dllname' is lower case (and it should be)! + if ( strstr( dllname, _3DFX_DRIVER_NAME ) ) + { + if ( !GlideIsValid() ) + { + ri.Printf( PRINT_ALL, "...WARNING: missing Glide installation, assuming no 3Dfx available\n" ); + return qfalse; + } + } + + if ( dllname[0] != '!' ) + { + Com_sprintf( libName, sizeof( libName ), "%s\\%s", systemDir, dllname ); + } + else + { + Q_strncpyz( libName, dllname, sizeof( libName ) ); + } + + ri.Printf( PRINT_ALL, "...calling LoadLibrary( '%s.dll' ): ", libName ); + + if ( ( glw_state.hinstOpenGL = LoadLibrary( dllname ) ) == 0 ) + { + ri.Printf( PRINT_ALL, "failed\n" ); + return qfalse; + } + ri.Printf( PRINT_ALL, "succeeded\n" ); + + qglAccum = dllAccum = GPA( "glAccum" ); + qglAlphaFunc = dllAlphaFunc = GPA( "glAlphaFunc" ); + qglAreTexturesResident = dllAreTexturesResident = GPA( "glAreTexturesResident" ); + qglArrayElement = dllArrayElement = GPA( "glArrayElement" ); + qglBegin = dllBegin = GPA( "glBegin" ); + qglBindTexture = dllBindTexture = GPA( "glBindTexture" ); + qglBitmap = dllBitmap = GPA( "glBitmap" ); + qglBlendFunc = dllBlendFunc = GPA( "glBlendFunc" ); + qglCallList = dllCallList = GPA( "glCallList" ); + qglCallLists = dllCallLists = GPA( "glCallLists" ); + qglClear = dllClear = GPA( "glClear" ); + qglClearAccum = dllClearAccum = GPA( "glClearAccum" ); + qglClearColor = dllClearColor = GPA( "glClearColor" ); + qglClearDepth = dllClearDepth = GPA( "glClearDepth" ); + qglClearIndex = dllClearIndex = GPA( "glClearIndex" ); + qglClearStencil = dllClearStencil = GPA( "glClearStencil" ); + qglClipPlane = dllClipPlane = GPA( "glClipPlane" ); + qglColor3b = dllColor3b = GPA( "glColor3b" ); + qglColor3bv = dllColor3bv = GPA( "glColor3bv" ); + qglColor3d = dllColor3d = GPA( "glColor3d" ); + qglColor3dv = dllColor3dv = GPA( "glColor3dv" ); + qglColor3f = dllColor3f = GPA( "glColor3f" ); + qglColor3fv = dllColor3fv = GPA( "glColor3fv" ); + qglColor3i = dllColor3i = GPA( "glColor3i" ); + qglColor3iv = dllColor3iv = GPA( "glColor3iv" ); + qglColor3s = dllColor3s = GPA( "glColor3s" ); + qglColor3sv = dllColor3sv = GPA( "glColor3sv" ); + qglColor3ub = dllColor3ub = GPA( "glColor3ub" ); + qglColor3ubv = dllColor3ubv = GPA( "glColor3ubv" ); + qglColor3ui = dllColor3ui = GPA( "glColor3ui" ); + qglColor3uiv = dllColor3uiv = GPA( "glColor3uiv" ); + qglColor3us = dllColor3us = GPA( "glColor3us" ); + qglColor3usv = dllColor3usv = GPA( "glColor3usv" ); + qglColor4b = dllColor4b = GPA( "glColor4b" ); + qglColor4bv = dllColor4bv = GPA( "glColor4bv" ); + qglColor4d = dllColor4d = GPA( "glColor4d" ); + qglColor4dv = dllColor4dv = GPA( "glColor4dv" ); + qglColor4f = dllColor4f = GPA( "glColor4f" ); + qglColor4fv = dllColor4fv = GPA( "glColor4fv" ); + qglColor4i = dllColor4i = GPA( "glColor4i" ); + qglColor4iv = dllColor4iv = GPA( "glColor4iv" ); + qglColor4s = dllColor4s = GPA( "glColor4s" ); + qglColor4sv = dllColor4sv = GPA( "glColor4sv" ); + qglColor4ub = dllColor4ub = GPA( "glColor4ub" ); + qglColor4ubv = dllColor4ubv = GPA( "glColor4ubv" ); + qglColor4ui = dllColor4ui = GPA( "glColor4ui" ); + qglColor4uiv = dllColor4uiv = GPA( "glColor4uiv" ); + qglColor4us = dllColor4us = GPA( "glColor4us" ); + qglColor4usv = dllColor4usv = GPA( "glColor4usv" ); + qglColorMask = dllColorMask = GPA( "glColorMask" ); + qglColorMaterial = dllColorMaterial = GPA( "glColorMaterial" ); + qglColorPointer = dllColorPointer = GPA( "glColorPointer" ); + qglCopyPixels = dllCopyPixels = GPA( "glCopyPixels" ); + qglCopyTexImage1D = dllCopyTexImage1D = GPA( "glCopyTexImage1D" ); + qglCopyTexImage2D = dllCopyTexImage2D = GPA( "glCopyTexImage2D" ); + qglCopyTexSubImage1D = dllCopyTexSubImage1D = GPA( "glCopyTexSubImage1D" ); + qglCopyTexSubImage2D = dllCopyTexSubImage2D = GPA( "glCopyTexSubImage2D" ); + qglCullFace = dllCullFace = GPA( "glCullFace" ); + qglDeleteLists = dllDeleteLists = GPA( "glDeleteLists" ); + qglDeleteTextures = dllDeleteTextures = GPA( "glDeleteTextures" ); + qglDepthFunc = dllDepthFunc = GPA( "glDepthFunc" ); + qglDepthMask = dllDepthMask = GPA( "glDepthMask" ); + qglDepthRange = dllDepthRange = GPA( "glDepthRange" ); + qglDisable = dllDisable = GPA( "glDisable" ); + qglDisableClientState = dllDisableClientState = GPA( "glDisableClientState" ); + qglDrawArrays = dllDrawArrays = GPA( "glDrawArrays" ); + qglDrawBuffer = dllDrawBuffer = GPA( "glDrawBuffer" ); + qglDrawElements = dllDrawElements = GPA( "glDrawElements" ); + qglDrawPixels = dllDrawPixels = GPA( "glDrawPixels" ); + qglEdgeFlag = dllEdgeFlag = GPA( "glEdgeFlag" ); + qglEdgeFlagPointer = dllEdgeFlagPointer = GPA( "glEdgeFlagPointer" ); + qglEdgeFlagv = dllEdgeFlagv = GPA( "glEdgeFlagv" ); + qglEnable = dllEnable = GPA( "glEnable" ); + qglEnableClientState = dllEnableClientState = GPA( "glEnableClientState" ); + qglEnd = dllEnd = GPA( "glEnd" ); + qglEndList = dllEndList = GPA( "glEndList" ); + qglEvalCoord1d = dllEvalCoord1d = GPA( "glEvalCoord1d" ); + qglEvalCoord1dv = dllEvalCoord1dv = GPA( "glEvalCoord1dv" ); + qglEvalCoord1f = dllEvalCoord1f = GPA( "glEvalCoord1f" ); + qglEvalCoord1fv = dllEvalCoord1fv = GPA( "glEvalCoord1fv" ); + qglEvalCoord2d = dllEvalCoord2d = GPA( "glEvalCoord2d" ); + qglEvalCoord2dv = dllEvalCoord2dv = GPA( "glEvalCoord2dv" ); + qglEvalCoord2f = dllEvalCoord2f = GPA( "glEvalCoord2f" ); + qglEvalCoord2fv = dllEvalCoord2fv = GPA( "glEvalCoord2fv" ); + qglEvalMesh1 = dllEvalMesh1 = GPA( "glEvalMesh1" ); + qglEvalMesh2 = dllEvalMesh2 = GPA( "glEvalMesh2" ); + qglEvalPoint1 = dllEvalPoint1 = GPA( "glEvalPoint1" ); + qglEvalPoint2 = dllEvalPoint2 = GPA( "glEvalPoint2" ); + qglFeedbackBuffer = dllFeedbackBuffer = GPA( "glFeedbackBuffer" ); + qglFinish = dllFinish = GPA( "glFinish" ); + qglFlush = dllFlush = GPA( "glFlush" ); + qglFogf = dllFogf = GPA( "glFogf" ); + qglFogfv = dllFogfv = GPA( "glFogfv" ); + qglFogi = dllFogi = GPA( "glFogi" ); + qglFogiv = dllFogiv = GPA( "glFogiv" ); + qglFrontFace = dllFrontFace = GPA( "glFrontFace" ); + qglFrustum = dllFrustum = GPA( "glFrustum" ); + qglGenLists = dllGenLists = ( GLuint (__stdcall * )(int) ) GPA( "glGenLists" ); + qglGenTextures = dllGenTextures = GPA( "glGenTextures" ); + qglGetBooleanv = dllGetBooleanv = GPA( "glGetBooleanv" ); + qglGetClipPlane = dllGetClipPlane = GPA( "glGetClipPlane" ); + qglGetDoublev = dllGetDoublev = GPA( "glGetDoublev" ); + qglGetError = dllGetError = ( GLenum (__stdcall * )(void) ) GPA( "glGetError" ); + qglGetFloatv = dllGetFloatv = GPA( "glGetFloatv" ); + qglGetIntegerv = dllGetIntegerv = GPA( "glGetIntegerv" ); + qglGetLightfv = dllGetLightfv = GPA( "glGetLightfv" ); + qglGetLightiv = dllGetLightiv = GPA( "glGetLightiv" ); + qglGetMapdv = dllGetMapdv = GPA( "glGetMapdv" ); + qglGetMapfv = dllGetMapfv = GPA( "glGetMapfv" ); + qglGetMapiv = dllGetMapiv = GPA( "glGetMapiv" ); + qglGetMaterialfv = dllGetMaterialfv = GPA( "glGetMaterialfv" ); + qglGetMaterialiv = dllGetMaterialiv = GPA( "glGetMaterialiv" ); + qglGetPixelMapfv = dllGetPixelMapfv = GPA( "glGetPixelMapfv" ); + qglGetPixelMapuiv = dllGetPixelMapuiv = GPA( "glGetPixelMapuiv" ); + qglGetPixelMapusv = dllGetPixelMapusv = GPA( "glGetPixelMapusv" ); + qglGetPointerv = dllGetPointerv = GPA( "glGetPointerv" ); + qglGetPolygonStipple = dllGetPolygonStipple = GPA( "glGetPolygonStipple" ); + qglGetString = dllGetString = GPA( "glGetString" ); + qglGetTexEnvfv = dllGetTexEnvfv = GPA( "glGetTexEnvfv" ); + qglGetTexEnviv = dllGetTexEnviv = GPA( "glGetTexEnviv" ); + qglGetTexGendv = dllGetTexGendv = GPA( "glGetTexGendv" ); + qglGetTexGenfv = dllGetTexGenfv = GPA( "glGetTexGenfv" ); + qglGetTexGeniv = dllGetTexGeniv = GPA( "glGetTexGeniv" ); + qglGetTexImage = dllGetTexImage = GPA( "glGetTexImage" ); + qglGetTexParameterfv = dllGetTexParameterfv = GPA( "glGetTexParameterfv" ); + qglGetTexParameteriv = dllGetTexParameteriv = GPA( "glGetTexParameteriv" ); + qglHint = dllHint = GPA( "glHint" ); + qglIndexMask = dllIndexMask = GPA( "glIndexMask" ); + qglIndexPointer = dllIndexPointer = GPA( "glIndexPointer" ); + qglIndexd = dllIndexd = GPA( "glIndexd" ); + qglIndexdv = dllIndexdv = GPA( "glIndexdv" ); + qglIndexf = dllIndexf = GPA( "glIndexf" ); + qglIndexfv = dllIndexfv = GPA( "glIndexfv" ); + qglIndexi = dllIndexi = GPA( "glIndexi" ); + qglIndexiv = dllIndexiv = GPA( "glIndexiv" ); + qglIndexs = dllIndexs = GPA( "glIndexs" ); + qglIndexsv = dllIndexsv = GPA( "glIndexsv" ); + qglIndexub = dllIndexub = GPA( "glIndexub" ); + qglIndexubv = dllIndexubv = GPA( "glIndexubv" ); + qglInitNames = dllInitNames = GPA( "glInitNames" ); + qglInterleavedArrays = dllInterleavedArrays = GPA( "glInterleavedArrays" ); + qglIsEnabled = dllIsEnabled = GPA( "glIsEnabled" ); + qglIsList = dllIsList = GPA( "glIsList" ); + qglIsTexture = dllIsTexture = GPA( "glIsTexture" ); + qglLightModelf = dllLightModelf = GPA( "glLightModelf" ); + qglLightModelfv = dllLightModelfv = GPA( "glLightModelfv" ); + qglLightModeli = dllLightModeli = GPA( "glLightModeli" ); + qglLightModeliv = dllLightModeliv = GPA( "glLightModeliv" ); + qglLightf = dllLightf = GPA( "glLightf" ); + qglLightfv = dllLightfv = GPA( "glLightfv" ); + qglLighti = dllLighti = GPA( "glLighti" ); + qglLightiv = dllLightiv = GPA( "glLightiv" ); + qglLineStipple = dllLineStipple = GPA( "glLineStipple" ); + qglLineWidth = dllLineWidth = GPA( "glLineWidth" ); + qglListBase = dllListBase = GPA( "glListBase" ); + qglLoadIdentity = dllLoadIdentity = GPA( "glLoadIdentity" ); + qglLoadMatrixd = dllLoadMatrixd = GPA( "glLoadMatrixd" ); + qglLoadMatrixf = dllLoadMatrixf = GPA( "glLoadMatrixf" ); + qglLoadName = dllLoadName = GPA( "glLoadName" ); + qglLogicOp = dllLogicOp = GPA( "glLogicOp" ); + qglMap1d = dllMap1d = GPA( "glMap1d" ); + qglMap1f = dllMap1f = GPA( "glMap1f" ); + qglMap2d = dllMap2d = GPA( "glMap2d" ); + qglMap2f = dllMap2f = GPA( "glMap2f" ); + qglMapGrid1d = dllMapGrid1d = GPA( "glMapGrid1d" ); + qglMapGrid1f = dllMapGrid1f = GPA( "glMapGrid1f" ); + qglMapGrid2d = dllMapGrid2d = GPA( "glMapGrid2d" ); + qglMapGrid2f = dllMapGrid2f = GPA( "glMapGrid2f" ); + qglMaterialf = dllMaterialf = GPA( "glMaterialf" ); + qglMaterialfv = dllMaterialfv = GPA( "glMaterialfv" ); + qglMateriali = dllMateriali = GPA( "glMateriali" ); + qglMaterialiv = dllMaterialiv = GPA( "glMaterialiv" ); + qglMatrixMode = dllMatrixMode = GPA( "glMatrixMode" ); + qglMultMatrixd = dllMultMatrixd = GPA( "glMultMatrixd" ); + qglMultMatrixf = dllMultMatrixf = GPA( "glMultMatrixf" ); + qglNewList = dllNewList = GPA( "glNewList" ); + qglNormal3b = dllNormal3b = GPA( "glNormal3b" ); + qglNormal3bv = dllNormal3bv = GPA( "glNormal3bv" ); + qglNormal3d = dllNormal3d = GPA( "glNormal3d" ); + qglNormal3dv = dllNormal3dv = GPA( "glNormal3dv" ); + qglNormal3f = dllNormal3f = GPA( "glNormal3f" ); + qglNormal3fv = dllNormal3fv = GPA( "glNormal3fv" ); + qglNormal3i = dllNormal3i = GPA( "glNormal3i" ); + qglNormal3iv = dllNormal3iv = GPA( "glNormal3iv" ); + qglNormal3s = dllNormal3s = GPA( "glNormal3s" ); + qglNormal3sv = dllNormal3sv = GPA( "glNormal3sv" ); + qglNormalPointer = dllNormalPointer = GPA( "glNormalPointer" ); + qglOrtho = dllOrtho = GPA( "glOrtho" ); + qglPassThrough = dllPassThrough = GPA( "glPassThrough" ); + qglPixelMapfv = dllPixelMapfv = GPA( "glPixelMapfv" ); + qglPixelMapuiv = dllPixelMapuiv = GPA( "glPixelMapuiv" ); + qglPixelMapusv = dllPixelMapusv = GPA( "glPixelMapusv" ); + qglPixelStoref = dllPixelStoref = GPA( "glPixelStoref" ); + qglPixelStorei = dllPixelStorei = GPA( "glPixelStorei" ); + qglPixelTransferf = dllPixelTransferf = GPA( "glPixelTransferf" ); + qglPixelTransferi = dllPixelTransferi = GPA( "glPixelTransferi" ); + qglPixelZoom = dllPixelZoom = GPA( "glPixelZoom" ); + qglPointSize = dllPointSize = GPA( "glPointSize" ); + qglPolygonMode = dllPolygonMode = GPA( "glPolygonMode" ); + qglPolygonOffset = dllPolygonOffset = GPA( "glPolygonOffset" ); + qglPolygonStipple = dllPolygonStipple = GPA( "glPolygonStipple" ); + qglPopAttrib = dllPopAttrib = GPA( "glPopAttrib" ); + qglPopClientAttrib = dllPopClientAttrib = GPA( "glPopClientAttrib" ); + qglPopMatrix = dllPopMatrix = GPA( "glPopMatrix" ); + qglPopName = dllPopName = GPA( "glPopName" ); + qglPrioritizeTextures = dllPrioritizeTextures = GPA( "glPrioritizeTextures" ); + qglPushAttrib = dllPushAttrib = GPA( "glPushAttrib" ); + qglPushClientAttrib = dllPushClientAttrib = GPA( "glPushClientAttrib" ); + qglPushMatrix = dllPushMatrix = GPA( "glPushMatrix" ); + qglPushName = dllPushName = GPA( "glPushName" ); + qglRasterPos2d = dllRasterPos2d = GPA( "glRasterPos2d" ); + qglRasterPos2dv = dllRasterPos2dv = GPA( "glRasterPos2dv" ); + qglRasterPos2f = dllRasterPos2f = GPA( "glRasterPos2f" ); + qglRasterPos2fv = dllRasterPos2fv = GPA( "glRasterPos2fv" ); + qglRasterPos2i = dllRasterPos2i = GPA( "glRasterPos2i" ); + qglRasterPos2iv = dllRasterPos2iv = GPA( "glRasterPos2iv" ); + qglRasterPos2s = dllRasterPos2s = GPA( "glRasterPos2s" ); + qglRasterPos2sv = dllRasterPos2sv = GPA( "glRasterPos2sv" ); + qglRasterPos3d = dllRasterPos3d = GPA( "glRasterPos3d" ); + qglRasterPos3dv = dllRasterPos3dv = GPA( "glRasterPos3dv" ); + qglRasterPos3f = dllRasterPos3f = GPA( "glRasterPos3f" ); + qglRasterPos3fv = dllRasterPos3fv = GPA( "glRasterPos3fv" ); + qglRasterPos3i = dllRasterPos3i = GPA( "glRasterPos3i" ); + qglRasterPos3iv = dllRasterPos3iv = GPA( "glRasterPos3iv" ); + qglRasterPos3s = dllRasterPos3s = GPA( "glRasterPos3s" ); + qglRasterPos3sv = dllRasterPos3sv = GPA( "glRasterPos3sv" ); + qglRasterPos4d = dllRasterPos4d = GPA( "glRasterPos4d" ); + qglRasterPos4dv = dllRasterPos4dv = GPA( "glRasterPos4dv" ); + qglRasterPos4f = dllRasterPos4f = GPA( "glRasterPos4f" ); + qglRasterPos4fv = dllRasterPos4fv = GPA( "glRasterPos4fv" ); + qglRasterPos4i = dllRasterPos4i = GPA( "glRasterPos4i" ); + qglRasterPos4iv = dllRasterPos4iv = GPA( "glRasterPos4iv" ); + qglRasterPos4s = dllRasterPos4s = GPA( "glRasterPos4s" ); + qglRasterPos4sv = dllRasterPos4sv = GPA( "glRasterPos4sv" ); + qglReadBuffer = dllReadBuffer = GPA( "glReadBuffer" ); + qglReadPixels = dllReadPixels = GPA( "glReadPixels" ); + qglRectd = dllRectd = GPA( "glRectd" ); + qglRectdv = dllRectdv = GPA( "glRectdv" ); + qglRectf = dllRectf = GPA( "glRectf" ); + qglRectfv = dllRectfv = GPA( "glRectfv" ); + qglRecti = dllRecti = GPA( "glRecti" ); + qglRectiv = dllRectiv = GPA( "glRectiv" ); + qglRects = dllRects = GPA( "glRects" ); + qglRectsv = dllRectsv = GPA( "glRectsv" ); + qglRenderMode = dllRenderMode = GPA( "glRenderMode" ); + qglRotated = dllRotated = GPA( "glRotated" ); + qglRotatef = dllRotatef = GPA( "glRotatef" ); + qglScaled = dllScaled = GPA( "glScaled" ); + qglScalef = dllScalef = GPA( "glScalef" ); + qglScissor = dllScissor = GPA( "glScissor" ); + qglSelectBuffer = dllSelectBuffer = GPA( "glSelectBuffer" ); + qglShadeModel = dllShadeModel = GPA( "glShadeModel" ); + qglStencilFunc = dllStencilFunc = GPA( "glStencilFunc" ); + qglStencilMask = dllStencilMask = GPA( "glStencilMask" ); + qglStencilOp = dllStencilOp = GPA( "glStencilOp" ); + qglTexCoord1d = dllTexCoord1d = GPA( "glTexCoord1d" ); + qglTexCoord1dv = dllTexCoord1dv = GPA( "glTexCoord1dv" ); + qglTexCoord1f = dllTexCoord1f = GPA( "glTexCoord1f" ); + qglTexCoord1fv = dllTexCoord1fv = GPA( "glTexCoord1fv" ); + qglTexCoord1i = dllTexCoord1i = GPA( "glTexCoord1i" ); + qglTexCoord1iv = dllTexCoord1iv = GPA( "glTexCoord1iv" ); + qglTexCoord1s = dllTexCoord1s = GPA( "glTexCoord1s" ); + qglTexCoord1sv = dllTexCoord1sv = GPA( "glTexCoord1sv" ); + qglTexCoord2d = dllTexCoord2d = GPA( "glTexCoord2d" ); + qglTexCoord2dv = dllTexCoord2dv = GPA( "glTexCoord2dv" ); + qglTexCoord2f = dllTexCoord2f = GPA( "glTexCoord2f" ); + qglTexCoord2fv = dllTexCoord2fv = GPA( "glTexCoord2fv" ); + qglTexCoord2i = dllTexCoord2i = GPA( "glTexCoord2i" ); + qglTexCoord2iv = dllTexCoord2iv = GPA( "glTexCoord2iv" ); + qglTexCoord2s = dllTexCoord2s = GPA( "glTexCoord2s" ); + qglTexCoord2sv = dllTexCoord2sv = GPA( "glTexCoord2sv" ); + qglTexCoord3d = dllTexCoord3d = GPA( "glTexCoord3d" ); + qglTexCoord3dv = dllTexCoord3dv = GPA( "glTexCoord3dv" ); + qglTexCoord3f = dllTexCoord3f = GPA( "glTexCoord3f" ); + qglTexCoord3fv = dllTexCoord3fv = GPA( "glTexCoord3fv" ); + qglTexCoord3i = dllTexCoord3i = GPA( "glTexCoord3i" ); + qglTexCoord3iv = dllTexCoord3iv = GPA( "glTexCoord3iv" ); + qglTexCoord3s = dllTexCoord3s = GPA( "glTexCoord3s" ); + qglTexCoord3sv = dllTexCoord3sv = GPA( "glTexCoord3sv" ); + qglTexCoord4d = dllTexCoord4d = GPA( "glTexCoord4d" ); + qglTexCoord4dv = dllTexCoord4dv = GPA( "glTexCoord4dv" ); + qglTexCoord4f = dllTexCoord4f = GPA( "glTexCoord4f" ); + qglTexCoord4fv = dllTexCoord4fv = GPA( "glTexCoord4fv" ); + qglTexCoord4i = dllTexCoord4i = GPA( "glTexCoord4i" ); + qglTexCoord4iv = dllTexCoord4iv = GPA( "glTexCoord4iv" ); + qglTexCoord4s = dllTexCoord4s = GPA( "glTexCoord4s" ); + qglTexCoord4sv = dllTexCoord4sv = GPA( "glTexCoord4sv" ); + qglTexCoordPointer = dllTexCoordPointer = GPA( "glTexCoordPointer" ); + qglTexEnvf = dllTexEnvf = GPA( "glTexEnvf" ); + qglTexEnvfv = dllTexEnvfv = GPA( "glTexEnvfv" ); + qglTexEnvi = dllTexEnvi = GPA( "glTexEnvi" ); + qglTexEnviv = dllTexEnviv = GPA( "glTexEnviv" ); + qglTexGend = dllTexGend = GPA( "glTexGend" ); + qglTexGendv = dllTexGendv = GPA( "glTexGendv" ); + qglTexGenf = dllTexGenf = GPA( "glTexGenf" ); + qglTexGenfv = dllTexGenfv = GPA( "glTexGenfv" ); + qglTexGeni = dllTexGeni = GPA( "glTexGeni" ); + qglTexGeniv = dllTexGeniv = GPA( "glTexGeniv" ); + qglTexImage1D = dllTexImage1D = GPA( "glTexImage1D" ); + qglTexImage2D = dllTexImage2D = GPA( "glTexImage2D" ); + qglTexParameterf = dllTexParameterf = GPA( "glTexParameterf" ); + qglTexParameterfv = dllTexParameterfv = GPA( "glTexParameterfv" ); + qglTexParameteri = dllTexParameteri = GPA( "glTexParameteri" ); + qglTexParameteriv = dllTexParameteriv = GPA( "glTexParameteriv" ); + qglTexSubImage1D = dllTexSubImage1D = GPA( "glTexSubImage1D" ); + qglTexSubImage2D = dllTexSubImage2D = GPA( "glTexSubImage2D" ); + qglTranslated = dllTranslated = GPA( "glTranslated" ); + qglTranslatef = dllTranslatef = GPA( "glTranslatef" ); + qglVertex2d = dllVertex2d = GPA( "glVertex2d" ); + qglVertex2dv = dllVertex2dv = GPA( "glVertex2dv" ); + qglVertex2f = dllVertex2f = GPA( "glVertex2f" ); + qglVertex2fv = dllVertex2fv = GPA( "glVertex2fv" ); + qglVertex2i = dllVertex2i = GPA( "glVertex2i" ); + qglVertex2iv = dllVertex2iv = GPA( "glVertex2iv" ); + qglVertex2s = dllVertex2s = GPA( "glVertex2s" ); + qglVertex2sv = dllVertex2sv = GPA( "glVertex2sv" ); + qglVertex3d = dllVertex3d = GPA( "glVertex3d" ); + qglVertex3dv = dllVertex3dv = GPA( "glVertex3dv" ); + qglVertex3f = dllVertex3f = GPA( "glVertex3f" ); + qglVertex3fv = dllVertex3fv = GPA( "glVertex3fv" ); + qglVertex3i = dllVertex3i = GPA( "glVertex3i" ); + qglVertex3iv = dllVertex3iv = GPA( "glVertex3iv" ); + qglVertex3s = dllVertex3s = GPA( "glVertex3s" ); + qglVertex3sv = dllVertex3sv = GPA( "glVertex3sv" ); + qglVertex4d = dllVertex4d = GPA( "glVertex4d" ); + qglVertex4dv = dllVertex4dv = GPA( "glVertex4dv" ); + qglVertex4f = dllVertex4f = GPA( "glVertex4f" ); + qglVertex4fv = dllVertex4fv = GPA( "glVertex4fv" ); + qglVertex4i = dllVertex4i = GPA( "glVertex4i" ); + qglVertex4iv = dllVertex4iv = GPA( "glVertex4iv" ); + qglVertex4s = dllVertex4s = GPA( "glVertex4s" ); + qglVertex4sv = dllVertex4sv = GPA( "glVertex4sv" ); + qglVertexPointer = dllVertexPointer = GPA( "glVertexPointer" ); + qglViewport = dllViewport = GPA( "glViewport" ); + + qwglCopyContext = GPA( "wglCopyContext" ); + qwglCreateContext = GPA( "wglCreateContext" ); + qwglCreateLayerContext = GPA( "wglCreateLayerContext" ); + qwglDeleteContext = GPA( "wglDeleteContext" ); + qwglDescribeLayerPlane = GPA( "wglDescribeLayerPlane" ); + qwglGetCurrentContext = GPA( "wglGetCurrentContext" ); + qwglGetCurrentDC = GPA( "wglGetCurrentDC" ); + qwglGetLayerPaletteEntries = GPA( "wglGetLayerPaletteEntries" ); + qwglGetProcAddress = GPA( "wglGetProcAddress" ); + qwglMakeCurrent = GPA( "wglMakeCurrent" ); + qwglRealizeLayerPalette = GPA( "wglRealizeLayerPalette" ); + qwglSetLayerPaletteEntries = GPA( "wglSetLayerPaletteEntries" ); + qwglShareLists = GPA( "wglShareLists" ); + qwglSwapLayerBuffers = GPA( "wglSwapLayerBuffers" ); + qwglUseFontBitmaps = GPA( "wglUseFontBitmapsA" ); + qwglUseFontOutlines = GPA( "wglUseFontOutlinesA" ); + + qwglChoosePixelFormat = GPA( "wglChoosePixelFormat" ); + qwglDescribePixelFormat = GPA( "wglDescribePixelFormat" ); + qwglGetPixelFormat = GPA( "wglGetPixelFormat" ); + qwglSetPixelFormat = GPA( "wglSetPixelFormat" ); + qwglSwapBuffers = GPA( "wglSwapBuffers" ); + + qwglSwapIntervalEXT = 0; + qglActiveTextureARB = 0; + qglClientActiveTextureARB = 0; + qglMultiTexCoord2fARB = 0; + qglLockArraysEXT = 0; + qglUnlockArraysEXT = 0; + qwglGetDeviceGammaRamp3DFX = NULL; + qwglSetDeviceGammaRamp3DFX = NULL; + + // check logging + QGL_EnableLogging( r_logFile->integer ); + + return qtrue; +} + +void QGL_EnableLogging( qboolean enable ) +{ + static qboolean isEnabled; + + // return if we're already active + if ( isEnabled && enable ) { + // decrement log counter and stop if it has reached 0 + ri.Cvar_Set( "r_logFile", va("%d", r_logFile->integer - 1 ) ); + if ( r_logFile->integer ) { + return; + } + enable = qfalse; + } + + // return if we're already disabled + if ( !enable && !isEnabled ) + return; + + isEnabled = enable; + + if ( enable ) + { + if ( !glw_state.log_fp ) + { + struct tm *newtime; + time_t aclock; + char buffer[1024]; + cvar_t *basedir; + + time( &aclock ); + newtime = localtime( &aclock ); + + asctime( newtime ); + + basedir = ri.Cvar_Get( "fs_basepath", "", 0 ); + Com_sprintf( buffer, sizeof(buffer), "%s/gl.log", basedir->string ); + glw_state.log_fp = fopen( buffer, "wt" ); + + fprintf( glw_state.log_fp, "%s\n", asctime( newtime ) ); + } + + qglAccum = logAccum; + qglAlphaFunc = logAlphaFunc; + qglAreTexturesResident = logAreTexturesResident; + qglArrayElement = logArrayElement; + qglBegin = logBegin; + qglBindTexture = logBindTexture; + qglBitmap = logBitmap; + qglBlendFunc = logBlendFunc; + qglCallList = logCallList; + qglCallLists = logCallLists; + qglClear = logClear; + qglClearAccum = logClearAccum; + qglClearColor = logClearColor; + qglClearDepth = logClearDepth; + qglClearIndex = logClearIndex; + qglClearStencil = logClearStencil; + qglClipPlane = logClipPlane; + qglColor3b = logColor3b; + qglColor3bv = logColor3bv; + qglColor3d = logColor3d; + qglColor3dv = logColor3dv; + qglColor3f = logColor3f; + qglColor3fv = logColor3fv; + qglColor3i = logColor3i; + qglColor3iv = logColor3iv; + qglColor3s = logColor3s; + qglColor3sv = logColor3sv; + qglColor3ub = logColor3ub; + qglColor3ubv = logColor3ubv; + qglColor3ui = logColor3ui; + qglColor3uiv = logColor3uiv; + qglColor3us = logColor3us; + qglColor3usv = logColor3usv; + qglColor4b = logColor4b; + qglColor4bv = logColor4bv; + qglColor4d = logColor4d; + qglColor4dv = logColor4dv; + qglColor4f = logColor4f; + qglColor4fv = logColor4fv; + qglColor4i = logColor4i; + qglColor4iv = logColor4iv; + qglColor4s = logColor4s; + qglColor4sv = logColor4sv; + qglColor4ub = logColor4ub; + qglColor4ubv = logColor4ubv; + qglColor4ui = logColor4ui; + qglColor4uiv = logColor4uiv; + qglColor4us = logColor4us; + qglColor4usv = logColor4usv; + qglColorMask = logColorMask; + qglColorMaterial = logColorMaterial; + qglColorPointer = logColorPointer; + qglCopyPixels = logCopyPixels; + qglCopyTexImage1D = logCopyTexImage1D; + qglCopyTexImage2D = logCopyTexImage2D; + qglCopyTexSubImage1D = logCopyTexSubImage1D; + qglCopyTexSubImage2D = logCopyTexSubImage2D; + qglCullFace = logCullFace; + qglDeleteLists = logDeleteLists ; + qglDeleteTextures = logDeleteTextures ; + qglDepthFunc = logDepthFunc ; + qglDepthMask = logDepthMask ; + qglDepthRange = logDepthRange ; + qglDisable = logDisable ; + qglDisableClientState = logDisableClientState ; + qglDrawArrays = logDrawArrays ; + qglDrawBuffer = logDrawBuffer ; + qglDrawElements = logDrawElements ; + qglDrawPixels = logDrawPixels ; + qglEdgeFlag = logEdgeFlag ; + qglEdgeFlagPointer = logEdgeFlagPointer ; + qglEdgeFlagv = logEdgeFlagv ; + qglEnable = logEnable ; + qglEnableClientState = logEnableClientState ; + qglEnd = logEnd ; + qglEndList = logEndList ; + qglEvalCoord1d = logEvalCoord1d ; + qglEvalCoord1dv = logEvalCoord1dv ; + qglEvalCoord1f = logEvalCoord1f ; + qglEvalCoord1fv = logEvalCoord1fv ; + qglEvalCoord2d = logEvalCoord2d ; + qglEvalCoord2dv = logEvalCoord2dv ; + qglEvalCoord2f = logEvalCoord2f ; + qglEvalCoord2fv = logEvalCoord2fv ; + qglEvalMesh1 = logEvalMesh1 ; + qglEvalMesh2 = logEvalMesh2 ; + qglEvalPoint1 = logEvalPoint1 ; + qglEvalPoint2 = logEvalPoint2 ; + qglFeedbackBuffer = logFeedbackBuffer ; + qglFinish = logFinish ; + qglFlush = logFlush ; + qglFogf = logFogf ; + qglFogfv = logFogfv ; + qglFogi = logFogi ; + qglFogiv = logFogiv ; + qglFrontFace = logFrontFace ; + qglFrustum = logFrustum ; + qglGenLists = logGenLists ; + qglGenTextures = logGenTextures ; + qglGetBooleanv = logGetBooleanv ; + qglGetClipPlane = logGetClipPlane ; + qglGetDoublev = logGetDoublev ; + qglGetError = logGetError ; + qglGetFloatv = logGetFloatv ; + qglGetIntegerv = logGetIntegerv ; + qglGetLightfv = logGetLightfv ; + qglGetLightiv = logGetLightiv ; + qglGetMapdv = logGetMapdv ; + qglGetMapfv = logGetMapfv ; + qglGetMapiv = logGetMapiv ; + qglGetMaterialfv = logGetMaterialfv ; + qglGetMaterialiv = logGetMaterialiv ; + qglGetPixelMapfv = logGetPixelMapfv ; + qglGetPixelMapuiv = logGetPixelMapuiv ; + qglGetPixelMapusv = logGetPixelMapusv ; + qglGetPointerv = logGetPointerv ; + qglGetPolygonStipple = logGetPolygonStipple ; + qglGetString = logGetString ; + qglGetTexEnvfv = logGetTexEnvfv ; + qglGetTexEnviv = logGetTexEnviv ; + qglGetTexGendv = logGetTexGendv ; + qglGetTexGenfv = logGetTexGenfv ; + qglGetTexGeniv = logGetTexGeniv ; + qglGetTexImage = logGetTexImage ; + qglGetTexLevelParameterfv = logGetTexLevelParameterfv ; + qglGetTexLevelParameteriv = logGetTexLevelParameteriv ; + qglGetTexParameterfv = logGetTexParameterfv ; + qglGetTexParameteriv = logGetTexParameteriv ; + qglHint = logHint ; + qglIndexMask = logIndexMask ; + qglIndexPointer = logIndexPointer ; + qglIndexd = logIndexd ; + qglIndexdv = logIndexdv ; + qglIndexf = logIndexf ; + qglIndexfv = logIndexfv ; + qglIndexi = logIndexi ; + qglIndexiv = logIndexiv ; + qglIndexs = logIndexs ; + qglIndexsv = logIndexsv ; + qglIndexub = logIndexub ; + qglIndexubv = logIndexubv ; + qglInitNames = logInitNames ; + qglInterleavedArrays = logInterleavedArrays ; + qglIsEnabled = logIsEnabled ; + qglIsList = logIsList ; + qglIsTexture = logIsTexture ; + qglLightModelf = logLightModelf ; + qglLightModelfv = logLightModelfv ; + qglLightModeli = logLightModeli ; + qglLightModeliv = logLightModeliv ; + qglLightf = logLightf ; + qglLightfv = logLightfv ; + qglLighti = logLighti ; + qglLightiv = logLightiv ; + qglLineStipple = logLineStipple ; + qglLineWidth = logLineWidth ; + qglListBase = logListBase ; + qglLoadIdentity = logLoadIdentity ; + qglLoadMatrixd = logLoadMatrixd ; + qglLoadMatrixf = logLoadMatrixf ; + qglLoadName = logLoadName ; + qglLogicOp = logLogicOp ; + qglMap1d = logMap1d ; + qglMap1f = logMap1f ; + qglMap2d = logMap2d ; + qglMap2f = logMap2f ; + qglMapGrid1d = logMapGrid1d ; + qglMapGrid1f = logMapGrid1f ; + qglMapGrid2d = logMapGrid2d ; + qglMapGrid2f = logMapGrid2f ; + qglMaterialf = logMaterialf ; + qglMaterialfv = logMaterialfv ; + qglMateriali = logMateriali ; + qglMaterialiv = logMaterialiv ; + qglMatrixMode = logMatrixMode ; + qglMultMatrixd = logMultMatrixd ; + qglMultMatrixf = logMultMatrixf ; + qglNewList = logNewList ; + qglNormal3b = logNormal3b ; + qglNormal3bv = logNormal3bv ; + qglNormal3d = logNormal3d ; + qglNormal3dv = logNormal3dv ; + qglNormal3f = logNormal3f ; + qglNormal3fv = logNormal3fv ; + qglNormal3i = logNormal3i ; + qglNormal3iv = logNormal3iv ; + qglNormal3s = logNormal3s ; + qglNormal3sv = logNormal3sv ; + qglNormalPointer = logNormalPointer ; + qglOrtho = logOrtho ; + qglPassThrough = logPassThrough ; + qglPixelMapfv = logPixelMapfv ; + qglPixelMapuiv = logPixelMapuiv ; + qglPixelMapusv = logPixelMapusv ; + qglPixelStoref = logPixelStoref ; + qglPixelStorei = logPixelStorei ; + qglPixelTransferf = logPixelTransferf ; + qglPixelTransferi = logPixelTransferi ; + qglPixelZoom = logPixelZoom ; + qglPointSize = logPointSize ; + qglPolygonMode = logPolygonMode ; + qglPolygonOffset = logPolygonOffset ; + qglPolygonStipple = logPolygonStipple ; + qglPopAttrib = logPopAttrib ; + qglPopClientAttrib = logPopClientAttrib ; + qglPopMatrix = logPopMatrix ; + qglPopName = logPopName ; + qglPrioritizeTextures = logPrioritizeTextures ; + qglPushAttrib = logPushAttrib ; + qglPushClientAttrib = logPushClientAttrib ; + qglPushMatrix = logPushMatrix ; + qglPushName = logPushName ; + qglRasterPos2d = logRasterPos2d ; + qglRasterPos2dv = logRasterPos2dv ; + qglRasterPos2f = logRasterPos2f ; + qglRasterPos2fv = logRasterPos2fv ; + qglRasterPos2i = logRasterPos2i ; + qglRasterPos2iv = logRasterPos2iv ; + qglRasterPos2s = logRasterPos2s ; + qglRasterPos2sv = logRasterPos2sv ; + qglRasterPos3d = logRasterPos3d ; + qglRasterPos3dv = logRasterPos3dv ; + qglRasterPos3f = logRasterPos3f ; + qglRasterPos3fv = logRasterPos3fv ; + qglRasterPos3i = logRasterPos3i ; + qglRasterPos3iv = logRasterPos3iv ; + qglRasterPos3s = logRasterPos3s ; + qglRasterPos3sv = logRasterPos3sv ; + qglRasterPos4d = logRasterPos4d ; + qglRasterPos4dv = logRasterPos4dv ; + qglRasterPos4f = logRasterPos4f ; + qglRasterPos4fv = logRasterPos4fv ; + qglRasterPos4i = logRasterPos4i ; + qglRasterPos4iv = logRasterPos4iv ; + qglRasterPos4s = logRasterPos4s ; + qglRasterPos4sv = logRasterPos4sv ; + qglReadBuffer = logReadBuffer ; + qglReadPixels = logReadPixels ; + qglRectd = logRectd ; + qglRectdv = logRectdv ; + qglRectf = logRectf ; + qglRectfv = logRectfv ; + qglRecti = logRecti ; + qglRectiv = logRectiv ; + qglRects = logRects ; + qglRectsv = logRectsv ; + qglRenderMode = logRenderMode ; + qglRotated = logRotated ; + qglRotatef = logRotatef ; + qglScaled = logScaled ; + qglScalef = logScalef ; + qglScissor = logScissor ; + qglSelectBuffer = logSelectBuffer ; + qglShadeModel = logShadeModel ; + qglStencilFunc = logStencilFunc ; + qglStencilMask = logStencilMask ; + qglStencilOp = logStencilOp ; + qglTexCoord1d = logTexCoord1d ; + qglTexCoord1dv = logTexCoord1dv ; + qglTexCoord1f = logTexCoord1f ; + qglTexCoord1fv = logTexCoord1fv ; + qglTexCoord1i = logTexCoord1i ; + qglTexCoord1iv = logTexCoord1iv ; + qglTexCoord1s = logTexCoord1s ; + qglTexCoord1sv = logTexCoord1sv ; + qglTexCoord2d = logTexCoord2d ; + qglTexCoord2dv = logTexCoord2dv ; + qglTexCoord2f = logTexCoord2f ; + qglTexCoord2fv = logTexCoord2fv ; + qglTexCoord2i = logTexCoord2i ; + qglTexCoord2iv = logTexCoord2iv ; + qglTexCoord2s = logTexCoord2s ; + qglTexCoord2sv = logTexCoord2sv ; + qglTexCoord3d = logTexCoord3d ; + qglTexCoord3dv = logTexCoord3dv ; + qglTexCoord3f = logTexCoord3f ; + qglTexCoord3fv = logTexCoord3fv ; + qglTexCoord3i = logTexCoord3i ; + qglTexCoord3iv = logTexCoord3iv ; + qglTexCoord3s = logTexCoord3s ; + qglTexCoord3sv = logTexCoord3sv ; + qglTexCoord4d = logTexCoord4d ; + qglTexCoord4dv = logTexCoord4dv ; + qglTexCoord4f = logTexCoord4f ; + qglTexCoord4fv = logTexCoord4fv ; + qglTexCoord4i = logTexCoord4i ; + qglTexCoord4iv = logTexCoord4iv ; + qglTexCoord4s = logTexCoord4s ; + qglTexCoord4sv = logTexCoord4sv ; + qglTexCoordPointer = logTexCoordPointer ; + qglTexEnvf = logTexEnvf ; + qglTexEnvfv = logTexEnvfv ; + qglTexEnvi = logTexEnvi ; + qglTexEnviv = logTexEnviv ; + qglTexGend = logTexGend ; + qglTexGendv = logTexGendv ; + qglTexGenf = logTexGenf ; + qglTexGenfv = logTexGenfv ; + qglTexGeni = logTexGeni ; + qglTexGeniv = logTexGeniv ; + qglTexImage1D = logTexImage1D ; + qglTexImage2D = logTexImage2D ; + qglTexParameterf = logTexParameterf ; + qglTexParameterfv = logTexParameterfv ; + qglTexParameteri = logTexParameteri ; + qglTexParameteriv = logTexParameteriv ; + qglTexSubImage1D = logTexSubImage1D ; + qglTexSubImage2D = logTexSubImage2D ; + qglTranslated = logTranslated ; + qglTranslatef = logTranslatef ; + qglVertex2d = logVertex2d ; + qglVertex2dv = logVertex2dv ; + qglVertex2f = logVertex2f ; + qglVertex2fv = logVertex2fv ; + qglVertex2i = logVertex2i ; + qglVertex2iv = logVertex2iv ; + qglVertex2s = logVertex2s ; + qglVertex2sv = logVertex2sv ; + qglVertex3d = logVertex3d ; + qglVertex3dv = logVertex3dv ; + qglVertex3f = logVertex3f ; + qglVertex3fv = logVertex3fv ; + qglVertex3i = logVertex3i ; + qglVertex3iv = logVertex3iv ; + qglVertex3s = logVertex3s ; + qglVertex3sv = logVertex3sv ; + qglVertex4d = logVertex4d ; + qglVertex4dv = logVertex4dv ; + qglVertex4f = logVertex4f ; + qglVertex4fv = logVertex4fv ; + qglVertex4i = logVertex4i ; + qglVertex4iv = logVertex4iv ; + qglVertex4s = logVertex4s ; + qglVertex4sv = logVertex4sv ; + qglVertexPointer = logVertexPointer ; + qglViewport = logViewport ; + } + else + { + if ( glw_state.log_fp ) { + fprintf( glw_state.log_fp, "*** CLOSING LOG ***\n" ); + fclose( glw_state.log_fp ); + glw_state.log_fp = NULL; + } + qglAccum = dllAccum; + qglAlphaFunc = dllAlphaFunc; + qglAreTexturesResident = dllAreTexturesResident; + qglArrayElement = dllArrayElement; + qglBegin = dllBegin; + qglBindTexture = dllBindTexture; + qglBitmap = dllBitmap; + qglBlendFunc = dllBlendFunc; + qglCallList = dllCallList; + qglCallLists = dllCallLists; + qglClear = dllClear; + qglClearAccum = dllClearAccum; + qglClearColor = dllClearColor; + qglClearDepth = dllClearDepth; + qglClearIndex = dllClearIndex; + qglClearStencil = dllClearStencil; + qglClipPlane = dllClipPlane; + qglColor3b = dllColor3b; + qglColor3bv = dllColor3bv; + qglColor3d = dllColor3d; + qglColor3dv = dllColor3dv; + qglColor3f = dllColor3f; + qglColor3fv = dllColor3fv; + qglColor3i = dllColor3i; + qglColor3iv = dllColor3iv; + qglColor3s = dllColor3s; + qglColor3sv = dllColor3sv; + qglColor3ub = dllColor3ub; + qglColor3ubv = dllColor3ubv; + qglColor3ui = dllColor3ui; + qglColor3uiv = dllColor3uiv; + qglColor3us = dllColor3us; + qglColor3usv = dllColor3usv; + qglColor4b = dllColor4b; + qglColor4bv = dllColor4bv; + qglColor4d = dllColor4d; + qglColor4dv = dllColor4dv; + qglColor4f = dllColor4f; + qglColor4fv = dllColor4fv; + qglColor4i = dllColor4i; + qglColor4iv = dllColor4iv; + qglColor4s = dllColor4s; + qglColor4sv = dllColor4sv; + qglColor4ub = dllColor4ub; + qglColor4ubv = dllColor4ubv; + qglColor4ui = dllColor4ui; + qglColor4uiv = dllColor4uiv; + qglColor4us = dllColor4us; + qglColor4usv = dllColor4usv; + qglColorMask = dllColorMask; + qglColorMaterial = dllColorMaterial; + qglColorPointer = dllColorPointer; + qglCopyPixels = dllCopyPixels; + qglCopyTexImage1D = dllCopyTexImage1D; + qglCopyTexImage2D = dllCopyTexImage2D; + qglCopyTexSubImage1D = dllCopyTexSubImage1D; + qglCopyTexSubImage2D = dllCopyTexSubImage2D; + qglCullFace = dllCullFace; + qglDeleteLists = dllDeleteLists ; + qglDeleteTextures = dllDeleteTextures ; + qglDepthFunc = dllDepthFunc ; + qglDepthMask = dllDepthMask ; + qglDepthRange = dllDepthRange ; + qglDisable = dllDisable ; + qglDisableClientState = dllDisableClientState ; + qglDrawArrays = dllDrawArrays ; + qglDrawBuffer = dllDrawBuffer ; + qglDrawElements = dllDrawElements ; + qglDrawPixels = dllDrawPixels ; + qglEdgeFlag = dllEdgeFlag ; + qglEdgeFlagPointer = dllEdgeFlagPointer ; + qglEdgeFlagv = dllEdgeFlagv ; + qglEnable = dllEnable ; + qglEnableClientState = dllEnableClientState ; + qglEnd = dllEnd ; + qglEndList = dllEndList ; + qglEvalCoord1d = dllEvalCoord1d ; + qglEvalCoord1dv = dllEvalCoord1dv ; + qglEvalCoord1f = dllEvalCoord1f ; + qglEvalCoord1fv = dllEvalCoord1fv ; + qglEvalCoord2d = dllEvalCoord2d ; + qglEvalCoord2dv = dllEvalCoord2dv ; + qglEvalCoord2f = dllEvalCoord2f ; + qglEvalCoord2fv = dllEvalCoord2fv ; + qglEvalMesh1 = dllEvalMesh1 ; + qglEvalMesh2 = dllEvalMesh2 ; + qglEvalPoint1 = dllEvalPoint1 ; + qglEvalPoint2 = dllEvalPoint2 ; + qglFeedbackBuffer = dllFeedbackBuffer ; + qglFinish = dllFinish ; + qglFlush = dllFlush ; + qglFogf = dllFogf ; + qglFogfv = dllFogfv ; + qglFogi = dllFogi ; + qglFogiv = dllFogiv ; + qglFrontFace = dllFrontFace ; + qglFrustum = dllFrustum ; + qglGenLists = dllGenLists ; + qglGenTextures = dllGenTextures ; + qglGetBooleanv = dllGetBooleanv ; + qglGetClipPlane = dllGetClipPlane ; + qglGetDoublev = dllGetDoublev ; + qglGetError = dllGetError ; + qglGetFloatv = dllGetFloatv ; + qglGetIntegerv = dllGetIntegerv ; + qglGetLightfv = dllGetLightfv ; + qglGetLightiv = dllGetLightiv ; + qglGetMapdv = dllGetMapdv ; + qglGetMapfv = dllGetMapfv ; + qglGetMapiv = dllGetMapiv ; + qglGetMaterialfv = dllGetMaterialfv ; + qglGetMaterialiv = dllGetMaterialiv ; + qglGetPixelMapfv = dllGetPixelMapfv ; + qglGetPixelMapuiv = dllGetPixelMapuiv ; + qglGetPixelMapusv = dllGetPixelMapusv ; + qglGetPointerv = dllGetPointerv ; + qglGetPolygonStipple = dllGetPolygonStipple ; + qglGetString = dllGetString ; + qglGetTexEnvfv = dllGetTexEnvfv ; + qglGetTexEnviv = dllGetTexEnviv ; + qglGetTexGendv = dllGetTexGendv ; + qglGetTexGenfv = dllGetTexGenfv ; + qglGetTexGeniv = dllGetTexGeniv ; + qglGetTexImage = dllGetTexImage ; + qglGetTexLevelParameterfv = dllGetTexLevelParameterfv ; + qglGetTexLevelParameteriv = dllGetTexLevelParameteriv ; + qglGetTexParameterfv = dllGetTexParameterfv ; + qglGetTexParameteriv = dllGetTexParameteriv ; + qglHint = dllHint ; + qglIndexMask = dllIndexMask ; + qglIndexPointer = dllIndexPointer ; + qglIndexd = dllIndexd ; + qglIndexdv = dllIndexdv ; + qglIndexf = dllIndexf ; + qglIndexfv = dllIndexfv ; + qglIndexi = dllIndexi ; + qglIndexiv = dllIndexiv ; + qglIndexs = dllIndexs ; + qglIndexsv = dllIndexsv ; + qglIndexub = dllIndexub ; + qglIndexubv = dllIndexubv ; + qglInitNames = dllInitNames ; + qglInterleavedArrays = dllInterleavedArrays ; + qglIsEnabled = dllIsEnabled ; + qglIsList = dllIsList ; + qglIsTexture = dllIsTexture ; + qglLightModelf = dllLightModelf ; + qglLightModelfv = dllLightModelfv ; + qglLightModeli = dllLightModeli ; + qglLightModeliv = dllLightModeliv ; + qglLightf = dllLightf ; + qglLightfv = dllLightfv ; + qglLighti = dllLighti ; + qglLightiv = dllLightiv ; + qglLineStipple = dllLineStipple ; + qglLineWidth = dllLineWidth ; + qglListBase = dllListBase ; + qglLoadIdentity = dllLoadIdentity ; + qglLoadMatrixd = dllLoadMatrixd ; + qglLoadMatrixf = dllLoadMatrixf ; + qglLoadName = dllLoadName ; + qglLogicOp = dllLogicOp ; + qglMap1d = dllMap1d ; + qglMap1f = dllMap1f ; + qglMap2d = dllMap2d ; + qglMap2f = dllMap2f ; + qglMapGrid1d = dllMapGrid1d ; + qglMapGrid1f = dllMapGrid1f ; + qglMapGrid2d = dllMapGrid2d ; + qglMapGrid2f = dllMapGrid2f ; + qglMaterialf = dllMaterialf ; + qglMaterialfv = dllMaterialfv ; + qglMateriali = dllMateriali ; + qglMaterialiv = dllMaterialiv ; + qglMatrixMode = dllMatrixMode ; + qglMultMatrixd = dllMultMatrixd ; + qglMultMatrixf = dllMultMatrixf ; + qglNewList = dllNewList ; + qglNormal3b = dllNormal3b ; + qglNormal3bv = dllNormal3bv ; + qglNormal3d = dllNormal3d ; + qglNormal3dv = dllNormal3dv ; + qglNormal3f = dllNormal3f ; + qglNormal3fv = dllNormal3fv ; + qglNormal3i = dllNormal3i ; + qglNormal3iv = dllNormal3iv ; + qglNormal3s = dllNormal3s ; + qglNormal3sv = dllNormal3sv ; + qglNormalPointer = dllNormalPointer ; + qglOrtho = dllOrtho ; + qglPassThrough = dllPassThrough ; + qglPixelMapfv = dllPixelMapfv ; + qglPixelMapuiv = dllPixelMapuiv ; + qglPixelMapusv = dllPixelMapusv ; + qglPixelStoref = dllPixelStoref ; + qglPixelStorei = dllPixelStorei ; + qglPixelTransferf = dllPixelTransferf ; + qglPixelTransferi = dllPixelTransferi ; + qglPixelZoom = dllPixelZoom ; + qglPointSize = dllPointSize ; + qglPolygonMode = dllPolygonMode ; + qglPolygonOffset = dllPolygonOffset ; + qglPolygonStipple = dllPolygonStipple ; + qglPopAttrib = dllPopAttrib ; + qglPopClientAttrib = dllPopClientAttrib ; + qglPopMatrix = dllPopMatrix ; + qglPopName = dllPopName ; + qglPrioritizeTextures = dllPrioritizeTextures ; + qglPushAttrib = dllPushAttrib ; + qglPushClientAttrib = dllPushClientAttrib ; + qglPushMatrix = dllPushMatrix ; + qglPushName = dllPushName ; + qglRasterPos2d = dllRasterPos2d ; + qglRasterPos2dv = dllRasterPos2dv ; + qglRasterPos2f = dllRasterPos2f ; + qglRasterPos2fv = dllRasterPos2fv ; + qglRasterPos2i = dllRasterPos2i ; + qglRasterPos2iv = dllRasterPos2iv ; + qglRasterPos2s = dllRasterPos2s ; + qglRasterPos2sv = dllRasterPos2sv ; + qglRasterPos3d = dllRasterPos3d ; + qglRasterPos3dv = dllRasterPos3dv ; + qglRasterPos3f = dllRasterPos3f ; + qglRasterPos3fv = dllRasterPos3fv ; + qglRasterPos3i = dllRasterPos3i ; + qglRasterPos3iv = dllRasterPos3iv ; + qglRasterPos3s = dllRasterPos3s ; + qglRasterPos3sv = dllRasterPos3sv ; + qglRasterPos4d = dllRasterPos4d ; + qglRasterPos4dv = dllRasterPos4dv ; + qglRasterPos4f = dllRasterPos4f ; + qglRasterPos4fv = dllRasterPos4fv ; + qglRasterPos4i = dllRasterPos4i ; + qglRasterPos4iv = dllRasterPos4iv ; + qglRasterPos4s = dllRasterPos4s ; + qglRasterPos4sv = dllRasterPos4sv ; + qglReadBuffer = dllReadBuffer ; + qglReadPixels = dllReadPixels ; + qglRectd = dllRectd ; + qglRectdv = dllRectdv ; + qglRectf = dllRectf ; + qglRectfv = dllRectfv ; + qglRecti = dllRecti ; + qglRectiv = dllRectiv ; + qglRects = dllRects ; + qglRectsv = dllRectsv ; + qglRenderMode = dllRenderMode ; + qglRotated = dllRotated ; + qglRotatef = dllRotatef ; + qglScaled = dllScaled ; + qglScalef = dllScalef ; + qglScissor = dllScissor ; + qglSelectBuffer = dllSelectBuffer ; + qglShadeModel = dllShadeModel ; + qglStencilFunc = dllStencilFunc ; + qglStencilMask = dllStencilMask ; + qglStencilOp = dllStencilOp ; + qglTexCoord1d = dllTexCoord1d ; + qglTexCoord1dv = dllTexCoord1dv ; + qglTexCoord1f = dllTexCoord1f ; + qglTexCoord1fv = dllTexCoord1fv ; + qglTexCoord1i = dllTexCoord1i ; + qglTexCoord1iv = dllTexCoord1iv ; + qglTexCoord1s = dllTexCoord1s ; + qglTexCoord1sv = dllTexCoord1sv ; + qglTexCoord2d = dllTexCoord2d ; + qglTexCoord2dv = dllTexCoord2dv ; + qglTexCoord2f = dllTexCoord2f ; + qglTexCoord2fv = dllTexCoord2fv ; + qglTexCoord2i = dllTexCoord2i ; + qglTexCoord2iv = dllTexCoord2iv ; + qglTexCoord2s = dllTexCoord2s ; + qglTexCoord2sv = dllTexCoord2sv ; + qglTexCoord3d = dllTexCoord3d ; + qglTexCoord3dv = dllTexCoord3dv ; + qglTexCoord3f = dllTexCoord3f ; + qglTexCoord3fv = dllTexCoord3fv ; + qglTexCoord3i = dllTexCoord3i ; + qglTexCoord3iv = dllTexCoord3iv ; + qglTexCoord3s = dllTexCoord3s ; + qglTexCoord3sv = dllTexCoord3sv ; + qglTexCoord4d = dllTexCoord4d ; + qglTexCoord4dv = dllTexCoord4dv ; + qglTexCoord4f = dllTexCoord4f ; + qglTexCoord4fv = dllTexCoord4fv ; + qglTexCoord4i = dllTexCoord4i ; + qglTexCoord4iv = dllTexCoord4iv ; + qglTexCoord4s = dllTexCoord4s ; + qglTexCoord4sv = dllTexCoord4sv ; + qglTexCoordPointer = dllTexCoordPointer ; + qglTexEnvf = dllTexEnvf ; + qglTexEnvfv = dllTexEnvfv ; + qglTexEnvi = dllTexEnvi ; + qglTexEnviv = dllTexEnviv ; + qglTexGend = dllTexGend ; + qglTexGendv = dllTexGendv ; + qglTexGenf = dllTexGenf ; + qglTexGenfv = dllTexGenfv ; + qglTexGeni = dllTexGeni ; + qglTexGeniv = dllTexGeniv ; + qglTexImage1D = dllTexImage1D ; + qglTexImage2D = dllTexImage2D ; + qglTexParameterf = dllTexParameterf ; + qglTexParameterfv = dllTexParameterfv ; + qglTexParameteri = dllTexParameteri ; + qglTexParameteriv = dllTexParameteriv ; + qglTexSubImage1D = dllTexSubImage1D ; + qglTexSubImage2D = dllTexSubImage2D ; + qglTranslated = dllTranslated ; + qglTranslatef = dllTranslatef ; + qglVertex2d = dllVertex2d ; + qglVertex2dv = dllVertex2dv ; + qglVertex2f = dllVertex2f ; + qglVertex2fv = dllVertex2fv ; + qglVertex2i = dllVertex2i ; + qglVertex2iv = dllVertex2iv ; + qglVertex2s = dllVertex2s ; + qglVertex2sv = dllVertex2sv ; + qglVertex3d = dllVertex3d ; + qglVertex3dv = dllVertex3dv ; + qglVertex3f = dllVertex3f ; + qglVertex3fv = dllVertex3fv ; + qglVertex3i = dllVertex3i ; + qglVertex3iv = dllVertex3iv ; + qglVertex3s = dllVertex3s ; + qglVertex3sv = dllVertex3sv ; + qglVertex4d = dllVertex4d ; + qglVertex4dv = dllVertex4dv ; + qglVertex4f = dllVertex4f ; + qglVertex4fv = dllVertex4fv ; + qglVertex4i = dllVertex4i ; + qglVertex4iv = dllVertex4iv ; + qglVertex4s = dllVertex4s ; + qglVertex4sv = dllVertex4sv ; + qglVertexPointer = dllVertexPointer ; + qglViewport = dllViewport ; + } +} + +#pragma warning (default : 4113 4133 4047 ) + + + diff --git a/code/win32/win_shared.c b/code/win32/win_shared.c index 996d6d3..012a291 100755 --- a/code/win32/win_shared.c +++ b/code/win32/win_shared.c @@ -1,306 +1,306 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - -#include "../game/q_shared.h" -#include "../qcommon/qcommon.h" -#include "win_local.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* -================ -Sys_Milliseconds -================ -*/ -int sys_timeBase; -int Sys_Milliseconds (void) -{ - int sys_curtime; - static qboolean initialized = qfalse; - - if (!initialized) { - sys_timeBase = timeGetTime(); - initialized = qtrue; - } - sys_curtime = timeGetTime() - sys_timeBase; - - return sys_curtime; -} - -/* -================ -Sys_SnapVector -================ -*/ -long fastftol( float f ) { - static int tmp; - __asm fld f - __asm fistp tmp - __asm mov eax, tmp -} - -void Sys_SnapVector( float *v ) -{ - int i; - float f; - - f = *v; - __asm fld f; - __asm fistp i; - *v = i; - v++; - f = *v; - __asm fld f; - __asm fistp i; - *v = i; - v++; - f = *v; - __asm fld f; - __asm fistp i; - *v = i; - /* - *v = fastftol(*v); - v++; - *v = fastftol(*v); - v++; - *v = fastftol(*v); - */ -} - - -/* -** -** Disable all optimizations temporarily so this code works correctly! -** -*/ -#pragma optimize( "", off ) - -/* -** -------------------------------------------------------------------------------- -** -** PROCESSOR STUFF -** -** -------------------------------------------------------------------------------- -*/ -static void CPUID( int func, unsigned regs[4] ) -{ - unsigned regEAX, regEBX, regECX, regEDX; - -#ifndef __VECTORC - __asm mov eax, func - __asm __emit 00fh - __asm __emit 0a2h - __asm mov regEAX, eax - __asm mov regEBX, ebx - __asm mov regECX, ecx - __asm mov regEDX, edx - - regs[0] = regEAX; - regs[1] = regEBX; - regs[2] = regECX; - regs[3] = regEDX; -#else - regs[0] = 0; - regs[1] = 0; - regs[2] = 0; - regs[3] = 0; -#endif -} - -static int IsPentium( void ) -{ - __asm - { - pushfd // save eflags - pop eax - test eax, 0x00200000 // check ID bit - jz set21 // bit 21 is not set, so jump to set_21 - and eax, 0xffdfffff // clear bit 21 - push eax // save new value in register - popfd // store new value in flags - pushfd - pop eax - test eax, 0x00200000 // check ID bit - jz good - jmp err // cpuid not supported -set21: - or eax, 0x00200000 // set ID bit - push eax // store new value - popfd // store new value in EFLAGS - pushfd - pop eax - test eax, 0x00200000 // if bit 21 is on - jnz good - jmp err - } - -err: - return qfalse; -good: - return qtrue; -} - -static int Is3DNOW( void ) -{ - unsigned regs[4]; - char pstring[16]; - char processorString[13]; - - // get name of processor - CPUID( 0, ( unsigned int * ) pstring ); - processorString[0] = pstring[4]; - processorString[1] = pstring[5]; - processorString[2] = pstring[6]; - processorString[3] = pstring[7]; - processorString[4] = pstring[12]; - processorString[5] = pstring[13]; - processorString[6] = pstring[14]; - processorString[7] = pstring[15]; - processorString[8] = pstring[8]; - processorString[9] = pstring[9]; - processorString[10] = pstring[10]; - processorString[11] = pstring[11]; - processorString[12] = 0; - -// REMOVED because you can have 3DNow! on non-AMD systems -// if ( strcmp( processorString, "AuthenticAMD" ) ) -// return qfalse; - - // check AMD-specific functions - CPUID( 0x80000000, regs ); - if ( regs[0] < 0x80000000 ) - return qfalse; - - // bit 31 of EDX denotes 3DNOW! support - CPUID( 0x80000001, regs ); - if ( regs[3] & ( 1 << 31 ) ) - return qtrue; - - return qfalse; -} - -static int IsKNI( void ) -{ - unsigned regs[4]; - - // get CPU feature bits - CPUID( 1, regs ); - - // bit 25 of EDX denotes KNI existence - if ( regs[3] & ( 1 << 25 ) ) - return qtrue; - - return qfalse; -} - -static int IsMMX( void ) -{ - unsigned regs[4]; - - // get CPU feature bits - CPUID( 1, regs ); - - // bit 23 of EDX denotes MMX existence - if ( regs[3] & ( 1 << 23 ) ) - return qtrue; - return qfalse; -} - -int Sys_GetProcessorId( void ) -{ -#if defined _M_ALPHA - return CPUID_AXP; -#elif !defined _M_IX86 - return CPUID_GENERIC; -#else - - // verify we're at least a Pentium or 486 w/ CPUID support - if ( !IsPentium() ) - return CPUID_INTEL_UNSUPPORTED; - - // check for MMX - if ( !IsMMX() ) - { - // Pentium or PPro - return CPUID_INTEL_PENTIUM; - } - - // see if we're an AMD 3DNOW! processor - if ( Is3DNOW() ) - { - return CPUID_AMD_3DNOW; - } - - // see if we're an Intel Katmai - if ( IsKNI() ) - { - return CPUID_INTEL_KATMAI; - } - - // by default we're functionally a vanilla Pentium/MMX or P2/MMX - return CPUID_INTEL_MMX; - -#endif -} - -/* -** -** Re-enable optimizations back to what they were -** -*/ -#pragma optimize( "", on ) - -//============================================ - -char *Sys_GetCurrentUser( void ) -{ - static char s_userName[1024]; - unsigned long size = sizeof( s_userName ); - - - if ( !GetUserName( s_userName, &size ) ) - strcpy( s_userName, "player" ); - - if ( !s_userName[0] ) - { - strcpy( s_userName, "player" ); - } - - return s_userName; -} - -char *Sys_DefaultHomePath(void) { - return NULL; -} - -char *Sys_DefaultInstallPath(void) -{ - return Sys_Cwd(); -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "../game/q_shared.h" +#include "../qcommon/qcommon.h" +#include "win_local.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +================ +Sys_Milliseconds +================ +*/ +int sys_timeBase; +int Sys_Milliseconds (void) +{ + int sys_curtime; + static qboolean initialized = qfalse; + + if (!initialized) { + sys_timeBase = timeGetTime(); + initialized = qtrue; + } + sys_curtime = timeGetTime() - sys_timeBase; + + return sys_curtime; +} + +/* +================ +Sys_SnapVector +================ +*/ +long fastftol( float f ) { + static int tmp; + __asm fld f + __asm fistp tmp + __asm mov eax, tmp +} + +void Sys_SnapVector( float *v ) +{ + int i; + float f; + + f = *v; + __asm fld f; + __asm fistp i; + *v = i; + v++; + f = *v; + __asm fld f; + __asm fistp i; + *v = i; + v++; + f = *v; + __asm fld f; + __asm fistp i; + *v = i; + /* + *v = fastftol(*v); + v++; + *v = fastftol(*v); + v++; + *v = fastftol(*v); + */ +} + + +/* +** +** Disable all optimizations temporarily so this code works correctly! +** +*/ +#pragma optimize( "", off ) + +/* +** -------------------------------------------------------------------------------- +** +** PROCESSOR STUFF +** +** -------------------------------------------------------------------------------- +*/ +static void CPUID( int func, unsigned regs[4] ) +{ + unsigned regEAX, regEBX, regECX, regEDX; + +#ifndef __VECTORC + __asm mov eax, func + __asm __emit 00fh + __asm __emit 0a2h + __asm mov regEAX, eax + __asm mov regEBX, ebx + __asm mov regECX, ecx + __asm mov regEDX, edx + + regs[0] = regEAX; + regs[1] = regEBX; + regs[2] = regECX; + regs[3] = regEDX; +#else + regs[0] = 0; + regs[1] = 0; + regs[2] = 0; + regs[3] = 0; +#endif +} + +static int IsPentium( void ) +{ + __asm + { + pushfd // save eflags + pop eax + test eax, 0x00200000 // check ID bit + jz set21 // bit 21 is not set, so jump to set_21 + and eax, 0xffdfffff // clear bit 21 + push eax // save new value in register + popfd // store new value in flags + pushfd + pop eax + test eax, 0x00200000 // check ID bit + jz good + jmp err // cpuid not supported +set21: + or eax, 0x00200000 // set ID bit + push eax // store new value + popfd // store new value in EFLAGS + pushfd + pop eax + test eax, 0x00200000 // if bit 21 is on + jnz good + jmp err + } + +err: + return qfalse; +good: + return qtrue; +} + +static int Is3DNOW( void ) +{ + unsigned regs[4]; + char pstring[16]; + char processorString[13]; + + // get name of processor + CPUID( 0, ( unsigned int * ) pstring ); + processorString[0] = pstring[4]; + processorString[1] = pstring[5]; + processorString[2] = pstring[6]; + processorString[3] = pstring[7]; + processorString[4] = pstring[12]; + processorString[5] = pstring[13]; + processorString[6] = pstring[14]; + processorString[7] = pstring[15]; + processorString[8] = pstring[8]; + processorString[9] = pstring[9]; + processorString[10] = pstring[10]; + processorString[11] = pstring[11]; + processorString[12] = 0; + +// REMOVED because you can have 3DNow! on non-AMD systems +// if ( strcmp( processorString, "AuthenticAMD" ) ) +// return qfalse; + + // check AMD-specific functions + CPUID( 0x80000000, regs ); + if ( regs[0] < 0x80000000 ) + return qfalse; + + // bit 31 of EDX denotes 3DNOW! support + CPUID( 0x80000001, regs ); + if ( regs[3] & ( 1 << 31 ) ) + return qtrue; + + return qfalse; +} + +static int IsKNI( void ) +{ + unsigned regs[4]; + + // get CPU feature bits + CPUID( 1, regs ); + + // bit 25 of EDX denotes KNI existence + if ( regs[3] & ( 1 << 25 ) ) + return qtrue; + + return qfalse; +} + +static int IsMMX( void ) +{ + unsigned regs[4]; + + // get CPU feature bits + CPUID( 1, regs ); + + // bit 23 of EDX denotes MMX existence + if ( regs[3] & ( 1 << 23 ) ) + return qtrue; + return qfalse; +} + +int Sys_GetProcessorId( void ) +{ +#if defined _M_ALPHA + return CPUID_AXP; +#elif !defined _M_IX86 + return CPUID_GENERIC; +#else + + // verify we're at least a Pentium or 486 w/ CPUID support + if ( !IsPentium() ) + return CPUID_INTEL_UNSUPPORTED; + + // check for MMX + if ( !IsMMX() ) + { + // Pentium or PPro + return CPUID_INTEL_PENTIUM; + } + + // see if we're an AMD 3DNOW! processor + if ( Is3DNOW() ) + { + return CPUID_AMD_3DNOW; + } + + // see if we're an Intel Katmai + if ( IsKNI() ) + { + return CPUID_INTEL_KATMAI; + } + + // by default we're functionally a vanilla Pentium/MMX or P2/MMX + return CPUID_INTEL_MMX; + +#endif +} + +/* +** +** Re-enable optimizations back to what they were +** +*/ +#pragma optimize( "", on ) + +//============================================ + +char *Sys_GetCurrentUser( void ) +{ + static char s_userName[1024]; + unsigned long size = sizeof( s_userName ); + + + if ( !GetUserName( s_userName, &size ) ) + strcpy( s_userName, "player" ); + + if ( !s_userName[0] ) + { + strcpy( s_userName, "player" ); + } + + return s_userName; +} + +char *Sys_DefaultHomePath(void) { + return NULL; +} + +char *Sys_DefaultInstallPath(void) +{ + return Sys_Cwd(); +} + diff --git a/code/win32/win_snd.c b/code/win32/win_snd.c index 224d06d..084ed44 100755 --- a/code/win32/win_snd.c +++ b/code/win32/win_snd.c @@ -1,388 +1,388 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -#include - -#include "../client/snd_local.h" -#include "win_local.h" - -HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter); -#define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c) - -#define SECONDARY_BUFFER_SIZE 0x10000 - - -static qboolean dsound_init; -static int sample16; -static DWORD gSndBufSize; -static DWORD locksize; -static LPDIRECTSOUND pDS; -static LPDIRECTSOUNDBUFFER pDSBuf, pDSPBuf; -static HINSTANCE hInstDS; - - -static const char *DSoundError( int error ) { - switch ( error ) { - case DSERR_BUFFERLOST: - return "DSERR_BUFFERLOST"; - case DSERR_INVALIDCALL: - return "DSERR_INVALIDCALLS"; - case DSERR_INVALIDPARAM: - return "DSERR_INVALIDPARAM"; - case DSERR_PRIOLEVELNEEDED: - return "DSERR_PRIOLEVELNEEDED"; - } - - return "unknown"; -} - -/* -================== -SNDDMA_Shutdown -================== -*/ -void SNDDMA_Shutdown( void ) { - Com_DPrintf( "Shutting down sound system\n" ); - - if ( pDS ) { - Com_DPrintf( "Destroying DS buffers\n" ); - if ( pDS ) - { - Com_DPrintf( "...setting NORMAL coop level\n" ); - pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ); - } - - if ( pDSBuf ) - { - Com_DPrintf( "...stopping and releasing sound buffer\n" ); - pDSBuf->lpVtbl->Stop( pDSBuf ); - pDSBuf->lpVtbl->Release( pDSBuf ); - } - - // only release primary buffer if it's not also the mixing buffer we just released - if ( pDSPBuf && ( pDSBuf != pDSPBuf ) ) - { - Com_DPrintf( "...releasing primary buffer\n" ); - pDSPBuf->lpVtbl->Release( pDSPBuf ); - } - pDSBuf = NULL; - pDSPBuf = NULL; - - dma.buffer = NULL; - - Com_DPrintf( "...releasing DS object\n" ); - pDS->lpVtbl->Release( pDS ); - } - - if ( hInstDS ) { - Com_DPrintf( "...freeing DSOUND.DLL\n" ); - FreeLibrary( hInstDS ); - hInstDS = NULL; - } - - pDS = NULL; - pDSBuf = NULL; - pDSPBuf = NULL; - dsound_init = qfalse; - memset ((void *)&dma, 0, sizeof (dma)); - CoUninitialize( ); -} - -/* -================== -SNDDMA_Init - -Initialize direct sound -Returns false if failed -================== -*/ -qboolean SNDDMA_Init(void) { - - memset ((void *)&dma, 0, sizeof (dma)); - dsound_init = 0; - - CoInitialize(NULL); - - if ( !SNDDMA_InitDS () ) { - return qfalse; - } - - dsound_init = qtrue; - - Com_DPrintf("Completed successfully\n" ); - - return qtrue; -} - -#undef DEFINE_GUID - -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - EXTERN_C const GUID name \ - = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } - -// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} -DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} -DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); - -DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); -DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - - -int SNDDMA_InitDS () -{ - HRESULT hresult; - DSBUFFERDESC dsbuf; - DSBCAPS dsbcaps; - WAVEFORMATEX format; - int use8; - - Com_Printf( "Initializing DirectSound\n"); - - use8 = 1; - // Create IDirectSound using the primary sound device - if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void **)&pDS))) { - use8 = 0; - if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void **)&pDS))) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - } - - hresult = pDS->lpVtbl->Initialize( pDS, NULL); - - Com_DPrintf( "ok\n" ); - - Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); - - if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("failed\n"); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf("ok\n" ); - - - // create the secondary buffer we'll actually work with - dma.channels = 2; - dma.samplebits = 16; - -// if (s_khz->integer == 44) -// dma.speed = 44100; -// else if (s_khz->integer == 22) -// dma.speed = 22050; -// else -// dma.speed = 11025; - - dma.speed = 22050; - memset (&format, 0, sizeof(format)); - format.wFormatTag = WAVE_FORMAT_PCM; - format.nChannels = dma.channels; - format.wBitsPerSample = dma.samplebits; - format.nSamplesPerSec = dma.speed; - format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; - format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; - - memset (&dsbuf, 0, sizeof(dsbuf)); - dsbuf.dwSize = sizeof(DSBUFFERDESC); - - // Micah: take advantage of 2D hardware.if available. - dsbuf.dwFlags = DSBCAPS_LOCHARDWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } - dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; - dsbuf.lpwfxFormat = &format; - - memset(&dsbcaps, 0, sizeof(dsbcaps)); - dsbcaps.dwSize = sizeof(dsbcaps); - - Com_DPrintf( "...creating secondary buffer: " ); - if (DS_OK == pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { - Com_Printf( "locked hardware. ok\n" ); - } - else { - // Couldn't get hardware, fallback to software. - dsbuf.dwFlags = DSBCAPS_LOCSOFTWARE; - if (use8) { - dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - } - if (DS_OK != pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { - Com_Printf( "failed\n" ); - SNDDMA_Shutdown (); - return qfalse; - } - Com_DPrintf( "forced to software. ok\n" ); - } - - // Make sure mixer is active - if ( DS_OK != pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING) ) { - Com_Printf ("*** Looped sound play failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - // get the returned buffer size - if ( DS_OK != pDSBuf->lpVtbl->GetCaps (pDSBuf, &dsbcaps) ) { - Com_Printf ("*** GetCaps failed ***\n"); - SNDDMA_Shutdown (); - return qfalse; - } - - gSndBufSize = dsbcaps.dwBufferBytes; - - dma.channels = format.nChannels; - dma.samplebits = format.wBitsPerSample; - dma.speed = format.nSamplesPerSec; - dma.samples = gSndBufSize/(dma.samplebits/8); - dma.submission_chunk = 1; - dma.buffer = NULL; // must be locked first - - sample16 = (dma.samplebits/8) - 1; - - SNDDMA_BeginPainting (); - if (dma.buffer) - memset(dma.buffer, 0, dma.samples * dma.samplebits/8); - SNDDMA_Submit (); - return 1; -} -/* -============== -SNDDMA_GetDMAPos - -return the current sample position (in mono samples read) -inside the recirculating dma buffer, so the mixing code will know -how many sample are required to fill it up. -=============== -*/ -int SNDDMA_GetDMAPos( void ) { - MMTIME mmtime; - int s; - DWORD dwWrite; - - if ( !dsound_init ) { - return 0; - } - - mmtime.wType = TIME_SAMPLES; - pDSBuf->lpVtbl->GetCurrentPosition(pDSBuf, &mmtime.u.sample, &dwWrite); - - s = mmtime.u.sample; - - s >>= sample16; - - s &= (dma.samples-1); - - return s; -} - -/* -============== -SNDDMA_BeginPainting - -Makes sure dma.buffer is valid -=============== -*/ -void SNDDMA_BeginPainting( void ) { - int reps; - DWORD dwSize2; - DWORD *pbuf, *pbuf2; - HRESULT hresult; - DWORD dwStatus; - - if ( !pDSBuf ) { - return; - } - - // if the buffer was lost or stopped, restore it and/or restart it - if ( pDSBuf->lpVtbl->GetStatus (pDSBuf, &dwStatus) != DS_OK ) { - Com_Printf ("Couldn't get sound buffer status\n"); - } - - if (dwStatus & DSBSTATUS_BUFFERLOST) - pDSBuf->lpVtbl->Restore (pDSBuf); - - if (!(dwStatus & DSBSTATUS_PLAYING)) - pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); - - // lock the dsound buffer - - reps = 0; - dma.buffer = NULL; - - while ((hresult = pDSBuf->lpVtbl->Lock(pDSBuf, 0, gSndBufSize, &pbuf, &locksize, - &pbuf2, &dwSize2, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Com_Printf( "SNDDMA_BeginPainting: Lock failed with error '%s'\n", DSoundError( hresult ) ); - S_Shutdown (); - return; - } - else - { - pDSBuf->lpVtbl->Restore( pDSBuf ); - } - - if (++reps > 2) - return; - } - dma.buffer = (unsigned char *)pbuf; -} - -/* -============== -SNDDMA_Submit - -Send sound to device if buffer isn't really the dma buffer -Also unlocks the dsound buffer -=============== -*/ -void SNDDMA_Submit( void ) { - // unlock the dsound buffer - if ( pDSBuf ) { - pDSBuf->lpVtbl->Unlock(pDSBuf, dma.buffer, locksize, NULL, 0); - } -} - - -/* -================= -SNDDMA_Activate - -When we change windows we need to do this -================= -*/ -void SNDDMA_Activate( void ) { - if ( !pDS ) { - return; - } - - if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { - Com_Printf ("sound SetCooperativeLevel failed\n"); - SNDDMA_Shutdown (); - } -} - - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +#include + +#include "../client/snd_local.h" +#include "win_local.h" + +HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter); +#define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c) + +#define SECONDARY_BUFFER_SIZE 0x10000 + + +static qboolean dsound_init; +static int sample16; +static DWORD gSndBufSize; +static DWORD locksize; +static LPDIRECTSOUND pDS; +static LPDIRECTSOUNDBUFFER pDSBuf, pDSPBuf; +static HINSTANCE hInstDS; + + +static const char *DSoundError( int error ) { + switch ( error ) { + case DSERR_BUFFERLOST: + return "DSERR_BUFFERLOST"; + case DSERR_INVALIDCALL: + return "DSERR_INVALIDCALLS"; + case DSERR_INVALIDPARAM: + return "DSERR_INVALIDPARAM"; + case DSERR_PRIOLEVELNEEDED: + return "DSERR_PRIOLEVELNEEDED"; + } + + return "unknown"; +} + +/* +================== +SNDDMA_Shutdown +================== +*/ +void SNDDMA_Shutdown( void ) { + Com_DPrintf( "Shutting down sound system\n" ); + + if ( pDS ) { + Com_DPrintf( "Destroying DS buffers\n" ); + if ( pDS ) + { + Com_DPrintf( "...setting NORMAL coop level\n" ); + pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ); + } + + if ( pDSBuf ) + { + Com_DPrintf( "...stopping and releasing sound buffer\n" ); + pDSBuf->lpVtbl->Stop( pDSBuf ); + pDSBuf->lpVtbl->Release( pDSBuf ); + } + + // only release primary buffer if it's not also the mixing buffer we just released + if ( pDSPBuf && ( pDSBuf != pDSPBuf ) ) + { + Com_DPrintf( "...releasing primary buffer\n" ); + pDSPBuf->lpVtbl->Release( pDSPBuf ); + } + pDSBuf = NULL; + pDSPBuf = NULL; + + dma.buffer = NULL; + + Com_DPrintf( "...releasing DS object\n" ); + pDS->lpVtbl->Release( pDS ); + } + + if ( hInstDS ) { + Com_DPrintf( "...freeing DSOUND.DLL\n" ); + FreeLibrary( hInstDS ); + hInstDS = NULL; + } + + pDS = NULL; + pDSBuf = NULL; + pDSPBuf = NULL; + dsound_init = qfalse; + memset ((void *)&dma, 0, sizeof (dma)); + CoUninitialize( ); +} + +/* +================== +SNDDMA_Init + +Initialize direct sound +Returns false if failed +================== +*/ +qboolean SNDDMA_Init(void) { + + memset ((void *)&dma, 0, sizeof (dma)); + dsound_init = 0; + + CoInitialize(NULL); + + if ( !SNDDMA_InitDS () ) { + return qfalse; + } + + dsound_init = qtrue; + + Com_DPrintf("Completed successfully\n" ); + + return qtrue; +} + +#undef DEFINE_GUID + +#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + EXTERN_C const GUID name \ + = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } + +// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} +DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); + +// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} +DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); + +DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); +DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); + + +int SNDDMA_InitDS () +{ + HRESULT hresult; + DSBUFFERDESC dsbuf; + DSBCAPS dsbcaps; + WAVEFORMATEX format; + int use8; + + Com_Printf( "Initializing DirectSound\n"); + + use8 = 1; + // Create IDirectSound using the primary sound device + if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void **)&pDS))) { + use8 = 0; + if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void **)&pDS))) { + Com_Printf ("failed\n"); + SNDDMA_Shutdown (); + return qfalse; + } + } + + hresult = pDS->lpVtbl->Initialize( pDS, NULL); + + Com_DPrintf( "ok\n" ); + + Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); + + if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { + Com_Printf ("failed\n"); + SNDDMA_Shutdown (); + return qfalse; + } + Com_DPrintf("ok\n" ); + + + // create the secondary buffer we'll actually work with + dma.channels = 2; + dma.samplebits = 16; + +// if (s_khz->integer == 44) +// dma.speed = 44100; +// else if (s_khz->integer == 22) +// dma.speed = 22050; +// else +// dma.speed = 11025; + + dma.speed = 22050; + memset (&format, 0, sizeof(format)); + format.wFormatTag = WAVE_FORMAT_PCM; + format.nChannels = dma.channels; + format.wBitsPerSample = dma.samplebits; + format.nSamplesPerSec = dma.speed; + format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; + format.cbSize = 0; + format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; + + memset (&dsbuf, 0, sizeof(dsbuf)); + dsbuf.dwSize = sizeof(DSBUFFERDESC); + + // Micah: take advantage of 2D hardware.if available. + dsbuf.dwFlags = DSBCAPS_LOCHARDWARE; + if (use8) { + dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; + } + dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; + dsbuf.lpwfxFormat = &format; + + memset(&dsbcaps, 0, sizeof(dsbcaps)); + dsbcaps.dwSize = sizeof(dsbcaps); + + Com_DPrintf( "...creating secondary buffer: " ); + if (DS_OK == pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { + Com_Printf( "locked hardware. ok\n" ); + } + else { + // Couldn't get hardware, fallback to software. + dsbuf.dwFlags = DSBCAPS_LOCSOFTWARE; + if (use8) { + dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; + } + if (DS_OK != pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { + Com_Printf( "failed\n" ); + SNDDMA_Shutdown (); + return qfalse; + } + Com_DPrintf( "forced to software. ok\n" ); + } + + // Make sure mixer is active + if ( DS_OK != pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING) ) { + Com_Printf ("*** Looped sound play failed ***\n"); + SNDDMA_Shutdown (); + return qfalse; + } + + // get the returned buffer size + if ( DS_OK != pDSBuf->lpVtbl->GetCaps (pDSBuf, &dsbcaps) ) { + Com_Printf ("*** GetCaps failed ***\n"); + SNDDMA_Shutdown (); + return qfalse; + } + + gSndBufSize = dsbcaps.dwBufferBytes; + + dma.channels = format.nChannels; + dma.samplebits = format.wBitsPerSample; + dma.speed = format.nSamplesPerSec; + dma.samples = gSndBufSize/(dma.samplebits/8); + dma.submission_chunk = 1; + dma.buffer = NULL; // must be locked first + + sample16 = (dma.samplebits/8) - 1; + + SNDDMA_BeginPainting (); + if (dma.buffer) + memset(dma.buffer, 0, dma.samples * dma.samplebits/8); + SNDDMA_Submit (); + return 1; +} +/* +============== +SNDDMA_GetDMAPos + +return the current sample position (in mono samples read) +inside the recirculating dma buffer, so the mixing code will know +how many sample are required to fill it up. +=============== +*/ +int SNDDMA_GetDMAPos( void ) { + MMTIME mmtime; + int s; + DWORD dwWrite; + + if ( !dsound_init ) { + return 0; + } + + mmtime.wType = TIME_SAMPLES; + pDSBuf->lpVtbl->GetCurrentPosition(pDSBuf, &mmtime.u.sample, &dwWrite); + + s = mmtime.u.sample; + + s >>= sample16; + + s &= (dma.samples-1); + + return s; +} + +/* +============== +SNDDMA_BeginPainting + +Makes sure dma.buffer is valid +=============== +*/ +void SNDDMA_BeginPainting( void ) { + int reps; + DWORD dwSize2; + DWORD *pbuf, *pbuf2; + HRESULT hresult; + DWORD dwStatus; + + if ( !pDSBuf ) { + return; + } + + // if the buffer was lost or stopped, restore it and/or restart it + if ( pDSBuf->lpVtbl->GetStatus (pDSBuf, &dwStatus) != DS_OK ) { + Com_Printf ("Couldn't get sound buffer status\n"); + } + + if (dwStatus & DSBSTATUS_BUFFERLOST) + pDSBuf->lpVtbl->Restore (pDSBuf); + + if (!(dwStatus & DSBSTATUS_PLAYING)) + pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); + + // lock the dsound buffer + + reps = 0; + dma.buffer = NULL; + + while ((hresult = pDSBuf->lpVtbl->Lock(pDSBuf, 0, gSndBufSize, &pbuf, &locksize, + &pbuf2, &dwSize2, 0)) != DS_OK) + { + if (hresult != DSERR_BUFFERLOST) + { + Com_Printf( "SNDDMA_BeginPainting: Lock failed with error '%s'\n", DSoundError( hresult ) ); + S_Shutdown (); + return; + } + else + { + pDSBuf->lpVtbl->Restore( pDSBuf ); + } + + if (++reps > 2) + return; + } + dma.buffer = (unsigned char *)pbuf; +} + +/* +============== +SNDDMA_Submit + +Send sound to device if buffer isn't really the dma buffer +Also unlocks the dsound buffer +=============== +*/ +void SNDDMA_Submit( void ) { + // unlock the dsound buffer + if ( pDSBuf ) { + pDSBuf->lpVtbl->Unlock(pDSBuf, dma.buffer, locksize, NULL, 0); + } +} + + +/* +================= +SNDDMA_Activate + +When we change windows we need to do this +================= +*/ +void SNDDMA_Activate( void ) { + if ( !pDS ) { + return; + } + + if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { + Com_Printf ("sound SetCooperativeLevel failed\n"); + SNDDMA_Shutdown (); + } +} + + diff --git a/code/win32/win_syscon.c b/code/win32/win_syscon.c index 9d1e425..53b9fa5 100755 --- a/code/win32/win_syscon.c +++ b/code/win32/win_syscon.c @@ -1,596 +1,596 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ -// win_syscon.h -#include "../client/client.h" -#include "win_local.h" -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include - -#define COPY_ID 1 -#define QUIT_ID 2 -#define CLEAR_ID 3 - -#define ERRORBOX_ID 10 -#define ERRORTEXT_ID 11 - -#define EDIT_ID 100 -#define INPUT_ID 101 - -typedef struct -{ - HWND hWnd; - HWND hwndBuffer; - - HWND hwndButtonClear; - HWND hwndButtonCopy; - HWND hwndButtonQuit; - - HWND hwndErrorBox; - HWND hwndErrorText; - - HBITMAP hbmLogo; - HBITMAP hbmClearBitmap; - - HBRUSH hbrEditBackground; - HBRUSH hbrErrorBackground; - - HFONT hfBufferFont; - HFONT hfButtonFont; - - HWND hwndInputLine; - - char errorString[80]; - - char consoleText[512], returnedText[512]; - int visLevel; - qboolean quitOnClose; - int windowWidth, windowHeight; - - WNDPROC SysInputLineWndProc; - -} WinConData; - -static WinConData s_wcd; - -static LONG WINAPI ConWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - char *cmdString; - static qboolean s_timePolarity; - - switch (uMsg) - { - case WM_ACTIVATE: - if ( LOWORD( wParam ) != WA_INACTIVE ) - { - SetFocus( s_wcd.hwndInputLine ); - } - - if ( com_viewlog && ( com_dedicated && !com_dedicated->integer ) ) - { - // if the viewlog is open, check to see if it's being minimized - if ( com_viewlog->integer == 1 ) - { - if ( HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "2" ); - } - } - else if ( com_viewlog->integer == 2 ) - { - if ( !HIWORD( wParam ) ) // minimized flag - { - Cvar_Set( "viewlog", "1" ); - } - } - } - break; - - case WM_CLOSE: - if ( ( com_dedicated && com_dedicated->integer ) ) - { - cmdString = CopyString( "quit" ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); - } - else if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - Sys_ShowConsole( 0, qfalse ); - Cvar_Set( "viewlog", "0" ); - } - return 0; - case WM_CTLCOLORSTATIC: - if ( ( HWND ) lParam == s_wcd.hwndBuffer ) - { - SetBkColor( ( HDC ) wParam, RGB( 0x00, 0x00, 0xB0 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0xff, 0xff, 0x00 ) ); - -#if 0 // this draws a background in the edit box, but there are issues with this - if ( ( hdcScaled = CreateCompatibleDC( ( HDC ) wParam ) ) != 0 ) - { - if ( SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ) ) - { - StretchBlt( ( HDC ) wParam, 0, 0, 512, 384, - hdcScaled, 0, 0, 512, 384, - SRCCOPY ); - } - DeleteDC( hdcScaled ); - } -#endif - return ( long ) s_wcd.hbrEditBackground; - } - else if ( ( HWND ) lParam == s_wcd.hwndErrorBox ) - { - if ( s_timePolarity & 1 ) - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0xff, 0x0, 0x00 ) ); - } - else - { - SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); - SetTextColor( ( HDC ) wParam, RGB( 0x00, 0x0, 0x00 ) ); - } - return ( long ) s_wcd.hbrErrorBackground; - } - break; - - case WM_COMMAND: - if ( wParam == COPY_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, WM_COPY, 0, 0 ); - } - else if ( wParam == QUIT_ID ) - { - if ( s_wcd.quitOnClose ) - { - PostQuitMessage( 0 ); - } - else - { - cmdString = CopyString( "quit" ); - Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); - } - } - else if ( wParam == CLEAR_ID ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) "" ); - UpdateWindow( s_wcd.hwndBuffer ); - } - break; - case WM_CREATE: -// s_wcd.hbmLogo = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ) ); -// s_wcd.hbmClearBitmap = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP2 ) ); - s_wcd.hbrEditBackground = CreateSolidBrush( RGB( 0x00, 0x00, 0xB0 ) ); - s_wcd.hbrErrorBackground = CreateSolidBrush( RGB( 0x80, 0x80, 0x80 ) ); - SetTimer( hWnd, 1, 1000, NULL ); - break; - case WM_ERASEBKGND: -#if 0 - HDC hdcScaled; - HGDIOBJ oldObject; - -#if 1 // a single, large image - hdcScaled = CreateCompatibleDC( ( HDC ) wParam ); - assert( hdcScaled != 0 ); - - if ( hdcScaled ) - { - oldObject = SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ); - assert( oldObject != 0 ); - if ( oldObject ) - { - StretchBlt( ( HDC ) wParam, 0, 0, s_wcd.windowWidth, s_wcd.windowHeight, - hdcScaled, 0, 0, 512, 384, - SRCCOPY ); - } - DeleteDC( hdcScaled ); - hdcScaled = 0; - } -#else // a repeating brush - { - HBRUSH hbrClearBrush; - RECT r; - - GetWindowRect( hWnd, &r ); - - r.bottom = r.bottom - r.top + 1; - r.right = r.right - r.left + 1; - r.top = 0; - r.left = 0; - - hbrClearBrush = CreatePatternBrush( s_wcd.hbmClearBitmap ); - - assert( hbrClearBrush != 0 ); - - if ( hbrClearBrush ) - { - FillRect( ( HDC ) wParam, &r, hbrClearBrush ); - DeleteObject( hbrClearBrush ); - } - } -#endif - return 1; -#endif - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - case WM_TIMER: - if ( wParam == 1 ) - { - s_timePolarity = !s_timePolarity; - if ( s_wcd.hwndErrorBox ) - { - InvalidateRect( s_wcd.hwndErrorBox, NULL, FALSE ); - } - } - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - -LONG WINAPI InputLineWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - char inputBuffer[1024]; - - switch ( uMsg ) - { - case WM_KILLFOCUS: - if ( ( HWND ) wParam == s_wcd.hWnd || - ( HWND ) wParam == s_wcd.hwndErrorBox ) - { - SetFocus( hWnd ); - return 0; - } - break; - - case WM_CHAR: - if ( wParam == 13 ) - { - GetWindowText( s_wcd.hwndInputLine, inputBuffer, sizeof( inputBuffer ) ); - strncat( s_wcd.consoleText, inputBuffer, sizeof( s_wcd.consoleText ) - strlen( s_wcd.consoleText ) - 5 ); - strcat( s_wcd.consoleText, "\n" ); - SetWindowText( s_wcd.hwndInputLine, "" ); - - Sys_Print( va( "]%s\n", inputBuffer ) ); - - return 0; - } - } - - return CallWindowProc( s_wcd.SysInputLineWndProc, hWnd, uMsg, wParam, lParam ); -} - -/* -** Sys_CreateConsole -*/ -void Sys_CreateConsole( void ) -{ - HDC hDC; - WNDCLASS wc; - RECT rect; - const char *DEDCLASS = "Q3 WinConsole"; - int nHeight; - int swidth, sheight; - int DEDSTYLE = WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX; - - memset( &wc, 0, sizeof( wc ) ); - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) ConWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = g_wv.hInstance; - wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = (void *)COLOR_WINDOW; - wc.lpszMenuName = 0; - wc.lpszClassName = DEDCLASS; - - if ( !RegisterClass (&wc) ) - return; - - rect.left = 0; - rect.right = 540; - rect.top = 0; - rect.bottom = 450; - AdjustWindowRect( &rect, DEDSTYLE, FALSE ); - - hDC = GetDC( GetDesktopWindow() ); - swidth = GetDeviceCaps( hDC, HORZRES ); - sheight = GetDeviceCaps( hDC, VERTRES ); - ReleaseDC( GetDesktopWindow(), hDC ); - - s_wcd.windowWidth = rect.right - rect.left + 1; - s_wcd.windowHeight = rect.bottom - rect.top + 1; - - s_wcd.hWnd = CreateWindowEx( 0, - DEDCLASS, - "Quake 3 Console", - DEDSTYLE, - ( swidth - 600 ) / 2, ( sheight - 450 ) / 2 , rect.right - rect.left + 1, rect.bottom - rect.top + 1, - NULL, - NULL, - g_wv.hInstance, - NULL ); - - if ( s_wcd.hWnd == NULL ) - { - return; - } - - // - // create fonts - // - hDC = GetDC( s_wcd.hWnd ); - nHeight = -MulDiv( 8, GetDeviceCaps( hDC, LOGPIXELSY), 72); - - s_wcd.hfBufferFont = CreateFont( nHeight, - 0, - 0, - 0, - FW_LIGHT, - 0, - 0, - 0, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_MODERN | FIXED_PITCH, - "Courier New" ); - - ReleaseDC( s_wcd.hWnd, hDC ); - - // - // create the input line - // - s_wcd.hwndInputLine = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | - ES_LEFT | ES_AUTOHSCROLL, - 6, 400, 528, 20, - s_wcd.hWnd, - ( HMENU ) INPUT_ID, // child window ID - g_wv.hInstance, NULL ); - - // - // create the buttons - // - s_wcd.hwndButtonCopy = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 5, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) COPY_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonCopy, WM_SETTEXT, 0, ( LPARAM ) "copy" ); - - s_wcd.hwndButtonClear = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 82, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) CLEAR_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonClear, WM_SETTEXT, 0, ( LPARAM ) "clear" ); - - s_wcd.hwndButtonQuit = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 462, 425, 72, 24, - s_wcd.hWnd, - ( HMENU ) QUIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndButtonQuit, WM_SETTEXT, 0, ( LPARAM ) "quit" ); - - - // - // create the scrollbuffer - // - s_wcd.hwndBuffer = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | - ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY, - 6, 40, 526, 354, - s_wcd.hWnd, - ( HMENU ) EDIT_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - - s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWL_WNDPROC, ( long ) InputLineWndProc ); - SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - - ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT); - UpdateWindow( s_wcd.hWnd ); - SetForegroundWindow( s_wcd.hWnd ); - SetFocus( s_wcd.hwndInputLine ); - - s_wcd.visLevel = 1; -} - -/* -** Sys_DestroyConsole -*/ -void Sys_DestroyConsole( void ) { - if ( s_wcd.hWnd ) { - ShowWindow( s_wcd.hWnd, SW_HIDE ); - CloseWindow( s_wcd.hWnd ); - DestroyWindow( s_wcd.hWnd ); - s_wcd.hWnd = 0; - } -} - -/* -** Sys_ShowConsole -*/ -void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) -{ - s_wcd.quitOnClose = quitOnClose; - - if ( visLevel == s_wcd.visLevel ) - { - return; - } - - s_wcd.visLevel = visLevel; - - if ( !s_wcd.hWnd ) - return; - - switch ( visLevel ) - { - case 0: - ShowWindow( s_wcd.hWnd, SW_HIDE ); - break; - case 1: - ShowWindow( s_wcd.hWnd, SW_SHOWNORMAL ); - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - break; - case 2: - ShowWindow( s_wcd.hWnd, SW_MINIMIZE ); - break; - default: - Sys_Error( "Invalid visLevel %d sent to Sys_ShowConsole\n", visLevel ); - break; - } -} - -/* -** Sys_ConsoleInput -*/ -char *Sys_ConsoleInput( void ) -{ - if ( s_wcd.consoleText[0] == 0 ) - { - return NULL; - } - - strcpy( s_wcd.returnedText, s_wcd.consoleText ); - s_wcd.consoleText[0] = 0; - - return s_wcd.returnedText; -} - -/* -** Conbuf_AppendText -*/ -void Conbuf_AppendText( const char *pMsg ) -{ -#define CONSOLE_BUFFER_SIZE 16384 - - char buffer[CONSOLE_BUFFER_SIZE*2]; - char *b = buffer; - const char *msg; - int bufLen; - int i = 0; - static unsigned long s_totalChars; - - // - // if the message is REALLY long, use just the last portion of it - // - if ( strlen( pMsg ) > CONSOLE_BUFFER_SIZE - 1 ) - { - msg = pMsg + strlen( pMsg ) - CONSOLE_BUFFER_SIZE + 1; - } - else - { - msg = pMsg; - } - - // - // copy into an intermediate buffer - // - while ( msg[i] && ( ( b - buffer ) < sizeof( buffer ) - 1 ) ) - { - if ( msg[i] == '\n' && msg[i+1] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - i++; - } - else if ( msg[i] == '\r' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( msg[i] == '\n' ) - { - b[0] = '\r'; - b[1] = '\n'; - b += 2; - } - else if ( Q_IsColorString( &msg[i] ) ) - { - i++; - } - else - { - *b= msg[i]; - b++; - } - i++; - } - *b = 0; - bufLen = b - buffer; - - s_totalChars += bufLen; - - // - // replace selection instead of appending if we're overflowing - // - if ( s_totalChars > 0x7fff ) - { - SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); - s_totalChars = bufLen; - } - - // - // put this text into the windows console - // - SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); - SendMessage( s_wcd.hwndBuffer, EM_SCROLLCARET, 0, 0 ); - SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, 0, (LPARAM) buffer ); -} - -/* -** Sys_SetErrorText -*/ -void Sys_SetErrorText( const char *buf ) -{ - Q_strncpyz( s_wcd.errorString, buf, sizeof( s_wcd.errorString ) ); - - if ( !s_wcd.hwndErrorBox ) - { - s_wcd.hwndErrorBox = CreateWindow( "static", NULL, WS_CHILD | WS_VISIBLE | SS_SUNKEN, - 6, 5, 526, 30, - s_wcd.hWnd, - ( HMENU ) ERRORBOX_ID, // child window ID - g_wv.hInstance, NULL ); - SendMessage( s_wcd.hwndErrorBox, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - SetWindowText( s_wcd.hwndErrorBox, s_wcd.errorString ); - - DestroyWindow( s_wcd.hwndInputLine ); - s_wcd.hwndInputLine = NULL; - } -} +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// win_syscon.h +#include "../client/client.h" +#include "win_local.h" +#include "resource.h" +#include +#include +#include +#include +#include +#include +#include + +#define COPY_ID 1 +#define QUIT_ID 2 +#define CLEAR_ID 3 + +#define ERRORBOX_ID 10 +#define ERRORTEXT_ID 11 + +#define EDIT_ID 100 +#define INPUT_ID 101 + +typedef struct +{ + HWND hWnd; + HWND hwndBuffer; + + HWND hwndButtonClear; + HWND hwndButtonCopy; + HWND hwndButtonQuit; + + HWND hwndErrorBox; + HWND hwndErrorText; + + HBITMAP hbmLogo; + HBITMAP hbmClearBitmap; + + HBRUSH hbrEditBackground; + HBRUSH hbrErrorBackground; + + HFONT hfBufferFont; + HFONT hfButtonFont; + + HWND hwndInputLine; + + char errorString[80]; + + char consoleText[512], returnedText[512]; + int visLevel; + qboolean quitOnClose; + int windowWidth, windowHeight; + + WNDPROC SysInputLineWndProc; + +} WinConData; + +static WinConData s_wcd; + +static LONG WINAPI ConWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + char *cmdString; + static qboolean s_timePolarity; + + switch (uMsg) + { + case WM_ACTIVATE: + if ( LOWORD( wParam ) != WA_INACTIVE ) + { + SetFocus( s_wcd.hwndInputLine ); + } + + if ( com_viewlog && ( com_dedicated && !com_dedicated->integer ) ) + { + // if the viewlog is open, check to see if it's being minimized + if ( com_viewlog->integer == 1 ) + { + if ( HIWORD( wParam ) ) // minimized flag + { + Cvar_Set( "viewlog", "2" ); + } + } + else if ( com_viewlog->integer == 2 ) + { + if ( !HIWORD( wParam ) ) // minimized flag + { + Cvar_Set( "viewlog", "1" ); + } + } + } + break; + + case WM_CLOSE: + if ( ( com_dedicated && com_dedicated->integer ) ) + { + cmdString = CopyString( "quit" ); + Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); + } + else if ( s_wcd.quitOnClose ) + { + PostQuitMessage( 0 ); + } + else + { + Sys_ShowConsole( 0, qfalse ); + Cvar_Set( "viewlog", "0" ); + } + return 0; + case WM_CTLCOLORSTATIC: + if ( ( HWND ) lParam == s_wcd.hwndBuffer ) + { + SetBkColor( ( HDC ) wParam, RGB( 0x00, 0x00, 0xB0 ) ); + SetTextColor( ( HDC ) wParam, RGB( 0xff, 0xff, 0x00 ) ); + +#if 0 // this draws a background in the edit box, but there are issues with this + if ( ( hdcScaled = CreateCompatibleDC( ( HDC ) wParam ) ) != 0 ) + { + if ( SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ) ) + { + StretchBlt( ( HDC ) wParam, 0, 0, 512, 384, + hdcScaled, 0, 0, 512, 384, + SRCCOPY ); + } + DeleteDC( hdcScaled ); + } +#endif + return ( long ) s_wcd.hbrEditBackground; + } + else if ( ( HWND ) lParam == s_wcd.hwndErrorBox ) + { + if ( s_timePolarity & 1 ) + { + SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); + SetTextColor( ( HDC ) wParam, RGB( 0xff, 0x0, 0x00 ) ); + } + else + { + SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); + SetTextColor( ( HDC ) wParam, RGB( 0x00, 0x0, 0x00 ) ); + } + return ( long ) s_wcd.hbrErrorBackground; + } + break; + + case WM_COMMAND: + if ( wParam == COPY_ID ) + { + SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); + SendMessage( s_wcd.hwndBuffer, WM_COPY, 0, 0 ); + } + else if ( wParam == QUIT_ID ) + { + if ( s_wcd.quitOnClose ) + { + PostQuitMessage( 0 ); + } + else + { + cmdString = CopyString( "quit" ); + Sys_QueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); + } + } + else if ( wParam == CLEAR_ID ) + { + SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); + SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) "" ); + UpdateWindow( s_wcd.hwndBuffer ); + } + break; + case WM_CREATE: +// s_wcd.hbmLogo = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ) ); +// s_wcd.hbmClearBitmap = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP2 ) ); + s_wcd.hbrEditBackground = CreateSolidBrush( RGB( 0x00, 0x00, 0xB0 ) ); + s_wcd.hbrErrorBackground = CreateSolidBrush( RGB( 0x80, 0x80, 0x80 ) ); + SetTimer( hWnd, 1, 1000, NULL ); + break; + case WM_ERASEBKGND: +#if 0 + HDC hdcScaled; + HGDIOBJ oldObject; + +#if 1 // a single, large image + hdcScaled = CreateCompatibleDC( ( HDC ) wParam ); + assert( hdcScaled != 0 ); + + if ( hdcScaled ) + { + oldObject = SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ); + assert( oldObject != 0 ); + if ( oldObject ) + { + StretchBlt( ( HDC ) wParam, 0, 0, s_wcd.windowWidth, s_wcd.windowHeight, + hdcScaled, 0, 0, 512, 384, + SRCCOPY ); + } + DeleteDC( hdcScaled ); + hdcScaled = 0; + } +#else // a repeating brush + { + HBRUSH hbrClearBrush; + RECT r; + + GetWindowRect( hWnd, &r ); + + r.bottom = r.bottom - r.top + 1; + r.right = r.right - r.left + 1; + r.top = 0; + r.left = 0; + + hbrClearBrush = CreatePatternBrush( s_wcd.hbmClearBitmap ); + + assert( hbrClearBrush != 0 ); + + if ( hbrClearBrush ) + { + FillRect( ( HDC ) wParam, &r, hbrClearBrush ); + DeleteObject( hbrClearBrush ); + } + } +#endif + return 1; +#endif + return DefWindowProc( hWnd, uMsg, wParam, lParam ); + case WM_TIMER: + if ( wParam == 1 ) + { + s_timePolarity = !s_timePolarity; + if ( s_wcd.hwndErrorBox ) + { + InvalidateRect( s_wcd.hwndErrorBox, NULL, FALSE ); + } + } + break; + } + + return DefWindowProc( hWnd, uMsg, wParam, lParam ); +} + +LONG WINAPI InputLineWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + char inputBuffer[1024]; + + switch ( uMsg ) + { + case WM_KILLFOCUS: + if ( ( HWND ) wParam == s_wcd.hWnd || + ( HWND ) wParam == s_wcd.hwndErrorBox ) + { + SetFocus( hWnd ); + return 0; + } + break; + + case WM_CHAR: + if ( wParam == 13 ) + { + GetWindowText( s_wcd.hwndInputLine, inputBuffer, sizeof( inputBuffer ) ); + strncat( s_wcd.consoleText, inputBuffer, sizeof( s_wcd.consoleText ) - strlen( s_wcd.consoleText ) - 5 ); + strcat( s_wcd.consoleText, "\n" ); + SetWindowText( s_wcd.hwndInputLine, "" ); + + Sys_Print( va( "]%s\n", inputBuffer ) ); + + return 0; + } + } + + return CallWindowProc( s_wcd.SysInputLineWndProc, hWnd, uMsg, wParam, lParam ); +} + +/* +** Sys_CreateConsole +*/ +void Sys_CreateConsole( void ) +{ + HDC hDC; + WNDCLASS wc; + RECT rect; + const char *DEDCLASS = "Q3 WinConsole"; + int nHeight; + int swidth, sheight; + int DEDSTYLE = WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX; + + memset( &wc, 0, sizeof( wc ) ); + + wc.style = 0; + wc.lpfnWndProc = (WNDPROC) ConWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = g_wv.hInstance; + wc.hIcon = LoadIcon( g_wv.hInstance, MAKEINTRESOURCE(IDI_ICON1)); + wc.hCursor = LoadCursor (NULL,IDC_ARROW); + wc.hbrBackground = (void *)COLOR_WINDOW; + wc.lpszMenuName = 0; + wc.lpszClassName = DEDCLASS; + + if ( !RegisterClass (&wc) ) + return; + + rect.left = 0; + rect.right = 540; + rect.top = 0; + rect.bottom = 450; + AdjustWindowRect( &rect, DEDSTYLE, FALSE ); + + hDC = GetDC( GetDesktopWindow() ); + swidth = GetDeviceCaps( hDC, HORZRES ); + sheight = GetDeviceCaps( hDC, VERTRES ); + ReleaseDC( GetDesktopWindow(), hDC ); + + s_wcd.windowWidth = rect.right - rect.left + 1; + s_wcd.windowHeight = rect.bottom - rect.top + 1; + + s_wcd.hWnd = CreateWindowEx( 0, + DEDCLASS, + "Quake 3 Console", + DEDSTYLE, + ( swidth - 600 ) / 2, ( sheight - 450 ) / 2 , rect.right - rect.left + 1, rect.bottom - rect.top + 1, + NULL, + NULL, + g_wv.hInstance, + NULL ); + + if ( s_wcd.hWnd == NULL ) + { + return; + } + + // + // create fonts + // + hDC = GetDC( s_wcd.hWnd ); + nHeight = -MulDiv( 8, GetDeviceCaps( hDC, LOGPIXELSY), 72); + + s_wcd.hfBufferFont = CreateFont( nHeight, + 0, + 0, + 0, + FW_LIGHT, + 0, + 0, + 0, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_MODERN | FIXED_PITCH, + "Courier New" ); + + ReleaseDC( s_wcd.hWnd, hDC ); + + // + // create the input line + // + s_wcd.hwndInputLine = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | + ES_LEFT | ES_AUTOHSCROLL, + 6, 400, 528, 20, + s_wcd.hWnd, + ( HMENU ) INPUT_ID, // child window ID + g_wv.hInstance, NULL ); + + // + // create the buttons + // + s_wcd.hwndButtonCopy = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, + 5, 425, 72, 24, + s_wcd.hWnd, + ( HMENU ) COPY_ID, // child window ID + g_wv.hInstance, NULL ); + SendMessage( s_wcd.hwndButtonCopy, WM_SETTEXT, 0, ( LPARAM ) "copy" ); + + s_wcd.hwndButtonClear = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, + 82, 425, 72, 24, + s_wcd.hWnd, + ( HMENU ) CLEAR_ID, // child window ID + g_wv.hInstance, NULL ); + SendMessage( s_wcd.hwndButtonClear, WM_SETTEXT, 0, ( LPARAM ) "clear" ); + + s_wcd.hwndButtonQuit = CreateWindow( "button", NULL, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, + 462, 425, 72, 24, + s_wcd.hWnd, + ( HMENU ) QUIT_ID, // child window ID + g_wv.hInstance, NULL ); + SendMessage( s_wcd.hwndButtonQuit, WM_SETTEXT, 0, ( LPARAM ) "quit" ); + + + // + // create the scrollbuffer + // + s_wcd.hwndBuffer = CreateWindow( "edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | + ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY, + 6, 40, 526, 354, + s_wcd.hWnd, + ( HMENU ) EDIT_ID, // child window ID + g_wv.hInstance, NULL ); + SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); + + s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWL_WNDPROC, ( long ) InputLineWndProc ); + SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); + + ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT); + UpdateWindow( s_wcd.hWnd ); + SetForegroundWindow( s_wcd.hWnd ); + SetFocus( s_wcd.hwndInputLine ); + + s_wcd.visLevel = 1; +} + +/* +** Sys_DestroyConsole +*/ +void Sys_DestroyConsole( void ) { + if ( s_wcd.hWnd ) { + ShowWindow( s_wcd.hWnd, SW_HIDE ); + CloseWindow( s_wcd.hWnd ); + DestroyWindow( s_wcd.hWnd ); + s_wcd.hWnd = 0; + } +} + +/* +** Sys_ShowConsole +*/ +void Sys_ShowConsole( int visLevel, qboolean quitOnClose ) +{ + s_wcd.quitOnClose = quitOnClose; + + if ( visLevel == s_wcd.visLevel ) + { + return; + } + + s_wcd.visLevel = visLevel; + + if ( !s_wcd.hWnd ) + return; + + switch ( visLevel ) + { + case 0: + ShowWindow( s_wcd.hWnd, SW_HIDE ); + break; + case 1: + ShowWindow( s_wcd.hWnd, SW_SHOWNORMAL ); + SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); + break; + case 2: + ShowWindow( s_wcd.hWnd, SW_MINIMIZE ); + break; + default: + Sys_Error( "Invalid visLevel %d sent to Sys_ShowConsole\n", visLevel ); + break; + } +} + +/* +** Sys_ConsoleInput +*/ +char *Sys_ConsoleInput( void ) +{ + if ( s_wcd.consoleText[0] == 0 ) + { + return NULL; + } + + strcpy( s_wcd.returnedText, s_wcd.consoleText ); + s_wcd.consoleText[0] = 0; + + return s_wcd.returnedText; +} + +/* +** Conbuf_AppendText +*/ +void Conbuf_AppendText( const char *pMsg ) +{ +#define CONSOLE_BUFFER_SIZE 16384 + + char buffer[CONSOLE_BUFFER_SIZE*2]; + char *b = buffer; + const char *msg; + int bufLen; + int i = 0; + static unsigned long s_totalChars; + + // + // if the message is REALLY long, use just the last portion of it + // + if ( strlen( pMsg ) > CONSOLE_BUFFER_SIZE - 1 ) + { + msg = pMsg + strlen( pMsg ) - CONSOLE_BUFFER_SIZE + 1; + } + else + { + msg = pMsg; + } + + // + // copy into an intermediate buffer + // + while ( msg[i] && ( ( b - buffer ) < sizeof( buffer ) - 1 ) ) + { + if ( msg[i] == '\n' && msg[i+1] == '\r' ) + { + b[0] = '\r'; + b[1] = '\n'; + b += 2; + i++; + } + else if ( msg[i] == '\r' ) + { + b[0] = '\r'; + b[1] = '\n'; + b += 2; + } + else if ( msg[i] == '\n' ) + { + b[0] = '\r'; + b[1] = '\n'; + b += 2; + } + else if ( Q_IsColorString( &msg[i] ) ) + { + i++; + } + else + { + *b= msg[i]; + b++; + } + i++; + } + *b = 0; + bufLen = b - buffer; + + s_totalChars += bufLen; + + // + // replace selection instead of appending if we're overflowing + // + if ( s_totalChars > 0x7fff ) + { + SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); + s_totalChars = bufLen; + } + + // + // put this text into the windows console + // + SendMessage( s_wcd.hwndBuffer, EM_LINESCROLL, 0, 0xffff ); + SendMessage( s_wcd.hwndBuffer, EM_SCROLLCARET, 0, 0 ); + SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, 0, (LPARAM) buffer ); +} + +/* +** Sys_SetErrorText +*/ +void Sys_SetErrorText( const char *buf ) +{ + Q_strncpyz( s_wcd.errorString, buf, sizeof( s_wcd.errorString ) ); + + if ( !s_wcd.hwndErrorBox ) + { + s_wcd.hwndErrorBox = CreateWindow( "static", NULL, WS_CHILD | WS_VISIBLE | SS_SUNKEN, + 6, 5, 526, 30, + s_wcd.hWnd, + ( HMENU ) ERRORBOX_ID, // child window ID + g_wv.hInstance, NULL ); + SendMessage( s_wcd.hwndErrorBox, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); + SetWindowText( s_wcd.hwndErrorBox, s_wcd.errorString ); + + DestroyWindow( s_wcd.hwndInputLine ); + s_wcd.hwndInputLine = NULL; + } +} diff --git a/code/win32/win_wndproc.c b/code/win32/win_wndproc.c index fd537ca..0ccb4a5 100755 --- a/code/win32/win_wndproc.c +++ b/code/win32/win_wndproc.c @@ -1,456 +1,456 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. - -This file is part of Quake III Arena source code. - -Quake III Arena source code 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. - -Quake III Arena source code 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 Foobar; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - -#include "../client/client.h" -#include "win_local.h" - -WinVars_t g_wv; - -#ifndef WM_MOUSEWHEEL -#define WM_MOUSEWHEEL (WM_MOUSELAST+1) // message that will be supported by the OS -#endif - -static UINT MSH_MOUSEWHEEL; - -// Console variables that we need to access from this module -cvar_t *vid_xpos; // X coordinate of window position -cvar_t *vid_ypos; // Y coordinate of window position -cvar_t *r_fullscreen; - -#define VID_NUM_MODES ( sizeof( vid_modes ) / sizeof( vid_modes[0] ) ) - -LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); - -static qboolean s_alttab_disabled; - -static void WIN_DisableAltTab( void ) -{ - if ( s_alttab_disabled ) - return; - - if ( !Q_stricmp( Cvar_VariableString( "arch" ), "winnt" ) ) - { - RegisterHotKey( 0, 0, MOD_ALT, VK_TAB ); - } - else - { - BOOL old; - - SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, &old, 0 ); - } - s_alttab_disabled = qtrue; -} - -static void WIN_EnableAltTab( void ) -{ - if ( s_alttab_disabled ) - { - if ( !Q_stricmp( Cvar_VariableString( "arch" ), "winnt" ) ) - { - UnregisterHotKey( 0, 0 ); - } - else - { - BOOL old; - - SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, &old, 0 ); - } - - s_alttab_disabled = qfalse; - } -} - -/* -================== -VID_AppActivate -================== -*/ -static void VID_AppActivate(BOOL fActive, BOOL minimize) -{ - g_wv.isMinimized = minimize; - - Com_DPrintf("VID_AppActivate: %i\n", fActive ); - - Key_ClearStates(); // FIXME!!! - - // we don't want to act like we're active if we're minimized - if (fActive && !g_wv.isMinimized ) - { - g_wv.activeApp = qtrue; - } - else - { - g_wv.activeApp = qfalse; - } - - // minimize/restore mouse-capture on demand - if (!g_wv.activeApp ) - { - IN_Activate (qfalse); - } - else - { - IN_Activate (qtrue); - } -} - -//========================================================================== - -static byte s_scantokey[128] = - { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0 , 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', K_BACKSPACE, 9, // 0 - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', 13 , K_CTRL,'a', 's', // 1 - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'' , '`', K_SHIFT,'\\', 'z', 'x', 'c', 'v', // 2 - 'b', 'n', 'm', ',', '.', '/', K_SHIFT,'*', - K_ALT,' ', K_CAPSLOCK , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 - K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE, 0 , K_HOME, - K_UPARROW,K_PGUP,K_KP_MINUS,K_LEFTARROW,K_KP_5,K_RIGHTARROW, K_KP_PLUS,K_END, //4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, - K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 -}; - -/* -======= -MapKey - -Map from windows to quake keynums -======= -*/ -static int MapKey (int key) -{ - int result; - int modified; - qboolean is_extended; - -// Com_Printf( "0x%x\n", key); - - modified = ( key >> 16 ) & 255; - - if ( modified > 127 ) - return 0; - - if ( key & ( 1 << 24 ) ) - { - is_extended = qtrue; - } - else - { - is_extended = qfalse; - } - - result = s_scantokey[modified]; - - if ( !is_extended ) - { - switch ( result ) - { - case K_HOME: - return K_KP_HOME; - case K_UPARROW: - return K_KP_UPARROW; - case K_PGUP: - return K_KP_PGUP; - case K_LEFTARROW: - return K_KP_LEFTARROW; - case K_RIGHTARROW: - return K_KP_RIGHTARROW; - case K_END: - return K_KP_END; - case K_DOWNARROW: - return K_KP_DOWNARROW; - case K_PGDN: - return K_KP_PGDN; - case K_INS: - return K_KP_INS; - case K_DEL: - return K_KP_DEL; - default: - return result; - } - } - else - { - switch ( result ) - { - case K_PAUSE: - return K_KP_NUMLOCK; - case 0x0D: - return K_KP_ENTER; - case 0x2F: - return K_KP_SLASH; - case 0xAF: - return K_KP_PLUS; - } - return result; - } -} - - -/* -==================== -MainWndProc - -main window procedure -==================== -*/ -extern cvar_t *in_mouse; -extern cvar_t *in_logitechbug; -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - static qboolean flip = qtrue; - int zDelta, i; - - // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/aboutmouseinput.asp - // Windows 95, Windows NT 3.51 - uses MSH_MOUSEWHEEL - // only relevant for non-DI input - // - // NOTE: not sure how reliable this is anymore, might trigger double wheel events - if (in_mouse->integer != 1) - { - if ( uMsg == MSH_MOUSEWHEEL ) - { - if ( ( ( int ) wParam ) > 0 ) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); - } - return DefWindowProc (hWnd, uMsg, wParam, lParam); - } - } - - switch (uMsg) - { - case WM_MOUSEWHEEL: - // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/aboutmouseinput.asp - // Windows 98/Me, Windows NT 4.0 and later - uses WM_MOUSEWHEEL - // only relevant for non-DI input and when console is toggled in window mode - // if console is toggled in window mode (KEYCATCH_CONSOLE) then mouse is released and DI doesn't see any mouse wheel - if (in_mouse->integer != 1 || (!r_fullscreen->integer && (cls.keyCatchers & KEYCATCH_CONSOLE))) - { - // 120 increments, might be 240 and multiples if wheel goes too fast - // NOTE Logitech: logitech drivers are screwed and send the message twice? - // could add a cvar to interpret the message as successive press/release events - zDelta = ( short ) HIWORD( wParam ) / 120; - if ( zDelta > 0 ) - { - for(i=0; iinteger) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, flip, 0, NULL ); - flip = !flip; - } - } - } - else - { - for(i=0; i<-zDelta; i++) - { - if (!in_logitechbug->integer) - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); - } - else - { - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, flip, 0, NULL ); - flip = !flip; - } - } - } - // when an application processes the WM_MOUSEWHEEL message, it must return zero - return 0; - } - break; - - case WM_CREATE: - - g_wv.hWnd = hWnd; - - vid_xpos = Cvar_Get ("vid_xpos", "3", CVAR_ARCHIVE); - vid_ypos = Cvar_Get ("vid_ypos", "22", CVAR_ARCHIVE); - r_fullscreen = Cvar_Get ("r_fullscreen", "1", CVAR_ARCHIVE | CVAR_LATCH ); - - MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); - if ( r_fullscreen->integer ) - { - WIN_DisableAltTab(); - } - else - { - WIN_EnableAltTab(); - } - - break; -#if 0 - case WM_DISPLAYCHANGE: - Com_DPrintf( "WM_DISPLAYCHANGE\n" ); - // we need to force a vid_restart if the user has changed - // their desktop resolution while the game is running, - // but don't do anything if the message is a result of - // our own calling of ChangeDisplaySettings - if ( com_insideVidInit ) { - break; // we did this on purpose - } - // something else forced a mode change, so restart all our gl stuff - Cbuf_AddText( "vid_restart\n" ); - break; -#endif - case WM_DESTROY: - // let sound and input know about this? - g_wv.hWnd = NULL; - if ( r_fullscreen->integer ) - { - WIN_EnableAltTab(); - } - break; - - case WM_CLOSE: - Cbuf_ExecuteText( EXEC_APPEND, "quit" ); - break; - - case WM_ACTIVATE: - { - int fActive, fMinimized; - - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - - VID_AppActivate( fActive != WA_INACTIVE, fMinimized); - SNDDMA_Activate(); - } - break; - - case WM_MOVE: - { - int xPos, yPos; - RECT r; - int style; - - if (!r_fullscreen->integer ) - { - xPos = (short) LOWORD(lParam); // horizontal position - yPos = (short) HIWORD(lParam); // vertical position - - r.left = 0; - r.top = 0; - r.right = 1; - r.bottom = 1; - - style = GetWindowLong( hWnd, GWL_STYLE ); - AdjustWindowRect( &r, style, FALSE ); - - Cvar_SetValue( "vid_xpos", xPos + r.left); - Cvar_SetValue( "vid_ypos", yPos + r.top); - vid_xpos->modified = qfalse; - vid_ypos->modified = qfalse; - if ( g_wv.activeApp ) - { - IN_Activate (qtrue); - } - } - } - break; - -// this is complicated because Win32 seems to pack multiple mouse events into -// one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - { - int temp; - - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - IN_MouseEvent (temp); - } - break; - - case WM_SYSCOMMAND: - if ( wParam == SC_SCREENSAVE ) - return 0; - break; - - case WM_SYSKEYDOWN: - if ( wParam == 13 ) - { - if ( r_fullscreen ) - { - Cvar_SetValue( "r_fullscreen", !r_fullscreen->integer ); - Cbuf_AddText( "vid_restart\n" ); - } - return 0; - } - // fall through - case WM_KEYDOWN: - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, MapKey( lParam ), qtrue, 0, NULL ); - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, MapKey( lParam ), qfalse, 0, NULL ); - break; - - case WM_CHAR: - Sys_QueEvent( g_wv.sysMsgTime, SE_CHAR, wParam, 0, 0, NULL ); - break; - } - - return DefWindowProc( hWnd, uMsg, wParam, lParam ); -} - +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code 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. + +Quake III Arena source code 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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "../client/client.h" +#include "win_local.h" + +WinVars_t g_wv; + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL (WM_MOUSELAST+1) // message that will be supported by the OS +#endif + +static UINT MSH_MOUSEWHEEL; + +// Console variables that we need to access from this module +cvar_t *vid_xpos; // X coordinate of window position +cvar_t *vid_ypos; // Y coordinate of window position +cvar_t *r_fullscreen; + +#define VID_NUM_MODES ( sizeof( vid_modes ) / sizeof( vid_modes[0] ) ) + +LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +static qboolean s_alttab_disabled; + +static void WIN_DisableAltTab( void ) +{ + if ( s_alttab_disabled ) + return; + + if ( !Q_stricmp( Cvar_VariableString( "arch" ), "winnt" ) ) + { + RegisterHotKey( 0, 0, MOD_ALT, VK_TAB ); + } + else + { + BOOL old; + + SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, &old, 0 ); + } + s_alttab_disabled = qtrue; +} + +static void WIN_EnableAltTab( void ) +{ + if ( s_alttab_disabled ) + { + if ( !Q_stricmp( Cvar_VariableString( "arch" ), "winnt" ) ) + { + UnregisterHotKey( 0, 0 ); + } + else + { + BOOL old; + + SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, &old, 0 ); + } + + s_alttab_disabled = qfalse; + } +} + +/* +================== +VID_AppActivate +================== +*/ +static void VID_AppActivate(BOOL fActive, BOOL minimize) +{ + g_wv.isMinimized = minimize; + + Com_DPrintf("VID_AppActivate: %i\n", fActive ); + + Key_ClearStates(); // FIXME!!! + + // we don't want to act like we're active if we're minimized + if (fActive && !g_wv.isMinimized ) + { + g_wv.activeApp = qtrue; + } + else + { + g_wv.activeApp = qfalse; + } + + // minimize/restore mouse-capture on demand + if (!g_wv.activeApp ) + { + IN_Activate (qfalse); + } + else + { + IN_Activate (qtrue); + } +} + +//========================================================================== + +static byte s_scantokey[128] = + { +// 0 1 2 3 4 5 6 7 +// 8 9 A B C D E F + 0 , 27, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', K_BACKSPACE, 9, // 0 + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', 13 , K_CTRL,'a', 's', // 1 + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'' , '`', K_SHIFT,'\\', 'z', 'x', 'c', 'v', // 2 + 'b', 'n', 'm', ',', '.', '/', K_SHIFT,'*', + K_ALT,' ', K_CAPSLOCK , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 + K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE, 0 , K_HOME, + K_UPARROW,K_PGUP,K_KP_MINUS,K_LEFTARROW,K_KP_5,K_RIGHTARROW, K_KP_PLUS,K_END, //4 + K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, + K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 + 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, + 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 + 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, + 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 +}; + +/* +======= +MapKey + +Map from windows to quake keynums +======= +*/ +static int MapKey (int key) +{ + int result; + int modified; + qboolean is_extended; + +// Com_Printf( "0x%x\n", key); + + modified = ( key >> 16 ) & 255; + + if ( modified > 127 ) + return 0; + + if ( key & ( 1 << 24 ) ) + { + is_extended = qtrue; + } + else + { + is_extended = qfalse; + } + + result = s_scantokey[modified]; + + if ( !is_extended ) + { + switch ( result ) + { + case K_HOME: + return K_KP_HOME; + case K_UPARROW: + return K_KP_UPARROW; + case K_PGUP: + return K_KP_PGUP; + case K_LEFTARROW: + return K_KP_LEFTARROW; + case K_RIGHTARROW: + return K_KP_RIGHTARROW; + case K_END: + return K_KP_END; + case K_DOWNARROW: + return K_KP_DOWNARROW; + case K_PGDN: + return K_KP_PGDN; + case K_INS: + return K_KP_INS; + case K_DEL: + return K_KP_DEL; + default: + return result; + } + } + else + { + switch ( result ) + { + case K_PAUSE: + return K_KP_NUMLOCK; + case 0x0D: + return K_KP_ENTER; + case 0x2F: + return K_KP_SLASH; + case 0xAF: + return K_KP_PLUS; + } + return result; + } +} + + +/* +==================== +MainWndProc + +main window procedure +==================== +*/ +extern cvar_t *in_mouse; +extern cvar_t *in_logitechbug; +LONG WINAPI MainWndProc ( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + static qboolean flip = qtrue; + int zDelta, i; + + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/aboutmouseinput.asp + // Windows 95, Windows NT 3.51 - uses MSH_MOUSEWHEEL + // only relevant for non-DI input + // + // NOTE: not sure how reliable this is anymore, might trigger double wheel events + if (in_mouse->integer != 1) + { + if ( uMsg == MSH_MOUSEWHEEL ) + { + if ( ( ( int ) wParam ) > 0 ) + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); + } + else + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); + } + return DefWindowProc (hWnd, uMsg, wParam, lParam); + } + } + + switch (uMsg) + { + case WM_MOUSEWHEEL: + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/aboutmouseinput.asp + // Windows 98/Me, Windows NT 4.0 and later - uses WM_MOUSEWHEEL + // only relevant for non-DI input and when console is toggled in window mode + // if console is toggled in window mode (KEYCATCH_CONSOLE) then mouse is released and DI doesn't see any mouse wheel + if (in_mouse->integer != 1 || (!r_fullscreen->integer && (cls.keyCatchers & KEYCATCH_CONSOLE))) + { + // 120 increments, might be 240 and multiples if wheel goes too fast + // NOTE Logitech: logitech drivers are screwed and send the message twice? + // could add a cvar to interpret the message as successive press/release events + zDelta = ( short ) HIWORD( wParam ) / 120; + if ( zDelta > 0 ) + { + for(i=0; iinteger) + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); + } + else + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELUP, flip, 0, NULL ); + flip = !flip; + } + } + } + else + { + for(i=0; i<-zDelta; i++) + { + if (!in_logitechbug->integer) + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); + } + else + { + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MWHEELDOWN, flip, 0, NULL ); + flip = !flip; + } + } + } + // when an application processes the WM_MOUSEWHEEL message, it must return zero + return 0; + } + break; + + case WM_CREATE: + + g_wv.hWnd = hWnd; + + vid_xpos = Cvar_Get ("vid_xpos", "3", CVAR_ARCHIVE); + vid_ypos = Cvar_Get ("vid_ypos", "22", CVAR_ARCHIVE); + r_fullscreen = Cvar_Get ("r_fullscreen", "1", CVAR_ARCHIVE | CVAR_LATCH ); + + MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); + if ( r_fullscreen->integer ) + { + WIN_DisableAltTab(); + } + else + { + WIN_EnableAltTab(); + } + + break; +#if 0 + case WM_DISPLAYCHANGE: + Com_DPrintf( "WM_DISPLAYCHANGE\n" ); + // we need to force a vid_restart if the user has changed + // their desktop resolution while the game is running, + // but don't do anything if the message is a result of + // our own calling of ChangeDisplaySettings + if ( com_insideVidInit ) { + break; // we did this on purpose + } + // something else forced a mode change, so restart all our gl stuff + Cbuf_AddText( "vid_restart\n" ); + break; +#endif + case WM_DESTROY: + // let sound and input know about this? + g_wv.hWnd = NULL; + if ( r_fullscreen->integer ) + { + WIN_EnableAltTab(); + } + break; + + case WM_CLOSE: + Cbuf_ExecuteText( EXEC_APPEND, "quit" ); + break; + + case WM_ACTIVATE: + { + int fActive, fMinimized; + + fActive = LOWORD(wParam); + fMinimized = (BOOL) HIWORD(wParam); + + VID_AppActivate( fActive != WA_INACTIVE, fMinimized); + SNDDMA_Activate(); + } + break; + + case WM_MOVE: + { + int xPos, yPos; + RECT r; + int style; + + if (!r_fullscreen->integer ) + { + xPos = (short) LOWORD(lParam); // horizontal position + yPos = (short) HIWORD(lParam); // vertical position + + r.left = 0; + r.top = 0; + r.right = 1; + r.bottom = 1; + + style = GetWindowLong( hWnd, GWL_STYLE ); + AdjustWindowRect( &r, style, FALSE ); + + Cvar_SetValue( "vid_xpos", xPos + r.left); + Cvar_SetValue( "vid_ypos", yPos + r.top); + vid_xpos->modified = qfalse; + vid_ypos->modified = qfalse; + if ( g_wv.activeApp ) + { + IN_Activate (qtrue); + } + } + } + break; + +// this is complicated because Win32 seems to pack multiple mouse events into +// one update sometimes, so we always check all states and look for events + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MOUSEMOVE: + { + int temp; + + temp = 0; + + if (wParam & MK_LBUTTON) + temp |= 1; + + if (wParam & MK_RBUTTON) + temp |= 2; + + if (wParam & MK_MBUTTON) + temp |= 4; + + IN_MouseEvent (temp); + } + break; + + case WM_SYSCOMMAND: + if ( wParam == SC_SCREENSAVE ) + return 0; + break; + + case WM_SYSKEYDOWN: + if ( wParam == 13 ) + { + if ( r_fullscreen ) + { + Cvar_SetValue( "r_fullscreen", !r_fullscreen->integer ); + Cbuf_AddText( "vid_restart\n" ); + } + return 0; + } + // fall through + case WM_KEYDOWN: + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, MapKey( lParam ), qtrue, 0, NULL ); + break; + + case WM_SYSKEYUP: + case WM_KEYUP: + Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, MapKey( lParam ), qfalse, 0, NULL ); + break; + + case WM_CHAR: + Sys_QueEvent( g_wv.sysMsgTime, SE_CHAR, wParam, 0, 0, NULL ); + break; + } + + return DefWindowProc( hWnd, uMsg, wParam, lParam ); +} + diff --git a/code/win32/winquake.rc b/code/win32/winquake.rc index c50d6f2..c99e257 100755 --- a/code/win32/winquake.rc +++ b/code/win32/winquake.rc @@ -1,71 +1,71 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON DISCARDABLE "qe3.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STRING1 "Quake3" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "qe3.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STRING1 "Quake3" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + -- cgit v1.2.3