X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=efefc6eabcd985f213e374ff7549db3a4aabf07b;hb=069527b0cff9d91784bba159329e01b0b94df752;hp=e8e7ca597b271922f18b5dfdf0689f6a46de3a97;hpb=9ba80c169d244d56e90f437c512f827953cc1208;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index e8e7ca59..efefc6ea 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -62,12 +62,11 @@ 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 *pcurrentmode; static vmode_t badmode; static DEVMODE gdevmode; @@ -75,7 +74,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 +93,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,28 +108,12 @@ 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}; +//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}; +//cvar_t _vid_default_mode_win = {"_vid_default_mode_win","3", true}; int window_center_x, window_center_y, window_x, window_y, window_width, window_height; RECT window_rect; @@ -174,13 +153,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 +176,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 +217,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 +235,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; } @@ -275,7 +250,7 @@ qboolean VID_SetFullDIBMode (int modenum) int VID_SetMode (int modenum) { int original_mode, temp; - qboolean stat; + qboolean stat = 0; MSG msg; if ((windowed && (modenum != 0)) || (!windowed && (modenum < 1)) || (!windowed && (modenum >= nummodes))) @@ -295,24 +270,28 @@ 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); - } +// if (vid_mouse.integer && key_dest == key_game) +// { +// stat = VID_SetWindowedMode(modenum); +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); +// } +// else +// { +// usingmouse = false; +// 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 (); +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); } else Sys_Error ("VID_SetMode: Bad mode type in modelist"); @@ -355,7 +334,7 @@ int VID_SetMode (int modenum) if (!msg_suppress_1) Con_SafePrintf ("Video mode %s initialized.\n", VID_GetModeDescription (vid_modenum)); - vid.recalc_refdef = 1; +// vid.recalc_refdef = 1; return true; } @@ -382,120 +361,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) + { + glFinish(); 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 +416,7 @@ void VID_SetDefaultMode (void) IN_DeactivateMouse (); } +void VID_RestoreSystemGamma(void); void VID_Shutdown (void) { @@ -522,7 +434,8 @@ 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; + for (i = 0;i < 8192;i++) + temp[i] = i+1; glDeleteTextures(8192, temp); if (hRC) @@ -538,6 +451,8 @@ void VID_Shutdown (void) ReleaseDC (mainwindow, maindc); AppActivate(false, false); + + VID_RestoreSystemGamma(); } } @@ -572,21 +487,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 @@ -600,7 +515,7 @@ byte scantokey[128] = }; /* -byte shiftscantokey[128] = +qbyte shiftscantokey[128] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 ,27 ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'_' ,'+' ,K_BACKSPACE,9 , // 0 @@ -660,6 +575,9 @@ void ClearAllStates (void) IN_ClearStates (); } +void VID_RestoreGameGamma(void); +extern qboolean host_loopactive; + void AppActivate(BOOL fActive, BOOL minimize) /**************************************************************************** * @@ -693,48 +611,59 @@ void AppActivate(BOOL fActive, BOOL minimize) { if (modestate == MS_FULLDIB) { - IN_ActivateMouse (); - IN_HideMouse (); - if (vid_canalttab && vid_wassuspended) { +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); + 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 (); - } +// else if ((modestate == MS_WINDOWED) && vid_mouse.integer && key_dest == key_game) +// { +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); +// } + if (host_loopactive) + VID_RestoreGameGamma(); } if (!fActive) { + usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse (); if (modestate == MS_FULLDIB) { - IN_DeactivateMouse (); - IN_ShowMouse (); - if (vid_canalttab) { +// usingmouse = false; +// 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 (); - } +// else if ((modestate == MS_WINDOWED) && vid_mouse.integer) +// { +// usingmouse = false; +// IN_DeactivateMouse (); +// IN_ShowMouse (); +// } + 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; @@ -1050,7 +979,7 @@ 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"); @@ -1247,37 +1176,75 @@ void VID_InitFullDIB (HINSTANCE hInstance) Con_SafePrintf ("No fullscreen DIB modes found\n"); } +//static int grabsysgamma = true; +WORD systemgammaramps[3][256], currentgammaramps[3][256]; + +int VID_SetGamma(float prescale, float gamma, float scale, float base) +{ + int i; + HDC hdc; + hdc = GetDC (NULL); + + BuildGammaTable16(prescale, gamma, scale, base, ¤tgammaramps[0][0]); + for (i = 0;i < 256;i++) + currentgammaramps[1][i] = currentgammaramps[2][i] = currentgammaramps[0][i]; + + i = SetDeviceGammaRamp(hdc, ¤tgammaramps[0][0]); + + ReleaseDC (NULL, hdc); + return i; // return success or failure +} + +void VID_RestoreGameGamma(void) +{ + VID_UpdateGamma(true); +} + +void VID_GetSystemGamma(void) +{ + HDC hdc; + hdc = GetDC (NULL); + + GetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); + + ReleaseDC (NULL, hdc); +} + +void VID_RestoreSystemGamma(void) +{ + HDC hdc; + hdc = GetDC (NULL); + + SetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); + + ReleaseDC (NULL, hdc); +} + /* =================== VID_Init =================== */ -void VID_Init () +void VID_Init (void) { int i; // int existingmode; - int basenummodes, width, height, bpp, findbpp, done; + int basenummodes, width, height = 0, bpp, findbpp, done; HDC hdc; DEVMODE devmode; memset(&devmode, 0, sizeof(devmode)); - Cvar_RegisterVariable (&vid_mode); - Cvar_RegisterVariable (&vid_wait); - Cvar_RegisterVariable (&vid_nopageflip); - Cvar_RegisterVariable (&_vid_wait_override); - Cvar_RegisterVariable (&_vid_default_mode); - Cvar_RegisterVariable (&_vid_default_mode_win); - Cvar_RegisterVariable (&vid_config_x); - Cvar_RegisterVariable (&vid_config_y); - Cvar_RegisterVariable (&vid_stretch_by_2); - Cvar_RegisterVariable (&_windowed_mouse); +// Cvar_RegisterVariable (&_vid_default_mode); +// Cvar_RegisterVariable (&_vid_default_mode_win); 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(); @@ -1486,9 +1453,9 @@ extern void M_Menu_Options_f (void); extern void M_Print (int cx, int cy, char *str); extern void M_PrintWhite (int cx, int cy, char *str); extern void M_DrawCharacter (int cx, int line, int num); -extern void M_DrawPic (int x, int y, qpic_t *pic); +extern void M_DrawPic (int x, int y, char *picname); -static int vid_line, vid_wmodes; +static int vid_wmodes; typedef struct { @@ -1510,17 +1477,17 @@ VID_MenuDraw */ void VID_MenuDraw (void) { - qpic_t *p; - char *ptr; - int lnummodes, i, k, column, row; - vmode_t *pv; + cachepic_t *p; + char *ptr; + int lnummodes, i, k, column, row; + vmode_t *pv; p = Draw_CachePic ("gfx/vidmodes.lmp"); - M_DrawPic ( (320-p->width)/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"); }