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.
+// AK FIXME -> input_dest
+qboolean in_client_mouse = true;
+
+// AK where should it be placed ?
+float in_mouse_x, in_mouse_y;
+
// GL_ARB_multitexture
int gl_textureunits = 0;
// GL_ARB_texture_env_combine or GL_EXT_texture_env_combine
int gl_support_var2 = false;
// GL_EXT_texture_filter_anisotropic
int gl_support_anisotropy = false;
+// GL_NV_texture_shader
+int gl_textureshader = false;
// LordHavoc: if window is hidden, don't update screen
int vid_hidden = true;
// LordHavoc: if window is not the active window, don't hog as much CPU time,
// let go of the mouse, turn off sound, and restore system gamma ramps...
int vid_activewindow = true;
-// LordHavoc: whether to allow use of hwgamma (disabled when window is inactive)
-int vid_allowhwgamma = false;
// we don't know until we try it!
-int vid_hardwaregammasupported = true;
+cvar_t vid_hardwaregammasupported = {CVAR_READONLY,"vid_hardwaregammasupported","1"};
// whether hardware gamma ramps are currently in effect
int vid_usinghwgamma = false;
cvar_t vid_fullscreen = {CVAR_SAVE, "vid_fullscreen", "1"};
cvar_t vid_width = {CVAR_SAVE, "vid_width", "640"};
cvar_t vid_height = {CVAR_SAVE, "vid_height", "480"};
-cvar_t vid_bitsperpixel = {CVAR_SAVE, "vid_bitsperpixel", "16"};
-cvar_t vid_stencil = {CVAR_SAVE, "vid_stencil", "0"};
+cvar_t vid_bitsperpixel = {CVAR_SAVE, "vid_bitsperpixel", "32"};
cvar_t vid_mouse = {CVAR_SAVE, "vid_mouse", "1"};
cvar_t gl_combine = {CVAR_SAVE, "gl_combine", "1"};
cvar_t v_color_white_r = {CVAR_SAVE, "v_color_white_r", "1"};
cvar_t v_color_white_g = {CVAR_SAVE, "v_color_white_g", "1"};
cvar_t v_color_white_b = {CVAR_SAVE, "v_color_white_b", "1"};
-cvar_t v_overbrightbits = {CVAR_SAVE, "v_overbrightbits", "0"};
cvar_t v_hwgamma = {CVAR_SAVE, "v_hwgamma", "1"};
+cvar_t v_psycho = {0, "v_psycho", "0"};
// brand of graphics chip
const char *gl_vendor;
void (GLAPIENTRY *qglClearStencil)(GLint s);
//void (GLAPIENTRY *qglTexEnvf)(GLenum target, GLenum pname, GLfloat param);
+void (GLAPIENTRY *qglTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params);
void (GLAPIENTRY *qglTexEnvi)(GLenum target, GLenum pname, GLint param);
void (GLAPIENTRY *qglTexParameterf)(GLenum target, GLenum pname, GLfloat param);
//void (GLAPIENTRY *qglTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
{"glStencilOp", (void **) &qglStencilOp},
{"glClearStencil", (void **) &qglClearStencil},
// {"glTexEnvf", (void **) &qglTexEnvf},
+ {"glTexEnvfv", (void **) &qglTexEnvfv},
{"glTexEnvi", (void **) &qglTexEnvi},
{"glTexParameterf", (void **) &qglTexParameterf},
// {"glTexParameterfv", (void **) &qglTexParameterfv},
void VID_CheckExtensions(void)
{
- gl_stencil = vid_stencil.integer;
+ gl_stencil = vid_bitsperpixel.integer == 32;
gl_combine_extension = false;
gl_dot3arb = false;
gl_supportslockarrays = false;
gl_support_anisotropy = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", NULL, "-noanisotropy", false);
+ gl_textureshader = GL_CheckExtension("GL_NV_texture_shader", NULL, "-notextureshader", false);
+
// we don't care if it's an extension or not, they are identical functions, so keep it simple in the rendering code
if (qglDrawRangeElements == NULL)
qglDrawRangeElements = qglDrawRangeElementsEXT;
CL_AdjustAngles();
}
+/*
+===========
+IN_DoMove
+===========
+*/
+void IN_ProcessMove(usercmd_t *cmd)
+{
+ // get basic movement from keyboard
+ CL_BaseMove(cmd);
+
+ // OS independent code
+ IN_PreMove();
+
+ // allow mice or other external controllers to add to the move
+ IN_Move(cmd);
+
+ // OS independent code
+ IN_PostMove();
+}
+
+
void IN_Mouse(usercmd_t *cmd, float mx, float my)
{
int mouselook = (in_mlook.state & 1) || freelook.integer;
old_mouse_x = mx;
old_mouse_y = my;
+ in_mouse_x = (float) mouse_x * vid.conwidth / vid.realwidth;
+ in_mouse_y = (float) mouse_y * vid.conheight / vid.realheight;
+
+ // AK: eveything else is client stuff
+ // BTW, this should be seperated somewhen
+ if(!in_client_mouse)
+ return;
+
// LordHavoc: viewzoom affects mouse sensitivity for sniping
mouse_x *= sensitivity.value * cl.viewzoom;
mouse_y *= sensitivity.value * cl.viewzoom;
}
static float cachegamma, cachebrightness, cachecontrast, cacheblack[3], cachegrey[3], cachewhite[3];
-static int cacheoverbrightbits = -1, cachecolorenable, cachehwgamma;
+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);
void VID_UpdateGamma(qboolean force)
{
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
- && vid_usinghwgamma == (vid_allowhwgamma && v_hwgamma.integer)
- && v_overbrightbits.integer == cacheoverbrightbits
+ && !forcenextframe
+ && !v_psycho.integer
+ && vid_usinghwgamma == (vid_activewindow && v_hwgamma.integer)
&& v_gamma.value == cachegamma
&& v_contrast.value == cachecontrast
&& v_brightness.value == cachebrightness
&& cachewhite[1] == v_color_white_g.value
&& cachewhite[2] == v_color_white_b.value)
return;
+
+ forcenextframe = false;
- if (vid_allowhwgamma && v_hwgamma.integer)
+ if (vid_activewindow && v_hwgamma.integer)
{
if (!vid_usinghwgamma)
{
vid_usinghwgamma = true;
- vid_hardwaregammasupported = VID_GetGamma(vid_systemgammaramps);
+ Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_GetGamma(vid_systemgammaramps));
}
BOUNDCVAR(v_gamma, 0.1, 5);cachegamma = v_gamma.value;
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;
- cacheoverbrightbits = v_overbrightbits.integer;
cachehwgamma = v_hwgamma.integer;
if (cachecolorenable)
{
- BuildGammaTable16((float) (1 << cacheoverbrightbits), invpow(0.5, 1 - cachegrey[0]), cachewhite[0], cacheblack[0], vid_gammaramps);
- BuildGammaTable16((float) (1 << cacheoverbrightbits), invpow(0.5, 1 - cachegrey[1]), cachewhite[1], cacheblack[1], vid_gammaramps + 256);
- BuildGammaTable16((float) (1 << cacheoverbrightbits), invpow(0.5, 1 - cachegrey[2]), cachewhite[2], cacheblack[2], vid_gammaramps + 512);
+ BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[0]), cachewhite[0], cacheblack[0], vid_gammaramps);
+ BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[1]), cachewhite[1], cacheblack[1], vid_gammaramps + 256);
+ BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[2]), cachewhite[2], cacheblack[2], vid_gammaramps + 512);
}
else
{
- BuildGammaTable16((float) (1 << cacheoverbrightbits), cachegamma, cachecontrast, cachebrightness, vid_gammaramps);
- BuildGammaTable16((float) (1 << cacheoverbrightbits), cachegamma, cachecontrast, cachebrightness, vid_gammaramps + 256);
- BuildGammaTable16((float) (1 << cacheoverbrightbits), cachegamma, cachecontrast, cachebrightness, vid_gammaramps + 512);
+ BuildGammaTable16(1.0f, cachegamma, cachecontrast, cachebrightness, vid_gammaramps);
+ BuildGammaTable16(1.0f, cachegamma, cachecontrast, cachebrightness, vid_gammaramps + 256);
+ BuildGammaTable16(1.0f, cachegamma, cachecontrast, cachebrightness, vid_gammaramps + 512);
+ }
+
+ // LordHavoc: this code came from Ben Winslow and Zinx Verituse, I have
+ // immensely butchered it to work with variable framerates and fit in with
+ // the rest of darkplaces.
+ if (v_psycho.integer)
+ {
+ int x, y;
+ float t;
+ static float n[3], nd[3], nt[3];
+ static int init = true;
+ unsigned short *ramp;
+ forcenextframe = true;
+ if (init)
+ {
+ init = false;
+ for (x = 0;x < 3;x++)
+ {
+ n[x] = lhrandom(0, 1);
+ nd[x] = (rand()&1)?-0.25:0.25;
+ nt[x] = lhrandom(1, 8.2);
+ }
+ }
+
+ for (x = 0;x < 3;x++)
+ {
+ nt[x] -= host_realframetime;
+ if (nt[x] < 0)
+ {
+ nd[x] = -nd[x];
+ nt[x] += lhrandom(1, 8.2);
+ }
+ n[x] += nd[x] * host_realframetime;
+ n[x] -= floor(n[x]);
+ }
+
+ for (x = 0, ramp = vid_gammaramps;x < 3;x++)
+ for (y = 0, t = n[x] - 0.75f;y < 256;y++, t += 0.75f * (2.0f / 256.0f))
+ *ramp++ = cos(t*(M_PI*2.0)) * 32767.0f + 32767.0f;
}
- vid_hardwaregammasupported = VID_SetGamma(vid_gammaramps);
+ Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_gammaramps));
}
else
{
if (vid_usinghwgamma)
{
vid_usinghwgamma = false;
- vid_hardwaregammasupported = VID_SetGamma(vid_systemgammaramps);
+ Cvar_SetValueQuick(&vid_hardwaregammasupported, VID_SetGamma(vid_systemgammaramps));
}
}
}
void VID_Shared_Init(void)
{
+ Cvar_RegisterVariable(&vid_hardwaregammasupported);
Cvar_RegisterVariable(&v_gamma);
Cvar_RegisterVariable(&v_brightness);
Cvar_RegisterVariable(&v_contrast);
Cvar_RegisterVariable(&v_color_white_b);
Cvar_RegisterVariable(&v_hwgamma);
- Cvar_RegisterVariable(&v_overbrightbits);
+
+ Cvar_RegisterVariable(&v_psycho);
Cvar_RegisterVariable(&vid_fullscreen);
Cvar_RegisterVariable(&vid_width);
Cvar_RegisterVariable(&vid_height);
Cvar_RegisterVariable(&vid_bitsperpixel);
- Cvar_RegisterVariable(&vid_stencil);
Cvar_RegisterVariable(&vid_mouse);
Cvar_RegisterVariable(&gl_combine);
Cvar_RegisterVariable(&in_pitch_min);
int current_vid_width;
int current_vid_height;
int current_vid_bitsperpixel;
-int current_vid_stencil;
-extern int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil);
-int VID_Mode(int fullscreen, int width, int height, int bpp, int stencil)
+extern int VID_InitMode (int fullscreen, int width, int height, int bpp);
+int VID_Mode(int fullscreen, int width, int height, int bpp)
{
- Con_Printf("Video: %s %dx%dx%d %s\n", fullscreen ? "fullscreen" : "window", width, height, bpp, stencil ? "with stencil" : "without stencil");
- if (VID_InitMode(fullscreen, width, height, bpp, stencil))
+ Con_Printf("Video: %s %dx%dx%d\n", fullscreen ? "fullscreen" : "window", width, height, bpp);
+ if (VID_InitMode(fullscreen, width, height, bpp))
{
current_vid_fullscreen = fullscreen;
current_vid_width = width;
current_vid_height = height;
current_vid_bitsperpixel = bpp;
- current_vid_stencil = stencil;
Cvar_SetValueQuick(&vid_fullscreen, fullscreen);
Cvar_SetValueQuick(&vid_width, width);
Cvar_SetValueQuick(&vid_height, height);
Cvar_SetValueQuick(&vid_bitsperpixel, bpp);
- Cvar_SetValueQuick(&vid_stencil, stencil);
return true;
}
else
static void VID_OpenSystems(void)
{
R_Modules_Start();
- S_Open();
- CDAudio_Open();
+ S_Startup();
+ CDAudio_Startup();
}
static void VID_CloseSystems(void)
{
- CDAudio_Close();
- S_Close();
+ CDAudio_Shutdown();
+ S_Shutdown();
R_Modules_Shutdown();
}
+int vid_commandlinecheck = true;
+
void VID_Restart_f(void)
{
- Con_Printf("VID_Restart: changing from %s %dx%dx%dbpp %s, to %s %dx%dx%dbpp %s.\n",
- current_vid_fullscreen ? "fullscreen" : "window", current_vid_width, current_vid_height, current_vid_bitsperpixel, current_vid_stencil ? "with stencil" : "without stencil",
- vid_fullscreen.integer ? "fullscreen" : "window", vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_stencil.integer ? "with stencil" : "without stencil");
+ // don't crash if video hasn't started yet
+ if (vid_commandlinecheck)
+ return;
+
+ Con_Printf("VID_Restart: changing from %s %dx%dx%dbpp, to %s %dx%dx%dbpp.\n",
+ current_vid_fullscreen ? "fullscreen" : "window", current_vid_width, current_vid_height, current_vid_bitsperpixel,
+ vid_fullscreen.integer ? "fullscreen" : "window", vid_width.integer, vid_height.integer, vid_bitsperpixel.integer);
VID_Close();
- if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_stencil.integer))
+ if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer))
{
Con_Printf("Video mode change failed\n");
- if (!VID_Mode(current_vid_fullscreen, current_vid_width, current_vid_height, current_vid_bitsperpixel, current_vid_stencil))
+ if (!VID_Mode(current_vid_fullscreen, current_vid_width, current_vid_height, current_vid_bitsperpixel))
Sys_Error("Unable to restore to last working video mode\n");
}
VID_OpenSystems();
}
-int vid_commandlinecheck = true;
void VID_Open(void)
{
int i, width, height;
Cvar_SetValueQuick(&vid_height, height);
if ((i = COM_CheckParm("-bpp")) != 0)
Cvar_SetQuick(&vid_bitsperpixel, com_argv[i+1]);
- if ((i = COM_CheckParm("-nostencil")) != 0)
- Cvar_SetValueQuick(&vid_stencil, 0);
- if ((i = COM_CheckParm("-stencil")) != 0)
- Cvar_SetValueQuick(&vid_stencil, 1);
- }
-
- if (vid_stencil.integer && vid_bitsperpixel.integer != 32)
- {
- Con_Printf("vid_stencil not allowed without vid_bitsperpixel 32, turning off vid_stencil\n");
- Cvar_SetValueQuick(&vid_stencil, 0);
}
Con_DPrintf("Starting video system\n");
- if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_stencil.integer))
+ if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer))
{
Con_Printf("Desired video mode fail, trying fallbacks...\n");
- if (!vid_stencil.integer || !VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, false))
+ if (vid_fullscreen.integer)
{
- if (vid_fullscreen.integer)
- {
- if (!VID_Mode(true, 640, 480, 16, false))
- if (!VID_Mode(false, 640, 480, 16, false))
- Sys_Error("Video modes failed\n");
- }
- else
- Sys_Error("Windowed video failed\n");
+ if (!VID_Mode(true, 640, 480, 16))
+ if (!VID_Mode(false, 640, 480, 16))
+ Sys_Error("Video modes failed\n");
}
+ else
+ Sys_Error("Windowed video failed\n");
}
VID_OpenSystems();
}