From 604e9b5ea3782b358b5a811d596dfd08b93f7061 Mon Sep 17 00:00:00 2001
From: Eidolon <furyhunter600@gmail.com>
Date: Tue, 12 Apr 2022 22:54:56 -0500
Subject: [PATCH] Interpolate mobj angles and player drawangle

---
 src/d_player.h | 1 +
 src/p_mobj.c   | 7 +++++++
 src/p_mobj.h   | 2 ++
 src/r_fps.c    | 6 +++---
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/d_player.h b/src/d_player.h
index 755926480..0111083d0 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -382,6 +382,7 @@ typedef struct player_s
 
 	// fun thing for player sprite
 	angle_t drawangle;
+	angle_t old_drawangle;
 
 	// player's ring count
 	INT16 rings;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 8c4c18b82..9f69af57c 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -902,6 +902,12 @@ void P_ResetInterpolationState(mobj_t *mobj)
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;
+	mobj->old_angle = mobj->angle;
+
+	if (mobj->player)
+	{
+		mobj->player->old_drawangle = mobj->player->drawangle;
+	}
 }
 
 //
@@ -914,6 +920,7 @@ void P_ResetPrecipitationInterpolationState(precipmobj_t *mobj)
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;
+	mobj->old_angle = mobj->angle;
 }
 
 //
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 7f2736801..9975075a1 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -287,6 +287,7 @@ typedef struct mobj_s
 
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
+	angle_t old_angle;
 	angle_t rollangle;
 	spritenum_t sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
@@ -415,6 +416,7 @@ typedef struct precipmobj_s
 
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
+	angle_t old_angle;
 	angle_t rollangle;
 	spritenum_t sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
diff --git a/src/r_fps.c b/src/r_fps.c
index 559520c5d..819df0325 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -185,11 +185,11 @@ void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out)
 
 	if (mobj->player)
 	{
-		out->angle = mobj->player->drawangle;
+		out->angle = R_LerpAngle(mobj->player->old_drawangle, mobj->player->drawangle, frac);
 	}
 	else
 	{
-		out->angle = mobj->angle;
+		out->angle = R_LerpAngle(mobj->old_angle, mobj->angle, frac);
 	}
 }
 
@@ -198,7 +198,7 @@ void R_InterpolatePrecipMobjState(precipmobj_t *mobj, fixed_t frac, interpmobjst
 	out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
 	out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
 	out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
-	out->angle = mobj->angle;
+	out->angle = R_LerpAngle(mobj->old_angle, mobj->angle, frac);
 }
 
 static void AddInterpolator(levelinterpolator_t* interpolator)
-- 
GitLab