From 2c3d1b84f0d1dd23435f50e84959bb8f02383136 Mon Sep 17 00:00:00 2001
From: divverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Mon, 12 Jul 2010 18:03:29 +0000
Subject: [PATCH] Unground smoothing. The roll slowly returns to normal when
 untouching the ground.

From: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10282 d7cf8633-e32d-0410-b094-e92efae38249
---
 client.h |  3 +++
 view.c   | 18 +++++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/client.h b/client.h
index 633335bb..4395eaaf 100644
--- a/client.h
+++ b/client.h
@@ -978,6 +978,9 @@ typedef struct client_state_s
 	double lastongroundtime;
 	double hitgroundtime;
 
+	// used by bobroll
+	float bobroll_airtime;
+
 	// don't change view angle, full screen, etc
 	int intermission;
 	// latched at intermission start
diff --git a/view.c b/view.c
index b5edbfb3..2c330c61 100644
--- a/view.c
+++ b/view.c
@@ -42,6 +42,7 @@ cvar_t cl_bobup = {CVAR_SAVE, "cl_bobup","0.5", "view bobbing adjustment that ma
 cvar_t cl_bobroll = {CVAR_SAVE, "cl_bobroll","1", "view rolling amount"};
 cvar_t cl_bobrollcycle = {CVAR_SAVE, "cl_bobrollcycle","0.5", "view rolling speed"};
 cvar_t cl_bobrollup = {CVAR_SAVE, "cl_bobrollup","0.01", "view bobbing adjustment that makes the up or down swing of the roll last longer"};
+cvar_t cl_bobrollairtime = {CVAR_SAVE, "cl_bobrollairtime","0.05", "how fast the view rolls back when you stop touching the ground"};
 cvar_t cl_bobmodel = {CVAR_SAVE, "cl_bobmodel", "1", "enables gun bobbing"};
 cvar_t cl_bobmodel_side = {CVAR_SAVE, "cl_bobmodel_side", "0.15", "gun bobbing sideways sway amount"};
 cvar_t cl_bobmodel_up = {CVAR_SAVE, "cl_bobmodel_up", "0.06", "gun bobbing upward movement amount"};
@@ -667,10 +668,9 @@ void V_CalcRefdef (void)
 
 					// view rolling code
 					// TODO 1 (DONE): Make it work around the center rather than the left side
-					// TODO 2: Make the roll smoothly return to 0 when you stop touching the ground, rather than instantly
+					// TODO 2 (DONE): Make the roll smoothly return to 0 when you stop touching the ground, rather than instantly
 					// TODO 3: Write cvars to darkplaces.txt, set better defaults and possibly disable by default once the first TODOs are ready
 					if (cl_bobroll.value && cl_bobrollcycle.value)
-					if (cl.onground)
 					{
 						cycle2 = cl.time / cl_bobrollcycle.value;
 						cycle2 -= (int) cycle2;
@@ -678,7 +678,18 @@ void V_CalcRefdef (void)
 							cycle2 = sin(M_PI * cycle2 / 0.5);
 						else
 							cycle2 = sin(M_PI + M_PI * (cycle2-0.5)/0.5);
-						cycle2 *= cl_bobrollup.value;
+
+						if (cl.onground)
+							cl.bobroll_airtime = 1;
+						else
+						{
+							if(cl.bobroll_airtime > 0)
+								cl.bobroll_airtime -= bound(0, cl_bobrollairtime.value, 1);
+							else
+								cl.bobroll_airtime = 0;
+						}
+
+						cycle2 *= cl_bobrollup.value * cl.bobroll_airtime;
 						bobroll = xyspeed * cycle2;
 						viewangles[2] = bound(-45, bobroll, 45);
 					}
@@ -920,6 +931,7 @@ void V_Init (void)
 	Cvar_RegisterVariable (&cl_bobroll);
 	Cvar_RegisterVariable (&cl_bobrollcycle);
 	Cvar_RegisterVariable (&cl_bobrollup);
+	Cvar_RegisterVariable (&cl_bobrollairtime);
 	Cvar_RegisterVariable (&cl_bobmodel);
 	Cvar_RegisterVariable (&cl_bobmodel_side);
 	Cvar_RegisterVariable (&cl_bobmodel_up);
-- 
2.39.5