about summary refs log tree commit diff
path: root/src/game/client/components/players.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/client/components/players.cpp')
-rw-r--r--src/game/client/components/players.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp
index f2d81323..68cf032b 100644
--- a/src/game/client/components/players.cpp
+++ b/src/game/client/components/players.cpp
@@ -58,6 +58,22 @@ void PLAYERS::render_hand(TEE_RENDER_INFO *info, vec2 center_pos, vec2 dir, floa
 	gfx_quads_end();
 }
 
+inline float normalize_angular(float f)
+{
+	return fmod(f, pi*2);
+}
+
+inline float mix_angular(float src, float dst, float amount)
+{
+	src = normalize_angular(src);
+	dst = normalize_angular(dst);
+	float d0 = dst-src;
+	float d1 = dst-(src+pi*2);
+	if(fabs(d0) < fabs(d1))
+		return src+d0*amount;
+	return src+d1*amount;
+}
+
 void PLAYERS::render_player(
 	const NETOBJ_CHARACTER *prev_char,
 	const NETOBJ_CHARACTER *player_char,
@@ -112,7 +128,7 @@ void PLAYERS::render_player(
 	if(player.attacktick != prev.attacktick)
 		mixspeed = 0.1f;
 	
-	float angle = mix(gameclient.clients[info.cid].angle, player.angle/256.0f, mixspeed);
+	float angle = mix_angular(gameclient.clients[info.cid].angle, player.angle/256.0f, mixspeed);
 	gameclient.clients[info.cid].angle = angle;
 	vec2 direction = get_direction((int)(angle*256.0f));