From 685e171914f1c0709b04ca02c97505a4055001f0 Mon Sep 17 00:00:00 2001 From: lordhavoc Date: Tue, 30 Oct 2001 21:55:46 +0000 Subject: [PATCH] added support for GL_ARB_texture_env_combine, currently only used on wall rendering (for 4x overbright support) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@988 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_poly.c | 54 +++++++++++++++++++++++++++++++++++++----- gl_rmain.c | 4 ++-- gl_rsurf.c | 65 ++++++++++++++------------------------------------- gl_screen.c | 47 +++++++++++++++++++++++++------------ glquake.h | 60 +++++++++++++++++++++++++++++++++++++++++++++-- model_brush.h | 4 ++-- render.h | 4 +++- vid_shared.c | 23 ++++++++++++++++++ 8 files changed, 185 insertions(+), 76 deletions(-) diff --git a/gl_poly.c b/gl_poly.c index 67def33c..0992cb11 100644 --- a/gl_poly.c +++ b/gl_poly.c @@ -420,12 +420,54 @@ void wallpolyrender(void) } else if (r_multitexture.value) { - qglSelectTexture(gl_mtex_enum+0); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glEnable(GL_TEXTURE_2D); - qglSelectTexture(gl_mtex_enum+1); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glEnable(GL_TEXTURE_2D); + if (gl_combine.value) + { + qglSelectTexture(gl_mtex_enum+0); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.0); + glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0); + glEnable(GL_TEXTURE_2D); + qglSelectTexture(gl_mtex_enum+1); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS_ARB); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, GL_SRC_ALPHA); + glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 4.0); + glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0); + glEnable(GL_TEXTURE_2D); + } + else + { + qglSelectTexture(gl_mtex_enum+0); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glEnable(GL_TEXTURE_2D); + qglSelectTexture(gl_mtex_enum+1); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glEnable(GL_TEXTURE_2D); + } texnum = -1; lighttexnum = -1; for (i = 0,p = wallpoly;i < currentwallpoly;i++, p++) diff --git a/gl_rmain.c b/gl_rmain.c index f11072eb..57f7dd9c 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -329,6 +329,7 @@ GL_Init =============== */ extern char *ENGINE_EXTENSIONS; +extern void VID_CheckCombine(void); void GL_Init (void) { gl_vendor = glGetString (GL_VENDOR); @@ -345,6 +346,7 @@ void GL_Init (void) VID_CheckMultitexture(); VID_CheckCVA(); + VID_CheckCombine(); // LordHavoc: report supported extensions Con_Printf ("\nengine extensions: %s\n", ENGINE_EXTENSIONS); @@ -940,8 +942,6 @@ void R_RenderView (void) R_MoveParticles (); R_MoveExplosions(); - lighthalf = gl_lightmode.value; - FOG_framebegin(); R_Clear(); diff --git a/gl_rsurf.c b/gl_rsurf.c index a5987aad..8797b9d0 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -194,63 +194,32 @@ int R_AddDynamicLights (msurface_t *surf) void R_ConvertLightmap (int *in, byte *out, int width, int height, int stride) { - int i, j; + int i, j, shift; stride -= (width*lightmapbytes); - if (lighthalf) + // deal with lightmap brightness scale + shift = 7 + lightscalebit; + if (lightmaprgba) { - // LordHavoc: I shift down by 8 unlike GLQuake's 7, - // the image is brightened as a processing pass - if (lightmaprgba) + for (i = 0;i < height;i++, out += stride) { - for (i = 0;i < height;i++, out += stride) + for (j = 0;j < width;j++, in += 3, out += 4) { - for (j = 0;j < width;j++, in += 3, out += 4) - { - out[0] = min(in[0] >> 8, 255); - out[1] = min(in[1] >> 8, 255); - out[2] = min(in[2] >> 8, 255); - out[3] = 255; - } - } - } - else - { - for (i = 0;i < height;i++, out += stride) - { - for (j = 0;j < width;j++, in += 3, out += 3) - { - out[0] = min(in[0] >> 8, 255); - out[1] = min(in[1] >> 8, 255); - out[2] = min(in[2] >> 8, 255); - } + out[0] = min(in[0] >> shift, 255); + out[1] = min(in[1] >> shift, 255); + out[2] = min(in[2] >> shift, 255); + out[3] = 255; } } } else { - if (lightmaprgba) - { - for (i = 0;i < height;i++, out += stride) - { - for (j = 0;j < width;j++, in += 3, out += 4) - { - out[0] = min(in[0] >> 7, 255); - out[1] = min(in[1] >> 7, 255); - out[2] = min(in[2] >> 7, 255); - out[3] = 255; - } - } - } - else + for (i = 0;i < height;i++, out += stride) { - for (i = 0;i < height;i++, out += stride) + for (j = 0;j < width;j++, in += 3, out += 3) { - for (j = 0;j < width;j++, in += 3, out += 3) - { - out[0] = min(in[0] >> 7, 255); - out[1] = min(in[1] >> 7, 255); - out[2] = min(in[2] >> 7, 255); - } + out[0] = min(in[0] >> shift, 255); + out[1] = min(in[1] >> shift, 255); + out[2] = min(in[2] >> shift, 255); } } } @@ -273,7 +242,7 @@ void R_BuildLightMap (msurface_t *surf, byte *dest, int stride) int *bl; surf->cached_dlight = 0; - surf->cached_lighthalf = lighthalf; + surf->cached_lightscalebit = lightscalebit; surf->cached_ambient = r_ambient.value; smax = (surf->extents[0]>>4)+1; @@ -658,7 +627,7 @@ void RSurf_DrawWall(msurface_t *s, texture_t *t, int transform) if (s->cached_dlight || (r_dynamic.value && r_dlightmap.value && s->dlightframe == r_framecount) || r_ambient.value != s->cached_ambient - || lighthalf != s->cached_lighthalf + || lightscalebit != s->cached_lightscalebit || (r_dynamic.value && ((s->styles[0] != 255 && d_lightstylevalue[s->styles[0]] != s->cached_light[0]) || (s->styles[1] != 255 && d_lightstylevalue[s->styles[1]] != s->cached_light[1]) diff --git a/gl_screen.c b/gl_screen.c index 977c4a04..729e292b 100644 --- a/gl_screen.c +++ b/gl_screen.c @@ -65,7 +65,7 @@ console is: notify lines half full - + */ @@ -98,6 +98,9 @@ qpic_t *scr_turtle; int clearconsole; int clearnotify; +int lightscalebit; +float lightscale; + qboolean scr_disabled_for_loading; //qboolean scr_drawloading; //float scr_disabled_time; @@ -226,19 +229,19 @@ CalcFov */ float CalcFov (float fov_x, float width, float height) { - float a; - float x; + float a; + float x; - if (fov_x < 1 || fov_x > 179) - Sys_Error ("Bad fov: %f", fov_x); + if (fov_x < 1 || fov_x > 179) + Sys_Error ("Bad fov: %f", fov_x); - x = width/tan(fov_x/360*M_PI); + x = width/tan(fov_x/360*M_PI); - a = atan (height/x); + a = atan (height/x); - a = a*360/M_PI; + a = a*360/M_PI; - return a; + return a; } /* @@ -272,7 +275,7 @@ static void SCR_CalcRefdef (void) if (scr_fov.value > 170) Cvar_Set ("fov","170"); -// intermission is always full screen +// intermission is always full screen if (cl.intermission) { full = true; @@ -315,7 +318,7 @@ static void SCR_CalcRefdef (void) r_refdef.vrect.x = (vid.width - r_refdef.vrect.width)/2; if (full) r_refdef.vrect.y = 0; - else + else r_refdef.vrect.y = (h - r_refdef.vrect.height)/2; r_refdef.fov_x = scr_fov.value; @@ -567,7 +570,7 @@ void SCR_DrawConsole (void) } -/* +/* ============================================================================== SCREEN SHOTS @@ -600,7 +603,7 @@ void SCR_ScreenShot_f (void) sprintf (checkname, "%s/%s", com_gamedir, filename); if (Sys_FileTime(checkname) == -1) break; // file doesn't exist - } + } if (i==10000) { Con_Printf ("SCR_ScreenShot_f: Couldn't create a TGA file\n"); @@ -608,7 +611,7 @@ void SCR_ScreenShot_f (void) } buffer = qmalloc(glwidth*glheight*3); - glReadPixels (glx, gly, glwidth, glheight, GL_RGB, GL_UNSIGNED_BYTE, buffer); + glReadPixels (glx, gly, glwidth, glheight, GL_RGB, GL_UNSIGNED_BYTE, buffer); Image_WriteTGARGB_preflipped(filename, glwidth, glheight, buffer); qfree(buffer); @@ -686,7 +689,7 @@ void SCR_DrawNotifyString (void) x = (vid.width - l*8)/2; // LordHavoc: speedup // for (j=0 ; j