aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs81
1 files changed, 81 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a90872e..1d22560 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -200,6 +200,11 @@ namespace OpenSim.Region.Framework.Scenes
200 200
201 private const int LAND_VELOCITYMAG_MAX = 12; 201 private const int LAND_VELOCITYMAG_MAX = 12;
202 202
203 private const float FLY_ROLL_MAX_RADIANS = 1.1f;
204
205 private const float FLY_ROLL_RADIANS_PER_SECOND = 0.06f;
206 private const float FLY_ROLL_RESET_RADIANS_PER_SECOND = 0.02f;
207
203 private float m_health = 100f; 208 private float m_health = 100f;
204 209
205 protected ulong crossingFromRegion; 210 protected ulong crossingFromRegion;
@@ -568,6 +573,14 @@ namespace OpenSim.Region.Framework.Scenes
568 } 573 }
569 } 574 }
570 575
576 // Used for limited viewer 'fake' user rotations.
577 private Vector3 m_AngularVelocity = Vector3.Zero;
578
579 public Vector3 AngularVelocity
580 {
581 get { return m_AngularVelocity; }
582 }
583
571 public bool IsChildAgent { get; set; } 584 public bool IsChildAgent { get; set; }
572 585
573 /// <summary> 586 /// <summary>
@@ -690,6 +703,8 @@ namespace OpenSim.Region.Framework.Scenes
690 703
691 #endregion 704 #endregion
692 705
706
707
693 #region Constructor(s) 708 #region Constructor(s)
694 709
695 public ScenePresence( 710 public ScenePresence(
@@ -1033,6 +1048,49 @@ namespace OpenSim.Region.Framework.Scenes
1033 ControllingClient.StopFlying(this); 1048 ControllingClient.StopFlying(this);
1034 } 1049 }
1035 1050
1051 /// <summary>
1052 /// Applies a roll accumulator to the avatar's angular velocity for the avatar fly roll effect.
1053 /// </summary>
1054 /// <param name="amount">Postive or negative roll amount in radians</param>
1055 private void ApplyFlyingRoll(float amount)
1056 {
1057 float noise = ((float)(Util.RandomClass.NextDouble()*0.2f)-0.1f);
1058 float rollAmount = Util.Clamp(m_AngularVelocity.Z + amount, -FLY_ROLL_MAX_RADIANS, FLY_ROLL_MAX_RADIANS) + noise;
1059 m_AngularVelocity.Z = rollAmount;
1060 }
1061
1062 /// <summary>
1063 /// incrementally sets roll amount to zero
1064 /// </summary>
1065 /// <param name="amount">Positive roll amount in radians</param>
1066 /// <returns></returns>
1067 private float CalculateFlyingRollResetToZero(float amount)
1068 {
1069 const float rollMinRadians = 0f;
1070
1071 if (m_AngularVelocity.Z > 0)
1072 {
1073
1074 float leftOverToMin = m_AngularVelocity.Z - rollMinRadians;
1075 if (amount > leftOverToMin)
1076 return -leftOverToMin;
1077 else
1078 return -amount;
1079
1080 }
1081 else
1082 {
1083
1084 float leftOverToMin = -m_AngularVelocity.Z - rollMinRadians;
1085 if (amount > leftOverToMin)
1086 return leftOverToMin;
1087 else
1088 return amount;
1089 }
1090 }
1091
1092
1093
1036 // neighbouring regions we have enabled a child agent in 1094 // neighbouring regions we have enabled a child agent in
1037 // holds the seed cap for the child agent in that region 1095 // holds the seed cap for the child agent in that region
1038 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>(); 1096 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>();
@@ -1513,6 +1571,29 @@ namespace OpenSim.Region.Framework.Scenes
1513 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 1571 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
1514 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 1572 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1515 1573
1574
1575
1576 // Applies a satisfying roll effect to the avatar when flying.
1577 if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0) && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0))
1578 {
1579 ApplyFlyingRoll(FLY_ROLL_RADIANS_PER_SECOND);
1580
1581 }
1582 else if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0) &&
1583 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0))
1584 {
1585 ApplyFlyingRoll(-FLY_ROLL_RADIANS_PER_SECOND);
1586
1587 }
1588 else
1589 {
1590 if (m_AngularVelocity.Z != 0)
1591 m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_SECOND);
1592
1593 }
1594
1595
1596
1516 if (Flying && IsColliding && controlland) 1597 if (Flying && IsColliding && controlland)
1517 { 1598 {
1518 // nesting this check because LengthSquared() is expensive and we don't 1599 // nesting this check because LengthSquared() is expensive and we don't