From 46db73b62baec7baf0e33d83efbaafaadcd4db0d Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Thu, 23 Dec 2010 03:30:09 -0500
Subject: * Re-Adding Scene TimeDilation to Object Update Packets. * Added
 Calculating Time Dilation in the OdePlubin * When multiple object updates are
 stuffed into one packet, average the time dilation between them as a
 compromise. * Time Dilation on the update is calculated when the EntityUpdate
 object is created.  The pre-calc-ed TD is stored in the Entity update and
 used when it goes out on the wire.  Previously, it was 1.0 all the time. The
 time dilation is tied to when the update is created, not when the update is
 sent.

---
 OpenSim/Framework/IClientAPI.cs                      |  4 +++-
 OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 18 ++++++++++++------
 OpenSim/Region/Physics/OdePlugin/OdePlugin.cs        | 19 +++++++++++++++++++
 3 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 6bca6eb..21ffa9a 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -574,11 +574,13 @@ namespace OpenSim.Framework
     {
         public ISceneEntity Entity;
         public PrimUpdateFlags Flags;
+        public float TimeDilation;
 
-        public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags)
+        public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags, float timedilation)
         {
             Entity = entity;
             Flags = flags;
+            TimeDilation = timedilation;
         }
     }
 
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 929f282..f27a6eb 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -3554,7 +3554,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
             double priority = m_prioritizer.GetUpdatePriority(this, entity);
 
             lock (m_entityUpdates.SyncRoot)
-                m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId);
+                m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation), entity.LocalId);
         }
 
         private void ProcessEntityUpdates(int maxUpdates)
@@ -3570,14 +3570,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
             // We must lock for both manipulating the kill record and sending the packet, in order to avoid a race
             // condition where a kill can be processed before an out-of-date update for the same object.                        
             lock (m_killRecord)
-            {                
+            {
+                float avgTimeDilation = 1.0f;
                 EntityUpdate update;
                 while (updatesThisCall < maxUpdates)
                 {
                     lock (m_entityUpdates.SyncRoot)
                         if (!m_entityUpdates.TryDequeue(out update))
                             break;
-    
+                    avgTimeDilation += update.TimeDilation;
+                    avgTimeDilation *= 0.5f;
+
                     if (update.Entity is SceneObjectPart)
                     {
                         SceneObjectPart part = (SceneObjectPart)update.Entity;
@@ -3725,8 +3728,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
     
                 #region Packet Sending
         
-                const float TIME_DILATION = 1.0f;
-                ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
+                //const float TIME_DILATION = 1.0f;
+
+
+                ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f);
     
                 if (terseAgentUpdateBlocks.IsValueCreated)
                 {
@@ -3739,7 +3744,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
     
                     for (int i = 0; i < blocks.Count; i++)
                         packet.ObjectData[i] = blocks[i];
-    
+
+                    
                     OutPacket(packet, ThrottleOutPacketType.Unknown, true);
                 }
     
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 7fd59a0..eb97f41 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -287,6 +287,9 @@ namespace OpenSim.Region.Physics.OdePlugin
         private OdePrim cp1;
         private OdeCharacter cc2;
         private OdePrim cp2;
+        private int tickCountFrameRun;
+        
+        private int latertickcount=0;
         //private int cStartStop = 0;
         //private string cDictKey = "";
 
@@ -3123,6 +3126,22 @@ namespace OpenSim.Region.Physics.OdePlugin
                     }
                     d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix);
                 }
+                latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun;
+
+                // OpenSimulator above does 10 fps.  10 fps = means that the main thread loop and physics
+                // has a max of 100 ms to run theoretically.
+                // If the main loop stalls, it calls Simulate later which makes the tick count ms larger.
+                // If Physics stalls, it takes longer which makes the tick count ms larger.
+
+                if (latertickcount < 100)
+                    m_timeDilation = 1.0f;
+                else
+                {
+                    m_timeDilation = 100f / latertickcount;
+                    //m_timeDilation = Math.Min((Math.Max(100 - (Util.EnvironmentTickCount() - tickCountFrameRun), 1) / 100f), 1.0f);
+                }
+
+                tickCountFrameRun = Util.EnvironmentTickCount();
             }
 
             return fps;
-- 
cgit v1.1


From 26e601a77603e593c8b4ba3a07f0580ff2a2a740 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 23 Dec 2010 11:50:53 +0000
Subject: Put back a commented section of code. With some viewers, object
 inventory transfers just don't start without it. Observed my Nebadon and
 yours truly.

---
 OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index c5a6e62..4f9e32b 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -105,12 +105,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
                 }
             }
 
-            // This should not be here
-            //if (Requests.ContainsKey(fileName))
-            //{
-            //    RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
-            //    Requests.Remove(fileName);
-            //}
+            if (Requests.ContainsKey(fileName))
+            {
+                RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
+                Requests.Remove(fileName);
+            }
 
             return true;
         }
-- 
cgit v1.1