From fb54cc140b01445006158092387977930d0c3c11 Mon Sep 17 00:00:00 2001 From: Spoike Date: Thu, 27 May 2021 11:33:48 +0000 Subject: [PATCH] Lit sprites should not be additive. Make gl_blendsprites 2 replicate that tenebrae behaviour instead. Allow colormod to oversaturate sprites. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5868 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/m_options.c | 1 + engine/client/renderer.c | 2 +- engine/client/view.c | 4 ++-- engine/gl/gl_alias.c | 20 ++++++++------------ engine/gl/gl_model.c | 28 ++++------------------------ 5 files changed, 16 insertions(+), 39 deletions(-) diff --git a/engine/client/m_options.c b/engine/client/m_options.c index e8c4fc6ad..9704c23ae 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -1127,6 +1127,7 @@ struct "set gl_specular_power 16\n" "set gl_specular_fallback 1\n" "set mod_litsprites_force 1\n" + "set gl_blendsprites 2\n" "set r_nolerp 1\n" //well, that matches tenebrae. for the luls, right? }, diff --git a/engine/client/renderer.c b/engine/client/renderer.c index dac672327..851c36f47 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -399,7 +399,7 @@ cvar_t r_tessellation = CVARAFD ("r_tessellation", "0", "gl_ati_truform", cvar_t gl_ati_truform_type = CVAR ("gl_ati_truform_type", "1"); cvar_t r_tessellation_level = CVAR ("r_tessellation_level", "5"); cvar_t gl_blend2d = CVAR ("gl_blend2d", "1"); -cvar_t gl_blendsprites = CVARD ("gl_blendsprites", "0", "Blend sprites instead of alpha testing them"); +cvar_t gl_blendsprites = CVARD ("gl_blendsprites", "0", "Specifies how sprites are blended.\n0: Alpha tested.\n1: Premultiplied blend.\n2: Additive blend."); cvar_t r_deluxemapping_cvar = CVARAFD ("r_deluxemapping", "1", "r_glsl_deluxemapping", CVAR_ARCHIVE|CVAR_RENDERERLATCH, "Enables bumpmapping based upon precomputed light directions.\n0=off\n1=use if available\n2=auto-generate (if possible)"); cvar_t mod_loadsurfenvmaps = CVARD ("r_loadsurfenvmaps", "1", "Load local reflection environment-maps, where available. These are normally defined via env_cubemap entities dotted around the place."); diff --git a/engine/client/view.c b/engine/client/view.c index 2c150c3c8..25b10d5c0 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -1502,9 +1502,9 @@ static int QDECL V_DepthSortTwoEntities(const void *p1,const void *p2) const entity_t *b = p2; if (a->angles[0] < b->angles[0]) - return -1; - if (a->angles[0] > b->angles[0]) return 1; + if (a->angles[0] > b->angles[0]) + return -1; return 0; } void V_DepthSortEntities(float *vieworg) diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index cbb289c1b..b6fe63b42 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -2659,13 +2659,9 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) case SPR_ORIENTED: // bullet marks on walls if ((e->flags & RF_WEAPONMODEL) && r_refdef.playerview->viewentity > 0) - { - vec3_t ea[3]; - AngleVectors (e->angles, ea[0], ea[1], ea[2]); - Matrix3_Multiply(ea, r_refdef.playerview->vw_axis, spraxis); - } + Matrix3_Multiply(e->axis, r_refdef.playerview->vw_axis, spraxis); else - AngleVectors (e->angles, spraxis[0], spraxis[1], spraxis[2]); + memcpy(spraxis, e->axis, sizeof(spraxis)); break; case SPR_FACING_UPRIGHT: @@ -2699,12 +2695,12 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) if (e->shaderRGBAf[0] != 0 || e->shaderRGBAf[1] != 0 || e->shaderRGBAf[2] != 0 || (batchflags & BEF_FORCECOLOURMOD)) { - if (e->shaderRGBAf[0] > 1) - e->shaderRGBAf[0] = 1; - if (e->shaderRGBAf[1] > 1) - e->shaderRGBAf[1] = 1; - if (e->shaderRGBAf[2] > 1) - e->shaderRGBAf[2] = 1; +// if (e->shaderRGBAf[0] > 1) +// e->shaderRGBAf[0] = 1; +// if (e->shaderRGBAf[1] > 1) +// e->shaderRGBAf[1] = 1; +// if (e->shaderRGBAf[2] > 1) +// e->shaderRGBAf[2] = 1; } else { diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 9de92405d..86ad6e380 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -5601,7 +5601,9 @@ void Mod_LoadDoomSprite (model_t *mod) "endif\n" \ "{\n" \ "map $diffuse\n" \ - "if gl_blendsprites\n" \ + "if gl_blendsprites == 2\n" \ + "blendfunc GL_ONE GL_ONE\n" \ + "elif gl_blendsprites\n" \ "blendfunc GL_ONE GL_ONE_MINUS_SRC_ALPHA\n" \ "else\n" \ "alphafunc ge128\n" \ @@ -5668,29 +5670,7 @@ void Mod_LoadSpriteFrameShader(model_t *spr, int frame, int subframe, mspritefra #endif if (litsprite) // a ! in the filename makes it non-fullbright (and can also be lit by rtlights too). - { - shadertext = - "{\n" - "program defaultsprite\n" - "{\n" - "map $diffuse\n" - "blendfunc GL_ONE GL_ONE\n" //lit sprites are actually additive... - "rgbgen vertex\n" - "alphagen vertex\n" - "}\n" - "surfaceparm noshadows\n" - "sort seethrough\n" - "bemode rtlight\n" - "{\n" - "program rtlight#NOBUMP\n" - "{\n" - "map $diffuse\n" - "blendfunc add\n" - "}\n" - "}\n" - "}\n" - ; - } + shadertext = SPRITE_SHADER_MAIN SPRITE_SHADER_LIT SPRITE_SHADER_FOOTER; else shadertext = SPRITE_SHADER_MAIN SPRITE_SHADER_UNLIT SPRITE_SHADER_FOOTER; frameinfo->shader = R_RegisterShader(name, SUF_NONE, shadertext);