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); } }
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; }
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; }