Exemplo n.º 1
0
void PolyCull::CullNode(void *node)
{
    while (!((size_t)node & 1))  // Keep going until found a subsector
    {
        node_t *bsp = (node_t *)node;

        // Decide which side the view point is on.
        int side = PointOnSide(ViewPos, bsp);

        // Recursively divide front space (toward the viewer).
        CullNode(bsp->children[side]);

        // Possibly divide back space (away from the viewer).
        side ^= 1;
        if (!CheckBBox(bsp->bbox[side]))
            return;

        node = bsp->children[side];
    }

    // Mark that we need to render this
    subsector_t *sub = (subsector_t *)((BYTE *)node - 1);
    MaxCeilingHeight = MAX(MaxCeilingHeight, sub->sector->ceilingplane.Zat0());
    MinFloorHeight = MIN(MinFloorHeight, sub->sector->floorplane.Zat0());
    PvsSectors.push_back(sub);

    // Update culling info for further bsp clipping
    for (uint32_t i = 0; i < sub->numlines; i++)
    {
        seg_t *line = &sub->firstline[i];
        if ((line->sidedef == nullptr || !(line->sidedef->Flags & WALLF_POLYOBJ)) && line->backsector == nullptr)
        {
            int sx1, sx2;
            if (GetSegmentRangeForLine(line->v1->fX(), line->v1->fY(), line->v2->fX(), line->v2->fY(), sx1, sx2))
            {
                MarkSegmentCulled(sx1, sx2);
            }
        }
    }
}
Exemplo n.º 2
0
void PolyCull::CullNode(void *node)
{
	while (!((size_t)node & 1))  // Keep going until found a subsector
	{
		node_t *bsp = (node_t *)node;

		// Decide which side the view point is on.
		int side = PointOnSide(PolyRenderer::Instance()->Viewpoint.Pos, bsp);

		// Recursively divide front space (toward the viewer).
		CullNode(bsp->children[side]);

		// Possibly divide back space (away from the viewer).
		side ^= 1;

		if (!CheckBBox(bsp->bbox[side]))
			return;

		node = bsp->children[side];
	}

	subsector_t *sub = (subsector_t *)((uint8_t *)node - 1);
	CullSubsector(sub);
}