diff --git a/src/r_fps.c b/src/r_fps.c
index 819df0325833fd3b9a424f08dc8841f90f8b5454..863e9613a40f56f790176150cdd55d494d32dd38 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -177,6 +177,26 @@ void R_SetViewContext(enum viewcontext_e _viewcontext)
 	}
 }
 
+fixed_t R_InterpolateFixed(fixed_t from, fixed_t to)
+{
+	if (cv_frameinterpolation.value == 0)
+	{
+		return to;
+	}
+
+	return (R_LerpFixed(from, to, rendertimefrac));
+}
+
+angle_t R_InterpolateAngle(angle_t from, angle_t to)
+{
+	if (cv_frameinterpolation.value == 0)
+	{
+		return to;
+	}
+
+	return (R_LerpAngle(from, to, rendertimefrac));
+}
+
 void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out)
 {
 	out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
diff --git a/src/r_fps.h b/src/r_fps.h
index 0e10cf5e66e8ff628375bebb8b2a0c350e6a348b..aa6213ae34d3ddbdbed4d205562de89fb3bcd235 100644
--- a/src/r_fps.h
+++ b/src/r_fps.h
@@ -99,6 +99,10 @@ void R_UpdateViewInterpolation(void);
 void R_ResetViewInterpolation(void);
 // Set the current view context (the viewvars pointed to by newview)
 void R_SetViewContext(enum viewcontext_e _viewcontext);
+
+fixed_t R_InterpolateFixed(fixed_t from, fixed_t to);
+angle_t R_InterpolateAngle(angle_t from, angle_t to);
+
 // Evaluate the interpolated mobj state for the given mobj
 void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out);
 // Evaluate the interpolated mobj state for the given precipmobj