diff --git a/r_phase1.c b/r_phase1.c index e24c18f8c..3dd8bf510 100644 --- a/r_phase1.c +++ b/r_phase1.c @@ -27,6 +27,10 @@ typedef struct seg_t *curline; angle_t lineangle1; int splitspans; /* generate wall splits until this reaches 0 */ + VINT lastv1; + VINT lastv2; + angle_t lastangle1; + angle_t lastangle2; } rbspWork_t; static int R_ClipToViewEdges(angle_t angle1, angle_t angle2) ATTR_DATA_CACHE_ALIGN; @@ -546,8 +550,19 @@ static void R_AddLine(rbspWork_t *rbsp, sector_t *frontsector, seg_t *line) side_t *sidedef; boolean solid; - angle1 = R_PointToAngle(v1->x, v1->y); - angle2 = R_PointToAngle(v2->x, v2->y); + if (line->v1 == rbsp->lastv2) + angle1 = rbsp->lastangle2; + else + angle1 = R_PointToAngle(v1->x, v1->y); + if (line->v2 == rbsp->lastv1) + angle2 = rbsp->lastangle1; + else + angle2 = R_PointToAngle(v2->x, v2->y); + + rbsp->lastv1 = line->v1; + rbsp->lastv2 = line->v2; + rbsp->lastangle1 = angle1; + rbsp->lastangle2 = angle2; x1 = R_ClipToViewEdges(angle1, angle2); if (x1 <= 0) @@ -669,6 +684,8 @@ void R_BSP(void) solidsegs[1].last = viewportWidth+1; rbsp.newend = &solidsegs[2]; rbsp.splitspans = viewportWidth + viewportWidth/2; + rbsp.lastv1 = -1; + rbsp.lastv2 = -1; R_RenderBSPNode(&rbsp, numnodes - 1); }