- Instead of setting the default skybox in every sector without an explicit skybox set, set it

once in the level struct and then use that for sectors with a NULL skybox. This fixes zpack's
  E2M3 so that when it removes its sector stacks, you will get the default skybox in their
  place, since stacked sectors and skyboxes use the same pointers in a sector.

SVN r4224 (trunk)
This commit is contained in:
Randy Heit 2013-04-21 02:22:37 +00:00
parent 9f71c7cb4e
commit 92d54ca0fc
5 changed files with 23 additions and 18 deletions

View file

@ -307,6 +307,7 @@ static void MarkRoot()
DThinker::MarkRoots(); DThinker::MarkRoots();
FCanvasTextureInfo::Mark(); FCanvasTextureInfo::Mark();
Mark(DACSThinker::ActiveThinker); Mark(DACSThinker::ActiveThinker);
Mark(level.DefaultSkybox);
// Mark dead bodies. // Mark dead bodies.
for (i = 0; i < BODYQUESIZE; ++i) for (i = 0; i < BODYQUESIZE; ++i)
{ {

View file

@ -77,6 +77,7 @@
#include "d_netinf.h" #include "d_netinf.h"
#include "v_palette.h" #include "v_palette.h"
#include "menu/menu.h" #include "menu/menu.h"
#include "a_sharedglobal.h"
#include "a_strifeglobal.h" #include "a_strifeglobal.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "farchive.h" #include "farchive.h"
@ -1272,6 +1273,7 @@ void G_InitLevelLocals ()
NormalLight.ChangeFade (level.fadeto); NormalLight.ChangeFade (level.fadeto);
level.DefaultEnvironment = info->DefaultEnvironment; level.DefaultEnvironment = info->DefaultEnvironment;
level.DefaultSkybox = NULL;
} }
//========================================================================== //==========================================================================
@ -1435,6 +1437,11 @@ void G_SerializeLevel (FArchive &arc, bool hubLoad)
P_SerializeSubsectors(arc); P_SerializeSubsectors(arc);
StatusBar->Serialize (arc); StatusBar->Serialize (arc);
if (SaveVersion >= 4222)
{ // This must be done *after* thinkers are serialized.
arc << level.DefaultSkybox;
}
arc << level.total_monsters << level.total_items << level.total_secrets; arc << level.total_monsters << level.total_items << level.total_secrets;
// Does this level have custom translations? // Does this level have custom translations?

View file

@ -426,6 +426,8 @@ struct FLevelLocals
int airsupply; int airsupply;
int DefaultEnvironment; // Default sound environment. int DefaultEnvironment; // Default sound environment.
TObjPtr<class ASkyViewpoint> DefaultSkybox;
FSectorScrollValues *Scrolls; // NULL if no DScrollers in this level FSectorScrollValues *Scrolls; // NULL if no DScrollers in this level
SBYTE WallVertLight; // Light diffs for vert/horiz walls SBYTE WallVertLight; // Light diffs for vert/horiz walls

View file

@ -49,21 +49,9 @@ void ASkyViewpoint::BeginPlay ()
{ {
Super::BeginPlay (); Super::BeginPlay ();
if (tid == 0) if (tid == 0 && level.DefaultSkybox == NULL)
{ {
int i; level.DefaultSkybox = this;
for (i = 0; i <numsectors; i++)
{
if (sectors[i].FloorSkyBox == NULL)
{
sectors[i].FloorSkyBox = this;
}
if (sectors[i].CeilingSkyBox == NULL)
{
sectors[i].CeilingSkyBox = this;
}
}
} }
} }
@ -87,6 +75,10 @@ void ASkyViewpoint::Destroy ()
sectors[i].CeilingSkyBox = NULL; sectors[i].CeilingSkyBox = NULL;
} }
} }
if (level.DefaultSkybox == this)
{
level.DefaultSkybox = NULL;
}
Super::Destroy(); Super::Destroy();
} }

View file

@ -1015,6 +1015,7 @@ void R_Subsector (subsector_t *sub)
int ceilinglightlevel; // killough 4/11/98 int ceilinglightlevel; // killough 4/11/98
bool outersubsector; bool outersubsector;
int fll, cll, position; int fll, cll, position;
ASkyViewpoint *skybox;
// kg3D - fake floor stuff // kg3D - fake floor stuff
visplane_t *backupfp; visplane_t *backupfp;
@ -1082,9 +1083,10 @@ void R_Subsector (subsector_t *sub)
basecolormap = frontsector->ColorMap; basecolormap = frontsector->ColorMap;
} }
skybox = frontsector->CeilingSkyBox != NULL ? frontsector->CeilingSkyBox : level.DefaultSkybox;
ceilingplane = frontsector->ceilingplane.PointOnSide(viewx, viewy, viewz) > 0 || ceilingplane = frontsector->ceilingplane.PointOnSide(viewx, viewy, viewz) > 0 ||
frontsector->GetTexture(sector_t::ceiling) == skyflatnum || frontsector->GetTexture(sector_t::ceiling) == skyflatnum ||
(frontsector->CeilingSkyBox != NULL && frontsector->CeilingSkyBox->bAlways) || (skybox != NULL && skybox->bAlways) ||
(frontsector->heightsec && (frontsector->heightsec &&
!(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) &&
frontsector->heightsec->GetTexture(sector_t::floor) == skyflatnum) ? frontsector->heightsec->GetTexture(sector_t::floor) == skyflatnum) ?
@ -1099,7 +1101,7 @@ void R_Subsector (subsector_t *sub)
frontsector->GetYScale(sector_t::ceiling), frontsector->GetYScale(sector_t::ceiling),
frontsector->GetAngle(sector_t::ceiling), frontsector->GetAngle(sector_t::ceiling),
frontsector->sky, frontsector->sky,
frontsector->CeilingSkyBox skybox
) : NULL; ) : NULL;
if (fixedlightlev < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size()) if (fixedlightlev < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size())
@ -1121,9 +1123,10 @@ void R_Subsector (subsector_t *sub)
// killough 3/7/98: Add (x,y) offsets to flats, add deep water check // killough 3/7/98: Add (x,y) offsets to flats, add deep water check
// killough 3/16/98: add floorlightlevel // killough 3/16/98: add floorlightlevel
// killough 10/98: add support for skies transferred from sidedefs // killough 10/98: add support for skies transferred from sidedefs
skybox = frontsector->FloorSkyBox != NULL ? frontsector->FloorSkyBox : level.DefaultSkybox;
floorplane = frontsector->floorplane.PointOnSide(viewx, viewy, viewz) > 0 || // killough 3/7/98 floorplane = frontsector->floorplane.PointOnSide(viewx, viewy, viewz) > 0 || // killough 3/7/98
frontsector->GetTexture(sector_t::floor) == skyflatnum || frontsector->GetTexture(sector_t::floor) == skyflatnum ||
(frontsector->FloorSkyBox != NULL && frontsector->FloorSkyBox->bAlways) || (skybox != NULL && skybox->bAlways) ||
(frontsector->heightsec && (frontsector->heightsec &&
!(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) && !(frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC) &&
frontsector->heightsec->GetTexture(sector_t::ceiling) == skyflatnum) ? frontsector->heightsec->GetTexture(sector_t::ceiling) == skyflatnum) ?
@ -1138,7 +1141,7 @@ void R_Subsector (subsector_t *sub)
frontsector->GetYScale(sector_t::floor), frontsector->GetYScale(sector_t::floor),
frontsector->GetAngle(sector_t::floor), frontsector->GetAngle(sector_t::floor),
frontsector->sky, frontsector->sky,
frontsector->FloorSkyBox skybox
) : NULL; ) : NULL;
// kg3D - fake planes rendering // kg3D - fake planes rendering