diff --git a/src/g_level.cpp b/src/g_level.cpp index 48440baa90..2f631db98a 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1483,6 +1483,7 @@ void G_InitLevelLocals () level.Music = info->Music; level.musicorder = info->musicorder; level.MusicVolume = 1.f; + level.HasHeightSecs = false; level.LevelName = level.info->LookupLevelName(); level.NextMap = info->NextMap; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 183005c533..3d23fb0853 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -151,6 +151,7 @@ struct FLevelLocals int8_t WallHorizLight; bool FromSnapshot; // The current map was restored from a snapshot + bool HasHeightSecs; // true if some Transfer_Heights effects are present in the map. If this is false, some checks in the renderer can be shortcut. double teamdamage; diff --git a/src/gl/scene/gl_bsp.cpp b/src/gl/scene/gl_bsp.cpp index 2295bebecc..83620cbb24 100644 --- a/src/gl/scene/gl_bsp.cpp +++ b/src/gl/scene/gl_bsp.cpp @@ -140,7 +140,7 @@ void GLSceneDrawer::AddLine (seg_t *seg, bool portalclip) else { // clipping checks are only needed when the backsector is not the same as the front sector - in_area = hw_CheckViewArea(in_area, seg->v1, seg->v2, seg->frontsector, seg->backsector); + if (in_area == area_default) in_area = hw_CheckViewArea(seg->v1, seg->v2, seg->frontsector, seg->backsector); backsector = hw_FakeFlat(seg->backsector, &bs, in_area, true); diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index e2823d9233..ef17b71282 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -111,7 +111,7 @@ void GLSceneDrawer::SetViewArea() } else { - in_area = area_default; // depends on exposed lower sectors + in_area = level.HasHeightSecs? area_default : area_normal; // depends on exposed lower sectors, if map contains heightsecs. } } diff --git a/src/hwrenderer/scene/hw_fakeflat.cpp b/src/hwrenderer/scene/hw_fakeflat.cpp index 994cd95fa6..6b535bdad9 100644 --- a/src/hwrenderer/scene/hw_fakeflat.cpp +++ b/src/hwrenderer/scene/hw_fakeflat.cpp @@ -153,13 +153,14 @@ bool hw_CheckClip(side_t * sidedef, sector_t * frontsector, sector_t * backsecto //========================================================================== // -// check for levels with exposed lower areas +// check for levels with exposed lower areas. May only be called if actual +// state is not known yet! // //========================================================================== -area_t hw_CheckViewArea(area_t in_area, vertex_t *v1, vertex_t *v2, sector_t *frontsector, sector_t *backsector) +area_t hw_CheckViewArea(vertex_t *v1, vertex_t *v2, sector_t *frontsector, sector_t *backsector) { - if (in_area == area_default && + if ( (backsector->heightsec && !(backsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC)) && (!frontsector->heightsec || frontsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC)) { @@ -176,7 +177,7 @@ area_t hw_CheckViewArea(area_t in_area, vertex_t *v1, vertex_t *v2, sector_t *fr else return area_normal; } - return in_area; + return area_default; } diff --git a/src/hwrenderer/scene/hw_fakeflat.h b/src/hwrenderer/scene/hw_fakeflat.h index e402627adb..8e5b9dfec9 100644 --- a/src/hwrenderer/scene/hw_fakeflat.h +++ b/src/hwrenderer/scene/hw_fakeflat.h @@ -12,5 +12,5 @@ enum area_t : int // Global functions. Make them members of GLRenderer later? bool hw_CheckClip(side_t * sidedef, sector_t * frontsector, sector_t * backsector); sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool back); -area_t hw_CheckViewArea(area_t in_area, vertex_t *v1, vertex_t *v2, sector_t *frontsector, sector_t *backsector); +area_t hw_CheckViewArea(vertex_t *v1, vertex_t *v2, sector_t *frontsector, sector_t *backsector); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 5183324f99..da20dec4af 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -1343,6 +1343,7 @@ void P_SpawnSpecials (void) case Transfer_Heights: { sec = line.frontsector; + if (line.args[1] & 2) { sec->MoreFlags |= SECF_FAKEFLOORONLY; @@ -1363,6 +1364,7 @@ void P_SpawnSpecials (void) { sec->MoreFlags |= SECF_IGNOREHEIGHTSEC; } + else level.HasHeightSecs = true; if (line.args[1] & 32) { sec->MoreFlags |= SECF_NOFAKELIGHT;