]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_wgl.c
increased build number to 103
[xonotic/darkplaces.git] / vid_wgl.c
index 3ef91f208675be55c839b0ee065e9e70d5978c18..b1417868d4904aba53c8bf8492234d15456921f9 100644 (file)
--- a/vid_wgl.c
+++ b/vid_wgl.c
@@ -75,7 +75,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;
 
@@ -113,22 +113,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};
 // 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;
@@ -289,24 +279,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.value && 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");
@@ -376,44 +370,11 @@ 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;
+       gl_mtexable = false;
        // Check to see if multitexture is disabled
        if (COM_CheckParm("-nomtex"))
        {
@@ -437,10 +398,29 @@ void VID_CheckMultitexture(void)
                gl_mtexable = true;
                gl_mtex_enum = TEXTURE0_SGIS;
        }
-       if (!gl_mtexable)
+       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
@@ -462,34 +442,34 @@ void GL_BeginRendering (int *x, int *y, int *width, int *height)
 
 void GL_EndRendering (void)
 {
+       int usemouse;
        if (r_render.value && !scr_skipupdate)
                SwapBuffers(maindc);
 
 // handle the mouse state when windowed if that's changed
-       if (modestate == MS_WINDOWED)
+       usemouse = false;
+       if (vid_mouse.value && 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();
                }
        }
 }
@@ -499,6 +479,7 @@ void VID_SetDefaultMode (void)
        IN_DeactivateMouse ();
 }
 
+void VID_RestoreSystemGamma(void);
 
 void   VID_Shutdown (void)
 {
@@ -516,7 +497,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)
@@ -532,6 +514,8 @@ void        VID_Shutdown (void)
                        ReleaseDC (mainwindow, maindc);
 
                AppActivate(false, false);
+
+               VID_RestoreSystemGamma();
        }
 }
 
@@ -654,6 +638,8 @@ void ClearAllStates (void)
        IN_ClearStates ();
 }
 
+void VID_RestoreGameGamma(void);
+
 void AppActivate(BOOL fActive, BOOL minimize)
 /****************************************************************************
 *
@@ -687,9 +673,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);
@@ -698,29 +686,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 ();
-               }
+//             else if ((modestate == MS_WINDOWED) && vid_mouse.value && key_dest == key_game)
+//             {
+//                     usingmouse = true;
+//                     IN_ActivateMouse ();
+//                     IN_HideMouse ();
+//             }
+               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.value)
+//             {
+//                     usingmouse = false;
+//                     IN_DeactivateMouse ();
+//                     IN_ShowMouse ();
+//             }
+               VID_RestoreSystemGamma();
        }
 }
 
@@ -1244,12 +1241,56 @@ 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, &currentgammaramps[0][0]);
+       for (i = 0;i < 256;i++)
+               currentgammaramps[1][i] = currentgammaramps[2][i] = currentgammaramps[0][i];
+
+       i = SetDeviceGammaRamp(hdc, &currentgammaramps[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;
@@ -1259,16 +1300,16 @@ void    VID_Init ()
 
        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();
@@ -1554,14 +1595,10 @@ void VID_MenuDraw (void)
                }
        }
 
-       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 <width>");
-       M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4,
-                        "and -bpp <bits-per-pixel>");
-       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 <width>");
+       M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, "and -bpp <bits-per-pixel>");
+       M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, "Select windowed mode with -window");
 }