From 765b0e4382b1e7e413d33a8f0f7669259f7bf170 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 7 Feb 2013 22:20:17 +0100 Subject: [PATCH 01/10] Rename "Bounce" to "Restitution" in PhysicsActor as well. It appears these values are not even used. --- OpenSim/Region/Physics/Manager/PhysicsActor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index 9338130400..dcb2c91b8d 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.Manager public virtual float Density { get; set; } public virtual float GravModifier { get; set; } public virtual float Friction { get; set; } - public virtual float Bounce { get; set; } + public virtual float Restitution { get; set; } /// /// Position of this actor. From 8008938550f5f60b3233a09ca642ea6a45052704 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 7 Feb 2013 23:34:47 +0000 Subject: [PATCH 02/10] Actually plumb the new values to physics. --- .../Framework/Scenes/SceneObjectPart.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0d2da03a52..20a662683e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1689,6 +1689,10 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup != null) ParentGroup.HasGroupChanged = true; + + PhysicsActor pa = PhysActor; + if (pa != null) + pa.Density = Density; } } @@ -1708,6 +1712,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup != null) ParentGroup.HasGroupChanged = true; + PhysicsActor pa = PhysActor; + if (pa != null) + pa.GravModifier = GravityModifier; } } @@ -1726,6 +1733,10 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup != null) ParentGroup.HasGroupChanged = true; + + PhysicsActor pa = PhysActor; + if (pa != null) + pa.Friction = Friction; } } @@ -1744,6 +1755,10 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup != null) ParentGroup.HasGroupChanged = true; + + PhysicsActor pa = PhysActor; + if (pa != null) + pa.Restitution = Restitution; } } @@ -4657,6 +4672,11 @@ namespace OpenSim.Region.Framework.Scenes pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info pa.SetMaterial(Material); + pa.Density = Density; + pa.GravModifier = GravityModifier; + pa.Friction = Friction; + pa.Restitution = Restitution; + if (VolumeDetectActive) // change if not the default only pa.SetVolumeDetect(1); From e31bc8dc963ff9bc09f0c2dbd68b8a43fee851d6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 11 Feb 2013 23:07:04 +0100 Subject: [PATCH 03/10] Refactor KeyframeMotion to use one timer class per scene --- .../Region/Framework/Scenes/KeyframeMotion.cs | 95 +++++++++++++++---- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 5a1fd13d0d..6dc6504cea 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs @@ -22,25 +22,36 @@ using log4net; namespace OpenSim.Region.Framework.Scenes { - public static class KeyframeTimer + public class KeyframeTimer { - private static Timer m_timer; - private static Dictionary m_motions = new Dictionary(); - private static object m_lockObject = new object(); - private static object m_timerLock = new object(); - public const double timerInterval = 50.0; + private static Dictionarym_timers = + new Dictionary(); - static KeyframeTimer() + private Timer m_timer; + private Dictionary m_motions = new Dictionary(); + private object m_lockObject = new object(); + private object m_timerLock = new object(); + private const double m_tickDuration = 50.0; + private Scene m_scene; + + public double TickDuration + { + get { return m_tickDuration; } + } + + public KeyframeTimer(Scene scene) { m_timer = new Timer(); - m_timer.Interval = timerInterval; + m_timer.Interval = TickDuration; m_timer.AutoReset = true; m_timer.Elapsed += OnTimer; + m_scene = scene; + m_timer.Start(); } - private static void OnTimer(object sender, ElapsedEventArgs ea) + private void OnTimer(object sender, ElapsedEventArgs ea) { if (!Monitor.TryEnter(m_timerLock)) return; @@ -58,7 +69,7 @@ namespace OpenSim.Region.Framework.Scenes { try { - m.OnTimer(); + m.OnTimer(TickDuration); } catch (Exception inner) { @@ -78,17 +89,44 @@ namespace OpenSim.Region.Framework.Scenes public static void Add(KeyframeMotion motion) { - lock (m_lockObject) + KeyframeTimer timer; + + if (motion.Scene == null) + return; + + lock (m_timers) { - m_motions[motion] = null; + if (!m_timers.TryGetValue(motion.Scene, out timer)) + { + timer = new KeyframeTimer(motion.Scene); + m_timers[motion.Scene] = timer; + } + } + + lock (timer.m_lockObject) + { + timer.m_motions[motion] = null; } } public static void Remove(KeyframeMotion motion) { - lock (m_lockObject) + KeyframeTimer timer; + + if (motion.Scene == null) + return; + + lock (m_timers) { - m_motions.Remove(motion); + if (!m_timers.TryGetValue(motion.Scene, out timer)) + { + return; + } + } + + lock (timer.m_lockObject) + { + timer.m_motions.Remove(motion); } } } @@ -156,6 +194,7 @@ namespace OpenSim.Region.Framework.Scenes private DataFormat m_data = DataFormat.Translation | DataFormat.Rotation; private bool m_running = false; + [NonSerialized()] private bool m_selected = false; @@ -163,6 +202,14 @@ namespace OpenSim.Region.Framework.Scenes private int m_skipLoops = 0; + [NonSerialized()] + private Scene m_scene; + + public Scene Scene + { + get { return m_scene; } + } + public DataFormat Data { get { return m_data; } @@ -221,8 +268,12 @@ namespace OpenSim.Region.Framework.Scenes newMotion.m_group = grp; - if (grp != null && grp.IsSelected) - newMotion.m_selected = true; + if (grp != null) + { + newMotion.m_scene = grp.Scene; + if (grp.IsSelected) + newMotion.m_selected = true; + } newMotion.m_timerStopped = false; newMotion.m_isCrossing = false; @@ -246,6 +297,8 @@ namespace OpenSim.Region.Framework.Scenes return; m_group = grp; + m_scene = grp.Scene; + Vector3 grppos = grp.AbsolutePosition; Vector3 offset = grppos - m_serializedPosition; // avoid doing it more than once @@ -278,6 +331,7 @@ namespace OpenSim.Region.Framework.Scenes { m_basePosition = grp.AbsolutePosition; m_baseRotation = grp.GroupRotation; + m_scene = grp.Scene; } m_timerStopped = true; @@ -297,6 +351,7 @@ namespace OpenSim.Region.Framework.Scenes KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data); newmotion.m_group = newgrp; + newmotion.m_scene = newgrp.Scene; if (m_keyframes != null) { @@ -482,7 +537,7 @@ namespace OpenSim.Region.Framework.Scenes } } - public void OnTimer() + public void OnTimer(double tickDuration) { if (m_skipLoops > 0) { @@ -546,16 +601,16 @@ namespace OpenSim.Region.Framework.Scenes } m_currentFrame = m_frames[0]; - m_currentFrame.TimeMS += (int)KeyframeTimer.timerInterval; + m_currentFrame.TimeMS += (int)tickDuration; //force a update on a keyframe transition update = true; } - m_currentFrame.TimeMS -= (int)KeyframeTimer.timerInterval; + m_currentFrame.TimeMS -= (int)tickDuration; // Do the frame processing - double steps = (double)m_currentFrame.TimeMS / KeyframeTimer.timerInterval; + double steps = (double)m_currentFrame.TimeMS / tickDuration; if (steps <= 0.0) { From e85a6237bfc0f00de4a183e29e515fa5baf1aa7f Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 11 Feb 2013 23:49:05 +0100 Subject: [PATCH 04/10] Make keyframes use the sim's frame timer --- .../Region/Framework/Scenes/KeyframeMotion.cs | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 6dc6504cea..75b16dc604 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs @@ -27,12 +27,11 @@ namespace OpenSim.Region.Framework.Scenes private static Dictionarym_timers = new Dictionary(); - private Timer m_timer; private Dictionary m_motions = new Dictionary(); private object m_lockObject = new object(); - private object m_timerLock = new object(); private const double m_tickDuration = 50.0; private Scene m_scene; + private int m_prevTick; public double TickDuration { @@ -41,20 +40,18 @@ namespace OpenSim.Region.Framework.Scenes public KeyframeTimer(Scene scene) { - m_timer = new Timer(); - m_timer.Interval = TickDuration; - m_timer.AutoReset = true; - m_timer.Elapsed += OnTimer; + m_prevTick = Util.EnvironmentTickCount(); m_scene = scene; - m_timer.Start(); + m_scene.EventManager.OnFrame += OnTimer; } - private void OnTimer(object sender, ElapsedEventArgs ea) + private void OnTimer() { - if (!Monitor.TryEnter(m_timerLock)) - return; + int thisTick = Util.EnvironmentTickCount(); + int tickdiff = Util.EnvironmentTickCountSubtract(thisTick, m_prevTick); + m_prevTick = thisTick; try { @@ -69,7 +66,7 @@ namespace OpenSim.Region.Framework.Scenes { try { - m.OnTimer(TickDuration); + m.OnTimer(tickdiff); } catch (Exception inner) { @@ -81,10 +78,6 @@ namespace OpenSim.Region.Framework.Scenes { // Keep running no matter what } - finally - { - Monitor.Exit(m_timerLock); - } } public static void Add(KeyframeMotion motion) From 04235e58e87ae42617111cad2884e42785914d4e Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 12 Feb 2013 01:02:16 +0100 Subject: [PATCH 05/10] Push updates from keyframe directly to the front of the output queue rather than through the update system. --- OpenSim/Framework/IClientAPI.cs | 3 ++- .../ClientStack/Linden/UDP/LLClientView.cs | 20 +++++++++++++++++++ .../Region/Framework/Scenes/KeyframeMotion.cs | 12 +++++------ .../Framework/Scenes/SceneObjectGroup.cs | 7 ++++++- .../Framework/Scenes/SceneObjectPart.cs | 14 +++++++++++-- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 04650425bf..96d27351c1 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -698,7 +698,8 @@ namespace OpenSim.Framework ExtraData = 1 << 20, Sound = 1 << 21, Joint = 1 << 22, - FullUpdate = UInt32.MaxValue + Immediate = 1 << 23, + FullUpdate = UInt32.MaxValue & (uint)~((uint)1<<23) } public static class PrimUpdateFlagsExtensions diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ca15e3e3ef..8d46415daa 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3721,6 +3721,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { + if ((updateFlags & PrimUpdateFlags.Immediate) != 0) + { + SendUnqueuedTerseUpdate((SceneObjectPart)entity); + return; + } + if (entity is SceneObjectPart) { SceneObjectPart e = (SceneObjectPart)entity; @@ -4075,6 +4081,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP ProcessEntityUpdates(-1); } + public void SendUnqueuedTerseUpdate(SceneObjectPart part) + { + ImprovedTerseObjectUpdatePacket packet + = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( + PacketType.ImprovedTerseObjectUpdate); + packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; + packet.RegionData.TimeDilation = Utils.FloatToUInt16(1.0f, 0.0f, 1.0f); + packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + + packet.ObjectData[0] = CreateImprovedTerseBlock(part, false); + + OutPacket(packet, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); + } + #endregion Primitive Packet/Data Sending Methods // These are used to implement an adaptive backoff in the number diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 75b16dc604..722c0319c4 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs @@ -417,7 +417,7 @@ namespace OpenSim.Region.Framework.Scenes m_group.RootPart.Velocity = Vector3.Zero; m_group.RootPart.AngularVelocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); // m_group.RootPart.ScheduleTerseUpdate(); m_frames.Clear(); } @@ -429,7 +429,7 @@ namespace OpenSim.Region.Framework.Scenes m_group.RootPart.Velocity = Vector3.Zero; m_group.RootPart.AngularVelocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); // m_group.RootPart.ScheduleTerseUpdate(); } @@ -551,7 +551,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group.RootPart.Velocity != Vector3.Zero) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); } return; @@ -695,7 +695,7 @@ namespace OpenSim.Region.Framework.Scenes if (update) { - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); } } @@ -731,7 +731,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group.RootPart.Velocity != Vector3.Zero) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); // m_group.RootPart.ScheduleTerseUpdate(); } } @@ -743,7 +743,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group != null) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(); + m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); // m_group.RootPart.ScheduleTerseUpdate(); if (m_running) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index ed1bbd8827..910f42e55b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2637,11 +2637,16 @@ namespace OpenSim.Region.Framework.Scenes /// external modules. /// public void SendGroupRootTerseUpdate() + { + SendGroupRootTerseUpdate(0); + } + + public void SendGroupRootTerseUpdate(PrimUpdateFlags flags) { if (IsDeleted) return; - RootPart.SendTerseUpdateToAllClients(); + RootPart.SendTerseUpdateToAllClients(flags); } public void QueueForUpdateCheck() diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 20a662683e..7e94eda596 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3314,6 +3314,11 @@ namespace OpenSim.Region.Framework.Scenes /// Send a terse update to all clients /// public void SendTerseUpdateToAllClients() + { + SendTerseUpdateToAllClients(0); + } + + public void SendTerseUpdateToAllClients(PrimUpdateFlags flags) { if (ParentGroup == null || ParentGroup.Scene == null) return; @@ -3328,7 +3333,7 @@ namespace OpenSim.Region.Framework.Scenes ParentGroup.Scene.ForEachClient(delegate(IClientAPI client) { - SendTerseUpdateToClient(client); + SendTerseUpdateToClient(client, flags); }); } @@ -5132,6 +5137,11 @@ namespace OpenSim.Region.Framework.Scenes #endregion Public Methods public void SendTerseUpdateToClient(IClientAPI remoteClient) + { + SendTerseUpdateToClient(remoteClient, 0); + } + + public void SendTerseUpdateToClient(IClientAPI remoteClient, PrimUpdateFlags flags) { if (ParentGroup.IsDeleted) return; @@ -5146,7 +5156,7 @@ namespace OpenSim.Region.Framework.Scenes remoteClient.SendEntityUpdate( this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity - | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); + | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity | flags); ParentGroup.Scene.StatsReporter.AddObjectUpdates(1); } From 048e904f051ccc38e7d00936b45288af3c6fc010 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 12 Feb 2013 01:13:30 +0100 Subject: [PATCH 06/10] Use actual time dilation for unqueued updates --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 8d46415daa..81a772b468 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4087,7 +4087,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( PacketType.ImprovedTerseObjectUpdate); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; - packet.RegionData.TimeDilation = Utils.FloatToUInt16(1.0f, 0.0f, 1.0f); + packet.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; packet.ObjectData[0] = CreateImprovedTerseBlock(part, false); From 2065590232894acb8dae15ff935dfae1405326a5 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 12 Feb 2013 03:15:32 +0100 Subject: [PATCH 07/10] Revert "Use actual time dilation for unqueued updates" This reverts commit 048e904f051ccc38e7d00936b45288af3c6fc010. --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 81a772b468..8d46415daa 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4087,7 +4087,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( PacketType.ImprovedTerseObjectUpdate); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; - packet.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); + packet.RegionData.TimeDilation = Utils.FloatToUInt16(1.0f, 0.0f, 1.0f); packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; packet.ObjectData[0] = CreateImprovedTerseBlock(part, false); From 14c064c65da3d9cce045664f83daaeb7a79edcdd Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 12 Feb 2013 03:15:40 +0100 Subject: [PATCH 08/10] Revert "Push updates from keyframe directly to the front of the output queue rather" This reverts commit 04235e58e87ae42617111cad2884e42785914d4e. --- OpenSim/Framework/IClientAPI.cs | 3 +-- .../ClientStack/Linden/UDP/LLClientView.cs | 20 ------------------- .../Region/Framework/Scenes/KeyframeMotion.cs | 12 +++++------ .../Framework/Scenes/SceneObjectGroup.cs | 7 +------ .../Framework/Scenes/SceneObjectPart.cs | 14 ++----------- 5 files changed, 10 insertions(+), 46 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 96d27351c1..04650425bf 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -698,8 +698,7 @@ namespace OpenSim.Framework ExtraData = 1 << 20, Sound = 1 << 21, Joint = 1 << 22, - Immediate = 1 << 23, - FullUpdate = UInt32.MaxValue & (uint)~((uint)1<<23) + FullUpdate = UInt32.MaxValue } public static class PrimUpdateFlagsExtensions diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 8d46415daa..ca15e3e3ef 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3721,12 +3721,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { - if ((updateFlags & PrimUpdateFlags.Immediate) != 0) - { - SendUnqueuedTerseUpdate((SceneObjectPart)entity); - return; - } - if (entity is SceneObjectPart) { SceneObjectPart e = (SceneObjectPart)entity; @@ -4081,20 +4075,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP ProcessEntityUpdates(-1); } - public void SendUnqueuedTerseUpdate(SceneObjectPart part) - { - ImprovedTerseObjectUpdatePacket packet - = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( - PacketType.ImprovedTerseObjectUpdate); - packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; - packet.RegionData.TimeDilation = Utils.FloatToUInt16(1.0f, 0.0f, 1.0f); - packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - - packet.ObjectData[0] = CreateImprovedTerseBlock(part, false); - - OutPacket(packet, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); - } - #endregion Primitive Packet/Data Sending Methods // These are used to implement an adaptive backoff in the number diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 722c0319c4..75b16dc604 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs @@ -417,7 +417,7 @@ namespace OpenSim.Region.Framework.Scenes m_group.RootPart.Velocity = Vector3.Zero; m_group.RootPart.AngularVelocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); // m_group.RootPart.ScheduleTerseUpdate(); m_frames.Clear(); } @@ -429,7 +429,7 @@ namespace OpenSim.Region.Framework.Scenes m_group.RootPart.Velocity = Vector3.Zero; m_group.RootPart.AngularVelocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); // m_group.RootPart.ScheduleTerseUpdate(); } @@ -551,7 +551,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group.RootPart.Velocity != Vector3.Zero) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); } return; @@ -695,7 +695,7 @@ namespace OpenSim.Region.Framework.Scenes if (update) { - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); } } @@ -731,7 +731,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group.RootPart.Velocity != Vector3.Zero) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); // m_group.RootPart.ScheduleTerseUpdate(); } } @@ -743,7 +743,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_group != null) { m_group.RootPart.Velocity = Vector3.Zero; - m_group.SendGroupRootTerseUpdate(PrimUpdateFlags.Immediate); + m_group.SendGroupRootTerseUpdate(); // m_group.RootPart.ScheduleTerseUpdate(); if (m_running) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 910f42e55b..ed1bbd8827 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2637,16 +2637,11 @@ namespace OpenSim.Region.Framework.Scenes /// external modules. /// public void SendGroupRootTerseUpdate() - { - SendGroupRootTerseUpdate(0); - } - - public void SendGroupRootTerseUpdate(PrimUpdateFlags flags) { if (IsDeleted) return; - RootPart.SendTerseUpdateToAllClients(flags); + RootPart.SendTerseUpdateToAllClients(); } public void QueueForUpdateCheck() diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 7e94eda596..20a662683e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3314,11 +3314,6 @@ namespace OpenSim.Region.Framework.Scenes /// Send a terse update to all clients /// public void SendTerseUpdateToAllClients() - { - SendTerseUpdateToAllClients(0); - } - - public void SendTerseUpdateToAllClients(PrimUpdateFlags flags) { if (ParentGroup == null || ParentGroup.Scene == null) return; @@ -3333,7 +3328,7 @@ namespace OpenSim.Region.Framework.Scenes ParentGroup.Scene.ForEachClient(delegate(IClientAPI client) { - SendTerseUpdateToClient(client, flags); + SendTerseUpdateToClient(client); }); } @@ -5137,11 +5132,6 @@ namespace OpenSim.Region.Framework.Scenes #endregion Public Methods public void SendTerseUpdateToClient(IClientAPI remoteClient) - { - SendTerseUpdateToClient(remoteClient, 0); - } - - public void SendTerseUpdateToClient(IClientAPI remoteClient, PrimUpdateFlags flags) { if (ParentGroup.IsDeleted) return; @@ -5156,7 +5146,7 @@ namespace OpenSim.Region.Framework.Scenes remoteClient.SendEntityUpdate( this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity - | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity | flags); + | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); ParentGroup.Scene.StatsReporter.AddObjectUpdates(1); } From d5b401a478d9756bd5ce0185896262f6985d2ade Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 12 Feb 2013 22:20:16 +0100 Subject: [PATCH 09/10] Revert "Make keyframes use the sim's frame timer" This reverts commit e85a6237bfc0f00de4a183e29e515fa5baf1aa7f. --- .../Region/Framework/Scenes/KeyframeMotion.cs | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 75b16dc604..6dc6504cea 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs @@ -27,11 +27,12 @@ namespace OpenSim.Region.Framework.Scenes private static Dictionarym_timers = new Dictionary(); + private Timer m_timer; private Dictionary m_motions = new Dictionary(); private object m_lockObject = new object(); + private object m_timerLock = new object(); private const double m_tickDuration = 50.0; private Scene m_scene; - private int m_prevTick; public double TickDuration { @@ -40,18 +41,20 @@ namespace OpenSim.Region.Framework.Scenes public KeyframeTimer(Scene scene) { - m_prevTick = Util.EnvironmentTickCount(); + m_timer = new Timer(); + m_timer.Interval = TickDuration; + m_timer.AutoReset = true; + m_timer.Elapsed += OnTimer; m_scene = scene; - m_scene.EventManager.OnFrame += OnTimer; + m_timer.Start(); } - private void OnTimer() + private void OnTimer(object sender, ElapsedEventArgs ea) { - int thisTick = Util.EnvironmentTickCount(); - int tickdiff = Util.EnvironmentTickCountSubtract(thisTick, m_prevTick); - m_prevTick = thisTick; + if (!Monitor.TryEnter(m_timerLock)) + return; try { @@ -66,7 +69,7 @@ namespace OpenSim.Region.Framework.Scenes { try { - m.OnTimer(tickdiff); + m.OnTimer(TickDuration); } catch (Exception inner) { @@ -78,6 +81,10 @@ namespace OpenSim.Region.Framework.Scenes { // Keep running no matter what } + finally + { + Monitor.Exit(m_timerLock); + } } public static void Add(KeyframeMotion motion) From 4c7df6a1473e4e0a144e06f6e318251419f64af8 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 14 Feb 2013 07:17:27 +0100 Subject: [PATCH 10/10] Small fix to sim features module --- .../Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index 191bccf812..8f38737005 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs @@ -94,6 +94,8 @@ namespace OpenSim.Region.ClientStack.Linden { m_scene = s; m_scene.EventManager.OnRegisterCaps += RegisterCaps; + + m_scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene s)