X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=196eefe8c7f8aa4b6e9ddc0b3534b3124c653588;hb=80d654cf67c3ace4f18cb237c966d440d6fdcc99;hp=46325de89f8a51b322f34ccbe0f51cdd0cb06da9;hpb=cec939da1f741bb56cf5921b61309ecef1644091;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index 46325de8..196eefe8 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -92,7 +92,7 @@ cvar_t v_color_grey_b = {CVAR_SAVE, "v_color_grey_b", "0.5", "desired color of g cvar_t v_color_white_r = {CVAR_SAVE, "v_color_white_r", "1", "desired color of white"}; cvar_t v_color_white_g = {CVAR_SAVE, "v_color_white_g", "1", "desired color of white"}; cvar_t v_color_white_b = {CVAR_SAVE, "v_color_white_b", "1", "desired color of white"}; -cvar_t v_hwgamma = {CVAR_SAVE, "v_hwgamma", "1", "enables use of hardware gamma correction ramps if available (note: does not work very well on Windows2000 and above)"}; +cvar_t v_hwgamma = {CVAR_SAVE, "v_hwgamma", "1", "enables use of hardware gamma correction ramps if available (note: does not work very well on Windows2000 and above), values are 0 = off, 1 = attempt to use hardware gamma, 2 = use hardware gamma whether it works or not"}; cvar_t v_psycho = {0, "v_psycho", "0", "easter egg (does not work on Windows2000 or above)"}; // brand of graphics chip @@ -665,7 +665,14 @@ void VID_CheckExtensions(void) // COMMANDLINEOPTION: GL: -notexture3d disables GL_EXT_texture3D (required for spherical lights, otherwise they render as a column) if ((gl_texture3d = GL_CheckExtension("GL_EXT_texture3D", texture3dextfuncs, "-notexture3d", false))) + { qglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &gl_max_3d_texture_size); + if (gl_max_3d_texture_size < 32) + { + gl_texture3d = false; + Con_Printf("GL_EXT_texture3D reported bogus GL_MAX_3D_TEXTURE_SIZE, disabled\n"); + } + } // COMMANDLINEOPTION: GL: -nocubemap disables GL_ARB_texture_cube_map (required for bumpmapping) if ((gl_texturecubemap = GL_CheckExtension("GL_ARB_texture_cube_map", NULL, "-nocubemap", false))) qglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &gl_max_cube_map_texture_size); @@ -701,6 +708,7 @@ void Force_CenterView_f (void) cl.viewangles[PITCH] = 0; } +static int gamma_forcenextframe = false; static float cachegamma, cachebrightness, cachecontrast, cacheblack[3], cachegrey[3], cachewhite[3]; static int cachecolorenable, cachehwgamma; #define BOUNDCVAR(cvar, m1, m2) c = &(cvar);f = bound(m1, c->value, m2);if (c->value != f) Cvar_SetValueQuick(c, f); @@ -708,16 +716,15 @@ void VID_UpdateGamma(qboolean force, int rampsize) { cvar_t *c; float f; - static int forcenextframe = false; // LordHavoc: don't mess with gamma tables if running dedicated if (cls.state == ca_dedicated) return; if (!force - && !forcenextframe + && !gamma_forcenextframe && !v_psycho.integer - && cachehwgamma == (vid_activewindow && v_hwgamma.integer) + && cachehwgamma == (vid_activewindow ? v_hwgamma.integer : 0) && v_gamma.value == cachegamma && v_contrast.value == cachecontrast && v_brightness.value == cachebrightness @@ -746,9 +753,9 @@ void VID_UpdateGamma(qboolean force, int rampsize) BOUNDCVAR(v_color_white_g, 1, 5);cachewhite[1] = v_color_white_g.value; BOUNDCVAR(v_color_white_b, 1, 5);cachewhite[2] = v_color_white_b.value; cachecolorenable = v_color_enable.integer; - cachehwgamma = vid_activewindow && v_hwgamma.integer; + cachehwgamma = vid_activewindow ? v_hwgamma.integer : 0; - forcenextframe = false; + gamma_forcenextframe = false; if (cachehwgamma) { @@ -789,7 +796,7 @@ void VID_UpdateGamma(qboolean force, int rampsize) static float n[3], nd[3], nt[3]; static int init = true; unsigned short *ramp; - forcenextframe = true; + gamma_forcenextframe = true; if (init) { init = false; @@ -818,16 +825,26 @@ void VID_UpdateGamma(qboolean force, int rampsize) *ramp++ = (unsigned short)(cos(t*(M_PI*2.0)) * 32767.0f + 32767.0f); } - Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_gammaramps, vid_gammarampsize)); + // set vid_hardwaregammasupported to true if VID_SetGamma succeeds, OR if vid_hwgamma is >= 2 (forced gamma - ignores driver return value) + Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_gammaramps, vid_gammarampsize) || cachehwgamma >= 2); // if custom gamma ramps failed (Windows stupidity), restore to system gamma if(!vid_hardwaregammasupported.integer) { - VID_RestoreSystemGamma(); - Cvar_SetValueQuick(&vid_hardwaregammasupported, false); + if (vid_usinghwgamma) + { + vid_usinghwgamma = false; + VID_SetGamma(vid_systemgammaramps, vid_gammarampsize); + } } } else - VID_RestoreSystemGamma(); + { + if (vid_usinghwgamma) + { + vid_usinghwgamma = false; + VID_SetGamma(vid_systemgammaramps, vid_gammarampsize); + } + } } void VID_RestoreSystemGamma(void) @@ -836,6 +853,8 @@ void VID_RestoreSystemGamma(void) { vid_usinghwgamma = false; Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_systemgammaramps, vid_gammarampsize)); + // force gamma situation to be reexamined next frame + gamma_forcenextframe = true; } }