From 4434e322e25e1d578197f44e9868e7d4c401ba3d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 23 May 2008 14:04:16 +0000 Subject: [PATCH] - Fixed: The first texture in a TEXTURE1 lump, although invalid when used elsewhere, must be usable as sky (see Requiem.wad's SKY3.) SVN r993 (trunk) --- docs/rh-log.txt | 2 ++ src/g_level.cpp | 4 ++-- src/p_acs.cpp | 4 ++-- src/r_defs.h | 2 ++ src/textures/multipatchtexture.cpp | 2 +- src/textures/texturemanager.cpp | 11 ++++++++++- 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index fbfb4d264..ab001cb9e 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,6 @@ May 23, 2008 (Changes by Graf Zahl) +- Fixed: The first texture in a TEXTURE1 lump, although invalid when used + elsewhere, must be usable as sky (see Requiem.wad's SKY3.) - Fixed: side_t::GetLightLevel relied on the global 'linedef' variable for automatic fake contrast. - Changed: Fake contrast now uses the WALLF_AUTOCONTRAST globally instead diff --git a/src/g_level.cpp b/src/g_level.cpp index f1a95647c..0060ca177 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -2043,8 +2043,8 @@ void G_DoLoadLevel (int position, bool autosave) // DOOM determines the sky texture to be used // depending on the current episode and the game version. // [RH] Fetch sky parameters from FLevelLocals. - sky1texture = TexMan.GetTexture (level.skypic1, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); - sky2texture = TexMan.GetTexture (level.skypic2, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); + sky1texture = TexMan.GetTexture (level.skypic1, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + sky2texture = TexMan.GetTexture (level.skypic2, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); // [RH] Set up details about sky rendering R_InitSkyMap (); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 804c98053..5aafafdb6 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5065,12 +5065,12 @@ int DLevelScript::RunScript () if (sky1name[0] != 0) { strncpy (level.skypic1, sky1name, 8); - sky1texture = TexMan.GetTexture (sky1name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); + sky1texture = TexMan.GetTexture (sky1name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } if (sky2name[0] != 0) { strncpy (level.skypic2, sky2name, 8); - sky2texture = TexMan.GetTexture (sky2name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); + sky2texture = TexMan.GetTexture (sky2name, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } R_InitSkyMap (); } diff --git a/src/r_defs.h b/src/r_defs.h index d58c39632..a81d1dad4 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -796,6 +796,7 @@ public: TEX_Override, // For patches between TX_START/TX_END TEX_Autopage, // Automap background - used to enable the use of FAutomapTexture TEX_Null, + TEX_FirstDefined, }; struct Span @@ -945,6 +946,7 @@ public: { TEXMAN_TryAny = 1, TEXMAN_Overridable = 2, + TEXMAN_ReturnFirst = 4, }; int CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index 6ca630f0f..ffa0806d7 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -807,7 +807,7 @@ void FTextureManager::AddTexturesLump (const void *lumpdata, int lumpsize, int d FMultiPatchTexture *tex = new FMultiPatchTexture ((const BYTE *)maptex + offset, patchlookup, numpatches, isStrife, deflumpnum); if (i == 1 && texture1) { - tex->UseType = FTexture::TEX_Null; + tex->UseType = FTexture::TEX_FirstDefined; } TexMan.AddTexture (tex); StartScreen->Progress(); diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index 16cc6ecc5..9937df0f8 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -125,6 +125,11 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl { return i; } + else if (tex->UseType == FTexture::TEX_FirstDefined && usetype == FTexture::TEX_Wall) + { + if (!(flags & TEXMAN_ReturnFirst)) return 0; + else return i; + } else if (tex->UseType == FTexture::TEX_Null && usetype == FTexture::TEX_Wall) { // We found a NULL texture on a wall -> return 0 @@ -147,7 +152,11 @@ int FTextureManager::CheckForTexture (const char *name, int usetype, BITFIELD fl if ((flags & TEXMAN_TryAny) && usetype != FTexture::TEX_Any) { // Never return the index of NULL textures. - if (firstfound != -1 && firsttype == FTexture::TEX_Null) return 0; + if (firstfound != -1) + { + if (firsttype == FTexture::TEX_Null) return 0; + if (firsttype == FTexture::TEX_FirstDefined && !(flags & TEXMAN_ReturnFirst)) return 0; + } return firstfound; }