From f7378829c3da999fcd200a5d0e6189a563cbda39 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 25 Aug 2013 06:26:56 +0200
Subject: Fix the root cause of keyframe motion region crossing offset -
 UpdateSceneObject was being called twice on each crossing.

---
 OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 22 +---------------------
 OpenSim/Region/Framework/Scenes/Scene.cs          |  6 ++++--
 2 files changed, 5 insertions(+), 23 deletions(-)

diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
index d9df95c..276b61f 100644
--- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
+++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
@@ -478,7 +478,6 @@ namespace OpenSim.Region.Framework.Scenes
                         k.Position = pos;
 //                        k.Velocity = Vector3.Zero;
                     }
-                    k.AngularVelocity = (Vector3)k.Position;
 
                     k.StartRotation = rot;
                     if (k.Rotation.HasValue)
@@ -619,7 +618,7 @@ namespace OpenSim.Region.Framework.Scenes
                 m_group.RootPart.Velocity = Vector3.Zero;
                 m_group.RootPart.AngularVelocity = Vector3.Zero;
 
-                m_nextPosition = NormalizeVector(m_currentFrame.AngularVelocity);
+                m_nextPosition = (Vector3)m_currentFrame.Position;
                 m_group.AbsolutePosition = m_nextPosition;
 
                 // we are sending imediate updates, no doing force a extra terseUpdate
@@ -707,26 +706,7 @@ namespace OpenSim.Region.Framework.Scenes
                 m_group.SendGroupRootTerseUpdate();
             }
         }
-        private Vector3 NormalizeVector(Vector3? pPosition)
-        {
-            if (pPosition == null)
-                return Vector3.Zero;
-
-            Vector3 tmp = (Vector3) pPosition;
-
-            while (tmp.X > Constants.RegionSize)
-                tmp.X -= Constants.RegionSize;
-            while (tmp.X < 0)
-                tmp.X += Constants.RegionSize;
-            while (tmp.Y > Constants.RegionSize)
-                tmp.Y -= Constants.RegionSize;
-            while (tmp.Y < 0)
-                tmp.Y += Constants.RegionSize;
 
-            return tmp;
-
-            
-        }
         public Byte[] Serialize()
         {
             StopTimer();
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2b58795..b189599 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2802,8 +2802,10 @@ namespace OpenSim.Region.Framework.Scenes
                 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
                 newObject.ResumeScripts();
 
-                if (newObject.RootPart.KeyframeMotion != null)
-                    newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
+                // AddSceneObject already does this and doing it again messes
+                // up region crossings, so don't.
+                //if (newObject.RootPart.KeyframeMotion != null)
+                //    newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
             }
 
             // Do this as late as possible so that listeners have full access to the incoming object
-- 
cgit v1.1