X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=model_shared.c;h=47b4c58fabedfde42ed40f62707e0f17c9a13598;hb=b252f6823904f7cddfe55fb81b86aed8fed27204;hp=dc332803672d8bad3a7d2e3e8bd2be0afbb3f291;hpb=b8ed834873fe145cc3c6d45d31badfd28ea6274a;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.c b/model_shared.c index dc332803..47b4c58f 100644 --- a/model_shared.c +++ b/model_shared.c @@ -1623,8 +1623,11 @@ static void Q3Shader_AddToHash (q3shaderinfo_t* shader) extern cvar_t mod_noshader_default_offsetmapping; extern cvar_t mod_q3shader_default_offsetmapping; +extern cvar_t mod_q3shader_default_offsetmapping_scale; +extern cvar_t mod_q3shader_default_offsetmapping_bias; extern cvar_t mod_q3shader_default_polygonoffset; extern cvar_t mod_q3shader_default_polygonfactor; +extern cvar_t mod_q3shader_force_addalpha; void Mod_LoadQ3Shaders(void) { int j; @@ -1713,7 +1716,8 @@ void Mod_LoadQ3Shaders(void) Vector4Set(shader.reflectcolor4f, 1, 1, 1, 1); shader.r_water_wateralpha = 1; shader.offsetmapping = (mod_q3shader_default_offsetmapping.value) ? OFFSETMAPPING_DEFAULT : OFFSETMAPPING_OFF; - shader.offsetscale = 1; + shader.offsetscale = mod_q3shader_default_offsetmapping_scale.value; + shader.offsetbias = mod_q3shader_default_offsetmapping_bias.value; shader.specularscalemod = 1; shader.specularpowermod = 1; shader.biaspolygonoffset = mod_q3shader_default_polygonoffset.value; @@ -1786,6 +1790,11 @@ void Mod_LoadQ3Shaders(void) layer->blendfunc[0] = GL_ONE; layer->blendfunc[1] = GL_ONE; } + else if (!strcasecmp(parameter[1], "addalpha")) + { + layer->blendfunc[0] = GL_SRC_ALPHA; + layer->blendfunc[1] = GL_ONE; + } else if (!strcasecmp(parameter[1], "filter")) { layer->blendfunc[0] = GL_DST_COLOR; @@ -1813,7 +1822,7 @@ void Mod_LoadQ3Shaders(void) else if (!strcasecmp(parameter[k+1], "GL_DST_COLOR")) layer->blendfunc[k] = GL_DST_COLOR; else if (!strcasecmp(parameter[k+1], "GL_DST_ALPHA")) - layer->blendfunc[k] = GL_ONE_MINUS_DST_ALPHA; + layer->blendfunc[k] = GL_DST_ALPHA; else if (!strcasecmp(parameter[k+1], "GL_ONE_MINUS_SRC_COLOR")) layer->blendfunc[k] = GL_ONE_MINUS_SRC_COLOR; else if (!strcasecmp(parameter[k+1], "GL_ONE_MINUS_SRC_ALPHA")) @@ -1967,7 +1976,32 @@ void Mod_LoadQ3Shaders(void) shader.textureblendalpha = true; } } - layer->texflags = TEXF_ALPHA; + + if(mod_q3shader_force_addalpha.integer) + { + // for a long while, DP treated GL_ONE GL_ONE as GL_SRC_ALPHA GL_ONE + // this cvar brings back this behaviour + if(layer->blendfunc[0] == GL_ONE && layer->blendfunc[1] == GL_ONE) + layer->blendfunc[0] = GL_SRC_ALPHA; + } + + layer->texflags = 0; + if (layer->alphatest) + layer->texflags |= TEXF_ALPHA; + switch(layer->blendfunc[0]) + { + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + layer->texflags |= TEXF_ALPHA; + break; + } + switch(layer->blendfunc[1]) + { + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + layer->texflags |= TEXF_ALPHA; + break; + } if (!(shader.surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) layer->texflags |= TEXF_MIPMAP; if (!(shader.textureflags & Q3TEXTUREFLAG_NOPICMIP)) @@ -2228,17 +2262,29 @@ void Mod_LoadQ3Shaders(void) { shader.rtlightambient = atof(parameter[1]); } - else if (!strcasecmp(parameter[0], "dpoffsetmapping") && numparameters >= 3) + else if (!strcasecmp(parameter[0], "dpoffsetmapping") && numparameters >= 2) { if (!strcasecmp(parameter[1], "disable") || !strcasecmp(parameter[1], "none") || !strcasecmp(parameter[1], "off")) shader.offsetmapping = OFFSETMAPPING_OFF; - else if (!strcasecmp(parameter[1], "default")) + else if (!strcasecmp(parameter[1], "default") || !strcasecmp(parameter[1], "normal")) shader.offsetmapping = OFFSETMAPPING_DEFAULT; else if (!strcasecmp(parameter[1], "linear")) shader.offsetmapping = OFFSETMAPPING_LINEAR; else if (!strcasecmp(parameter[1], "relief")) shader.offsetmapping = OFFSETMAPPING_RELIEF; - shader.offsetscale = atof(parameter[2]); + if (numparameters >= 3) + shader.offsetscale = atof(parameter[2]); + if (numparameters >= 5) + { + if(!strcasecmp(parameter[3], "bias")) + shader.offsetbias = atof(parameter[4]); + else if(!strcasecmp(parameter[3], "match")) + shader.offsetbias = 1.0f - atof(parameter[4]); + else if(!strcasecmp(parameter[3], "match8")) + shader.offsetbias = 1.0f - atof(parameter[4]) / 255.0f; + else if(!strcasecmp(parameter[3], "match16")) + shader.offsetbias = 1.0f - atof(parameter[4]) / 65535.0f; + } } else if (!strcasecmp(parameter[0], "deformvertexes") && numparameters >= 2) { @@ -2362,8 +2408,10 @@ qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qbool // unless later loaded from the shader texture->offsetmapping = (mod_noshader_default_offsetmapping.value) ? OFFSETMAPPING_DEFAULT : OFFSETMAPPING_OFF; texture->offsetscale = 1; + texture->offsetbias = 0; texture->specularscalemod = 1; texture->specularpowermod = 1; + texture->rtlightambient = 0; // WHEN ADDING DEFAULTS HERE, REMEMBER TO SYNC TO SHADER LOADING ABOVE // HERE, AND Q1BSP LOADING // JUST GREP FOR "specularscalemod = 1". @@ -2511,6 +2559,7 @@ nothing GL_ZERO GL_ONE Vector2Copy(shader->r_water_waterscroll, texture->r_water_waterscroll); texture->offsetmapping = shader->offsetmapping; texture->offsetscale = shader->offsetscale; + texture->offsetbias = shader->offsetbias; texture->specularscalemod = shader->specularscalemod; texture->specularpowermod = shader->specularpowermod; texture->rtlightambient = shader->rtlightambient;