diff --git a/src/r_draw.c b/src/r_draw.c
index f25ecfa04aea758d531c1f4b7fdedbe5694c0d30..766e0428e09844b2f32d96ca00d257c3a4bc8f23 100644
--- a/src/r_draw.c
+++ b/src/r_draw.c
@@ -105,7 +105,7 @@ UINT8 *ds_transmap; // one of the translucency tables
 
 #ifdef ESLOPE
 pslope_t *ds_slope; // Current slope being used
-FVector ds_su, ds_sv, ds_sz; // Vectors for... stuff?
+floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff?
 float focallengthf, zeroheight;
 #endif
 
diff --git a/src/r_draw.h b/src/r_draw.h
index b29791cc431bb558107f5a3c02ea8d87e21581f9..e1818545b71ef8e25473dec8d91f2b04ae42c03a 100644
--- a/src/r_draw.h
+++ b/src/r_draw.h
@@ -61,11 +61,12 @@ extern UINT8 *ds_source; // start of a 64*64 tile image
 extern UINT8 *ds_transmap;
 
 #ifdef ESLOPE
-///TODO: either convert ds_su, etc to FPU or declare a floating-point vector type somewhere
-#include "hardware/hw_defs.h"
+typedef struct {
+	float x, y, z;
+} floatv3_t;
 
 pslope_t *ds_slope; // Current slope being used
-FVector ds_su, ds_sv, ds_sz; // Vectors for... stuff?
+floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff?
 float focallengthf, zeroheight;
 #endif
 
diff --git a/src/r_plane.c b/src/r_plane.c
index 839f2fa3857b8f2bb6d1dce47bf68af187747e90..1c4abc8c5313482f60ab11060f0353a6d48ebc41 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -941,41 +941,60 @@ void R_DrawSinglePlane(visplane_t *pl)
 	if (pl->slope) {
 		// Potentially override other stuff for now cus we're mean. :< But draw a slope plane!
 		// I copied ZDoom's code and adapted it to SRB2... -Red
-		FVector p, m, n;
-		angle_t ang;
+		floatv3_t p, m, n;
+		float ang;
 		//double zeroheight;
+		float fudge;
 
-		double vx = FIXED_TO_FLOAT(viewx);
-		double vy = FIXED_TO_FLOAT(viewy);
-		double vz = FIXED_TO_FLOAT(viewz);
+		float vx = FIXED_TO_FLOAT(viewx);
+		float vy = FIXED_TO_FLOAT(viewy);
+		float vz = FIXED_TO_FLOAT(viewz);
 
 		zeroheight = FIXED_TO_FLOAT(P_GetZAt(pl->slope, viewx, viewy));
 
+#define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
+
 		// p is the texture origin in view space
 		// Don't add in the offsets at this stage, because doing so can result in
 		// errors if the flat is rotated.
-		ang = (ANGLE_270 - viewangle)>>ANGLETOFINESHIFT;
-		p.x = vx * FIXED_TO_FLOAT(FINECOSINE(ang)) - vy * FIXED_TO_FLOAT(FINESINE(ang));
-		p.z = vx * FIXED_TO_FLOAT(FINESINE(ang)) + vy * FIXED_TO_FLOAT(FINECOSINE(ang));
+		ang = ANG2RAD(ANGLE_270 - viewangle);
+		p.x = vx * cos(ang) - vy * sin(ang);
+		p.z = vx * sin(ang) + vy * cos(ang);
 		p.y = FIXED_TO_FLOAT(P_GetZAt(pl->slope, 0, 0)) - vz;
 
 		// m is the v direction vector in view space
-		ang = (ANGLE_180 - viewangle - pl->plangle) >> ANGLETOFINESHIFT;
-		m.x = FIXED_TO_FLOAT(FINECOSINE(ang));
-		m.z = FIXED_TO_FLOAT(FINESINE(ang));
+		ang = ANG2RAD(ANGLE_180 - viewangle - pl->plangle);
+		m.x = cos(ang);
+		m.z = sin(ang);
 
 		// n is the u direction vector in view space
-		n.x = FIXED_TO_FLOAT(FINESINE(ang));
-		n.z = -FIXED_TO_FLOAT(FINECOSINE(ang));
-
-		ang = pl->plangle>>ANGLETOFINESHIFT;
-		m.y = FIXED_TO_FLOAT(P_GetZAt(pl->slope, viewx + FINESINE(ang), viewy + FINECOSINE(ang))) - zeroheight;
-		n.y = FIXED_TO_FLOAT(P_GetZAt(pl->slope, viewx + FINECOSINE(ang), viewy - FINESINE(ang))) - zeroheight;
-
-		///TODO: slope FPU conversion stuff
-		//M_CrossProduct3f(&ds_su, &p, &m);
-		//M_CrossProduct3f(&ds_sv, &p, &n);
-		//M_CrossProduct3f(&ds_sz, &m, &n);
+		n.x = sin(ang);
+		n.z = -cos(ang);
+
+		ang = ANG2RAD(pl->plangle);
+		m.y = FIXED_TO_FLOAT(P_GetZAt(pl->slope, viewx + FLOAT_TO_FIXED(sin(ang)), viewy + FLOAT_TO_FIXED(cos(ang)))) - zeroheight;
+		n.y = FIXED_TO_FLOAT(P_GetZAt(pl->slope, viewx + FLOAT_TO_FIXED(cos(ang)), viewy - FLOAT_TO_FIXED(sin(ang)))) - zeroheight;
+
+		// Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red
+		fudge = ((1<<nflatshiftup)+1.0f)/(1<<nflatshiftup);
+
+		m.x /= fudge;
+		m.y /= fudge;
+		m.z /= fudge;
+
+		n.x *= fudge;
+		n.y *= fudge;
+		n.z *= fudge;
+
+		// Eh. I tried making this stuff fixed-point and it exploded on me. Here's a macro for the only floating-point vector function I recall using.
+#define CROSS(d, v1, v2) \
+   d.x = (v1.y * v2.z) - (v1.z * v2.y);\
+   d.y = (v1.z * v2.x) - (v1.x * v2.z);\
+   d.z = (v1.x * v2.y) - (v1.y * v2.x)
+		CROSS(ds_su, p, m);
+		CROSS(ds_sv, p, n);
+		CROSS(ds_sz, m, n);
+#undef CROSS
 
 		ds_su.z *= focallengthf;
 		ds_sv.z *= focallengthf;