diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 31a6a489c..2ace55792 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -256,6 +256,15 @@ void Surf_LessenStains(void) static float time; + extern cvar_t gl_lightmap_shift; + + if (gl_lightmap_shift.modified) + { + gl_lightmap_shift.modified = 0; + for (i=0, surf = cl.worldmodel->surfaces; inumsurfaces ; i++, surf++) + surf->cached_dlight=-1;//force it + } + if (!r_stains.value) return; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 3fc39605b..7fd76e44f 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -261,7 +261,7 @@ cvar_t gl_font = SCVARF ("gl_font", "", cvar_t gl_lateswap = SCVAR ("gl_lateswap", "0"); cvar_t gl_lerpimages = SCVAR ("gl_lerpimages", "1"); cvar_t gl_lightmap_shift = SCVARF ("gl_lightmap_shift", "0", - CVAR_ARCHIVE | CVAR_LATCH); + CVAR_ARCHIVE); //cvar_t gl_lightmapmode = SCVARF("gl_lightmapmode", "", // CVAR_ARCHIVE); cvar_t gl_load24bit = SCVARF ("gl_load24bit", "1", diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 8505d2ee5..dfa6db2e2 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -1100,6 +1100,7 @@ qboolean CMod_LoadSurfaces (lump_t *l) #ifndef SERVERONLY texture_t *Mod_LoadWall(char *name, char *sname) { + q2miptex_t replacementwal; qbyte *in, *oin; texture_t *tex; q2miptex_t *wal; @@ -1113,10 +1114,15 @@ texture_t *Mod_LoadWall(char *name, char *sname) wal = (void *)FS_LoadMallocFile (name); if (!wal) { - //they will download eventually... - CL_CheckOrEnqueDownloadFile(name, NULL, 0); - return NULL; + tn.base = R_LoadReplacementTexture(name, loadname, 0); + wal = &replacementwal; + memset(wal, 0, sizeof(*wal)); + Q_strncpyz(wal->name, name, sizeof(wal->name)); + wal->width = image_width; + wal->height = image_height; } + else + tn.base = R_LoadReplacementTexture(wal->name, loadname, IF_NOALPHA); wal->width = LittleLong(wal->width); wal->height = LittleLong(wal->height); @@ -1137,21 +1143,32 @@ texture_t *Mod_LoadWall(char *name, char *sname) tex->width = wal->width; tex->height = wal->height; - tn.base = R_LoadReplacementTexture(wal->name, loadname, IF_NOALPHA); if (!TEXVALID(tn.base)) { tn.base = R_LoadReplacementTexture(wal->name, "bmodels", IF_NOALPHA); if (!TEXVALID(tn.base)) + { + if (!wal->offsets[0]) + { + //they will download eventually... + CL_CheckOrEnqueDownloadFile(name, NULL, 0); + return NULL; + } tn.base = R_LoadTexture8Pal24 (wal->name, tex->width, tex->height, (qbyte *)wal+wal->offsets[0], d_q28to24table, IF_NOALPHA|IF_NOGAMMA); + } } - in = Hunk_TempAllocMore(wal->width*wal->height); - oin = (qbyte *)wal+wal->offsets[0]; - for (j = 0; j < wal->width*wal->height; j++) - in[j] = (d_q28to24table[oin[j]*3+0] + d_q28to24table[oin[j]*3+1] + d_q28to24table[oin[j]*3+2])/3; - tn.bump = R_LoadTexture8BumpPal (va("%s_bump", wal->name), tex->width, tex->height, in, true); + if (wal->offsets[0]) + { + in = Hunk_TempAllocMore(wal->width*wal->height); + oin = (qbyte *)wal+wal->offsets[0]; + for (j = 0; j < wal->width*wal->height; j++) + in[j] = (d_q28to24table[oin[j]*3+0] + d_q28to24table[oin[j]*3+1] + d_q28to24table[oin[j]*3+2])/3; + tn.bump = R_LoadTexture8BumpPal (va("%s_bump", wal->name), tex->width, tex->height, in, true); + } - BZ_Free(wal); + if (wal != &replacementwal) + BZ_Free(wal); tex->shader = R_RegisterCustom (sname, Shader_DefaultBSPQ2, NULL); R_BuildDefaultTexnums(&tn, tex->shader); diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 65bc582ee..d09d4d28b 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -7,10 +7,6 @@ #endif #include -/*shaders have a few GL_FOO constants in them. they shouldn't, but they do.*/ -#include -#include "glsupp.h" - extern LPDIRECT3DDEVICE9 pD3DDev9; //#define d3dcheck(foo) foo @@ -583,7 +579,7 @@ static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) switch (pass->blendmode) { - case GL_DOT3_RGB_ARB: + case PBM_DOTPRODUCT: IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3); @@ -592,7 +588,7 @@ static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) // IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); break; - case GL_REPLACE: + case PBM_REPLACE: IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_SELECTARG1); @@ -609,7 +605,7 @@ static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); } break; - case GL_ADD: + case PBM_ADD: IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA); @@ -619,7 +615,7 @@ static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAOP, D3DTOP_MODULATE); break; - case GL_DECAL: + case PBM_DECAL: if (!tu) goto forcemod; IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); @@ -631,7 +627,7 @@ static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); break; default: - case GL_MODULATE: + case PBM_MODULATE: forcemod: IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 540923cf6..d913d3059 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -2187,6 +2187,7 @@ static void DrawPass(const shaderpass_t *pass) tmu = 0; for (; i < lastpass; i++) { + extern cvar_t gl_overbright; if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay)) continue; if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay)) @@ -2199,25 +2200,36 @@ static void DrawPass(const shaderpass_t *pass) switch (pass[i].blendmode) { - case GL_DOT3_RGB_ARB: - GL_TexEnv(GL_COMBINE_EXT); + case PBM_DOTPRODUCT: + GL_TexEnv(GL_COMBINE_ARB); qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); - qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, pass[i].blendmode); + qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGB_ARB); + qglTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1); break; - case GL_REPLACE: + case PBM_REPLACE: GL_TexEnv(GL_REPLACE); break; - case GL_DECAL: - case GL_ADD: - if (tmu != 0) - { - GL_TexEnv(pass[i].blendmode); - break; - } - //fallthrough + case PBM_DECAL: + if (tmu == 0) + goto forcemod; + GL_TexEnv(GL_DECAL); + break; + case PBM_ADD: + if (tmu == 0) + goto forcemod; + GL_TexEnv(GL_ADD); + break; + case PBM_OVERBRIGHT: + GL_TexEnv(GL_COMBINE_ARB); + qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); + qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); + qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); + qglTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, gl_overbright.value+1); + break; default: - case GL_MODULATE: + case PBM_MODULATE: + forcemod: GL_TexEnv(GL_MODULATE); break; } diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index b6991d974..55f390020 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -31,13 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include -#ifndef GLQUAKE -/*the shaders have a few GL_FOO constants in them. they shouldn't, but they do.*/ -#include -#include "glsupp.h" -#endif - - extern texid_t missing_texture; static qboolean shader_reload_needed; static qboolean shader_rescan_needed; @@ -2558,13 +2551,13 @@ void Shader_SetBlendmode (shaderpass_t *pass) { if (pass->texgen == T_GEN_DELUXMAP) { - pass->blendmode = GL_DOT3_RGB_ARB; + pass->blendmode = PBM_DOTPRODUCT; return; } if (pass->texgen < T_GEN_DIFFUSE && !TEXVALID(pass->anim_frames[0]) && !(pass->flags & SHADER_PASS_LIGHTMAP)) { - pass->blendmode = GL_MODULATE; + pass->blendmode = PBM_MODULATE; return; } @@ -2572,7 +2565,7 @@ void Shader_SetBlendmode (shaderpass_t *pass) { if ((pass->rgbgen == RGB_GEN_IDENTITY) && (pass->alphagen == ALPHA_GEN_IDENTITY)) { - pass->blendmode = GL_REPLACE; + pass->blendmode = PBM_REPLACE; } else { @@ -2580,20 +2573,20 @@ void Shader_SetBlendmode (shaderpass_t *pass) pass->shaderbits &= ~SBITS_BLEND_BITS; pass->shaderbits |= SBITS_SRCBLEND_ONE; pass->shaderbits |= SBITS_DSTBLEND_ZERO; - pass->blendmode = GL_MODULATE; + pass->blendmode = PBM_MODULATE; } return; } if (((pass->shaderbits&SBITS_BLEND_BITS) == (SBITS_SRCBLEND_ZERO|SBITS_DSTBLEND_SRC_COLOR)) || ((pass->shaderbits&SBITS_BLEND_BITS) == (SBITS_SRCBLEND_DST_COLOR|SBITS_DSTBLEND_ZERO))) - pass->blendmode = GL_MODULATE; + pass->blendmode = PBM_MODULATE; else if ((pass->shaderbits&SBITS_BLEND_BITS) == (SBITS_SRCBLEND_ONE|SBITS_DSTBLEND_ONE)) - pass->blendmode = GL_ADD; + pass->blendmode = PBM_ADD; else if ((pass->shaderbits&SBITS_BLEND_BITS) == (SBITS_SRCBLEND_SRC_ALPHA|SBITS_DSTBLEND_ONE_MINUS_SRC_ALPHA)) - pass->blendmode = GL_DECAL; + pass->blendmode = PBM_DECAL; else - pass->blendmode = GL_MODULATE; + pass->blendmode = PBM_MODULATE; } void Shader_Readpass (shader_t *shader, char **ptr) @@ -2765,31 +2758,37 @@ void Shader_SetPassFlush (shaderpass_t *pass, shaderpass_t *pass2) return; // check if we can use multiple passes - if (pass2->blendmode == GL_DOT3_RGB_ARB) + if (pass2->blendmode == PBM_DOTPRODUCT) { pass->numMergedPasses++; } else if (pass->numMergedPasses < be_maxpasses) { - if ( pass->blendmode == GL_REPLACE ) + if ( pass->blendmode == PBM_REPLACE ) { - if ((pass2->blendmode == GL_DECAL && config_tex_env_combine) || - (pass2->blendmode == GL_ADD && config_env_add) || - (pass2->blendmode && pass2->blendmode != GL_ADD) || config_nv_tex_env_combine4) + if ((pass2->blendmode == PBM_DECAL && config_tex_env_combine) || + (pass2->blendmode == PBM_ADD && config_env_add) || + (pass2->blendmode && pass2->blendmode != PBM_ADD) || config_nv_tex_env_combine4) { pass->numMergedPasses++; } } - else if (pass->blendmode == GL_ADD && - pass2->blendmode == GL_ADD && config_env_add) + else if (pass->blendmode == PBM_ADD && + pass2->blendmode == PBM_ADD && config_env_add) { pass->numMergedPasses++; } - else if (pass->blendmode == GL_MODULATE && pass2->blendmode == GL_MODULATE) + else if (pass->blendmode == PBM_MODULATE && pass2->blendmode == PBM_MODULATE) { pass->numMergedPasses++; } + else + return; } + else return; + + if (pass2->texgen == T_GEN_LIGHTMAP) + pass2->blendmode = PBM_OVERBRIGHT; } void Shader_SetFeatures ( shader_t *s ) @@ -4036,7 +4035,7 @@ void Shader_DoReload(void) COM_EnumerateFiles("materials/*.mtr", Shader_InitCallback, NULL); COM_EnumerateFiles("shaders/*.shader", Shader_InitCallback, NULL); COM_EnumerateFiles("scripts/*.shader", Shader_InitCallback, NULL); - //COM_EnumerateFiles("scripts/*.rscript", Shader_InitCallback, NULL); + COM_EnumerateFiles("scripts/*.rscript", Shader_InitCallback, NULL); shader_reload_needed = true; shader_rescan_needed = false; diff --git a/engine/gl/shader.h b/engine/gl/shader.h index d60ba4151..ea42a7bb2 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -143,7 +143,14 @@ typedef struct shaderpass_s { unsigned int shaderbits; - unsigned int blendmode; + enum { + PBM_MODULATE, + PBM_OVERBRIGHT, + PBM_DECAL, + PBM_ADD, + PBM_DOTPRODUCT, + PBM_REPLACE + } blendmode; enum { RGB_GEN_WAVE,