From d582db6132ef7bea8b15e7a9f0dd64400d43b517 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 2 Sep 2014 23:35:03 +0100
Subject: Fix recent regression from 473c5594 where camera started to judder on
moving vehicles.
Other parts of OpenSimulator are relying on SP.Velocity == 0 for vehicles.
So add and use SP.GetWorldVelocity() instead when we need vehicle velocity, along the same lines as existing SP.GetWorldRotation()
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 40 ++++++++++++++--------
.../Shared/Api/Implementation/LSL_Api.cs | 6 ++--
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index e0b7640..f2a636a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -608,8 +608,11 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Current velocity of the avatar.
+ /// Velocity of the avatar with respect to its local reference frame.
///
+ ///
+ /// So when sat on a vehicle this will be 0. To get velocity with respect to the world use GetWorldVelocity()
+ ///
public override Vector3 Velocity
{
get
@@ -622,10 +625,10 @@ namespace OpenSim.Region.Framework.Scenes
// "[SCENE PRESENCE]: Set velocity {0} for {1} in {2} via getting Velocity!",
// m_velocity, Name, Scene.RegionInfo.RegionName);
}
- else if (ParentPart != null)
- {
- return ParentPart.ParentGroup.Velocity;
- }
+// else if (ParentPart != null)
+// {
+// return ParentPart.ParentGroup.Velocity;
+// }
return m_velocity;
}
@@ -749,25 +752,32 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Gets the world rotation of this presence.
+ /// Get rotation relative to the world.
///
- ///
- /// Unlike Rotation, this returns the world rotation no matter whether the avatar is sitting on a prim or not.
- ///
///
public Quaternion GetWorldRotation()
{
- if (IsSatOnObject)
- {
- SceneObjectPart sitPart = ParentPart;
+ SceneObjectPart sitPart = ParentPart;
- if (sitPart != null)
- return sitPart.GetWorldRotation() * Rotation;
- }
+ if (sitPart != null)
+ return sitPart.GetWorldRotation() * Rotation;
return Rotation;
}
+ ///
+ /// Get velocity relative to the world.
+ ///
+ public Vector3 GetWorldVelocity()
+ {
+ SceneObjectPart sitPart = ParentPart;
+
+ if (sitPart != null)
+ return sitPart.ParentGroup.Velocity;
+
+ return Velocity;
+ }
+
public void AdjustKnownSeeds()
{
Dictionary seeds;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5d7fc9d..7c384b2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2560,7 +2560,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (m_host.ParentGroup.IsAttachment)
{
ScenePresence avatar = m_host.ParentGroup.Scene.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
- vel = avatar.Velocity;
+ vel = avatar.GetWorldVelocity();
}
else
{
@@ -11221,7 +11221,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ret.Add(new LSL_Rotation(av.GetWorldRotation()));
break;
case ScriptBaseClass.OBJECT_VELOCITY:
- ret.Add(new LSL_Vector(av.Velocity.X, av.Velocity.Y, av.Velocity.Z));
+ ret.Add(new LSL_Vector(av.GetWorldVelocity()));
break;
case ScriptBaseClass.OBJECT_OWNER:
ret.Add(new LSL_String(id));
@@ -11342,7 +11342,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ScenePresence sp = World.GetScenePresence(obj.ParentGroup.AttachedAvatar);
if (sp != null)
- vel = sp.Velocity;
+ vel = sp.GetWorldVelocity();
}
else
{
--
cgit v1.1