X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=08f7cdd435feb24b747eddd0e964d4107ec10fac;hb=0073058c72eb97be474c31b5867cf20d96b4dd78;hp=fe9ec2cbf0471adec62bad6aa2dd608c0e2651f9;hpb=e4b3858e7aca0ead91be1d8f675db084d025abad;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index fe9ec2cb..08f7cdd4 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); @@ -115,12 +110,10 @@ void VID_UpdateWindowStatus (void); //==================================== -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; @@ -166,7 +159,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"); @@ -183,8 +176,6 @@ 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); @@ -232,7 +223,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"); @@ -244,8 +235,6 @@ 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; @@ -260,16 +249,17 @@ qboolean VID_SetFullDIBMode (int modenum) int VID_SetMode (int modenum) { - int original_mode, temp; - qboolean stat; + int original_mode; + //int temp; + 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; +// temp = scr_disabled_for_loading; +// scr_disabled_for_loading = true; CDAudio_Pause (); @@ -281,24 +271,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"); @@ -308,7 +302,7 @@ int VID_SetMode (int modenum) VID_UpdateWindowStatus (); CDAudio_Resume (); - scr_disabled_for_loading = temp; +// scr_disabled_for_loading = temp; if (!stat) Sys_Error ("Couldn't set video mode"); @@ -341,7 +335,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; } @@ -368,106 +362,52 @@ void VID_UpdateWindowStatus (void) //==================================== -void VID_CheckMultitexture(void) -{ - qglMTexCoord2f = NULL; - qglSelectTexture = NULL; - gl_mtexable = false; - // 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; - } - else - Con_Printf("...multitexture disabled (not detected)\n"); -} - -void VID_CheckCVA(void) -{ - qglLockArraysEXT = NULL; - qglUnlockArraysEXT = NULL; - gl_supportslockarrays = false; - if (COM_CheckParm("-nocva")) - { - Con_Printf("...compiled vertex arrays disabled\n"); - return; - } - if (strstr(gl_extensions, "GL_EXT_compiled_vertex_array")) - { - Con_Printf("...using compiled vertex arrays\n"); - qglLockArraysEXT = (void *) wglGetProcAddress("glLockArraysEXT"); - qglUnlockArraysEXT = (void *) wglGetProcAddress("glUnlockArraysEXT"); - gl_supportslockarrays = true; - } -} - /* ================= -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(); } } } @@ -477,6 +417,7 @@ void VID_SetDefaultMode (void) IN_DeactivateMouse (); } +void VID_RestoreSystemGamma(void); void VID_Shutdown (void) { @@ -494,7 +435,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) @@ -510,6 +452,8 @@ void VID_Shutdown (void) ReleaseDC (mainwindow, maindc); AppActivate(false, false); + + VID_RestoreSystemGamma(); } } @@ -558,7 +502,7 @@ BOOL bSetupPixelFormat(HDC hDC) -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 @@ -572,7 +516,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 @@ -632,6 +576,9 @@ void ClearAllStates (void) IN_ClearStates (); } +void VID_RestoreGameGamma(void); +extern qboolean host_loopactive; + void AppActivate(BOOL fActive, BOOL minimize) /**************************************************************************** * @@ -665,9 +612,11 @@ 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); @@ -676,40 +625,46 @@ 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 (); - } +// 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; @@ -1025,7 +980,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"); @@ -1222,31 +1177,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_default_mode); // Cvar_RegisterVariable (&_vid_default_mode_win); - Cvar_RegisterVariable (&_windowed_mouse); 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(); @@ -1455,9 +1454,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 { @@ -1479,17 +1478,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"); }