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
// 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);
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);
{
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
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)
{
static float n[3], nd[3], nt[3];
static int init = true;
unsigned short *ramp;
- forcenextframe = true;
+ gamma_forcenextframe = true;
if (init)
{
init = false;
*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)
{
vid_usinghwgamma = false;
Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_systemgammaramps, vid_gammarampsize));
+ // force gamma situation to be reexamined next frame
+ gamma_forcenextframe = true;
}
}