void gl_RenderMissingLines() { for(int i=firstmissingseg;i<numsegs;i++) { seg_t * seg = &segs[i]; // This line has already been processed if (seg->linedef->validcount==validcount) continue; // Don't draw lines facing away from the viewer divline_t dl = { seg->v1->x, seg->v1->y, seg->v2->x-seg->v1->x, seg->v2->y-seg->v1->y }; if (P_PointOnDivlineSide(viewx, viewy, &dl)) continue; // Unfortunately there is no simple means to exclude lines here so we have // to draw them all. sector_t ffakesec, bfakesec; sector_t * sector = gl_FakeFlat(seg->frontsector, &ffakesec, false); sector_t * backsector; if (seg->frontsector == seg->backsector) backsector=sector; else if (!seg->backsector) backsector=NULL; else backsector = gl_FakeFlat(seg->backsector, &bfakesec, true); GLWall wall; SetupWall.Start(true); wall.Process(seg, sector, backsector, NULL); rendered_lines++; SetupWall.Stop(true); } }
static void AddLine (seg_t *seg,sector_t * sector,subsector_t * polysub) { angle_t startAngle, endAngle; sector_t * backsector = NULL; sector_t bs; ClipWall.Clock(); if (GLPortal::mirrorline) { // this seg is completely behind the mirror! if (P_PointOnLineSide(seg->v1->x, seg->v1->y, GLPortal::mirrorline) && P_PointOnLineSide(seg->v2->x, seg->v2->y, GLPortal::mirrorline)) { ClipWall.Unclock(); return; } } startAngle = seg->v2->GetViewAngle(); endAngle = seg->v1->GetViewAngle(); // Back side, i.e. backface culling - read: endAngle >= startAngle! if (startAngle-endAngle<ANGLE_180 || !seg->linedef) { ClipWall.Unclock(); return; } if (!clipper.SafeCheckRange(startAngle, endAngle)) { ClipWall.Unclock(); return; } if (!seg->backsector) { clipper.SafeAddClipRange(startAngle, endAngle); } else if (!polysub) // Two-sided polyobjects never obstruct the view { if (sector->sectornum == seg->backsector->sectornum) { FTexture * tex = TexMan(seg->sidedef->GetTexture(side_t::mid)); if (!tex || tex->UseType==FTexture::TEX_Null) { // nothing to do here! ClipWall.Unclock(); seg->linedef->validcount=validcount; return; } backsector=sector; } else { // clipping checks are only needed when the backsector is not the same as the front sector gl_CheckViewArea(seg->v1, seg->v2, seg->frontsector, seg->backsector); backsector = gl_FakeFlat(seg->backsector, &bs, true); if (gl_CheckClip(seg->sidedef, sector, backsector)) { clipper.SafeAddClipRange(startAngle, endAngle); } } } else { // Backsector for polyobj segs is always the containing sector itself backsector = sector; } seg->linedef->flags |= ML_MAPPED; ClipWall.Unclock(); if (!gl_render_segs) { // rendering per linedef as opposed per seg is significantly more efficient // so mark the linedef as rendered here and render it completely. if (seg->linedef->validcount!=validcount) seg->linedef->validcount=validcount; else return; } GLWall wall; SetupWall.Clock(); wall.Process(seg, sector, backsector, polysub, gl_render_segs); rendered_lines++; SetupWall.Unclock(); }