mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-25 21:41:30 +00:00
Move more encrypted code into IsInvisibleLine, IsDoorClosed and IsSolid
This commit is contained in:
parent
1983dd2483
commit
9e2702d885
2 changed files with 107 additions and 92 deletions
|
@ -130,21 +130,13 @@ namespace swrenderer
|
||||||
|
|
||||||
rw_havehigh = rw_havelow = false;
|
rw_havehigh = rw_havelow = false;
|
||||||
|
|
||||||
bool solid;
|
if (mBackSector)
|
||||||
|
|
||||||
// Single sided line?
|
|
||||||
if (mBackSector == NULL)
|
|
||||||
{
|
|
||||||
solid = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// kg3D - its fake, no transfer_heights
|
// kg3D - its fake, no transfer_heights
|
||||||
if (!(clip3d->fake3D & FAKE3D_FAKEBACK))
|
if (!(clip3d->fake3D & FAKE3D_FAKEBACK))
|
||||||
{ // killough 3/8/98, 4/4/98: hack for invisible ceilings / deep water
|
{ // killough 3/8/98, 4/4/98: hack for invisible ceilings / deep water
|
||||||
mBackSector = Thread->OpaquePass->FakeFlat(mBackSector, &tempsec, nullptr, nullptr, mLineSegment, WallC.sx1, WallC.sx2, mFrontCeilingZ1, mFrontCeilingZ2);
|
mBackSector = Thread->OpaquePass->FakeFlat(mBackSector, &tempsec, nullptr, nullptr, mLineSegment, WallC.sx1, WallC.sx2, mFrontCeilingZ1, mFrontCeilingZ2);
|
||||||
}
|
}
|
||||||
mDoorClosed = false; // killough 4/16/98
|
|
||||||
|
|
||||||
mBackCeilingZ1 = mBackSector->ceilingplane.ZatPoint(line->v1);
|
mBackCeilingZ1 = mBackSector->ceilingplane.ZatPoint(line->v1);
|
||||||
mBackFloorZ1 = mBackSector->floorplane.ZatPoint(line->v1);
|
mBackFloorZ1 = mBackSector->floorplane.ZatPoint(line->v1);
|
||||||
|
@ -175,98 +167,27 @@ namespace swrenderer
|
||||||
rw_havelow = true;
|
rw_havelow = true;
|
||||||
walllower.Project(mBackSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
walllower.Project(mBackSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Portal
|
mDoorClosed = IsDoorClosed();
|
||||||
if (line->linedef->isVisualPortal() && line->sidedef == line->linedef->sidedef[0])
|
|
||||||
|
if (IsInvisibleLine())
|
||||||
|
{
|
||||||
|
// When using GL nodes, do a clipping test for these lines so we can
|
||||||
|
// mark their subsectors as visible for automap texturing.
|
||||||
|
if (hasglnodes && !(mSubsector->flags & SSECF_DRAWN))
|
||||||
{
|
{
|
||||||
solid = true;
|
if (Thread->ClipSegments->Check(WallC.sx1, WallC.sx2))
|
||||||
}
|
|
||||||
// Closed door.
|
|
||||||
else if ((mBackCeilingZ1 <= mFrontFloorZ1 && mBackCeilingZ2 <= mFrontFloorZ2) ||
|
|
||||||
(mBackFloorZ1 >= mFrontCeilingZ1 && mBackFloorZ2 >= mFrontCeilingZ2))
|
|
||||||
{
|
|
||||||
solid = true;
|
|
||||||
}
|
|
||||||
else if (
|
|
||||||
// properly render skies (consider door "open" if both ceilings are sky):
|
|
||||||
(mBackSector->GetTexture(sector_t::ceiling) != skyflatnum || mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum)
|
|
||||||
|
|
||||||
// if door is closed because back is shut:
|
|
||||||
&& mBackCeilingZ1 <= mBackFloorZ1 && mBackCeilingZ2 <= mBackFloorZ2
|
|
||||||
|
|
||||||
// preserve a kind of transparent door/lift special effect:
|
|
||||||
&& ((mBackCeilingZ1 >= mFrontCeilingZ1 && mBackCeilingZ2 >= mFrontCeilingZ2) || line->sidedef->GetTexture(side_t::top).isValid())
|
|
||||||
&& ((mBackFloorZ1 <= mFrontFloorZ1 && mBackFloorZ2 <= mFrontFloorZ2) || line->sidedef->GetTexture(side_t::bottom).isValid()))
|
|
||||||
{
|
|
||||||
// killough 1/18/98 -- This function is used to fix the automap bug which
|
|
||||||
// showed lines behind closed doors simply because the door had a dropoff.
|
|
||||||
//
|
|
||||||
// It assumes that Doom has already ruled out a door being closed because
|
|
||||||
// of front-back closure (e.g. front floor is taller than back ceiling).
|
|
||||||
|
|
||||||
// This fixes the automap floor height bug -- killough 1/18/98:
|
|
||||||
// killough 4/7/98: optimize: save result in doorclosed for use in r_segs.c
|
|
||||||
mDoorClosed = true;
|
|
||||||
solid = true;
|
|
||||||
}
|
|
||||||
else if (mFrontSector->ceilingplane != mBackSector->ceilingplane ||
|
|
||||||
mFrontSector->floorplane != mBackSector->floorplane)
|
|
||||||
{
|
|
||||||
// Window.
|
|
||||||
solid = false;
|
|
||||||
}
|
|
||||||
else if (SkyboxCompare(mFrontSector, mBackSector))
|
|
||||||
{
|
|
||||||
solid = false;
|
|
||||||
}
|
|
||||||
else if (mBackSector->lightlevel != mFrontSector->lightlevel
|
|
||||||
|| mBackSector->GetTexture(sector_t::floor) != mFrontSector->GetTexture(sector_t::floor)
|
|
||||||
|| mBackSector->GetTexture(sector_t::ceiling) != mFrontSector->GetTexture(sector_t::ceiling)
|
|
||||||
|| mLineSegment->sidedef->GetTexture(side_t::mid).isValid()
|
|
||||||
|
|
||||||
// killough 3/7/98: Take flats offsets into account:
|
|
||||||
|| mBackSector->planes[sector_t::floor].xform != mFrontSector->planes[sector_t::floor].xform
|
|
||||||
|| mBackSector->planes[sector_t::ceiling].xform != mFrontSector->planes[sector_t::ceiling].xform
|
|
||||||
|
|
||||||
|| mBackSector->GetPlaneLight(sector_t::floor) != mFrontSector->GetPlaneLight(sector_t::floor)
|
|
||||||
|| mBackSector->GetPlaneLight(sector_t::ceiling) != mFrontSector->GetPlaneLight(sector_t::ceiling)
|
|
||||||
|| mBackSector->GetVisFlags(sector_t::floor) != mFrontSector->GetVisFlags(sector_t::floor)
|
|
||||||
|| mBackSector->GetVisFlags(sector_t::ceiling) != mFrontSector->GetVisFlags(sector_t::ceiling)
|
|
||||||
|
|
||||||
// [RH] Also consider colormaps
|
|
||||||
|| mBackSector->ColorMap != mFrontSector->ColorMap
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// kg3D - and fake lights
|
|
||||||
|| (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size())
|
|
||||||
|| (mBackSector->e && mBackSector->e->XFloor.lightlist.Size())
|
|
||||||
)
|
|
||||||
{
|
|
||||||
solid = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Reject empty lines used for triggers and special events.
|
|
||||||
// Identical floor and ceiling on both sides, identical light levels
|
|
||||||
// on both sides, and no middle texture.
|
|
||||||
|
|
||||||
// When using GL nodes, do a clipping test for these lines so we can
|
|
||||||
// mark their subsectors as visible for automap texturing.
|
|
||||||
if (hasglnodes && !(mSubsector->flags & SSECF_DRAWN))
|
|
||||||
{
|
{
|
||||||
if (Thread->ClipSegments->Check(WallC.sx1, WallC.sx2))
|
mSubsector->flags |= SSECF_DRAWN;
|
||||||
{
|
|
||||||
mSubsector->flags |= SSECF_DRAWN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rw_prepped = false;
|
rw_prepped = false;
|
||||||
|
|
||||||
bool visible = Thread->ClipSegments->Clip(WallC.sx1, WallC.sx2, solid, this);
|
bool visible = Thread->ClipSegments->Clip(WallC.sx1, WallC.sx2, IsSolid(), this);
|
||||||
|
|
||||||
if (visible)
|
if (visible)
|
||||||
{
|
{
|
||||||
|
@ -274,6 +195,96 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SWRenderLine::IsInvisibleLine() const
|
||||||
|
{
|
||||||
|
// Reject empty lines used for triggers and special events.
|
||||||
|
// Identical floor and ceiling on both sides, identical light levels
|
||||||
|
// on both sides, and no middle texture.
|
||||||
|
|
||||||
|
if (!mBackSector) return false;
|
||||||
|
|
||||||
|
// Portal
|
||||||
|
if (mLineSegment->linedef->isVisualPortal() && mLineSegment->sidedef == mLineSegment->linedef->sidedef[0]) return false;
|
||||||
|
|
||||||
|
// Closed door.
|
||||||
|
if (mBackCeilingZ1 <= mFrontFloorZ1 && mBackCeilingZ2 <= mFrontFloorZ2) return false;
|
||||||
|
if (mBackFloorZ1 >= mFrontCeilingZ1 && mBackFloorZ2 >= mFrontCeilingZ2) return false;
|
||||||
|
if (IsDoorClosed()) return false;
|
||||||
|
|
||||||
|
// Window.
|
||||||
|
if (mFrontSector->ceilingplane != mBackSector->ceilingplane || mFrontSector->floorplane != mBackSector->floorplane) return false;
|
||||||
|
if (SkyboxCompare(mFrontSector, mBackSector)) return false;
|
||||||
|
|
||||||
|
if (mBackSector->lightlevel != mFrontSector->lightlevel) return false;
|
||||||
|
if (mBackSector->GetTexture(sector_t::floor) != mFrontSector->GetTexture(sector_t::floor)) return false;
|
||||||
|
if (mBackSector->GetTexture(sector_t::ceiling) != mFrontSector->GetTexture(sector_t::ceiling)) return false;
|
||||||
|
if (mLineSegment->sidedef->GetTexture(side_t::mid).isValid()) return false;
|
||||||
|
|
||||||
|
if (mBackSector->planes[sector_t::floor].xform != mFrontSector->planes[sector_t::floor].xform) return false;
|
||||||
|
if (mBackSector->planes[sector_t::ceiling].xform != mFrontSector->planes[sector_t::ceiling].xform) return false;
|
||||||
|
|
||||||
|
if (mBackSector->GetPlaneLight(sector_t::floor) != mFrontSector->GetPlaneLight(sector_t::floor)) return false;
|
||||||
|
if (mBackSector->GetPlaneLight(sector_t::ceiling) != mFrontSector->GetPlaneLight(sector_t::ceiling)) return false;
|
||||||
|
if (mBackSector->GetVisFlags(sector_t::floor) != mFrontSector->GetVisFlags(sector_t::floor)) return false;
|
||||||
|
if (mBackSector->GetVisFlags(sector_t::ceiling) != mFrontSector->GetVisFlags(sector_t::ceiling)) return false;
|
||||||
|
|
||||||
|
if (mBackSector->ColorMap != mFrontSector->ColorMap) return false;
|
||||||
|
|
||||||
|
if (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size()) return false;
|
||||||
|
if (mBackSector->e && mBackSector->e->XFloor.lightlist.Size()) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SWRenderLine::IsSolid() const
|
||||||
|
{
|
||||||
|
// One sided
|
||||||
|
if (mBackSector == nullptr) return true;
|
||||||
|
|
||||||
|
// Portal
|
||||||
|
if (mLineSegment->linedef->isVisualPortal() && mLineSegment->sidedef == mLineSegment->linedef->sidedef[0]) return true;
|
||||||
|
|
||||||
|
// Closed door
|
||||||
|
if (mBackCeilingZ1 <= mFrontFloorZ1 && mBackCeilingZ2 <= mFrontFloorZ2) return true;
|
||||||
|
if (mBackFloorZ1 >= mFrontCeilingZ1 && mBackFloorZ2 >= mFrontCeilingZ2) return true;
|
||||||
|
if (IsDoorClosed()) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SWRenderLine::IsDoorClosed() const
|
||||||
|
{
|
||||||
|
// Portal
|
||||||
|
if (mLineSegment->linedef->isVisualPortal() && mLineSegment->sidedef == mLineSegment->linedef->sidedef[0]) return false;
|
||||||
|
|
||||||
|
// Closed door.
|
||||||
|
if (mBackCeilingZ1 <= mFrontFloorZ1 && mBackCeilingZ2 <= mFrontFloorZ2) return false;
|
||||||
|
if (mBackFloorZ1 >= mFrontCeilingZ1 && mBackFloorZ2 >= mFrontCeilingZ2) return false;
|
||||||
|
|
||||||
|
// properly render skies (consider door "open" if both ceilings are sky)
|
||||||
|
if (mBackSector->GetTexture(sector_t::ceiling) == skyflatnum && mFrontSector->GetTexture(sector_t::ceiling) == skyflatnum) return false;
|
||||||
|
|
||||||
|
// if door is closed because back is shut:
|
||||||
|
if (!(mBackCeilingZ1 <= mBackFloorZ1 && mBackCeilingZ2 <= mBackFloorZ2)) return false;
|
||||||
|
|
||||||
|
// preserve a kind of transparent door/lift special effect:
|
||||||
|
if (((mBackCeilingZ1 >= mFrontCeilingZ1 && mBackCeilingZ2 >= mFrontCeilingZ2) || mLineSegment->sidedef->GetTexture(side_t::top).isValid())
|
||||||
|
&& ((mBackFloorZ1 <= mFrontFloorZ1 && mBackFloorZ2 <= mFrontFloorZ2) || mLineSegment->sidedef->GetTexture(side_t::bottom).isValid()))
|
||||||
|
{
|
||||||
|
// killough 1/18/98 -- This function is used to fix the automap bug which
|
||||||
|
// showed lines behind closed doors simply because the door had a dropoff.
|
||||||
|
//
|
||||||
|
// It assumes that Doom has already ruled out a door being closed because
|
||||||
|
// of front-back closure (e.g. front floor is taller than back ceiling).
|
||||||
|
|
||||||
|
// This fixes the automap floor height bug -- killough 1/18/98:
|
||||||
|
// killough 4/7/98: optimize: save result in doorclosed for use in r_segs.c
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool SWRenderLine::SkyboxCompare(sector_t *frontsector, sector_t *backsector) const
|
bool SWRenderLine::SkyboxCompare(sector_t *frontsector, sector_t *backsector) const
|
||||||
{
|
{
|
||||||
FSectorPortal *frontc = frontsector->GetPortal(sector_t::ceiling);
|
FSectorPortal *frontc = frontsector->GetPortal(sector_t::ceiling);
|
||||||
|
|
|
@ -65,6 +65,10 @@ namespace swrenderer
|
||||||
bool IsFogBoundary(sector_t *front, sector_t *back) const;
|
bool IsFogBoundary(sector_t *front, sector_t *back) const;
|
||||||
bool SkyboxCompare(sector_t *frontsector, sector_t *backsector) const;
|
bool SkyboxCompare(sector_t *frontsector, sector_t *backsector) const;
|
||||||
|
|
||||||
|
bool IsInvisibleLine() const;
|
||||||
|
bool IsDoorClosed() const;
|
||||||
|
bool IsSolid() const;
|
||||||
|
|
||||||
bool ShouldMarkFloor() const;
|
bool ShouldMarkFloor() const;
|
||||||
bool ShouldMarkCeiling() const;
|
bool ShouldMarkCeiling() const;
|
||||||
bool ShouldMarkPortal() const;
|
bool ShouldMarkPortal() const;
|
||||||
|
|
Loading…
Reference in a new issue