X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=e633c50ad9600c20e408b43577d50d256db29b3c;hb=a7f3098c45daeb30e23bdc6412cf1512ab1927c6;hp=dfce1bbb718436fae8cc71025f81f812bddb0164;hpb=8d87eaaa1c6e17eab795c6ee75c74965ca3ccda1;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index dfce1bbb..e633c50a 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -8,6 +8,12 @@ viddef_t vid; 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 @@ -32,17 +38,19 @@ int gl_support_var = false; int gl_support_var2 = false; // GL_EXT_texture_filter_anisotropic int gl_support_anisotropy = false; +// GL_NV_texture_shader +int gl_textureshader = false; +// GL_EXT_stencil_two_side +int gl_support_stenciltwoside = 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; @@ -52,8 +60,7 @@ unsigned short vid_systemgammaramps[768]; 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"}; @@ -76,8 +83,8 @@ cvar_t v_color_grey_b = {CVAR_SAVE, "v_color_grey_b", "0.5"}; 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; @@ -189,6 +196,7 @@ void (GLAPIENTRY *qglStencilOp)(GLenum fail, GLenum zfail, GLenum zpass); 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); @@ -225,6 +233,8 @@ void (GLAPIENTRY *qglScissor)(GLint x, GLint y, GLsizei width, GLsizei height); void (GLAPIENTRY *qglPolygonOffset)(GLfloat factor, GLfloat units); +void (GLAPIENTRY *qglActiveStencilFaceEXT)(GLenum); + int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *disableparm, int silent) { int failed = false; @@ -235,9 +245,9 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char * for (func = funcs;func && func->name;func++) *func->funcvariable = NULL; - if (disableparm && COM_CheckParm(disableparm)) + if (disableparm && (COM_CheckParm(disableparm) || COM_CheckParm("-safe"))) { - Con_DPrintf("disabled by commandline\n"); + Con_DPrint("disabled by commandline\n"); return false; } @@ -256,12 +266,12 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char * // delay the return so it prints all missing functions if (failed) return false; - Con_DPrintf("enabled\n"); + Con_DPrint("enabled\n"); return true; } else { - Con_DPrintf("not detected\n"); + Con_DPrint("not detected\n"); return false; } } @@ -329,6 +339,7 @@ static dllfunction_t opengl110funcs[] = {"glStencilOp", (void **) &qglStencilOp}, {"glClearStencil", (void **) &qglClearStencil}, // {"glTexEnvf", (void **) &qglTexEnvf}, + {"glTexEnvfv", (void **) &qglTexEnvfv}, {"glTexEnvi", (void **) &qglTexEnvi}, {"glTexParameterf", (void **) &qglTexParameterf}, // {"glTexParameterfv", (void **) &qglTexParameterfv}, @@ -408,10 +419,16 @@ static dllfunction_t wglvarfuncs[] = {NULL, NULL} }; +static dllfunction_t stenciltwosidefuncs[] = +{ + {"glActiveStencilFaceEXT", (void **) &qglActiveStencilFaceEXT}, + {NULL, NULL} +}; + 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; @@ -419,17 +436,18 @@ void VID_CheckExtensions(void) gl_support_clamptoedge = false; gl_support_var = false; gl_support_var2 = false; + gl_support_stenciltwoside = false; if (!GL_CheckExtension("OpenGL 1.1.0", opengl110funcs, NULL, false)) Sys_Error("OpenGL 1.1.0 functions not found\n"); - Con_DPrintf ("GL_VENDOR: %s\n", gl_vendor); - Con_DPrintf ("GL_RENDERER: %s\n", gl_renderer); - Con_DPrintf ("GL_VERSION: %s\n", gl_version); - Con_DPrintf ("GL_EXTENSIONS: %s\n", gl_extensions); - Con_DPrintf ("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions); + Con_DPrintf("GL_VENDOR: %s\n", gl_vendor); + Con_DPrintf("GL_RENDERER: %s\n", gl_renderer); + Con_DPrintf("GL_VERSION: %s\n", gl_version); + Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions); + Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions); - Con_DPrintf("Checking OpenGL extensions...\n"); + Con_DPrint("Checking OpenGL extensions...\n"); if (!GL_CheckExtension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true)) GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false); @@ -456,6 +474,10 @@ void VID_CheckExtensions(void) gl_support_anisotropy = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", NULL, "-noanisotropy", false); + gl_textureshader = GL_CheckExtension("GL_NV_texture_shader", NULL, "-notextureshader", false); + + gl_support_stenciltwoside = GL_CheckExtension("GL_EXT_stencil_two_side", stenciltwosidefuncs, "-nostenciltwoside", 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; @@ -509,6 +531,27 @@ void IN_PostMove(void) 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; @@ -529,6 +572,14 @@ void IN_Mouse(usercmd_t *cmd, float mx, float my) 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; @@ -554,20 +605,22 @@ void IN_Mouse(usercmd_t *cmd, float mx, float my) } 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 @@ -582,13 +635,15 @@ void VID_UpdateGamma(qboolean force) && 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; @@ -604,30 +659,68 @@ void VID_UpdateGamma(qboolean force) 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); } - vid_hardwaregammasupported = VID_SetGamma(vid_gammaramps); + // 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; + } + + 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)); } } } @@ -643,6 +736,7 @@ void VID_RestoreSystemGamma(void) void VID_Shared_Init(void) { + Cvar_RegisterVariable(&vid_hardwaregammasupported); Cvar_RegisterVariable(&v_gamma); Cvar_RegisterVariable(&v_brightness); Cvar_RegisterVariable(&v_contrast); @@ -659,13 +753,13 @@ void VID_Shared_Init(void) 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); @@ -681,23 +775,19 @@ int current_vid_fullscreen; 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) +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 @@ -707,43 +797,48 @@ int VID_Mode(int fullscreen, int width, int height, int bpp, int stencil) 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)) + Con_Print("Video mode change failed\n"); + 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; + int i, width, height, success; if (vid_commandlinecheck) { // interpret command-line parameters vid_commandlinecheck = false; - if ((i = COM_CheckParm("-window")) != 0) + if (COM_CheckParm("-window") || COM_CheckParm("-safe")) Cvar_SetValueQuick(&vid_fullscreen, false); - if ((i = COM_CheckParm("-fullscreen")) != 0) + if (COM_CheckParm("-fullscreen")) Cvar_SetValueQuick(&vid_fullscreen, true); width = 0; height = 0; @@ -761,33 +856,21 @@ void VID_Open(void) 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)) + Con_DPrint("Starting video system\n"); + success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer); + if (!success) { - 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_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"); - } + Con_Print("Desired video mode fail, trying fallbacks...\n"); + if (!success && vid_bitsperpixel.integer > 16) + success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, 16); + if (!success && (vid_width.integer > 640 || vid_height.integer > 480)) + success = VID_Mode(vid_fullscreen.integer, 640, 480, 16); + if (!success && vid_fullscreen.integer) + success = VID_Mode(false, 640, 480, 16); + if (!success) + Sys_Error("Video modes failed\n"); } VID_OpenSystems(); }