Add NaN and Infinity tests for SOP Velocity and Acceleration setters.

inv-download
dahlia 2015-02-16 23:51:37 -08:00
parent 78814a1533
commit 8b2af1071f
2 changed files with 29 additions and 5 deletions

View File

@ -420,6 +420,22 @@ namespace OpenSim.Framework
return x;
}
/// <summary>
/// Check if any of the values in a Vector3 are NaN or Infinity
/// </summary>
/// <param name="v">Vector3 to check</param>
/// <returns></returns>
public static bool IsNanOrInfinity(Vector3 v)
{
if (float.IsNaN(v.X) || float.IsNaN(v.Y) || float.IsNaN(v.Z))
return true;
if (float.IsInfinity(v.X) || float.IsInfinity(v.Y) || float.IsNaN(v.Z))
return true;
return false;
}
// Inclusive, within range test (true if equal to the endpoints)
public static bool InRange<T>(T x, T min, T max)
where T : IComparable<T>

View File

@ -929,14 +929,17 @@ namespace OpenSim.Region.Framework.Scenes
set
{
m_velocity = value;
if (Util.IsNanOrInfinity(value))
m_velocity = Vector3.Zero;
else
m_velocity = value;
PhysicsActor actor = PhysActor;
if (actor != null)
{
if (actor.IsPhysical)
{
actor.Velocity = value;
actor.Velocity = m_velocity;
ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
}
@ -965,8 +968,7 @@ namespace OpenSim.Region.Framework.Scenes
}
set
{
if (float.IsNaN(value.X) || float.IsNaN(value.Y) || float.IsNaN(value.Z)
|| float.IsInfinity(value.X) || float.IsInfinity(value.Y) || float.IsInfinity(value.Z))
if (Util.IsNanOrInfinity(value))
m_angularVelocity = Vector3.Zero;
else
m_angularVelocity = value;
@ -981,7 +983,13 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 Acceleration
{
get { return m_acceleration; }
set { m_acceleration = value; }
set
{
if (Util.IsNanOrInfinity(value))
m_acceleration = Vector3.Zero;
else
m_acceleration = value;
}
}
public string Description { get; set; }