X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=b76da3d608cb2935c81f64d2ba30200449132bc3;hb=7101ee8792b04808dbe15d80a06bdad5c281db20;hp=13c9b42562835bf3df5f7c45662766f0887062e0;hpb=bd7ed880a8296d698518fe2749e1485a007b4071;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 13c9b425..b76da3d6 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -73,16 +73,18 @@ static dllfunction_t wglswapintervalfuncs[] = {NULL, NULL} }; -qboolean scr_skipupdate; - static DEVMODE gdevmode; static qboolean vid_initialized = false; static qboolean vid_wassuspended = false; -static int vid_usingmouse; -extern qboolean mouseactive; // from in_win.c +static qboolean vid_usingmouse = false; +static qboolean vid_usingvsync = false; +static qboolean vid_usemouse = false; +static qboolean vid_usevsync = false; static HICON hIcon; HWND mainwindow; +static HDC baseDC; +static HGLRC baseRC; //HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); @@ -145,7 +147,7 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, int mouse_buttons; int mouse_oldbuttonstate; POINT current_pos; -int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum; +int mouse_x, mouse_y, old_mouse_x, old_mouse_y; static qboolean restore_spi; static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; @@ -260,7 +262,7 @@ static DIDATAFORMAT df = { // forward-referenced functions void IN_StartupJoystick (void); void Joy_AdvancedUpdate_f (void); -void IN_JoyMove (usercmd_t *cmd); +void IN_JoyMove (void); void IN_StartupMouse (void); /* @@ -303,14 +305,11 @@ void VID_GetWindowSize (int *x, int *y, int *width, int *height) void VID_Finish (void) { - HDC hdc; - int vid_usemouse; - if (r_render.integer && !scr_skipupdate) + vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable; + if (vid_usingvsync != vid_usevsync && gl_videosyncavailable) { - qglFinish(); - hdc = GetDC(mainwindow); - SwapBuffers(hdc); - ReleaseDC(mainwindow, hdc); + vid_usingvsync = vid_usevsync; + qwglSwapIntervalEXT (vid_usevsync); } // handle the mouse state when windowed if that's changed @@ -339,6 +338,13 @@ void VID_Finish (void) IN_ShowMouse(); } } + + if (r_render.integer && !vid_hidden) + { + if (r_speeds.integer || gl_finish.integer) + qglFinish(); + SwapBuffers(baseDC); + } } //========================================================================== @@ -367,7 +373,7 @@ MapKey Map from windows to quake keynums ======= */ -int MapKey (int key, int virtualkey) +static int MapKey (int key, int virtualkey) { int result; int modified = (key >> 16) & 255; @@ -514,9 +520,6 @@ void Sys_SendKeyEvents (void) while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { - // we always update if there are any event, even if we're paused - scr_skipupdate = 0; - if (!GetMessage (&msg, NULL, 0, 0)) Sys_Quit (); @@ -557,7 +560,7 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) window_y = (int) HIWORD(lParam); VID_UpdateWindowStatus (); break; - + case WM_KEYDOWN: case WM_SYSKEYDOWN: down = true; @@ -690,7 +693,18 @@ int VID_GetGamma(unsigned short *ramps) static HINSTANCE gldll; -int GL_OpenLibrary(const char *name) +static void GL_CloseLibrary(void) +{ + FreeLibrary(gldll); + gldll = 0; + gl_driver[0] = 0; + qwglGetProcAddress = NULL; + gl_extensions = ""; + gl_platform = ""; + gl_platformextensions = ""; +} + +static int GL_OpenLibrary(const char *name) { Con_Printf("Loading OpenGL driver %s\n", name); GL_CloseLibrary(); @@ -703,17 +717,6 @@ int GL_OpenLibrary(const char *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; @@ -779,7 +782,6 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) }; int pixelformat; DWORD WindowStyle, ExWindowStyle; - HGLRC baseRC; int CenterX, CenterY; const char *gldrivername; int depth; @@ -800,6 +802,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) } gldrivername = "opengl32.dll"; +// COMMANDLINEOPTION: Windows WGL: -gl_driver selects a GL driver library, default is opengl32.dll, useful only for 3dfxogl.dll or 3dfxvgl.dll, if you don't know what this is for, you don't need it i = COM_CheckParm("-gl_driver"); if (i && i < com_argc - 1) gldrivername = com_argv[i + 1]; @@ -923,19 +926,19 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) // fix the leftover Alt from any Alt-Tab or the like that switched us away ClearAllStates (); - hdc = GetDC(mainwindow); + baseDC = GetDC(mainwindow); - if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0) + if ((pixelformat = ChoosePixelFormat(baseDC, &pfd)) == 0) { VID_Shutdown(); - Con_Printf("ChoosePixelFormat(%d, %p) failed\n", hdc, &pfd); + Con_Printf("ChoosePixelFormat(%d, %p) failed\n", baseDC, &pfd); return false; } - if (SetPixelFormat(hdc, pixelformat, &pfd) == false) + if (SetPixelFormat(baseDC, pixelformat, &pfd) == false) { VID_Shutdown(); - Con_Printf("SetPixelFormat(%d, %d, %p) failed\n", hdc, pixelformat, &pfd); + Con_Printf("SetPixelFormat(%d, %d, %p) failed\n", baseDC, pixelformat, &pfd); return false; } @@ -946,17 +949,17 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) return false; } - baseRC = qwglCreateContext(hdc); + baseRC = qwglCreateContext(baseDC); if (!baseRC) { VID_Shutdown(); Con_Print("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window.\n"); return false; } - if (!qwglMakeCurrent(hdc, baseRC)) + if (!qwglMakeCurrent(baseDC, baseRC)) { VID_Shutdown(); - Con_Printf("wglMakeCurrent(%d, %d) failed\n", hdc, baseRC); + Con_Printf("wglMakeCurrent(%d, %d) failed\n", baseDC, baseRC); return false; } @@ -975,11 +978,14 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) gl_platform = "WGL"; gl_platformextensions = ""; + gl_videosyncavailable = false; + if (qwglGetExtensionsStringARB) - gl_platformextensions = qwglGetExtensionsStringARB(hdc); + gl_platformextensions = qwglGetExtensionsStringARB(baseDC); - gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, NULL, false); - ReleaseDC(mainwindow, hdc); +// COMMANDLINEOPTION: Windows WGL: -novideosync disables WGL_EXT_swap_control + gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, "-novideosync", false); + //ReleaseDC(mainwindow, hdc); GL_Init (); @@ -994,6 +1000,8 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) //vid_menudrawfn = VID_MenuDraw; //vid_menukeyfn = VID_MenuKey; + vid_usingmouse = false; + vid_usingvsync = false; vid_hidden = false; vid_initialized = true; @@ -1006,9 +1014,6 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) static void IN_Shutdown(void); void VID_Shutdown (void) { - HGLRC hRC = 0; - HDC hDC = 0; - if(vid_initialized == false) return; @@ -1016,18 +1021,14 @@ void VID_Shutdown (void) vid_initialized = false; IN_Shutdown(); - if (qwglGetCurrentContext) - hRC = qwglGetCurrentContext(); - if (qwglGetCurrentDC) - hDC = qwglGetCurrentDC(); if (qwglMakeCurrent) qwglMakeCurrent(NULL, NULL); - if (hRC && qwglDeleteContext) - qwglDeleteContext(hRC); + if (baseRC && qwglDeleteContext) + qwglDeleteContext(baseRC); // close the library before we get rid of the window GL_CloseLibrary(); - if (hDC && mainwindow) - ReleaseDC(mainwindow, hDC); + if (baseDC && mainwindow) + ReleaseDC(mainwindow, baseDC); AppActivate(false, false); if (mainwindow) DestroyWindow(mainwindow); @@ -1177,7 +1178,7 @@ qboolean IN_InitDInput (void) if (hInstDI == NULL) { - Con_SafePrint("Couldn't load dinput.dll\n"); + Con_Print("Couldn't load dinput.dll\n"); return false; } } @@ -1188,7 +1189,7 @@ qboolean IN_InitDInput (void) if (!pDirectInputCreate) { - Con_SafePrint("Couldn't get DI proc addr\n"); + Con_Print("Couldn't get DI proc addr\n"); return false; } } @@ -1206,7 +1207,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrint("Couldn't open DI mouse device\n"); + Con_Print("Couldn't open DI mouse device\n"); return false; } @@ -1215,7 +1216,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrint("Couldn't set DI mouse format\n"); + Con_Print("Couldn't set DI mouse format\n"); return false; } @@ -1225,7 +1226,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrint("Couldn't set DI coop level\n"); + Con_Print("Couldn't set DI coop level\n"); return false; } @@ -1236,7 +1237,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrint("Couldn't set DI buffersize\n"); + Con_Print("Couldn't set DI buffersize\n"); return false; } @@ -1256,17 +1257,18 @@ void IN_StartupMouse (void) mouseinitialized = true; +// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input if (COM_CheckParm ("-dinput")) { dinput = IN_InitDInput (); if (dinput) { - Con_SafePrint("DirectInput initialized\n"); + Con_Print("DirectInput initialized\n"); } else { - Con_SafePrint("DirectInput not initialized\n"); + Con_Print("DirectInput not initialized\n"); } } @@ -1276,15 +1278,18 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { +// COMMANDLINEOPTION: Windows GDI Input: -noforcemspd disables setting of mouse speed (not used with -dinput, windows only) if ( COM_CheckParm ("-noforcemspd") ) newmouseparms[2] = originalmouseparms[2]; +// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (not used with -dinput, windows only) if ( COM_CheckParm ("-noforcemaccel") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; } +// COMMANDLINEOPTION: Windows GDI Input: -noforcemparms disables setting of mouse parameters (not used with -dinput, windows only) if ( COM_CheckParm ("-noforcemparms") ) { newmouseparms[0] = originalmouseparms[0]; @@ -1340,7 +1345,7 @@ void IN_MouseEvent (int mstate) IN_MouseMove =========== */ -void IN_MouseMove (usercmd_t *cmd) +void IN_MouseMove (void) { int i, mx, my; DIDEVICEOBJECTDATA od; @@ -1351,7 +1356,7 @@ void IN_MouseMove (usercmd_t *cmd) { GetCursorPos (¤t_pos); //ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y); - IN_Mouse( cmd, 0, 0 ); + IN_Mouse( 0, 0 ); return; } @@ -1434,13 +1439,11 @@ void IN_MouseMove (usercmd_t *cmd) else { GetCursorPos (¤t_pos); - mx = current_pos.x - window_center_x + mx_accum; - my = current_pos.y - window_center_y + my_accum; - mx_accum = 0; - my_accum = 0; + mx = current_pos.x - window_center_x; + my = current_pos.y - window_center_y; } - IN_Mouse(cmd, mx, my); + IN_Mouse(mx, my); // if the mouse has moved, force it to the center, so there's room to move if (!dinput && (mx || my)) @@ -1453,35 +1456,12 @@ void IN_MouseMove (usercmd_t *cmd) IN_Move =========== */ -void IN_Move (usercmd_t *cmd) +void IN_Move (void) { if (vid_activewindow && !vid_hidden) { - IN_MouseMove (cmd); - IN_JoyMove (cmd); - } -} - - -/* -=========== -IN_Accumulate -=========== -*/ -void IN_Accumulate (void) -{ - if (mouseactive) - { - if (!dinput) - { - GetCursorPos (¤t_pos); - - mx_accum += current_pos.x - window_center_x; - my_accum += current_pos.y - window_center_y; - - // force the mouse to the center, so there's room to move - SetCursorPos (window_center_x, window_center_y); - } + IN_MouseMove (); + IN_JoyMove (); } } @@ -1494,11 +1474,7 @@ IN_ClearStates void IN_ClearStates (void) { if (mouseactive) - { - mx_accum = 0; - my_accum = 0; mouse_oldbuttonstate = 0; - } } @@ -1518,6 +1494,7 @@ void IN_StartupJoystick (void) joy_avail = false; // abort startup if user requests no joystick +// COMMANDLINEOPTION: Windows Input: -nojoy disables joystick support, may be a small speed increase if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe")) return; @@ -1692,13 +1669,13 @@ void IN_Commands (void) { if ( (buttonstate & (1< joy_forwardthreshold.value) { - cmd->forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; + cl.cmd.forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; } } break; @@ -1880,7 +1857,7 @@ void IN_JoyMove (usercmd_t *cmd) case AxisSide: if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } break; @@ -1890,7 +1867,7 @@ void IN_JoyMove (usercmd_t *cmd) // user wants turn control to become side control if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } } else