X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=26082196f2e59e8c9778982f444dc7721d10a06a;hb=86953b103986e0b1bfcd8ed1acd7512a9bae05cd;hp=12f366845859f370694334fbab028e18a005ca80;hpb=87c8790af774ca56ee2e0733aee75f514964af84;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 12f36684..26082196 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -62,12 +62,10 @@ const char *gl_renderer; const char *gl_version; const char *gl_extensions; -qboolean DDActive; qboolean scr_skipupdate; static vmode_t modelist[MAX_MODE_LIST]; static int nummodes; -static vmode_t *pcurrentmode; static vmode_t badmode; static DEVMODE gdevmode; @@ -75,7 +73,7 @@ static qboolean vid_initialized = false; static qboolean windowed, leavecurrentmode; static qboolean vid_canalttab = false; static qboolean vid_wassuspended = false; -static int windowed_mouse; +static int usingmouse; extern qboolean mouseactive; // from in_win.c static HICON hIcon; @@ -94,14 +92,10 @@ unsigned char vid_curpal[256*3]; HGLRC baseRC; HDC maindc; -glvert_t glv; - HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); viddef_t vid; // global video state -float gldepthmin, gldepthmax; - modestate_t modestate = MS_UNINIT; void VID_MenuDraw (void); @@ -113,29 +107,8 @@ 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 vid_wait = {"vid_wait","0"}; -cvar_t vid_nopageflip = {"vid_nopageflip","0", true}; -cvar_t _vid_wait_override = {"_vid_wait_override", "0", true}; -cvar_t vid_config_x = {"vid_config_x","800", true}; -cvar_t vid_config_y = {"vid_config_y","600", true}; -cvar_t vid_stretch_by_2 = {"vid_stretch_by_2","1", 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; @@ -174,13 +147,13 @@ qboolean VID_SetWindowedMode (int modenum) ExWindowStyle = 0; rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); + AdjustWindowRectEx(&rect, WindowStyle, false, 0); width = rect.right - rect.left; 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"); @@ -197,11 +170,9 @@ qboolean VID_SetWindowedMode (int modenum) 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); + SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); return true; } @@ -240,13 +211,13 @@ qboolean VID_SetFullDIBMode (int modenum) ExWindowStyle = 0; rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); + AdjustWindowRectEx(&rect, WindowStyle, false, 0); width = rect.right - rect.left; 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"); @@ -258,15 +229,13 @@ qboolean VID_SetFullDIBMode (int modenum) 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; - SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); return true; } @@ -274,17 +243,13 @@ qboolean VID_SetFullDIBMode (int modenum) int VID_SetMode (int modenum) { - int original_mode, temp; - qboolean stat; + 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) @@ -294,26 +259,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"); @@ -322,7 +270,6 @@ int VID_SetMode (int modenum) VID_UpdateWindowStatus (); CDAudio_Resume (); - scr_disabled_for_loading = temp; if (!stat) Sys_Error ("Couldn't set video mode"); @@ -355,8 +302,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; } @@ -382,120 +327,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 usemouse; + if (r_render.integer && !scr_skipupdate) + { + qglFinish(); SwapBuffers(maindc); + } // handle the mouse state when windowed if that's changed - if (modestate == MS_WINDOWED) + usemouse = false; + if (vid_mouse.integer && key_dest == key_game) + usemouse = true; + if (modestate == MS_FULLDIB) + usemouse = true; + if (!ActiveApp) + usemouse = false; + if (usemouse) { - if (!_windowed_mouse.value) + if (!usingmouse) { - if (windowed_mouse) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - windowed_mouse = false; - } + usingmouse = true; + IN_ActivateMouse (); + IN_HideMouse(); } - else + } + else + { + if (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 (); - } + usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse(); } } } @@ -505,6 +382,7 @@ void VID_SetDefaultMode (void) IN_DeactivateMouse (); } +void VID_RestoreSystemGamma(void); void VID_Shutdown (void) { @@ -522,8 +400,9 @@ void VID_Shutdown (void) wglMakeCurrent(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) wglDeleteContext(hRC); @@ -538,6 +417,8 @@ void VID_Shutdown (void) ReleaseDC (mainwindow, maindc); AppActivate(false, false); + + VID_RestoreSystemGamma(); } } @@ -572,21 +453,21 @@ BOOL bSetupPixelFormat(HDC hDC) if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) { MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); - return FALSE; + return false; } - if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE) + if (SetPixelFormat(hDC, pixelformat, &pfd) == false) { MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); - return FALSE; + return false; } - return TRUE; + 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 @@ -599,20 +480,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 -}; -*/ /* ======= @@ -628,8 +495,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]; } @@ -660,6 +525,9 @@ void ClearAllStates (void) IN_ClearStates (); } +void VID_RestoreGameGamma(void); +extern qboolean host_loopactive; + void AppActivate(BOOL fActive, BOOL minimize) /**************************************************************************** * @@ -693,48 +561,38 @@ 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); } + + // 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) - { - 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 (); + usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse (); + if (modestate == MS_FULLDIB && vid_canalttab) + { + 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; int fActive, fMinimized, temp; @@ -956,7 +814,6 @@ VID_NumModes_f */ void VID_NumModes_f (void) { - if (nummodes == 1) Con_Printf ("%d video mode is available\n", nummodes); else @@ -1050,40 +907,11 @@ void VID_InitDIB (HINSTANCE hInstance) wc.hCursor = LoadCursor (NULL,IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = 0; - wc.lpszClassName = "DarkPlaces"; + wc.lpszClassName = gamename; 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 @@ -1112,10 +940,8 @@ VID_InitFullDIB void VID_InitFullDIB (HINSTANCE hInstance) { DEVMODE devmode; -// int i; int modenum; int originalnummodes; -// int existingmode; int numlowresmodes; int j; int bpp; @@ -1142,41 +968,6 @@ void VID_InitFullDIB (HINSTANCE hInstance) 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"); } @@ -1592,3 +1360,4 @@ void VID_MenuKey (int key) break; } } +