Example #1
0
void FFlatVertexGenerator::CheckUpdate(sector_t *sector)
{
	CheckPlanes(sector);
	sector_t *hs = sector->GetHeightSec();
	if (hs != NULL) CheckPlanes(hs);
	for (unsigned i = 0; i < sector->e->XFloor.ffloors.Size(); i++)
		CheckPlanes(sector->e->XFloor.ffloors[i]->model);
}
void FFlatVertexBuffer::CheckUpdate(sector_t *sector)
{
    if (gl.flags & RFL_BUFFER_STORAGE)
    {
        CheckPlanes(sector);
        sector_t *hs = sector->GetHeightSec();
        if (hs != NULL) CheckPlanes(hs);
        for (unsigned i = 0; i < sector->e->XFloor.ffloors.Size(); i++)
            CheckPlanes(sector->e->XFloor.ffloors[i]->model);
    }
}
Example #3
0
bool VLevel::TraceLine(linetrace_t& Trace, const TVec& Start, const TVec& End,
	int PlaneNoBlockFlags) const
{
	guard(VLevel::TraceLine);
	validcount++;

	Trace.Start = Start;
	Trace.End = End;

	Trace.Delta = End - Start;
	Trace.Plane.SetPointDir(Start, Trace.Delta);

	Trace.LineStart = Trace.Start;

	Trace.PlaneNoBlockFlags = PlaneNoBlockFlags;
	Trace.SightEarlyOut = false;

	// the head node is the last node output
	if (CrossBSPNode(Trace, NumNodes - 1))
	{
		Trace.LineEnd = End;
		return CheckPlanes(Trace, PointInSubsector(End)->sector);
	}
	return false;
	unguard;
}
Example #4
0
bool VLevel::CheckLine(linetrace_t& Trace, seg_t* Seg) const
{
	guard(VLevel::CheckLine);
	line_t*			line;
	int				s1;
	int				s2;
	sector_t*		front;
	float			frac;
	float			num;
	float			den;
	TVec			hit_point;

	line = Seg->linedef;
	if (!line)
		return true;

	// allready checked other side?
	if (line->validcount == validcount)
		return true;
	
	line->validcount = validcount;

	s1 = Trace.Plane.PointOnSide2(*line->v1);
	s2 = Trace.Plane.PointOnSide2(*line->v2);

	// line isn't crossed?
	if (s1 == s2)
		return true;

	s1 = line->PointOnSide2(Trace.Start);
	s2 = line->PointOnSide2(Trace.End);

	// line isn't crossed?
	if (s1 == s2 || (s1 == 2 && s2 == 0))
		return true;

	// crosses a two sided line
	if (s1 == 0 || s1 == 2)
	{
		front = line->frontsector;
	}
	else
	{
		front = line->backsector;
	}

	// Intercept vector.
	// Don't need to check if den == 0, because then planes are paralel
	// (they will never cross) or it's the same plane (also rejected)
	den = DotProduct(Trace.Delta, line->normal);
	num = line->dist - DotProduct(Trace.Start, line->normal);
	frac = num / den;
	hit_point = Trace.Start + frac * Trace.Delta;

	Trace.LineEnd = hit_point;

	if (front)
	{
		if (!CheckPlanes(Trace, front))
		{
			return false;
		}
	}
	Trace.LineStart = Trace.LineEnd;

	if (line->flags & ML_TWOSIDED)
	{
		// crosses a two sided line
		opening_t *open;

		open = SV_LineOpenings(line, hit_point, Trace.PlaneNoBlockFlags);
		while (open)
		{
			if (open->bottom <= hit_point.z && open->top >= hit_point.z)
			{
				return true;
			}
			open = open->next;
		}
	}

	//  Hit line
	if (s1 == 0 || s1 == 2)
	{
		Trace.HitPlaneNormal = line->normal;
	}
	else
	{
		Trace.HitPlaneNormal = -line->normal;
	}

	if (!(line->flags & ML_TWOSIDED))
	{
		Trace.SightEarlyOut = true;
	}
	return false;
	unguard;
}