//----------------------------------------------------------------------------- // // GLSectorStackPortal::DrawContents // //----------------------------------------------------------------------------- void GLSectorStackPortal::DrawContents() { FPortal *portal = origin; ViewPos += origin->mDisplacement; GLRenderer->mViewActor = NULL; // avoid recursions! if (origin->plane != -1) instack[origin->plane]++; GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); SaveMapSection(); SetupCoverage(); ClearClipper(); // 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 = R_PointInSubsector(ViewPos); if (!(gl_drawinfo->ss_renderflags[sub - ::subsectors] & SSRF_SEEN)) { clipper.SafeAddClipRange(0, ANGLE_MAX); clipper.SetBlocked(true); } GLRenderer->DrawScene(DM_PORTAL); RestoreMapSection(); if (origin->plane != -1) instack[origin->plane]--; }
//----------------------------------------------------------------------------- // // // //----------------------------------------------------------------------------- void GLLineToLinePortal::DrawContents() { // TODO: Handle recursion more intelligently if (renderdepth>r_mirror_recursions) { ClearScreen(); return; } GLRenderer->mClipPortal = this; line_t *origin = glport->lines[0]->mOrigin; P_TranslatePortalXY(origin, ViewPos.X, ViewPos.Y); P_TranslatePortalAngle(origin, ViewAngle); P_TranslatePortalZ(origin, ViewPos.Z); P_TranslatePortalXY(origin, ViewPath[0].X, ViewPath[0].Y); P_TranslatePortalXY(origin, ViewPath[1].X, ViewPath[1].Y); if (!r_showviewer && camera != nullptr && P_PointOnLineSidePrecise(ViewPath[0], glport->lines[0]->mDestination) != P_PointOnLineSidePrecise(ViewPath[1], glport->lines[0]->mDestination)) { double distp = (ViewPath[0] - ViewPath[1]).Length(); if (distp > EQUAL_EPSILON) { double dist1 = (ViewPos - ViewPath[0]).Length(); double dist2 = (ViewPos - ViewPath[1]).Length(); if (dist1 + dist2 < distp + 1) { camera->renderflags |= RF_INVISIBLE; } } } SaveMapSection(); for (unsigned i = 0; i < lines.Size(); i++) { line_t *line = lines[i].seg->linedef->getPortalDestination(); subsector_t *sub; if (line->sidedef[0]->Flags & WALLF_POLYOBJ) sub = R_PointInSubsector(line->v1->fixX(), line->v1->fixY()); else sub = line->frontsector->subsectors[0]; int mapsection = sub->mapsection; currentmapsection[mapsection >> 3] |= 1 << (mapsection & 7); } GLRenderer->mViewActor = nullptr; GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); ClearClipper(); gl_RenderState.SetClipLine(glport->lines[0]->mDestination); gl_RenderState.EnableClipLine(true); GLRenderer->DrawScene(DM_PORTAL); gl_RenderState.EnableClipLine(false); RestoreMapSection(); }
void GLSkyboxPortal::DrawContents() { int old_pm=PlaneMirrorMode; int saved_extralight = extralight; if (skyboxrecursion>=3) { ClearScreen(); return; } skyboxrecursion++; origin->flags|=MF_JUSTHIT; extralight = 0; PlaneMirrorMode=0; glDisable(GL_DEPTH_CLAMP_NV); viewx = origin->PrevX + FixedMul(r_TicFrac, origin->x - origin->PrevX); viewy = origin->PrevY + FixedMul(r_TicFrac, origin->y - origin->PrevY); viewz = origin->PrevZ + FixedMul(r_TicFrac, origin->z - origin->PrevZ); viewangle += origin->PrevAngle + FixedMul(r_TicFrac, origin->angle - origin->PrevAngle); // Don't let the viewpoint be too close to a floor or ceiling! fixed_t floorh = origin->Sector->floorplane.ZatPoint(origin->x, origin->y); fixed_t ceilh = origin->Sector->ceilingplane.ZatPoint(origin->x, origin->y); if (viewz<floorh+4*FRACUNIT) viewz=floorh+4*FRACUNIT; if (viewz>ceilh-4*FRACUNIT) viewz=ceilh-4*FRACUNIT; GLRenderer->mViewActor = origin; validcount++; inskybox=true; GLRenderer->SetupView(viewx, viewy, viewz, viewangle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); GLRenderer->SetViewArea(); ClearClipper(); int mapsection = R_PointInSubsector(viewx, viewy)->mapsection; SaveMapSection(); currentmapsection[mapsection>>3] |= 1 << (mapsection & 7); GLRenderer->DrawScene(); origin->flags&=~MF_JUSTHIT; inskybox=false; glEnable(GL_DEPTH_CLAMP_NV); skyboxrecursion--; PlaneMirrorMode=old_pm; extralight = saved_extralight; RestoreMapSection(); }
void GLSkyboxPortal::DrawContents() { int old_pm = PlaneMirrorMode; int saved_extralight = extralight; if (skyboxrecursion >= 3) { ClearScreen(); return; } skyboxrecursion++; AActor *origin = portal->mSkybox; portal->mFlags |= PORTSF_INSKYBOX; extralight = 0; PlaneMirrorMode = 0; bool oldclamp = gl_RenderState.SetDepthClamp(false); ViewPos = origin->InterpolatedPosition(r_TicFracF); ViewAngle += (origin->PrevAngles.Yaw + deltaangle(origin->PrevAngles.Yaw, origin->Angles.Yaw) * r_TicFracF); // Don't let the viewpoint be too close to a floor or ceiling double floorh = origin->Sector->floorplane.ZatPoint(origin->Pos()); double ceilh = origin->Sector->ceilingplane.ZatPoint(origin->Pos()); if (ViewPos.Z < floorh + 4) ViewPos.Z = floorh + 4; if (ViewPos.Z > ceilh - 4) ViewPos.Z = ceilh - 4; GLRenderer->mViewActor = origin; inskybox = true; GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); GLRenderer->SetViewArea(); ClearClipper(); int mapsection = R_PointInSubsector(ViewPos)->mapsection; SaveMapSection(); currentmapsection[mapsection >> 3] |= 1 << (mapsection & 7); GLRenderer->DrawScene(DM_PORTAL); portal->mFlags &= ~PORTSF_INSKYBOX; inskybox = false; gl_RenderState.SetDepthClamp(oldclamp); skyboxrecursion--; PlaneMirrorMode = old_pm; extralight = saved_extralight; RestoreMapSection(); }
//----------------------------------------------------------------------------- // // GLSectorStackPortal::DrawContents // //----------------------------------------------------------------------------- void GLSectorStackPortal::DrawContents() { FPortal *portal = origin; viewx += origin->xDisplacement; viewy += origin->yDisplacement; GLRenderer->mViewActor = NULL; GLRenderer->mCurrentPortal = this; validcount++; // avoid recursions! if (origin->plane != -1) instack[origin->plane]++; GLRenderer->SetupView(viewx, viewy, viewz, viewangle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); SaveMapSection(); SetupCoverage(); ClearClipper(); GLRenderer->DrawScene(); RestoreMapSection(); if (origin->plane != -1) instack[origin->plane]--; }