diff --git a/src/dehacked.c b/src/dehacked.c index 51f741ef8..a467543e9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11123,6 +11123,8 @@ struct { {"FF_TRANS70",FF_TRANS70}, {"FF_TRANS80",FF_TRANS80}, {"FF_TRANS90",FF_TRANS90}, + {"FF_TRANSADD",FF_TRANSADD}, + {"FF_TRANSSUB",FF_TRANSSUB}, // compatibility // Transparency for SOCs is pre-shifted {"TR_TRANS10",tr_trans10<PolyColor.s.alpha = 0x4c;return PF_Translucent; case tr_trans80 : pSurf->PolyColor.s.alpha = 0x33;return PF_Translucent; case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent; + case tr_transadd : pSurf->PolyColor.s.alpha = 0xFF;return PF_Additive; + case tr_transsub : pSurf->PolyColor.s.alpha = 0xFF;return PF_Substractive; } return PF_Translucent; } @@ -856,7 +858,7 @@ static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2) // // HWR_SplitWall // -static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor) +static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor, FBITFIELD blendmode) { /* SoM: split up and light walls according to the lightlist. This may also include leaving out parts @@ -993,12 +995,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, wallVerts[0].y = bot; wallVerts[1].y = endbot; - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + if (blendmode & PF_Fog) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap); + else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap); else - HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); + HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap); top = bot; endtop = endbot; @@ -1022,12 +1024,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, wallVerts[0].y = bot; wallVerts[1].y = endbot; - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + if (blendmode & PF_Fog) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap); + else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap); else - HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); + HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap); } // HWR_DrawSkyWall @@ -1207,12 +1209,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); wallVerts[1].y = FIXED_TO_FLOAT(worldhighslope); - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL); - else if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, PF_Environment, false, lightnum, colormap); - else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + FBITFIELD blendmode = PF_Masked; + + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Environment; + + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL, blendmode); + else if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } // check BOTTOM TEXTURE @@ -1273,12 +1282,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldlowslope); wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL); - else if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, PF_Environment, false, lightnum, colormap); - else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + FBITFIELD blendmode = PF_Masked; + + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Environment; + + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); + else if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture); if (gl_midtexture) @@ -1472,16 +1488,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom blendmode = PF_Translucent; break; default: - if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) - blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), &Surf); + { + transnum_t transtable = R_GetLinedefTransTable(gl_linedef); + if (transtable != NUMEFFECTMAPS) + blendmode = HWR_TranstableToAlpha(transtable, &Surf); else blendmode = PF_Masked; break; + } } if (gl_curline->polyseg && gl_curline->polyseg->translucency > 0) { - if (gl_curline->polyseg->translucency >= NUMTRANSMAPS) // wall not drawn + if (gl_curline->polyseg->translucency >= NUMEFFECTMAPS) // wall not drawn { Surf.PolyColor.s.alpha = 0x00; // This shouldn't draw anything regardless of blendmode blendmode = PF_Masked; @@ -1493,10 +1512,10 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_frontsector->numlights) { if (!(blendmode & PF_Masked)) - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL); + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL, blendmode); else { - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); } } else if (!(blendmode & PF_Masked)) @@ -1577,15 +1596,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); - // I don't think that solid walls can use translucent linedef types... - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL); - else { + FBITFIELD blendmode = PF_Masked; if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, PF_Environment, false, lightnum, colormap); + blendmode = PF_Environment; + + // I don't think that solid walls can use translucent linedef types... + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } } @@ -1730,7 +1755,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -1738,14 +1763,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { - blendmode = PF_Translucent; - Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; + if (rover->alpha < 256) + { + blendmode = PF_Translucent; + Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1); + } + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; } if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) @@ -1830,7 +1862,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -1838,14 +1870,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { - blendmode = PF_Translucent; - Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; + if (rover->alpha < 256) + { + blendmode = PF_Translucent; + Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1); + } + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; } if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) @@ -2865,7 +2904,7 @@ static void HWR_AddPolyObjectPlanes(void) if (!(po_ptrs[i]->flags & POF_RENDERPLANES)) // Only render planes when you should continue; - if (po_ptrs[i]->translucency >= NUMTRANSMAPS) + if (po_ptrs[i]->translucency >= NUMEFFECTMAPS) continue; if (polyobjsector->floorheight <= gl_frontsector->ceilingheight @@ -3106,8 +3145,16 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient + else if (rover->flags & FF_TRANSLUCENT + && (rover->alpha < 256 + || rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient { + FBITFIELD blendmode = PF_Translucent; + if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; + light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_AddTransparentFloor(&levelflats[*rover->bottompic], @@ -3115,7 +3162,7 @@ static void HWR_Subsector(size_t num) false, *rover->bottomheight, *gl_frontsector->lightlist[light].lightlevel, - rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode, false, *gl_frontsector->lightlist[light].extra_colormap); } else @@ -3151,8 +3198,16 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + else if (rover->flags & FF_TRANSLUCENT + && (rover->alpha < 256 + || rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient { + FBITFIELD blendmode = PF_Translucent; + if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; + light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_AddTransparentFloor(&levelflats[*rover->toppic], @@ -3160,7 +3215,7 @@ static void HWR_Subsector(size_t num) true, *rover->topheight, *gl_frontsector->lightlist[light].lightlevel, - rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode, false, *gl_frontsector->lightlist[light].extra_colormap); } else diff --git a/src/info.c b/src/info.c index bfce7efe4..5677e4270 100644 --- a/src/info.c +++ b/src/info.c @@ -2231,9 +2231,9 @@ state_t states[NUMSTATES] = {SPR_CHAN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CEZCHAIN // Flame - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST // Eggman statue {SPR_ESTA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGSTATUE1 @@ -4383,10 +4383,10 @@ state_t states[NUMSTATES] = {SPR_AUDI, 4|FF_ANIMATE, -1, {NULL}, 1, 17, S_NULL}, // S_AUDIENCE_CHAO_LOSE - {SPR_FLAM, 0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1, - {SPR_FLAM, 1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2, - {SPR_FLAM, 2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3, - {SPR_FLAM, 3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4, {SPR_DECO, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DEVIL, {SPR_DECO, 1, -1, {NULL}, 0, 0, S_NULL}, // S_ANGEL, diff --git a/src/p_mobj.h b/src/p_mobj.h index cd0cc3bc7..6ffa393aa 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -268,6 +268,8 @@ typedef enum MFD_TRANS70 = 0x0070, MFD_TRANS80 = 0x0080, MFD_TRANS90 = 0x0090, + MFD_TRANSADD = 0x00A0, + MFD_TRANSSUB = 0x00B0, MFD_TRANSMASK = 0x00F0, // Brightness override flags MFD_FULLBRIGHT = 0x0100, diff --git a/src/p_polyobj.c b/src/p_polyobj.c index c232fe656..6733fca79 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -212,7 +212,7 @@ static void Polyobj_GetInfo(polyobj_t *po, line_t *line) if (po->parent == po->id) // do not allow a self-reference po->parent = -1; - po->translucency = max(min(line->args[2], NUMTRANSMAPS), 0); + po->translucency = max(min(line->args[2], NUMEFFECTMAPS), 0); po->flags = POF_SOLID|POF_TESTHEIGHT|POF_RENDERSIDES|POF_RENDERPLANES; @@ -2563,7 +2563,7 @@ void T_PolyObjFade(polyfade_t *th) { if (po->translucency >= NUMTRANSMAPS) // HACK: OpenGL renders fully opaque when >= NUMTRANSMAPS - po->translucency = NUMTRANSMAPS-1; + po->translucency = tr_trans90; po->flags |= (po->spawnflags & POF_RENDERALL); diff --git a/src/p_pspr.h b/src/p_pspr.h index 6eaf33279..aa49f0306 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -59,6 +59,8 @@ #define FF_TRANS70 (tr_trans70<translucency = value; - po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0); + po->translucency = max(min(po->translucency, NUMEFFECTMAPS), 0); } // Makes a polyobject translucency fade and applies tangibility diff --git a/src/r_defs.h b/src/r_defs.h index 715067176..8372a5ae5 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -152,6 +152,9 @@ typedef enum FF_GOOWATER = FF_SHATTERBOTTOM, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. } ffloortype_e; +#define FFLOOR_ALPHA_SPECIAL_ADDITIVE (901) +#define FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE (902) + typedef struct ffloor_s { fixed_t *topheight; diff --git a/src/r_draw.c b/src/r_draw.c index 57c4fe4e4..3d806eaf0 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -81,7 +81,7 @@ UINT8 *dc_source; // ----------------------- // translucency stuff here // ----------------------- -#define NUMTRANSTABLES 9 // how many translucency tables are used +#define NUMTRANSTABLES 11 // how many translucency tables are used UINT8 *transtables; // translucency tables @@ -172,6 +172,8 @@ void R_InitTranslationTables(void) W_ReadLump(W_GetNumForName("TRANS70"), transtables+0x60000); W_ReadLump(W_GetNumForName("TRANS80"), transtables+0x70000); W_ReadLump(W_GetNumForName("TRANS90"), transtables+0x80000); + W_ReadLump(W_GetNumForName("TRANSADD"),transtables+0x90000); + W_ReadLump(W_GetNumForName("TRANSSUB"),transtables+0xA0000); } /** \brief Retrieves a translation colormap from the cache. diff --git a/src/r_plane.c b/src/r_plane.c index 992b3f4e9..7770d2d12 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -780,7 +780,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->polyobj) { // Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red) - if (pl->polyobj->translucency >= 10) + if (pl->polyobj->translucency >= NUMEFFECTMAPS) return; // Don't even draw it else if (pl->polyobj->translucency > 0) { @@ -841,6 +841,10 @@ void R_DrawSinglePlane(visplane_t *pl) ds_transmap = transtables + ((tr_trans20-1)<ffloor->alpha < 243) ds_transmap = transtables + ((tr_trans10-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + ds_transmap = transtables + ((tr_transadd-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + ds_transmap = transtables + ((tr_transsub-1)<> (FRACBITS+1); + transnum_t transnum = NUMEFFECTMAPS; // Send back NUMEFFECTMAPS for none + fixed_t alpha = ldef->alpha; + if (alpha > 0 && alpha < FRACUNIT) + transnum = (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); + else + { + switch (ldef->special) + { + case 910: transnum = tr_transadd; break; + case 911: transnum = tr_transsub; break; + default: transnum = NUMEFFECTMAPS; break; + } + } + + return transnum; } void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) @@ -298,6 +312,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) INT32 times, repeats; INT64 overflow_test; INT32 range; + transnum_t transtable = NUMEFFECTMAPS; // Calculate light table. // Use different light tables @@ -314,9 +329,10 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (!ldef->alpha) return; - if (ldef->alpha > 0 && ldef->alpha < FRACUNIT) + transtable = R_GetLinedefTransTable(ldef); + if (transtable != NUMEFFECTMAPS) { - dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT); + dc_transmap = transtables + ((transtable - 1) << FF_TRANSSHIFT); colfunc = colfuncs[COLDRAWFUNC_FUZZY]; } @@ -331,7 +347,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (curline->polyseg && curline->polyseg->translucency > 0) { - if (curline->polyseg->translucency >= NUMTRANSMAPS) + if (curline->polyseg->translucency >= NUMEFFECTMAPS) return; dc_transmap = transtables + ((curline->polyseg->translucency-1)<alpha < 243) dc_transmap = transtables + ((tr_trans10-1)<alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + dc_transmap = transtables + ((tr_transadd-1)<alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + dc_transmap = transtables + ((tr_transsub-1)<