diff --git a/src/compatibility.cpp b/src/compatibility.cpp index d9dfd083d..57d2b3f72 100644 --- a/src/compatibility.cpp +++ b/src/compatibility.cpp @@ -120,6 +120,7 @@ static FCompatOption Options[] = { "hitscan", COMPATF_HITSCAN, 0 }, { "lightlevel", COMPATF_LIGHT, 0 }, { "polyobj", COMPATF_POLYOBJ, 0 }, + { "maskedmidtex", COMPATF_MASKEDMIDTEX, 0 }, { NULL, 0, 0 } }; diff --git a/src/d_main.cpp b/src/d_main.cpp index c781e285d..e59ebe6f6 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -546,7 +546,7 @@ CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL) v = COMPATF_SHORTTEX|COMPATF_STAIRINDEX|COMPATF_USEBLOCKING|COMPATF_NODOORLIGHT|COMPATF_SPRITESORT| COMPATF_TRACE|COMPATF_MISSILECLIP|COMPATF_SOUNDTARGET|COMPATF_NO_PASSMOBJ|COMPATF_LIMITPAIN| COMPATF_DEHHEALTH|COMPATF_INVISIBILITY|COMPATF_CROSSDROPOFF|COMPATF_CORPSEGIBS|COMPATF_HITSCAN| - COMPATF_WALLRUN|COMPATF_NOTOSSDROPS|COMPATF_LIGHT; + COMPATF_WALLRUN|COMPATF_NOTOSSDROPS|COMPATF_LIGHT|COMPATF_MASKEDMIDTEX; break; case 3: // Boom compat mode @@ -602,6 +602,7 @@ CVAR (Flag, compat_spritesort, compatflags,COMPATF_SPRITESORT); CVAR (Flag, compat_hitscan, compatflags,COMPATF_HITSCAN); CVAR (Flag, compat_light, compatflags,COMPATF_LIGHT); CVAR (Flag, compat_polyobj, compatflags,COMPATF_POLYOBJ); +CVAR (Flag, compat_maskedmidtex,compatflags,COMPATF_MASKEDMIDTEX); //========================================================================== // diff --git a/src/doomdef.h b/src/doomdef.h index 748f2df4a..b0ad82f89 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -332,6 +332,7 @@ enum COMPATF_HITSCAN = 1 << 28, // Hitscans use original blockmap anf hit check code. COMPATF_LIGHT = 1 << 29, // Find neighboring light level like Doom COMPATF_POLYOBJ = 1 << 30, // Draw polyobjects the old fashioned way + COMPATF_MASKEDMIDTEX = 1 << 31, // Ignore compositing when drawing masked midtextures }; // Emulate old bugs for select maps. These are not exposed by a cvar diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index cee0acbe7..ea1c0d7c0 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -1271,6 +1271,7 @@ MapFlagHandlers[] = { "compat_spritesort", MITYPE_COMPATFLAG, COMPATF_SPRITESORT, 0 }, { "compat_light", MITYPE_COMPATFLAG, COMPATF_LIGHT, 0 }, { "compat_polyobj", MITYPE_COMPATFLAG, COMPATF_POLYOBJ, 0 }, + { "compat_maskedmidtex", MITYPE_COMPATFLAG, COMPATF_MASKEDMIDTEX, 0 }, { "cd_start_track", MITYPE_EATNEXT, 0, 0 }, { "cd_end1_track", MITYPE_EATNEXT, 0, 0 }, { "cd_end2_track", MITYPE_EATNEXT, 0, 0 }, diff --git a/src/r_segs.cpp b/src/r_segs.cpp index 605487f12..6edf20d7b 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -240,6 +240,10 @@ void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2) backsector = curline->backsector; tex = TexMan(curline->sidedef->GetTexture(side_t::mid)); + if (i_compatflags & COMPATF_MASKEDMIDTEX) + { + tex = tex->GetRawTexture(); + } // killough 4/13/98: get correct lightlevel for 2s normal textures sec = R_FakeFlat (frontsector, &tempsec, NULL, NULL, false); @@ -621,9 +625,9 @@ void R_RenderFakeWallRange (drawseg_t *ds, int x1, int x2) if (!(fake3D & FAKE3D_CLIPBOTTOM)) sclipBottom = floorheight; if (!(fake3D & FAKE3D_CLIPTOP)) sclipTop = ceilingheight; - // maybe not visible - if (sclipBottom >= frontsector->CenterCeiling()) return; - if (sclipTop <= frontsector->CenterFloor()) return; + // maybe not visible + if (sclipBottom >= frontsector->CenterCeiling()) return; + if (sclipTop <= frontsector->CenterFloor()) return; if (fake3D & FAKE3D_DOWN2UP) { // bottom to viewz diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index 0ee8d7d18..32cee3aae 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -160,6 +160,8 @@ public: int CopyTrueColorPixels(FBitmap *bmp, int x, int y, int rotate, FCopyInfo *inf = NULL); int GetSourceLump() { return DefinitionLump; } + FTexture *GetRedirect(bool wantwarped); + FTexture *GetRawTexture(); protected: BYTE *Pixels; @@ -185,7 +187,6 @@ protected: bool bTranslucentPatches:1; void MakeTexture (); - FTexture *GetRedirect(bool wantwarped); private: void CheckForHacks (); @@ -766,14 +767,32 @@ void FMultiPatchTexture::CheckForHacks () //========================================================================== // -// FMultiPatchTexture :: TexPart :: TexPart +// FMultiPatchTexture :: GetRedirect // //========================================================================== FTexture *FMultiPatchTexture::GetRedirect(bool wantwarped) { - if (bRedirect) return Parts->Texture; - else return this; + return bRedirect ? Parts->Texture : this; +} + +//========================================================================== +// +// FMultiPatchTexture :: GetRawTexture +// +// Doom ignored all compositing of mid-sided textures on two-sided lines. +// Since these textures had to be single-patch in Doom, that essentially +// means it ignores their Y offsets. +// +// If this texture is composed of only one patch, return that patch. +// Otherwise, return this texture, since Doom wouldn't have been able to +// draw it anyway. +// +//========================================================================== + +FTexture *FMultiPatchTexture::GetRawTexture() +{ + return NumParts == 1 ? Parts->Texture : this; } //========================================================================== diff --git a/src/textures/texture.cpp b/src/textures/texture.cpp index 848fffa35..433e9f03b 100644 --- a/src/textures/texture.cpp +++ b/src/textures/texture.cpp @@ -547,6 +547,11 @@ FTexture *FTexture::GetRedirect(bool wantwarped) return this; } +FTexture *FTexture::GetRawTexture() +{ + return this; +} + void FTexture::SetScaledSize(int fitwidth, int fitheight) { xScale = FLOAT2FIXED(float(Width) / fitwidth); diff --git a/src/textures/textures.h b/src/textures/textures.h index e7dd282b3..f49b17419 100644 --- a/src/textures/textures.h +++ b/src/textures/textures.h @@ -215,6 +215,7 @@ public: virtual bool UseBasePalette(); virtual int GetSourceLump() { return SourceLump; } virtual FTexture *GetRedirect(bool wantwarped); + virtual FTexture *GetRawTexture(); // for FMultiPatchTexture to override FTextureID GetID() const { return id; } virtual void Unload () = 0; diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index 14cda7966..4bfa156e6 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -28,6 +28,7 @@ A80E7EE40E0D0C76A6FBD242BE29FE27 // map15 6DA6FCBA8089161BDEC6A1D3F6C8D60F // Eternal Doom MAP25 { stairs + maskedmidtex } 10E1E2B36302D31AC4AE68C84B5DC457 // Eternal Doom MAP28 diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 5d448fd26..679d85a28 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1192,6 +1192,7 @@ OptionMenu "CompatibilityOptions" Option "Use Doom code for hitscan checks", "compat_HITSCAN", "YesNo" Option "Cripple sound for silent BFG trick", "compat_soundslots", "YesNo" Option "Draw polyobjects like Hexen", "compat_POLYOBJ", "YesNo" + Option "Ignore Y offsets on masked midtextures", "compat_MASKEDMIDTEX", "YesNo" Class "CompatibilityMenu" }