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();
}
Example #2
0
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);
}
Example #3
0
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 &sector : 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());
}