diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 4ff193e1d..512e3b1e0 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -266,6 +266,8 @@ void HWDrawInfo::UnclipSubsector(subsector_t *sub) void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) { + const bool doOob = Viewpoint.bDoOob; + #ifdef _DEBUG if (seg->linedef && seg->linedef->Index() == 38) { @@ -289,7 +291,7 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) angle_t endAngleR = 0; angle_t paddingR = 0x00200000; // Make radar clipping more aggressive (reveal less) - if(Viewpoint.IsAllowedOoB() && r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR)) + if(doOob && r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR)) { startAngleR = clipperr.PointToPseudoAngle(seg->v2->fX(), seg->v2->fY()); endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); @@ -317,11 +319,11 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) { if (!(currentsubsector->flags & SSECMF_DRAWN)) { - if (clipper.SafeCheckRange(startAngle, endAngle) && !Viewpoint.IsAllowedOoB()) + if (clipper.SafeCheckRange(startAngle, endAngle) && !doOob) { currentsubsector->flags |= SSECMF_DRAWN; } - if (Viewpoint.IsAllowedOoB() && (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR)) && clipperr.SafeCheckRange(startAngleR, endAngleR)) + if (doOob && (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR)) && clipperr.SafeCheckRange(startAngleR, endAngleR)) { currentsubsector->flags |= SSECMF_DRAWN; } @@ -334,14 +336,14 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) return; } - if (!Viewpoint.IsAllowedOoB() || (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || clipperr.SafeCheckRange(startAngleR, endAngleR))) + if (!doOob || (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || clipperr.SafeCheckRange(startAngleR, endAngleR))) currentsubsector->flags |= SSECMF_DRAWN; uint8_t ispoly = uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ); if (!seg->backsector) { - if(!Viewpoint.IsAllowedOoB()) + if(!doOob) if (!(seg->sidedef->Flags & WALLF_DITHERTRANS_MID)) clipper.SafeAddClipRange(startAngle, endAngle); } else if (!ispoly) // Two-sided polyobjects never obstruct the view @@ -369,7 +371,7 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) if (hw_CheckClip(seg->sidedef, currentsector, backsector)) { - if(!Viewpoint.IsAllowedOoB() && !(seg->sidedef->Flags & WALLF_DITHERTRANS_MID)) + if(!doOob && !(seg->sidedef->Flags & WALLF_DITHERTRANS_MID)) clipper.SafeAddClipRange(startAngle, endAngle); } } @@ -578,7 +580,7 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) if (thing->validcount == validcount) continue; thing->validcount = validcount; - if(Viewpoint.IsAllowedOoB() && thing->Sector->isSecret() && thing->Sector->wasSecret() && !r_radarclipper) continue; // This covers things that are touching non-secret sectors + if(Viewpoint.bDoOob && thing->Sector->isSecret() && thing->Sector->wasSecret() && !r_radarclipper) continue; // This covers things that are touching non-secret sectors FIntCVar *cvar = thing->GetInfo()->distancecheck; if (cvar != nullptr && *cvar >= 0) { @@ -683,6 +685,7 @@ void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) void HWDrawInfo::DoSubsector(subsector_t * sub) { + const bool doOob = Viewpoint.bDoOob; sector_t * sector; sector_t * fakesector; @@ -711,10 +714,10 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) fakesector=hw_FakeFlat(sector, in_area, false); - if(Viewpoint.IsAllowedOoB() && sector->isSecret() && sector->wasSecret() && !r_radarclipper) return; + if(doOob && sector->isSecret() && sector->wasSecret() && !r_radarclipper) return; // cull everything if subsector outside all relevant clippers - if (Viewpoint.IsAllowedOoB() && (sub->polys == nullptr)) + if (doOob && (sub->polys == nullptr)) { auto &clipper = *mClipper; auto &clipperv = *vClipper; @@ -722,11 +725,10 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) int count = sub->numlines; seg_t * seg = sub->firstline; bool anglevisible = false; - bool pitchvisible = !(Viewpoint.IsAllowedOoB()); // No vertical clipping if viewpoint is not allowed out of bounds - bool radarvisible = !(Viewpoint.IsAllowedOoB()) || !r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || ((sub->flags & SSECMF_DRAWN) && !deathmatch); - bool ceilreflect = (mCurrentPortal && strcmp(mCurrentPortal->GetName(), "Planemirror ceiling")); - bool floorreflect = (mCurrentPortal && strcmp(mCurrentPortal->GetName(), "Planemirror floor")); - double planez = (ceilreflect ? sector->ceilingplane.ZatPoint(Viewpoint.Pos) : sector->floorplane.ZatPoint(Viewpoint.Pos)); + bool pitchvisible = false; + bool radarvisible = !r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || ((sub->flags & SSECMF_DRAWN) && !deathmatch); + const int reflect = mCurrentPortal ? mCurrentPortal->GetMirrorSide() : 0; // -1 = ceiling, 1 = floor, 0 = none + const double planez = (reflect < 0 ? sector->ceilingplane.ZatPoint(Viewpoint.Pos) : sector->floorplane.ZatPoint(Viewpoint.Pos)); angle_t pitchtemp; angle_t pitchmin = ANGLE_90; angle_t pitchmax = 0; @@ -751,11 +753,11 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) if (!pitchvisible) { pitchmin = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), - (ceilreflect || floorreflect) ? + (reflect != 0) ? 2 * planez - sector->floorplane.ZatPoint(seg->v1) : sector->floorplane.ZatPoint(seg->v1)); pitchmax = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), - (ceilreflect || floorreflect) ? + (reflect != 0) ? 2 * planez - sector->ceilingplane.ZatPoint(seg->v1) : sector->ceilingplane.ZatPoint(seg->v1)); pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); @@ -764,12 +766,12 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) if (!pitchvisible) { pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), - (ceilreflect || floorreflect) ? + (reflect != 0) ? 2 * planez - sector->floorplane.ZatPoint(seg->v2) : sector->floorplane.ZatPoint(seg->v2)); if (int(pitchmin) > int(pitchtemp)) pitchmin = pitchtemp; pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), - (ceilreflect || floorreflect) ? + (reflect != 0) ? 2 * planez - sector->ceilingplane.ZatPoint(seg->v2) : sector->ceilingplane.ZatPoint(seg->v2)); if (int(pitchmax) < int(pitchtemp)) pitchmax = pitchtemp; @@ -840,7 +842,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) SetupSprite.Unclock(); } } - if (r_dithertransparency && Viewpoint.IsAllowedOoB() && (RTnum < MAXDITHERACTORS) && mCurrentPortal == nullptr) + if (r_dithertransparency && doOob && (RTnum < MAXDITHERACTORS) && mCurrentPortal == nullptr) { // [DVR] Not parallelizable due to variables RTnum and RenderedTargets[] for (auto p = sector->touching_renderthings; p != nullptr; p = p->m_snext) @@ -974,7 +976,7 @@ void HWDrawInfo::RenderBSPNode (void *node) if (!(no_renderflags[bsp->Index()] & SSRF_SEEN)) return; } - if (Viewpoint.IsOrtho()) + if (Viewpoint.bDoOrtho) { if (!vClipper->CheckBoxOrthoPitch(bsp->bbox[side])) { @@ -991,7 +993,7 @@ void HWDrawInfo::RenderBSPNode (void *node) // No need for clipping inside frustum if no fog of war (How is this faster!) void HWDrawInfo::RenderOrthoNoFog() { - if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) + if (Viewpoint.bDoOrtho && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) { double vxdbl = Viewpoint.OffPos.X; double vydbl = Viewpoint.OffPos.Y; @@ -1017,7 +1019,7 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) // Give the DrawInfo the viewpoint in fixed point because that's what the nodes are. viewx = FLOAT2FIXED(Viewpoint.Pos.X); viewy = FLOAT2FIXED(Viewpoint.Pos.Y); - if (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && Viewpoint.IsAllowedOoB()) + if (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && Viewpoint.bDoOob) { viewx = FLOAT2FIXED(Viewpoint.OffPos.X); viewy = FLOAT2FIXED(Viewpoint.OffPos.Y); @@ -1032,7 +1034,7 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) auto future = renderPool.push([&](int id) { WorkerThread(); }); - if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); + if (Viewpoint.bDoOrtho && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); else RenderBSPNode(node); jobQueue.AddJob(RenderJob::TerminateJob, nullptr, nullptr); @@ -1043,7 +1045,7 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) } else { - if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); + if (Viewpoint.bDoOrtho && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); else RenderBSPNode(node); Bsp.Unclock(); } diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index 7444af309..4638123c6 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -404,7 +404,7 @@ angle_t Clipper::PointToPseudoAngle(double x, double y) { return 0; } - else if (!amRadar && viewpoint->IsOrtho()) + else if (!amRadar && viewpoint->bDoOrtho) { return PointToPseudoOrthoAngle(x, y); } @@ -431,7 +431,7 @@ angle_t Clipper::PointToPseudoPitch(double x, double y, double z) { return 0; } - else if (viewpoint->IsOrtho()) + else if (viewpoint->bDoOrtho) { return PointToPseudoOrthoPitch(x, y, z); } @@ -545,7 +545,7 @@ bool Clipper::CheckBox(const float *bspcoord) angle1 = PointToPseudoAngle (bspcoord[check[0]], bspcoord[check[1]]); angle2 = PointToPseudoAngle (bspcoord[check[2]], bspcoord[check[3]]); - if (vp->IsOrtho()) + if (vp->bDoOrtho) { if (angle2 != angle1) return true; switch (boxpos) // Check if the closer corner is poking into the view area @@ -570,7 +570,7 @@ bool Clipper::CheckBoxOrthoPitch(const float *bspcoord) { angle_t pitchmin, pitchmax; auto &vp = viewpoint; - if (!vp->IsOrtho()) return true; + if (!vp->bDoOrtho) return true; angle_t pitchtemp; double padding = 1.0/viewpoint->ScreenProj/viewpoint->PitchCos; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index a9f866a5c..6862b8d03 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -270,7 +270,7 @@ void HWDrawInfo::ClearBuffers() void HWDrawInfo::UpdateCurrentMapSection() { int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; - if (Viewpoint.IsAllowedOoB() || Viewpoint.IsOrtho()) + if (Viewpoint.bDoOob || Viewpoint.bDoOrtho) mapsection = Level->PointInRenderSubsector(Viewpoint.OffPos)->mapsection; CurrentMapSections.Set(mapsection); } @@ -287,7 +287,7 @@ void HWDrawInfo::SetViewArea() auto &vp = Viewpoint; // The render_sector is better suited to represent the current position in GL vp.sector = Level->PointInRenderSubsector(vp.Pos)->render_sector; - if (Viewpoint.IsAllowedOoB()) + if (Viewpoint.bDoOob) vp.sector = Level->PointInRenderSubsector(vp.camera->Pos())->render_sector; // Get the heightsec state from the render sector, not the current one! @@ -387,7 +387,7 @@ angle_t OoBFrustumAngle(FRenderViewpoint* Viewpoint) angle_t HWDrawInfo::FrustumAngle() { - if (Viewpoint.IsAllowedOoB()) + if (Viewpoint.bDoOob) { return OoBFrustumAngle(&Viewpoint); } @@ -484,7 +484,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites) angle_t a1 = FrustumAngle(); // horizontally clip the back of the viewport mClipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + a1, vp.Angles.Yaw.BAMs() - a1); Viewpoint.FrustAngle = a1; - if (Viewpoint.IsAllowedOoB()) // No need for vertical clipper if viewpoint not allowed out of bounds + if (Viewpoint.bDoOob) // No need for vertical clipper if viewpoint not allowed out of bounds { double a2 = 20.0 + 0.5*Viewpoint.FieldOfView.Degrees(); // FrustumPitch for vertical clipping if (a2 > 179.0) a2 = 179.0; @@ -812,7 +812,7 @@ void HWDrawInfo::SetDitherTransFlags(AActor* actor) double horiy = Viewpoint.Cos * actor->radius; DVector3 actorpos = actor->Pos(); DVector3 vvec = actorpos - Viewpoint.Pos; - if (Viewpoint.IsOrtho()) + if (Viewpoint.bDoOrtho) { vvec = 5.0 * Viewpoint.camera->ViewPos->Offset.Length() * Viewpoint.ViewVector3D; // Should be 4.0? (since zNear is behind screen by 3*dist in VREyeInfo::GetProjection()) } @@ -1010,7 +1010,7 @@ void HWDrawInfo::DrawScene(int drawmode) { ssao_portals_available = gl_ssao_portals; applySSAO = true; - if (r_dithertransparency && vp.IsAllowedOoB()) + if (r_dithertransparency && vp.bDoOob) { vp.camera->tracer ? SetDitherTransFlags(vp.camera->tracer) : SetDitherTransFlags(players[consoleplayer].mo); } @@ -1068,7 +1068,7 @@ void HWDrawInfo::ProcessScene(bool toscreen) portalState.BeginScene(); int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; - if (Viewpoint.IsAllowedOoB() || Viewpoint.IsOrtho()) + if (Viewpoint.bDoOob || Viewpoint.bDoOrtho) mapsection = Level->PointInRenderSubsector(Viewpoint.OffPos)->mapsection; CurrentMapSections.Set(mapsection); DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN); diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index d53092c01..178c6872f 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -532,7 +532,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) // // // - if ((which & SSRF_RENDERFLOOR) && (vp.IsOrtho() ? vp.ViewVector3D.dot(frontsector->floorplane.Normal()) < 0.0 : frontsector->floorplane.ZatPoint(vp.Pos) <= vp.Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERFLOOR))) + if ((which & SSRF_RENDERFLOOR) && (vp.bDoOrtho ? vp.ViewVector3D.dot(frontsector->floorplane.Normal()) < 0.0 : frontsector->floorplane.ZatPoint(vp.Pos) <= vp.Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERFLOOR))) { // process the original floor first. @@ -590,7 +590,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) // // // - if ((which & SSRF_RENDERCEILING) && (vp.IsOrtho() ? vp.ViewVector3D.dot(frontsector->ceilingplane.Normal()) < 0.0 : frontsector->ceilingplane.ZatPoint(vp.Pos) >= vp.Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERCEILING))) + if ((which & SSRF_RENDERCEILING) && (vp.bDoOrtho ? vp.ViewVector3D.dot(frontsector->ceilingplane.Normal()) < 0.0 : frontsector->ceilingplane.ZatPoint(vp.Pos) >= vp.Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERCEILING))) { // process the original ceiling first. @@ -675,7 +675,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) double ff_top = rover->top.plane->ZatPoint(sector->centerspot); if (ff_top < lastceilingheight) { - if ((vp.IsOrtho() ? vp.ViewVector3D.dot(rover->top.plane->Normal()) > 0.0 : vp.Pos.Z <= rover->top.plane->ZatPoint(vp.Pos))) + if ((vp.bDoOrtho ? vp.ViewVector3D.dot(rover->top.plane->Normal()) > 0.0 : vp.Pos.Z <= rover->top.plane->ZatPoint(vp.Pos))) { SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; @@ -689,7 +689,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot); if (ff_bottom < lastceilingheight) { - if ((vp.IsOrtho() ? vp.ViewVector3D.dot(rover->bottom.plane->Normal()) > 0.0 : vp.Pos.Z <= rover->bottom.plane->ZatPoint(vp.Pos))) + if ((vp.bDoOrtho ? vp.ViewVector3D.dot(rover->bottom.plane->Normal()) > 0.0 : vp.Pos.Z <= rover->bottom.plane->ZatPoint(vp.Pos))) { SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; @@ -715,7 +715,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot); if (ff_bottom > lastfloorheight || (rover->flags&FF_FIX)) { - if ((vp.IsOrtho() ? vp.ViewVector3D.dot(rover->bottom.plane->Normal()) > 0.0 : vp.Pos.Z >= rover->bottom.plane->ZatPoint(vp.Pos))) + if ((vp.bDoOrtho ? vp.ViewVector3D.dot(rover->bottom.plane->Normal()) > 0.0 : vp.Pos.Z >= rover->bottom.plane->ZatPoint(vp.Pos))) { SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; @@ -736,7 +736,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) double ff_top = rover->top.plane->ZatPoint(sector->centerspot); if (ff_top > lastfloorheight) { - if ((vp.IsOrtho() ? vp.ViewVector3D.dot(rover->top.plane->Normal()) > 0.0 : vp.Pos.Z >= rover->top.plane->ZatPoint(vp.Pos))) + if ((vp.bDoOrtho ? vp.ViewVector3D.dot(rover->top.plane->Normal()) > 0.0 : vp.Pos.Z >= rover->top.plane->ZatPoint(vp.Pos))) { SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); Colormap.FadeColor = frontsector->Colormap.FadeColor; diff --git a/src/rendering/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp index 0963405db..c80d3c308 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.cpp +++ b/src/rendering/hwrenderer/scene/hw_portal.cpp @@ -125,7 +125,7 @@ bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di { HWPortal * best = nullptr; unsigned bestindex = 0; - bool usestencil = outer_di->Viewpoint.IsAllowedOoB(); + bool usestencil = outer_di->Viewpoint.bDoOob; // Find the one with the highest amount of lines. // Normally this is also the one that saves the largest amount @@ -507,7 +507,7 @@ bool HWMirrorPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clippe } auto &vp = di->Viewpoint; - state->vpIsAllowedOoB = vp.IsAllowedOoB(); + state->vpIsAllowedOoB = vp.bDoOob; di->UpdateCurrentMapSection(); di->mClipPortal = this; @@ -576,7 +576,7 @@ bool HWMirrorPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clippe angle_t af = di->FrustumAngle(); if (af < ANGLE_180) clipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + af, vp.Angles.Yaw.BAMs() - af); - if(!di->Viewpoint.IsAllowedOoB()) + if(!di->Viewpoint.bDoOob) clipper->SafeAddClipRange(linedef->v1, linedef->v2); return true; } @@ -612,7 +612,7 @@ bool HWLineToLinePortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *cl return false; } auto &vp = di->Viewpoint; - state->vpIsAllowedOoB = vp.IsAllowedOoB(); + state->vpIsAllowedOoB = vp.bDoOob; di->mClipPortal = this; line_t *origin = glport->lines[0]->mOrigin; @@ -692,7 +692,7 @@ bool HWSkyboxPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clippe return false; } auto &vp = di->Viewpoint; - state->vpIsAllowedOoB = vp.IsAllowedOoB(); + state->vpIsAllowedOoB = vp.bDoOob; state->skyboxrecursion++; state->PlaneMirrorMode = 0; @@ -804,7 +804,7 @@ bool HWSectorStackPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *c FSectorPortalGroup *portal = origin; auto &vp = di->Viewpoint; - state->vpIsAllowedOoB = vp.IsAllowedOoB(); + state->vpIsAllowedOoB = vp.bDoOob; vp.Pos += origin->mDisplacement; vp.ActorPos += origin->mDisplacement; @@ -813,7 +813,7 @@ bool HWSectorStackPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *c // avoid recursions! if (origin->plane != -1) screen->instack[origin->plane]++; - if (vp.IsAllowedOoB() && lines.Size() > 0) + if (vp.bDoOob && lines.Size() > 0) { flat.plane.GetFromSector(lines[0].sub->sector, origin->plane); @@ -827,7 +827,7 @@ bool HWSectorStackPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *c // If the viewpoint is not within the portal, we need to invalidate the entire clip area. // The portal will re-validate the necessary parts when its subsectors get traversed. subsector_t *sub = di->Level->PointInRenderSubsector(vp.Pos); - if (vp.IsAllowedOoB()) sub = di->Level->PointInRenderSubsector(vp.OffPos); + if (vp.bDoOob) sub = di->Level->PointInRenderSubsector(vp.OffPos); if (!(di->ss_renderflags[sub->Index()] & SSRF_SEEN)) { clipper->SafeAddClipRange(0, ANGLE_MAX); @@ -895,7 +895,7 @@ bool HWPlaneMirrorPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *c std::swap(screen->instack[sector_t::floor], screen->instack[sector_t::ceiling]); auto &vp = di->Viewpoint; - state->vpIsAllowedOoB = vp.IsAllowedOoB(); + state->vpIsAllowedOoB = vp.bDoOob; old_pm = state->PlaneMirrorMode; // the player is always visible in a mirror. @@ -951,6 +951,8 @@ void HWPlaneMirrorPortal::Shutdown(HWDrawInfo *di, FRenderState &rstate) const char *HWPlaneMirrorPortal::GetName() { return origin->fC() < 0? "Planemirror ceiling" : "Planemirror floor"; } +int HWPlaneMirrorPortal::GetMirrorSide() const { return origin->fC() < 0 ? -1 : 1; }; + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- diff --git a/src/rendering/hwrenderer/scene/hw_portal.h b/src/rendering/hwrenderer/scene/hw_portal.h index 64952b88b..139225a58 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.h +++ b/src/rendering/hwrenderer/scene/hw_portal.h @@ -70,6 +70,7 @@ public: { } virtual ~HWPortal() {} + virtual int GetMirrorSide() const { return 0; }; virtual int ClipSeg(seg_t *seg, const DVector3 &viewpos) { return PClip_Inside; } virtual int ClipSubsector(subsector_t *sub) { return PClip_Inside; } virtual int ClipPoint(const DVector2 &pos) { return PClip_Inside; } @@ -148,7 +149,7 @@ public: virtual bool NeedDepthBuffer() { return true; } virtual void DrawContents(HWDrawInfo *di, FRenderState &state) { - if (Setup(di, state, (di->Viewpoint.IsAllowedOoB() ? di->rClipper : di->mClipper))) + if (Setup(di, state, (di->Viewpoint.bDoOob ? di->rClipper : di->mClipper))) { di->DrawScene(DM_PORTAL); Shutdown(di, state); @@ -304,6 +305,8 @@ protected: public: + int GetMirrorSide() const override; + HWPlaneMirrorPortal(FPortalSceneState *state, secplane_t * pt) : HWScenePortalBase(state) { origin = pt; diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index e8645e8dc..ff9ef4e72 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -157,10 +157,10 @@ void HWWall::SkyPlane(HWWallDispatcher *di, sector_t *sector, int plane, bool al case PORTS_PORTAL: case PORTS_LINKEDPORTAL: { - if (di->di && di->di->Viewpoint.IsAllowedOoB()) + if (di->di && di->di->Viewpoint.bDoOob) { secplane_t myplane = plane ? sector->ceilingplane : sector->floorplane; - if (di->di->Viewpoint.IsOrtho() && di->di->Viewpoint.ViewVector3D.dot(myplane.Normal()) > 0.0) return; + if (di->di->Viewpoint.bDoOrtho && di->di->Viewpoint.ViewVector3D.dot(myplane.Normal()) > 0.0) return; else if (plane==1 && di->di->Viewpoint.Pos.Z >= myplane.ZatPoint(di->di->Viewpoint.Pos)) return; else if (plane==0 && di->di->Viewpoint.Pos.Z <= myplane.ZatPoint(di->di->Viewpoint.Pos)) return; } @@ -323,7 +323,7 @@ void HWWall::SkyTop(HWWallDispatcher *di, seg_t * seg,sector_t * fs,sector_t * b // if (backreflect > 0 && bs->ceilingplane.fD() == fs->ceilingplane.fD() && !bs->isClosed()) // { // Don't add intra-portal line to the portal. - // if (!(di->di && di->di->Viewpoint.IsAllowedOoB())) + // if (!(di->di && di->di->Viewpoint.bDoOob)) // { // return; // } @@ -406,7 +406,7 @@ void HWWall::SkyBottom(HWWallDispatcher *di, seg_t * seg,sector_t * fs,sector_t // if (backreflect > 0 && bs->floorplane.fD() == fs->floorplane.fD() && !bs->isClosed()) // { // // Don't add intra-portal line to the portal. - // if (!(di->di && di->di->Viewpoint.IsAllowedOoB())) + // if (!(di->di && di->di->Viewpoint.bDoOob)) // { // return; // } diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index d29766350..f5cda4466 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -547,7 +547,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) mat.Translate(-center.X, -center.Z, -center.Y); } - if (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES) && di->Viewpoint.IsOrtho()) + if (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES) && di->Viewpoint.bDoOrtho) { float angleRad = (FAngle::fromDeg(270.) - HWAngles.Yaw).Radians(); mat.Translate(center.X, center.Z, center.Y); @@ -952,7 +952,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t bool mirror = false; bool backfaced = false; DAngle ang = (thingpos - vp.Pos).Angle(); - if (di->Viewpoint.IsOrtho()) ang = vp.Angles.Yaw; + if (di->Viewpoint.bDoOrtho) ang = vp.Angles.Yaw; else if (actor && thing->renderflags2 & RF2_ANGLEDROLL) { Matrix3x4 rolltilt; diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index 557004f53..7ff0fa7d8 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -706,7 +706,7 @@ void HWWall::PutPortal(HWWallDispatcher *di, int ptype, int plane) break; case PORTALTYPE_PLANEMIRROR: - if (ddi->Viewpoint.IsOrtho() ? (ddi->Viewpoint.ViewVector3D.dot(planemirror->Normal()) < 0) + if (ddi->Viewpoint.bDoOrtho ? (ddi->Viewpoint.ViewVector3D.dot(planemirror->Normal()) < 0) : (portalState.PlaneMirrorMode * planemirror->fC() <= 0)) { planemirror = portalState.UniquePlaneMirrors.Get(planemirror); diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index ab0a8c6e6..d97de3e3d 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -550,7 +550,7 @@ void R_InterpolateView(FRenderViewpoint& viewPoint, const player_t* const player const int prevPortalGroup = viewLvl->PointInRenderSubsector(iView->Old.Pos)->sector->PortalGroup; const int curPortalGroup = viewLvl->PointInRenderSubsector(iView->New.Pos)->sector->PortalGroup; - if (viewPoint.IsAllowedOoB() && prevPortalGroup != curPortalGroup) viewPoint.Pos = iView->New.Pos; + if (viewPoint.bDoOob && prevPortalGroup != curPortalGroup) viewPoint.Pos = iView->New.Pos; else { const DVector2 portalOffset = viewLvl->Displacements.getOffset(prevPortalGroup, curPortalGroup); @@ -567,7 +567,7 @@ void R_InterpolateView(FRenderViewpoint& viewPoint, const player_t* const player // Due to interpolation this is not necessarily the same as the sector the camera is in. viewPoint.sector = viewLvl->PointInRenderSubsector(viewPoint.Pos)->sector; - if (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer()) + if (!viewPoint.bDoOob || !V_IsHardwareRenderer()) { bool moved = false; while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) @@ -712,7 +712,7 @@ void FRenderViewpoint::SetViewAngle(const FViewWindow& viewWindow) ViewVector3D.Y = v.Y * PitchCos; ViewVector3D.Z = -PitchSin; - if (IsOrtho() || IsAllowedOoB()) // These auto-ensure that camera and camera->ViewPos exist + if (bDoOrtho || bDoOob) // These auto-ensure that camera and camera->ViewPos exist { if (camera->tracer != NULL) { @@ -724,7 +724,7 @@ void FRenderViewpoint::SetViewAngle(const FViewWindow& viewWindow) } } - if (IsOrtho() && (camera->ViewPos->Offset.XY().Length() > 0.0)) + if (bDoOrtho && (camera->ViewPos->Offset.XY().Length() > 0.0)) { ScreenProj = 1.34396 / camera->ViewPos->Offset.Length() / tan (FieldOfView.Radians()*0.5); // [DVR] Estimated. +/-1 should be top/bottom of screen. ScreenProjX = ScreenProj * 0.5 / viewWindow.WidescreenRatio; @@ -953,6 +953,9 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA if (viewPoint.camera == nullptr) I_Error("You lost your body. Bad dehacked work is likely to blame."); + viewPoint.bDoOob = viewPoint.IsAllowedOoB(); + viewPoint.bDoOrtho = viewPoint.IsOrtho(); + InterpolationViewer* const iView = FindPastViewer(viewPoint.camera); // Always reset these back to zero. iView->ViewOffset.Zero(); @@ -1101,14 +1104,14 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA // Keep the view within the sector's floor and ceiling // But allow VPSF_ALLOWOUTOFBOUNDS camera viewpoints to go out of bounds when using hardware renderer - if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) + if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && (!viewPoint.bDoOob || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->ceilingplane.ZatPoint(viewPoint.Pos) - 4.0; if (viewPoint.Pos.Z > z) viewPoint.Pos.Z = z; } - if (viewPoint.sector->PortalBlocksMovement(sector_t::floor) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) + if (viewPoint.sector->PortalBlocksMovement(sector_t::floor) && (!viewPoint.bDoOob || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->floorplane.ZatPoint(viewPoint.Pos) + 4.0; if (viewPoint.Pos.Z < z) diff --git a/src/rendering/r_utility.h b/src/rendering/r_utility.h index 0c2f47833..dab98dfea 100644 --- a/src/rendering/r_utility.h +++ b/src/rendering/r_utility.h @@ -53,6 +53,8 @@ struct FRenderViewpoint int extralight; // extralight to be added to this viewpoint bool showviewer; // show the camera actor? bool bForceNoViewer; // Never show the camera Actor. + bool bDoOob; + bool bDoOrtho; void SetViewAngle(const FViewWindow& viewWindow); bool IsAllowedOoB(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ALLOWOUTOFBOUNDS flag set bool IsOrtho(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ORTHOGRAPHIC flag set