X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=0e9b29443b48c94ce98e4741b7cdee1eef2fb638;hb=58fb771fc98f2d04990c947944cd199007ea1666;hp=3ef91f208675be55c839b0ee065e9e70d5978c18;hpb=cc3c823ce3baf63d6d8f216c3bf4df88496eb231;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 3ef91f20..0e9b2944 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -24,6 +24,48 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "resource.h" #include +int cl_available = true; + +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); +HGLRC (WINAPI *qwglCreateContext)(HDC); +BOOL (WINAPI *qwglDeleteContext)(HGLRC); +HGLRC (WINAPI *qwglGetCurrentContext)(VOID); +HDC (WINAPI *qwglGetCurrentDC)(VOID); +PROC (WINAPI *qwglGetProcAddress)(LPCSTR); +BOOL (WINAPI *qwglMakeCurrent)(HDC, HGLRC); +BOOL (WINAPI *qwglSwapIntervalEXT)(int interval); +const char *(WINAPI *qwglGetExtensionsStringARB)(HDC hdc); + +static gl_extensionfunctionlist_t getextensionsstringfuncs[] = +{ + {"wglGetExtensionsString", (void **) &qwglGetExtensionsStringARB}, + {NULL, NULL} +}; + +static gl_extensionfunctionlist_t wglfuncs[] = +{ + {"wglChoosePixelFormat", (void **) &qwglChoosePixelFormat}, + {"wglDescribePixelFormat", (void **) &qwglDescribePixelFormat}, +// {"wglGetPixelFormat", (void **) &qwglGetPixelFormat}, + {"wglSetPixelFormat", (void **) &qwglSetPixelFormat}, + {"wglSwapBuffers", (void **) &qwglSwapBuffers}, + {"wglCreateContext", (void **) &qwglCreateContext}, + {"wglDeleteContext", (void **) &qwglDeleteContext}, + {"wglGetProcAddress", (void **) &qwglGetProcAddress}, + {"wglMakeCurrent", (void **) &qwglMakeCurrent}, + {NULL, NULL} +}; + +static gl_extensionfunctionlist_t wglswapintervalfuncs[] = +{ + {"wglSwapIntervalEXT", (void **) &qwglSwapIntervalEXT}, + {NULL, NULL} +}; + #define MAX_MODE_LIST 30 #define VID_ROW_SIZE 3 #define MAXWIDTH 10000 @@ -41,7 +83,6 @@ typedef struct { int dib; int fullscreen; int bpp; - int halfscreen; char modedesc[17]; } vmode_t; @@ -57,52 +98,42 @@ lmode_t lowresmodes[] = { {512, 384}, }; -const char *gl_vendor; -const char *gl_renderer; -const char *gl_version; -const char *gl_extensions; +qboolean scr_skipupdate; -qboolean DDActive; -qboolean scr_skipupdate; +static vmode_t modelist[MAX_MODE_LIST]; +static int nummodes; +static vmode_t badmode; -static vmode_t modelist[MAX_MODE_LIST]; -static int nummodes; -static vmode_t *pcurrentmode; -static vmode_t badmode; - -static DEVMODE gdevmode; -static qboolean vid_initialized = false; -static qboolean windowed, leavecurrentmode; +static DEVMODE gdevmode; +static qboolean vid_initialized = false; +static qboolean windowed, leavecurrentmode; static qboolean vid_canalttab = false; static qboolean vid_wassuspended = false; -static int windowed_mouse; -extern qboolean mouseactive; // from in_win.c -static HICON hIcon; - -int DIBWidth, DIBHeight; -RECT WindowRect; -DWORD WindowStyle, ExWindowStyle; +static int vid_usingmouse; +extern qboolean mouseactive; // from in_win.c +static HICON hIcon; -HWND mainwindow; +int DIBWidth, DIBHeight; +RECT WindowRect; +DWORD WindowStyle, ExWindowStyle; -int vid_modenum = NO_MODE; -int vid_realmode; -int vid_default = MODE_WINDOWED; -static int windowed_default; -unsigned char vid_curpal[256*3]; +HWND mainwindow; -HGLRC baseRC; -HDC maindc; +int vid_modenum = NO_MODE; +int vid_realmode; +int vid_default = MODE_WINDOWED; +static int windowed_default; +unsigned char vid_curpal[256*3]; -glvert_t glv; +HGLRC baseRC; +HDC maindc; HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); -viddef_t vid; // global video state +// global video state +viddef_t vid; -float gldepthmin, gldepthmax; - -modestate_t modestate = MS_UNINIT; +modestate_t modestate = MS_UNINIT; void VID_MenuDraw (void); void VID_MenuKey (int key); @@ -113,31 +144,16 @@ char *VID_GetModeDescription (int mode); void ClearAllStates (void); void VID_UpdateWindowStatus (void); -// LordHavoc: ARB multitexture support -int gl_mtex_enum = 0; - -qboolean isG200 = false; // LordHavoc: the Matrox G200 can't do per pixel alpha, and it uses a D3D driver for GL... ugh... -qboolean isRagePro = false; // LordHavoc: the ATI Rage Pro has limitations with per pixel alpha (the color scaler does not apply to per pixel alpha images...), although not as bad as a G200. -qboolean gl_mtexable = false; -qboolean gl_arrays = false; - //==================================== -cvar_t vid_mode = {"vid_mode","0", false}; -// Note that 0 is MODE_WINDOWED -//cvar_t _vid_default_mode = {"_vid_default_mode","0", true}; -// Note that 3 is MODE_FULLSCREEN_DEFAULT -//cvar_t _vid_default_mode_win = {"_vid_default_mode_win","3", true}; -cvar_t _windowed_mouse = {"_windowed_mouse","1", true}; - -int window_center_x, window_center_y, window_x, window_y, window_width, window_height; -RECT window_rect; +int window_center_x, window_center_y, window_x, window_y, window_width, window_height; +RECT window_rect; // direct draw software compatability stuff void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify) { - int CenterX, CenterY; + int CenterX, CenterY; CenterX = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; CenterY = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; @@ -151,8 +167,8 @@ void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify) qboolean VID_SetWindowedMode (int modenum) { - int lastmodestate, width, height; - RECT rect; + int lastmodestate, width, height; + RECT rect; lastmodestate = modestate; @@ -174,7 +190,7 @@ qboolean VID_SetWindowedMode (int modenum) height = rect.bottom - rect.top; // Create the DIB window - mainwindow = CreateWindowEx (ExWindowStyle, "DarkPlaces", "DarkPlacesGL", WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); + mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); if (!mainwindow) Sys_Error ("Couldn't create DIB window"); @@ -187,13 +203,6 @@ qboolean VID_SetWindowedMode (int modenum) modestate = MS_WINDOWED; - if (vid.conheight > modelist[modenum].height) - vid.conheight = modelist[modenum].height; - if (vid.conwidth > modelist[modenum].width) - vid.conwidth = modelist[modenum].width; - vid.width = vid.conwidth; - vid.height = vid.conheight; - SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); @@ -203,15 +212,14 @@ qboolean VID_SetWindowedMode (int modenum) qboolean VID_SetFullDIBMode (int modenum) { - int lastmodestate, width, height; - RECT rect; + int lastmodestate, width, height; + RECT rect; if (!leavecurrentmode) { gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; gdevmode.dmBitsPerPel = modelist[modenum].bpp; - gdevmode.dmPelsWidth = modelist[modenum].width << - modelist[modenum].halfscreen; + gdevmode.dmPelsWidth = modelist[modenum].width; gdevmode.dmPelsHeight = modelist[modenum].height; gdevmode.dmSize = sizeof (gdevmode); @@ -240,7 +248,7 @@ qboolean VID_SetFullDIBMode (int modenum) height = rect.bottom - rect.top; // Create the DIB window - mainwindow = CreateWindowEx (ExWindowStyle, "DarkPlaces", "DarkPlacesGL", WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); + mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); if (!mainwindow) Sys_Error ("Couldn't create DIB window"); @@ -248,13 +256,6 @@ qboolean VID_SetFullDIBMode (int modenum) ShowWindow (mainwindow, SW_SHOWDEFAULT); UpdateWindow (mainwindow); - if (vid.conheight > modelist[modenum].height) - vid.conheight = modelist[modenum].height; - if (vid.conwidth > modelist[modenum].width) - vid.conwidth = modelist[modenum].width; - vid.width = vid.conwidth; - vid.height = vid.conheight; - // needed because we're not getting WM_MOVE messages fullscreen on NT window_x = 0; window_y = 0; @@ -268,17 +269,13 @@ qboolean VID_SetFullDIBMode (int modenum) int VID_SetMode (int modenum) { - int original_mode, temp; - qboolean stat; - MSG msg; + int original_mode; + qboolean stat = 0; + MSG msg; if ((windowed && (modenum != 0)) || (!windowed && (modenum < 1)) || (!windowed && (modenum >= nummodes))) Sys_Error ("Bad video mode\n"); -// so Con_Printfs don't mess us up by forcing vid and snd updates - temp = scr_disabled_for_loading; - scr_disabled_for_loading = true; - CDAudio_Pause (); if (vid_modenum == NO_MODE) @@ -288,26 +285,9 @@ int VID_SetMode (int modenum) // Set either the fullscreen or windowed mode if (modelist[modenum].type == MS_WINDOWED) - { - if (_windowed_mouse.value && key_dest == key_game) - { - stat = VID_SetWindowedMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); - } - else - { - IN_DeactivateMouse (); - IN_ShowMouse (); - stat = VID_SetWindowedMode(modenum); - } - } + stat = VID_SetWindowedMode(modenum); else if (modelist[modenum].type == MS_FULLDIB) - { stat = VID_SetFullDIBMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); - } else Sys_Error ("VID_SetMode: Bad mode type in modelist"); @@ -316,7 +296,6 @@ int VID_SetMode (int modenum) VID_UpdateWindowStatus (); CDAudio_Resume (); - scr_disabled_for_loading = temp; if (!stat) Sys_Error ("Couldn't set video mode"); @@ -333,8 +312,8 @@ int VID_SetMode (int modenum) while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage (&msg); - DispatchMessage (&msg); + TranslateMessage (&msg); + DispatchMessage (&msg); } Sleep (100); @@ -349,8 +328,6 @@ int VID_SetMode (int modenum) if (!msg_suppress_1) Con_SafePrintf ("Video mode %s initialized.\n", VID_GetModeDescription (vid_modenum)); - vid.recalc_refdef = 1; - return true; } @@ -362,7 +339,6 @@ VID_UpdateWindowStatus */ void VID_UpdateWindowStatus (void) { - window_rect.left = window_x; window_rect.top = window_y; window_rect.right = window_x + window_width; @@ -376,120 +352,52 @@ void VID_UpdateWindowStatus (void) //==================================== -void (GLAPIENTRY *qglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (GLAPIENTRY *qglColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (GLAPIENTRY *qglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (GLAPIENTRY *qglArrayElement)(GLint i); -void (GLAPIENTRY *qglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void (GLAPIENTRY *qglMTexCoord2f)(GLenum, GLfloat, GLfloat); -void (GLAPIENTRY *qglSelectTexture)(GLenum); - -void VID_CheckVertexArrays (void) -{ - if (COM_CheckParm("-novertex")) - { - Con_Printf("...vertex array support disabled\n"); - return; - } - if ((qglArrayElement = (void *) wglGetProcAddress("glArrayElement")) - && (qglColorPointer = (void *) wglGetProcAddress("glColorPointer")) -// && (qglDrawArrays = (void *) wglGetProcAddress("glDrawArrays")) - && (qglDrawElements = (void *) wglGetProcAddress("glDrawElements")) -// && (qglInterleavedArrays = (void *) wglGetProcAddress("glInterleavedArrays")) - && (qglTexCoordPointer = (void *) wglGetProcAddress("glTexCoordPointer")) - && (qglVertexPointer = (void *) wglGetProcAddress("glVertexPointer")) - ) - { - Con_Printf("...vertex array support detected\n"); - gl_arrays = true; - return; - } - - Con_Printf("...vertex array support disabled (not detected - get a better driver)\n"); -} - -int texture_extension_number = 1; - -void VID_CheckMultitexture(void) -{ - qglMTexCoord2f = NULL; - qglSelectTexture = NULL; - // Check to see if multitexture is disabled - if (COM_CheckParm("-nomtex")) - { - Con_Printf("...multitexture disabled\n"); - return; - } - // Test for ARB_multitexture - if (!COM_CheckParm("-SGISmtex") && strstr(gl_extensions, "GL_ARB_multitexture ")) - { - Con_Printf("...using GL_ARB_multitexture\n"); - qglMTexCoord2f = (void *) wglGetProcAddress("glMultiTexCoord2fARB"); - qglSelectTexture = (void *) wglGetProcAddress("glActiveTextureARB"); - gl_mtexable = true; - gl_mtex_enum = GL_TEXTURE0_ARB; - } - else if (strstr(gl_extensions, "GL_SGIS_multitexture ")) // Test for SGIS_multitexture (if ARB_multitexture not found) - { - Con_Printf("...using GL_SGIS_multitexture\n"); - qglMTexCoord2f = (void *) wglGetProcAddress("glMTexCoord2fSGIS"); - qglSelectTexture = (void *) wglGetProcAddress("glSelectTextureSGIS"); - gl_mtexable = true; - gl_mtex_enum = TEXTURE0_SGIS; - } - if (!gl_mtexable) - Con_Printf("...multitexture disabled (not detected)\n"); -} - /* ================= -GL_BeginRendering - +VID_GetWindowSize ================= */ -void GL_BeginRendering (int *x, int *y, int *width, int *height) +void VID_GetWindowSize (int *x, int *y, int *width, int *height) { *x = *y = 0; *width = WindowRect.right - WindowRect.left; *height = WindowRect.bottom - WindowRect.top; - -// if (!wglMakeCurrent( maindc, baseRC )) -// Sys_Error ("wglMakeCurrent failed"); - -// glViewport (*x, *y, *width, *height); } -void GL_EndRendering (void) +void VID_Finish (void) { - if (r_render.value && !scr_skipupdate) + int vid_usemouse; + if (r_render.integer && !scr_skipupdate) + { + qglFinish(); SwapBuffers(maindc); + } // handle the mouse state when windowed if that's changed - if (modestate == MS_WINDOWED) + vid_usemouse = false; + if (vid_mouse.integer && !key_consoleactive) + vid_usemouse = true; + if (modestate == MS_FULLDIB) + vid_usemouse = true; + if (!vid_activewindow) + vid_usemouse = false; + if (vid_usemouse) { - if (!_windowed_mouse.value) + if (!vid_usingmouse) { - if (windowed_mouse) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - windowed_mouse = false; - } + vid_usingmouse = true; + IN_ActivateMouse (); + IN_HideMouse(); } - else + } + else + { + if (vid_usingmouse) { - windowed_mouse = true; - if (key_dest == key_game && !mouseactive && ActiveApp) - { - IN_ActivateMouse (); - IN_HideMouse (); - } - else if (mouseactive && key_dest != key_game) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } + vid_usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse(); } } } @@ -499,28 +407,33 @@ void VID_SetDefaultMode (void) IN_DeactivateMouse (); } +void VID_RestoreSystemGamma(void); -void VID_Shutdown (void) +void VID_Shutdown (void) { - HGLRC hRC; - HDC hDC; + HGLRC hRC; + HDC hDC; int i; GLuint temp[8192]; if (vid_initialized) { vid_canalttab = false; - hRC = wglGetCurrentContext(); - hDC = wglGetCurrentDC(); + hRC = qwglGetCurrentContext(); + hDC = qwglGetCurrentDC(); - wglMakeCurrent(NULL, NULL); + qwglMakeCurrent(NULL, NULL); // LordHavoc: free textures before closing (may help NVIDIA) - for (i = 0;i < 8192;i++) temp[i] = i+1; - glDeleteTextures(8192, temp); + for (i = 0;i < 8192;i++) + temp[i] = i+1; + qglDeleteTextures(8192, temp); + + if (hRC) + qwglDeleteContext(hRC); - if (hRC) - wglDeleteContext(hRC); + // close the library before we get rid of the window + GL_CloseLibrary(); if (hDC && mainwindow) ReleaseDC(mainwindow, hDC); @@ -532,6 +445,8 @@ void VID_Shutdown (void) ReleaseDC (mainwindow, maindc); AppActivate(false, false); + + VID_RestoreSystemGamma(); } } @@ -541,7 +456,7 @@ void VID_Shutdown (void) BOOL bSetupPixelFormat(HDC hDC) { - static PIXELFORMATDESCRIPTOR pfd = { + static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW // support window @@ -554,33 +469,33 @@ BOOL bSetupPixelFormat(HDC hDC) 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored - 32, // 32-bit z-buffer + 32, // 32-bit z-buffer 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0 // layer masks ignored - }; - int pixelformat; - - if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) - { - MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); - return false; - } - - if (SetPixelFormat(hDC, pixelformat, &pfd) == false) - { - MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); - return false; - } - - return true; + }; + int pixelformat; + + if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) + { + MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); + return false; + } + + if (SetPixelFormat(hDC, pixelformat, &pfd) == false) + { + MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); + return false; + } + + return true; } -byte scantokey[128] = +qbyte 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 @@ -593,20 +508,6 @@ byte scantokey[128] = 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 }; -/* -byte shiftscantokey[128] = -{ -// 0 1 2 3 4 5 6 7 8 9 A B C D E F - 0 ,27 ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'_' ,'+' ,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 ,' ' ,0 ,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_LEFTARROW,'%' ,K_RIGHTARROW,'+' ,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 -}; -*/ /* ======= @@ -622,8 +523,6 @@ int MapKey (int key, int virtualkey) return 0; if (scantokey[key] == 0) Con_DPrintf("key 0x%02x has no translation\n", key); -// if (scantokey[key] >= 0x20 && scantokey[key] < 0x7F) -// return realchar; return scantokey[key]; } @@ -643,7 +542,7 @@ ClearAllStates void ClearAllStates (void) { int i; - + // send an up event for each key, to make sure the server clears them all for (i=0 ; i<256 ; i++) { @@ -654,6 +553,9 @@ void ClearAllStates (void) IN_ClearStates (); } +void VID_RestoreGameGamma(void); +extern qboolean host_loopactive; + void AppActivate(BOOL fActive, BOOL minimize) /**************************************************************************** * @@ -668,16 +570,16 @@ void AppActivate(BOOL fActive, BOOL minimize) { static BOOL sound_active; - ActiveApp = fActive; - Minimized = minimize; + vid_activewindow = fActive; + vid_hidden = minimize; // enable/disable sound on focus gain/loss - if (!ActiveApp && sound_active) + if (!vid_activewindow && sound_active) { S_BlockSound (); sound_active = false; } - else if (ActiveApp && !sound_active) + else if (vid_activewindow && !sound_active) { S_UnblockSound (); sound_active = true; @@ -687,9 +589,8 @@ void AppActivate(BOOL fActive, BOOL minimize) { if (modestate == MS_FULLDIB) { - IN_ActivateMouse (); - IN_HideMouse (); - if (vid_canalttab && vid_wassuspended) { + if (vid_canalttab && vid_wassuspended) + { vid_wassuspended = false; ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); ShowWindow(mainwindow, SW_SHOWNORMAL); @@ -698,50 +599,38 @@ void AppActivate(BOOL fActive, BOOL minimize) // LordHavoc: from dabb, fix for alt-tab bug in NVidia drivers MoveWindow(mainwindow,0,0,gdevmode.dmPelsWidth,gdevmode.dmPelsHeight,false); } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && key_dest == key_game) - { - IN_ActivateMouse (); - IN_HideMouse (); - } + if (host_loopactive) + VID_RestoreGameGamma(); } if (!fActive) { - if (modestate == MS_FULLDIB) + vid_usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse (); + if (modestate == MS_FULLDIB && vid_canalttab) { - IN_DeactivateMouse (); - IN_ShowMouse (); - if (vid_canalttab) { - ChangeDisplaySettings (NULL, 0); - vid_wassuspended = true; - } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) - { - IN_DeactivateMouse (); - IN_ShowMouse (); + ChangeDisplaySettings (NULL, 0); + vid_wassuspended = true; } + VID_RestoreSystemGamma(); } } LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); /* main window procedure */ -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) +LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - LONG lRet = 1; + LONG lRet = 1; int fActive, fMinimized, temp; extern unsigned int uiWheelMessage; if ( uMsg == uiWheelMessage ) uMsg = WM_MOUSEWHEEL; - switch (uMsg) - { + switch (uMsg) + { case WM_KILLFOCUS: if (modestate == MS_FULLDIB) ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); @@ -760,7 +649,7 @@ LONG WINAPI MainWndProc ( case WM_SYSKEYDOWN: Key_Event (MapKey(lParam, wParam), true); break; - + case WM_KEYUP: case WM_SYSKEYUP: Key_Event (MapKey(lParam, wParam), false); @@ -797,7 +686,7 @@ LONG WINAPI MainWndProc ( // JACK: This is the mouse wheel with the Intellimouse // Its delta is either positive or neg, and we generate the proper // Event. - case WM_MOUSEWHEEL: + case WM_MOUSEWHEEL: if ((short) HIWORD(wParam) > 0) { Key_Event(K_MWHEELUP, true); Key_Event(K_MWHEELUP, false); @@ -807,14 +696,14 @@ LONG WINAPI MainWndProc ( } break; - case WM_SIZE: - break; + case WM_SIZE: + break; - case WM_CLOSE: + case WM_CLOSE: if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) Sys_Quit (); - break; + break; case WM_ACTIVATE: fActive = LOWORD(wParam); @@ -826,27 +715,27 @@ LONG WINAPI MainWndProc ( break; - case WM_DESTROY: - { + case WM_DESTROY: + { if (mainwindow) DestroyWindow (mainwindow); - PostQuitMessage (0); - } - break; + PostQuitMessage (0); + } + break; case MM_MCINOTIFY: - lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); + lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); break; - default: - /* pass all unhandled messages to DefWindowProc */ - lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); - break; - } + default: + /* pass all unhandled messages to DefWindowProc */ + lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); + break; + } - /* return 1 if handled message, 0 if not */ - return lRet; + /* return 1 if handled message, 0 if not */ + return lRet; } @@ -860,7 +749,7 @@ int VID_NumModes (void) return nummodes; } - + /* ================= VID_GetModePtr @@ -953,7 +842,6 @@ VID_NumModes_f */ void VID_NumModes_f (void) { - if (nummodes == 1) Con_Printf ("%d video mode is available\n", nummodes); else @@ -969,7 +857,7 @@ VID_DescribeMode_f void VID_DescribeMode_f (void) { int t, modenum; - + modenum = atoi (Cmd_Argv(1)); t = leavecurrentmode; @@ -1007,7 +895,7 @@ void VID_DescribeModes_f (void) leavecurrentmode = t; } -void VID_AddMode(int type, int width, int height, int modenum, int halfscreen, int dib, int fullscreen, int bpp) +void VID_AddMode(int type, int width, int height, int modenum, int dib, int fullscreen, int bpp) { int i; if (nummodes >= MAX_MODE_LIST) @@ -1016,7 +904,6 @@ void VID_AddMode(int type, int width, int height, int modenum, int halfscreen, i modelist[nummodes].width = width; modelist[nummodes].height = height; modelist[nummodes].modenum = modenum; - modelist[nummodes].halfscreen = halfscreen; modelist[nummodes].dib = dib; modelist[nummodes].fullscreen = fullscreen; modelist[nummodes].bpp = bpp; @@ -1038,49 +925,20 @@ void VID_InitDIB (HINSTANCE hInstance) WNDCLASS wc; // Register the frame class - wc.style = 0; - wc.lpfnWndProc = (WNDPROC)MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = 0; - wc.hCursor = LoadCursor (NULL,IDC_ARROW); + wc.style = 0; + wc.lpfnWndProc = (WNDPROC)MainWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = 0; + wc.hCursor = LoadCursor (NULL,IDC_ARROW); wc.hbrBackground = NULL; - wc.lpszMenuName = 0; - wc.lpszClassName = "DarkPlaces"; + wc.lpszMenuName = 0; + wc.lpszClassName = gamename; - if (!RegisterClass (&wc) ) + if (!RegisterClass (&wc) ) Sys_Error ("Couldn't register window class"); - /* - modelist[0].type = MS_WINDOWED; - - if (COM_CheckParm("-width")) - modelist[0].width = atoi(com_argv[COM_CheckParm("-width")+1]); - else - modelist[0].width = 640; - - if (modelist[0].width < 320) - modelist[0].width = 320; - - if (COM_CheckParm("-height")) - modelist[0].height= atoi(com_argv[COM_CheckParm("-height")+1]); - else - modelist[0].height = modelist[0].width * 240/320; - - if (modelist[0].height < 240) - modelist[0].height = 240; - - sprintf (modelist[0].modedesc, "%dx%d", modelist[0].width, modelist[0].height); - - modelist[0].modenum = MODE_WINDOWED; - modelist[0].dib = 1; - modelist[0].fullscreen = 0; - modelist[0].halfscreen = 0; - modelist[0].bpp = 0; - - nummodes = 1; - */ if (COM_CheckParm("-width")) w = atoi(com_argv[COM_CheckParm("-width")+1]); else @@ -1097,7 +955,7 @@ void VID_InitDIB (HINSTANCE hInstance) if (h < 240) h = 240; - VID_AddMode(MS_WINDOWED, w, h, 0, 0, 1, 0, 0); + VID_AddMode(MS_WINDOWED, w, h, 0, 1, 0, 0); } @@ -1109,10 +967,8 @@ VID_InitFullDIB void VID_InitFullDIB (HINSTANCE hInstance) { DEVMODE devmode; -// int i; int modenum; int originalnummodes; -// int existingmode; int numlowresmodes; int j; int bpp; @@ -1132,49 +988,7 @@ void VID_InitFullDIB (HINSTANCE hInstance) devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) - { - // if the width is more than twice the height, reduce it by half because this - // is probably a dual-screen monitor - if ((!COM_CheckParm("-noadjustaspect")) && (devmode.dmPelsWidth > (devmode.dmPelsHeight << 1))) - VID_AddMode(MS_FULLDIB, devmode.dmPelsWidth >> 1, devmode.dmPelsHeight, 0, 1, 1, 1, devmode.dmBitsPerPel); - else - VID_AddMode(MS_FULLDIB, devmode.dmPelsWidth, devmode.dmPelsHeight, 0, 0, 1, 1, devmode.dmBitsPerPel); - /* - modelist[nummodes].type = MS_FULLDIB; - modelist[nummodes].width = devmode.dmPelsWidth; - modelist[nummodes].height = devmode.dmPelsHeight; - modelist[nummodes].modenum = 0; - modelist[nummodes].halfscreen = 0; - modelist[nummodes].dib = 1; - modelist[nummodes].fullscreen = 1; - modelist[nummodes].bpp = devmode.dmBitsPerPel; - sprintf (modelist[nummodes].modedesc, "%dx%dx%d", devmode.dmPelsWidth, devmode.dmPelsHeight, devmode.dmBitsPerPel); - - // if the width is more than twice the height, reduce it by half because this - // is probably a dual-screen monitor - if (!COM_CheckParm("-noadjustaspect")) - { - if (modelist[nummodes].width > (modelist[nummodes].height << 1)) - { - modelist[nummodes].width >>= 1; - modelist[nummodes].halfscreen = 1; - sprintf (modelist[nummodes].modedesc, "%dx%dx%d", modelist[nummodes].width, modelist[nummodes].height, modelist[nummodes].bpp); - } - } - - for (i=originalnummodes, existingmode = 0 ; iwidth)/2, 4, p); + M_DrawPic ( (320-p->width)/2, 4, "gfx/vidmodes.lmp"); vid_wmodes = 0; lnummodes = VID_NumModes (); - + for (i=1 ; (i"); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, - "and -bpp "); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, - "Select windowed mode with -window"); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*2, "Video modes must be set from the"); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*3, "command line with -width "); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, "and -bpp "); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, "Select windowed mode with -window"); } @@ -1583,3 +1187,164 @@ void VID_MenuKey (int key) break; } } + +static HINSTANCE gldll; + +int GL_OpenLibrary(const char *name) +{ + Con_Printf("Loading GL driver %s\n", name); + GL_CloseLibrary(); + if (!(gldll = LoadLibrary(name))) + { + Con_Printf("Unable to LoadLibrary %s\n", name); + return false; + } + strcpy(gl_driver, name); + return true; +} + +void GL_CloseLibrary(void) +{ + FreeLibrary(gldll); + gldll = 0; + gl_driver[0] = 0; + qwglGetProcAddress = NULL; + gl_extensions = ""; + gl_platform = ""; + gl_platformextensions = ""; +} + +void *GL_GetProcAddress(const char *name) +{ + void *p = NULL; + if (qwglGetProcAddress != NULL) + p = (void *) qwglGetProcAddress(name); + if (p == NULL) + p = (void *) GetProcAddress(gldll, name); + return p; +} +/* +=================== +VID_Init +=================== +*/ +void VID_Init (int fullscreen, int width, int height, int bpp) +{ + int i, bestmode; + double rating, bestrating; + int basenummodes, done; + HDC hdc; + DEVMODE devmode; + + if (!GL_OpenLibrary("opengl32.dll")) + Sys_Error("Unable to load GL driver\n"); + + memset(&devmode, 0, sizeof(devmode)); + + Cmd_AddCommand ("vid_nummodes", VID_NumModes_f); + Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f); + Cmd_AddCommand ("vid_describemode", VID_DescribeMode_f); + Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f); + + VID_GetSystemGamma(); + + hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON2)); + + InitCommonControls(); + + VID_InitDIB (global_hInstance); + basenummodes = nummodes = 1; + + VID_InitFullDIB (global_hInstance); + + if (!fullscreen) + { + hdc = GetDC (NULL); + + if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) + Sys_Error ("Can't run in non-RGB mode"); + + ReleaseDC (NULL, hdc); + + windowed = true; + + vid_default = MODE_WINDOWED; + } + else + { + if (nummodes == 1) + Sys_Error ("No RGB fullscreen modes available"); + + windowed = false; + + done = 0; + + bestmode = -1; + bestrating = 1000000000; + for (i = 0;i < nummodes;i++) + { + if (fullscreen == modelist[i].fullscreen) + { + rating = VID_CompareMode(width, height, bpp, modelist[i].width, modelist[i].height, modelist[i].bpp); + if (bestrating > rating) + { + bestrating = rating; + bestmode = i; + } + } + } + + if (bestmode < 0) + Sys_Error ("Specified video mode not available"); + } + + vid_initialized = true; + + VID_SetMode (vid_default); + + maindc = GetDC(mainwindow); + bSetupPixelFormat(maindc); + + if (!GL_CheckExtension("wgl", wglfuncs, NULL, false)) + Sys_Error("wgl functions not found\n"); + + baseRC = qwglCreateContext( maindc ); + if (!baseRC) + Sys_Error ("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window."); + if (!qwglMakeCurrent( maindc, baseRC )) + Sys_Error ("wglMakeCurrent failed"); + + gl_renderer = qglGetString(GL_RENDERER); + gl_vendor = qglGetString(GL_VENDOR); + gl_version = qglGetString(GL_VERSION); + gl_extensions = qglGetString(GL_EXTENSIONS); + gl_platform = "WGL"; + gl_platformextensions = ""; + + if (GL_CheckExtension("WGL_ARB_extensions_string", getextensionsstringfuncs, NULL, false)) + gl_platformextensions = qwglGetExtensionsStringARB(maindc); + + gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, NULL, false); + + GL_Init (); + + // LordHavoc: special differences for ATI (broken 8bit color when also using 32bit? weird!) + if (strncasecmp(gl_vendor,"ATI",3)==0) + { + if (strncasecmp(gl_renderer,"Rage Pro",8)==0) + isRagePro = true; + } + if (strncasecmp(gl_renderer,"Matrox G200 Direct3D",20)==0) // a D3D driver for GL? sigh... + isG200 = true; + + vid_realmode = vid_modenum; + + vid_menudrawfn = VID_MenuDraw; + vid_menukeyfn = VID_MenuKey; + + strcpy (badmode.modedesc, "Bad mode"); + vid_canalttab = true; + + vid_hidden = false; +} +