From 3c7eacf39b3768e88b09f9a5a438df0be0dbe03e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 2 Sep 2014 23:35:03 +0100 Subject: [PATCH] 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() --- .../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 e0b76407c7..f2a636afc2 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 5d7fc9db0d..7c384b268f 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 {