diff --git a/src/r_plane.c b/src/r_plane.c
index 10d87b9ccd431b7e3dc9fcd8244757e6ea9c753e..ea5a7a3c326abe1e73dea43b7778f55f6d5b62f1 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -789,6 +789,78 @@ static void R_SetSlopePlaneVectors(visplane_t *pl, INT32 y, fixed_t xoff, fixed_
 	R_CalculateSlopeVectors();
 }
 
+/*
+	Essentially: We can't & the components along the regular axes when the plane is rotated.
+	This is because the distance on each regular axis in order to loop is different.
+	We rotate them, & the components, add them together, & them again, and then rotate them back.
+	These three seperate & operations are done per axis in order to prevent overflows.
+	toast 10/04/17
+*/
+static inline void R_AdjustSlopeCoordinates(visplane_t *pl)
+{
+	const fixed_t modmask = ((1 << (32-nflatshiftup)) - 1);
+
+	const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT);
+	const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT);
+
+	fixed_t ox = (FixedMul(pl->slope->o.x,cosinecomponent) & modmask) - (FixedMul(pl->slope->o.y,sinecomponent) & modmask);
+	fixed_t oy = (-FixedMul(pl->slope->o.x,sinecomponent) & modmask) - (FixedMul(pl->slope->o.y,cosinecomponent) & modmask);
+
+	fixed_t temp = ox & modmask;
+	oy &= modmask;
+
+	ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction
+	oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent);
+
+	if (xoffs || yoffs)
+	{
+		temp = xoffs;
+		xoffs = (FixedMul(temp,cosinecomponent) & modmask) + (FixedMul(yoffs,sinecomponent) & modmask);
+		yoffs = (-FixedMul(temp,sinecomponent) & modmask) + (FixedMul(yoffs,cosinecomponent) & modmask);
+
+		temp = xoffs & modmask;
+		yoffs &= modmask;
+		xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto
+		yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent);
+	}
+
+	xoffs -= (pl->slope->o.x - ox);
+	yoffs += (pl->slope->o.y + oy);
+}
+
+static inline void R_AdjustSlopeCoordinatesNPO2(visplane_t *pl)
+{
+	const fixed_t modmaskw = (ds_flatwidth << FRACBITS);
+	const fixed_t modmaskh = (ds_flatheight << FRACBITS);
+
+	const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT);
+	const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT);
+
+	fixed_t ox = (FixedMul(pl->slope->o.x,cosinecomponent) % modmaskw) - (FixedMul(pl->slope->o.y,sinecomponent) % modmaskh);
+	fixed_t oy = (-FixedMul(pl->slope->o.x,sinecomponent) % modmaskw) - (FixedMul(pl->slope->o.y,cosinecomponent) % modmaskh);
+
+	fixed_t temp = ox % modmaskw;
+	oy %= modmaskh;
+
+	ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction
+	oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent);
+
+	if (xoffs || yoffs)
+	{
+		temp = xoffs;
+		xoffs = (FixedMul(temp,cosinecomponent) % modmaskw) + (FixedMul(yoffs,sinecomponent) % modmaskh);
+		yoffs = (-FixedMul(temp,sinecomponent) % modmaskw) + (FixedMul(yoffs,cosinecomponent) % modmaskh);
+
+		temp = xoffs % modmaskw;
+		yoffs %= modmaskh;
+		xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto
+		yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent);
+	}
+
+	xoffs -= (pl->slope->o.x - ox);
+	yoffs += (pl->slope->o.y + oy);
+}
+
 void R_DrawSinglePlane(visplane_t *pl)
 {
 	levelflat_t *levelflat;
@@ -967,38 +1039,10 @@ void R_DrawSinglePlane(visplane_t *pl)
 
 	if (pl->slope)
 	{
-		const fixed_t modmaskw = (ds_powersoftwo) ? (ds_flatwidth  << FRACBITS) - 1 : (signed)(0xFFFFFFFF);
-		const fixed_t modmaskh = (ds_powersoftwo) ? (ds_flatheight << FRACBITS) - 1 : (signed)(0xFFFFFFFF);
-
-		/*
-		Essentially: We can't & the components along the regular axes when the plane is rotated.
-		This is because the distance on each regular axis in order to loop is different.
-		We rotate them, & the components, add them together, & them again, and then rotate them back.
-		These three seperate & operations are done per axis in order to prevent overflows.
-		toast 10/04/17
-		*/
-		const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT);
-		const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT);
-
-		fixed_t ox = (FixedMul(pl->slope->o.x,cosinecomponent) & modmaskw) - (FixedMul(pl->slope->o.y,sinecomponent) & modmaskh);
-		fixed_t oy = (-FixedMul(pl->slope->o.x,sinecomponent) & modmaskw) - (FixedMul(pl->slope->o.y,cosinecomponent) & modmaskh);
-
-		fixed_t temp = ox & modmaskw;
-		oy &= modmaskh;
-		ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction
-		oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent);
-
-		temp = xoffs;
-		xoffs = (FixedMul(temp,cosinecomponent) & modmaskw) + (FixedMul(yoffs,sinecomponent) & modmaskh);
-		yoffs = (-FixedMul(temp,sinecomponent) & modmaskw) + (FixedMul(yoffs,cosinecomponent) & modmaskh);
-
-		temp = xoffs & modmaskw;
-		yoffs &= modmaskh;
-		xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto
-		yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent);
-
-		xoffs -= (pl->slope->o.x - ox);
-		yoffs += (pl->slope->o.y + oy);
+		if (ds_powersoftwo)
+			R_AdjustSlopeCoordinates(pl);
+		else
+			R_AdjustSlopeCoordinatesNPO2(pl);
 
 		if (planeripple.active)
 		{