From ee15856786cacbbced069476bb1f4c7306ee2dd1 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 15 Nov 2016 15:15:26 +0100 Subject: [PATCH] Deep water support --- src/r_poly.cpp | 2 +- src/r_poly_plane.cpp | 45 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/r_poly.cpp b/src/r_poly.cpp index c95083c1db..17006b2d0b 100644 --- a/src/r_poly.cpp +++ b/src/r_poly.cpp @@ -147,7 +147,7 @@ void RenderPolyScene::RenderLine(subsector_t *sub, seg_t *line, sector_t *fronts // Cull wall if not visible int sx1, sx2; bool hasSegmentRange = Cull.GetSegmentRangeForLine(line->v1->fX(), line->v1->fY(), line->v2->fX(), line->v2->fY(), sx1, sx2); - if (hasSegmentRange && Cull.IsSegmentCulled(sx1, sx2)) + if (!hasSegmentRange || Cull.IsSegmentCulled(sx1, sx2)) return; // Tell automap we saw this diff --git a/src/r_poly_plane.cpp b/src/r_poly_plane.cpp index 9ca82cf28d..e6c6dbe286 100644 --- a/src/r_poly_plane.cpp +++ b/src/r_poly_plane.cpp @@ -31,9 +31,48 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, subsector_t *sub, uint32_t subsectorDepth, bool ceiling, double skyHeight) { - sector_t *frontsector = sub->sector; + sector_t *fakesector = sub->sector->heightsec; + if (fakesector && (fakesector == sub->sector || (fakesector->MoreFlags & SECF_IGNOREHEIGHTSEC) == SECF_IGNOREHEIGHTSEC)) + fakesector = nullptr; + + bool fakeflooronly = fakesector && (fakesector->MoreFlags & SECF_FAKEFLOORONLY) != SECF_FAKEFLOORONLY; + + FTextureID picnum; + bool ccw; + sector_t *frontsector; + if (ceiling && fakesector && ViewPos.Z < fakesector->floorplane.Zat0()) + { + picnum = fakesector->GetTexture(sector_t::ceiling); + ccw = false; + ceiling = false; + frontsector = fakesector; + } + else if (!ceiling && fakesector && ViewPos.Z >= fakesector->floorplane.Zat0()) + { + picnum = fakesector->GetTexture(sector_t::ceiling); + ccw = true; + frontsector = fakesector; + } + else if (ceiling && fakesector && ViewPos.Z > fakesector->ceilingplane.Zat0() && !fakeflooronly) + { + picnum = fakesector->GetTexture(sector_t::floor); + ccw = true; + frontsector = fakesector; + } + else if (!ceiling && fakesector && ViewPos.Z <= fakesector->ceilingplane.Zat0() && !fakeflooronly) + { + picnum = fakesector->GetTexture(sector_t::floor); + ccw = false; + ceiling = true; + frontsector = fakesector; + } + else + { + picnum = sub->sector->GetTexture(ceiling ? sector_t::ceiling : sector_t::floor); + ccw = true; + frontsector = sub->sector; + } - FTextureID picnum = frontsector->GetTexture(ceiling ? sector_t::ceiling : sector_t::floor); FTexture *tex = TexMan(picnum); if (tex->UseType == FTexture::TEX_Null) return; @@ -76,7 +115,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, subsector_t *sub, uin args.vinput = vertices; args.vcount = sub->numlines; args.mode = TriangleDrawMode::Fan; - args.ccw = true; + args.ccw = ccw; args.clipleft = 0; args.cliptop = 0; args.clipright = viewwidth;