void PolyCull::CullScene(const TriMatrix &worldToClip) { ClearSolidSegments(); PvsSectors.clear(); frustumPlanes = FrustumPlanes(worldToClip); // Cull front to back if (numnodes == 0) { PvsSectors.push_back(subsectors); MaxCeilingHeight = subsectors->sector->ceilingplane.Zat0(); MinFloorHeight = subsectors->sector->floorplane.Zat0(); } else { MaxCeilingHeight = 0.0; MinFloorHeight = 0.0; CullNode(nodes + numnodes - 1); // The head node is the last node output. } ClearSolidSegments(); }
void PolyCull::InvertSegments() { TempInvertSolidSegments.swap(SolidSegments); ClearSolidSegments(); angle_t cur = 0; for (const auto &segment : TempInvertSolidSegments) { if (cur < segment.Start) MarkSegmentCulled(cur, segment.Start - 1); cur = segment.End + 1; } if (cur < ANGLE_MAX) MarkSegmentCulled(cur, ANGLE_MAX); }
void PolyCull::CullScene(const PolyClipPlane &portalClipPlane) { ClearSolidSegments(); MarkViewFrustum(); if (level.LevelName != lastLevelName) // Is this the best way to detect a level change? { lastLevelName = level.LevelName; SubsectorDepths.clear(); SubsectorDepths.resize(level.subsectors.Size(), 0xffffffff); SectorSeen.clear(); SectorSeen.resize(level.sectors.Size()); } else { for (const auto &sub : PvsSectors) SubsectorDepths[sub->Index()] = 0xffffffff; SubsectorDepths.resize(level.subsectors.Size(), 0xffffffff); for (const auto §or : SeenSectors) SectorSeen[sector->Index()] = false; SectorSeen.resize(level.sectors.Size()); } PvsSectors.clear(); SeenSectors.clear(); NextPvsLineStart = 0; PvsLineStart.clear(); PvsLineVisible.resize(level.segs.Size()); PortalClipPlane = portalClipPlane; // Cull front to back FirstSkyHeight = true; MaxCeilingHeight = 0.0; MinFloorHeight = 0.0; if (level.nodes.Size() == 0) CullSubsector(&level.subsectors[0]); else CullNode(level.HeadNode()); }