From cc1781926b4c49c72977d4ddb16cc583a9ffeb80 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 31 Jan 2013 20:37:58 +0000
Subject: * Adds a satisfying angular roll when an avatar is flying and
turning. (General, not physics). Makes flying not feel as stiff.
Conflicts:
OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 81 ++++++++++++++++++++++++
1 file changed, 81 insertions(+)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a9195f7..3e5f947 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -204,6 +204,11 @@ namespace OpenSim.Region.Framework.Scenes
private const int LAND_VELOCITYMAG_MAX = 12;
+ private const float FLY_ROLL_MAX_RADIANS = 1.1f;
+
+ private const float FLY_ROLL_RADIANS_PER_SECOND = 0.06f;
+ private const float FLY_ROLL_RESET_RADIANS_PER_SECOND = 0.02f;
+
private float m_health = 100f;
protected ulong crossingFromRegion;
@@ -606,6 +611,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ // Used for limited viewer 'fake' user rotations.
+ private Vector3 m_AngularVelocity = Vector3.Zero;
+
+ public Vector3 AngularVelocity
+ {
+ get { return m_AngularVelocity; }
+ }
+
public bool IsChildAgent { get; set; }
public bool IsLoggingIn { get; set; }
@@ -736,6 +749,8 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
+
+
#region Constructor(s)
public ScenePresence(
@@ -1225,6 +1240,49 @@ namespace OpenSim.Region.Framework.Scenes
ControllingClient.StopFlying(this);
}
+ ///
+ /// Applies a roll accumulator to the avatar's angular velocity for the avatar fly roll effect.
+ ///
+ /// Postive or negative roll amount in radians
+ private void ApplyFlyingRoll(float amount)
+ {
+ float noise = ((float)(Util.RandomClass.NextDouble()*0.2f)-0.1f);
+ float rollAmount = Util.Clamp(m_AngularVelocity.Z + amount, -FLY_ROLL_MAX_RADIANS, FLY_ROLL_MAX_RADIANS) + noise;
+ m_AngularVelocity.Z = rollAmount;
+ }
+
+ ///
+ /// incrementally sets roll amount to zero
+ ///
+ /// Positive roll amount in radians
+ ///
+ private float CalculateFlyingRollResetToZero(float amount)
+ {
+ const float rollMinRadians = 0f;
+
+ if (m_AngularVelocity.Z > 0)
+ {
+
+ float leftOverToMin = m_AngularVelocity.Z - rollMinRadians;
+ if (amount > leftOverToMin)
+ return -leftOverToMin;
+ else
+ return -amount;
+
+ }
+ else
+ {
+
+ float leftOverToMin = -m_AngularVelocity.Z - rollMinRadians;
+ if (amount > leftOverToMin)
+ return leftOverToMin;
+ else
+ return amount;
+ }
+ }
+
+
+
// neighbouring regions we have enabled a child agent in
// holds the seed cap for the child agent in that region
private Dictionary m_knownChildRegions = new Dictionary();
@@ -1741,6 +1799,29 @@ namespace OpenSim.Region.Framework.Scenes
bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
+
+
+ // Applies a satisfying roll effect to the avatar when flying.
+ if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0) && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0))
+ {
+ ApplyFlyingRoll(FLY_ROLL_RADIANS_PER_SECOND);
+
+ }
+ else if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0) &&
+ ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0))
+ {
+ ApplyFlyingRoll(-FLY_ROLL_RADIANS_PER_SECOND);
+
+ }
+ else
+ {
+ if (m_AngularVelocity.Z != 0)
+ m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_SECOND);
+
+ }
+
+
+
if (Flying && IsColliding && controlland)
{
// nesting this check because LengthSquared() is expensive and we don't
--
cgit v1.1